Shopify Horizon v4.4.0 アップデート解説 ― チェックアウト前の数量保存、予測検索の未対応言語、「分割払い」設定の名称変更

Shopify Horizon v4.4.0 アップデート解説 ― チェックアウト前の数量保存、予測検索の未対応言語、「分割払い」設定の名称変更

Shopify公式テーマ「Horizon」が v4.3.0 から v4.4.0 に進みました。本記事では、公式リリースノートと、コードの差分を突き合わせながら、v4.3.0 から v4.4.0 への変更内容と、ストア運営者が押さえておくべきポイントをまとめます。

前回の「v4.3.0 アップデート解説」はカートの個数表示とメモ欄の修正が中心でしたが、今回は修正が約30項目と、近年のアップデートの中でも多めです。目玉は、「チェックアウトに進む」ボタンが数量の保存を待つようになったこと、予測検索に未対応の言語で検索窓が真っ白になる不具合の修正、そして「分割払い」設定の名称変更の3つです。

今回は、公式のリリースノート(Shopify/horizonの release-notes.md)が v4.4.0 の内容に更新されています。本記事は、そのリリースノートの各項目を、ストアのテーマのGitHubリポジトリの v4.3.0 と v4.4.0 のタグの差分と照らし合わせて、対応するコードを確認しながら書いています(リリースノートの項目のうち、差分から対応するコードを特定できなかったものは、その旨を記しています)。

変更サマリー ― 「118ファイル変更」の中身

差分は 118ファイル変更 でした。ただし、そのうち 83ファイルは言語ファイル(locales/) で、新しく13言語のファイルが追加されたことと、既存の言語の文言の追加によるものです。テーマの動作に関わるのは、残りの35ファイル(JavaScript 14、Liquid 20、CSS 1、設定 1)です。

ストア運営者が気にすべき変更は、大きく次の通りです。

変更 影響範囲 対応の要否
① 「チェックアウトに進む」が数量の保存を待つ カートで数量を入力してすぐチェックアウトを押す操作 不要(自動で適用)。数量の上限を設定しているストアは動作確認
② 予測検索に未対応の言語で、検索窓が空白になる不具合の修正 予測検索に対応していない言語(アラビア語、ヘブライ語、日本語など) 不要(自動で適用)
③ 「分割払い」設定の名称変更 価格ブロックとカートの設定 要確認(設定の名前と説明が変わる)
④ 手数料(Fees)を、カートの税・送料の案内文に含められるように 手数料機能(アーリーアクセス)を使うストア 手数料を使うストアのみ
⑤ モバイルのメニュードロワーの「区切り線の色」設定を追加 モバイルのメニュードロワー 任意
⑥ ブログ記事内の画像が、横幅いっぱいに引き伸ばされる不具合の修正 ブログ記事 不要(自動で適用)

順に解説します。

変更点① ― 「チェックアウトに進む」が、数量の保存を待つようになった

カートの数量欄は、入力してから少し待って、Ajax(ページを読み込み直さない通信)で保存される作りです。このとき、保存の完了前に「チェックアウトに進む」を押すと、フォームの送信と保存の通信が同時に走ります。リリースノートには、「Check out now waits for a pending quantity save, so a rejected quantity shows its message in place of a silent failure.」(チェックアウトは、保存待ちの数量の保存を待つようになり、数量が拒否されたときは、無言で失敗する代わりに、メッセージが表示される)と書かれています。

コード内のコメントによると、数量の保存の通信と、フォームの送信が同時にあると、iOSのSafariが保存の通信を取り消し、ストア側は、ページもメッセージも返さずに、送信に応答してしまうことがあったようです。今回、assets/component-cart-items.js に、送信を一度止めて、保存の完了を待ち、問題がなければ送信をやり直す処理が加わりました。

// assets/component-cart-items.js に新設
holdCheckoutForQuantitySave = async (event) => {
  // ...数量を編集中の欄が2行以上あるときは、待たずに送信(全部の入力値を送るため)
  blurred?.blur();
  this.#debouncedOnChange.flush();   // 保存待ちを、いますぐ実行する

  let pending = CartItemsComponent.pendingQuantityUpdates;
  if (!pending.length) return;
  event.preventDefault();            // 送信を止める
  // ...保存の完了を待つ
  if (rejected) { /* 数量が拒否された: 行にエラーを出し、カートに留まる */ return; }
  button?.click();                   // 問題がなければ、送信をやり直す
};

カートのフォーム(snippets/cart-products.liquid)に、送信時にこの処理を呼ぶ指定(on:submit="/holdCheckoutForQuantitySave")が加わり、assets/utilities.js の debounce には、待っている処理を今すぐ実行する .flush() が追加されています。

💡 在庫の数量を超える入力など、数量が拒否される場面では、これまで「押しても進まない」ように見えていた可能性があります。今回の更新で、その行にエラーメッセージが出るようになります。数量の入力欄を使っているストアは、更新後に、在庫を超える数量を入力して、すぐチェックアウトを押す、という操作を一度確認しておくとよいでしょう。

