Category : WordPress
以前の案件で、「Wordpressで作ったコーポレートサイトの「会員ページ」のみIDとパスワードを付けたい」というお話をいただきました。
CMSを使わないサイトやWordpress全体にBasic認証をかけるのは簡単なので、これも簡単な案件と思っていましたが、とても苦労したので私同様、苦労する人が出ないよう今回はそのやり方をご紹介します。
私は先の案件ではロリポップサーバーを使用したので、今回もロリポップサーバー使いご紹介します。
WordPressには「パスワード保護」機能や、Wordpress全体にBasic認証をかけるプラグイン「WP Basic Auth」などがありますが、前者は投稿にしか使用できませんし、後者はサイト全体にしかかけられません。
レンタルサーバーの機能で、特定ディレクトリにBasic認証をかける機能がよくありますが、Wordpressで生成する特定ディレクトリには使用できません。
これからご紹介する方法はCGI版のPHPでは使えません。
もしモジュール版に出来ない事情がある方はCGI版で動作させる方法を紹介しているウェブサイトもいくつかあるようなのでそちらを参考にしてみてください。(ちなみに私のケースではCGI版のPHPではどうしても動作しませんでした。なので当ブログでのそれらの記事のご紹介は控えさせていただきます)

モジュール版への変更は簡単です。ロリポップサーバー管理画面のPHP設定からモジュール版を選んでください。
但し、ロリポップや、さくらインターネット等のレンタルサーバーではモジュール版を使うにはいくつか条件がありますのでご注意を。
(低額プランだとモジュール版をサポートしていない等)
Basic認証をかけるための関数をfunctions.phpに記述します。
function basic_auth($auth_list,$realm="Restricted Area",$failed_text="IDまたはパスワードが違います"){
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
if(!is_home()):
if(is_page(array(10))): //Basic認証を行うページID
$userArray = array( "username1" => "password1" );
basic_auth($userArray);
endif;
endif;
?>
固定ページのIDはWordpress固定ページ編集画面のURLにある数字です。

以下のように配列を使えばBasic認証を行いたい固定ページを複数指定することが可能です。
また、IDとパスワードも複数設定することが可能です。
<?php
if(!is_home()):
if(is_page(array(10 , 99))): //Basic認証を行うページID
$userArray = array( "username1" => "password1" , "username2" => "password2" , "username3" => "password3" );
basic_auth($userArray);
endif;
endif;
?>