Help us understand the problem. What is going on with this article?

カスタム投稿タイプと権限グループ - WordPress

More than 1 year has passed since last update.

I should do this.

ゴール

  • ユーザごとに、アクセス・編集できるカスタム投稿タイプを変える

Roles and capabilities

やることリスト

  • ユーザを複数作成する
  • カスタム投稿タイプを複数作る
  • 権限グループを作成・権限を付与する

ユーザを複数作成する

※動作環境: WordPress 4.8.1

a.PNG

ユーザを複数つくると、『権限グループ』という項目があらわれます。

カスタム投稿タイプを複数作る

functions.php
<?php
function codex_custom_init() {
register_post_type(
    'character',
    array(
        'label' => 'キャラクター',
        'public' => true,
        'show_ui' => true,
        'capability_type' => 'page',
        'capabilities' => array( 'create_posts' => 'create_characters' ),
        'map_meta_cap' => true,
        'has_archive' => true,
        'menu_position' => 8,
        'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' )
    )
);
}
add_action( 'init', 'codex_custom_init', 0);

"register_post_type"の引数はこちらを参考に。
関数リファレンス/register post type

権限に関して


"register_post_type"の引数に'capabilities'があります。
これを使って、カスタム投稿タイプに権限を付与していきます。

現在、このように記述しています。
'capabilities' => array( 'create_posts' => 'create_characters' )

まずは、'create_posts'の説明から。
これは、get_post_type_object( 'page' );var_dumpした結果を参照しています。(確認用)

var_dumpした結果
["cap"]=>
  object(stdClass)#381 (15) {
    ["edit_post"]=>
    string(9) "edit_page"
    ["read_post"]=>
    string(9) "read_page"
    ["delete_post"]=>
    string(11) "delete_page"
    ["edit_posts"]=>
    string(10) "edit_pages"
    ["edit_others_posts"]=>
    string(17) "edit_others_pages"
    ["publish_posts"]=>
    string(13) "publish_pages"
    ["read_private_posts"]=>
    string(18) "read_private_pages"
    ["read"]=>
    string(4) "read"
    ["delete_posts"]=>
    string(12) "delete_pages"
    ["delete_private_posts"]=>
    string(20) "delete_private_pages"
    ["delete_published_posts"]=>
    string(22) "delete_published_pages"
    ["delete_others_posts"]=>
    string(19) "delete_others_pages"
    ["edit_private_posts"]=>
    string(18) "edit_private_pages"
    ["edit_published_posts"]=>
    string(20) "edit_published_pages"
    ["create_posts"]=>
    string(10) "edit_pages"
  }

一番下に ["create_posts"]=> string(10) "edit_pages"とあります。
'edit_pages'は複数出てきます。
これは、グループみたいなものだと思ってください。

'edit_pages'グループに属してるのは、
"create_posts"と"edit_posts"ですので、
権限を与えるときに"edit_pages"を指定するとその二つのことができるってことです。

次に'create_characters'に関してです。
これがまさしく独自権限というものになります。

簡単にいえば、この一文
'capabilities' => array( 'create_posts' => 'create_characters' ) は、
(もともと存在している)'create_posts'という権利を、'create_characters'(独自につくった権利)に変えますよ
ということを意味します。

もともとは存在していなかったものを勝手につくったわけなので、
この権利を行使できるようにしてあげないといけないわけです。

b.PNG

今はこんな感じで、「新規追加」の項目がありません。

権限グループを作成・権限を付与する

functions.php
<?php
//上の部分は省略してます。さっき書いたので。

        'menu_position' => 8,
        'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' )
    )
);

$roles = new WP_Roles();
//var_dump($roles);

$test = $GLOBALS['wp_post_types']['character']->cap;
//var_dump($test);


add_role('test_group', 'テスト権限', array(
    'upload_files' => true,
    'read' => true,
    'create_characters' => true,
    'edit_pages' => true
        ));

// 権限グループ('test_group')の削除
//remove_role('test_group');

}
add_action( 'init', 'codex_custom_init', 0);

var_dump()が書かれてるとこの変数はお気になさらず。確認のために書きました。
先ほど、カスタム投稿タイプに対して、独自の権限を作成しました。

この権限を使うにはぼくがつくったグループに入らないとダメだよ!!!」という状況にしたいのです。

functions.php
<?php
add_role('test_group', 'テスト権限', array(
    'upload_files' => true,
    'read' => true,
    'create_characters' => true,
    'edit_pages' => true
    ));

というわけで権限グループをつくります。

権限グループとは、いわゆる「管理者」や「購読者」と同じものです。
WordPressの管理画面の「ユーザー」から各ユーザーを選ぶと、
管理者権限を持っているユーザーであれば、自由に他のユーザーの権限グループを変更できます。

c.PNG

add_role()という関数を使います。
引数を3つ指定します。

一つ目は権限グループのタクソノミー名みたいなもの、
二つ目は実際に表画面で見れる名前
三つ目は、このグループにどんな権限を与えるか
です。

つまり、3つ目の引数に、
さきほどカスタム投稿タイプで独自につくった権利を突っ込めばオッケーということですね。

これで、ひとまずはゴールは達成できました。

Any proplems?

未解決の課題リスト

  • 権限グループに、新規で権限を付与できない

さっき紹介したadd_role()では、グループに権限を付与できるのは、一番最初の一回のみみたいです。

add_role() | Function | WordPress Developer Resources
答えになってるのかはさておき、それっぽいことがこちらに載っておりました。

Add role, if it does not exist.

非常にシンプルで、
追加したい権限グループがすでに存在していた場合、関数は実行されない」ということだそうです。

なので、

functions.php
<?php
// 権限グループ('test_group')の削除
remove_role('test_group');

新しく権限を付与するには、いちいちremove_role()をしないといけないのが現状です。
(そしてもう一回remove_roleをコメントアウトして、add_roleをする)

絶対もっと簡単なやり方があるはず。

References

参考にした本・サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした