web-dev-qa-db-ja.com

対応する「capability_type」パラメータを持つカスタム投稿タイプを登録した後にロールにメタ機能を追加することの混乱

カスタム投稿タイプ(CPT)の「capability_type」パラメータと、生成された機能をロールに追加することに混乱しました。

それで、私は以下のように登録された 'external_role'と呼ばれるCPTを持っています:

add_action('init', 'external_roles_post_type_init');
function external_roles_post_type_init() {
  $labels = array(
    'name' => _x('External Roles', 'post type general name'),
    'singular_name' => _x('external role', 'post type singular name'),
    'add_new' => _x('Add New', 'external role'),
    'add_new_item' => __('Add New External Role'),
    'edit_item' => __('Edit External Role'),
    'new_item' => __('New External Role'),
    'view_item' => __('View External Role'),
    'search_items' => __('Search External Roles'),
    'not_found' =>  __('No job found'),
    'not_found_in_trash' => __('No job found in Trash'), 
    'parent_item_colon' => ''
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'has_archive' => 'past-external-roles',
    'rewrite' => array('slug' => 'external-roles','with_front' => false),
    'query_var' => true,
    'capability_type' => array('external_role', 'external_roles'),
    'map_meta_cap' => true,
    'hierarchical' => false,
    'show_in_nav_menus' => false,
    'menu_position' => 20,
    'supports' => array(
      'title',
      'editor',
      'author',
      'custom-fields',
      'revisions'
    )
  );
  register_post_type('external_role',$args);
}

capability_typeパラメータを見れば(私がそれを正しく理解していれば)、次の機能が生成されます。

メタ機能

  • edit_external_role
  • read_external_role
  • delete_external_role

基本機能(メタ機能に基づいて生成されます):

  • edit_external_role
  • edit_others_external_role
  • publish_external_role
  • read_private_external_role

それでは、管理者が新しいCPTを完全に管理できるように、自分の能力をadminロールに引き上げたいと思います。

私はmeta capabilitiesだけを壮大にするのであれば、すべてのprimitive capabilitiesがそのロールにも包括的に付与されることを意味するのではないかと私は考えていましたか?そうですか?

これが、管理者ロールに機能を追加するためのものです。

// Add caps for Administrator role
$role =& get_role('administrator');
// external roles capabilities
$role->add_cap('edit_external_role');
$role->add_cap('read_external_role');
$role->add_cap('delete_external_role');

しかし、これはうまくいきません。

CPTを管理する役割にすべての機能を追加するための簡潔で正しい方法は何ですか?

ありがとう、ダーシャ

EDIT

Adminロールに上限を追加するためにfunctions.phpinitフックを使用しています。

add_action( 'init', 'my_custom_roles_capabilities', 0 );
function my_custom_roles_capabilities(){
    // Add caps for Administrator role
    $role =& get_role('administrator');
    // external roles capabilities
    $role->add_cap('edit_external_role');
    $role->add_cap('read_external_role');
    $role->add_cap('delete_external_role');
}
5
dashaluna

External_roles_post_type_init()関数内で機能を定義してみましたか?

後に

'capability_type' => array('external_role', 'external_roles'),

これを追加してみてください

'capabilities' => array(
    'publish_posts' => 'publish_external_roles',
    'edit_posts' => 'edit_external_roles',
    'edit_others_posts' => 'edit_others_external_roles',
    'delete_posts' => 'delete_external_roles',
    'delete_others_posts' => 'delete_others_external_roles',
    'read_private_posts' => 'read_private_external_roles',
    'edit_post' => 'edit_external_role',
    'delete_post' => 'delete_external_role',
    'read_post' => 'read_external_role',
        ),

$ args配列の別の引数として

それから、このロールまたはそのロールに機能を適用する前に、 User Role Editor Plugin を試してみてください。機能が本当に存在するかどうかを確認してください。ロールに上限を付与または取り消すためのプラグインだけです。私はそれがコーディングのようではないことを知っていますが、実際には管理者用パネルのクリックで与えたり取り消したりする能力は本当に便利です。

私はあなたにこれを教えます。時々(かなり頻繁に)、私はあなたが使用するのと全く同じ方法でカスタム投稿タイプを登録します(そして私が上で貼り付けたケーパビリティ配列)。 functions.phpファイルの登録機能を上に移動するだけで解決することがあります。それは私にとってもwichcraftのようですが、時々うまくいきます。

私が見つけることができる唯一の解決策が User Role EditorMap Cap プラグインの両方を使用することであるように私がデッドパスに自分自身を見つけるとき。私はそれが好きではありませんが、それは心を失うことよりも優れています。

たとえそれが私があなたと共有している「混乱」状態を解決しなくても、それがあなたを助けてくれることを願っています。

2
bluantinoo