web-dev-qa-db-fra.com

Désactiver les publications, autoriser uniquement la modification de pages existantes, pas en créer de nouvelles (create_posts)

J'essaie de limiter un rôle d'utilisateur pour pouvoir uniquement éditer des pages existantes, mais pas en créer de nouvelles ni faire quoi que ce soit d'autre avec des publications.

J'ai lu ceci:

Existe-t-il une capacité permettant de n'éditer que des pages préexistantes? Si non, un bon moyen de mettre cela en œuvre? et le billet mentionné à cet endroit: https://core.trac.wordpress.org/ticket/16714

J'ai donc créé un nouveau rôle d'utilisateur avec ces autorisations:

  • edit_pages
  • edit_others_pages
  • edit_published_pages
  • read

Puis j'ai ajouté ceci:

function disable_page_creation(){    
  if( check_user_role('rolename'){ // This checks if the current user belongs to this role
     get_post_type_object('page')->cap->create_posts = 'do_not_allow';
  }
}

Le problème est que cela non seulement désactive la création de nouvelles pages, mais interdit également tout autre type de liste.

Dès que je viens d'ajouter edit_posts, tout fonctionne comme prévu dans la section pages, mais bien sûr, les publications sont maintenant modifiables.

Est-ce quelque chose que WP n'est tout simplement pas capable de cette combinaison ou est-ce que je me trompe tout simplement? Des indices où il se coince?


EDIT: D'accord, je pense que je suis en train de retracer le problème. Je pense que la raison en est que les publications et les pages partagent le même fichier administrateur edit.php. Quelques détails supplémentaires:

La variable globale $pagenow est définie sur edit.php, peu importe si nous modifions une publication ou une page.

Dans user_can_access_admin_page () cette vérification est effectuée

 if ( isset( $_wp_menu_nopriv[$pagenow] ) ){

Comme la post-édition désactivée place edit.php dans $_wp_menu_nopriv[$pagenow], elle est également utilisée pour les pages.

Je dirais que c'est un bogue WP. Quelqu'un peut-il confirmer ou a une solution?

4
kraftner

Ok on y va. Il est un bogue dans WordPress même .

J'ai déjà brièvement expliqué le problème dans ma question, alors jetez-y un coup d'œil ou consultez le ticket ci-dessus pour plus de détails.

Jusqu'à ce que le problème soit correctement résolu, je propose ce hack sale. Il est basé sur l'idée que dès qu'un autre sous-menu accessible est ajouté, tout fonctionne à nouveau correctement. Nous ajoutons donc temporairement un sous-élément factice juste pour tromper la vérification, puis le supprimons immédiatement.

function workaround_issue_22895(){    
        add_submenu_page( 'edit.php?post_type=page', 'Workaround_Issue_22895', 'Workaround_Issue_22895', 'edit_pages', 'workaround_issue_22895' );
        add_filter('add_menu_classes', 'workaround_issue_22895_unset');    
}

add_action( 'admin_menu' , 'workaround_issue_22895' );

function workaround_issue_22895_unset ($menu){
    remove_submenu_page( 'edit.php?post_type=page', 'workaround_issue_22895');
    return $menu;
}

BTW, ai-je mentionné que c'est un sale bidouillage que vous devriez manipuler avec précaution?

9
kraftner