wordpressの特定ページのBasic認証とそのカスタマイズ

Webサイト運営

WordPressの特定ページにBasic認証を使う方法です。

WordPressには、もともと各ページをパスワード保護する機能が付いていますが、その処理にlogin.phpを使うため、login.phpにアクセス制限がかかっていると機能しません。

自分の環境では動くのに、ほかの人からはパスワード入力した後404になってしまうなどはこれが考えられます。(企業のホームページなど悪意ある攻撃から管理画面へアクセスさせないため、IPアドレス制限をかけていたりします。)

それでもパスワード保護したい場合は、Basic認証を使う方法が有効なので紹介します。
キャンセル時にホームに戻るようにカスタマイズした方法も加えてます。

手順概要
  1. function.phpにBasic認証の処理を加える
  2. header.phpに条件分岐とユーザー名・パスワードを加える
  3. function.phpのキャンセル処理をカスタマイズしてホームに戻るようにする
スポンサーリンク

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という方は読み飛ばしてください。

カスタマイズ①

戻り値の中にあるキャンセル時に呼ばれる$failed_textを削除する

function basic_auth($auth_list,$realm="Restricted Area",$failed_text="認証に失敗しました"){

function basic_auth($auth_list,$realm="Restricted Area"){
カスタマイズ②

キャンセル処理”dei()”の中身を書き換える

die($failed_text);

die(home_redirect()); //ホームに戻る関数を呼び出す

ホームに戻る処理を関数化して、それを呼び出すようにする。

カスタマイズ③

ホームに戻る関数(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>";
}

javascriptのsetTimeoutを使ってホームに戻す。

  • ホームじゃなくて一覧に戻したい場合は、戻り先のURLを変更する。
 window.location.href = \"https://miyagi-life.com\";
  • 戻るまでの時間を変更する場合はここを修正。※ミリ秒なので注意!
 0*1000