web-dev-qa-db-fra.com

Comment attribuer à des utilisateurs spécifiques la possibilité de modifier des types de pages/publications/messages personnalisés spécifiques

J'essaie de mettre en œuvre ce qui semblait être une idée relativement simple. Je construis essentiellement un plug-in de contrôle d'accès pour contrôler l'affichage et la modification d'un type de message personnalisé (dans ce cas, "Projets").

Ce que je souhaite, c’est que plusieurs utilisateurs disposent d’un accès en lecture seule ou d’un accès en lecture/écriture à des "projets" spécifiques.

Il existe plusieurs projets dans le système et l'accès en lecture est contrôlé en activant les cases à cocher pour les projets spécifiques dans les paramètres de profil utilisateur sur le site (voir ci-dessous):

Additional edit options added to User Options

Vous attribuez donc l'accès à ces projets via cette interface, puis le code de la page Projets actuelle empêche l'affichage du contenu si l'ID du projet ne correspond à aucun des ID des projets cochés.

Cela fonctionne très bien, cependant, je dois également autoriser les fonctionnalités d'édition de la même manière. Je pourrais donc permettre à un utilisateur de lire une page spécifique mais également de modifier cette page spécifique. Le problème que je rencontre est que ce que je recherche ne semble pas correspondre aux rôles et aux capacités habituels, car, fondamentalement, je souhaite simplement que tous les utilisateurs aient le même rôle (essentiellement le rôle de l’abonné). Mais je veux ajouter une fonctionnalité d'édition à un utilisateur spécifique pour une page spécifique, alors que les rôles consistent généralement à ajouter des fonctionnalités à un "type" d'utilisateur.

Si tout va bien, j’ai réussi à expliquer ce que j’essaie de faire ici, j’ai du mal à trouver le code/la fonction qui convient pour le faire, même si je suis sûr que cela doit être possible car il existe des plugins permettant d’accéder à des pages, etc., mais évidemment dans ce cas, je ne veux pas compter sur un plugin, car ce que je construis est un plugin lui-même!

Mise à jour: j'ai persévéré pour essayer de résoudre ce problème, mais jusqu'à présent, je ne vois toujours pas comment permettre l'accès à des publications/pages spécifiques, etc. sans avoir recours à la création d'un rôle/d'une capacité personnalisée pour chaque page spécifique. un peu exagéré et je ne suis même pas sûr que cela fonctionnerait.

Mise à jour 2: J'ai ajouté une prime à cette question maintenant pour inspirer quelqu'un, espérons-le! ;) J'ai approfondi cette question mais, même si j'ai trouvé d'autres plugins qui semblent être capables de ce dont j'ai besoin (ainsi que de nombreuses autres fonctionnalités dont je n'ai pas besoin!), Je n'ai tout simplement pas réussi à comprendre. quel code est requis pour limiter des instances spécifiques d'un type de publication à un utilisateur spécifique.

Mise à jour du 31 octobre: ​​J'ai pu faire fonctionner quelque chose grâce au code que @alexey a posté. J'ai maintenant deux listes d'identifiants, dont l'un contrôle l'accès en lecture et l'autre pour l'accès en édition. J'utilise current_user_can('read_projects') pour limiter l'affichage du contenu de la page. Toutefois, un problème survient car il faut charger deux pages avant de restreindre réellement le contenu. La première fois que je clique sur une page, le contenu s'affiche, mais si je recharge la page, le contenu est masqué correctement. Cela semble être lié au moment où user_has_cap est déclenché, mais je n'arrive pas à détecter quoi que ce soit. Autant que je sache, cela devrait être déclenché avant que le contenu de la page ne soit rendu. Je ne vais pas poster de code supplémentaire dans cette mise à jour, car s'il n'y avait pas de raison simple pour que cela ne fonctionne pas, il serait préférable de poster une nouvelle question plutôt que de continuer celle-ci.

6
Rick Curran

Je peux suggérer une autre méthode.

Tout d’abord: accordez un accès complet au type de poste des projets ( Exemple ).

Au profil de l'utilisateur, ajoutez l'ID des articles autorisés.

Ensuite, utilisez le filtre ci-dessous pour restreindre l'accès si l'identifiant de publication n'est pas autorisé.

function allow_user_to_edit_cpt_filter( $capauser, $capask, $param){

    global $wpdb;

    $allowed_posts_id_for_current_user = array( '29', '30' ); // you need to get these ids yourself
    $post = get_post( $param[2] );

    // If current post isn't allowed then delete edit and delete capabilities
    if( !in_array( $post->ID, $allowed_post_type_ids ) ){
        if( ( $param[0] == "edit_projects") || ( $param[0] == "delete_projects" ) ) { // Change to yours capabilities
            foreach( (array) $capask as $capasuppr) {
               if ( array_key_exists($capasuppr, $capauser) ) {
                  $capauser[$capasuppr] = 0;
               }
            }
        }
    }

    return $capauser;
}
add_filter('user_has_cap', 'allow_user_to_edit_cpt_filter', 100, 3 );
4
Alexey