其他建议(以及链接中接受的答案)暂时改变了用户的全局功能。那是一种黑客行为。有一个专门为有条件地调整特定内容的功能而设计的挂钩:map_meta_cap
.
WordPress检查用户是否可以编辑帖子时,会检查用户是否可以edit_post
. WordPress使用map_meta_cap()
作用
例如,当检查用户是否可以编辑帖子时,它会检查帖子是否由当前用户编写。如果是,则映射“元能力”edit_post
“基本能力”edit_posts
. 如果帖子是其他人写的,它会将其映射到edit_others_posts
. 然后检查当前用户是否具有映射的功能。
所以我们可以连接到这个过程中,这样每当WordPress映射edit_post
我们将检查当前用户是否是贡献者,以及帖子是否超过12小时。如果这两件事都是真的,我们将绘制edit_post
到do_not_allow
, 这意味着不允许用户对其进行编辑:
function wpse_319901_contributor_can_edit( $caps, $cap, $user_id, $args ) {
// Stop if this isn\'t a check for edit_post or delete_post.
if ( $cap !== \'edit_post\' || $cap !== \'delete_post\' ) {
return $caps;
}
// Get the current user\'s roles.
$user = get_userdata( $user_id );
$roles = $user->roles;
// Stop if the user is not a Contributor.
if ( ! in_array( \'contributor\', $roles ) ) {
return $caps;
}
// For edit_post the post ID will be the first argument in $args.
$post = get_post( $args[0] );
// Is the post older than 12 hours?
if ( get_the_time( \'U\', $post ) < strtotime( \'-12 hours\' ) ) {
// If so, do not allow the user to edit it.
$caps[] = \'do_not_allow\';
}
return $caps;
}
add_filter( \'map_meta_cap\', \'wpse_319901_contributor_can_edit\', 10, 4 );
您可以阅读有关功能以及元功能如何映射到基本功能的更多信息
here.