WooCommerce Kupon Alanını Gizleme

E-ticaret sitelerinde kupon yönetimi her zaman iki taraflı bir bıçak gibidir. Bir yanda müşterileri cezbeden kampanyalar, diğer yanda ise siteyi kupon avcılarına açık bırakan o küçük “Kupon kodunuz var mı?” alanı. WooCommerce varsayılan olarak ödeme sayfasında bu alanı gösterir ve bu durum her proje için ideal olmayabilir. Bu yazıda, WooCommerce kupon alanını farklı senaryolara göre nasıl gizleyeceğimizi, functions.php üzerinden nasıl kontrol altına alacağımızı ve bunu yaparken müşteri deneyimini nasıl koruyacağımızı detaylıca ele alacağız.

Neden Kupon Alanını Gizlemek İstersiniz?

Önce şunu netleştirelim: Kupon alanını gizlemek kuponları devre dışı bırakmak değildir. Kuponların çalışmasını engellemeden yalnızca arayüzden o alanı kaldırıyorsunuz. Peki bu neden gerekli olabilir?

  • Kupon avcısı davranışını önlemek: Müşteriler ödeme aşamasında kupon alanını görünce “acaba bir kupon kodu var mı?” diye Google’a koşuyor. Bu durum, dönüşüm oranını ciddi şekilde düşürebiliyor.
  • Özel kampanya yönetimi: Bazı mağazalar kuponları yalnızca belirli müşteri segmentlerine e-posta ile gönderiyor. Bu durumda alanı herkese açık bırakmak mantıklı değil.
  • Sade ödeme akışı: Checkout sayfasını mümkün olduğunca temiz tutmak ve dikkat dağıtıcı unsurları azaltmak için.
  • B2B mağazalar: Kurumsal fiyatlandırma yapan mağazalarda kupon sistemi yerine farklı fiyat seviyeleri kullanılıyor olabilir.

Tüm bu senaryolar için functions.php dosyasına birkaç satır kod eklemek yeterli. Hadi başlayalım.

Temel Yöntem: Tek Satırda Kupon Alanını Kapatmak

WooCommerce’in kendi ayarlarından da kuponları devre dışı bırakabilirsiniz (WooCommerce > Ayarlar > Genel > Kupon kodlarını etkinleştir seçeneğini kapatarak), ancak bu yöntem kuponları tamamen kapatır. Biz sadece arayüzü gizlemek istiyoruz.

En basit yöntem şu:

// functions.php
add_filter( 'woocommerce_coupons_enabled', '__return_false' );

Ama durun, bu kupon sistemini tamamen devre dışı bırakır. Biz bunu istemiyoruz. Sadece formu gizlemek için şu hook’u kullanın:

// functions.php - Kupon formunu gizle, kupon sistemini aktif tut
add_filter( 'woocommerce_coupons_enabled', function( $enabled ) {
    // Sistem seviyesinde kuponlar hala aktif
    // Sadece formu gizlemek icin asagidaki hook'u kullan
    return $enabled;
});

// Checkout sayfasındaki kupon formunu gizle
add_filter( 'woocommerce_checkout_coupon_message', '__return_false' );

Bu tek satır, checkout sayfasındaki “Kupon kodunuz var mı? Buraya tıklayın.” metnini ve formu tamamen gizler. Kuponlar hala geçerlidir, URL üzerinden veya programatik olarak uygulanabilir, yalnızca kullanıcı arayüzü gizlenmiştir.

Sepet Sayfasındaki Kupon Alanını Gizlemek

Checkout sayfasının yanı sıra WooCommerce, sepet (cart) sayfasında da bir kupon alanı gösterir. Bunu da gizlemek için:

// functions.php
// Checkout sayfası kupon mesajını gizle
add_filter( 'woocommerce_checkout_coupon_message', '__return_false' );

// Sepet sayfası kupon formunu gizle
add_filter( 'woocommerce_cart_coupon_enabled', '__return_false' );

Eğer her iki alanı da tek seferde kapatmak istiyorsanız, bunları bir fonksiyon içinde toplayabilirsiniz:

// functions.php
function mymage_hide_coupon_fields() {
    // Checkout sayfasındaki kupon alanı
    add_filter( 'woocommerce_checkout_coupon_message', '__return_false' );
    
    // Sepet sayfasındaki kupon alanı
    add_filter( 'woocommerce_cart_coupon_enabled', '__return_false' );
}
add_action( 'init', 'mymage_hide_coupon_fields' );

Bu yapı daha düzenli ve yönetimi kolay. Tüm kupon gizleme işlemlerini tek bir fonksiyon altında toplamak, ileride değişiklik yapmanızı kolaylaştırır.

