ShopifyでBoothのBOOST↑機能のように特定の商品に対して金額を上乗せして購入できる機能を作成したいのですが、実現可能でしょうか。
Shopifyのデフォルト機能でチップ機能がありますが、これは商品に紐づかないのと、最大でも注文の合計金額までの制限があるので、金額の制限なしに商品のバリアントに紐づけられるようにしたいです。
もし実現可能であれば方法を教えていただけるとありがたいです。
ShopifyでBoothのBOOST↑機能のように特定の商品に対して金額を上乗せして購入できる機能を作成したいのですが、実現可能でしょうか。
Shopifyのデフォルト機能でチップ機能がありますが、これは商品に紐づかないのと、最大でも注文の合計金額までの制限があるので、金額の制限なしに商品のバリアントに紐づけられるようにしたいです。
もし実現可能であれば方法を教えていただけるとありがたいです。
@nekonoha 以下の方法で商品に対して金額を上乗せできます。ご検討お願いします。
Shopify Functions の一部である Cart Transform を使用すると、カートのアイテムに対して動的な変更が可能になります。これを Checkout UI Extension と組み合わせることで、購入者が入力した金額を基にカートを更新し、任意のチップ金額を追加する仕組みを構築できます。
なお、shopify plusプランでないとこちらは実現できません。
※ 以下、shopify appをの知識がある前提の説明ですので一部省略しています。
詳細はBuild an extension-only appをご確認ください。
shopify app generate extension --template=checkout_ui
shopify.extension.tomlの例:
[[extensions.targeting]]
module = "./src/Checkout.tsx"
target = "purchase.checkout.cart-line-item.render-after"
src/Checkout.tsx`の例:
チップ代の上限は要件に合わせて変更してください。
import {
reactExtension,
Stepper,
useCartLineTarget,
useApplyCartLinesChange,
} from "@shopify/ui-extensions-react/checkout";
// 各line itemにチップ代を追加するコンポーネント追加
export default reactExtension(
"purchase.checkout.cart-line-item.render-after",
() =>
3.UI Extensionをデプロイします。
```markup
shopify app deploy
なお、UI ExtensionについてはCheckout Blocks アプリでも実装可能です。
Cart Transform Function を使用して入力されたチップ金額を商品価格に上乗せするロジックを実装します。
shopify app generate extension --type=cart_transform
src/run.graphqlファイルで、チップの操作に必要な GraphQL スキーマを定義します。query RunInput {
cart {
lines {
id
cost {
amountPerQuantity {
amount
}
}
# UI側で"_チップ代"とした場合、こちらも"_チップ代"としてください
attribute(key: "チップ代") {
key
value
}
}
}
}
定義したら、extension ディレクトリにて以下を実行して function が受け取るデータの型を生成します。
shopify app function generate
src/run.tsにロジックを追加します。run.tsの例:
import type {
RunInput,
FunctionRunResult,
CartOperation,
} from "../generated/api";
const NO_CHANGES: FunctionRunResult = {
operations: [],
};
export function run(input: RunInput): FunctionRunResult {
const tipItems = input.cart.lines.filter((line) => line.attribute?.value);
// チップが設定されていない場合は何もしない
if (tipItems.length === 0) {
return NO_CHANGES;
}
const operations: CartOperation[] = tipItems.map(
({ id, cost, attribute }) => {
const price = Number(cost.amountPerQuantity.amount);
const tip = Number(attribute?.value || 0);
const total = price + tip;
return {
update: {
cartLineId: id,
price: {
adjustment: {
fixedPricePerUnit: { amount: total },
},
},
},
};
}
);
return {
operations,
};
}
shopify app deploy
query shopifyFunctions {
shopifyFunctions(first: 30) {
nodes {
app {
title
}
apiType
title
id
}
}
}
Admin API を使用して、Function を有効化します。
mutation CreateCartTransform {
cartTransformCreate(functionId: "
これで、チップ金額の変更を検知して、カートの価格に上乗せできるかと思います。

