商品情報にスキップ
1 1
公開日:2026.04.27

【Horizon】お問い合わせフォーム送信メッセージが出ない問題の暫定対応

【Horizon】お問い合わせフォーム送信メッセージが出ない問題の暫定対応

用途

  • お問い合わせフォーム編集
詳細を表示する

Horizon v3.3.1 以降で、お問い合わせフォームの送信完了メッセージが表示されない不具合を、テーマ側でテンポラリーに修正する方法です。本来は Horizon 本体で直されるべき内容ですが、現時点で Shopify は Horizon リポジトリへの外部 PR を受け付けていないため、上流での修正が降ってくるまでのつなぎとして本対応を行います。

v3.3.1 以降の Horizon で送信完了メッセージが表示されない症状

症状

Horizon v3.3.1 以降の blocks/contact-form.liquid でお問い合わせフォームを設置した場合、フォームを正しく送信しても「お問い合わせいただきありがとうございます。早急に返信いたします。」というメッセージが 一切表示されない 状態になります。送信自体は成功しており、Shopify Admin の「お問い合わせ」セクションには通知が届いていますが、ユーザー側には何も返らないため「送れていないのでは?」という不安を残してしまいます。

v3.2.1 以前では正常に送信完了メッセージが表示されていました。v3.3.1 で導入された変更が原因のリグレッションです(後述)。

原因 — v3.3.1 で追加された form.id == form_id チェック

v3.2.1 → v3.3.1 で blocks/contact-form.liquid に以下の変更が加えられました:

  1. 同一ページに複数の contact form が共存する状況を想定して contact[id] という hidden input が追加された
  2. その自分自身の form_id と Shopify が返す form.id を比較し、一致したときだけ エラー表示/送信完了メッセージを出すように変更された

このロジック自体の意図は理解できます。ただし問題は、Shopify の Liquid Drop である {% form 'contact' %} から取得できる form.id が、id: パラメータで渡した値ではなく 常に空文字列 を返してしまう点です。結果、form.id == form_id が決して true にならず、送信完了メッセージが表示されない、という状況になっています。

デバッグ出力で実証

暫定対応のブランチ上で contact-form.liquid にデバッグ用の HTML コメントを仕込み、実際のフォーム送信後に DevTools の Elements タブから値を確認したところ、以下のような出力が得られました:

<!-- SH-DEBUG-CONTACT-FORM
  block.id                     = "shopify://apps/..."
  section.id                   = "template--..."
  form_id                      = "ContactForm-shopify://apps/..."
  form.id                      = ""                ← 期待値: "ContactForm-..."
  form.id == form_id           = false             ← 常に false
  form.posted_successfully?    = true              ← 送信自体は成功
  form.errors                  = null
-->

form.posted_successfully? は正しく true を返しているため、Shopify 側はフォーム送信を正常に検知しています。「送信完了したか」の情報はテンプレートに到達しているのに、続く form.id == form_id ガードでブロックされているのが本症状の正体です。

暫定対応 — and form.id == form_id を取り除く

修正対象は blocks/contact-form.liquid 内の 2 箇所 のガード条件のみ。各 {%- if ... -%} から and form.id == form_id を削除し、v3.2.1 以前と同じシンプルな条件に戻します。

修正内容(赤の打ち消し線部分を削除)

{%- if form.errors and form.id == form_id -%}
  <div class="contact-form__error" tabindex="-1" autofocus>
    {{- 'icon-error.svg' | inline_asset_content -}}
    {{ form.errors.translated_fields.email | capitalize }}
    {{ form.errors.messages.email }}
  </div>
{%- endif -%}

{%- if form.posted_successfully? and form.id == form_id -%}
  <div class="contact-form__success" tabindex="-1" autofocus>
    {{- 'icon-checkmark.svg' | inline_asset_content -}}
    {{- 'blocks.contact_form.post_success' | t -}}
  </div>
{%- endif -%}

赤い打ち消し線が引かれた and form.id == form_id(同じ文字列が 2 箇所)を削除するだけ。それ以外の行はそのままで OK です。

修正後の最終形(コピペ用)

{%- if form.errors -%}
  <div class="contact-form__error" tabindex="-1" autofocus>
    {{- 'icon-error.svg' | inline_asset_content -}}
    {{ form.errors.translated_fields.email | capitalize }}
    {{ form.errors.messages.email }}
  </div>
{%- endif -%}

{%- if form.posted_successfully? -%}
  <div class="contact-form__success" tabindex="-1" autofocus>
    {{- 'icon-checkmark.svg' | inline_asset_content -}}
    {{- 'blocks.contact_form.post_success' | t -}}
  </div>
{%- endif -%}

同一ページに複数の contact form を置かない通常の運用であれば、これで送信完了メッセージが正しく表示されるようになります。

注意事項 — これはテンポラリー対応です

  • 本対応はあくまでテンポラリーです。Horizon 本体(Shopify/horizon)で form.id が期待通りの値を返すよう修正される、もしくはガード条件自体が見直されることが本来の解決策です。
  • 2026年4月時点で Shopify は Horizon リポジトリに対する外部からの Pull Request を「現時点では受け付けていない(We are not accepting contributions to Horizon at this time)」と明言しています。Issue を立てることはできますが、修正タイミングは Shopify 次第になります。
  • 同一ページに複数の contact form を共存させる必要がある場合は、本対応を行わず、別の判別ロジック(例えば自前で隠し input を持たせて Liquid 側で判定する等)を検討してください。
  • Horizon が新しいバージョンで上記ガードを見直した場合、このテンポラリー対応は速やかに巻き戻し、上流の挙動に合わせてください。

テーマファイルへの影響

修正対象は blocks/contact-form.liquid の 1 ファイルのみです。Horizon のテーマ更新時には上書きされるため、更新後に毎回再適用するか、上流が直っていれば外す、という運用になります。

結論

あくまで Horizon 本体が修正されるまでのテンポラリーな対応として、blocks/contact-form.liquid から壊れているガード条件を取り除き、ユーザーに送信完了メッセージが届く状態を最低限の改修で取り戻します。上流の修正が降ってきたら、この対応は不要になります。

ご購入(すべて¥0です)いただくと、サンプルコードをご覧いただけるようになります。

すでにご購入済みの方はこちらからログインしてください。

サンプルコード

動作検証済テーマ:Horizon 3.4.0

blocks/contact-form.liquid(2 箇所のガード条件から and form.id == form_id を削除)

{%- if form.errors -%}
  <div class="contact-form__error" tabindex="-1" autofocus>
    {{- 'icon-error.svg' | inline_asset_content -}}
    {{ form.errors.translated_fields.email | capitalize }}
    {{ form.errors.messages.email }}
  </div>
{%- endif -%}

{%- if form.posted_successfully? -%}
  <div class="contact-form__success" tabindex="-1" autofocus>
    {{- 'icon-checkmark.svg' | inline_asset_content -}}
    {{- 'blocks.contact_form.post_success' | t -}}
  </div>
{%...