正直、この歳になってソースを読んでいると、いつの間にか夢の中にいる事が殆どの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;
}
}
後は、トップページ用のテンプレートなどで、記事一覧を表示している部分で、上記関数を使い表示を制御する。
コメントを残す