Это на самом деле не сложно. Чтобы добавить новую возможность, позвоните WP_Roles->add_cap()
. Вы должны сделать это только один раз, потому что он будет храниться в базе данных. Поэтому мы используем хук активации плагинов.
Примечание для других читателей: Весь следующий код является территорией плагина .
register_activation_hook( __FILE__, 'epp_add_cap' );
/**
* Add new capability to "editor" role.
*
* @wp-hook "activate_" . __FILE__
* @return void
*/
function epp_add_cap()
{
global $wp_roles;
if ( ! isset( $wp_roles ) )
$wp_roles = new WP_Roles;
$wp_roles->add_cap( 'editor', 'edit_pending_posts' );
}
Теперь мы должны отфильтровать все вызовы для ...
current_user_can( $post_type_object->cap->edit_post, $post->ID );
... потому что именно так WordPress проверяет, может ли пользователь редактировать сообщение. Внутренне, это будет сопоставлено с edit_others_posts
возможностью для постов других авторов.
Поэтому мы должны фильтровать user_has_cap
и изучать наши новые edit_pending_posts
возможности, когда некоторые хотят использовать эту edit_post
возможность.
Я тоже включил delete_post
, потому что это тоже своего рода редактирование.
Звучит сложно, но это действительно просто:
add_filter( 'user_has_cap', 'epp_filter_cap', 10, 3 );
/**
* Allow editing others pending posts only with "edit_pending_posts" capability.
* Administrators can still edit those posts.
*
* @wp-hook user_has_cap
* @param array $allcaps All the capabilities of the user
* @param array $caps [0] Required capability ('edit_others_posts')
* @param array $args [0] Requested capability
* [1] User ID
* [2] Post ID
* @return array
*/
function epp_filter_cap( $allcaps, $caps, $args )
{
// Not our capability
if ( ( 'edit_post' !== $args[0] && 'delete_post' !== $args[0] )
or empty ( $allcaps['edit_pending_posts'] )
)
return $allcaps;
$post = get_post( $args[2] );
// Let users edit their own posts
if ( (int) $args[1] === (int) $post->post_author
and in_array(
$post->post_status,
array ( 'draft', 'pending', 'auto-draft' )
)
)
{
$allcaps[ $caps[0] ] = TRUE;
}
elseif ( 'pending' !== $post->post_status )
{ // Not our post status
$allcaps[ $caps[0] ] = FALSE;
}
return $allcaps;
}
edit_posts
иedit_others_posts
с новымedit_pending_posts
. Я попытался простоedit_pending_posts
без двух других, и меню сообщений не появилось. При тестировании я обнаружил, что могу добавить новое сообщение, но не смог сохранить черновик (You are not allowed to edit this post
уведомление). Вы тестировали, чтобы сохранить свой пост в этой роли? Редактирование ожидающих сообщений в порядке.