Kullanıcı Rolüne Göre Kupon Alanını Göstermek veya Gizlemek

Gerçek dünya senaryolarında işler biraz daha karmaşık hale gelir. Diyelim ki sadece yöneticilere ve editörlere kupon alanını göstermek istiyorsunuz, normal müşterilere göstermiyorsunuz. Ya da tam tersi, sadece giriş yapmış müşterilere göstermek istiyorsunuz.

// functions.php
function mymage_coupon_visibility_by_role( $enabled ) {
    // Kullanıcı giriş yapmamışsa kupon alanını gizle
    if ( ! is_user_logged_in() ) {
        return false;
    }
    
    // Giriş yapmış ama müşteri rolünde değilse gizle
    $user = wp_get_current_user();
    $allowed_roles = array( 'administrator', 'shop_manager', 'customer' );
    
    if ( ! array_intersect( $allowed_roles, (array) $user->roles ) ) {
        return false;
    }
    
    return $enabled;
}

add_filter( 'woocommerce_cart_coupon_enabled', 'mymage_coupon_visibility_by_role' );
add_filter( 'woocommerce_checkout_coupon_message', 'mymage_coupon_visibility_by_role' );

Bu yaklaşımın güzel tarafı şu: Bir toptan satış (wholesale) eklentisi kullanıyorsanız veya üyelik tabanlı bir mağazanız varsa, belirli rollere özel kupon alanı gösterimi yapabilirsiniz. Örneğin “wholesale_customer” rolündeki kullanıcılara zaten özel fiyat veriyorsanız, kupon alanını onlardan gizlemek mantıklı olur.

Belirli Ürün Kategorilerine Göre Kupon Alanını Yönetmek

Sepette belirli kategorilerden ürün varsa kupon alanını gizlemek isteyebilirsiniz. Bu biraz daha ileri düzey bir senaryo ama gerçek projelerde sıklıkla karşılaşılan bir durum:

// functions.php
function mymage_hide_coupon_for_specific_category( $enabled ) {
    // Kategorileri slug ile tanımla
    $restricted_categories = array( 'indirimli-urunler', 'outlet', 'son-fiyat' );
    
    // Sepet boşsa devam et
    if ( WC()->cart->is_empty() ) {
        return $enabled;
    }
    
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id'];
        
        // Ürün bu kategorilerden birindeyse
        if ( has_term( $restricted_categories, 'product_cat', $product_id ) ) {
            return false; // Kupon alanını gizle
        }
    }
    
    return $enabled;
}

add_filter( 'woocommerce_cart_coupon_enabled', 'mymage_hide_coupon_for_specific_category' );
add_filter( 'woocommerce_checkout_coupon_message', 'mymage_hide_coupon_for_specific_category' );

Bu kod, sepette “indirimli-urunler”, “outlet” veya “son-fiyat” kategorisinden herhangi bir ürün bulunduğunda kupon alanını otomatik olarak gizler. Outlet ürünler için ekstra indirim vermek istemiyorsanız bu yaklaşım oldukça işlevsel.

Minimum Sepet Tutarına Göre Koşullu Gösterim

Başka bir senaryo: Sepet tutarı belirli bir miktarın altındaysa kupon alanını gösterme. Bu, küçük alışverişlerde kupon kullanımını kısıtlamak için kullanılabilir:

// functions.php
function mymage_hide_coupon_below_minimum( $enabled ) {
    // Minimum sepet tutarı (TL cinsinden)
    $minimum_cart_total = 500;
    
    if ( WC()->cart ) {
        $cart_total = WC()->cart->get_subtotal();
        
        if ( $cart_total < $minimum_cart_total ) {
            return false;
        }
    }
    
    return $enabled;
}

add_filter( 'woocommerce_cart_coupon_enabled', 'mymage_hide_coupon_below_minimum' );

Bu yöntemle “500 TL üzeri alışverişlerde kupon kullanabilirsiniz” gibi bir strateji uygulayabilirsiniz. Tabii müşteriye bunu bildiren bir mesaj göstermek iyi bir UX pratiği olur, bunu da biraz sonra ele alacağız.

CSS ile Gizleme: Geçici Çözüm mü, Kalıcı Sorun mu?

Bazı kaynaklar CSS ile kupon alanını gizlemeyi öneriyor. Teorik olarak çalışır ama bu yöntemi kesinlikle tavsiye etmiyorum:

// Bu yöntemi KULLANMAYIN - sadece örnek olarak gösteriyorum
// style.css veya Customizer'a eklenmesi önerilen ama sakıncalı yöntem
/*
.woocommerce-form-coupon-toggle {
    display: none !important;
}
.checkout_coupon {
    display: none !important;
}
*/

