Shopify オリジナルテーマの実装 〜テーマエディタとスキーマ記法〜

スキーマ記法を使って、Shopifyの管理画面から自由にサイトをカスタマイズできるテーマを作る方法

本記事は私達の会社で作ったShopifyテーマ開発入門書『Hello Shopify Themes Shopifyテーマ開発ガイド』からの抜粋です。


本節では、セクションファイルの {% schema %} タグおよび、コンフィグファイルの config/settings_schema.json で記述するJSONスキーマの詳細を紹介します。

スキーマ:テーマエディタとの関連づけを定義するJSON記述

本書では既に何度か触れてきましたが、スキーマとは、テーマエディタとの関連づけを定義するJSON記述のことです。
スキーマの内容に基づいて、テーマエディタ上で操作可能な設定項目が定義されています。次に示すのは、セクションファイル内のスキーマ記述サンプルです。

{% schema %}
{
  "name": "Sample",
  "settings": [
    {
      "type": "text",
      "id": "title",
      "default": "Sample",
      "label": "Sample Txt"
    }
  ]
}
{% endschema %}

スキーマは、次のファイルで記述できます。
 

  1. セクションファイル内の {% schema %} タグ
  2. config/settings_schema.json ファイル

セクションファイルのセクションスキーマと、 config/settings_schema.json のスキーマは、相違点もあるものの、多くの共通点を持ちます。
個々の特徴を見ていきましょう。

settings_schema.jsonスキーマの特徴

settings_schema.json の特徴については前節「4-4. テーマファイル解説」のコンフィグファイル解説パートでも言及しましたね。
settings_schema.json は、テーマ名称などのテーマのメタデータの他に、テーマ設定を定義するスキーマを記述できます。サンプルコードは次のとおりです。

config/settings_schema.json

[
  {
    "name": "theme_info",
    "theme_name": "テーマの名称",
    //メタデータ定義のため省略
  },
  {
    "name": "SNSアカウント情報",
    "settings": [
      {
        "type": "text",
        "id": "social_facebook_link",
        "label": "Facebook"
      }
    ]
  }
]

settings_schema.jsonスキーマで記述可能な属性

settings_schema.json スキーマは、テーマ設定を定義し、テーマエディタから編集可能なテーマ全体に関わる設定を作成できます。
スキーマ内部には namesettings の2属性が必ず必要です。

属性 概要
name 設定の名称(必須)
settings テーマ設定の配列を定義

Dawnの settings_schema.json を見てみると、 namesettings 属性で定義された設定項目がたくさん記述されているのが分かるかと思います。

ここでキーとなるのが settings 属性です。
settings 属性はセクションスキーマでも記述でき、そちらではテーマ設定ではなくセクション設定とブロック設定を定義することになります。
settings 属性の記法は、 settings_schema.json スキーマとセクションスキーマ間で共通です。本節で詳しく後述します。

セクションスキーマの特徴

一方のセクションスキーマは、セクション設定とブロック設定、テーマエディタ上のセクションの挙動を定義するスキーマです。
セクションファイルの {% schema %} タグ内に記述します。セクションスキーマを記述しなければ、セクションをテーマエディタから操作することはできません。
サンプルコードは次のとおりです(「3-2. 動的セクションとブロックの作成」で作成したコードから一部抜粋)。 settings_schema.json スキーマよりも明らかに記述できる属性が多いのが分かりますね。

sections/faq.liquid

{% schema %}
{
  "name": "FAQ",
  "settings": [
    {
      "type": "text",
      "id": "title",
      "label": "FAQ"
    }
  ],
  "blocks": [
    {
      "type": "faq_item",
      "name": "FAQ項目",
      "settings": [
        {
          "type": "text",
          "id": "title",
          "label": "質問を入力してください"
        }
        //略
      ]
    }
  ],
  "presets": [
    {
      "name": "FAQ"
    }
  ]
}
{% endschema %}

セクションスキーマで記述可能な属性

セクションスキーマ内に含められる属性は次のとおりです。

属性 概要
name テーマエディタ上に表示されるセクションの名称
tag レンダリング時の親要素HTMLをdiv以外に変更
class レンダリング時の親要素HTMLに付与するclassを指定
limit 該当セクションを追加できる上限数を指定
settings セクション設定の配列を定義
blocks セクション内のブロック配列を定義。アプリブロックにも関連
max_blocks ブロック配列の上限数
presets JSONテンプレートへの動的セクション追加に対応させる記述
default 静的セクション追加時に利用するpresets代替
locales テーマエディタへ表示される文言を翻訳
enabled_on 動的セクションを追加できるテンプレートの制限
disabled_on 動的セクションを追加できるテンプレートの制限

