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

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

IDとパスを設定して、サイトの閲覧を制限するBasic認証。
そのベーシック認証を固定ページやカスタム投稿タイプなど、ワードプレスで作成したサイトの特定のページにだけ設定する方法です。

方法❶ functions.phpにベーシック認証を掛ける関数を記述

自分自身、一つ目の方法は上手くいかず、二つ目の方法で適用できた場合があったので、2つの方法を紹介します。

まず一つ目。
手順は簡単です。

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にfunctions.phpの関数を実行するコードを記述

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/』ページに認証を設けます。

wpフォルダの一番上の階層にスラッグと同名のフォルダを作ります。

ここでは『works』フォルダを作ります。

一番上の階層にある『.htaccess』『index.php』をコピー

コピーした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
IDとpassを記述した『.htpasswd』を作成

これも通常のベーシック認証と同じく『.htpasswd』を作成し、IDと暗号化したpasswordを記述します。

ID:aoviahoidfnva(暗号化したpassword)
『.htaccess』『.htpasswd』『index.php』を『works』フォルダにアップ

用意した3つのファイルを、①で作った『works』フォルダにアップします。

70-01

これでhttp://◯◯◯.com/works/ページにベーシック認証をかけられました。

さいごに

まだ把握しきれてないところもあるのですが、取り急ぎメモをかねてまとめました。

❷ではカスタム投稿タイプ以外の場合のフォルダ名をどうなるんだろう?
とか疑問が残ってます。

あと、❶で『cgi版PHPを使用している場合、basic認証が使えないから、.htaccessに2行追記する』
という注意があったんですが、❷の方だと特に追記しなくても普通にベーシック認証がかかったのもよくわからないまま…。
(レンタルサーバーの管理画面でphpがcgi版だと確認)

そしてそもそもなぜ❶でベーシック認証が設置できたのに、パスできなかったのか…。

色々謎を残しつつ、とりあえずテスト用にかけたいだけなので深追いせず、何か補足できることがあったらまた書きます。