仅当用户具有权限时才在REST API中显示自定义POST类型终结点

时间:2017-02-20 作者:Drivingralle

我为WP创建了一个自定义帖子类型,对于具有自定义功能的用户,应该可以访问该类型read_cpt. 在模板内和pre_get_posts 我可以通过使用运行检查来包括或排除CPTcurrent_user_can().

我不想让CPT,甚至是端点,出现在REST API中,让它保持高度机密,只要用户没有自定义功能。

我能找到的唯一方法是在API中隐藏端点以运行此代码。

“classic”WP的注册帖子类型:

function add_post_type() {
    $args = array(
        [...]
        \'public\'                => false,
        \'has_archive\'           => false,
        \'exclude_from_search\'   => true,
        \'publicly_queryable\'    => false,
        \'show_in_rest\'          => false,
    );
    register_post_type( \'cpt\', $args );
}
add_action( \'init\', \'add_post_type\', 0 );
并将其单独添加到REST API中:

add_action( \'init\', \'cpt_rest_support\', 25 );
function cpt_rest_support() {
    global $wp_post_types;

    if ( current_user_can( \'read_addresses\' ) ) {
        //be sure to set this to the name of your post type!
        $post_type_name = \'address\';
        if( isset( $wp_post_types[ \'cpt\' ] ) ) {
            $wp_post_types[ \'cpt\' ]->show_in_rest = true;
        }
    }
}
通过创建自定义WP_REST_Posts_Controller 类,我找不到通过修改*_permissions_check

是否有类似于“show\\u in\\u rest\\u permition\\u check”的参数register_post_type() 或者所描述的方式是唯一的方法?

4 个回复
SO网友:bueltge

在我看来,RESTAPI没有参数和选项来解决这个问题。但您应该仅在用户具有其角色的功能时注册,如下面的示例所示。

add_action( \'rest_api_init\', function() {

    // Exit, if the logged in user have not enough rights.
    if ( ! current_user_can( \'edit_posts\' ) ) {
        return;
    }

    // Register Meta Data.
    register_meta( \'post\', \'foo\', array(
        \'show_in_rest\' => true,
    ));
});
如果用户在其角色中拥有足够的权限和功能,那么只能在RESTAPI中触发自定义数据。我的register_meta() 只是一个示例,它还应与的附加参数一起使用register_post_type, 喜欢$wp_post_types[ \'cpt\' ]->show_in_rest = true;.

SO网友:Walf

不要仅仅依赖于隐藏它。

相反,请在处理程序中返回错误:

if (!current_user_can(\'read_addresses\')) {
    return new WP_REST_Response(\'restricted\', 403);
}
要隐藏它,请过滤挂钩的内容rest_indexrest_namespace_index.

SO网友:Dino Morrison

使用register_rest_route() 作用

if( current_user_can( \'read_addresses\' ) ) {
    register_rest_route( \'namespace/v1\', \'cpt\', array(
        \'methods\' => array( \'GET\' ),
        \'callback\' => \'callback_function\',
        \'permission_callback\' => \'permission_callback_function\'
    ) );
}
您的callback_function 将处理请求并返回响应。这个permissions_callback_function 将检查用户权限,如果用户不具有指定的功能,则返回错误。在这种情况下,权限回调可能是不必要的,但为了以防万一,将其放在适当的位置也不会有什么坏处。

SO网友:Luismi

老问题,但这对我来说符合“Drivingralle”的要求。你可以使用current_user_can() 作为要修改的布尔开关show_in_rest 参数行为:

function add_post_type() {

    $show_in_rest = current_user_can( \'read_cpt\' ); //this will return true or false

    $args = array(
        [...]
        \'public\'                => false,
        \'has_archive\'           => false,
        \'exclude_from_search\'   => true,
        \'publicly_queryable\'    => false,
        \'show_in_rest\'          => $show_in_rest, //bool switch from current_user_can()
    );
    register_post_type( \'cpt\', $args );
}
add_action( \'init\', \'add_post_type\' );
这样,对于具有所需功能的用户,自定义post类型仅在rest中显示。

相关推荐

Php致命错误:无法将WP_REST_RESPONSE类型的对象用作wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php中

我向WordPress添加了一个自定义端点,如下所示: add_action( \'rest_api_init\', function () { register_rest_route( \'menc/v1\', \'/crosscat/(?P[\\w-]+)/(?P[\\w-]+)\', array( \'methods\' => \'GET\', \'callback\' => \'dept_cat_api\',&#x