好奇心の赴くままに。気になったことを、気ままに深掘り

WordPressのHTMLブロックでJavaScriptが動かない|実行順序の罠と、&& が消える罠

WordPress 7.0から、カスタムHTMLブロックにHTML・CSS・JavaScriptの3つのパネルが用意されました。コードを直接書けて便利なのですが——書いたJavaScriptが動かない。原因は、たいていこの2つです。急いでいる方のために、先に結論から。

急いでいる方のために、先に結論を書いておきます。

  • 罠その1:JavaScriptが、HTMLよりも先に実行されてしまう
  • 罠その2:&&(アンド)が 勝手に書き換えられる

思い当たるほうから読んでみてください。

罠その1:JavaScriptがHTMLより先に走る

WordPress 7.0からのJSパネルは、インラインの気楽さを失って、外部JSの作法が要るように。要するに「HTMLに埋め込むスクリプト」から「独立したJSファイル」に、性質が変わった。

  • 今まで:HTMLブロックに<script>を書く
    → HTMLの中に埋め込む書き方はHTML要素のの下に置いたら、ブラウザが上から読むから順番が保証されるので順番を気にしなくてよかった。
  • JSパネルに書く
    → これは「HTMLの中に埋め込む」のではなく。独立したJSとして扱われるので。どこに置かれるかはWordPress任せ。

原因

JavaScriptパネルに書いたコードが、HTMLパネルの内容よりも先に実行されているのです。

以前はHTMLブロックの中に、こう書いていたはずです。

<div id="box">...</div>
<script>
  var box = document.getElementById('box');   // ちゃんと見つかる
</script>

ブラウザは上から読むので、書いた順番がそのまま実行順番でした。だから何も考えずに済んでいたのです。
ところが3つのパネルに分けると、HTMLとJavaScriptがどの順番で出力されるかが見えなくなります。私の環境では、JavaScriptのほうが先に実行されました。だからJavaScriptが部品を探しに行ったとき、そのHTMLはまだ生まれていなかったのです。

解決:HTMLの準備を待つ

document.addEventListener('DOMContentLoaded', function () {
	var box = document.getElementById('box');
	if (!box) return;

	// ここに本来やりたい処理を書く
});

これは特別な対処ではありません。外部のJavaScriptファイルを書くときの、ごく普通の作法です。

3つのパネルに分かれたことで、JavaScriptは「HTMLに埋め込まれたもの」から「独立したJavaScript」へ立場が変わりました。だから、普通のJavaScriptとして書けばいいのです。

AD – 読み進める前のひとやすみ

罠その2:&& が勝手に書き換えられる

こんな症状なら、ビンゴです

  • コンソールに Uncaught SyntaxError: Invalid or unexpected token と出る
  • 自分のコードには、&&(論理演算子の「かつ」)を使っている

原因

WordPressは、& という文字を「HTMLの特殊文字」として扱います。そのため、保存するときに & を & という表記に自動変換してしまうのです。
つまり、

あなたがこう書いたつもりでも——
&&

実際にページに出力されるのは——
&#038;&#038;

JavaScriptにとっては意味不明な文字列です。ここで処理が止まり、それ以降のコードは一切動きません。

確かめ方

ページ上で右クリック →「ページのソースを表示」。エラーが指す行番号を見てください。そこに &#038; があれば、犯人はこれです。

解決:&& を使わずに書く

書き換えられるのなら、最初から使わなければいい。&& を、入れ子の if に分解します。

// 変更前(動かない)
if (moved < 6 && quick) {
applyMode(modeIndex + 1);
}

// 変更後(動く)
var isTap = (6 > moved);
if (isTap) {
if (quick) {
applyMode(modeIndex + 1);
}
}

「AかつB」を「Aなら、その中でBなら」に分けただけです。動作は変わりません。

AIにコードを書いてもらっている方へ

罠その1のケースで「エラーが出ない」のは、なぜでしょう。本来なら Cannot read properties of null(無いものの中身を読もうとした)というエラーが出るはずです。

犯人は、この一行です。

if (!box) return;   // 見つからなければ、何もしない

これは「部品がなくてもエラーで止まらないように」という、親切のつもりの防御です。そしてAIにコードを書いてもらうと、たいていこれが最初から入っています。AIはどんな環境でも壊れないコードを書こうとするからです。
その親切が、失敗を静かに握りつぶします。エラーも出ず、何も起きず、手がかりも残らない。動かないのにエラーも出ないときは、この「静かに諦める一行」を疑ってみてください。

💡先に伝えておくと、スムーズです

逆に言えば、この2つの罠はAIに先回りして伝えておけば、最初から避けられます。カスタムHTMLブロックのコードを頼むときは、たとえばこんなふうに添えてみてください。

WordPressのカスタムHTMLブロックに貼るコードです。次の2点に注意してください。

  • JavaScriptは DOMContentLoaded を待ってから実行してください
  • && や < は使わないでください(WordPressに変換されてしまいます)

たったこれだけで、AIは最初から罠を避けたコードを書いてくれます。環境の癖を知っているのは、AIではなく自分のほう。そこを伝えるのが、AIとうまく付き合うコツかもしれません。

⚠️ おことわり

この2つの挙動は、2026年7月時点・私の環境(WordPress 7.0)で確認したものです。今後のアップデートで改善される可能性があります。
また罠その1は、環境によっては起こらないかもしれません。ただ、DOMContentLoaded を待つ書き方にしておけば、どちらの環境でも問題なく動きます。

最後まで読んでいただき、ありがとうございました🍵