Shopifyのユーザーが使う画面にShopifyの商品情報をAPI経由で表示する方法を試してみます
ShopifyのApp Proxyを使います theme extensionの中でApp Proxy経由でAPIエンドポイントを呼ぶ形でやってみます
Shopify CLI をインストールしておきます
アプリを作ります
選択肢は自由に選んでください
$ shopify app init
Welcome. Let’s get started by naming your app project. You can change it later.
? Your project name?
✔ sample-app
? Get started building your app:
✔ Start with Remix (recommended)
? For your Remix template, which language do you want?
✔ TypeScript
自分はここで git add . && git commit -m 'init'
しておきました
都度、コミットしておくといいかもしれません
必要だったら、アプリで使うscopeを変えておきます
たとえば shopify.app.toml
を編集して write_products
を追加
[scopes]
read_products = "read_products, write_products"
変更したらデプロイが必要です
いったん、デプロイします
npm run deploy
Partner Dashboardで登録されたアプリが出てきてるはずです
theme extension を作ります
shopify app generate extension
Theme app extension
を選択します
extensions/
にディレクトリが作られます
liquidファイルを編集して、データを取得できるようにしてみます
extensions/theme-extension-sandbox/blocks/star_rating.liquid
を編集
<button onClick="handleClick()">Get data</button>
<script>
const url = '(your shopify url)/apps/test'; // あとで用意するApp Proxy URLをセット
function handleClick() {
fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Aceess-Control-Allow-Origin': '*',
},
})
.then((response) => {
console.log('ok', response);
})
.catch((error) => {
console.error('error', error);
});
}
</script>
{% schema %}
{
"name": "Star Rating",
"target": "section",
"settings": [
{ "type": "product", "id": "product", "label": "product", "autofill": true },
{ "type": "color", "id": "colour", "label": "Star Colour", "default": "#ff0000" }
]
}
{% endschema %}
url
はあと用意するApp ProxyのURLをセットします
Shopifyの管理画面でテーマ編集、theme extensionのブロックを追加します
star_rating
は、Product用になっているので、Productページで追加します
npm run dev
で動作確認します
ProductページでClickボタンが表示されていたらOK
次にApp Proxy経由で呼ばれるAPIエンドポイントを作ります
app/routes/app.test.tsx
を作成
import type { ActionFunctionArgs, LoaderFunctionArgs } from "@remix-run/node";
import { json } from "@remix-run/node";
import { authenticate } from "../shopify.server";
export const loader = async ({ request }: LoaderFunctionArgs) => {
console.log("---------loader called---------");
const { admin } = await authenticate.public.appProxy(request);
if (!admin) {
return json({ error: "admin not found" }, { status: 404 });
}
const response = await admin.graphql(
`#graphql
{
products(first: 10) {
nodes {
id
title
}
}
}`,
);
return json(await response.json());
};
export const action = async ({ request }: ActionFunctionArgs) => {
console.log("---------action called---------");
const { admin } = await authenticate.public.appProxy(request);
if (!admin) {
return json({ error: "admin not found" }, { status: 404 });
}
const response = await admin.graphql(
`#graphql
{
products(first: 10) {
nodes {
id
title
}
}
}`,
);
return json(await response.json());
};
/app/test
のエンドポイントで、lorder
がGET、action
がPOSTで呼ばれます
POSTは手抜きでProduct一覧を取るだけにしてます
POSTで商品を追加するなら、Shopify Appのscopeに write_products
を追加、productを追加するGraphQLクエリに変えると良いです
Partner dashboardでApp proxyの設定をします
npm run dev
してるPCに外部からアクセスできるURLの指定が必要です
Shopify Appを npm run dev
するとCloudflaredが使われ外部URLが発行されています
Shopify Appの設定でURLを毎回自動で発行するようにしてれば、
shopify.app.toml
に
application_url = "https://who-shareholders-complications-commissioners.trycloudflare.com"
がURLが上書きされていくので、これを使います
これを Partner dashboardでApp proxyへ登録します
Display dynamic store data with app proxies にApp ProxyのURLをどう指定したらいいか書いてあります
Subpath prefix: apps
Subpath: test
にすると、Shopifyサイトから呼ぶURLが (your shopify url)/apps/test
になります
e.g https://freks-dev-store.myshopify.com/apps/test
Proxy URLに (your shopify url)/apps/test
をたたいて呼ばれるURLを入れます
Proxy URLをpublicなものにするのに Checkout UI
extension入れる方法もあるようです
Shopify App Development | Setup App Proxy with Remix app | YouTube
ここまできたら動作確認します
theme extensionで追加したブロックのClickボタンを押すと、App Proxy経由でAPIエンドポイントが呼ばれて、Product一覧が取得できました
shopify.app.toml
の application_url
をセットしてましたが手間なので回避する方法があります
一度、Shopify Appの設定を手元の shopify.app.toml
に反映させると、npm run dev
すると application_url
が自動で更新されるようになります
npm run dev -- --reset
してあげると shopify.app.toml
に設定が落ちてくるのでこれを使っていきましょう
あまりドキュメントが充実してないところは動かすまで苦労します
この仕組みでカスタマイズの自由度があがっていいです
PR
このリンクは、アフィリエイトリンクです