先程 settings_schema.json スキーマの解説で述べた settings 属性に注目してください。セクションスキーマの settings 属性はセクション設定を定義します。
さらに、上記の表の blocks 属性もまた、内部に settings 属性を持つことができ、そちらはブロック設定を表します。
 
本書では、テーマ設定・セクション設定・ブロック設定を定義する settings 属性と、オリジナルテーマの開発で頻繁に扱う blockspresets属性の詳細を解説します。
その他の属性の詳細は、公式ドキュメントを参照してください。

settings属性:テーマ設定・セクション設定・ブロック設定の定義

まずは settings 属性の記法から掘り下げていきます。
本節で前述してきたとおり、 settings 属性は次の特徴を持ちます。

  • settings_schema.json スキーマおよびセクションスキーマで記述する属性
  • テーマ設定・セクション設定・ブロック設定を定義する
  • 記述される箇所によって定義できる設定が異なる
  • settings 属性の記法は、記述箇所が変わっても共通

settings 属性に基づいてテーマエディタ上のUIが定義され、入力された値をLiquidに出力できるようになります。
設定の振る舞いについては、公式ドキュメント上でも独立したページが用意されているので、併せて参考にしてください。

テーマ設定・セクション設定・ブロック設定について

これらの3設定について、本書では随所で言及していますが、情報が散らばってしまっているのでここで概要を再掲します。
いずれの設定も、テーマエディタから操作可能な項目であり、テーマエディタで登録された値をLiquidオブジェクトとして出力できるのは共通です。

テーマ設定」は、テーマ全体に関わる設定項目です。 settings_schema.json スキーマで記述します。
テーマ設定の項目はグローバルなLiquidオブジェクトとして、テーマ内のどこからでも利用できます。次のコードは記述例です。

{{ settings.title_sample }}

より詳しく:「4-4. テーマファイル解説」コンフィグファイル解説パート

 

セクション設定」は、セクションごとに作成できる設定項目です。
セクション設定の項目はセクションオブジェクトとして、セクションファイルおよびセクションファイルに読み込んだスニペットファイル内で利用できます。記述例は次のとおりです。

{{ section.settings.title_sample }}

より詳しく:「3-2. 動的セクションとブロックの作成」及び「4-4. テーマファイル解説」セクションファイル解説パート

 

ブロック設定」は、セクション内のブロックごとに作成できる設定項目です。
セクションオブジェクトの section.blocks 配列内に個々のブロック設定が含まれるため、Liquid上ではループ出力と組み合わせて利用します。

{% for block in section.blocks %}
  {{ block.settings.title_sample }}
{% endfor %}

より詳しく:「3-2. 動的セクションとブロックの作成」及び「4-4. テーマファイル解説」セクションファイル解説パート

設定カテゴリ:サイドバー設定と入力設定

settings 属性が定義できる設定には2つのカテゴリがあります。「サイドバー設定」と「入力設定」です。 入力設定はテーマエディタ上でマーチャントが入力可能なUIを作成します。サイドバー設定はこれらのUIに対する補足情報です。

次に示すのは、Dawnのおすすめ商品セクションsections/product-recommendations.liquidのテーマエディタ上キャプチャです。
サイドバー設定に当てはまるのは、「動的レコメンデーションでは〜」というサイドバー冒頭の文言と、「商品カード」の見出し文言です。その他の入力項目は入力設定として定義されています。
 
設定カテゴリの例
設定カテゴリの例

それぞれ、次のような形で表します。

"settings": [
  {
    "type": "サイドバー設定のタイプ",
    "content": "サイドバーに表示するヘッダー文言"
  },
  {
    "type": "入力設定のタイプ",
    "id": "入力設定のID",
    "label": "入力欄の名称ラベル",
    "info": "入力欄に関する説明文",
    "default": "デフォルトの入力値"
  }
]

サイドバー設定

標準属性として typecontent 属性を持ちます。
テーマエディタ上に見出し・文言を表示させ、マーチャントに入力欄補足情報を提供できます。必要に応じて追加すると良いでしょう。

属性 概要
type 設定可能な値は header もしくは paragraph のどちらか(必須)
content テーマエディタへ表示される文言(必須)

入力設定

標準属性として以下の5属性を持ちます。
type 属性の設定次第で一部変化します

属性 概要
type 入力設定のタイプ。20種類以上のさまざまな値を設定可能(必須)
id 入力設定のID。セクションスキーマ内で一意であること(必須)
label テーマエディタ上に表示される名称ラベル(必須)
info 入力欄に関する説明文(任意)
default デフォルトの入力値(任意)

