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 Basic | 0.085秒 | 24% |
| Content Views | 0.036秒 | 10% |
| LiteSpeed Cache | 0.032秒 | 9% |
| EWWW Image Optimizer | 0.025秒 | 7% |
Content Views(Content Views Pro) がPHP実行時間の上位に入っています。これはサイドバーの記事一覧ウィジェットに使用しているプラグインですが、記事ページでもJS/CSSが読み込まれていることが問題でした。
Query Monitor でサーバー側の状態を確認する
次に Query Monitor でページ生成時間・DBクエリ・キャッシュの状態を確認しました。
| 指標 | 値 | 評価 |
|---|---|---|
| Page Generation Time | 0.1964秒 | 🟢 良好 |
| Peak Memory | 18.0MB / 2,048MB | 🟢 良好 |
| DB Queries | 92クエリ / 0.035秒 | 🟢 良好 |
| HTTP API Calls | None | 🟢 良好 |
サーバー側の処理は問題ありませんでした。つまり「遅さの原因はフロント側(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(モバイル) | 17 | 57 | +40 |
| LCP | 6.45秒 | 2.3秒 | ✅ 目標値内 |
| TBT | 5.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-styles や wp-block-styles-placeholder などの空ハンドルを除去しました。最後にコンタクトフォーム専用の ajaxzip3 などは specific-stylesandscripts.php に移動し、そのページのみで読み込む形にしました。
プラグインのJS/CSS整理は「どのページで何が必要か」を把握するだけで取り組める改善です。特に Content Views のような記事一覧プラグインは、一覧ページにしか使っていないのに全ページで読み込まれているケースが多いため、確認してみる価値があります。

