WordPress5.3からPHP Fatalエラーページのカスタマイズがかんたんになりました。
理由は『wp_die()の機能強化』です。
優先順位は高くありませんが、見た目きれいなエラーページを作っておくと、いざというときサイトのクオリティが高く見えます。
(あくまで『見える』。本当の質とは関係ない。)
メンテナンス中ページ(maintenance.php)、DBエラーページ(db-error.php)の作り方とほぼほぼ同じです。
(だから書いてある内容もほぼ同じ。)
WP5.3から、wp_die()で指定するパラメータのメッセージ(第1パラメータ)にHTMLタグが使えるようになりました。
(ようはHTML文が挿入できる。)
これで、ドロップインで作成するPHP FatalDBエラーの専用ページがスッキリと余計なことを考えずに作成できます。
HTMLは<body>部だけでいいです。
(CSSスタイル、JavaScriptも挿入可)
作成するサンプル
まずはWP5.3以降のデフォルトページとカスタマイズしたページをお見せします。
なにがイヤって、この文言がサイトの閲覧者にも表示されること。内容はどうみても管理者・開発者向けです。
WordPressで作ってるのが見えるし。ふつう、意図しない限りシステムを何で作っているかを公開することはありません。
大したことはしていません。HTMLとCSSを数分で書いただけです。それでそれなりのものができます。
ということで実際に作ってみましょう。
php-error.phpのフォーマット
PHP Fatalエラーページは/wp-content/php-error.phpです。説明はあとにしてまずはフォーマットから。
<?php
if ( ! function_exists( '__' ) ) {
wp_load_translations_early();
}
if ( ! function_exists( 'wp_die' ) ) {
require_once( ABSPATH . WPINC . '/functions.php' );
}
ob_start();
?>
<!-- CSSファイル -->
<link rel="stylesheet" href="https://sample.com/sample.css" >
<style type='text/css'>
// ここにインラインスタイルを書く。
</style>
// ここにHTMLを書く。
<!-- JS -->
<script></script>
<?php
wp_die( ob_get_clean(), __( 'Internal Server Error' ) );
このかたちでページを作成します。
PHPコードはなんでこうなるのか?
PHPコードは
php-error.phpが無いとき、どうやってデフォルトページを作っているか?
を考えて、その部分のWordPressのコードからパクってきました。
(『php-error.php』でWPコードを検索。)
protected function display_error_template( $error, $handled ) {
if ( defined( 'WP_CONTENT_DIR' ) ) {
// Load custom PHP error template, if present.
$php_error_pluggable = WP_CONTENT_DIR . '/php-error.php';
if ( is_readable( $php_error_pluggable ) ) {
require_once $php_error_pluggable;
return;
}
}
// Otherwise, display the default error template.
$this->display_default_error_template( $error, $handled );
}
protected function display_default_error_template( $error, $handled ) {
if ( ! function_exists( '__' ) ) {
wp_load_translations_early();
}
if ( ! function_exists( 'wp_die' ) ) {
require_once ABSPATH . WPINC . '/functions.php';
}
if ( ! class_exists( 'WP_Error' ) ) {
require_once ABSPATH . WPINC . '/class-wp-error.php';
}
// 省略。
$message = sprintf(
'<p>%s</p><p><a href="%s">%s</a></p>',
$message,
/* translators: Documentation explaining debugging in WordPress. */
__( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
__( 'Learn more about debugging in WordPress.' )
);
$args = array(
'response' => 500,
'exit' => false,
);
// 省略。
wp_die( $wp_error, '', $args );
}
wp_load_translations_early()って何?
functions.phpをrequireする理由は?
これらのすべての答えは
以上です。
補足
このままだと不親切なのでちょっと補足。
wp_load_translations_early()は翻訳ファイルを通常より早いタイミングで読み込むもので、WPのコア機能だけで使います。
(テーマやプラグインでは使わない。)
これからも、ドロップインではWordPress本体をカスタマイズしていることが分かります。
functions.phpの中にはwp_die()が定義されています。これがないと使えません。
header( 'Retry-After: 600' );はいる?
メンテナンス中ページを作成した人は気になると思います。HTTPレスポンスヘッダの『Retry-After:600』です。
PHPエラーではレスポンスコード500を返します。500のときは600を付けなくていいです。
(メンテナンスは503。)
PHP Fatalエラーページのカスタマイズまとめ
- php-error.phpファイルを用意する。
- WP_Fatal_Error_Handlerを参考にフォーマット作成。
- HTML文の部分をカスタマイズ。
- "***/DocumentRoot/wp-content/"にアップロード。
WP5.2までのカスタマイズはこれよりも作業が必要です。
- HTTPレスポンスヘッダを詳細に作らないといけない。
- HTMLを<html>から作らないといけない。
- wp_die()は使わない。(db-error.phpファイルの呼び出し元のdie()で終わる。)
作り方はmaintenance.phpを参考。