这是我的方法。请记住,它涵盖了您描述的基本需求,但可以很容易地扩展为更健壮的解决方案。需要遵循的步骤很少(所有代码都会转到functions.php
):
1。将公司名称另存为user meta
我们需要做的第一件事是为用户指定一个公司名称-我会使用user meta来实现这一点。您可以添加一个元盒来编辑用户屏幕以便于管理,我这里不包括这方面的代码,但我相信您会明白这一点。
对于测试,您只需使用向用户添加meta即可update_user_meta( $user_id, \'company\', \'Tyrell Corporation\' );
(codex)
所以在这个例子中,我假设我们有一群作者Tyrell Corporation
设置为company
用户元键和编辑器具有完全相同的元。
2。根据作者的用户meta将公司meta添加到帖子中,为了让事情变得更简单、更便宜,我会在任何作者保存的每个帖子中保留对公司名称的引用,并指定公司(这样,我们可以在以后每次检查编辑器编辑帖子的权限时,至少取消对author meta表的一个查询)。为此,我使用save_post
hook:
function save_company_meta( $post_id, $post, $update ) {
// get author\'s company meta
$company = get_user_meta( $post->post_author, \'company\', true );
if ( ! empty( $author_id ) ) {
// add meta data to the post
update_post_meta( $post_id, \'company\', true );
}
}
add_action( \'save_post\', \'save_company_meta\', 10, 3 );
现在,每当用户保存其草稿时,分配给该用户的公司名称就会复制到post meta。
3。地图编辑器的edit\\u post功能map 编辑器的“edit\\u post”功能。如果帖子company
元数据与编辑器的不同company
用户meta,我们可以从特定的编辑器中删除编辑此特定帖子的功能。下面的代码中还有一些附加条件,例如,如果帖子没有company
meta或不是post
岗位类型。您可以根据自己的需要进行调整:
function restrict_access_to_company_posts( $caps, $cap, $user_id, $args ) {
/*
We\'re messing with capabilities only if \'edit_post\'
is currently checked and the current user has editor role
but is not the administrator
*/
if ( ! in_array( $cap, [ \'edit_post\' ], true ) ) {
return $caps;
}
if ( ! user_can( $user_id, \'editor\' ) || user_can( $user_id, \'administrator\' ) ) {
return $caps;
}
/*
$args[0] holds post ID. $args var is a bit enigmatic, it contains
different stuff depending on the context and there\'s almost
no documentation on that, you\'ve got to trust me on this one :)
Anyways, if no post ID is set, we bail out and return default capabilities
*/
if ( empty( $args[0] ) ) {
return $caps;
}
/*
You can also make sure that you\'re restricting access
to posts only and not pages or other post types
*/
if ( \'post\' !== get_post_type( $args[0] ) ) {
return $caps;
}
$post_company = get_post_meta( $args[0], \'company\', true );
$editor_company = get_user_meta( $user_id, \'company\', true );
/*
if no meta data is set or editor is assigned
to the same company as the post, we allow normal editing
*/
if ( empty( $post_company ) || $post_company === $editor_company ) {
return $caps;
}
// finally, in all other cases, we restrict access to this post
$caps = [ \'do_not_allow\' ];
return $caps;
}
这不会从管理UI中完全隐藏帖子,您仍然可以在列表中看到它们,但编辑器无法进入帖子的编辑屏幕进行更改,也无法查看草稿(WordPress将自动删除所有“编辑”链接,也可以在前端的管理栏中删除)。帖子发布后,编辑仍无法编辑帖子内容。
4。(可选)从管理员列表中完全删除帖子如果以上内容仍然不够,您还可以连接到pre_get_posts
(codex) 要从管理员列表中完全隐藏帖子,请执行以下操作:
function query_company_posts_only( $query ) {
if ( ! is_admin() || empty( get_current_user_id() ) ) {
return $query;
}
$editor_company = get_user_meta( get_current_user_id(), \'company\', true );
if ( empty( $editor_company ) ) {
return $query;
}
$query->set( \'meta_key\', \'company\' );
$query->set( \'meta_value\', $editor_company );
}
add_action( \'pre_get_posts\', \'query_company_posts_only\', 10, 1 );
希望这能起到作用,就玩玩它,在这里和那里添加一些改进。