1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Shopify】GraphiQLでshopのmetafieldにmetaobjectを設定する

Last updated at Posted at 2024-07-18

metafieldをshopに設定したい。

管理画面/設定のカスタムデータからは「ショップ」にmetafieldを設定することができない...

じゃあどうやってshopのmetafieldを設定することができるのか?

APIで設定する

リファレンスを読むと「APIからなら設定できるよ」的な記載がありました。
(2024年7月現在)

どうしようか考えた結果、「GraphiQL」からが手っ取り早いと判断しました。
(GraphiQLの導入は調べるとすぐ出てくるのでここでは割愛します)

GraphiQLの権限について

GraphiQLのデータアクセスの権限は こちら > で変更しましょう。

とりあえず「metaobject_definitions」と「metaobjects」の「read」と「write」のチェックを追加してインストール(既にGraphiQL appをインストールしていたらもう一回インストール手順)。

※ インストールするShop URLはショップの公開URLではなく管理画面のURL

shopにメタフィールドを設定する前に

今回は設定したいmetafieldのtypeがmetaobjectだったので、metaobjectの定義情報とエントリーは予め管理画面から作成しておきました。

shopのメタフィールドを確認する

まずは自分が設定しようと考えているmetafield(ネームスペースとキー)が既にshopに存在しているかどうかを一応確認しておきます。

インストールした「Shopify GraphiQL App」で下記のqueryを実行します。

{
    shop {
        metafield(namespace:"hoge",key:"fuga") {
            id
        }
    }
}

これでnullが返ってくれば安心です。もし値が帰ってきてしまったら、namespaceとkeyを再検討しましょう。

次にこの後必要になる諸情報を取得していきます。

shopのidを調べる

{
    shop {
        id
    }
}

idは「"gid://shopify/Shop/***********"」の様な形式になります。

metaobjectの定義情報を調べる

metafieldのタイプにmetaobjectを設定する場合、そのmetaobjectの定義情報(というかid)が必要になるので事前に調べておきます。

以下のqueryを実行するとmetaobjectの定義情報が指定した件数分返ってきます。
(ただこれはもっと良い方法があると思います...)

{
	metaobjectDefinitions(first:件数) {
        nodes {
          id
          name
          displayNameKey
        }
    }
}

戻り値の中で対象のmetaobjectのidが必要になります。

metaobjectのエントリー情報を調べる

次に設定したいmetaobjectのエントリー情報を取得します。
このmetaobjectのエントリー情報は、自身で定義したmetafieldにデータを設定する際に必要となります。

{
	metaobjects(type:"定義名",first:件数) {
    nodes {
      id
      displayName
    }
  }
}

queryで必要なmetaobjectの「定義名」は自身で予め作っておいたものになります。

(これも、もっと良い取得方法があると思います...)

shopにmetafieldの定義を追加

それではいよいよshopにmetafieldを追加します。

metafieldの設定を新たに定義するので「mutation」を実行しますが、今回実行するmutationは APIのリファレンス からコピーできるので有効活用します。

mutation CreateMetafieldDefinition($definition: MetafieldDefinitionInput!) {
  metafieldDefinitionCreate(definition: $definition) {
    createdDefinition {
      id
      name
    }
    userErrors {
      field
      message
      code
    }
  }
}

次に設定したいmetafieldの「Variables(値)」の雛形もリファレンスの同じページからコピーしてしまいます。
ここで設定するmetafieldの「namespace」と「key」は先ほど存在検証をしたものを設定します。

{
  "definition": {
    "name": "任意のメタフィールド名",
    "namespace": "hoge",
    "key": "fuga",
    "description": "メタフィールドの説明文",
    "ownerType": "SHOP",
    "type": "metaobject_reference",
    "validations": {
      "name": "metaobject_definition_id",
      "value": "gid://shopify/MetaobjectDefinition/**********"
    }
  }
}

  • ownerType : 「SHOP」(半角大文字)を設定することでshopが対象となります。
  • type : 今回はmetafieldのタイプをmetaobjectにしたい場合は「metaobject_reference」にします。
  • validations : コピーしてきた雛形に「varidations」を追加します。このvalidationsで設定したいmetaobjectを指定します。

validationsとは

この「validations」とは何なのか。

ざっくり言ってしまえば、本当にそのまんまの意味で「type」で指定した「型」について、どんなデータを許可するかの設定になります。

"validations": {
    "name": "metaobject_definition_id",
    "value": "gid://shopify/MetaobjectDefinition/**********"
}

「name」は検証する対象を、「value」は許可する値を設定してあげます。

なので今回は「どのmetaobject」を許可してあげるのかを設定します。

  • name : metaobjectの定義IDを検証させたいので「metaobject_definition_id」
  • value : 許可するのはどの定義IDなのか。

漸くここで先ほど調べた、metaobjectの定義IDが必要となります。
「metaobjectのid」ではなく「metaobjectの定義id」という点に注意してください。

mutationを実行 (metafieldを作成する)

これでmutationとvariablesが整ったので実行すればshopにmetafieldが作成されます。

では本当に定義できているのか確認してみましょう。

{
    shop {
        metafield(namespace:"hoge",key:"fuga") {
          id
        }
	}
}

これで戻り値がnullでなければshopにmetafieldの定義ができていることになります。

では次にこのmetafieldにmetaobjectのエントリーを設定していきます。

metafieldに値を設定する

それではshopに定義したmetafieldにmetaobjectのエントリーを設定していきます。

ここでも必要なmutationは リファレンス よりコピーしてきます。

mutation MetafieldsSet($metafields: [MetafieldsSetInput!]!) {
  metafieldsSet(metafields: $metafields) {
    metafields {
      key
      namespace
      value
      createdAt
      updatedAt
    }
    userErrors {
      field
      message
      code
    }
  }
}

そしてVariablesの雛形も持ってきて適宜書き換えます。

{
  "metafields": [
        {
        "namespace": "hoge",
        "key": "fuga",
        "ownerId": "gid://shopify/Shop/***********",
        "type": "metaobject_reference",
        "value": "gid://shopify/Metaobject/***********"
        }
	]
}

metafieldのnamespace,keyは先ほど設定した値を、ownerIdは取得したshopのidを設定します。

そして「type」について、今回は「metaobject」自体なので「metaobject_refernce」を、
「value」は先に取得しておいた「metaobject」のエントリーidを設定します。
(どちらもmetaobjectの定義ではないので注意してください)

このmutationを実行すれば漸く

「shop」の
「metafield」に
「metaobject」の
「エントリー」が
登録完了になります。

あとはliquidなりで必要な時に取得して使うことができます。

{{ shop.metafields.hoge.fuga.value }}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?