web-dev-qa-db-ja.com

特定の役割に対してカスタム分類を許可するにはどうすればよいですか。

私はeditoradministratorの分類法を示すことだけを試みていますが、私はSOまたはここで解決策を見つけていません。私が見つけることができた最も近いものは、 Wordpressからどのように分類法を削除するのですか? SOで。 editoradministratorの分類のみを許可する適切な方法は何ですか?

// 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' );

私はadd_action( 'admin' , 'taxonomy_for_admin_and_editor_only' );も試してみました。

分類法を登録するときは、capabilitiesという引数を渡すことができます。管理者と編集者だけが持っている能力を渡すだけです。

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

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

7
mrbobbybryant

私は前に役割で遊んだことがないので、これは楽しい学習経験でした。私はこの分野を調査するのに多くの時間を費やしたのでこれを去ります、そしてこれは次の人を助けるかもしれません。私は私の質問が分類学に関してあることを知っています、しかし私は問題と混同されました、それで私はCPTレベルからテストしたかったです。正しいフックはadmin_initでしたが、それでもadministratoreditorから分類法を取り除いていたので、私はそれを望みませんでした。

答えの前に私は " 特定のユーザーの役割からカスタム投稿タイプのUI /メニューを隠すことは可能ですか? "に出会いましたが、私は次のような関数を使うときに

// 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' );

メニューに表示されていなくても、コントリビュータはテスト用のアカウントを作成します。コントリビュータはURLにedit.phptools.php、またはedit-comments.phpを追加してこの領域にアクセスできます。これを防ぐための解決策をテストし、解決策が見つかった場合はそれを使用して編集します。

これ以降のさらなる調査では、「 カスタム投稿タイプをサイト管理者ロールのみに制限する 」および「 管理者以外のユーザーのカスタム投稿タイプメニューを削除する 」が得られました。機能の詳細については、 Codexにアクセスして投稿タイプを登録してください そしてcapability_typeまでスクロールします。

Administrator および Editor のコーデックスを参照して、アレイで使用するロールを決めることができます。

最終分類法:

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 );

私が投稿者からメタボックスを削除するために使用したもの:

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' );
}

$idがカスタムメタボックスのものであることを見つけるために、作成したIDを見つけるためにChromeのinspect要素を使用しました。 「 Wordpressフックが最初にadmin_initまたはadmin_menuを起動するのは 」を読んでから、admin_menuではなくadmin_initを選択しました。

あなたはadmin_initフックを使いたいです:

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