【オーナーコラム#53】SWELLのカスタムHTMLが動かない。Claudeに10のルールを記憶させたら止まりました

【オーナーコラム#53】SWELLのカスタムHTMLが動かない。Claudeに10のルールを記憶させたら止まりました

2文字です。

&&

これを書いた瞬間、JavaScriptが丸ごと動かなくなっていました。

原因にたどり着くまで、同じコードを3回書き直しています。

WordPress(SWELL)+ミックスホスト。カスタムHTMLブロックに自作のコードを埋め込む。私はこの構成をほぼ全サイトで使っています。

そのたびに同じエラーを踏んでいました。

結論を先に書きます。AIに毎回説明するのをやめて、ルールを記憶させたら止まりました。

指示文は最後にそのまま置いてあります。

目次

◆&&を1箇所書くだけでスクリプト全体が死ぬ

症状はこうです。

コードは普通に貼れる。エディタ上でもエラーは出ない。でも公開すると動かない。

F12でConsoleを開くと、赤字で Uncaught SyntaxError が出ています。

原因は、WordPressが保存時に && を && にエスケープすることでした。

貼った瞬間に別の文字列に書き換わる。

JSから見れば意味不明な記号なので、その行で構文解析が止まり、スクリプト全体が停止します。

厄介なのは、コメント内に書いた && でも同じことが起きる点です。

1箇所でもあればアウト。

対処は単純で、複数条件をネストしたifに書き換えるだけです。

// NG
if (a === 1 && b === 2) { ... }

// OK
if (a === 1) {
  if (b === 2) { ... }
}

|| は問題なく動きます。壊れるのは & が連続する形だけです。

つまりこれは、AIが書いたコードが下手なのではありません。

WordPressの保存処理の仕様です。

裏返せば、最初から && を禁止しておけば二度と起きません。

同じ理由で、シングルクォートと生の & も避けています。文字列はダブルクォートのみ。HTMLを文字列で組み立てず、document.createElement と textContent で作る。こうすると手動エスケープが一切不要になります。

見出しが見にくいのはテーマと二重になっているから

埋め込みブロックの中で h2 を使うと、自分で設計したデザインの上にSWELLの装飾が重なります。

背景色、枠線、::before の飾り。

SWELLは .post_content h2/h3 に :where() でこれらを当ててくるので、何もしなければ必ず干渉します。

結果、その見出しだけ浮いて、読みにくくなる。

私は最初、h2/h3 を使わず div class="xxx-h2" で代替していました。

見た目の問題はこれで消えます。

ただ、これは損をします。

見出しが div だと、検索エンジンにもLLMにも「ここが節の区切り」と伝わりません。

見た目の問題を、構造を壊して解決してはいけません。

なので2026年9月に、このルールは廃止しました。

今の方針は4つです。

  • h2/h3 は実タグで書く
  • SWELLの装飾は !important で完全に潰す
  • h1 は本文に置かない(SWELLが記事タイトルで出力済み。書くと二重h1)
  • 全ての h2/h3 に id を付ける(目次・アンカー・LLMの節参照に効く)

リセットCSSはこの形で固定しています。スコープ名だけ都度差し替えます。

.ao-block h2,
.ao-block h3 {
  background: none !important;
  background-color: transparent !important;
  border: none !important;
  border-radius: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
  box-shadow: none !important;
}
.ao-block h2::before,
.ao-block h2::after,
.ao-block h3::before,
.ao-block h3::after {
  content: none !important;
  display: none !important;
}

このリセットを書いた後に自前のデザインを当てる。順序が逆だと効きません。

詳細度だけなら :where() に既に勝っていますが、テーマ更新やプラグイン競合で崩れる事故を防ぐため !important を明示しています。

id は sec-01 のような連番より、内容が分かる英小文字スラッグ(price-plan など)にしてください。目次のアンカーもLLMの節参照も、こちらの方が効きます。

入れてはいけないタグと貼ってはいけないブロック

記事本文に入れるコードに、次のタグを含めてはいけません。

