
WordPressを使っていると、「投稿」や「固定ページ」以外にも独自の投稿タイプ(例えば「お知らせ」「事例紹介」など)を作りたくなる場面がありますよね。
それを実現するのが「カスタム投稿タイプ(Custom Post Type)」です。
でも、いざ作ってみると「編集できる人を制限したい」「特定のロールにだけ操作を許可したい」といったニーズが出てきます。
この記事では、初心者の方でもわかりやすいように、カスタム投稿タイプに関するアクセス権限の基本を丁寧に解説していきます。
カスタム投稿タイプの基本:register_post_type()
カスタム投稿タイプは、以下のように register_post_type()
という関数で登録します。
register_post_type('book', [
'label' => '本',
'public' => true,
]);
このようにシンプルに書くと、実は投稿(post)と同じ権限設定が適用されます。
WordPressでは、capability_type
を指定しない場合、デフォルトで 'post'
が使われます。つまり、edit_posts
や delete_posts
など、通常の投稿と同じ権限でこのカスタム投稿も管理されます。
そのため、たとえば「投稿者(author)」ロールに edit_posts
の権限があれば、そのまま book
投稿タイプも編集できてしまいます。これは便利な反面、「投稿は触っていいけど、book は管理者だけにしたい」などのケースでは意図しないアクセスを許してしまう可能性があります。
カスタム投稿を本番サイトで使う際には、こうしたデフォルトの挙動を把握しておくことが大切です。
権限をしっかり制御したい場合は?
本格的な運用では、もっと細かく「誰が何をできるか」を決めたい場面が出てきます。
そんなときは、次の2つのポイントを押さえましょう。
1. capability_type
を使って投稿ごとの権限を分ける
register_post_type('book', [
'label' => '本',
'public' => true,
'capability_type' => 'book', // 投稿ではなく、独自の「book」という権限タイプを使う
'map_meta_cap' => true, // 権限チェックを細かく有効化
]);
これで、WordPressは edit_book
, delete_books
などのカスタム権限を使って制御するようになります。
2. capabilities
を指定して、さらに細かく設定
capabilities
は、register_post_type()
の配列の中に書きます。たとえば次のように記述します。
register_post_type('book', [
'label' => '本',
'public' => true,
'capability_type' => 'book',
'map_meta_cap' => true,
'capabilities' => [
'edit_post' => 'edit_book',
'read_post' => 'read_book',
'delete_post' => 'delete_book',
'edit_posts' => 'edit_books',
'publish_posts' => 'publish_books',
'delete_posts' => 'delete_books',
// ...他にも必要に応じて追加
]
]);
このようにすれば、「このロールには編集だけ許可」「この人は公開もできる」といった制御が自由自在に行えます。
例えば、投稿はできるけど、編集や削除、公開はできないといった制御をするときはこのように記述します。
'capabilities' => [
'edit_post' => 'do_not_allow',
'read_post' => 'read_book',
'delete_post' => 'do_not_allow',
'edit_posts' => 'edit_books',
'publish_posts' => 'do_not_allow',
'delete_posts' => 'do_not_allow',
]
このように do_not_allow
を指定することで、特定のアクションを完全に禁止することができます(WordPressがアクセスを拒否します)。 特定のロールやユーザーに対してきめ細かい制御が可能になるため、より安全で柔軟な運用ができます。
ここで、edit_post
と edit_posts
の違いについても少し補足しておきましょう。
edit_post
は「1件の投稿を編集するための権限」です。edit_posts
は「複数の投稿(一覧)を編集するための一般的な権限」です。
例えば、投稿の編集画面にアクセスしたり、Quick Edit で編集したりする場面では edit_post
が使われ、 投稿一覧ページにアクセスしたり、「新規追加」ボタンを押せるかどうかは edit_posts
によって制御されます。
片方だけを許可しても機能が制限される場合があるので、通常は両方セットで設定することが多いです。
カスタム権限をユーザーに割り当てるには?
たとえば「編集者(editor)」に edit_books
権限を追加したい場合、以下のようなコードを使います。
function add_custom_caps() {
$role = get_role('editor');
$role->add_cap('edit_books');
$role->add_cap('publish_books');
$role->add_cap('read_book');
}
add_action('admin_init', 'add_custom_caps');
管理画面メニューの表示も「権限」で制御できる
WordPressで管理画面に独自メニューを追加したいときには add_menu_page()
を使います。
add_menu_page(
'書籍管理',
'書籍',
'edit_books', // この権限を持っている人だけがメニューを見られる
'book-manager',
'book_manager_page'
);
ここで指定する 'edit_books'
のような権限によって、「このメニューを誰に見せるか」が決まります。
ちなみに、ここでも capability_type
を指定しなかった場合は、デフォルトで 'post'
の権限(たとえば edit_posts
)が使われるため、一般の投稿者でも見えてしまうことがあります。カスタム投稿や専用メニューを管理者だけに表示したいときは、意図的に独自の権限を設定するのがポイントです。
例:管理者だけにアクセスを許可したい場合
add_menu_page(
'管理者用設定',
'管理設定',
'manage_options', // 管理者のみが持つ権限
'admin-settings',
'admin_settings_page'
);
このように manage_options
を指定することで、管理者ロール以外にはメニューが表示されません。
例:寄稿者(contributor)にもアクセスを許可したい場合
add_menu_page(
'寄稿者向け投稿',
'投稿メニュー',
'edit_posts', // 寄稿者も持っている権限
'contributor-menu',
'contributor_menu_page'
);
このように edit_posts
を指定すれば、寄稿者・投稿者・編集者・管理者といった幅広いロールでアクセスできます。 用途に応じて、適切な権限を選ぶことが大切です。
まとめ
実際のサイト運用では「誰に何を許可するか」がとても重要です。
権限の管理は少し難しく感じるかもしれませんが、WordPressサイトを安全かつ効率的に運用するうえで欠かせない非常に大切な要素です。
capability_type
を指定しないと、通常の投稿と同じ権限になる- 細かい権限制御をしたいときは、
capabilities
を定義する add_menu_page()
の第3引数で、メニューの表示対象も制御できる
困った時は、ご相談ください!
syushuは、スポット対応も承ります。「やってみたけどよくわからない」「自分でもできるけど時間がない」という方は、お気軽にご相談ください。
お問い合わせはこちら
お問い合わせはこちらから