id は任意の文言で指定し、Liquid内で {{ section.settings.設定したid値 }} と記述することで、該当設定に入力された値をレンダリングできるようになります(id値が title_sample であれば {{section.settings.title_sample}} という具合です)。
id値がひとつのファイル内で重複するとエラーになるため、一意の値を指定してください。
 
他の labelinfodefault 属性は任意文言を指定するだけなのでシンプルですが、入力設定の type 属性は少しややこしいです。

type属性について

本属性に設定する値によって、テーマエディタ上の入力欄UIが変わります。
自由な値が設定できる訳ではなく、Shopifyから提供されているタイプの中から選択する必要があります。
 
基本的な入力タイプは次の7点です。HTMLの <input> 要素における属性と対応しています。

入力タイプ値 概要
checkbox チェックボックス。デフォルト値はfalse
number 数値入力欄。文言は入力不可
radio ラジオボタン。選択内容を options 属性に配列として設定する
range 範囲選択欄。追加属性として minmaxstepunit が設定可能
select ドロップダウン選択欄。選択内容を options 属性に配列として設定する
text 1行のテキスト入力欄。 placeholder 属性を追加可能
textarea 複数行のテキスト入力欄。 placeholder 属性を追加可能

上記以外の特殊な入力タイプも20点以上存在します。Shopify上のブログ記事や商品を受け付けられる入力欄の他、色情報の選択やURLを含められるものまでさまざまです。
利用頻度の高いものを以下に紹介します。

入力タイプ値 概要
article ストア上のブログ記事を選択可能
blog ストア上のブログを選択可能
collection ストア上のコレクションを選択可能
color カラーピッカーフィールド
font_picker Shopifyフォントライブラリから任意のフォントを選択可能
html HTML入力欄。iframeなどの入力に
image_picker 画像選択欄。新規画像のアップロードも可能
link_list ストア上のメニューを選択可能
liquid Liquid入力欄
page ストア上の固定ページを選択可能
product ストア上の商品を選択可能
richtext リッチテキスト入力欄。リンク挿入や太字などが可能
url URL入力欄。ストア上のブログ記事や商品なども選択可能

個々の入力タイプ詳細については、公式ドキュメントを参照してください。

設定関連の解説はここまで

settings_schema.json スキーマとセクションスキーマの共通事項である settings属性の記法解説は以上です。
テーマ設定・セクション設定・ブロック設定のいずれで使うにせよ、「サイドバー設定と入力設定の2カテゴリがある」ことと、「入力設定のtype属性に記述する値によって、テーマエディタ上の入力欄UIを変更できる」ことは共通であるのを念頭に置いておくと、スキーマを読み解きやすくなるかと思います。

入力タイプに記述可能な値をすべて把握するのは大変なので、都度ドキュメントを参照しつつ、Dawnではどのような入力タイプが用いられているのかテーマエディタから触れてみて、徐々に慣れてゆくのが良いでしょう。

以降のパートではセクションスキーマに固有の属性を解説してゆきます。


blocks属性:テーマエディタから操作可能な配列の定義

セクションスキーマに固有の属性である blocks について掘り下げます。
ブロックは本書で何度か触れてきましたね。ブロックの概念にまだ慣れていない方は「3-2. 動的セクションとブロックの作成」も併せて参照してください。
 
blocks 属性はセクション内のブロック配列を定義します。
セクション設定を表す settings 属性の内部ではなく、外部に記述することに注意してください。
 
blocks属性は、次のような形で記述します。

{% schema %}
{
  "name": "セクションのタイトル文言",
  "settings": [
    {(省略)}
  ],
  "blocks": [
    {
      "name": "ブロックの任意名称",
      "type": "ブロックのタイプを表す任意文言",
      "settings": [
        {
          "type": "setting属性のtypeと同仕様",
          "id": "setting属性のidと同仕様",
          "label": "setting属性のlabelと同仕様"
        }
      ]
    }
  ]
}
{% endschema %}

blocks 内で定義できる属性は次のとおりです。

属性 概要
name テーマエディタに表示されるブロックの任意名称。セクション内で一意であること(必須)
type ブロックのタイプ。 settings 内の type 属性とは異なり、任意文言で設定可能。セクション内で一意であること(必須)
limit 該当ブロックの上限数(任意)
settings ブロック設定。 settings 内の id 属性はブロック内で一意であること(任意)

ややこしいことに、 settings 内の type 属性と、 blocks 内の type 属性は振る舞いが異なります。 blocks 内の type 属性は任意の文言で指定でき、テーマエディタ上のUIに関連しません。
ブロック設定は、 blocks 内の settings 属性で定義します。こちらの記法は、前述した settings 属性の解説パートを参照してください。
 
