WordPressで会員サイトなどを構築した場合、特定のページのみ会員のみ閲覧可能にしたい時がある。
標準機能でページや投稿にパスワードを設定する事が出来るの(下画像でパスワード保護を選択)ですが、一つ問題が・・・・

WordPressで固定ページにパスワードをかける

問題点:テンプレートを利用しているとパスワード保護が効かない?

固定ページ内のテキストエリアにHTMLを記述してページを作成している時には、パスワード保護がちゃんと効くのですが、テンプレートを利用し、phpを記述して固定ページを作成した場合、パスワード画面が表示されてもテンプレートに記述されている部分も丸見え状態になっているのです。
おそらく、the_content();がパスワード入力画面を表示する仕組みになっている様です。
でも、普通に考えたら、当たり前な気がする。

そこで、ページ全体にベーシック認証をかけてしまえ!!ってのが今回の理由。
簡単に言うと、phpでページを判断して、ベーシック認証のダイアログを出力する。

ベーシック認証のダイアログ例

概要

  • function.phpにベーシック認証のロジックを記述
  • header.phpにベーシック認証を起動するロジックを記述

function.phpにベーシック認証のロジックを記述

[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);
}
[/php]

header.phpにベーシック認証を起動するロジックを記述

[php]
< ?php if(!is_home()): $pageArray = array(22); if(is_page($pageArray)) : $userArray = array("ベーシック認証用のID" => “ベーシック認証用のパスワード”);
basic_auth($userArray);
endif;
endif;
?>
[/php]

【補足】
[php]
$pageArray = array(22);
if(is_page($pageArray)) :
[/php]
22:ページ番号
複数ページ指定の場合は「,」で連結。array(22,23,24)

[php]
$catArary = array(1,2,3);
if(is_category($catArray) || in_category($catArray)) :
[/php]
投稿のカテゴリでベーシック認証をかける場合は上記プログラムへ変更

今後の課題。
ユーザIDとパスワードを動的に設定出来れば良いね。

参考サイト
WordPress内の特定カテゴリにBasic認証をかける ありがとうございました。