【WP】特定のページにだけベーシック認証をかける2つの方法

IDとパスを設定して、サイトの閲覧を制限するBasic認証。
そのベーシック認証を固定ページやカスタム投稿タイプなど、ワードプレスで作成したサイトの特定のページにだけ設定する方法です。
方法❶ functions.phpにベーシック認証を掛ける関数を記述
自分自身、一つ目の方法は上手くいかず、二つ目の方法で適用できた場合があったので、2つの方法を紹介します。
まず一つ目。
手順は簡単です。
『認証に失敗しました』というテキストは任意で変えられます。
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に条件分岐でベーシック認証をかけたいページを指定し、先ほどの関数を実行します。ここではカスタム投稿タイプの『works』にかけてます。
『admin』『password』にベーシック認証のIDとpasswordを入力して完了です。
passwordは『.htaccess による認証用 パスワード暗号化ツール』などで暗号化してください。
ちなみにこのツールの下にベーシック認証の詳しい説明も載ってます。
<!--?php if(get_post_type() === 'works'): $userArray = array("admin" =--> "password"); basic_auth($userArray); endif; ?>
認証に失敗する場合
何度も認証に失敗する際は、サーバーのphpがセーフモード(CGI版)であることが原因としてあるようです。
解消させるには、ドメイン直下の『.htaccess』に『追記』とある2行を記述します。
# 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
それでも上手くいかない場合は
『簡単』と言いつつ、なぜか上手くいかず、解決できないケースがありました。
なので、もし解決できなかったら次の方法も試してみてください。
一つ目の方が基本的に簡単で、条件分岐で柔軟にページを指定できるのでベターだとは思います。
方法❷ スラッグと同名のフォルダを作り、そこにベーシック認証に必要なファイルをアップ
こちらもカスタム投稿タイプ『works』を例に手順を説明します。
URLで言うと『http://◯◯◯.com/works/』ページに認証を設けます。
ここでは『works』フォルダを作ります。
コピーしたindex.phpをエディタで開き、下部に記述されてるパス『 ‘/wp-blog-header.php’』を『 ‘/../wp-blog-header.php’』に修正。
require( dirname( __FILE__ ) . '/../wp-blog-header.php' );
あとは通常どおり『.htaccess』にベーシック認証の記述を追加します。
AuthType Basic AuthName "Input your ID and Password." AuthUserFile /home/ドメイン名/フォルダ名/.htpasswd require valid-user
これも通常のベーシック認証と同じく『.htpasswd』を作成し、IDと暗号化したpasswordを記述します。
ID:aoviahoidfnva(暗号化したpassword)
用意した3つのファイルを、①で作った『works』フォルダにアップします。
これでhttp://◯◯◯.com/works/ページにベーシック認証をかけられました。
さいごに
まだ把握しきれてないところもあるのですが、取り急ぎメモをかねてまとめました。
❷ではカスタム投稿タイプ以外の場合のフォルダ名をどうなるんだろう?
とか疑問が残ってます。
あと、❶で『cgi版PHPを使用している場合、basic認証が使えないから、.htaccessに2行追記する』
という注意があったんですが、❷の方だと特に追記しなくても普通にベーシック認証がかかったのもよくわからないまま…。
(レンタルサーバーの管理画面でphpがcgi版だと確認)
そしてそもそもなぜ❶でベーシック認証が設置できたのに、パスできなかったのか…。
色々謎を残しつつ、とりあえずテスト用にかけたいだけなので深追いせず、何か補足できることがあったらまた書きます。