<!DOCTYPE> <html> <head> <body> <title> <meta>

AIに「HTMLを書いて」と頼むと、まず間違いなくこれらが付いてきます。

完全なHTMLファイルとして出力しようとするからです。

WordPressはこれらを除去するか、壊します。レイアウトが崩れる原因のかなりの部分がこれでした。

貼り付け先も固定です。必ずカスタムHTMLブロック。

段落ブロックに貼ると、自動整形で <p> が挟まって崩れます。

CSSは全セレクタを .スコープ名 配下に入れ、.スコープ名 *, .スコープ名 *::before, .スコープ名 *::after { box-sizing: border-box; } も明示してください。

SWELLのcontainer paddingでレイアウトが崩れるのを防げます。

ミックスホスト側で起きること:Imunify360

ここからはSWELLではなくサーバーの話です。

ミックスホストは全サーバーにImunify360というAI型の保護機能が標準で入っています。

「少々お待ちください…」という緑のスピナー画面。あれです。

問題は、この画面がHTTPステータス200で返ることでした。

検索エンジンから見ると「このページの内容はcaptcha画面である」と解釈されかねません。

私の環境では、GPTBot・ClaudeBot・PerplexityBotのUser-Agentで高い割合でこれが返っていました。

そして、これはcPanelでは設定できません。

cPanelに「Imunify360」の項目はありますが、マルウェアスキャンの結果を見るだけの画面です。無効化も頻度変更もできないと公式ヘルプに明記されています。

ここでModSecurityを触ってはいけません。

cPanelに項目があってON/OFFできるので間違えやすいのですが、別物です。ModSecurityは弾くとき403を返します。captcha画面は200なので犯人ではありません。切っても解決せず、防御が落ちるだけです。

対処はサポートへの依頼になります。

依頼内容は4つ用意して、通るものから拾う形にしました。

  1. 当ドメインをcaptchaの対象外にしてもらう
  2. robots.txt sitemap.xml llms.txt と /wp-content/ 配下を対象外にしてもらう
  3. GPTBot・ClaudeBot・PerplexityBot等をホワイトリストに追加してもらう
  4. 上記が難しい場合、captcha画面を200ではなく503で返してもらう

4番が一番現実的で、一番効きます。503は「一時的に応答できない」という意味なので、Googleは既存の評価を保持したまま再訪します。1〜3が断られても、4は粘る価値があります。

あわせて、LiteSpeed Cacheの「すべてパージ」を一度実行してください。captcha画面が一度キャッシュされると、全員に配信されます。

ただし、連絡する前に確認してください。

Search Consoleの「公開URLをテスト」→「テスト済みのページを表示」→「HTML」タブ。ここに正常なHTMLが出るなら、実害はありません。放置で構いません。

数回試して判断してください。確率的に出るので、1回では分かりません。

AIクローラーはJavaScriptを実行しない

最後にもう1つ。

本文の主要コンテンツをJSで生成してはいけません。

カード一覧、内部リンク、比較表。こういったものをJSで組み立てると、AIクローラーからは空白のページに見えます。

ブラウザでは完璧に見えているので、気づけません。

主要コンテンツは静的HTMLで直書き。JSは装飾と補助だけ。

これは埋め込みに限った話ではなく、LLMO全体の原則です。

コピペ用:Claudeに記憶させる指示文

ここまでの全てを、AIへの指示に落としたものです。

そのままコピーして、Claudeに「これを記憶してください」と渡してください。以降、毎回説明する必要がなくなります。

SWELL(WordPress)埋め込み用HTML/JSを書くときの必須ルール【最重要】

(1) JSで && 演算子を絶対に使わない。コメント内も含めて1箇所も書かない。
    WordPressが &#038;&#038; にエスケープしてJS全体が構文エラーで停止する。
    複数条件はネストifで書き換える。|| は問題なし。

(2) 記事本文に入れるコードに <!DOCTYPE> <html> <head> <body> <title> <meta>
    を含めない。WordPressが除去するか壊す。

