WordPress5.3からデータベース・エラーページのカスタマイズがかんたんになりました。
理由は『wp_die()の機能強化』です。
メンテナンス中ページ(maintenance.php)、PHPエラーページ(php-error.php)の作り方と、ほぼほぼ同じです。
(だから書いてある内容もほぼ同じ。)
WP5.3から、wp_die()で指定するパラメータのメッセージ(第1パラメータ)にHTMLタグが使えるようになりました。
(ようはHTML文が挿入できる。)
これで、ドロップインで作成するDBエラーの専用ページがスッキリと余計なことを考えずに作成できます。
HTMLは<body>部だけでいいです。
(CSSスタイル、JavaScriptも挿入可)
作成するサンプル
まずはWP5.3以降のデフォルトページとカスタマイズしたページをお見せします。
なにがイヤって、この文言がサイトの閲覧者にも表示されること。内容はどうみても管理者・開発者向けです。
WordPressで作ってるのが見えるし。ふつう、意図しない限りシステムを何で作っているかを公開することはありません。
大したことはしていません。HTMLとCSSを数分で書いただけです。それでそれなりのものができます。
ということで実際に作ってみましょう。
db-error.phpのフォーマット
DBエラーページは/wp-content/db-error.phpです。説明はあとにしてまずはフォーマットから。
<?php
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(), __( 'Database Error' ) );
このかたちでページを作成します。
PHPコードはなんでこうなるのか?
PHPコードは
db-error.phpが無いとき、どうやってデフォルトページを作っているか?
を考えて、その部分のWordPressのコードからパクってきました。
(『db-error.php』でWPコードを検索。)
wp_load_translations_early();
// Load custom DB error template, if present.
if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {
require_once WP_CONTENT_DIR . '/db-error.php';
die();
}
// If installing or in the admin, provide the verbose message.
if ( wp_installing() || defined( 'WP_ADMIN' ) ) {
wp_die( $wpdb->error );
}
// Otherwise, be terse.
wp_die( '<h1>' . __( 'Error establishing a database connection' ) . '</h1>', __( 'Database Error' ) );
wp_load_translations_early();
// Load custom DB error template, if present.
if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) {
require_once WP_CONTENT_DIR . '/db-error.php';
die();
}
$message = '<h1>' . __( 'Error establishing a database connection' ) . "</h1>\n";
// 省略。
$this->bail( $message, 'db_connect_fail' );
if ( $this->show_errors ) {
// 省略。
wp_die( $message );
} else {
// 省略。
return false;
}
db-error.phpが無いときの処理は、HTML文を作ってwp_die()を実行しているだけです。
functions.phpのrequireはいる?
functions.phpのrequireはいらないっちゃいらないです。WPソースを見ても分かるように、db-error.phpをコールするときはfunctions.phpはrequire済みです。
(wp_die()が使える状態。)
今回は、一応保険のために付けました。
wp_load_translations_early()を入れなくていいのか?
メンテナンス中ページを作成した人は気になるところですが、DBエラーページではwp_load_translations_early()は不要です。
WPソースを見れば分かるように、db-error.phpをコールする直前で読み込み済みなので。
header( 'Retry-After: 600' );はいる?
メンテナンス中ページを作成した人はもうひとつ気になると思います。HTTPレスポンスヘッダの『Retry-After:600』です。
DBエラーではレスポンスコード500を返します。500のときは600を付けなくてもいいです。
(メンテナンスは503。)
MDN Web docs
DBエラーページのカスタマイズまとめ
- db-error.phpファイルを用意する。
- /wp-includes/functions.phpのdead_db()を参考にフォーマット作成。
- HTML文の部分をカスタマイズ。
- "***/DocumentRoot/wp-content/"にアップロード。
WP5.2までのカスタマイズはこれよりも作業が必要です。
- HTTPレスポンスヘッダを詳細に作らないといけない。
- HTMLを<html>から作らないといけない。
- wp_die()は使わない。(db-error.phpファイルの呼び出し元のdie()で終わる。)
作り方はmaintenance.phpを参考。