我的网站有几个静态页面和几个自定义帖子类型。我正在尝试创建一个名为students
并且只允许学生访问特定的自定义帖子类型和特定的静态页面。
我了解如何通过使用add_cap()
并填充传递给的“capability\\u type”和“map\\u meta\\u cap”字段register_post_type
对于该自定义帖子类型。
However, I don\'t understand how to do this for generic pages (which are not custom, but have been populated with different content). 具体来说,我想创建一个名为internal-resources
并给出student
用户编辑特定页面的功能。中有一些子页internal-resources
他们也应该能够编辑页面。最后,我希望他们能够在internal-resources
. 但是,其他静态页面Research
和People
他们应该无法编辑。这应该不会太难吧?
谢谢你的帮助!!
最合适的回答,由SO网友:Jacob Peattie 整理而成
WordPress无法将编辑(或任何操作)特定帖子的功能分配给角色。
但是,您可以使用筛选功能检查并动态更改它们map_meta_cap
.
在处理帖子权限时,WordPress最终只处理4项功能:
edit_post
read_post
delete_post
publish_post
然后,每当对post执行操作时,它都会将这些功能映射到“基本”功能。以下是您将更熟悉的功能:
publish_posts
edit_posts
edit_others_posts
edit_private_posts
edit_published_posts
read
read_private_posts
delete_posts
delete_private_posts
delete_published_posts
delete_others_posts
还有create_posts
, 但据我所知,这只用于某些REST端点,并用于控制是否显示某些UI。保存帖子时create_posts
已映射到edit_posts
.什么map_meta_cap()
它的作用是,当有人试图编辑帖子时,它会确定需要哪种基本功能。
因此,如果用户试图编辑帖子,map_meta_cap()
检查他们是否是该帖子的作者。如果他们是edit_post
元功能将映射到edit_posts
. 如果他们不是作者,则将映射到edit_others_posts
. WordPress将检查用户是否具有映射的功能,并做出相应的响应。
因此,如果您想更改每页的权限,则需要筛选map_meta_cap
更改分配元功能的方式。
在您的示例中,您希望让用户edit_page
对于内部资源页面(和其他页面),但不编辑任何其他页面。这有点棘手,因为要做到这一点,他们需要访问仪表板中的“页面”菜单。所以你需要student
角色edit_pages
和publish_pages
功能,然后使用筛选器逐页撤销这些功能:
function wpse_293259_map_meta_cap( $required_caps, $cap, $user_id, $args ) {
if ( in_array( $cap, [\'edit_post\', \'publish_post\'] ) ) {
$page_id = $args[0]; // The ID of the post being edited.
$student_pages = [1,2,3]; // The IDs of the pages students are allowed to edit.
/**
* If the page being edited is not one students can edit, check if the user
* is a student. If they are, set the required capabilities to \'do_not_allow\'
* to prevent them editing.
*/
if ( ! in_array( $page_id, $student_pages ) ) {
$user = new WP_User( $user_id );
if ( in_array( \'students\', $user->roles ) ) {
$required_caps = [\'do_not_allow\'];
}
}
}
return $required_caps;
}
add_filter( \'map_meta_cap\', \'wpse_293259_map_meta_cap\', 10, 4 );
这将阻止发布或编辑不在$student_pages
.我还没有找到一种允许用户发布页面的好方法,但前提是他们是特定页面的子页面。我尝试过的各种编辑和发布功能都会导致奇怪的行为。我认为子页面不是管理权限的好方法,因为它们可以在页面编辑器上更改。这意味着您将在发布帖子和被重定向回编辑帖子之间更改权限。
您最好使用我描述的允许编辑内部资源页面的技术,然后将子页面拆分为具有自己权限的单独帖子类型。