カテゴリーページや固定ページ等で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認証(セーフモード版も)
ありがとうございます。