(3) 見出しは h2/h3 の実タグで書く(SEO・LLMO評価のため)。h1〜h3の文書構造を
    意識すること。h1はSWELLが記事タイトルとして出力するため本文内には置かない
    (二重h1回避)。SWELLの .post_content h2/h3 による背景色・枠線・::before
    等の装飾は、スコープ内で !important 付きのリセットCSSを書いて完全に無効化
    する。全 h2/h3 に内容が分かる英小文字スラッグの id を付与し、アンカーリンク・
    目次・LLMの節参照に対応させる。

(4) 全CSSセレクタを .スコープ名 でスコープ化し、
    .スコープ名 *, .スコープ名 *::before, .スコープ名 *::after
    { box-sizing: border-box; } も明示する。

(5) JSは IIFE で包み、"use strict" を宣言し、var を使う。
    全ての getElementById の戻り値に null チェックを入れる。
    document.readyState をチェックし、DOMContentLoaded 発火済みでも動くようにする。

(6) 貼り付け先は必ず「カスタムHTML」ブロック前提で書く。

(7) JSでHTML文字列を組み立てない。document.createElement / textContent /
    setAttribute / appendChild で構築する。

(8) JSの文字列はダブルクォートのみ。シングルクォートを1箇所も使わない。

(9) 正規表現や文字列に生の & を書かない。DOM APIを使えば手動エスケープは不要。

(10) 本文の主要コンテンツ(カード一覧、内部リンク等)はJSで生成せず静的HTMLで
     直書きする。AIクローラーはJSを実行しないため。

記憶させてから、何が変わったか

以前は、1つの埋め込みコードを完成させるのに3〜4往復かかっていました。

書く、貼る、動かない、Consoleのエラーを貼る、直してもらう。

今は1回で通ります。

見出しの装飾崩れも起きません。

これは根性や慣れの問題ではなく、指示の設計の問題でした。

同じことを毎回説明しているなら、それは記憶させる対象です。

AIに毎回説明している内容をメモに書き出して、丸ごと記憶させてください。

レンタルフレンドの予約方法と、ご利用の流れ

内向的・人見知りの女性のためのレンタルフレンドです。対面は60分3,000円、通話は初回限定15分500円から。予約も相談も、LINEかXのメッセージで完結します。

  1. ステップ1:フレンドを選ぶ

    プロフィール一覧か、6つの質問に答える相性診断(約2分)から選べます。決められないときは、運営に相談できます。

    フレンド一覧と相性診断を見る
  2. ステップ2:日時と場所を決める

    日時や場所、話したいことをメッセージで相談します。料金はオンライン決済(MOSH)で事前にお支払いいただきます。

    対面・通話の料金システムを見る
  3. ステップ3:当日、ふたりしずかに

    カフェやお散歩、通話など、ご希望の形で過ごします。話す内容も、沈黙も、あなた次第です。

LINEかXで、予約・相談する

ニックネームのままで大丈夫です。返信は8:00〜22:00(時間外は翌日)。

会いたいフレンドが決まっている方

フレンドの名前と希望日時を送ってください。日程が決まったら、オンライン決済の案内をお送りします。

キャンセルは48時間前まで無料です。

そのまま送れる文面

サイトを見て、予約の連絡をしました。 フレンド:(お名前) 形式:対面/通話 希望日時:(第1〜第3希望) 場所:(対面の場合、最寄り駅など)

誰がいいか決められない方

プロフィールを見ても決められない。知らない相手にメッセージを送るのが怖い。そんなときは、運営に匿名で相談できます。お話をもとに、合いそうなフレンドを数名ご提案します。ご提案は無料です。

いきなり会うのが不安なら、初回限定15分500円の通話から始められます。

15分の通話だけを利用した体験談を読む

そのまま送れる文面

サイトを見て、フレンド選びの相談をしたいです。 話したいこと:(ひとことでOK) 形式:対面/通話 エリア:(都道府県や最寄り駅) 希望日時:(だいたいでOK)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次