【WordPress】ログイン状態や権限で条件分岐して表示を切替え

WordPressの使い方

WordPressのページでユーザーのログイン状態や権限で条件分岐してコンテンツの表示内容の切替えを行う

この記事では「WordPressのページ内でログイン状態やユーザー権限による条件分岐でページのコンテンツの表示内容を切り替える方法」を紹介していきます。

この記事を読むとこんなことが出来るようになります!

  • ログインしている社員だけが見れるメッセージを記事に書いておきたい
  • ログインしている時/ログインしていない時で表示を出し分けしたい
  • 管理者がログインした時だけメッセージなどを出したい
  • 「記事の公開権限」など特定の権限もっているユーザーにだけコンテンツを表示したい

ショートコードでプログラムの知識いらず。初心者でも簡単!記事に貼り付けるだけ!

しかも、ショートコードで実装するので、このような機能がプログラムの知識なしで、コピペで実装できます。

しかも貼り付ける場所はいつもの投稿ページなどの記事編集画面です。

また、最後に権限に関してとっても便利な情報も紹介しますのでぜひ最後までお付き合いください。

ユーザーのログイン状態や権限で条件分岐するショートコードの実装方法

実装するにはまずショートコードを作成して登録します。

ショートコードを実装するには以下のソースをfunctions.phpの囲みタグの中にに貼り付けます。


	/* =============================================================
	 * 現在のユーザーの権限をチェックして表示
	 * ============================================================= */
	function if_auth($atts, $content){

		/*******************************************************************************
		■入力パラメータ$attsの内容
			is_login => 1=ログインしている場合 0=ログインしてない場合
			roles => 権限グループ(ロール)名を指定(複数の時はand orでつなぐ)【例】administrator or contributor or subscriber
			capabilities => 権限名を指定(複数の時はand orでつなぐ) 【例】edit_others_posts and edit_private_posts

		■$content
			条件にマッチした時だけショートコードの囲みの中が表示される。

		********************************************************************************/
		
		/***********************************************
		 * 初期化
		************************************************/
		
		//パラメータ初期化
		extract(shortcode_atts(array(
			'is_login' => 1,
			'roles' => null,
			'capabilities' => null,
		), $atts));

		$content = do_shortcode($content); //ショートコードの中のショートコードを展開

		/***********************************************
		 * 入力パラメータチェック
		************************************************/
		$result = null;
		$debug = "■";
				
		//余計な文字列除去
		$roles = trim(mb_strtolower($roles));
		$roles = preg_replace('/\s+/', ' ', $roles);
		$capabilities = trim(mb_strtolower($capabilities));		
		$capabilities = preg_replace('/\s+/', ' ', $capabilities);
		
		$debug .= "→指定roles={$roles}<br/>";
		$debug .= "→指定capabilities={$capabilities}<br/>";		
		
		/***********************************************
		 * ログインチェック
		************************************************/
		
		$debug .= "→ログインチェック<br/>";
		
		$login_status = is_user_logged_in();
		
		//$result = $debug;
		if($is_login == 0 && $login_status === false){ //「ログインしてない場合」が指定されててログインしてない
			return "{$result}{$content}";

		}else if($is_login > 0 && $login_status === true){ //「ログインしている場合」が指定されててログインしている
			//続行
			
		}else{
			return null;			
		}
		
		/***********************************************
		 * パラメータからの権限グループ(ロール)の分割処理
		************************************************/
	
		$OPERATOR_AND = " and ";
		$OPERATOR_OR = " or ";
		
		$in_roles = array();
		$role_oparator = null;
		if(strlen($roles) > 0){ //ロール(権限グループ)が指定されている
			
			$debug .= "→演算子チェック<br/>";
			if(strpos($roles, $OPERATOR_AND) !== false && strpos($roles, $OPERATOR_OR) !== false){ //演算子&|両方使っている
				//$result = $debug;
				return "{$result}";
			}else if(strpos($roles, $OPERATOR_AND) !== false){ //ANDを使用
				$role_oparator = $OPERATOR_AND;
			}else if(strpos($roles, $OPERATOR_OR) !== false){ //ORを使用
				$role_oparator = $OPERATOR_OR;			
			}
			
			$debug .= "→演算子=$role_oparator <br/>";			
			$debug .= "→roles分割<br/>";

			//ロール(権限グループ)文字列を配列にする
			if($role_oparator == null){
				$in_roles = array($roles);
			}else{
				$in_roles = explode($role_oparator, $roles);				
			}
			$in_roles = array_filter($in_roles); //空の配列削除
		}
		
		$debug .= "in=>" . var_export($in_roles, true) . "<br/>";
		$debug .= "→演算子チェック<br/>";
		
		/***********************************************
		 * パラメータからの権限の分割処理
		************************************************/
		
		$in_capabilities = array();
		$capability_oparator = null;
		if(strlen($capabilities) > 0){ //権限が指定されている
			if(strpos($capabilities, $OPERATOR_AND) !== false && strpos($capabilities, $OPERATOR_OR) !== false){ //演算子&|両方使っている
				//$result = $debug;
				return "{$result}";
			}else if(strpos($capabilities, $OPERATOR_AND) !== false){ //ANDを使用
				$capability_oparator = $OPERATOR_AND;
			}else if(strpos($capabilities, $OPERATOR_OR) !== false){ //ORを使用
				$capability_oparator = $OPERATOR_OR;			
			}
		
			$debug .= "→演算子=$role_oparator <br/>";
			$debug .= "→capabilities分割<br/>";

			//権限文字列を配列にする
			if($capability_oparator == null){
				$in_capabilities = array($capabilities);
			}else{
				$in_capabilities = explode($capability_oparator, $capabilities);
			}
			$in_capabilities = array_filter($in_capabilities); //空の配列削除
			
		}
	
		$debug .= "in=>" . var_export($in_capabilities, true) . "<br/>";
		
		$user_role_names = wp_get_current_user()->roles;	
		$role_name = "";
		if(count($user_role_names) == 1){ //権限グループが1つなら設定する
			$role_name = $user_role_names[0];
		}
		
 		$content = str_replace("{#role_name}", $role_name, $content);

		//ログインしている場合の追加条件なしならここで終了
		if(count($in_roles) == 0 &&count($in_capabilities) == 0){
			//$result = $debug;
			return "{$result}{$content}";
		}
		
		/***********************************************
		 * 現在のユーザーの権限取得
		************************************************/

		$debug .= "→ユーザー権限のチェック<br/>";
		
		$out_roles = array();
		$out_capabilities = array();
		
		//ユーザーに割り当てられているロール(グループ権限)をループ
		foreach($user_role_names as $user_role_name){
			$debug .= "" . $user_role_name . "<br/>";	
			$user_role = get_role($user_role_name);
			
			//存在するなら保存
			if(array_search($user_role_name, $in_roles) !== false){
				$out_roles[] = $user_role_name;
			}
			
			//$debug .= var_export($user_role->capabilities, true);

			//グループ権限(ロール)に割り当てられている権限をループ
			foreach($user_role->capabilities as $capability_name => $is_enabled){
				
				if(array_search($capability_name, $in_capabilities) !== false){
					//有効になっていれば保存
					if($is_enabled > 0){
						$out_capabilities[] = $capability_name;
					}
					
				}
				
			}
		}
		
		$debug .= "→取得したユーザー権限<br/>";
		$debug .= "out=>" . var_export($out_roles, true) . "<br/>";
		$debug .= "out=>" . var_export($out_capabilities, true) . "<br/>";
			
		/***********************************************
		 * 権限グループ(ロール)の条件判定
		************************************************/
		
		$debug .= "→ロール判定処理<br/>";

		//判定処理
		$valid_role = false;
		if(count($in_roles) > 0){
			if($role_oparator == null || $role_oparator == $OPERATOR_AND){ //AND判定なら
				if(count($in_roles) == count($out_roles)){ //全て一致したらOK
					$debug .= "→AND判定<br/>";
					$valid_role = true;
				}		
			}else if($role_oparator == $OPERATOR_OR){ //OR判定なら
				$debug .= "→OR判定<br/>";
				if(count($out_roles) > 0){ //1つでも一致したらOK
					$valid_role = true;
				}				
			}
		}else{
			$valid_role = true;
		}
		
		
		/***********************************************
		 * 権限の条件判定
		************************************************/
		
		$debug .= "→権限判定処理<br/>";
		
		//判定処理
		$valid_capability = false;
		if(count($in_capabilities) > 0){
			if($capability_oparator == null || $capability_oparator == $OPERATOR_AND){ //AND判定なら
				$debug .= "→AND判定<br/>";
				if(count($in_capabilities) == count($out_capabilities)){ //全て一致したらOK
					$debug .= "→OK<br/>";
					$valid_capability = true;
				}		
			}else if($capability_oparator == $OPERATOR_OR){ //OR判定なら
				$debug .= "→OR判定<br/>";
				if(count($out_capabilities) > 0){ //1つでも一致したらOK
					$debug .= "→OK<br/>";
					$valid_capability = true;
				}				
			}
		}else{
			$valid_capability = true;
		}

		
		/***********************************************
		 * 最終判定
		************************************************/
		
		$debug .= "→結果出力<br/>";		
		//$result = $debug;

		//グループ権限(ロール)と権限両方が有効なら結果出力
		if($valid_role && $valid_capability){
			return "{$result}{$content}";
			
		}else{
			return "{$result}";
			
		}

		return $result;

	}

	add_shortcode('if_auth', 'if_auth'); //ショートコード登録

