サポート » 使い方全般 » 特定のカスタムタクソノミーの権限に複数の権限グループを指定する方法

  • 解決済 haruka

    (@harlequin_wp)


    カスタムタクソノミーA、B、Cがあり、そのうちのCにだけ、権限グループ「投稿者」にもタームの追加権限を与える方法で躓いています。
    投稿者はデフォルトでカテゴリの追加権限が無いので、カスタムタクソノミーのタームの追加もデフォルトではできません。

    そこで、register_taxonomy()関数のcapabilitiesオプションで設定しようと色々やってみたのですが、思うようにいきません。

    //taxonomy_cは、カスタム投稿タイプpost_type_aとpost_type_bに共通のタクソノミー
    //$labelsの中身は省略
    register_taxonomy('taxonomy_c', array('post_type_a', 'post_type_b'),array(
       'hierarchical' => true,
       'labels' => $labels,
       'show_ui' => true,
       'query_var' => true,
       'capabilities' => array('edit_terms' => 'author'),
    ));

    これだと、投稿者でタクソノミーCの追加は出来るようになるのですが、管理者で追加が出来なくなってしまいました。
    edit_termsに複数の権限グループを割り当てるにはどうすればよいでしょうか?

    'capabilities' => array('edit_terms' => array('administrator','author'))
    'capabilities' => array('edit_terms' => 'administrator','edit_terms' => 'author')

    という書き方も試してみたのですが、出来ませんでした。
    上の書き方だと、エラー(Illegal offset type in isset or empty)になり、
    下の書き方だと、管理者で追加でき、投稿者では追加できません(つまりデフォルトと同じ)

    解決法をご存知の方がいらっしゃいましたら、教えて頂けると幸いです。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター gatespace

    (@gatespace)

    こんにちは。
    register_taxonomy の capabilities 引数ですが、どの権限を割り当てるか(作るか)であって「権限グループ」を割り当てる訳ではありません。
    http://codex.wordpress.org/Function_Reference/register_taxonomy
    それぞれデフォルトで
    タクソノミーの管理画面 manage_terms : manage_categories
    タームの編集 edit_terms : manage_categories
    タームの削除 delete_terms : manage_categories
    投稿画面で選択できる assign_terms : edit_posts
    で権限が割り当てられます。
    manage_categories は編集者以上、edit_posts は寄稿者以上に付与されている権限です。

    taxonomy_c「のみ」投稿者以上の権限で編集できる権限を与えるなら
    1. オリジナルの権限の作成
    2. 新しい権限を権限グループに付与
    の順番になります。

    function codex_custom_init() {
    	/**
    	* カスタムタクソノミー reportcat
    	*/
    	$taxlabels = array(
    		'name'              => "タクソノミーC",
    		'singular_name'     => "タクソノミーC",
    		'search_items'      => "タクソノミーCを検索",
    		'all_items'         => "すべてのターム",
    		'parent_item'       => "親ターム",
    		'parent_item_colon' => "親:",
    		'edit_item'         => "タームを編集",
    		'update_item'       => "タームを更新",
    		'add_new_item'      => "新規ターム",
    		'new_item_name'     => "新規ターム名",
    		'menu_name'         => "タクソノミーC",
    	);
    
    	register_taxonomy( 'taxonomy_c', array('post_type_a', 'post_type_b'), array(
    		'hierarchical' => true,
    		'labels'       => $taxlabels,
    		'show_ui'      => true,
    		'query_var'    => true,
    		'rewrite'      => true,
    		'capabilities' => array(
    			'manage_terms' => 'manage_taxonomy_c',
    			'edit_terms'   => 'manage_taxonomy_c',
    			'delete_terms' => 'manage_taxonomy_c',
    		),
    	));
    
    	/**
    	* 権限 manage_taxonomy_c を権限グループに付与
    	*/
    
    	// 権限グループをすべて取得
    	$roles = new WP_Roles();
    
    	foreach ($roles->roles as $key => $value ) {
    		if ( $key == "subscriber" or $key == "contributor") continue; // 購読者・寄稿者はスキップ
    		$role = get_role($key);
    		$role->add_cap( "manage_taxonomy_c" ); // 権限 manage_taxonomy_c の付与
    	}
    }
    add_action( 'init', 'codex_custom_init', 0);

    自分のブログになりますが、カスタム投稿タイプまで踏みいった権限のことを書きましたので、
    参考になれば幸いです。
    http://wp.me/p14D7l-1S

    トピック投稿者 haruka

    (@harlequin_wp)

    gatespaceさん、回答ありがとうございます!

    capabilitiesで指定できるのは権限グループではなく、権限だったのですね。
    すっかり間違って認識してました。

    CODEXに具体的なコード記述例が無かったので適当にググってヒットしたコードをそのまま鵜呑みにしてしまってました(汗)
    英文サイトだったので内容をよく読みもしなかったので、もしかして間違いの例として挙げられていたのかも…。

    gatespaceさんの説明と、具体的なコードのおかげで、やっとCODEXに書かれていた、

    'manage_terms' - 'manage_categories'
    'edit_terms' - 'manage_categories'
    'delete_terms' - 'manage_categories'
    'assign_terms' - 'edit_posts'

    の意味が分かりました。

    教えて頂いたコードで、希望通りに動作しました!ありがとうございます!

    で、理解したところでよく考えたら、edit_postsは寄稿者以上の権限ということは、投稿者だけでなく寄稿者にもedit_terms権限を与えて良いなら、新しい権限グループを作成する必要が無く、

    'capabilities' => array('edit_terms' => 'edit_posts')

    だけで良いということですよね?
    作成中のWPは管理者と投稿者しかいないので、これでも問題なさそうです。
    この記述でも、同じように希望通りに動作しました。

    gatespaceさんのブログは、いつも参考にさせていただいております。
    紹介の記事にも目を通していたのですが、カスタム投稿タイプの権限のことだけでタクソノミーは関係ないかと思ってスルーしてしまってました(汗)

    今回、とても勉強になりました。ありがとうございました!

    モデレーター gatespace

    (@gatespace)

    edit_terms は権限ではないですよ。
    「タームの編集」という操作の事を指し、それを行える権限がデフォルトでは「manage_categories」になります。

    ‘capabilities’ => array(‘edit_terms’ => ‘edit_posts’)

    とした場合、寄稿者でもタームの編集はできますが、manage_terms、delete_termsが指定されていないので、タームの削除もできませんが、タクソノミーの管理画面(サブパネル)にアクセスできなくなりますよ。

    'capabilities' => array(
    	'manage_terms' => 'edit_posts',
    	'edit_terms'   => 'edit_posts',
    	'delete_terms' => 'edit_posts',
    )

    のようにすべて指定しておくか、
    上記の私のコードなら、
    if ( $key == "subscriber" or $key == "contributor") continue; // 購読者・寄稿者はスキップ
    の部分を
    if ( $key == "subscriber" ) continue; // 購読者はスキップ
    にしてみてください。

    個人的にはどちらの方法でも大丈夫ですが、
    デフォルトの権限にあわせて任意の権限(manage_taxonomy_c)を作った方が、
    元のコードとの比較もできるし、良いかなぁとは思います。
    (無いとは思うけど、コアのアップデートでedit_posts権限が変わってしまう可能性もありますし)

    あ、ブログありがとうございます。

    トピック投稿者 haruka

    (@harlequin_wp)

    gatespaceさん、補足いただきありがとうございます!

    edit_terms は権限ではないですよ

    あ、権限という表現が間違っていました。
    edit_posts等の権限とは違うのですよね。
    例えば、デフォルトの

    'edit_terms' - 'manage_categories'

    は、manage_categories権限を持つグループに、edit_terms、タームを追加する権利を与える、ということと思い、権利を与えるというのを権限を与える、と間違って表現してしまいました。

    寄稿者でもタームの編集はできますが、manage_terms、delete_termsが指定されていないので、タームの削除もできませんが、タクソノミーの管理画面(サブパネル)にアクセスできなくなりますよ。

    はい。今回、投稿者にはデフォルトで可能なタームを割り当てるassign_termsに加えて、投稿画面でのタームの追加edit_terms「のみ」を可能にしたく、それ以上のこと(管理や削除)はさせたくないので、大丈夫です。

    でも、

    コアのアップデートでedit_posts権限が変わってしまう可能性もありますし

    なるほど、それも考えられますよね。
    そう考えると、新しく権限グループを作成して設定した方が、確実で安心ですね。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「特定のカスタムタクソノミーの権限に複数の権限グループを指定する方法」には新たに返信することはできません。