Autoriser les éditeurs à modifier les articles en attente mais pas les brouillons

8

J'ai un grand nombre d'utilisateurs avec des capacités d'édition qui aident à parcourir les soumissions de poste. Voici ma configuration actuelle pour ce rôle:

Capacités de l'éditeur

Comme vous pouvez le voir, ils sont autorisés à le faire edit_posts, edit_others_postsmais ils ne le peuvent pas edit_published_posts. Cela signifie qu'ils peuvent modifier les publications qui sont dans l'état Brouillon et En attente .

Maintenant, je veux les restreindre pour ne pouvoir modifier que les messages en attente. Ainsi, ils n'auront pas la possibilité de toucher aux brouillons de messages ( sauf s'ils sont l'auteur du message). Malheureusement, il n'y a pas de capacité comme edit_pending_posts... il devrait y en avoir .

Comment résoudre ce problème?

Christine Cooper
la source

Réponses:

4

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;
}
fuxia
la source
J'ai fait des tests et rencontré quelques problèmes. Tout d'abord, j'ai eu edit_postset edit_others_postsavec le nouveau edit_pending_posts. J'ai juste essayé de continuer edit_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.
Christine Cooper
@ChristineCooper Cela s'est produit car $post->post_authorest 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 la returnligne du bloc après // Let users edit their own posts.
fuxia
Je l'ai! Un problème demeure. J'ai testé votre code mis à jour et cela a bien fonctionné! Cependant, je ne veux pas autoriser les éditeurs à modifier leurs articles publiés, j'ai donc supprimé cette return $allcaps;ligne et le même problème d'autorisation apparaît avec l'enregistrement du brouillon. Pourquoi?
Christine Cooper
Hm, travaille pour moi. Mes paramètres de capacité
fuxia
Juste pour confirmer, vous parliez de supprimer la ligne de retour sous $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
Christine Cooper