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() – WordPress Developer Resources
- user_can() – WordPress Developer Resources
- add_role() – WordPress Developer Resources
- wp_get_current_user() – WordPress Developer Resources
- Roles and Capabilities – WordPress Codex
まとめ
current_user_can()
を使えば、ユーザーの権限に応じた処理の切り分けが簡単に実現できます。
ユーザーごとに表示内容を変えたい、操作を制限したいというケースでは必須の関数といえるでしょう。
特に会員制サイトやカスタムダッシュボードを作る際には、この関数を積極的に使って、ユーザー体験を向上させましょう。
以下は、current_user_can()
に関する記事に補足として全て追加すべき内容をまとめたものです。すでにある記事に続けて掲載できるように構成しています。