記事のサマリー(TL;DR)
- Shopify API 2026-07 でコレクションが単一
ruleSetから複数CollectionSourceへ移行、除外条件・サブコレクション参照が追加 - 旧バージョン(2026-07 未満)では新モデルを使ったコレクションがクエリ結果からフィルタ除外されるため、移行は早急に対応が必要
- Shopify Functions の
ProductVariant型にinAnyCollection/inCollectionsフィールドが追加され、バリアント単位のコレクション判定が可能に
Shopify Plus カスタムアプリ・Functions 開発者が先行対応すべき移行ポイント
Shopify のコレクション API は 2026-07 リリースで構造が根本から変わります。これまで1つの ruleSet に全ルールを記述していた設計が廃止され、複数の CollectionSource を組み合わせるモデルへ移行します。移行前のバージョンで構築されたカスタムアプリやストアフロントは、新モデルを利用したコレクションをクエリ結果で受け取れなくなる(フィルタアウトされる)という破壊的な挙動変化が発生します。
国内で Shopify Plus を運用しているショップのうち、商品のタグ・メタフィールドを組み合わせた自動コレクションを使っているケース、あるいは Shopify Functions で割引・配送ロジックをコレクション単位で制御しているケースでは、2026-07 への API バージョンアップと合わせてクエリ・ミューテーションの書き換えが必要です。collectionCreate(input:) / collectionUpdate(input:) のように input: 引数を使うパターンは非推奨となり、新たな collection: 引数(CollectionCreateInput / CollectionUpdateInput 型)への移行が求められます。また、Checkout Extensions や Functions でバリアント単位のコレクション判定(例:特定のサイズやカラーのみをセール対象にする)を実装している場合は、ProductVariant.inAnyCollection / inCollections の活用で実装がよりシンプルになります。
詳細
GraphQL Admin API の変更点
コレクションソースと条件(Collection sources and conditions)
新しい Collection.sources フィールドは、コレクションを構成する1つ以上のソースを返します。CollectionSource インターフェースを実装する具体型は2種類です。
- CollectionConditionsSource:型付きの包含条件(inclusion conditions)とオプションの除外条件(exclusion conditions)、および手動選択によって商品を含めます。ターゲットは
PRODUCTSまたはVARIANTSをCollectionSourceTargetType列挙型で指定します。 - CollectionSubCollectionsSource:参照する1つ以上のコレクションからメンバーシップを引き継ぎます。
条件は強く型付けされており(strongly typed)、各条件は具体型と対応する入力型を持ちます。条件のマッチング挙動は CollectionConditionMatchType 列挙型で制御します。
ANY:いずれか1つの条件が一致すればよいALL:すべての条件が一致する必要がある
コレクションにソースを定義するには、collectionCreate および collectionUpdate の新しい collection 引数(CollectionCreateInput / CollectionUpdateInput 型)を使います。CollectionUpdateInput は sourcesToCreate・sourcesToUpdate・sourcesToDelete を公開しており、コレクション定義全体を置き換えることなくソースを段階的に更新できます。
シェアラブルアプリコレクションソース(Shareable app collection sources)
CollectionConditionsSource の shareable フィールドが true の場合、そのソースは呼び出しアプリが所有し、ショップ内の複数のコレクションにリンクできます。管理用の新ミューテーションが3つ追加されました。
| ミューテーション / クエリ | 用途 |
|---|---|
collectionConditionsSourceCreate |
シェアラブルソースの作成 |
collectionConditionsSourceUpdate |
シェアラブルソースの更新 |
collectionConditionsSourceDelete |
シェアラブルソースの削除(リンク中のコレクションから自動的にデタッチ) |
collectionConditionsSources(appId:) |
特定アプリが所有するシェアラブルソースの取得 |
collectionConditionsSourcesByApp |
ショップにシェアラブルソースを公開しているアプリの一覧(ページネーション付き) |
特定のコレクションにシェアラブルソースを付与するには、CollectionShareableSourceInput { sourceId } を sources または sourcesToCreate フィールドに渡します。シェアラブルソースは所有アプリのみが更新・削除できます。
使い分けの指針:同じロジックを複数のコレクションで再利用する場合のみシェアラブルソースを使う。単一コレクション向けであれば、通常のコレクションミューテーションでソースを管理する。
その他の追加点
Collection.subCollectionEligibility:コレクションをサブコレクションターゲットとして使用する際の包含・除外それぞれの適格状態を返す。非適格理由は安定したSubCollectionIneligibleReason列挙型で表現される。collectionConditionMetafieldDefinitions:呼び出しアプリのアクセス範囲にスコープされた、包含条件で使用できるメタフィールド定義を返す。CollectionSourceExclusionConditionUpdateInputにcollectionフィールドが追加され、コレクションベースの除外条件を削除・再作成なしにその場で更新できる。
Shopify Functions でのバリアント単位コレクションメンバーシップ
Shopify Functions の ProductVariant 型に2つの新フィールドが追加されました。
inAnyCollection(ids: [ID!]!): Boolean!:バリアントが指定したコレクションのいずれかに含まれている場合にtrueを返す。inCollections(ids: [ID!]!): [CollectionMembership!]!:バリアントのコレクション別メンバーシップを返す。
バリアントが「コレクションのメンバー」と見なされるのは、バリアント自体がそのコレクションに含まれている場合です。既存の Product.inAnyCollection および Product.inCollections は、バリアント単位のメンバーシップに関わらず、商品全体がコレクションに含まれている場合に true を返す挙動を継続します。
非推奨(Deprecations)
| 非推奨の要素 | 移行先 |
|---|---|
Collection.ruleSet |
Collection.sources(各ルールは対応する包含条件型にマッピング。例:タグルール → CollectionSourceInclusionConditionProductTag) |
collectionCreate(input:) / collectionUpdate(input:) |
collectionCreate(collection:) / collectionUpdate(collection:) |
レガシーの input: 引数は引き続き CollectionInput(ruleSet フィールドを含む)を受け付けますが、新しい collection: 引数のみがソースを定義できます。両方の引数が渡された場合は collection: 引数が優先されます。
移行チェックリスト:
Collection.ruleSetを読み取っているアプリはCollection.sourcesへ切り替えるinput.ruleSetを書き込んでいるアプリはcollection:引数の新しいソース定義へ切り替える- API バージョンを 2026-07 以降にアップグレードする(しないと新モデルのコレクションがクエリ結果から除外される)
- Functions でバリアント単位のコレクション判定が必要な場合は
ProductVariant.inAnyCollection/inCollectionsを使う