web-dev-qa-db-fra.com

Comment autoriser une taxonomie personnalisée pour certains rôles?

J'essaie de ne montrer qu'une taxonomie pour les editor et administrator mais je n'ai pas trouvé de solution sur SO ou ici. La chose la plus proche que j'ai pu trouver était Comment supprimer une taxonomie de Wordpress? sur SO. Quelle est la bonne façon de n'autoriser la taxonomie que pour editor et administrator?

// remove from everyone that isn't admin or editor
function taxonomy_for_admin_and_editor_only() {
   if ( !current_user_can( 'administrator' ) || !current_user_can( 'editor' ) ) {
       register_taxonomy( 'foobar', array() );
   }
}
add_action( 'init' , 'taxonomy_for_admin_and_editor_only' );

J'ai essayé add_action( 'admin' , 'taxonomy_for_admin_and_editor_only' ); sans succès non plus.

Lorsque vous enregistrez votre taxonomie, vous pouvez passer un argument appelé capacités . Tout simplement des capacités que seuls les administrateurs et les éditeurs possèdent.

$args = array(
    'capabilities' => array( 'manage_options', 'edit_posts' )
);
register_taxonomy( 'foobar', 'post', $args ); 

https://codex.wordpress.org/Roles_and_Capabilities#Editor

7
mrbobbybryant

Je n'avais jamais joué avec des rôles auparavant, donc c'était une expérience d'apprentissage amusante. Je pars parce que j'ai passé beaucoup de temps à rechercher ce domaine et que cela pourrait aider la prochaine personne. Je sais que ma question concerne la taxonomie, mais la question me confondait et je voulais donc tester au niveau du CPT. Le hook correct était admin_init mais il supprimait toujours la taxonomie des administrator et editor et je ne le voulais pas.

Avant la réponse, j'ai rencontré " Possible de masquer l'interface utilisateur/le type de publication personnalisée à partir de rôles d'utilisateur spécifiques? "

// hide from Contributors
function no_see_from_contributors() {
    if ( current_user_can( 'contributor' ) ) :
        remove_menu_page( 'edit.php' ); // Posts
        remove_menu_page( 'tools.php' ); // Tools
        remove_menu_page( 'edit-comments.php' ); // Comments
    endif;
}
add_action( 'admin_menu', 'no_see_from_contributors' );

créer un compte contributeur test, même s'il n'est pas visible dans le menu, un contributeur peut toujours accéder à cette zone en ajoutant edit.php, tools.php ou edit-comments.php dans l'URL. Je vais tester une solution pour éviter cela et faire une modification avec une solution si j'en trouve une.

Des recherches ultérieures ont ensuite abouti à " Restreindre le type de message personnalisé au seul rôle d'administrateur de site " et " Supprimer le menu Type de message personnalisé pour les utilisateurs non administrateurs ", qui étaient d'excellentes lectures. Pour en savoir plus sur les fonctionnalités, visitez le site Codex: enregistrez le type de message et faites défiler jusqu’à capability_type.

Vous pouvez référencer le codex pour Administrator et Editor sur les rôles à utiliser dans le tableau.

Taxonomie finale:

function something_taxonomy() {
    $labels = array(
        'name'                       => _x( 'Taxonomies', 'Taxonomy General Name', 'theme' ),
        'singular_name'              => _x( 'Taxonomy', 'Taxonomy Singular Name', 'theme' ),
        'menu_name'                  => __( 'Taxonomy', 'theme' ),
        'all_items'                  => __( 'All Items', 'theme' ),
        'parent_item'                => __( 'Parent Item', 'theme' ),
        'parent_item_colon'          => __( 'Parent Item:', 'theme' ),
        'new_item_name'              => __( 'New Item Name', 'theme' ),
        'add_new_item'               => __( 'Add New Item', 'theme' ),
        'edit_item'                  => __( 'Edit Item', 'theme' ),
        'update_item'                => __( 'Update Item', 'theme' ),
        'view_item'                  => __( 'View Item', 'theme' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'theme' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'theme' ),
        'choose_from_most_used'      => __( 'Choose from the most used', 'theme' ),
        'popular_items'              => __( 'Popular Items', 'theme' ),
        'search_items'               => __( 'Search Items', 'theme' ),
        'not_found'                  => __( 'Not Found', 'theme' ),
        'items_list'                 => __( 'Items list', 'theme' ),
        'items_list_navigation'      => __( 'Items list navigation', 'theme' ),
    );
    $capabilities = array(
        'edit_post'          => 'edit_pages',
        'read_post'          => 'edit_pages',
        'delete_post'        => 'edit_pages',
        'edit_posts'         => 'edit_pages',
        'edit_others_posts'  => 'edit_pages',
        'delete_posts'       => 'edit_pages',
        'publish_posts'      => 'edit_pages',
        'read_private_posts' => 'edit_pages'
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => true,
        'capabilities'               => $capabilities,
    );
    register_taxonomy( 'taxonomy_key', array( 'post', 'foo_key', 'bar_key' ), $args );
}
add_action( 'init', 'something_taxonomy', 0 );

Ce que j'ai utilisé pour supprimer la méta-boîte des contributeurs:

if ( is_admin() ) {
    function remove_metabox_for_non_admin_and_editor() {
        if ( current_user_can( 'contributor' ) || current_user_can( 'subscriber' ) ) {
            remove_meta_box( 'tagsdiv-foo_key_tag', 'foo_key', 'normal' );
            remove_meta_box( 'categorydiv', 'foo_key', 'normal' );
            remove_meta_box( 'foo_keyimagediv', 'foo_key', 'normal' );
            remove_meta_box( 'authordiv', 'foo_key', 'normal' );
            remove_meta_box( 'trackbacksdiv', 'foo_key', 'normal' );
            remove_meta_box( 'commentstatusdiv', 'foo_key', 'normal' );
            remove_meta_box( 'foo_keycustom', 'foo_key', 'normal' );
            remove_meta_box( 'commentstatusdiv', 'foo_key', 'normal' );
            remove_meta_box( 'commentsdiv', 'foo_key', 'normal' );
            remove_meta_box( 'revisionsdiv', 'foo_key', 'normal' );
            remove_meta_box( 'authordiv', 'foo_key', 'normal' );
            remove_meta_box( 'slugdiv', 'foo_key', 'normal' );
            remove_meta_box( 'taxonomy_keydiv', 'foo_key', 'normal' );
            // remove pages
            remove_menu_page( 'edit-comments.php' );
            remove_menu_page( 'edit.php' );
            remove_menu_page( 'tools.php' );
        }
    }
    add_action( 'admin_menu', 'remove_metabox_for_non_admin_and_editor' );
}

Pour trouver ce que le $id correspond à la méta-boîte personnalisée, j'ai utilisé l'élément inspecter de Chrome pour trouver l'identifiant qu'il était en train de créer. J'ai choisi admin_menu au lieu de admin_init après avoir lu " Quel crochet Wordpress déclenche en premier admin_init ou admin_menu "

Vous voulez utiliser le hook admin_init:

add_action( 'admin_init' , 'taxonomy_for_admin_and_editor_only' );
1
Tom J Nowell