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

この記事を書いた人
マイマイ

2016年12月生まれの男児を育てる三十路ママ。生後6か月で復帰し時短勤務中です。平日はほとんどワンオペ。昼休憩や寝かしつけ後など隙間時間でブログをこなしています。日々の家事は必要最低限のみです。
お出かけスポット情報や自立を促す子育て方法など実体験をもとにまとめています。

ツイッターもやってます
Webサイト運営 wordpress
みやぎで暮らす
タイトルとURLをコピーしました