WordPressにベーシック認証1
簡易的な会員制サイト・ページを設定し、閲覧制限を行うために、WordPressにBasic認証を掛ける必要が出てきたので、その対応メモです。
共通のコード
以下のコードをfunctions.phpに書き込む。
function authCheck($goBack = false){ $authList = array( "/*ここにID*/" => "/*ここにPW*/", ); $realm="Restricted Area"; $failedText="認証に失敗しました"; if (isset($_SERVER['PHP_AUTH_USER']) && isset($authList[$_SERVER['PHP_AUTH_USER']])): if ($authList[$_SERVER['PHP_AUTH_USER']] == $_SERVER['PHP_AUTH_PW']): return $_SERVER['PHP_AUTH_USER']; endif; endif; if($goBack == false): header('WWW-Authenticate: Basic realm="'.$realm.'"'); header('HTTP/1.0 401 Unauthorized'); header('Content-type: text/html; charset='.mb_internal_encoding()); die($failedText); else: return false; endif; }
特定のブログ全体にBasic認証をかける
functions.phpに共通のコードを書き込んだら、テンプレートが読み込まれるより先に読み込まれるPHPファイル、functions.phpや、header.phpに、以下のコードを書き込む。
authCheck();
コード:特定のテンプレートにBasic認証をかける
特定のテンプレートにBasic認証をかけるときは、該当するテンプレートの冒頭に、
authCheck();
を書き込むだけで良い。
もし、ログインの有無で表示させる内容を変えたいだけならば、
$goBack = true; if(authCheck($goBack)): /* ここにBasic認証を通った場合に表示させる内容 */ else: /* ここにBasic認証が通らなかった場合に表示させる内容 */ endif;
のようにテンプレートに設定をすればよい。
特定の記事にBasic認証をかける
特定の記事、カテゴリーにBasic認証をかけたい場合には、header.phpなどの共通のテンプレートの冒頭に、
if( is_single( /* BASIC認証をかけたい投稿記事ID、slug、あるいは配列、あるいはObject */) || is_page( /* BASIC認証をかけたい固定ページID、slug、あるいは配列 */) || in_category( /* BASIC認証をかけたいカテゴリーID、slug、あるいはそれらの配列 */ ) ): authCheck(); endif;
の様に記述すれば良い。
Basic認証をかけたブログにあるファイルにアクセス出来ないようにする。
この設定だけでは、閲覧制限をかけたブログに掲載されている画像・ファイルについてurlを叩くことで参照可能となってしまう。
ここでは、マルチサイトを例に対応を紹介する。
マルチサイトでは、ブログにアップロードしたファイルへ「http://ブログ名/files/~~」の形でリンクが貼られる。
この形で要求されたアクセスは、「wp-includes/ms-files.php」へと受け渡され、そこで、実際に保存されているファイルパスが参照されている。
そこで、.htaccessで、BASIC認証をかけたブログのファイルにアクセスが有った場合に、auth=requiredというパラメーター(と値)をつけて、「wp-includes/ms-files.php」に渡し、BASIC認証を実行させればよい
.htaccessを開き、「#uploaded files」とコメントされている部分の直前に以下の文を挿入します。
例(member-onlyというのが、会員制ブログ名の例)
#.httaccessに追加。 #メンバ限定サイトのアップロードファイルにアクセスしようとしたら RewriteRule ^([_0-9a-zA-Z-]+/)?member-only/files/(.+) wp-includes/ms-files.php?auth=required&file=$2 [L]
wp-includes/ms-files.phpを開き、以下のように改変する
define( 'SHORTINIT', true ); require_once( dirname( dirname( __FILE__ ) ) . '/wp-load.php' ); //ここから、 if($_GET['auth'] == 'required'){ require_once( dirname( dirname( __FILE__ ) ) . '/wp-content/themes/使用しているテンプレート名/functions.php'); $authCheck = authCheck(); }else{ $authCheck = true; } //ここまでを追加 //さらに、それ以下すべてを、if($authCheck): -- endif;で挟み込む if($authCheck): if( !is_multisite() ) die( 'Multisite support not enabled' ); ms_file_constants(); error_reporting( 0 ); /************ 以下、ms-files.phpの中身 *************/ endif;