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_posts
capacité d'autres publications d'auteurs.
Nous devons donc filtrer user_has_cap
et étudier notre nouvelle edit_pending_posts
capacité lorsque certains veulent l'utiliser edit_post
.
Je l'ai delete_post
aussi 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_posts
etedit_others_posts
avec le nouveauedit_pending_posts
. J'ai juste essayé de continueredit_pending_posts
sans 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 post
avis). Avez-vous testé pour enregistrer votre propre message dans ce rôle? La modification des messages en attente est correcte.$post->post_author
est passé sous forme de chaîne , mais$args[1]
sous forme d'entier. Quelquefois. Stupide WordPress! Je l'ai corrigé en transtypant les deux en nombres entiers. Et j'ai permis aux éditeurs de modifier leurs propres articles publiés. Si vous ne le souhaitez pas, supprimez lareturn
ligne du bloc après// Let users edit their own posts
.return $allcaps;
ligne et le même problème d'autorisation apparaît avec l'enregistrement du brouillon. Pourquoi?$allcaps[ $caps[0] ] = TRUE;
? Très étrange que j'éprouve cela, cela n'a pas de sens logiquement que cela ne devrait pas fonctionner pour moi s'il le fait pour vous, voici ma configuration: i.imgur.com/X3bv9rH.png