カテゴリーページや固定ページ等でBasic認証を利用する[WordPress]
WordPressでページ毎にBasic認証を掛ける方法を紹介します。カテゴリーページ、固定ページ、カスタム投稿タイプページ、何でも来いです。
まえがき
WordPressで生成したページの一部にBasic認証を掛けたいという願望を持ったことは無いですか?
私は例えばクライアントに制作中のページを確認してもらいたい時とかに「このページだけBasic認証かけたいな」って思います。
WordPressの「パスワード保護」機能でもいいんですが、オリジナルのテーマだと設定が面倒だったりします。
でも.htaccessでBasic認証かけると、フォルダごと掛かっちゃってWordPressで生成するページ全部がBasic認証下になったりします。
そうじゃなくて個別にbasic認証掛けたいんじゃ~って時は、phpでBasic認証をかけてあげましょう。
実際に「phpでBasic認証をかける」という記事は沢山出てきたのですが、ちゃんと実装できるまでにかなりの時間を要したので、みなさんが同じ轍を踏まぬようその辺も含めて共有します。
phpを使ってページ毎にBasic認証を掛ける
実装自体は超簡単です。順を追って説明します。
functions.phpにBasic認証を掛けるための関数を記述
phpでBasic認証を掛けるためのコードをfunctions.phpに記述します。
function basic_auth($auth_list,$realm="Restricted Area",$failed_text="認証に失敗しました"){ if (isset($_SERVER['PHP_AUTH_USER']) and isset($auth_list[$_SERVER['PHP_AUTH_USER']])){ if ($auth_list[$_SERVER['PHP_AUTH_USER']] == $_SERVER['PHP_AUTH_PW']){ return $_SERVER['PHP_AUTH_USER']; } } header('WWW-Authenticate: Basic realm="'.$realm.'"'); header('HTTP/1.0 401 Unauthorized'); header('Content-type: text/html; charset='.mb_internal_encoding()); die($failed_text); }
header.phpの一番上で条件分岐を使いBasic認証を掛けたいページで関数を呼び出す
header.phpは基本的に全ページに読み込まれていると思うので、一番上で条件分岐を利用して先ほどfunctions.phpに記述したBasic認証の関数を呼び出します。
コードちゃんと書いたのに認証が通らないという方は「何回IDとパスを入力しても認証が通らない」を読んでみてください。
//header.phpの一番上 <?php if(!is_home()): if(is_tax('kotoridialy','study')): $userArray = array("admin" => "password" ); basic_auth($userArray); endif; endif;
2行目のif文でBasic認証を掛けたいページを条件分岐してあげます。
3行目の「admin」及び「password」は、Basic認証のダイアログで入力する「ユーザー名」と「パスワード」です。適宜変更します。
また、「ユーザー名」と「パスワード」は配列になっているので自由に増やせます。
$userArray = array("admin" => "password", "yamada" => "tarou", "kotori" => "panda" );
それでは条件分岐の部分、いくつか例を見ていきましょう。
カテゴリーページにベーシック認証を掛ける場合
if(!is_home()): if(is_category('2')) : //Basic認証を掛けたいカテゴリID $userArray = array("admin" => "password" ); basic_auth($userArray); endif; endif;
固定ページにベーシック認証を掛ける場合
if(!is_home()): if(is_page('2')): //Basic認証を掛けたいページID $userArray = array("admin" => "password" ); basic_auth($userArray); endif; endif;
カスタム投稿タイプのページにベーシック認証を掛ける場合
if(!is_home()): if(get_post_type() === 'kotoridiary'): //Basic認証を掛けたい投稿タイプ名 $userArray = array("admin" => "password" ); basic_auth($userArray); endif; endif;
何回IDとパスを入力しても認証が通らない
ちゃんとコードを記述したはずなのに、何回やっても何回やってもユーザーIDとパスワードを聞かれるという場合、.htaccessに新たな記述をすることで解決します。
WordPressが吐き出す.htaccessを下記の様に編集してください。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.*) #追加 RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] #追加 RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
ハイライトになっている3,4行目を追加します。
phpがセーフモード(CGI版)で動作しているとphpでのBasic認証が行えず、Basic認証が正常に通らないみたいです。
上記を.htaccessに追記してサクッと解決しましょう。
まとめ
phpがセーフモードで動いているのが盲点で、結構ハマりました。ぶっちゃけ諦めてWordPressのパスワード保護機能で無理やり限定公開したこともあります笑
忘れないように記事として置いておきます。
参考サイト様
WordPress内の特定カテゴリにBasic認証をかける
WordPressと携帯とPHPのBasic認証(セーフモード版も)
ありがとうございます。