変更点② ― 予測検索に未対応の言語で、検索窓が空白になる不具合の修正

予測検索(入力中に候補が出る機能)には、対応している言語の一覧があり、一覧にない言語では、候補を取得する通信が、HTTP 417のエラーで返ります。リリースノートには、アラビア語とヘブライ語が例に挙げられていますが、日本語も、この一覧に載っていません。実際に、日本語を主言語にしている検証用ストアで、候補の取得を試したところ、417のエラーが返りました(2026年11月)。

これまでは、そのエラーのとき、検索窓の中が空白になり、入力中の表示が真っ白になる動きでした。今回、assets/predictive-search.js で、417を受け取ったら、その言語は未対応とみなして、以降は候補を取得せず、検索窓の既定の表示を保つようになりました。Enterを押せば、通常の検索結果のページが開きます。

// assets/predictive-search.js
const UNSUPPORTED_LOCALE_STATUS = 417;

fetch(url).then((response) => {
  if (response.status === UNSUPPORTED_LOCALE_STATUS) {
    this.#predictiveSearchSupported = false;   // 以降は取得しない
    return '';
  }
  // ...
});

なお、候補の取得も、これまでのセクション再描画の仕組み(sectionRenderer)から、fetch に変わっています。日本語のストアでHorizonを使っている場合、これまでは、検索窓に入力しても、候補が出ない(または空白になる)状態だった可能性があります。更新後に、検索窓の見え方を確認しておくとよいでしょう。

変更点③ ― 「分割払い」設定の名称変更

価格ブロックと、カート周りのテーマ設定にあった「分割払い」(installments)の設定が、「Shop Payの決済オプションを表示する」(英語は「Show Shop Pay payment options」)に名前が変わり、説明文も加わりました。説明は、「利用可能な場合、Shop Payの分割払いおよび HSA/FSA バッジを表示します。」です。

// blocks/price.liquid / config/settings_schema.json
-  "label": "t:settings.installments",
+  "label": "t:settings.shop_pay_payment_options",
+  "info": "t:info.shop_pay_payment_options",

設定のIDは show_installments のままなので、保存済みの値は引き継がれます。ただし、名前が変わるため、設定画面で、探すときに戸惑う可能性があります。日本のストアでは、HSA/FSAは対象外ですが、設定の名前は共通です。

変更点④ ― 手数料(Fees)を、税・送料の案内文に含められるように

カートの「税込み。送料はチェックアウト時に計算されます」のような案内文(snippets/tax-info.liquid)に、手数料(Fees)を含める文言が加わりました。手数料の機能(アーリーアクセス)が有効なストア(cart.checkout_fees_enabled が true)では、「ディスカウント、手数料、送料はチェックアウト時に計算されます」のような文言に切り替わります。文言は、日本語を含む各言語のファイルに追加されています。

手数料の機能を使っていないストアには、影響はありません。

変更点⑤ ― モバイルのメニュードロワーに「区切り線の色」の設定

ヘッダーメニューのブロック(blocks/_header-menu.liquid)に、drawer_divider_color の設定が加わりました。「区切り線」をオンにしたときだけ表示され、モバイルのメニュードロワーの区切り線の色を変えられます。未設定のときは、これまでどおり、テーマの枠線の色になります。

変更点⑥ ― ブログ記事の画像が引き伸ばされる不具合の修正

テーマ全体のCSSで、画像(img)に width: 100% が指定されていたため、ブログ記事の本文に貼った画像が、設定した大きさや元の大きさではなく、本文の横幅いっぱいに引き伸ばされていました。今回、assets/base.css で、ブログ記事の本文の中の画像だけを、この指定から外しています。

/* assets/base.css */
img {
  height: auto;            /* width: 100% を、ここから外した */
}
img:where(:not(.blog-post-content img)) {
  width: 100%;             /* ブログ記事の本文の画像以外は、これまでどおり */
}

ブログ記事に、小さな画像を貼っているストアでは、更新後に、見え方が変わる可能性があります。

その他の変更

リリースノートの項目と、差分で確認できたコードの対応は、次のとおりです。

