WordPressの特定ページにBasic認証を使う方法です。
WordPressには、もともと各ページをパスワード保護する機能が付いていますが、その処理にlogin.phpを使うため、login.phpにアクセス制限がかかっていると機能しません。
自分の環境では動くのに、ほかの人からはパスワード入力した後404になってしまうなどはこれが考えられます。(企業のホームページなど悪意ある攻撃から管理画面へアクセスさせないため、IPアドレス制限をかけていたりします。)
それでもパスワード保護したい場合は、Basic認証を使う方法が有効なので紹介します。
キャンセル時にホームに戻るようにカスタマイズした方法も加えてます。
1.function.phpにBasic認証の処理を加える
function.phpの一番下に以下の処理を記述する。(コピペでOK)
//Basic認証の処理
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);
}
2.header.phpに条件分岐とユーザー名・パスワードを加える
どのページでも読み込まれるheader.phpの一番上に以下を記述する
//Basic認証をかけるページ
<?php
if(!is_home()):
if(is_page('220')): //Basic認証をかける固定ページのID
$userArray = array(
"admin" => "password"
);
basic_auth($userArray);
endif;
endif;
?>
複数のページにBasic認証をかけてすべて同じユーザー名・パスワードを使う
is_page()の中でarray()を使って並べる
//Basic認証をかけるページ
<?php
if(!is_home()):
if(is_page(array('220','360'))): //Basic認証をかける固定ページのID(複数)
$userArray = array(
"admin" => "password"
);
basic_auth($userArray);
endif;
endif;
?>
Basic認証のユーザー名とパスワードを複数にする場合
改行時のカンマ(,)を忘れずに!
//Basic認証をかけるページ
<?php
if(!is_home()):
if(is_page('220')): //Basic認証をかける固定ページのID
$userArray = array(
"admin" => "password",
"editor" => "password"
);
basic_auth($userArray);
endif;
endif;
?>
カテゴリーページにBasic認証をかける
is_page()だった箇所をis_category()にする
//Basic認証をかけるページ
<?php
if(!is_home()):
if(is_category('3')): //Basic認証をかけるカテゴリーページのID
$userArray = array(
"admin" => "password"
);
basic_auth($userArray);
endif;
endif;
?>
ここまでの参考: https://skygold.jp/web/4281
キャンセル時にホームに戻るようにカスタマイズ
ここからは、検索しても出てこなかった方法です。
手順1で追記したfunction.phpのキャンセル時の処理に手を加えてホームに戻すようにカスタマイズしました。
簡単に言うと、キャンセル時に文字列ではなく関数を呼びだすようにしました。後ほど詳しく解説しますが、まずは完成後のソースをどうぞ。
完成後のソースコード
function.phpをカスタマイズ
//Basic認証の処理
function basic_auth($auth_list,$realm="Restricted Area"){
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(home_redirect());
}
function home_redirect(){
echo "<script type=\"text/javascript\">alert(\"ログインがキャンセルされました\");</script>";
echo "<script type=\"text/javascript\">
setTimeout(function(){
window.location.href = \"https://miyagi-life.com\";
}, 0*1000);
</script>";
}
ソースコードの解説
ここからは、カスタマイズ箇所の解説です。とりあえず動いたからOKという方は読み飛ばしてください。