BLOG

WordPressで固定ページやカテゴリページなど個別にBasic認証をかけるには

| WordPress

この間、自転車で移動している最中、びっくりしたんですが、信号機が薄っぺらいんですよ。
仮のものかと思うぐらいです。いやぁ、電車で移動ばっかりだったので、こういうことも気が付かなかったのですね。
これからは、こういうことも気がつく人間になりたいですね。

さて、本編ですが、仕事でWordPressの案件をしていると、公開している本番サーバでテストアップをすることもたまにあります。普段なら、テスト環境を作成し、そこ全体にBasic認証をかけるのですが、いかんせん、WordPressの場合こちらでTemplateやカスタム投稿タイプの設定をし、入力はクライアントが行うので、本番に反映してくださいと依頼がある。
リンクを貼らずにいれば基本的にはページを見られることは無いのだろうけども、Googleさんはどこまで見つけるのかというところで、万全を期すために、テストアップしているページはBasic認証をかけます。
ここで困るのは.htaccessに制限がかかっている、もしくは、全く使えない場合です。
この場合は、個別にアクセス制限をかけることができないことがあります。

そんな時に役に立つのが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認証をかけたいテンプレートへの分岐をつかって下記を追加する

if(!is_home() && is_tax('test')):
  $userArray = array(
    "id" => "password"
  );
  basic_auth($userArray); 
endif;

複数のIDとパスワードを設定する場合は$userArrayを配列にしているのでそれを増やすだけ。

if(!is_home() && is_tax('test')):
  $userArray = array(
    "id" => "password",
    "hoge" => "page" 
  );
  basic_auth($userArray); 
endif;

うん、これだけで認証をかけれる、個別でかける場合は、この方法が一番楽なきがす。
公開中のサーバの.htaccessをいじるのは本当に怖いです。