CSS ile gizlemenin sorunları şunlar:

  • HTML hala sayfada mevcut: Kaynak kodu incelenerek alan bulunabilir ve form gönderilebilir.
  • Tarayıcı eklentileri: Müşteriler reklam engelleyici veya özel CSS eklentileri kullanarak alanı geri getirebilir.
  • SEO ve performans: Gereksiz HTML yükleniyor, sadece gizleniyor.
  • Bakım zorluğu: WooCommerce güncellemeleri CSS sınıf adlarını değiştirebilir.

PHP tabanlı hook yöntemi her zaman daha güvenilir ve doğru yaklaşım.

Gizleme Sonrası Kullanıcıya Mesaj Göstermek

Kupon alanını gizlediğinizde, bu konuda kullanıcıya bilgi vermek isteyebilirsiniz. Özellikle “neden kupon giremiyorum?” sorusunun önüne geçmek için:

// functions.php
function mymage_show_coupon_info_message() {
    // Sadece sepet ve checkout sayfalarında göster
    if ( ! ( is_cart() || is_checkout() ) ) {
        return;
    }
    
    // Kullanıcı giriş yapmamışsa mesaj göster
    if ( ! is_user_logged_in() ) {
        wc_print_notice(
            'Kupon kodlarından yararlanmak için lütfen <a href="' . esc_url( wc_get_page_permalink( 'myaccount' ) ) . '">giriş yapın</a> veya <a href="' . esc_url( wc_get_page_permalink( 'myaccount' ) ) . '">üye olun</a>.',
            'notice'
        );
    }
}

add_action( 'woocommerce_before_cart', 'mymage_show_coupon_info_message' );
add_action( 'woocommerce_before_checkout_form', 'mymage_show_coupon_info_message' );

Bu kod, giriş yapmamış kullanıcılara neden kupon alanı göremediklerini açıklayan dostane bir mesaj gösterir. Müşteri deneyimi açısından bu tür küçük dokunuşlar büyük fark yaratır.

Tüm Kodları Bir Arada Yönetmek: Temiz functions.php Yapısı

Birden fazla kural koyduğunuzda, bunları düzenli tutmak önemli. İşte production’da kullanabileceğiniz, yorumlanmış ve modüler bir yapı:

// functions.php
// =============================================================
// WOOCOMMERCE KUPON ALANI YÖNETIMI
// =============================================================

/**
 * WooCommerce kupon alanı görünürlük kontrolü
 * 
 * Seçenekler:
 * - 'all'        : Herkesten gizle
 * - 'guests'     : Sadece misafirlerden gizle
 * - 'role'       : Belirli rollere göre kontrol
 * - 'none'       : Kimseye gizleme (varsayılan davranış)
 */
define( 'MYSITE_COUPON_VISIBILITY', 'guests' );

function mysite_manage_coupon_field( $enabled ) {
    $mode = MYSITE_COUPON_VISIBILITY;
    
    switch ( $mode ) {
        case 'all':
            // Herkesten gizle
            return false;
            
        case 'guests':
            // Sadece misafirlerden gizle
            if ( ! is_user_logged_in() ) {
                return false;
            }
            break;
            
        case 'role':
            // Belirli rollere göre kontrol
            if ( is_user_logged_in() ) {
                $user = wp_get_current_user();
                $allowed_roles = array( 'administrator', 'shop_manager' );
                if ( ! array_intersect( $allowed_roles, (array) $user->roles ) ) {
                    return false;
                }
            } else {
                return false;
            }
            break;
            
        case 'none':
        default:
            // Hiçbir şey yapma
            break;
    }
    
    return $enabled;
}

// Hook'ları bağla
add_filter( 'woocommerce_cart_coupon_enabled', 'mysite_manage_coupon_field' );
add_filter( 'woocommerce_checkout_coupon_message', 'mysite_manage_coupon_field' );

Bu yapıyı kullanmak için sadece MYSITE_COUPON_VISIBILITY sabitini değiştirmeniz yeterli. Kodun geri kalanına dokunmanıza gerek yok. Bu yaklaşım özellikle bir ajans ortamında birden fazla müşteri sitesi yönetiyorsanız çok işe yarıyor.

Child Theme Kullanımının Önemi

Bütün bu kodları doğrudan aktif temanızın functions.php dosyasına eklemekten kaçının. Tema güncellendiğinde tüm değişiklikleriniz silinir. Bunun yerine:

  • Child theme oluşturun: Ana temanın functions.php dosyasını değil, child theme’in functions.php dosyasını düzenleyin.
  • Özel eklenti yazın: Küçük bir site eklentisi (site-specific plugin) oluşturun ve bu kodları oraya koyun.
  • Code Snippets eklentisi kullanın: Code Snippets gibi eklentiler, tema değişikliklerinden bağımsız kod eklemenizi sağlar.

