8768 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,

Je souhaite donner aux auteurs du blog sur lequel je travaille la possibilité de créer, éditer, publier, modifier leurs propres pages. Pour cela, j'ai ajouté ce bout de code dans mon functions.php :
function add_my_author_role_caps(){
  global $pagenow;

  // gets the author role
  $role = get_role( 'author' );

  if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) ){ // Test if theme is activated
    // Theme is activated

    // This only works, because it accesses the class instance.
    $role->add_cap( 'edit_pages' );
    $role->add_cap( 'publish_pages' );
    $role->add_cap( 'edit_published_pages' );
  }
  else {
    // Theme is deactivated
    // Remove the capacity when theme is deactivated
    $role->remove_cap( 'edit_pages' );
    $role->remove_cap( 'publish_pages' ); 
    $role->remove_cap( 'edit_published_pages' );
  }
}
add_action( 'load-themes.php', 'add_my_author_role_caps' );

J'ai trouvé cet exemple ici : https://codex.wordpress.org/Function_Reference/add_cap
J'ai vérifié, les nouvelles capacités sont bien ajoutées au rôle author. J'ai regardé dans la base de données, dans la table wp_options, dans la colonne option_name la valeur de wp_user_roles (colonne option_value).
L'auteur peut effectivement créer des pages les publier et les modifier. Ce qui est plus bizarre, c'est qu'il peut également modifier les pages des autres, or je n'ai pas ajouté la cap edit_others_pages. Pour avoir un aperçu de toutes les capacités aller ici : https://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table
J'ai tenté de retirer la capacité edit_published_pages, mais dans ce cas, l'auteur ne peut pas modifier ses propres pages...
Bogue de Wordpress ou mécompréhension ?

Merci d'avance. Smiley smile

