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

  1. 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.
  2. Oluşturulan shopify.extension.toml dosyasını ve src/ içindeki iki dosyayı aşağıdakilerle değiştirin.
  3. Testleri çalıştırın: shopify app function run --input tests/above-limit.input.json (diğer test dosyaları için de).
  4. shopify app deploy ile deploy edin ve uygulamayı mağazaya kurun.
  5. Ö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.toml
api_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.graphql
query 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.
  • 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.

Geliştirmek istediğiniz bir şey mi var? Gelin, birlikte konuşalım.

Aynı anda sınırlı sayıda proje alıyoruz.

Gencer KarakayaShopify mühendisi

Proje özetinizi bir mühendis okur; size e-postayla yanıt veririz.