Child theme functions.php örneği:

// wp-content/themes/your-child-theme/functions.php
<?php
/**
 * Child Theme Functions
 * 
 * Ana tema fonksiyonlarını burada geçersiz kıl veya genişlet.
 * WooCommerce özelleştirmeleri için güvenli alan.
 */

// Parent theme'i yükle (zorunlu)
add_action( 'wp_enqueue_scripts', function() {
    wp_enqueue_style(
        'parent-style',
        get_template_directory_uri() . '/style.css'
    );
});

// WooCommerce kupon alanı gizleme
add_filter( 'woocommerce_checkout_coupon_message', '__return_false' );
add_filter( 'woocommerce_cart_coupon_enabled', '__return_false' );

Sık Yapılan Hatalar ve Çözümleri

Uygulamada karşılaştığım bazı yaygın sorunları paylaşayım:

Hook yanlış çalışıyor: woocommerce_checkout_coupon_message filtresi string döndürür, boolean değil. Bu yüzden __return_false yerine __return_empty_string kullanmanız gerekebilir bazı WooCommerce versiyonlarında.

// WooCommerce versiyon uyumlulugu icin guvenli kullanim
add_filter( 'woocommerce_checkout_coupon_message', '__return_empty_string' );

Sepet hesaplanmadan hook çalışıyor: WC()->cart nesnesine erişmeye çalıştığınızda bazen “Call to a member function on null” hatası alırsınız. Bunun önüne geçmek için:

// functions.php
function mymage_safe_cart_check( $enabled ) {
    // WC ve cart nesnesinin hazır olduğundan emin ol
    if ( ! function_exists( 'WC' ) || ! WC()->cart ) {
        return $enabled;
    }
    
    // Buradan sonra güvenle WC()->cart kullanabilirsin
    $cart_total = WC()->cart->get_subtotal();
    
    if ( $cart_total < 100 ) {
        return false;
    }
    
    return $enabled;
}

add_filter( 'woocommerce_cart_coupon_enabled', 'mymage_safe_cart_check' );

Cache sorunları: LiteSpeed Cache, WP Rocket veya benzeri önbellekleme eklentileri kullanıyorsanız, koşullu gizleme çalışmayabilir. Sepet ve checkout sayfalarını önbellekten hariç tuttuğunuzdan emin olun. Bu sayfalar zaten WooCommerce tarafından otomatik olarak önbellekten muaf tutulur, ama üçüncü parti önbellekleme çözümlerinde manuel kontrol gerekebilir.

Test Etme ve Doğrulama

Değişiklikleri uyguladıktan sonra mutlaka şunları test edin:

  • Farklı tarayıcılarda ve gizli sekmede kontrol edin.
  • Bir müşteri hesabıyla giriş yapıp sepete ürün ekleyerek kontrol edin.
  • Misafir kullanıcı olarak aynı işlemi yapın.
  • Daha önce oluşturulmuş bir kupon kodunu URL parametresi olarak deneyin: ?coupon_code=TESTCODE şeklinde.
  • WooCommerce admin panelinden kupon oluşturup doğrudan ödeme sırasında uygulamayı test edin.

Kupon sisteminin hala çalıştığını doğrulamak için WooCommerce admin > Kuponlar bölümüne gidin, test kuponu oluşturun ve bunu wc_add_to_cart_message ya da programatik olarak uygulayarak sipariş oluşturun.

Sonuç

WooCommerce kupon alanını gizlemek ilk bakışta basit bir görev gibi görünse de doğru yöntemi seçmek, gereksiz destek taleplerini ve müşteri kafa karışıklığını önler. Bu yazıda öğrendiklerimizi toparlayalım:

  • Basit gizleme için __return_false veya __return_empty_string hook’larını kullanmak yeterli.
  • Rol tabanlı kontrol için kullanıcı rollerini sorgulayan bir fonksiyon yazılmalı.
  • Kategori veya tutar bazlı gizleme için sepet içeriğini kontrol eden filtreler kullanılmalı.
  • CSS ile gizleme güvenli değil, PHP hook’ları her zaman tercih edilmeli.
  • Child theme veya özel eklenti kullanarak değişikliklerin kalıcı olması sağlanmalı.
  • Cache sorunlarına dikkat edilmeli, test süreci ihmal edilmemeli.

Bu kodları kendi projenize uyarlarken, fonksiyon adlarını site adınıza özgü bir ön ekle isimlendirmeyi unutmayın. Global fonksiyon isim çakışmaları, özellikle çok eklentili WordPress sitelerinde ciddi sorunlara yol açabilir. mysite_ veya mytheme_ gibi bir ön ek bu sorunu tamamen ortadan kaldırır.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir