1. WordPress

【WordPress】current_user_can() でユーザー権限をチェックして処理を分ける方法

Share

WordPressで管理者と一般ユーザーで異なる処理をしたい場面はよくあります。

たとえば、「このメニューは管理者だけに表示したい」「この投稿は編集者以上しか操作できないようにしたい」といったケースです。

そんなときに役立つのが current_user_can() という関数です。この記事では、この関数の基本的な使い方から実践例までをわかりやすく解説します。

current_user_can() とは?

current_user_can() は、現在ログイン中のユーザーが特定の権限を持っているかをチェックする関数です。

戻り値は true または false で、条件分岐に使うことができます。

基本構文

if ( current_user_can( 'edit_posts' ) ) {
  // 投稿を編集できるユーザー向けの処理
}

たとえばこのコードでは、「投稿の編集権限」を持っているユーザーだけが中の処理を実行できます。

よく使われる権限

権限名対応する権限グループ
manage_options管理者(Administrator)
edit_posts投稿者(Author 以上)
publish_posts投稿を公開できるユーザー
edit_others_posts他人の投稿も編集できるユーザー
delete_posts投稿を削除できるユーザー
readログイン済みユーザー

権限グループによって利用できるケイパビリティが異なります。カスタムロールを使っている場合は独自の権限も利用可能です。

実装例

管理者だけに表示する例

if ( current_user_can( 'manage_options' ) ) {
  echo '<a href="/admin-only">管理者向けリンク</a>';
}

このようにすると、管理者だけに特定のリンクを表示することができます。

ユーザー権限に応じてメニューを出し分ける例

<ul>
  <li><a href="/">トップページ</a></li>
  <?php if ( current_user_can( 'edit_posts' ) ) : ?>
    <li><a href="/dashboard">ダッシュボード</a></li>
  <?php endif; ?>
</ul>

複数の条件をチェックしたい場合

条件を ||(または)や &&(かつ)で組み合わせることもできます。

if ( current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_others_posts' ) ) {
  echo '自分の投稿だけ編集できるユーザー';
}

ログインしていない場合は常に false

current_user_can() は未ログインユーザー(ゲスト)に対しては常に false を返します。

ログインチェックと組み合わせるとより安全です。

if ( is_user_logged_in() && current_user_can( 'edit_posts' ) ) {
  // ログイン中かつ投稿編集可能
}

管理画面やテンプレート以外で使う際の注意点

current_user_can() を実行する前に、WordPressがユーザー情報を正しく取得している必要があります。

テンプレート内では問題ありませんが、フックのタイミングが早すぎると期待通りに動作しないことがあります。

例:init フック以降で使用するのが安全です。

add_action( 'init', function() {
  if ( current_user_can( 'manage_options' ) ) {
    // ここで管理者チェックが可能
  }
} );

WordPressのユーザー権限(ロール)とケイパビリティの基本

WordPressの権限管理は「ロール(役割)」と「ケイパビリティ(能力)」という2つの概念で構成されています。

代表的なロールと主な権限

ロール説明主なケイパビリティ
管理者
(administrator)
サイトのすべてを管理できるmanage_options, edit_users, delete_posts など
編集者
(editor)
他人の投稿を含むコンテンツを管理edit_others_posts, publish_posts, delete_others_posts
投稿者
(author)
自分の投稿を公開・編集できるedit_posts, publish_posts, delete_posts
寄稿者
(contributor)
投稿はできるが公開は不可edit_posts
購読者
(subscriber)
プロフィール編集のみ可能read

current_user_can() ではこれらのケイパビリティを指定することで、ユーザー権限に基づいた処理制御ができます。

カスタムロールとケイパビリティの追加方法

独自のユーザーロールを作成し、それにケイパビリティを付与することで、より柔軟な権限管理が可能になります。

カスタムロールの追加

add_role(
  'custom_member',
  'カスタムメンバー',
  array(
    'read' => true,
    'custom_capability' => true,
  )
);

このカスタムロールには custom_capability という独自の権限が設定されており、次のようにチェックできます。

if ( current_user_can( 'custom_capability' ) ) {
  echo 'あなたはカスタム権限を持っています。';
}

このようにすれば、特定の権限を持つユーザーのみに処理を限定することができます。

user_can() との違い

current_user_can() は「現在ログインしているユーザー」に限定されますが、user_can() を使えば任意のユーザーIDや WP_User オブジェクトを指定してチェックできます。

user_can() の例

$user_id = 3;
if ( user_can( $user_id, 'edit_posts' ) ) {
  echo 'ユーザーID 3 は投稿を編集できます。';
}

複数のユーザーを操作したい場合や管理者画面で他ユーザーの権限をチェックする場合は user_can() の方が適しています。

フロントエンドでの応用例

投稿詳細ページで「編集ボタン」を出す

if ( current_user_can( 'edit_post', get_the_ID() ) ) {
  echo '<a href="' . get_edit_post_link() . '">この投稿を編集</a>';
}

コメント欄上にラベルを表示

if ( current_user_can( 'moderate_comments' ) ) {
  echo '<p><strong>※あなたはコメントを管理できます。</strong></p>';
}

ショートコードで条件付き出力

function show_for_editors() {
  if ( current_user_can( 'edit_others_posts' ) ) {
    return '<p>編集者向けのお知らせです。</p>';
  }
  return '';
}
add_shortcode( 'editors_only', 'show_for_editors' );

投稿内で [editors_only] を使うと、編集者以上のユーザーにだけ表示されます。

デバッグ・確認方法

現在のユーザー情報とその権限を確認したいときは、wp_get_current_user() を使って情報を取得できます。

$current_user = wp_get_current_user();

echo 'ユーザー名: ' . esc_html( $current_user->user_login ) . '<br>';
echo current_user_can( 'edit_posts' ) ? '編集権限あり' : '編集権限なし';

ログイン中のユーザーがどのようなケイパビリティを持っているかを調べたいときにも便利です。

参考リンク

まとめ

current_user_can() を使えば、ユーザーの権限に応じた処理の切り分けが簡単に実現できます。
ユーザーごとに表示内容を変えたい、操作を制限したいというケースでは必須の関数といえるでしょう。

特に会員制サイトやカスタムダッシュボードを作る際には、この関数を積極的に使って、ユーザー体験を向上させましょう。

以下は、current_user_can() に関する記事に補足として全て追加すべき内容をまとめたものです。すでにある記事に続けて掲載できるように構成しています。