【WordPress】User Access Manager プラグインで制限した記事を記事一覧から除外した時の備忘録

正直、この歳になってソースを読んでいると、いつの間にか夢の中にいる事が殆どのBoです。

まだまだ、Wordpressに関しては駆け出しのひよっこなので、やったことをすぐに忘れてしまう為、備忘録を残します。

組織内部でWordpressのアカウントを持つユーザーのみ閲覧できる記事を作り、一般のユーザーには閲覧も、その記事の存在すら知られないようにする必要が出てきた。

ここで有名なUser Access Manager(以下UAM)を導入する事にした。

制限をかける

通常のUAMの使い方通り以下の手順で記事に制限をかける。

制限グループを作成

特定の記事(この場合、記事の特定のカテゴリ)を閲覧(アクセス)できるグループをUAMで作成する。

該当ユーザーを制限グループに割り当てる

特定の記事を閲覧できるユーザーに制限グループを割り当てる。

管理者権限のユーザーは必然的にフルアクセスなので割り当てる必要なし。

制限をかけるカテゴリに制限グループを割り当てる

カテゴリに閲覧制限を割り当てることで、そのカテゴリの記事に関しては、制限グループのユーザーのみが閲覧できるようになる。

問題点

トップページやサイドバーに最新記事一覧などの表記がある場合は、制限のある記事も表示されてしまう。(この場合、閲覧権限のないユーザーがリンクを辿った場合には、該当するページの閲覧権限ない的な表記が出て記事は閲覧できない。)

出来れば、閲覧権限のないユーザーの場合は、こういった出力はしたくないので、対策してみた。

ユーザーのカテゴリに対する閲覧権限を判断する

仕様

制限カテゴリ未制限カテゴリ
アカウントのない一般閲覧者
管理者アカウント
制限グループ所属アカウント
制限グループ未所属アカウント

●:閲覧可能、-:閲覧不可

対策

function.phpに以下の関数を用意した。

   function check_display_category_current_user($cat_id=null) {
	    global $userAccessManager, $wpdb;

	    /* ログインしていない場合 */
	    if(is_null($cat_id)) {
	    	return false;
	    }

   		/* UAMプラグインが有効か判定 */
		if (!isset($userAccessManager)) {
	   		return true;
		}

   		/* 表示するカテゴリがUAMで管理されているカテゴリーなのか調べる */
		$q = "SELECT object_id FROM ". $wpdb->prefix . "uam_accessgroup_to_object AS acgto" . " WHERE acgto.object_id = " . $cat_id . " AND object_type = 'category'";
		$res = $wpdb->get_results($q);

		/* UAM管理カテゴリーの場合 */
		if(isset($res) && !empty($res)) {

			/* 現在のユーザーのID取得 */
			$userId = get_current_user_id();
	   		if(empty($userId)) {
	   			/* 原因不明の取得エラー時 */
	   			return false;
	   		}
	   		else if(current_user_can('administrator')) {
				/* 管理者権限ユーザーは無条件 true */
				return true;
	   		}
	   		else {
	   			/* 上記のユーザー以外の場合、UAMグループに属しているか調べる */
			    if (isset($userAccessManager)) {
			        $userGroupHandler = $userAccessManager->getUserGroupHandler();
			        $userGroupsForUser = $userGroupHandler->getUserGroupsForObject(
			            \UserAccessManager\Object\ObjectHandler::GENERAL_USER_OBJECT_TYPE,
			            $userId
			        );

			        if(empty($userGroupsForUser)) {
			        	/* UAM管理ユーザーじゃない場合 */
			        	return false;
			        }
			        else {
			        	/* UAM管理ユーザーの場合 */
			        	$orGrpId = array();
				        foreach($userGroupsForUser as $element) {
				        	$orGrpId[] = "group_id = " . $element->getId();
				        }
				        $orSection = " AND (" . implode(' OR ', $orGrpId) . ")";

				        $q .= $orSection;
						$res = $wpdb->get_results($q);
						if(isset($res) && !empty($res)) {
							/* UAM管理ユーザーで表示権限をもつユーザー */
							return true;
						}
						else {
							/* UAM管理ユーザーで表示権限をじゃないユーザー */
							return false;
						}
			        }

			    }
			    else {
			    	/* UAMプラグインが無効など */
			    	return true;
			    }

	   		}

		}
		else {
		/* UAM管理カテゴリーではない場合 */
			return true;
		}
   }

後は、トップページ用のテンプレートなどで、記事一覧を表示している部分で、上記関数を使い表示を制御する。














シェアしてくれると励みになります!

自作サービスやってます

【無料】宛名メーカー

せどり・メルカリ・ヤフオク・ラクマなどの商品発送の手書きでの宛名書きに疲れた。。。あなた!宛名メーカーは無料でレターパック、スマートレター、定形外郵便などの宛名を簡単に作成できます。是非ご利用下さい!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)