#092
posted on 2023.09.25 (Mon)

WordPressのサイトでログインしていない閲覧者にはメンテナンスページを表示。

CATEGORY

WordPressのサイトで作業をするときに、外部にはサイトを公開しない状態で本番環境の動作確認をする必要があったので、WordPressにログインしている閲覧者のみ通常のサイトを表示させ、それ以外の閲覧者にはメンテナンス中を表示させる方法のメモ。

 

[ 処理の流れ ]

  1. 「functions.php」にアクションフックを記述。
  2. WordPressのログイン状態を確認して分岐処理。
  3. ログインしている場合、通常のサイトをそのまま表示。
  4. ログインしていない場合、処理を中止してエラーページ(メンテナンスページ)を表示。

 

 

WordPressデフォルトのエラーページを流用する場合

メンテナンス中を表示するページを自分で用意せず、WordPressデフォルトのエラーページのテンプレートを流用する方法。

  • WordPressの組み込み関数の「wp_die()関数」を使用する。
  • 「wp_die()関数」は、PHPの「die()関数」を補完して設計されていて、WordPressのエラーページ用HTMLが出力される。
  • 「wp_die()関数」の引数で、表示されるエラーページの「ページタイトル」と「本文メッセージ」の内容を設定できる。
  • 「wp_die()関数」のオプション(第3引数)で「HTTPレスポンスステータスコード」などの設定もできる。
  • HTMLのメタやCSSなどはWordPressデフォルトのエラーページ仕様で出力される。(「本文メッセージ」部分に記述すれば、独自のCSSやスクリプトも使用できないことはない。)

※ wp_die()関数のWordPress.orgの公式ドキュメント

 

ログイン状態で分岐処理をアクションフックで実行

ログイン状態をチェックして「wp_die()関数」を実行する関数を作成してアクションフックに登録。(「functions.php」に記述。)

  1. WordPressの組み込み関数の「is_user_logged_in()関数」でログイン状態を確認。
  2. 表示させるエラーページの内容を設定。
  3. 「wp_die()関数」を実行。(エラーページを出力してWordPressの処理を終了。)
  4. 「parse_request」のアクションフックに登録。(「parse_request」のWordPress.orgの公式ドキュメント。)

※ ログイン画面へのアクセスは常に許可したいので、管理画面では呼び出されず、サイト表示の場合だけ呼び出される中で一番早いアクションフックに登録する。(「WordPress バージョン 6.3.1」で検証した限りでは「parse_request」がおそらく一番早い。)

※ メンテナンス表示のページが検索サイトにインデックスされないように、ステータスコードは必ず「503」を指定する。( 「503」は、メンテナンス中やサーバー過負荷状態でリクエストを処理する準備ができていないことを示す。)

※ 「wp_die()関数」は、HTTPのレスポンスヘッダーとして「Retry-After: 600」を返す。(「Retry-After」ディレクティブは、サービスの復旧に要する予想時間の指定。「日付表記」か「秒数」で指定。)

※ 「wp_die()関数」の第1引数で指定した「本文メッセージ」は、エラーページのHTML内「<div class=”wp-die-message”></div>」の中に出力される。(「WordPress バージョン 6.3.1」で確認。)

function ag2maintenance(){
 if(!is_user_logged_in()){
  $ag2maintenance_txt = '<p>現在メンテナンス中です。</p>';
  $ag2maintenance_title = 'Maintenance | '.get_bloginfo('name');
  $ag2maintenance_args = array(
  'response' => 503, //HTTPステータスコードの設定。既定値は500
   'link_url' => 'https://ag2works.tokyo', //link_text設定時のみリンク先設定
   'link_text' => '詳細はこちら', //link_url設定時のみテキストを表示
   'back_link' => true //履歴で「戻る」ボタンを表示(trueで表示)。既定値はfalse
  );
  //エラーページを表示して処理を終了
  wp_die($ag2maintenance_txt, $ag2maintenance_title, $ag2maintenance_args);
 }
}
add_action('parse_request', 'ag2maintenance');

