Ce n'est en fait pas difficile. Pour ajouter une nouvelle capacité, appelez WP_Roles->add_cap(). Vous devez le faire une seule fois, car il sera stocké dans la base de données. Nous utilisons donc un crochet d'activation de plugin.
Note aux autres lecteurs: Tout le code suivant est un territoire de plugin .
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' );
}
Maintenant, nous devons filtrer tous les appels pour…
current_user_can( $post_type_object->cap->edit_post, $post->ID );
… Car c'est ainsi que WordPress vérifie si un utilisateur peut modifier un article. En interne, cela sera mappé à la edit_others_postscapacité d'autres publications d'auteurs.
Nous devons donc filtrer user_has_capet étudier notre nouvelle edit_pending_postscapacité lorsque certains veulent l'utiliser edit_post.
Je l'ai delete_postaussi inclus , car c'est aussi une sorte de montage.
Cela semble compliqué, mais c'est vraiment simple:
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_postsetedit_others_postsavec le nouveauedit_pending_posts. J'ai juste essayé de continueredit_pending_postssans les deux autres et le menu post n'apparaissait pas. En testant cela, j'ai constaté que je pouvais ajouter un nouveau message, mais je ne pouvais pas enregistrer le brouillon (You are not allowed to edit this postavis). Avez-vous testé pour enregistrer votre propre message dans ce rôle? La modification des messages en attente est correcte.