Pour être complet, voici la valeur de wp_user_roles :
a: 5: {
    s: 13: "administrator";a: 2: {
        s: 4: "name";s: 13: "Administrator";s: 12: "capabilities";a: 61: {
            s: 13: "switch_themes";b: 1;s: 11: "edit_themes";b: 1;s: 16: "activate_plugins";b: 1;s: 12: "edit_plugins";b: 1;s: 10: "edit_users";b: 1;s: 10: "edit_files";b: 1;s: 14: "manage_options";b: 1;s: 17: "moderate_comments";b: 1;s: 17: "manage_categories";b: 1;s: 12: "manage_links";b: 1;s: 12: "upload_files";b: 1;s: 6: "import";b: 1;s: 15: "unfiltered_html";b: 1;s: 10: "edit_posts";b: 1;s: 17: "edit_others_posts";b: 1;s: 20: "edit_published_posts";b: 1;s: 13: "publish_posts";b: 1;s: 10: "edit_pages";b: 1;s: 4: "read";b: 1;s: 8: "level_10";b: 1;s: 7: "level_9";b: 1;s: 7: "level_8";b: 1;s: 7: "level_7";b: 1;s: 7: "level_6";b: 1;s: 7: "level_5";b: 1;s: 7: "level_4";b: 1;s: 7: "level_3";b: 1;s: 7: "level_2";b: 1;s: 7: "level_1";b: 1;s: 7: "level_0";b: 1;s: 17: "edit_others_pages";b: 1;s: 20: "edit_published_pages";b: 1;s: 13: "publish_pages";b: 1;s: 12: "delete_pages";b: 1;s: 19: "delete_others_pages";b: 1;s: 22: "delete_published_pages";b: 1;s: 12: "delete_posts";b: 1;s: 19: "delete_others_posts";b: 1;s: 22: "delete_published_posts";b: 1;s: 20: "delete_private_posts";b: 1;s: 18: "edit_private_posts";b: 1;s: 18: "read_private_posts";b: 1;s: 20: "delete_private_pages";b: 1;s: 18: "edit_private_pages";b: 1;s: 18: "read_private_pages";b: 1;s: 12: "delete_users";b: 1;s: 12: "create_users";b: 1;s: 17: "unfiltered_upload";b: 1;s: 14: "edit_dashboard";b: 1;s: 14: "update_plugins";b: 1;s: 14: "delete_plugins";b: 1;s: 15: "install_plugins";b: 1;s: 13: "update_themes";b: 1;s: 14: "install_themes";b: 1;s: 11: "update_core";b: 1;s: 10: "list_users";b: 1;s: 12: "remove_users";b: 1;s: 13: "promote_users";b: 1;s: 18: "edit_theme_options";b: 1;s: 13: "delete_themes";b: 1;s: 6: "export";b: 1;
        }
    }
    s: 6: "editor";a: 2: {
        s: 4: "name";s: 6: "Editor";s: 12: "capabilities";a: 34: {
            s: 17: "moderate_comments";b: 1;s: 17: "manage_categories";b: 1;s: 12: "manage_links";b: 1;s: 12: "upload_files";b: 1;s: 15: "unfiltered_html";b: 1;s: 10: "edit_posts";b: 1;s: 17: "edit_others_posts";b: 1;s: 20: "edit_published_posts";b: 1;s: 13: "publish_posts";b: 1;s: 10: "edit_pages";b: 1;s: 4: "read";b: 1;s: 7: "level_7";b: 1;s: 7: "level_6";b: 1;s: 7: "level_5";b: 1;s: 7: "level_4";b: 1;s: 7: "level_3";b: 1;s: 7: "level_2";b: 1;s: 7: "level_1";b: 1;s: 7: "level_0";b: 1;s: 17: "edit_others_pages";b: 1;s: 20: "edit_published_pages";b: 1;s: 13: "publish_pages";b: 1;s: 12: "delete_pages";b: 1;s: 19: "delete_others_pages";b: 1;s: 22: "delete_published_pages";b: 1;s: 12: "delete_posts";b: 1;s: 19: "delete_others_posts";b: 1;s: 22: "delete_published_posts";b: 1;s: 20: "delete_private_posts";b: 1;s: 18: "edit_private_posts";b: 1;s: 18: "read_private_posts";b: 1;s: 20: "delete_private_pages";b: 1;s: 18: "edit_private_pages";b: 1;s: 18: "read_private_pages";b: 1;
        }
    }
    s: 6: "author";a: 2: {
        s: 4: "name";s: 6: "Author";s: 12: "capabilities";a: 13: {
            s: 12: "upload_files";b: 1;s: 10: "edit_posts";b: 1;s: 20: "edit_published_posts";b: 1;s: 13: "publish_posts";b: 1;s: 4: "read";b: 1;s: 7: "level_2";b: 1;s: 7: "level_1";b: 1;s: 7: "level_0";b: 1;s: 12: "delete_posts";b: 1;s: 22: "delete_published_posts";b: 1;s: 10: "edit_pages";b: 1;s: 13: "publish_pages";b: 1;s: 20: "edit_published_pages";b: 1;
        }
    }
    s: 11: "contributor";a: 2: {
        s: 4: "name";s: 11: "Contributor";s: 12: "capabilities";a: 5: {
            s: 10: "edit_posts";b: 1;s: 4: "read";b: 1;s: 7: "level_1";b: 1;s: 7: "level_0";b: 1;s: 12: "delete_posts";b: 1;
        }
    }
    s: 10: "subscriber";a: 2: {
        s: 4: "name";s: 10: "Subscriber";s: 12: "capabilities";a: 2: {
            s: 4: "read";b: 1;s: 7: "level_0";b: 1;
        }
    }
}

Modifié par jojaba (02 Oct 2016 - 17:34)
Bonjour, avec un peu de retard...

Je pense que edit_published_pages est une capacité liée à TOUTES les pages publiées, et non seulement à celles liées à l'utilisateur courant.

Pour contourner ce problème je créé des restrictions d'accès selon un groupe d'appartenance (fonction qui n'est pas native dans WordPress mais que j'ai ajouté). Le groupe est définit dans les meta box de l'article et aussi dans les metas de l'utilisateur.
Modérateur
Bonjour Olivier,

