ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

WordPress, PHP Fatalエラーページをカスタマイズする

wordpress image
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

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コードを検索。)

/wp-includes/class-wp-fatal-error-handler.php, WP_Fatal_Error_Handler->display_error_template()
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 );
}
WP_Fatal_Error_Handler->display_default_error_template()
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を参考。

前の投稿
WordPress, データベースのエラーページをカスタマイズする
WordPress フィルタ・アクションで使うべき0, nullなどを返す関数
次の投稿

WordPressの本

post-cta-image

たくさんあるなかで、WordPressの基本が学べる、目的別に学べる本を選びました。

  • WordPressの基本。
  • Webサイト作成から運用まで全体的に学ぶ。
  • かんたんなカスタマイズを学ぶ。
  • 何も分からないところから学ぶ。
  • WordPressからPHPプログラミングを学ぶ。

の5冊です。どうしてもネット上で調べて勉強するのが苦手という人におすすめです。

この内容をモノにすればほかの本は必要ありません。あとは自分の力で、書籍を使わずにインターネット上にある情報だけで学んでいけます。

コメントを残す

*