タグアーカイブ Autoptimize

AutoptimizeのJavaScript最適化でドロップダウンメニューが動かない時の除外設定

AutoptimizeのJavaScript最適化でドロップダウンメニューが動かない時の除外設定

Autoptimize の「JavaScript コードを最適化」を有効にすると、ヘッダーのドロップダウンメニューが開かなくなる問題は、最適化処理がメニューを動かす JavaScript と競合するために起こる。ブラウザの開発者ツールで原因となるスクリプトを特定し、Autoptimize の「除外するスクリプト」欄にファイル名を追加すれば、最適化を維持したままメニューを正常に動作させられる。

なぜ JavaScript 最適化でメニューが動かなくなるのか

なぜ JavaScript 最適化でメニューが動かなくなるのか

Autoptimize の「JavaScript コードを最適化」は、複数の JavaScript ファイルを1つに集約し、不要な空白やコメントを削除する「縮小(ミニファイ)」を施す機能だ。加えて、読み込みタイミングをずらす「遅延読み込み」や「非同期読み込み」も合わせて適用される。

ドロップダウンメニューは、マウスのホバーやクリックを検知してサブメニューを表示する仕組みで、内部では jQuery やテーマ独自の JavaScript が複数連携して動作する。最適化によってこれらのスクリプトの実行順序が入れ替わったり、縮小処理中に特定の構文が破損したりすると、メニューを開くイベントが発火しなくなる。

特定のページだけで発生する仕組み

トップページや一部の内部ページでは正常に動き、キャリアページや特定の投稿ページだけでメニューが壊れる場合、落ちているのは集約後の順序問題であることが多い。ページごとに読み込まれるスクリプトの組み合わせが微妙に異なるため、特定の構成でのみ実行順序の破綻が表面化する。

jQuery 依存のメニューは特に影響を受けやすい

多くの WordPress テーマはメニューの開閉に jQuery を使う。Autoptimize の標準設定では jQuery も他のスクリプトと一緒に集約されるが、jQuery は他のスクリプトより先に読み込まれなければならない。集約順序が変わって jQuery が後回しになると、$ is not definedjQuery is not defined といったエラーが発生し、メニュー全体が沈黙する。

原因となる JavaScript ファイルを特定する手順

闇雲に除外設定を増やすのは避けたい。まずはブラウザの開発者ツールでエラーの出どころを確認し、ピンポイントで除外するファイルを決める。

STEP 1 Chrome で問題のページを開き、F12 キーを押す
STEP 2 「Console」タブをクリックし、赤いエラーを確認する
STEP 3 エラーが示すファイル名(例: autoptimize_xxxxx.js やテーマの navigation.js)を記録する
STEP 4 原因ファイルの元のパス(wp-content/themes/テーマ名/js/... 等)を特定する

エラーメッセージが「jQuery is not defined」であれば、jQuery の読み込み順がずれている。テーマ名や「navigation」「menu」を含むファイル名が表示されたら、そのファイルが縮小によって破損している可能性が高い。

エラーが出ない場合の切り分け方

コンソールにエラーが出ていないのにメニューが動かないケースもある。この場合は「Network」タブで autoptimize_xxxxx.js のレスポンスを確認し、途中で切れていないか、スクリプトの末尾が正常かを調べる。また、Autoptimize の設定で「JavaScript コードを最適化」だけをオンにし、「JavaScript を集約する」をオフにして症状が変わるかも試すと、問題の絞り込みが進む。

Autoptimize の除外設定でメニューを修復する

原因ファイルが特定できたら、Autoptimize の設定画面で除外リストに追加する。除外されたファイルは最適化の対象外となり、元の順序で単独で読み込まれるため、競合が解消する。

【Before エラー状態】
「JavaScript コードを最適化」オン
除外設定なし
→ ヘッダードロップダウンメニューが開かない
【After 修正後】
「JavaScript コードを最適化」オン
除外リストに navigation.jsjquery.js を追加
→ 全ページでメニューが正常動作
エラー状態  修正後

除外設定の具体的な入力方法

WordPress 管理画面の「設定」→「Autoptimize」→「JavaScript オプション」を開く。「JavaScript コードを最適化」が有効になっている状態で、その直下にある「除外するスクリプト」欄に、カンマ区切りでファイル名を入力する。

