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

# I should do this.
**ゴール**

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

# Roles and capabilities
**やることリスト**

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

## ユーザを複数作成する
※動作環境: WordPress 4.8.1

![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/188888/900fc5b7-3a95-2229-942b-3b67cd22cff2.png)

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

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

```PHP: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](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type)


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

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

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


```PHP: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](https://qiita-image-store.s3.amazonaws.com/0/188888/218622d1-5d44-f2e7-799e-9a9ec6f1ea69.png)

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

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

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

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


```PHP:functions.php
<?php
add_role('test_group', 'テスト権限', array(
	'upload_files' => true,
	'read' => true,
	'create_characters' => true,
	'edit_pages' => true
	));
```
というわけで**権限グループ**をつくります。

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

![c.PNG](https://qiita-image-store.s3.amazonaws.com/0/188888/62cf14f2-81b1-907f-bda6-9359c565b102.png)


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

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

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


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

# Any proplems?
**未解決の課題リスト**

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

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

▼ [add_role() | Function | WordPress Developer Resources](https://developer.wordpress.org/reference/functions/add_role/)
答えになってるのかはさておき、それっぽいことがこちらに載っておりました。

>Add role, if it does not exist.

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

なので、

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

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

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


# References
**参考にした本・サイト**

- [ ] 「エンジニアのためのWordPress開発入門」/ 技術評論社 (著者複数)
- [ ]  [WordPress の新規追加の権限を切り分けてみる | Simple Colors](http://www.warna.info/archives/2728/)