Merci pour cette réponse. Pourrais-tu m'expliquer comment tu fais pour restreindre selon un groupe. Je vois très bien comment créer des metabox dans les pages et dans le profil utilisateur, mais je ne vois pas du tout comment faire pour restreindre l'accès à une page selon l'appartenance à un groupe.
Merci d'avance. Smiley smile
Modifié par jojaba (06 Nov 2016 - 15:41)
Et bien je mets les résultats des metas dans des variables, par exemple pour un utilisateur :
$userGroup = get_user_meta( $userId, 'group', true );

Et pour récupérer le groupe dont l'article est issue (ligne de code dans le contexte) :
$authorizedGroups = get_post_meta( $post->ID, 'authorizedgroups', true );

Ensuite une petite fonction (lien sur Github) :
function ScripturaRightsManagementGroups( $userGroups = [ '' ], $authorizedGroups = [ '' ] )
{
    // @note Les variables d'entrées sont passées en tableaux pour permettre l'utilisation de plusieurs groupes
    $userGroups = preg_replace('/\s/', '', $userGroups );
    $userGroups = explode( ',', $userGroups );
    $authorizedGroups = preg_replace('/\s/', '', $authorizedGroups );
    $authorizedGroups = explode( ',', $authorizedGroups );
    $intersect = array_intersect( $userGroups, $authorizedGroups );
    $rights = false;
    if( $intersect )
        $rights = true;
    return $rights;
}

Puis je mets une condition qui permet telle ou telle fonctionnalité sur le site si $rights= true (et sur ce point il faudra que je mette mon repository à jour car je vois que je suis encore sur un système de permission différent qui ne permettait qu'un seul groupe par article et par utilisateur).
Modifié par Olivier C (09 Nov 2016 - 15:44)
Modérateur
OK pour ça, mais ce que je ne sais pas faire c'est laisser modifier une page par les utilisateurs qui sont dans le même groupe que l'auteur initial. Ce qu'il me faudrait c'est donner des droits d'écriture pour plusieurs rédacteurs (un peu comme fait Co-Authors Plus) mais en prenant en compte l'appartenance à un groupe. En clair, comment je fais pour laisser modifier une page par un utilisateur qui n'est pas l'auteur initial ?
Mais... que l'auteur soit à l'origine de l'article on s'en moque dans ce cas de figure : la fonction retourne true si l'article et l'utilisateur courant (et non l'auteur) font partie du même groupe. Point.
Modérateur
Je crois que tu n'as pas bien compris mon problème. Ce que je ne sais pas faire, c'est "filtrer" lors de l'édition des pages les utilisateurs ayant les privilèges pour cela (faisant parti du bon groupe). J'ai trouvé une ressource sur le Web qui devrait correspondre à ce que je devrais savoir : http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-po
C'est prévu pour des custom-types, mais je pense qu'on peut appliquer aux pages (puisque ce sont des custom-types également).
jojaba a écrit :
Je crois que tu n'as pas bien compris mon problème. Ce que je ne sais pas faire, c'est "filtrer" lors de l'édition des pages les utilisateurs ayant les privilèges pour cela (faisant parti du bon groupe).

Effectivement je n'ai peut-être pas compris ta demande, nous ne parlons peut-être pas de la même chose. J'explicite donc mon idée (ce que je sais faire, édit : ou crois savoir faire...) afin de savoir si c'est ce que tu recherches :
Spécifications ? a écrit :
- Un rôle commentateur peut commenter... tous les articles du site ne possédant pas de groupe ou possédant un groupe correspondant au sien.
- Un rôle contributeur peut contribuer à... tous les articles du site ne possédant pas de groupe ou possédant un groupe correspondant au sien.
- Un éditeur peut éditer... tous les articles du site ne possédant pas de groupe ou possédant un groupe correspondant au sien.
- Un modérateur peut modérer... tous les articles du site ne possédant pas de groupe ou possédant un groupe correspondant au sien.
- Etc.
- Seul l'administrateur garde tous ses pouvoirs.

Modifié par Olivier C (08 Nov 2016 - 08:31)