Sepet tutarı belli bir sınırı aşınca kapıda ödemeyi gizleme
Sepet tutarı belirlediğiniz sınırı aştığında kapıda ödemeyi gizleyen Shopify ödeme özelleştirme Function’ı; test edilmiş JavaScript koduyla.
- Function API
- Payment Customization
- Hedef (target)
- cart.payment-methods.transform.run
- Plan
- Herkese açık uygulamada her plan; özel uygulamada Shopify Plus
- Uygulama yetkisi
- write_payment_customizations
- API sürümü
- 2026-10
- Son kontrol
Kısaca
Bu ödeme özelleştirme Function’ı, sepet tutarı bir sınırı (varsayılan 5.000) aştığında ödeme sayfasında kapıda ödemeyi gizler. Sınırı ve ödeme yöntemi adlarını bir JSON metafield’dan okur; böylece deploy etmeden değiştirebilirsiniz. Payment Customization API’nin cart.payment-methods.transform.run hedefini (target) kullanır, sürüm 2026-10.
Nasıl kullanılır
- Shopify CLI ile bir uygulama oluşturun (shopify app init), ardından shopify app generate extension komutuyla bir Function uzantısı ekleyin; Payment customization ve JavaScript’i seçin.
- Oluşturulan shopify.extension.toml dosyasını ve src/ içindeki iki dosyayı aşağıdakilerle değiştirin.
- Testleri çalıştırın: shopify app function run --input tests/above-limit.input.json (diğer test dosyaları için de).
- shopify app deploy ile deploy edin ve uygulamayı mağazaya kurun.
- Özelleştirmeyi paymentCustomizationCreate mutation’ı ile oluşturun; farklı bir sınır ya da yöntem adı istiyorsanız function-configuration metafield’ını ayarlayın.
Kod
shopify.extension.tomlapi_version = "2026-10"
[[extensions]]
name = "Hide Cash on Delivery above a cart total"
handle = "hide-cod-above-total"
type = "function"
[[extensions.targeting]]
target = "cart.payment-methods.transform.run"
input_query = "src/cart_payment_methods_transform_run.graphql"
export = "cart-payment-methods-transform-run"
[extensions.build]
command = ""
path = "dist/function.wasm"
src/cart_payment_methods_transform_run.graphqlquery CartPaymentMethodsTransformRunInput {
cart {
cost {
totalAmount {
amount
}
}
}
paymentMethods {
id
name
}
paymentCustomization {
metafield(namespace: "$app", key: "function-configuration") {
jsonValue
}
}
}
src/cart_payment_methods_transform_run.js// @ts-check
/**
* @typedef {import("../generated/api").CartPaymentMethodsTransformRunInput} CartPaymentMethodsTransformRunInput
* @typedef {import("../generated/api").CartPaymentMethodsTransformRunResult} CartPaymentMethodsTransformRunResult
*/
/**
* Settings stored as JSON in the customization's metafield, so the limit can
* change without a deploy. Used when the metafield is missing.
*/
const DEFAULT_CONFIG = {
// Cart total (in the checkout currency) above which the methods are hidden.
maxAmount: 5000,
// Matched case-insensitively against the start of the payment method name.
methodNames: ["Cash on Delivery", "Kapıda Ödeme"],
};
/**
* Lowercase for matching, with Turkish dotless/dotted i folded to "i", so
* "KAPIDA ÖDEME" and "Kapıda Ödeme" match the same configured name.
* @param {string} text
*/
const fold = (text) => text.toLowerCase().replace(/ı/g, "i").replace(/\u0307/g, "");
/** @type {CartPaymentMethodsTransformRunResult} */
const NO_CHANGES = { operations: [] };
/**
* @param {CartPaymentMethodsTransformRunInput} input
* @returns {CartPaymentMethodsTransformRunResult}
*/
export function cartPaymentMethodsTransformRun(input) {
const config = { ...DEFAULT_CONFIG, ...input.paymentCustomization?.metafield?.jsonValue };
const total = Number(input.cart.cost.totalAmount.amount);
if (!(total > config.maxAmount)) return NO_CHANGES;
const names = config.methodNames.map(fold);
const operations = input.paymentMethods
.filter((method) => names.some((name) => fold(method.name).startsWith(name)))
.map((method) => ({ paymentMethodHide: { paymentMethodId: method.id } }));
return { operations };
}
Test girdisi ve beklenen çıktı
tests/above-limit.input.json{
"cart": { "cost": { "totalAmount": { "amount": "6250.0" } } },
"paymentMethods": [
{ "id": "gid://shopify/PaymentCustomizationPaymentMethod/1", "name": "Credit card" },
{ "id": "gid://shopify/PaymentCustomizationPaymentMethod/2", "name": "Cash on Delivery (COD)" }
],
"paymentCustomization": { "metafield": null }
}
tests/above-limit.output.json{
"operations": [
{ "paymentMethodHide": { "paymentMethodId": "gid://shopify/PaymentCustomizationPaymentMethod/2" } }
]
}
tests/below-limit.input.json{
"cart": { "cost": { "totalAmount": { "amount": "4999.99" } } },
"paymentMethods": [
{ "id": "gid://shopify/PaymentCustomizationPaymentMethod/1", "name": "Credit card" },
{ "id": "gid://shopify/PaymentCustomizationPaymentMethod/2", "name": "Cash on Delivery (COD)" }
],
"paymentCustomization": { "metafield": null }
}
tests/below-limit.output.json{ "operations": [] }
tests/configured-limit.input.json{
"cart": { "cost": { "totalAmount": { "amount": "1500.0" } } },
"paymentMethods": [
{ "id": "gid://shopify/PaymentCustomizationPaymentMethod/1", "name": "Kredi kartı" },
{ "id": "gid://shopify/PaymentCustomizationPaymentMethod/2", "name": "Kapıda Ödeme" }
],
"paymentCustomization": {
"metafield": { "jsonValue": { "maxAmount": 1000, "methodNames": ["Kapıda Ödeme"] } }
}
}
tests/configured-limit.output.json{
"operations": [
{ "paymentMethodHide": { "paymentMethodId": "gid://shopify/PaymentCustomizationPaymentMethod/2" } }
]
}
tests/uppercase-turkish-name.input.json{
"cart": {
"cost": {
"totalAmount": {
"amount": "6250.0"
}
}
},
"paymentMethods": [
{
"id": "gid://shopify/PaymentCustomizationPaymentMethod/1",
"name": "Credit card"
},
{
"id": "gid://shopify/PaymentCustomizationPaymentMethod/2",
"name": "KAPIDA ÖDEME"
}
],
"paymentCustomization": {
"metafield": null
}
}tests/uppercase-turkish-name.output.json{
"operations": [
{ "paymentMethodHide": { "paymentMethodId": "gid://shopify/PaymentCustomizationPaymentMethod/2" } }
]
}
Lintel tarafından yazıldı. MIT lisansı: kendi mağazanızda da müşteri işlerinizde de ücretsiz kullanabilirsiniz.
Sınırlar ve özel durumlar
- Sepet tutarı, müşterinin ödeme yaptığı para birimindedir. Birden fazla para birimi kullanıyorsanız sınırı en düşük değerli para birimine göre belirleyin.
- Yöntemler, müşterinin ödeme sayfasında gördüğü adın başlangıcına göre eşleşir. Kapıda ödeme yönteminizin tam adını Ayarlar › Ödemeler’den kontrol edin.
- Bir yöntemi yalnızca bazı yerleşimlerde (örneğin hızlı ödeme düğmelerinde) gizlemek yalnızca Shopify Plus’ta mümkün; bu örnek yöntemi her yerde gizler.
- Bir mağazada en fazla 25 ödeme özelleştirmesi olabilir.
Sık sorulan sorular
- Kapıda ödemeyi uygulama olmadan gizleyebilir miyim?
- Sepet tutarına göre gizleyemezsiniz. Shopify’ın ödeme ayarlarında tutara bağlı bir kural yok; desteklenen yol bir ödeme özelleştirme Function’ı. Shopify App Store’daki uygulamalar da aynı türde bir Function kullanır.
- Basic ya da Shopify planında çalışır mı?
- Function herkese açık bir uygulamanın parçasıysa evet. Özel (custom) bir uygulamadaki Function’lar yalnızca Shopify Plus mağazalarında çalışır.
- Sınırı sonradan nasıl değiştiririm?
- Özelleştirmenin $app:function-configuration metafield’ına metafieldsSet ile {"maxAmount": 3000} yazın. Function bir sonraki ödemede yeni değeri okur; yeniden deploy gerekmez.
- Bunun yerine belirli ürünlerde gizleyebilir miyim?
- Evet. Input sorgusuna her satırın ürün etiketleriyle cart.lines’ı ekleyin ve sepette etiketli bir ürün varsa yöntemi gizleyin. İşlem yine aynı paymentMethodHide.
Shopify belgeleri
İlgili içerikler
- Function API sürümü 2026-10 için yazıldı ve gösterilen tarihte Shopify’ın başvuru belgeleriyle karşılaştırıldı. Shopify her çeyrekte yeni bir sürüm yayımlar.
- Function içeren özel (custom) uygulamalar yalnızca Shopify Plus mağazalarında çalışır. Aynı Function herkese açık bir uygulamada, sayfada aksi yazmıyorsa her planda çalışır.
- Her örnek test verileriyle gelir ve yayımlamadan önce bu testleri çalıştırırız. Kodu değiştirdikten sonra testleri tekrar çalıştırın: shopify app function run.
- MIT lisansı. Kodu kendi mağazanızda da müşteri işlerinizde de kullanabilirsiniz.
Mağazanız için kurulmasını, test edilmesini ve bakımını isterseniz: Shopify Functions geliştirme.