変更(リリースノートの記載) 確認できたコード
AndroidのBackボタンで、ドロワーやポップアップを閉じたあとに、ページがスクロールしなくなる不具合の修正 assets/dialog.js、assets/theme-drawer.js、assets/zoom-dialog.js。ブラウザが自分で閉じたときの close イベントを拾って、後始末をするように
お知らせバーの文字の、下にはみ出る部分(ディセンダー)が切れる不具合の修正 sections/header-announcements.liquid。overflow: visible を指定
コレクションのメニューで、コレクション画像、または最初の商品の画像を使い、後ろの商品を探さないように(描画の改善) snippets/link-featured-image.liquid。後続の商品から画像を探す処理を削除
スティッキーヘッダーで、ロゴが非表示のホームページのとき、メニューの項目がアイコンより高い位置になる不具合の修正 blocks/_header-menu.liquid、assets/header-menu.js
カートドロワーを開いたときに、ヘッダーの「その他」メニューのサブメニューの列が狭くなりすぎる不具合の修正 blocks/_header-menu.liquid。コンテナクエリで、実際の幅に応じて列数を減らす
ページの読み込み中に、モバイルのナビゲーションバーが、デスクトップのヘッダーに一瞬出る不具合の修正 sections/header.liquid(メニューの種類を先に決めるスクリプトを追加)、layout/theme.liquid(同等の処理を削除)
フッターのメールの登録の見出しが長いとき、折り返さずにはみ出る不具合/タブレットの幅で、登録ボタンが切れる不具合の修正 blocks/email-signup.liquid
スティッキーヘッダーが、PCの商品のスティッキーなメディアの上部を隠す不具合の修正 snippets/product-information-content.liquid、snippets/product-media-gallery-content*.liquid
商品詳細の長い切れ目のないテキストが、メディアを圧迫して、横スクロールになる不具合の修正 snippets/product-information-content.liquid。グリッドの列を minmax(0, …) に
レイヤードスライドショーの中のメールの入力欄などが、クリックしてもフォーカスされない不具合の修正 assets/layered-slideshow.js、sections/layered-slideshow.liquid
バリエーションを切り替えたあとに、比較価格のあり・なしで、価格が消える不具合の修正 assets/variant-picker.js(描画の元になる要素を複製してから反映)
古い商品テンプレートで、メディアのカルーセルの矢印が出ない不具合の修正 snippets/product-media-gallery-content.liquid。スキーマにないアイコンスタイルは、既定の矢印に
ボタンのフォントが「アクセント」のとき、ボタンが、アクセントフォントの太さとスタイルにならない不具合の修正 assets/base.css、snippets/theme-styles-variables.liquid
フォントの読み込みが遅れたときに、大きな文字がはみ出ることがある不具合の修正 assets/jumbo-text.js。フォントの読み込み完了で、再計測
クイック追加で、商品ページのボタンのグループに幅が指定されているとき、数量が「カートに追加」の上に積まれる不具合の修正 snippets/quick-add-modal-styles.liquid
右から左へ読む言語(アラビア語、ヘブライ語)で、カルーセルなどが、移動量を誤る、スワイプのあとに項目を飛ばす不具合の修正 assets/slideshow.js、assets/scrolling.js。RTLの向きを考慮
商品カードの角の丸みで、商品名が接する、または切れる不具合の修正(小さな一覧表示) snippets/product-card-gallery-zoom-details-styles.liquid
カルーセルの一覧で、色見本を選んだあとに、商品カードの画像が空白になることがある不具合の修正 assets/slideshow.js の変更が、関連すると考えられる
大きな画面で、商品のおすすめのブロックが、複数列ではなく、1行に1商品になる不具合の修正 今回の差分からは、対応するコードを特定できませんでした

言語ファイルでは、新しく 13言語(ベンガル語、カタルーニャ語、エストニア語、バスク語、ガリシア語、グジャラート語、ジョージア語、ラトビア語、マラーティー語、セルビア語、タミル語、テルグ語、ウクライナ語)のファイルが追加されています。このうち、タミル語、テルグ語、ウクライナ語は、今回の差分では中身が空でした。

アップデート手順

安全カスタマイズ記事で構築した upstream/horizon ブランチ運用を使っている場合は、これまでと同じ手順です。管理画面の対象テーマから「コードを編集 → ダウンロード」で最新版のファイル一式を取得し、このブランチにまるごと反映して、horizon-v4.4.0 のタグを打って管理します。

⚠️ 今回は、Shopify公式のGitHubのミラー(github.com/Shopify/horizon)の release-notes.md が、v4.4.0 に更新されていました。ただし、ミラーが、実際にストアへ配信される内容と、いつも一致するとは限りません。引き続き、実ストアから書き出したテーマ(config/settings_schema.json の theme_version)を正として、差分を確認することをお勧めします。

まとめ

v4.3.0 → v4.4.0 はアップデート推奨です。修正の数が多く、多くはストア側の操作なしで効きます。更新後に、見ておきたいのは、次の3点です。

  • カートの数量入力 → すぐチェックアウト:在庫を超える数量などで、行にエラーが出て、カートに留まること。
  • 検索窓:予測検索に未対応の言語(日本語を含む)で、検索窓が空白にならないこと。
  • テーマ設定の「分割払い」:名前が「Shop Payの決済オプションを表示する」に変わっていること(値は引き継がれる)。

今回のアップデートは、予測検索の未対応言語、右から左へ読む言語(RTL)のスライドショー、AndroidのBackボタンなど、日本以外の言語・環境への対応が目立ちました。一方で、日本語のストアでも、検索窓の空白のように、実は影響を受けていた不具合が含まれています。リリースノートを読むときは、自分のストアの言語や環境で、起きていた現象に当てはまるかを、確認する目線が役に立ちます。

テーマのファイル構成は、バージョンごとに変わりうるため、「どこを触ったか」を常に把握できるGit管理(upstream/horizon ブランチでのオリジナル追跡)が、こうした地道なアップデートでも効いてきます。