📃
ShopifyAPI経由で商品の翻訳を取得・登録する
前提
- ShopifyではRestAPIとGraphQL APIが用意されているが、翻訳についてはGraphSQLでリクエストする(RestAPIではサポートされていない模様)。
- 筆者はPHPShopify\ShopifySDKを利用してGraphQLリクエストを実施しているため、応答結果はPHPの配列で取得している
取得
GraphQLで商品情報を取得する際にtranslationsを指定する(localeの指定は必須)。
query {
product(id: "gid://shopify/Product/xxxxxxxxxx") {
title
description
translations(locale: "en") {
key
value
locale
}
}
}
翻訳情報が存在する場合、translationsキー内に配列として結果が取得される
:
'translations' =>
array (
0 =>
array (
'key' => 'body_html',
'value' => '<p>Test update by API</p>',
'locale' => 'en',
),
),
:
登録
登録時には事前に翻訳可能要素のdigestを取得する必要がある。
digest取得
query {
translatableResource(resourceId: "gid://shopify/Product/xxxxxxxxxx") {
resourceId
translatableContent {
key
value
locale
digest
}
}
}
商品の場合は次のような結果が戻される。商品の場合、title, body_html, handle, product_typeに設定がきる。
:
array (
'translatableResource' =>
array (
'resourceId' => 'gid://shopify/Product/xxxxxxxxxx',
'translatableContent' =>
array (
0 =>
array (
'key' => 'title',
'value' => 'test',
'locale' => 'ja',
'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
),
1 =>
array (
'key' => 'body_html',
'value' => 'test',
'locale' => 'ja',
'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
),
2 =>
array (
'key' => 'handle',
'value' => 'test',
'locale' => 'ja',
'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
),
3 =>
array (
'key' => 'product_type',
'value' => '',
'locale' => 'ja',
'digest' => '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',
),
),
),
),
:
設定
GraphQLと設定パラメータ例は以下
GraphQL:
mutation translationsRegister(\$resourceId: ID!, \$translations: [TranslationInput!]!) {
translationsRegister(resourceId: \$resourceId, translations: \$translations) {
userErrors {
field
message
}
}
}
Parameters:
$variables = [
"resourceId" => "gid://shopify/Product/xxxxxxxxxx",
"translations" => [
[
"key" => "title",
"value" => "trans title",
"locale" => "en",
"translatableContentDigest" => "titleのdigest",
],
[
"key" => "body_html",
"value" => "trans body html",
"locale" => "en",
"translatableContentDigest" => "body_htmlのdigest",
]
]
];
上記設定で各要素に翻訳が追加できる。
(PHPShopify\ShopifySDKのGraphQL利用の標準方法で可能)
最後に
VideoコンテンツなどGraphQLでないと処理できないことが多くなっているので、RestAPIで作成しているところもGraphQLに書き直したほうが良いきがしてきている
Discussion