動的に設定したSectionを他ページにも同じ設定で追加したい

Topic summary

課題:
Dawnテーマを使用し、Homeページで動的に設定したSection(blocksで複数のCollectionを設定)を、ProductsやCollectionsなど他のページにも同じ設定で追加したい。現状では各ページで同じ作業を繰り返す必要があり、手間がかかっている。

試した方法:

  1. settings_schema.json - blocksやrepeaterが非対応で断念
  2. theme.liquidにSection追加 - メインコンテンツ({{ content_for_layout }})内に配置できず
  3. JavaScriptのappendChild()で移動 - 意図通り動作したが、HTMLエラーが発生

解決策(Takase_Rより):

  • common.jsonファイルを作成し、theme.liquid{% sections 'common' %}として読み込む
  • common_target.liquidを作成し、各ページのテンプレートに配置
  • 重要: JavaScriptの実行タイミングをwindow.addEventListener('load', function(){})で調整することでHTMLエラーを回避

その他の提案:
メタオブジェクトを使用する方法も提案されたが、質問者はテーマ編集内での実装を希望。最終的にTakase_Rの方法で解決し、質問者は感謝を表明。

Summarized with AI on November 17. AI used: claude-sonnet-4-5-20250929.

まずやりたいこととしては、

Homeページなどで動的に設定したSectionを、他のProductsやCollectionsといったページでも設定を保持したままSectionを追加したいというものです。

Dawnテーマを使用して、Sectionはblocksで複数のCollectionを設定できるようにしています。

このCollectionを複数設定するSectionは他のProductsやCollectionsといったページでも同じ設定をするため、Collectionを設定する同じ作業がページ分繰り返すことになってしまい、手間になってしまいます。

この手間を解消するために、1箇所でCollectionを設定して他のページでもそれが自動で反映されるような仕組みを作りたいと思ってました。

そのために試したものが、以下になります。

1. settings_schema.json からCollectionを追加する

settingsからであれば各ページから参照できると思いましたが、typeの blocks や repeater が対応していないため、これはできませんでした。

2. theme.liquid にSectionを設定する

Layoutであるtheme.liquidにCollectionを設定するSectionを追加することで設定を一つにはまとめることはできましたが、メインコンテンツである {{ content_for_layout }} の中の構造には入れ込むことができなかったので、これも残念してます。

3. 2.の方法をjsのappendChild()で任意の場所へ無理やり移動

2.の方法ではメインコンテンツの中に入れ込むことができませんでしたが、jsのappendChild()を使って移動させる方法を試みました。

Layoutに追加したCollectionを設定するのSectionを querySelector() などで要素ノード取得します。わかりやすく、ここで取得したSectionを S1 とします。

S1を任意の場所へ移動させる先となるSectionを用意します。これはTemplatesのSectionで、これも同様に querySelector() などで要素ノードを取得します。これは S2 とします。

Layoutで設定した S1 を、Templatesでメインコンテンツ内の任意の場所に置くための S2 に置くために S2.appendChild(S1); で移動させてみました。

図のような感じで実装を試みてみました。

S1はtheme.liquidに以下のようなコードを追記しています。

{%- if template == 'index' or template == 'collection' or template == 'product' -%} // Homepage,Collections,Productsだけ処理
   // Collection-S1
    {% section 'collection-list' %} // Collectionをblocksで設定するSection
  

{%- endif -%}

S2のSectionはcollection-s2.liquidとして以下のようなコードにしています。


この3.の方法は意外とうまく処理はしてくれていました。

意図した処理にはなったものの、以下のHTMLエラーの判定に引っかかってしまいました。

HTML error found
Broken HTML has been detected in your theme's sections/collection-list-to.liquid file. Check that there are no missing or extra HTML tags present.
If you haven't made changes to this code, contact support for help resolving the issue.

エラーは出ているものの通常通り動いてはくれていますが、このエラーをなんとか消したいと思っています。

上記試した方法以外で何か妙案があればご教授いただけたら幸いです。

Homeページなどで1箇所で動的に設定したSectionを、他のProductsやCollectionsといったページでも設定を保持したままSectionを追加するにはどのような方法がありますでしょうか。

はじめまして、Takaseと申します。

こちら気になったので自分の仮環境で試してみました。

試したテーマはdawnでバージョンは11.0.0になります。

  1. セクションファイルにcommon.jsonファイルを作成

  2. theme.liquidの任意の箇所でcommon.jsonとそれを囲む要素を記述


      {% sections 'common' %}
    

  1. セクションファイルにcommon_target.liquidを作成

{% schema %}
{
"name": "共通パーツ移動先セクション",
"settings": [
],
"presets": [{
  "name": "共通パーツ移動先セクション"
}]
}
{% endschema %}

4.common_target.liquidをコレクションページのテンプレートなどに設置

上記で試してみたところ、自分の環境ではHTMLエラーは出ずに今回やりたいことを実現できました。

window.addEventListener(‘load’, function () {}); を外してみたところHTMLエラーがでたので、javascriptの読み込みタイミングが影響してエラーが出ていたようです。

※上記のコードだと、共通セクションはどのページにも表示されてしまうので

{%- if template == ‘index’ or template == ‘collection’ or template == ‘product’ -%}

{%- endif -%}

などで適宜調整は必要かと思います。

1 Like

liquidの読み書きが可能なのであれば以下の方法が検討できるかなと思います。

  1. 該当のコレクション用のセクションを複製
  2. 複製したセクション内でコレクションを設定する箇所を探し、メタオブジェクトを使う形に書き換える
  3. 複製したセクションを配置

以上ですが、趣旨を勘違いしていましたら申し訳ありません。

1 Like

検証いただきありがとうございます。

処理順番に関しては検証抜けておりました…

こちら記載いただいた通りに load してから実行したところ、確かにエラーは出なくなることを確認しました。

行き詰まっておりましたので助かりました。

ありがとうございます。

※の指摘もありがとうございます。

こちら検証のところでまだDefaultでしか運用をしていなかったのでこのようにしておりました。

内容に合わせて適宜調整したいと思います。

1 Like

ありがとうございます。

できればテーマ編集内で実装したいところでしたので、メタオブジェクトを使用するのは想定しておりませんでした。

しかし、そのようなやり方もあるという気づきにもなりました。

ご教授いただきありがとうございます。