入力例を以下に示す。実際のファイル名は、サイトのテーマやプラグイン構成によって異なる。

  • jquery.js 、 jQuery 本体
  • jquery.min.js 、 縮小版の jQuery
  • navigation.js 、 テーマのメニュー制御スクリプト
  • theme-menu.min.js 、 テーマが提供する縮小済みメニュー制御
  • js_composer_front 、 WPBakery 等のビルダーが出力するスクリプト

部分一致で指定できるため、jquery とだけ書けば、ファイル名に「jquery」を含むすべてのスクリプトが除外される。同様に navigationmenu といったキーワードでもよい。

「jQuery を集約しない」オプションの活用

Autoptimize の「JavaScript オプション」内には「jQuery を集約しない」というチェックボックスも用意されている。jQuery 依存のエラーが出ている場合は、個別のファイル名を書く前にまずこのチェックを入れてみると、まとめて解決することが多い。

どうしても直らない時の応用設定

除外設定を丁寧に行ってもメニューが復活しない場合、最適化モードそのものを調整する手がある。「JavaScript コードを最適化」の中には「縮小のみ(集約しない)」といった選択肢もあり、集約をやめて縮小だけに留めれば、多くの競合が回避される。

スクリプトの読み込み位置を変える

「JavaScript をフッターに移動する」や「Async(非同期)にする」といった項目も、メニューの動作に影響を与えうる。メニューはページの初期表示時に即座に動作する必要があるため、非同期読み込みにしてしまうと DOM 構築が完了する前にメニューのイベント登録が走ってしまい、動作しなくなる。まずはこれらのチェックを外して試す。

プラグイン単位での競合を疑う

まれに、Autoptimize と特定のキャッシュ系プラグインやテーマ付属の最適化機能が二重に働いて競合することがある。W3 Total Cache や WP Rocket に組み込まれた最適化と同時に使わず、いずれか一方に統一する。また、テーマの「パフォーマンス」設定内に JavaScript の最適化機能がある場合は、そちらを無効にして Autoptimize に一本化する。

よくある質問

除外設定を追加したのにメニューが直らない

Autoptimize のキャッシュが残っていると、除外設定が反映されずに古い最適化済みスクリプトが使われ続ける。管理画面の Autoptimize 設定画面で「キャッシュをクリア」ボタンを押し、さらにブラウザのキャッシュもスーパーリロード(Ctrl+F5)で破棄する。サーバーによっては CDN やサーバー側キャッシュもクリアする必要がある。

ファイル名がわからない時はどうするのか

ブラウザの開発者ツール「Network」タブで、JS ファイルの一覧を名前順に並べ、「theme」「menu」「nav」「dropdown」を含むファイルを探す。該当ファイルが見つからない場合は、テーマの開発者に「メニュー制御に使っている JavaScript ファイル名」を問い合わせるか、Autoptimize の「縮小のみ(集約しない)」モードで一旦回避する。

一部のページだけメニューが壊れるのはなぜか

ページによって読み込まれるプラグインやウィジェットのスクリプトが異なるため、集約後のファイルの構成が変わる。特定のページにだけ表示される「お問い合わせフォーム」や「求人一覧」のスクリプトが混ざると、集約後の全体の実行順序が崩れて、たまたまメニュー制御に影響が出ることがある。

Autoptimize を無効にするとサイトが遅くなるのが心配だ

JavaScript 最適化を完全に切る必要はない。問題のスクリプトだけをピンポイントで除外すれば、大部分のスクリプトは最適化されたまま配信される。PageSpeed Insights 等でスコアを確認しながら除外範囲を最小限に絞れば、速度と機能の両立は十分に可能だ。

この記事のポイント

  • JavaScript 最適化によるドロップダウンメニュー不具合は、スクリプトの順序破綻や縮小破損が原因
  • 開発者ツールの「Console」でエラーを特定し、原因ファイルを Autoptimize の除外リストに追加する
  • 「jQuery を集約しない」オプションが有効なケースも多い
  • 除外設定後は必ず Autoptimize キャッシュとブラウザキャッシュをクリアする
  • 「縮小のみ」「非同期読み込みオフ」など、最適化の段階を調整することでも解決できる