【WordPress】ページや権限によってアクセス制限をかける
みなさんこんにちは、yamashitaです。
今回はWordPressでログインの有無やユーザー権限によってアクセスできるページを設定する方法を紹介します。
これにより、クローズドな情報などを掲載することができます。 パスワード保護もありますが、複数ページを同時にアクセス制限する場合などに使えます。
ログインしていない場合はどのページも見られない
// アクセスされてるURLを取得
$url = $_SERVER['REQUEST_URI'];
$parseUrlArray = parse_url($url);
// ログインページのURLを取得
$parseLoginUrlArray = parse_url(wp_login_url());
// ログインページの一致していない且つ、ログインしていない
if ((strpos($parseUrlArray['path'], $parseLoginUrlArray['path']) === false) && ! is_user_logged_in()) {
$redirectPath = wp_login_url();
wp_redirect($redirectPath);
exit();
}
ログインなしで一部のページだけアクセス可能
// アクセスされてるURLを取得
$url = $_SERVER['REQUEST_URI'];
$parseUrlArray = parse_url($url);
// ログインページのURLを取得
$parseLoginUrlArray = parse_url(wp_login_url());
// 誰でもアクセスできる
$allowUrlList = [
"/daredemo-1/",
"/daredemo-2/",
"/daredemo-3/",
"/daredemo-4/",
];
$isAllowUrl = false;
foreach ($allowUrlList as $allowSlug) {
if ($parseUrlArray['path'] === $allowSlug) {
$isAllowUrl = true;
break;
}
}
// 許可URLならログインチェックしない
if (!$isAllowUrl) {
// ログインページの一致していない且つ、ログインしていない
if ((strpos($parseUrlArray['path'], $parseLoginUrlArray['path']) === false) && ! is_user_logged_in()) {
$redirectPath = wp_login_url();
wp_redirect($redirectPath);
exit();
}
}
補足
$_SERVER['REQUEST_URI']
を使うほかにglobal $post
でアクセスされたページを取得してget_page_by_path()
などで許可するページを取得、双方を比較して判定する方法もあります。
管理画面を特定の権限ユーザー以外見せたくない場合
あまり使う機会は無いかもしれませんが、今回の処理でユーザー登録だけ必要とする場合など
function redirect_front_page()
{
// 管理者と編集者以外はトップにリダイレクト
if ( ! (current_user_can('administrator') || current_user_can('editor'))) {
$redirectPath = "/";
wp_safe_redirect($redirectPath);
exit();
}
}
add_action('admin_init', 'redirect_front_page');