# 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.

Sayfa: https://lintelagency.com/tr/kaynaklar/shopify-functions/sepet-tutarina-gore-kapida-odemeyi-gizleme

## 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.

## Bilgiler

- **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:** 2 Kasım 2026

## 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

```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

```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

```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

```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

```json
{
  "operations": [
    { "paymentMethodHide": { "paymentMethodId": "gid://shopify/PaymentCustomizationPaymentMethod/2" } }
  ]
}
```

### tests/below-limit.input.json

```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

```json
{ "operations": [] }
```

### tests/configured-limit.input.json

```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

```json
{
  "operations": [
    { "paymentMethodHide": { "paymentMethodId": "gid://shopify/PaymentCustomizationPaymentMethod/2" } }
  ]
}
```

### tests/uppercase-turkish-name.input.json

```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

```json
{
  "operations": [
    { "paymentMethodHide": { "paymentMethodId": "gid://shopify/PaymentCustomizationPaymentMethod/2" } }
  ]
}
```

## 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.

## 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

- [Payment Customization Function API](https://shopify.dev/docs/api/functions/latest/payment-customization)
- [Function limits and app types](https://shopify.dev/docs/api/functions)

## İlgili içerikler

- [Teslimat, ödeme ya da doğrulama Function’ını etkinleştirme](https://lintelagency.com/tr/kaynaklar/graphql/function-ozellestirmesini-etkinlestirme)
- [Shopify Scripts çalışmayı bıraktı. Her script’in mantığı artık nereye gidiyor?](https://lintelagency.com/tr/blog/shopify-scriptsten-functionsa-gecis)
- [Hangi Shopify Functions özellikleri Shopify Plus gerektirir?](https://lintelagency.com/tr/blog/hangi-shopify-functions-ozellikleri-plus-gerektirir)
- [Function’ları metafield (meta alan) ile yapılandırmak: kuralı yeni sürüm yayınlamadan değiştirin](https://lintelagency.com/tr/blog/shopify-functions-metafield-ile-yapilandirma)

Lisans: MIT. Kendi mağazanızda da müşteri işlerinizde de ücretsiz kullanabilirsiniz.
