0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPressのフック順を“見える化”する:debug.log最小ログ術

Last updated at Posted at 2025-08-17

フックはどの順で走る?“見える化”ログ術(WordPress)

これは何ですか?

「WordPress は実際どの順番で処理が走っているのか」を、自分のサイト上で可視化するミニツールをご紹介します。
やることはシンプルで、add_action('all', ...) を利用して通過したフック名を debug.log に記録します。順番が見えると「どのタイミングで処理を挟めば安全か」が判断しやすくなります。

目次

前提(安全に試すために)

まずは wp-config.php のデバッグ設定を確かめます。未設定なら次の 3 行を追加します(既に定義がある場合は重複しないようにしてください)。

// wp-config.php(/* That's all, stop editing! */ より上)
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);      // wp-content/debug.log に出力します
define('WP_DEBUG_DISPLAY', false); // 画面には出しません(本番で安全です)

終わったら元に戻す(false にする)か、必要なときだけ一時的に true にする運用をおすすめします。本番でのログ出力は最小限にしましょう。

最小セット:発火順を番号付きでログ出力します

以下を テーマの functions.php または mu-plugins に一時的に置いて使います。

<?php
// === Hook Logger(必要な時だけ有効化してください) ===
add_action('plugins_loaded', function () {
    // まずはフロント側だけ観察します(管理画面は後述)
    if (is_admin()) {
        return;
    }

    // 観察対象のフックを絞ると見やすく・軽くなります(必要に応じて追加してください)
    $watch = [
        'init', 'wp', 'template_redirect', 'wp_head',
        'loop_start', 'the_post', 'the_content', 'loop_end', 'wp_footer'
    ];

    add_action('all', function ($tag) use ($watch) {
        static $n = 0;
        if (!in_array($tag, $watch, true)) {
            return; // 監視対象のみ記録します
        }
        error_log(sprintf('%03d %s', ++$n, $tag));
    });
});

wp-content/debug.log には次のように並びます。

001 init
002 wp
003 template_redirect
004 wp_head
...
010 the_post
011 the_content
...
020 wp_footer

この並びから、出力して良いタイミング/避けるべきタイミングが直感的に分かります。
とくに init のような早いフックで echo をすると、ヘッダー送信前の出力になり不具合の原因になりますので、ログは error_log() に出すのがおすすめです。

回数や現在のフック名を知る補助API

フックが何回呼ばれたかdid_action()今どのフックの中かcurrent_filter() で分かります。

<?php
add_action('the_post', function () {
    error_log('the_post count=' . did_action('the_post'));
});

add_action('the_content', function ($content) {
    error_log('now: ' . current_filter());
    return $content;
}, 10);

管理画面の流れを覗きたい場合

管理画面側の主要フックだけ観察する例です。必要なときだけ一時的に有効化してください。

<?php
add_action('admin_init', function () {
    // 観察対象のフックは必要に応じて増減してください
    $watch = ['admin_init', 'admin_menu', 'current_screen', 'load-post.php', 'admin_notices'];

    add_action('all', function ($tag) use ($watch) {
        static $n = 0;
        if (!in_array($tag, $watch, true)) {
            return;
        }
        // A を付けてフロントのログと区別しやすくします
        error_log(sprintf('A%03d %s', ++$n, $tag));
    });
});

出力例(wp-content/debug.log

画面やプラグイン構成によって順序は前後します。下記はあくまで一例です。

ダッシュボード(/wp-admin/index.php)の例

A001 admin_init
A002 current_screen
A003 admin_menu
A004 admin_notices

投稿編集画面(/wp-admin/post.php?post=123&action=edit)の例

A001 admin_init
A002 current_screen
A003 load-post.php
A004 admin_menu
A005 admin_notices

観察ポイント

  • admin_init:管理画面の初期化タイミングです。設定の読み込みや軽い準備処理に向きます。
  • current_screen:いま開いている管理画面のスクリーン情報が確定します。画面ごとの分岐に使いやすいです。
  • load-*.php:特定ページを開いたときだけ発火します(例:投稿編集なら load-post.php)。その画面専用の前処理に便利です。
  • admin_menu:メニューの登録・調整のタイミングです。
  • admin_notices:通知(バナー)を表示するタイミングです。画面への出力はこの辺り以降が安全です。

片付けと注意点

  • 使い終わったら、必ず削除またはコメントアウトしてください。add_action('all') は重い処理です。
  • 本番では短時間だけ有効化するか、ステージング環境での確認をおすすめします。
  • 早いフックでの echo 出力は避け、ログは error_log() に送ると安全です。

最後に

この「見える化」ロガーは、“順番を体で覚える”ための補助輪です。使い終わったら、必ず無効化・削除してください。本番環境では短時間だけの利用をおすすめします。

  • 判断の軸ができます:どのフックで「出力/保存/前処理」を行うか、根拠をもって決められるようになります。
  • 早いフックでの echo は避けますinit などでは画面に出さず、error_log() に記録します。
  • 出力してよいタイミングの目安:フロントは wp_headwp_footer 以降、管理画面の通知は admin_notices
  • 前処理の目安:フロントは template_redirect、管理画面は admin_initcurrent_screen、画面個別は load-*.php

次の一歩としては、「入力は sanitize/出力は escape/状態変更は nonce」 の最小セット(CSRF 対策とエスケープの基本)と、「WP 新人がまずつまずくエラー10選」をあわせて読んでいただくと、トラブルシュートがぐっと楽になります。

最後まで読んでいただき、ありがとうございます。この記事が役に立ちましたら、ストックやフォロー、または「ここも見たい」「この順番も見える化したい」といったご要望をコメントで教えてください。今後の改善に活かします。

あわせて読みたい

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?