修正・改善ポートフォリオ

Webサイトの修正・更新・不具合対応(JavaScript / WordPress / 表示崩れ / 速度改善)を中心に、対応事例をまとめています。

PF-001

WordPressでのみメニューが動かない → 原因を切り分けて修正

種別:不具合修正(JavaScript / WordPress)|想定案件:ハンバーガーメニュー・モーダル・アコーディオン等

課題(症状)

  • 静的HTMLでは動くのに、WordPressに組み込むとメニューボタンが反応しない。
  • 場合によってはコンソールに Cannot read properties of null などが出る。

Before / After(この場で挙動を確認)

操作 下の を押して確認できます
サンプルサイト表示エリア(ここで挙動を確認できます)

モード:Before
Beforeは「押しても反応しない」状態を再現。Afterは「右からスライドイン」します。

Before: WordPress環境で起こりがちな「ボタンを動かす命令が早すぎる」状態を想定し、
クリックしても開かない状態を再現しています。

わかりやすく言うと:
同じメニューボタンでも、WordPressに入れた途端に動かなくなることがあります。
原因の一例は「ボタンが表示される前に、動かす命令(JavaScript)が先に動いてしまう」こと。
今回は、その状態を切り分けて 安定して動くように修正した例です。

技術メモ(原因の考え方)
  • DOM生成前にJSが走ると、要素取得が null になりイベントが付かないことがある
  • 対策:DOMContentLoaded でDOM生成後に実行/defer 付与/フッター読み込み
  • WordPressでは wp_enqueue_script で読み込み位置・依存関係を管理する

原因(切り分け)

  • WordPress側でJSがヘッダー読み込みになり、DOM生成前に実行 → 要素取得が null
  • (追加で起こりがち)テーマ/プラグインのJSと競合してイベントが上書きされる。

対応(修正内容)

  1. DOMContentLoaded で包んで、DOM生成後に実行。
  2. 要素が無いページでも落ちない null ガード。
  3. WordPressでは wp_enqueue_script でフッター読み込み/defer 付与。
修正コード例(要点)
document.addEventListener('DOMContentLoaded', () => {
  const btn  = document.querySelector('.menu-btn');
  const menu = document.querySelector('.menu');

  if (!btn || !menu) return; // nullガード

  btn.addEventListener('click', () => {
    menu.classList.toggle('is-open');
  });
});
WordPress側の読み込み例(functions.php)
add_action('wp_enqueue_scripts', function () {
  wp_enqueue_script(
    'site-main',
    get_template_directory_uri() . '/assets/js/main.js',
    array(),
    '1.0.0',
    true // フッター読み込み
  );
});

// defer付与(WP 5.7+)
add_filter('script_loader_tag', function($tag, $handle){
  if ($handle === 'site-main') {
    return str_replace(' src', ' defer src', $tag);
  }
  return $tag;
}, 10, 2);

結果

  • WordPress環境でもクリックイベントが安定して動作。
  • 「ページによって要素が無い」場合でもエラーにならず安全に動作。
  • 再発防止として、読み込み位置とガード条件を標準化。

対応できること(例)

JavaScript不具合修正 WordPress環境の切り分け メニュー/モーダル/アコーディオン修正 読み込み順・競合の調整