我为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()
或者所描述的方式是唯一的方法?
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网友: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中显示。