wp_die(‘メッセージ’, ‘タイトル’, ‘オプションの配列’) : 指定したタイトルのページで指定したメッセージを表示する。第3引数に配列形式でオプションを設定できる。引数はすべて省略可。

 

 

オリジナルのメンテナンスページを表示する場合

自分でデザインしたメンテナンスページを表示させる方法。

  • メンテナンス表示用のhtmlを記述したphpファイルを自分で用意する。
  • 作成したphpファイルを使用中のテーマテンプレートのディレクトリに配置。
  • phpファイルを「include_once()関数」などで読み込む。
  • 「wp_die()関数」は使用せず、PHPの「exit()関数」(または「die()関数」)を使用する。

※ exit()関数のPHPの公式ドキュメント

 

ログイン状態で分岐処理をアクションフックで実行

用意したphpファイルの読み込みと「exit()関数」を実行する関数を作成してアクションフックに登録。(「functions.php」に記述。)

  1. ログイン状態で分岐。
  2. 自分で用意したphpファイルを読み込んで表示。(ここでは「ag2maintenance.php」。)
  3. 「exit()関数」を実行して、以降のPHPのスクリプトの実行を終了させる。
  4. 「parse_request」のアクションフックに登録。
function ag2maintenance(){
 if(!is_user_logged_in()){
  //メンテナンス中を表示
  include_once('ag2maintenance.php');
  //以降のPHPの実行を終了
  exit();
 }
}
add_action('parse_request', 'ag2maintenance');

exit(‘文字列または整数’) : 指定した文字列を表示してスクリプトの実行を終了する。引数に整数を指定した場合は、その値が終了ステータスとして使われ、その整数は文字列として表示はされない。

 

メンテナス中表示用のphpファイルを作成

上述のアクションフックで読み込む、メンテナンス中表示用のファイル(ここでは「ag2maintenance.php」)の記述内容。

  1. HTTPヘッダーでステータスコード「503」と「Retry-After」ディレクティブを設定して返す。
  2. 必要があれば、その他のヘッダーを設定。(下記では、「文字コード」と「キャッシュ不可」を指定。)
  3. メンテナンス中に表示させたい内容のhtmlを記述。

※ 一時メンテナンスなので、必ずステータスコードの「503」を返すようにし、サービスの復旧に要する予想時間を意味する「Retry-After」ディレクティブも設定して返す。

※ 「503」ステータスコードについてのRFCの公式ドキュメント

※ 「Retry-After」についてのRFCの公式ドキュメント

<?php
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 3600');
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-store');
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Maintenace</title>
</head>
<body>
 //任意の内容を記述
</body>
</html>

header(‘ヘッダー文字列’) : 生のHTTPヘッダーを送信する。

 

 

この記事のURL

https://memo.ag2works.tokyo/post-5578/

Copyコピー
この記事のタイトル

WordPressのサイトでログインしていない閲覧者にはメンテナンスページを表示。 | memo メモ [AG2WORKS]

Copyコピー
この記事のリンクタグ

<a href="https://memo.ag2works.tokyo/post-5578/" target="_blank" rel="noopener">WordPressのサイトでログインしていない閲覧者にはメンテナンスページを表示。 | memo メモ [AG2WORKS]</a>

Copyコピー
※ フィールドをクリックでコピーするテキストの編集ができます。

この記事へのコメント

コメントの書き込みはまだありません。

  • コメント内のタグはエスケープ処理され、文字列として出力されます。
  • セキュリティーのため、投稿者のIPアドレスは取得されます。
  • 管理者が内容を不適切と判断したコメントは削除されます。
  • このフォームにはスパム対策として、Googleの提供するreCAPTCHAシステムが導入されています。
    (Google Privacy Policy and Terms of Service.)