WordPressで特定ページ・投稿だけにベーシック認証を設定する方法|functions.phpで実装
サイト全体ではなく、社内マニュアルやクライアント専用ページなど、特定のページや投稿だけを関係者向けに公開したい場合があります。
通常、ベーシック認証は .htaccess で設定しますが、この方法ではサイト全体やディレクトリ単位でしかアクセス制限できません。
今回は functions.php を利用して、WordPress の条件分岐タグを使い、特定の固定ページや投稿、カテゴリ、タグなどにベーシック認証を設定する方法を紹介します。
functions.php にベーシック認証を追加する
以下のコードを functions.php に追加します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
add_action('template_redirect', function () { if ( is_page('about') || is_single() || is_tag() ) { // 認証情報(ユーザー名とパスワード) $username = 'ユーザー名'; $password = 'パスワード'; // 認証に失敗した場合 if ( !isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_USER'] !== $username || $_SERVER['PHP_AUTH_PW'] !== $password ) { // ベーシック認証ダイアログを表示 header('WWW-Authenticate: Basic realm="Restricted Area"'); header('HTTP/1.0 401 Unauthorized'); exit('認証が必要です。'); // キャンセル時に表示されるメッセージ } } }); |
このコードでは template_redirect を利用し、ページを表示する直前に認証を行っています。
条件に一致した場合のみ、ブラウザへベーシック認証を要求します。
$user = 'ベーシック認証用 ユーザー名';
$pass = 'ベーシック認証用 パスワード';
こちらを書き換えることで任意の認証情報を設定できます。
認証対象を変更する方法
認証対象は WordPress の条件分岐タグを利用して自由に変更できます。
特定の固定ページだけ
is_page('about')
スラッグが about の固定ページのみ認証対象になります。
投稿だけ
is_single()
すべての投稿ページを対象にします。
特定カテゴリのみ対象にしたい場合は、
is_single() && in_category('news')
のように指定できます。
タグページだけ
is_tag()
タグアーカイブページのみ認証対象になります。
応用:親カテゴリと子カテゴリすべてを対象にする
例えば、
スタッフ専用(カテゴリスラッグ:staffonly)
├ マニュアル
├ 営業資料
└ 社内連絡
のように、親カテゴリだけでなく、その子カテゴリ・孫カテゴリもまとめて認証対象にしたい場合があります。
以下のコードでは、親カテゴリのカテゴリスラッグに staffonly を使用しています。
実際に利用する際は、ご自身のカテゴリスラッグへ置き換えてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
add_action('template_redirect', function () { $is_staff_category = false; if (is_category()) { $cat = get_queried_object(); if ($cat) { // 親カテゴリ(カテゴリスラッグ:staffonly)を取得 $staff = get_category_by_slug('staffonly'); if ($staff) { if ( $cat->term_id == $staff->term_id || cat_is_ancestor_of($staff->term_id, $cat->term_id) ) { $is_staff_category = true; } } } } if ( is_page('about') || // staffonly カテゴリ(子カテゴリを含む)の記事を対象にする ( is_single() && in_category( array( 'staffonly' ) ) ) || is_tag() || $is_staff_category ) { // 認証情報(ユーザー名とパスワード) $username = 'ユーザー名'; $password = 'パスワード'; // 認証に失敗した場合 if ( !isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_USER'] !== $username || $_SERVER['PHP_AUTH_PW'] !== $password ) { // ベーシック認証ダイアログを表示 header('WWW-Authenticate: Basic realm="Restricted Area"'); header('HTTP/1.0 401 Unauthorized'); exit('Authorization Required'); } } }); |
cat_is_ancestor_of() を利用することで、親カテゴリ・子カテゴリ・孫カテゴリまでまとめて判定できます。
また、
in_category( array( 'staffonly' ) )
としているため、staffonly カテゴリ(子カテゴリを含む)に属する記事が認証対象になります。
注意点
この方法を利用する際は、以下の点に注意してください。
HTTPS環境で利用する
ベーシック認証はユーザー名・パスワードを送信するため、SSL(HTTPS)環境で利用することをおすすめします。
ソースコードへ認証情報を書くことになる
認証情報は functions.php に直接記述します。
認証情報をソースコードへ直接書きたくない場合は、設定ファイルなどに保存して読み込む方法も検討しましょう。
WordPress表示時のみ有効
この方法は WordPress の処理が実行されたあとに認証します。
そのため、画像・PDF・ZIP などのファイルを直接URLで開いた場合は認証されません。
ディレクトリ全体を保護したい場合は、.htaccess のベーシック認証を利用してください。
まとめ
functions.php を利用すれば、WordPressの条件分岐タグを使って柔軟にベーシック認証を設定できます。
特に、
- 固定ページだけアクセスを制限したい
- 特定カテゴリの記事だけ社内向けにしたい
- スタッフマニュアルを保護したい
- 制作中ページをクライアントだけに見せたい
といったケースでは便利な方法です。
ディレクトリ単位で保護する .htaccess と使い分けることで、用途に応じたアクセス制御を実現できます。