current_user_can():ログインしている人に権限があるかを調べる(WordPress)

current_user_can() は、今ログインしている人が、ある操作をしてよいか(権限があるか)を調べる関数です。管理者だけに見せる画面や、記事を書ける人だけに許す処理を作るときに使います。

書き方

current_user_can( string $capability, mixed ...$args ): bool
  • $capability:調べたい権限の名前(例:manage_options・edit_posts)
  • $args:権限によっては、どの記事かなどを渡す(例:edit_post なら記事の ID)
  • 戻り値:してよければ true、だめなら false。ログインしていなければ false

よく使う権限

権限 持っている人(はじめの設定)
manage_options(設定を変える) 管理者だけ
edit_others_posts(ほかの人の記事を直す) 管理者・編集者
publish_posts(記事を公開する) 管理者・編集者・投稿者
edit_posts(記事を書く) 管理者・編集者・投稿者・寄稿者
read(管理画面に入る) すべての役(購読者も)

使い方の例

作業環境(WordPress 7.1.3)で、役ごとのユーザーを作って試した結果を書いています(試したユーザーと記事は、あとで消しました)。

管理者だけに見せる

<?php
// 設定を変えられる人(ふつうは管理者)だけに、お知らせを出す
add_action( 'admin_notices', function () {
	if ( ! current_user_can( 'manage_options' ) ) {
		return;
	}
	echo '<div class="notice notice-info"><p>管理者だけに見えるお知らせです。</p></div>';
} );

役ごとの結果

役 結果
ログインしていない manage_options は false(is_user_logged_in() も false)
管理者 manage_options・edit_posts とも true
編集者 manage_options は false。edit_posts・edit_others_posts・publish_posts は true
投稿者 manage_options・edit_others_posts は false。edit_posts・publish_posts は true
購読者 manage_options・edit_posts・edit_others_posts・publish_posts はどれも false(read だけは true)

その記事を直してよいかを調べる

edit_post のように「どの記事か」で変わる権限は、2 つ目に記事の ID を渡します。

<?php
// $post_id の記事を、今の人が直してよいか
if ( current_user_can( 'edit_post', $post_id ) ) {
	// 直す処理
}

// 作業環境の結果
// 投稿者:自分の記事は true、管理者の記事は false
// 編集者:自分の記事も、管理者の記事も true
// ない記事の ID を渡すと false

気をつけること

  • 役の名前(administrator など)ではなく、権限の名前で調べる。current_user_can( 'administrator' ) も作業環境では true が返りましたが、WordPress の説明では、役の名前で調べるのはすすめられていません。権限の名前で調べておくと、役の設定を変えたサイトでも正しく動きます。
  • 保存や削除の処理では、current_user_can() に加えて、nonce(その画面から送られたかの確かめ)も調べます。権限だけでは、ほかのサイトからだまして送らせる攻撃を防げません。
  • 画面を見せないだけでなく、処理そのもの(保存・削除・Ajax)の中でも調べます。ボタンを隠しても、URL を直接開かれれば処理が動いてしまうためです。
  • プラグインを読み込んでいる途中では、ログインしている人を調べる仕組みがまだ動いていないことがあります。init のフック(かそれより後)の中で使います。

関係する関数

逆引きリファレンスの一覧へ

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP