WordPressのPageSpeedスコアが17というかなり厳しい状態から、プラグインのJS/CSSの整理だけで57まで改善できました。

特にTBT(Total Blocking Time)は5.1秒 → 170ms、LCPは6.45秒 → 2.3秒と大幅に改善しています。この記事では、原因の特定から実際のコード修正までを記録します。


    まず現状をツールで把握する

    Code Profiler でプラグイン別の実行時間を確認する

    「遅い」とわかっていても、どのプラグインが原因かわからないと手の打ちようがありません。最初に Code Profiler でプラグイン・テーマごとの実行時間を計測しました。

    総実行時間 0.361秒の内訳を見ると、上位は以下のとおりです。

    プラグイン実行時間全体比
    Kadence Security Basic0.085秒24%
    Content Views0.036秒10%
    LiteSpeed Cache0.032秒9%
    EWWW Image Optimizer0.025秒7%

    Content Views(Content Views Pro) がPHP実行時間の上位に入っています。これはサイドバーの記事一覧ウィジェットに使用しているプラグインですが、記事ページでもJS/CSSが読み込まれていることが問題でした。

    Query Monitor でサーバー側の状態を確認する

    次に Query Monitor でページ生成時間・DBクエリ・キャッシュの状態を確認しました。

    指標評価
    Page Generation Time0.1964秒🟢 良好
    Peak Memory18.0MB / 2,048MB🟢 良好
    DB Queries92クエリ / 0.035秒🟢 良好
    HTTP API CallsNone🟢 良好

    サーバー側の処理は問題ありませんでした。つまり「遅さの原因はフロント側(JS/CSS)」と絞り込めます。

    plugin-handles.php でフロントのJS/CSS一覧を可視化する

    サーバー側は問題ないとわかったところで、フロントで実際に何が読み込まれているかを plugin-handles.php というデバッグ用ファイルで可視化しました。

    ?debug=true をURLに付与した時だけ、画面右下にキューされているスタイル・スクリプトの一覧が表示されます。

    記事ページに読み込まれていた不要なハンドルの例:

    Styles(CSS)

    • pt-cv-public-style — Content Views(記事ページ不要)
    • pt-cv-public-pro-style — Content Views Pro(記事ページ不要)
    • classic-theme-styles — ブロックエディタ不使用なので不要
    • wp-block-styles-placeholder — 同上
    • wp-global-styles-placeholder — 同上

    Scripts(JS)

    • pt-cv-content-views-script — Content Views(記事ページ不要)
    • pt-cv-public-pro-script — Content Views Pro(記事ページ不要)

    plugin-handles.php の実装と除去

    plugin-handles.php はデバッグ表示と、プラグインのCSS/JS無効化を一ファイルで管理しています。head.php から wp_head() より前に include するだけで動作します。

    <!-- plugin-handles.php(wp_head() より前に include) -->
    <?php $_f = do_shortcode('[root_themepath]') . '/commons/plugin-handles.php';
    if (file_exists($_f)) include $_f; ?>
    

    ファイルの構成は3つのブロックです。

    ① デバッグ判定

    $_zaratan_debug = isset($_GET['debug']) &&
      in_array(strtolower((string) $_GET['debug']), ['true', '1', ''], true);
    

    ?debug=true または ?debug=1 の時だけデバッグUIを表示します。本番アクセスでは何も出力しません。

    ② デバッグ時のハンドル一覧表示

    if ($_zaratan_debug) {
      add_action('wp_head', function () {
        $wp_styles  = wp_styles();
        $wp_scripts = wp_scripts();
        // ... 画面右下にキュー一覧をオーバーレイ表示
      }, 999); // 優先度999:wp_head() の最後に出力
    }
    

    wp_head() より後のフック(優先度999)で出力することで、その時点で登録済みのスクリプトをすべて拾えます。

    ③ プラグインCSS/JSの無効化

    add_action('wp_print_styles', function () {
      // コンタクトテンプレート以外で無効化
      if (!is_page_template('templates/page-contact.php')) {
        wp_dequeue_style('wp-block-library');
        wp_dequeue_style('contact-form-7');
      }
    
      // ブロックエディタ関連(クラシックエディタ使用のため不要)
      wp_dequeue_style('classic-theme-styles');
      wp_dequeue_style('wp-block-styles-placeholder');
      wp_dequeue_style('wp-global-styles-placeholder');
      wp_dequeue_style('global-styles');
      wp_dequeue_style('core-block-supports-duotone');
    
      // Content Views Pro:記事ページでは不要
      if (is_single()) {
        wp_dequeue_style('pt-cv-public-style');
        wp_dequeue_style('pt-cv-public-pro-style');
      }
    }, 100);
    
    add_action('wp_print_scripts', function () {
      if (!is_page_template('templates/page-contact.php')) {
        wp_deregister_script('contact-form-7');
      }
    
      if (is_single()) {
        wp_dequeue_script('pt-cv-content-views-script');
        wp_dequeue_script('pt-cv-public-pro-script');
      }
    }, 100);
    

    ポイント:テンプレート判定を使う

    !is_page(['contact', 'request', ...]) のようなスラッグ列挙でなく、!is_page_template('templates/page-contact.php') で判定しています。スラッグが増えるたびに修正が必要になるのを避けるためです。

    ④ specific-stylesandscripts.php でページ固有のCSS/JSを管理

    Contact Form 7 の ajaxzip3 のように、特定ページにしか必要ないJS/CSSは specific-stylesandscripts.php に集約しています。

    <?php if (is_page_template('templates/page-contact.php')) : ?>
      <link rel="stylesheet" href="...fm-contact4fnR.css" />
      <script src="...jquery-ui.min.js"></script>
      <script src="...ajaxzip3.js"></script>
    <?php endif; ?>
    

    head.php からはこの1行だけで読み込めます。

    <?php $_f = get_theme_file_path() . '/js/specific-stylesandscripts.php';
    if (file_exists($_f)) include $_f; ?>
    

    対応後の変化

    除去後のQueuing一覧です。Content ViewsのJS/CSSと、ブロックエディタ系のハンドルが消えていることが確認できます。

    PageSpeed Insightsの数値は以下のように改善しました。

    指標作業前作業後変化
    Performance(モバイル)1757+40
    LCP6.45秒2.3秒✅ 目標値内
    TBT5.1秒170ms✅ 大幅改善

    TBTの改善が特に大きく、5,100ms → 170ms(97%削減)です。Content Views ProのJSが毎リクエストで読み込まれていたことがTBTの主な原因だったとわかります。


    まとめ

    今回の改善をまとめると次のとおりです。

    原因の特定に使ったツールは Code Profiler(プラグイン別PHP実行時間)と Query Monitor(DB・キャッシュ・サーバー全般)、plugin-handles.php(フロントのJS/CSS一覧)の3つです。

    実際にやったことは主に3つです。まず is_single() で記事ページを判定し、Content Views ProのJS/CSS 4ファイルを除去しました。次にブロックエディタを使っていないため classic-theme-styleswp-block-styles-placeholder などの空ハンドルを除去しました。最後にコンタクトフォーム専用の ajaxzip3 などは specific-stylesandscripts.php に移動し、そのページのみで読み込む形にしました。

    プラグインのJS/CSS整理は「どのページで何が必要か」を把握するだけで取り組める改善です。特に Content Views のような記事一覧プラグインは、一覧ページにしか使っていないのに全ページで読み込まれているケースが多いため、確認してみる価値があります。