これでif_authというショートコードが登録されました。

ショートコードについてわからないという方はこちらもぜひ参考にしてみてください。

なお、functions.phpの使い方については以下を参照してください。

functions.phpの場所、編集方法

functions.phpはWordPressの機能追加をするためのPHPファイルです。

functions.phpの場所は
「外観>テーマエディター」から

試用しているテーマ名を選んで、funcstions.phpを選びます。

また、直接functions.phpを編集するよりもこちらのプラグインで編集した方が便利なので参考にしてみてください。

使い方① ログインしている時/ログインしていない時で表示を変える

ではさっそくショートコードを使ってみましょう!

ログイン/非ログインでコンテンツの表示内容を出し分けるショートコードのサンプル

投稿編集画面より以下のショートコードを入力してください。

ブロックエディタでショートコードブロックではなくカスタムhtmlブロックに入力することをお勧めします。

※ショートコードブロックはレイアウトが崩れやすいです。

[if_auth is_login=1]
	<div style="border: 1px solid #000; background-color: #fcc; padding: 1rem;">
		①ログインしています({#role_name})
	</div>
[/if_auth]
[if_auth is_login=0]
	<div style="border: 1px solid #000; background-color: #fcc; padding: 1rem;">
		②ログインしていません
	</div>
[/if_auth]

ログイン/非ログイン切り替えショートコードの実行結果

これらを画面上で見てみるとログインしているときはこのように表示されます。

またログインしていないときはこのように表示されます。

このショートコードは囲み型なのでタグのように[if_auth]●●●●[/if_auth]と記述します。
タグの属性のように条件を指定して、マッチすれば囲みの中の●●●●が表示されます。

login=1はログインしている時という条件です。
パラメータ属性の詳細はソースコードのコメントを参照してください。

使い方② 管理者、編集者、投稿者などの権限別に表示を切り替える

WordPressにはデフォルトで5つの「権限グループ」というものがあります。
聞いたことくらいはあるかもしれませんが、「管理者」「編集者」「投稿者」「寄稿者」「購読者」と呼ばれるものです。

ユーザーを作成するときは基本そのどれかの権限グループから1つ選ぶのですが、その権限グループを判定して表示を出し分けることができます。

権限グループ別に表示を切り替えるショートコードのサンプル

以下は管理者のときだけ表示させている例です。

[if_auth roles="administrator"]
	<div style="border: 1px solid #000; background-color: #fcc; padding: 1rem;">
		③管理者権限のときだけ表示({#role_name})
	</div>
[/if_auth]

権限グループ別に表示を切り替えるショートコードの実行結果

管理者(administrator)でログインしている状態だと次のようにページに表示されます。

rolesというパラメータに権限グループのスラッグ名を指定します。

スラッグ名 日本語名
administrator 管理者
editor 編集者
author 投稿者
contributor 寄稿者
subscriber 購読者

権限グループが持つ権限などについては以下の記事で詳しく解説しています。

使い方③ 特定の詳細な「権限」を持っているユーザーだけにメッセージを切り替え表示する

権限グループに割り当てられる個別の「権限」をパラメータ指定して条件にすることができます。

特定の権限を持つユーザーだけに表示するショートコードサンプル

[if_auth capabilities="edit_posts"]
	<div style="border: 1px solid #000; background-color: #fcc; padding: 1rem;">
    ④投稿編集権限をもっている
	</div>
[/if_auth]

特定の権限を持つユーザーだけに表示するショートコード実行結果

投稿の編集権限「edit_posts」を持っているユーザーでログインしてページを表示すると以下のように表示されます。

またこちらでは、さらに細かく「権限グループ」が持つ個別の「権限」についても解説しています。

使い方④ 「権限グループ」や「権限」による条件を複雑に組み合わせて条件分岐させる

さらに「権限グループ」や「権限」を使って複雑な条件指定をしてみます。

権限グループ」や「権限」で複数条件をつかったショートコードサンプル

「権限グループ」と「権限」を両方指定することや、それぞれand条件、or条件で複数をつなぐこともできます。

[if_auth roles="administrator or contributor or subscriber" capabilities="edit_posts and edit_others_posts"]
	<div style="border: 1px solid #000; background-color: #fcc; padding: 1rem;">
    ⑥管理者 or 寄稿者 or 購入者<br>
	and<br>
    投稿編集権限 and 他人の投稿編集権限をもっている
	</div>
[/if_auth]

権限グループ」や「権限」で複数条件をつかったショートコード実行結果

メッセージに表示されている通りの条件にマッチすれば以下のように表示されます。

※roles, capabilitiesはそれぞれでand、orのどちらかしか使えません
 例)
 roles="●and ● and ●"  →〇 andのみ
 roles="●or ● or ●"   →〇 orのみ
 roles="●and ● or ●"   →× and, or どちらかしかダメ

※roles, capabilitiesを両方していするとand条件の関係
 例)
 roles="■■■" capabilities="▲▲▲"   → ■■■ and ▲▲▲になる

最後に

最後までお読みいただきありがとうございました!

権限についてより理解したい、使いこなしたい場合は以下も参考にしてみてください。

WordPressのユーザー権限関連の記事

WordPressのユーザーに割り当てられる「権限」に関して、概念がかなり難解なので、理解するのに少々時間がかかります。

ユーザー権限、権限グループ、権限、ロール・・・とどれがどういった意味でどう関係してくるのかを理解しないとWordPressの権限は扱えません。

以下の記事を参照いただけると全貌が理解できると思いますので権限に関する記事を紹介しておきます。

まずはWordPressの権限の全体像。

権限グループの種類と追加方法

権限全一覧の表まとめ

権限を使ったコンテンツの表示切替

コメント

タイトルとURLをコピーしました