[WordPress] 特定のユーザーだけが編集できるカスタム投稿タイプ

WordPress で、カスタム投稿タイプを追加してページを作成し、そのページの編集のみを特定のユーザーに任せるという運用方法のウェブサイトを作ることがあったので、その備忘録を残します。

例えば企業サイトで、ページの作成・更新・削除は Web 部門が統括するけど、特定のページの編集は各部門に任せる、といったウェブサイトを作る際の参考になるかもしれません。

カスタム投稿タイプの追加

特定の権限グループが付与されたユーザーのみが操作できるカスタム投稿タイプを作るには、次のような PHP コードを functions.php に追加します。

add_action( 'init', function () {

  // 新しい投稿タイプ
  $post_type = 'new_post';

  // 新しい投稿タイプの複数形
  $plural_post_type = 'new_posts';

  // 新しい投稿タイプの独自権限
  $capabilities = [
    'delete_post'            => "delete_{$post_type}",
    'edit_post'              => "edit_{$post_type}",
    'read_post'              => "read_{$post_type}",
    'delete_posts'           => "delete_{$plural_post_type}",
    'delete_others_posts'    => "delete_others_{$plural_post_type}",
    'delete_private_posts'   => "delete_private_{$plural_post_type}",
    'delete_published_posts' => "delete_published_{$plural_post_type}",
    'edit_posts'             => "edit_{$plural_post_type}",
    'edit_others_posts'      => "edit_others_{$plural_post_type}",
    'edit_private_posts'     => "edit_private_{$plural_post_type}",
    'edit_published_posts'   => "edit_published_{$plural_post_type}",
    'publish_posts'          => "publish_{$plural_post_type}",
    'read_private_posts'     => "read_private_{$plural_post_type}",
  ];

  // 新しい投稿タイプの登録
  register_post_type( $post_type, [
    …
    'capability_type' => [ $post_type, $plural_post_type ],
    'capabilities' => $capabilities,
    'map_meta_cap' => true,
    …
  ] );

  // 管理者に新しい投稿タイプの権限を追加
  $administrator = get_role( 'administrator' );
  foreach ( $capabilities as $capability ) {
    $administrator->add_cap( $capability );
  }

} );

カスタム投稿タイプを追加した場合、通常は「post (投稿)」や「page (固定ページ)」と同じ権限グループで操作ができます。

今回は、追加した「new_post (新しい投稿タイプ)」の編集だけができる権限グループを作るので、独自権限を作る必要があります。

独自権限を作るには、register_post_type の第二引数の「capability_type」「capabilities」「map_meta_cap」を設定します。

ちなみに、register_post_type の引数に関しては「register_post_type()」、権限一覧は「Roles and Capabilities – WordPress.org Documentation」で確認できます。

独自権限なので、権限グループの「管理者」も操作できるよう、権限を追加しておくことも忘れずに。

権限グループの追加

権限グループには、デフォルトで「管理者」「編集者」「投稿者」「寄稿者」「購読者」の5つがあります。これに、独自の権限グループ「専任者」を追加するには、次のような PHP コードを functions.php に追加します。

add_action( 'init', function () {

  // 新しい投稿タイプの複数形
  $plural_post_type = 'new_posts';

  // ロールオブジェクトを取得
  $roles = wp_roles();

  // 新しい権限グループに新しい投稿タイプの権限を追加
  $role = 'new_role';
  $roles->add_role( $role, '専任者' );
  $roles->add_cap( $role, "edit_{$plural_post_type}" );
  $roles->add_cap( $role, "edit_published_{$plural_post_type}" );
  $roles->add_cap( $role, 'upload_files' );
  $roles->add_cap( $role, 'read' );

} );

この設定により、「専任者」のユーザーは「new_post (新しい投稿タイプ)」のページ編集のみができるようになります。ページの作成・更新・削除は「管理者」が行います。

作成したページを「専任者」のユーザーが編集できるよう、ページの「投稿者」をそのユーザーに変更すれば完了です。イメージとしては、編集だけができる「寄稿者」のようになります。

まとめ

「カスタム投稿タイプの追加」と「権限グループの追加」の PHP コードをひとまとめにすると、次のようになります。

add_action( 'init', function () {

  // 新しい投稿タイプ
  $post_type = 'new_post';

  // 新しい投稿タイプの複数形
  $plural_post_type = 'new_posts';

  // 新しい投稿タイプの独自権限
  $capabilities = [
    'delete_post'            => "delete_{$post_type}",
    'edit_post'              => "edit_{$post_type}",
    'read_post'              => "read_{$post_type}",
    'delete_posts'           => "delete_{$plural_post_type}",
    'delete_others_posts'    => "delete_others_{$plural_post_type}",
    'delete_private_posts'   => "delete_private_{$plural_post_type}",
    'delete_published_posts' => "delete_published_{$plural_post_type}",
    'edit_posts'             => "edit_{$plural_post_type}",
    'edit_others_posts'      => "edit_others_{$plural_post_type}",
    'edit_private_posts'     => "edit_private_{$plural_post_type}",
    'edit_published_posts'   => "edit_published_{$plural_post_type}",
    'publish_posts'          => "publish_{$plural_post_type}",
    'read_private_posts'     => "read_private_{$plural_post_type}",
  ];

  // 新しい投稿タイプの登録
  register_post_type( $post_type, [
    ...
    'capability_type' => [ $post_type, $plural_post_type ],
    'capabilities' => $capabilities,
    'map_meta_cap' => true,
    ...
  ] );

  // 管理者に新しい投稿タイプの権限を追加
  $administrator = get_role( 'administrator' );
  foreach ( $capabilities as $capability ) {
    $administrator->add_cap( $capability );
  }

  // ロールオブジェクトを取得
  $roles = wp_roles();

  // 新しい権限グループに新しい投稿タイプの権限を追加
  $role = 'new_role';
  $roles->add_role( $role, '専任者' );
  $roles->add_cap( $role, "edit_{$plural_post_type}" );
  $roles->add_cap( $role, "edit_published_{$plural_post_type}" );
  $roles->add_cap( $role, 'upload_files' );
  $roles->add_cap( $role, 'read' );

} );

暑い。

関連記事