Ürün etiketine göre kargo seçeneklerini gizleme
Sepette belirli etikete sahip bir ürün (örneğin büyük ebatlı ya da tehlikeli madde) olduğunda seçtiğiniz kargo seçeneklerini gizleyen Shopify Function’ı.
- Function API
- Delivery Customization
- Hedef (target)
- cart.delivery-options.transform.run
- Plan
- Herkese açık uygulamada her plan; özel uygulamada Shopify Plus
- Uygulama yetkisi
- write_delivery_customizations
- API sürümü
- 2026-10
- Son kontrol
Kısaca
Bu teslimat özelleştirme Function’ı, bir gönderide etiketlerinizden birini taşıyan ürün varsa (örneğin oversized ya da hazmat) adını verdiğiniz kargo seçeneklerini gizler. Etiketler ve seçenek adları, input sorgusundaki değişkeni de besleyen tek bir JSON metafield’da durur. Delivery Customization API’nin cart.delivery-options.transform.run hedefini kullanır, sürüm 2026-10.
Nasıl kullanılır
- Shopify CLI 4.9.0 ya da üstüyle (hedef düzeyindeki input_variables için gerekli) bir uygulama oluşturun ve uzantıyı ekleyin: shopify app generate extension --template delivery_customization, dil olarak JavaScript.
- 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/tagged-product.input.json.
- shopify app deploy ile deploy edin ve özelleştirmeyi deliveryCustomizationCreate ile oluşturun.
- $app:function-configuration metafield’ını ayarlayın; örneğin {"productTags": ["oversized"], "optionTitles": ["Ekspres", "Aynı Gün"]}.
Kod
shopify.extension.tomlapi_version = "2026-10"
[[extensions]]
name = "Hide shipping rates by product tag"
handle = "hide-rates-by-product-tag"
type = "function"
[[extensions.targeting]]
target = "cart.delivery-options.transform.run"
input_query = "src/cart_delivery_options_transform_run.graphql"
input_variables = { namespace = "$app", key = "function-configuration" }
export = "cart-delivery-options-transform-run"
[extensions.build]
command = ""
path = "dist/function.wasm"
src/cart_delivery_options_transform_run.graphqlquery CartDeliveryOptionsTransformRunInput($productTags: [String!]) {
cart {
deliveryGroups {
cartLines {
merchandise {
__typename
... on ProductVariant {
product {
hasAnyTag(tags: $productTags)
}
}
}
}
deliveryOptions {
handle
title
}
}
}
deliveryCustomization {
metafield(namespace: "$app", key: "function-configuration") {
jsonValue
}
}
}
src/cart_delivery_options_transform_run.js// @ts-check
/**
* @typedef {import("../generated/api").CartDeliveryOptionsTransformRunInput} CartDeliveryOptionsTransformRunInput
* @typedef {import("../generated/api").CartDeliveryOptionsTransformRunResult} CartDeliveryOptionsTransformRunResult
*/
/**
* Settings stored as JSON in the customization's metafield. The same
* metafield feeds the query's $productTags variable (see input_variables in
* shopify.extension.toml), so tags are checked by Shopify, not in this code.
*/
const DEFAULT_CONFIG = {
// Matched case-insensitively anywhere in the delivery option title.
optionTitles: /** @type {string[]} */ ([]),
};
/**
* @param {CartDeliveryOptionsTransformRunInput} input
* @returns {CartDeliveryOptionsTransformRunResult}
*/
export function cartDeliveryOptionsTransformRun(input) {
const config = { ...DEFAULT_CONFIG, ...input.deliveryCustomization?.metafield?.jsonValue };
const titles = config.optionTitles.map((title) => title.toLowerCase());
// Only the shipment that contains a tagged product loses the options; other
// delivery groups in a split cart keep theirs.
const operations = input.cart.deliveryGroups
.filter((group) =>
group.cartLines.some(
(line) => line.merchandise.__typename === "ProductVariant" && line.merchandise.product.hasAnyTag,
),
)
.flatMap((group) => group.deliveryOptions)
.filter((option) => titles.some((title) => (option.title ?? "").toLowerCase().includes(title)))
.map((option) => ({ deliveryOptionHide: { deliveryOptionHandle: option.handle } }));
return { operations };
}
Test girdisi ve beklenen çıktı
tests/no-tagged-product.input.json{
"cart": {
"deliveryGroups": [
{
"cartLines": [
{ "merchandise": { "__typename": "ProductVariant", "product": { "hasAnyTag": false } } }
],
"deliveryOptions": [
{ "handle": "9f8e-ground", "title": "Ground" },
{ "handle": "9f8e-express", "title": "Express" },
{ "handle": "9f8e-overnight", "title": "Overnight" }
]
}
]
},
"deliveryCustomization": {
"metafield": { "jsonValue": { "productTags": ["oversized", "hazmat"], "optionTitles": ["Express", "Overnight"] } }
}
}
tests/no-tagged-product.output.json{ "operations": [] }
tests/tagged-product.input.json{
"cart": {
"deliveryGroups": [
{
"cartLines": [
{ "merchandise": { "__typename": "ProductVariant", "product": { "hasAnyTag": false } } },
{ "merchandise": { "__typename": "ProductVariant", "product": { "hasAnyTag": true } } }
],
"deliveryOptions": [
{ "handle": "9f8e-ground", "title": "Ground" },
{ "handle": "9f8e-express", "title": "Express" },
{ "handle": "9f8e-overnight", "title": "Overnight" }
]
}
]
},
"deliveryCustomization": {
"metafield": { "jsonValue": { "productTags": ["oversized", "hazmat"], "optionTitles": ["Express", "Overnight"] } }
}
}
tests/tagged-product.output.json{
"operations": [
{ "deliveryOptionHide": { "deliveryOptionHandle": "9f8e-express" } },
{ "deliveryOptionHide": { "deliveryOptionHandle": "9f8e-overnight" } }
]
}
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
- productTags iki kez okunur: Shopify onu $productTags sorgu değişkeni olarak kullanır, kod da aynı JSON’dan optionTitles’ı okur.
- Metafield ayarlı değilse değişken null olur ve hiçbir seçenek gizlenmez.
- Liste tipindeki bir değişken en fazla 100 etiket alabilir; metafield 10.000 baytı aşarsa Shopify onu döndürmez.
- Seçenek adları başlığın herhangi bir yerinde, büyük/küçük harf ayrımı olmadan eşleşir; "Express", "UPS Express Saver" ile de eşleşir.
Sık sorulan sorular
- Shopify’da belirli ürünler için bir kargo yöntemini nasıl gizlerim?
- Ürünleri etiketleyin, ardından bu örnekteki gibi etiketi hasAnyTag ile kontrol edip seçeneği gizleyen bir teslimat özelleştirme Function’ı kullanın.
- Etiketleri sorguya yazmak yerine neden input değişkeni kullanılıyor?
- Sorguya yazılan etiketleri değiştirmek için yeniden deploy gerekir ve her mağazada aynı kalırlar. Değişkenle her özelleştirme etiketlerini kendi metafield’ından okur.
- Kargo yerine mağazadan teslim seçeneğini gizleyebilir miyim?
- Evet. Mağazadan teslim seçeneğinin adını optionTitles’a yazın. Daha kesin olsun isterseniz sorguya deliveryMethodType ekleyip PICK_UP ile eşleştirin.
Shopify belgeleri
- 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.