なお、ブロック配列はあくまでもセクションオブジェクトです。
配列内の個々のブロックオブジェクトにアクセスするためには、ループ出力を組み合わせる必要があります。
次に示すサンプルコードは、登録されたブロックの数だけループし、文言を出力します。

{% for block in section.blocks %}
  <p>{{ block.settings.title_sample}}</p>
{% endfor %}

section.blocks オブジェクトのループ内で、 {{block.settings.設定したid値}} と記述することで値がレンダリングされます。

補足:アプリブロックのスキーマ記述

Dawnテーマのセクションスキーマを見ていると、blocks属性内に、次のような "type": "@app" という記述が含まれていることがあります。

"blocks": [
  {
    "type": "@app"
  },
  {
    "name": "通常のブロック記述",
    "type": "ブロックのタイプを表す任意文言",
    "settings": [
      {
        //略
      }
    ]
  }
]

この @app ブロックタイプは、OS2.0に伴って追加された仕組み「アプリブロック」をサポートするための記述です。アプリブロックについては5章で詳しく紹介します。
JSONテンプレートによってレンダリングされるセクションには、この @app ブロックタイプの記述が必要です。
 
なお、アプリブロックのラップ要素として sections/app.liquid というセクションファイルが利用できます。
オリジナルテーマ開発の際は、Dawnの記述を参考に、 @app ブロックタイプと sections/app.liquid をテーマ内に含めるようにしましょう。

presets属性:動的セクションに対応させる定義

最後に、セクションスキーマの固有属性である presets 属性を紹介します。
presets 属性を記述したセクションは、動的セクションとして、テーマエディタから任意のJSONテンプレートへ自由に追加できるようになります。詳しくは「3-2. 動的セクションとブロックの作成」も参照してください。
 
presets 属性は、次のような形で記述します。

{% schema %}
{
  "name": "セクションのタイトル文言",
  "settings": [
    {
      "type": "text",
      "id": "title"
    }
  ],
  "blocks": [
    {(省略)}
  ],
  "presets": [
    {
      "name": "動的追加セクションの任意名称",
      "settings": {
        "title(※settings内のidで指定した値)": "デフォルトの入力内容"
      },
      "blocks": [
        {
          "type": "(※blocks属性内のtypeで設定した値)"
        }
      ]
    }
 ]
}
{% endschema %}

presets内で定義できる属性は次のとおりです。

属性 概要
name テーマエディタに表示される動的追加セクションの任意名称(必須)
settings 動的追加時、 settings 属性が持つデフォルトの値(任意)
blocks 動的追加時にデフォルトで含めるブロックを type で指定(任意)

必須属性はnameのみのため、次のようなシンプルな記述でも充分に成り立ちます。

{% schema %}
{
  "name": "FAQ",
  "presets": [
    {
      "name": "FAQ"
    }
  ]
}
{% endschema %}

任意属性である settingsblocks は、該当セクションをテーマエディタから動的追加した場合のデフォルト値を定義します。
名称は同じですが、 presets 内の settingsblocks 属性は、ここまで紹介してきたテーマ設定・セクション設定・ブロック設定を定義する settings 属性と、前述したブロック配列を表す blocks 属性とはまったく挙動が異なります。混同しないように注意してください。


ちょっと休憩

第4章は以上となります。おそらく本書内でもっとも情報密度の高いパートだったのではないでしょうか……読了された方、お疲れさまでした!

ここまで、主に実装の観点からオリジナルテーマ開発に役立つ情報を紹介してきましたが、テーマ開発を始める前にこれら全ての情報を頭に入れる必要はありません。
特に「4-3. Liquid文法解説」〜「4-5. テーマエディタとスキーマ記法」までのパートは、リファレンスとしての側面が強いので、実際に手を動かしてみて疑問点が出てきたら再読する……ぐらいの距離でお読みいただくのが良いのではないかと思います。
Dawnを始めとした既存テーマのカスタマイズであっても役立てられる情報を掲載しているので、直近でオリジナルテーマ開発の予定がない方も、ぜひお役立てくださいね。

さて、以降の章はいわば応用編となります。
第5章ではテーマとアプリの連携について紹介してゆきます。


私達の会社で制作したShopifyテーマ開発入門書のご購入はこちらから。
完売後の増刷予定は現時点ではございません。印刷書籍をご希望の方は、ぜひお早めにお迎えください。

  • 著者:川島さやか
  • 出版:non-standard world, Inc.
  • 判型・ページ数:B5判・248ページ
  • 価格:3,850円(税込)※PDF版同梱、送料無料

特集ページへ

記事カテゴリー