Basic認証を設定するためには通常物理的なフォルダ(ディレクトリ)が必要ですが、特定のページ下部はBasic認証にしたいという相談を受けて試行錯誤した覚書。
前提
たとえばhttps://example.com/archives/記事のパーマリンク というような記事を投稿していて、https://example.com/archives/以下のページはユーザー名とパスワードを知っている人だけログインできるようにしたい、という感じ。
特定のカテゴリのみBasic認証をかけたいというようなイメージです。
ユーザー名とパスワードはWordPressの各ユーザー登録したIDとパスワードじゃなくて、閲覧できる人たちが共有で使う、本当に閲覧のためだけのものです。
編集するファイル
今回はwp-config.phpとfunctions.phpを使用した。
wp-config.php
//basic認証
define('BASIC_AUTH_USER', 'ユーザー名');
define('BASIC_AUTH_PASS', 'パスワード');
ここで設定したユーザー名とパスワードを認証に使う。
functions.php
function custom_basic_auth_protection() {
// 保護するURLのパス("archives/"以下を対象にする)
if (strpos($_SERVER['REQUEST_URI'], '/archives/') === false) {
return; // archives/ 以外は認証不要
}
// ユーザー名・パスワードの設定(固定値)
$valid_username = BASIC_AUTH_USER;
$valid_password = BASIC_AUTH_PASS;
// Basic認証のデータが送られているかチェック
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
$_SERVER['PHP_AUTH_USER'] !== $valid_username || $_SERVER['PHP_AUTH_PW'] !== $valid_password) {
// 認証失敗 → 認証ダイアログを表示
header('WWW-Authenticate: Basic realm="Restricted Area"');
header('HTTP/1.0 401 Unauthorized');
echo '認証が必要です。';
exit;
}
}
// WordPressのフックに登録
add_action('template_redirect', 'custom_basic_auth_protection');
archives以外にしたい場合は、strpos($_SERVER['REQUEST_URI'], '/archives/') === falseのところを変更する。