WooCommerce Sepete Özel Mesaj Ekleme

E-ticaret sitelerinde müşteri deneyimini iyileştirmenin en etkili yollarından biri, doğru zamanda doğru mesajı göstermektir. WooCommerce sepet sayfası, müşterinin satın alma kararını verdiği kritik bir nokta olduğundan, bu alana özel mesajlar eklemek hem dönüşüm oranlarını artırabilir hem de önemli bilgileri iletebilir. Bugün functions.php dosyası üzerinden WooCommerce sepetine nasıl özel mesajlar ekleyebileceğimizi, farklı senaryolar için nasıl koşullu mesajlar gösterebileceğimizi ve bunu production ortamında güvenli bir şekilde nasıl uygulayabileceğimizi ele alacağız.

Neden Sepete Mesaj Eklemelisiniz?

Sepet sayfasına mesaj eklemenin birkaç somut faydası var:

  • Ücretsiz kargo eşiği bildirimi: “50 TL daha ekleyin, kargo bedava!” gibi mesajlar sepet tutarını artırır
  • Kampanya hatırlatması: Aktif bir indirim varsa müşteriye bunu hatırlatmak satışı kaçırmayı önler
  • Teslimat süresi uyarısı: “Bugün 14:00’a kadar verilen siparişler yarın teslim edilir” gibi aciliyet yaratan mesajlar
  • Stok uyarısı: Sepetteki ürünlerin stok durumu hakkında bilgilendirme
  • Minimum sipariş tutarı: Sitenizin minimum sipariş tutarı varsa bunu açıkça göstermek

Bütün bu senaryoları functions.php üzerinden halledebiliriz. Ancak hemen başlamadan önce önemli bir hatırlatma: functions.php dosyasını doğrudan düzenliyorsanız, önce yedek alın. Daha temiz bir çözüm için bir child theme kullanmanızı ya da Code Snippets gibi bir eklenti tercih etmenizi öneririm.

Temel Sepet Mesajı Hook’ları

WooCommerce, sepet sayfasında mesaj eklemek için birkaç farklı hook sunuyor. Bunları bilmek, mesajınızı tam istediğiniz yere koymanızı sağlar.

  • woocommerce_before_cart: Sepet tablosunun tamamen üstüne içerik ekler
  • woocommerce_before_cart_table: Sepet tablosunun hemen öncesine ekler
  • woocommerce_after_cart_table: Sepet tablosunun hemen altına ekler
  • woocommerce_after_cart: Tüm sepet içeriğinin altına ekler
  • woocommerce_cart_collaterals: Sepet özeti (totals) kutusunun yanına ekler
  • woocommerce_before_cart_totals: Sipariş özeti kutusunun içine, tutarların üstüne ekler

Basit Sabit Mesaj Ekleme

En basit senaryo ile başlayalım. Sepet sayfasının üstüne sabit bir bilgilendirme mesajı eklemek istiyorsunuz.

// functions.php
add_action( 'woocommerce_before_cart', 'sepet_bilgilendirme_mesaji' );

function sepet_bilgilendirme_mesaji() {
    echo '<div class="woocommerce-info">
        Siparişleriniz hafta içi 14:00'a kadar verilirse aynı gün kargoya verilir.
    </div>';
}

Burada woocommerce-info class’ını kullandım. WooCommerce’in kendi CSS’i bu class’ı mavi bir info kutusu olarak render eder. Alternatif olarak şu class’ları kullanabilirsiniz:

  • woocommerce-info: Mavi bilgi kutusu
  • woocommerce-error: Kırmızı hata kutusu
  • woocommerce-message: Yeşil başarı kutusu
  • woocommerce-notice: Genel bildirim kutusu

Ücretsiz Kargo Eşiği Hesaplayan Dinamik Mesaj

Bu senaryo çok daha pratik ve gerçek dünyada sık kullanılan bir örnektir. Müşterinin sepet tutarına göre ücretsiz kargoya ne kadar kaldığını hesaplayıp gösterelim.

add_action( 'woocommerce_before_cart', 'ucretsiz_kargo_mesaji' );

function ucretsiz_kargo_mesaji() {
    $ucretsiz_kargo_esigi = 300; // TL cinsinden eşik değer
    $sepet_tutari = WC()->cart->get_subtotal();
    $kalan_tutar = $ucretsiz_kargo_esigi - $sepet_tutari;

    if ( $sepet_tutari >= $ucretsiz_kargo_esigi ) {
        echo '<div class="woocommerce-message">
            🎉 Tebrikler! Ücretsiz kargo hakkı kazandınız.
        </div>';
    } else {
        $kalan_formatli = wc_price( $kalan_tutar );
        echo '<div class="woocommerce-info">
            Ücretsiz kargo için sepetinize ' . $kalan_formatli . ' değerinde daha ürün ekleyin!
        </div>';
    }
}

Bu kod, wc_price() fonksiyonunu kullanarak tutarı WooCommerce’in para birimi formatında gösteriyor. Sabit bir sayı yazmak yerine bu fonksiyonu kullanmak, para birimi ayarlarınız değiştiğinde mesajın da otomatik güncellendiği anlamına gelir.

Belirli Ürün Kategorisine Göre Koşullu Mesaj

Sepette belirli bir kategoriden ürün varsa özel mesaj göstermek, cross-sell ve upsell stratejileri için harika bir araç. Örneğin, “elektronik” kategorisinden ürün olan bir müşteriye garanti uzatma teklifini hatırlatabilirsiniz.

add_action( 'woocommerce_before_cart_table', 'kategoriye_gore_sepet_mesaji' );

function kategoriye_gore_sepet_mesaji() {
    $hedef_kategori = 'elektronik'; // Slug kullanıyoruz
    $kategori_sepette = false;

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $urun_id = $cart_item['product_id'];
        if ( has_term( $hedef_kategori, 'product_cat', $urun_id ) ) {
            $kategori_sepette = true;
            break;
        }
    }

    if ( $kategori_sepette ) {
        echo '<div class="woocommerce-info">
            📦 Elektronik ürünleriniz için genişletilmiş garanti seçeneklerimize 
            <a href="/garanti-uzatma">buradan</a> göz atın!
        </div>';
    }
}

Bu yapıda has_term() WordPress’in native fonksiyonudur, product_cat ise WooCommerce’in ürün kategorisi taxonomy’sidir.

Minimum Sipariş Tutarı Uyarısı

Birçok WooCommerce mağazasının minimum sipariş tutarı politikası var ama bunu müşteriye net bir şekilde iletmek ayrı bir konu. İşte bunu dinamik olarak halleden bir fonksiyon:

add_action( 'woocommerce_before_cart', 'minimum_siparis_uyarisi' );

function minimum_siparis_uyarisi() {
    $minimum_tutar = 150; // TL
    $sepet_tutari = WC()->cart->get_subtotal();

    if ( $sepet_tutari < $minimum_tutar ) {
        $eksik_tutar = $minimum_tutar - $sepet_tutari;
        $eksik_formatli = wc_price( $eksik_tutar );
        $minimum_formatli = wc_price( $minimum_tutar );

        echo '<div class="woocommerce-error">
            ⚠️ Minimum sipariş tutarımız ' . $minimum_formatli . ''dir. 
            Siparişinizi tamamlayabilmek için sepetinize ' . $eksik_formatli . ' değerinde daha ürün eklemeniz gerekmektedir.
        </div>';
    }
}

Burada woocommerce-error class’ını kullandım çünkü bu gerçek bir engel, bir bilgi notu değil. Müşteriye net olmalıyız.

Kullanıcı Rolüne Göre Özelleştirilmiş Mesaj

Toptan satış yapan B2B mağazalarda kurumsal müşterilere farklı mesajlar göstermek sık karşılaşılan bir ihtiyaç. Aşağıdaki örnek, “wholesale_customer” rolüne sahip kullanıcılara özel indirim hatırlatması yapıyor.

add_action( 'woocommerce_before_cart', 'role_bazli_sepet_mesaji' );

function role_bazli_sepet_mesaji() {
    if ( ! is_user_logged_in() ) {
        echo '<div class="woocommerce-info">
            Kurumsal müşterimiz misiniz? 
            <a href="/uye-ol">Kayıt olun</a> ve toptan fiyatlarından yararlanın!
        </div>';
        return;
    }

    $kullanici = wp_get_current_user();
    $roller = (array) $kullanici->roles;

    if ( in_array( 'wholesale_customer', $roller ) ) {
        $sepet_tutari = WC()->cart->get_subtotal();
        
        if ( $sepet_tutari >= 5000 ) {
            echo '<div class="woocommerce-message">
                🏆 VIP müşterimiz! 5.000 TL üzeri siparişinizde %5 ek indirim otomatik uygulanmaktadır.
            </div>';
        } else {
            $kalan = wc_price( 5000 - $sepet_tutari );
            echo '<div class="woocommerce-info">
                💼 Toptan müşterimiz! ' . $kalan . ' daha ekleyerek %5 ek indirime ulaşabilirsiniz.
            </div>';
        }
    }
}

Tarih ve Saate Göre Dinamik Mesaj

Kampanya dönemlerinde ya da belirli mesai saatlerinde farklı mesajlar göstermek için tarih/saat kontrolü ekleyebilirsiniz. Türkiye saatini doğru almak için wp_timezone() veya manuel offset kullanmak önemli.

add_action( 'woocommerce_before_cart', 'zamana_gore_sepet_mesaji' );

function zamana_gore_sepet_mesaji() {
    // WordPress zaman dilimi ayarına göre şu anki zamanı al
    $su_an = new DateTime( 'now', wp_timezone() );
    $saat = (int) $su_an->format( 'H' );
    $gun = (int) $su_an->format( 'N' ); // 1 Pazartesi, 7 Pazar

    // Hafta içi mesai saatlerinde kargo bilgisi
    if ( $gun >= 1 && $gun <= 5 ) {
        if ( $saat >= 9 && $saat < 14 ) {
            echo '<div class="woocommerce-message">
                🚀 Şu an sipariş verirseniz siparişiniz <strong>bugün kargoya</strong> verilecek!
            </div>';
        } elseif ( $saat >= 14 && $saat < 18 ) {
            echo '<div class="woocommerce-info">
                📦 Siparişiniz <strong>yarın kargoya</strong> verilecektir. 
                Aynı gün kargo için saat 14:00 öncesi sipariş vermeniz gerekmektedir.
            </div>';
        }
    } elseif ( $gun >= 6 ) {
        echo '<div class="woocommerce-info">
            🗓️ Hafta sonu siparişleriniz Pazartesi günü işleme alınacaktır.
        </div>';
    }

    // Özel kampanya kontrolü
    $kampanya_bitis = new DateTime( '2025-02-14 23:59:59', wp_timezone() );
    if ( $su_an <= $kampanya_bitis ) {
        $fark = $su_an->diff( $kampanya_bitis );
        echo '<div class="woocommerce-message">
            💝 Sevgililer Günü kampanyamız bitiyor! 
            Son ' . $fark->d . ' gün ' . $fark->h . ' saat!
        </div>';
    }
}

Sepetteki Ürün Sayısına Göre Mesaj

Müşterileri belirli sayıda ürün almaya teşvik etmek istiyorsanız, bu fonksiyon ürün adedine göre mesaj gösterir.

add_action( 'woocommerce_after_cart_table', 'urun_adedi_mesaji' );

function urun_adedi_mesaji() {
    $sepet = WC()->cart;
    $urun_sayisi = $sepet->get_cart_contents_count();
    $hedef_adet = 3;

    if ( $urun_sayisi < $hedef_adet ) {
        $eksik_adet = $hedef_adet - $urun_sayisi;
        echo '<div class="woocommerce-info">
            🛒 Sepetinizde ' . $urun_sayisi . ' ürün var. 
            ' . $eksik_adet . ' ürün daha ekleyerek <strong>%10 indirim</strong> kazanabilirsiniz!
        </div>';
    } elseif ( $urun_sayisi >= $hedef_adet && $urun_sayisi < 6 ) {
        echo '<div class="woocommerce-message">
            ✅ Harika! 3+ ürün indirimi sepetinize uygulandı.
        </div>';
    } elseif ( $urun_sayisi >= 6 ) {
        echo '<div class="woocommerce-message">
            🎁 Süper! 6+ ürün için <strong>%15 indirim</strong> ve ücretsiz kargo kazandınız!
        </div>';
    }
}

Birden Fazla Mesajı Düzenli Yönetmek

Birkaç farklı mesaj fonksiyonu yazdığınızda functions.php dosyası karışmaya başlayabilir. Daha düzenli bir yaklaşım olarak tüm mesajları tek bir fonksiyon üzerinden yönetebilirsiniz.

add_action( 'woocommerce_before_cart', 'merkezi_sepet_mesajlari', 10 );

function merkezi_sepet_mesajlari() {
    $mesajlar = [];
    $sepet = WC()->cart;
    $sepet_tutari = $sepet->get_subtotal();
    $urun_sayisi = $sepet->get_cart_contents_count();

    // Mesaj 1: Ücretsiz kargo eşiği
    $kargo_esigi = 300;
    if ( $sepet_tutari < $kargo_esigi ) {
        $kalan = wc_price( $kargo_esigi - $sepet_tutari );
        $mesajlar[] = [
            'tur'  => 'info',
            'metin' => '🚚 Ücretsiz kargo için ' . $kalan . ' daha ekleyin!'
        ];
    }

    // Mesaj 2: Çoklu ürün indirimi
    if ( $urun_sayisi < 3 ) {
        $mesajlar[] = [
            'tur'  => 'info',
            'metin' => '🛍️ 3 ve üzeri üründe %10 indirim kazanın!'
        ];
    }

    // Mesaj 3: Flash sale bildirimi (sadece belirli saatlerde)
    $saat = (int) ( new DateTime( 'now', wp_timezone() ) )->format( 'H' );
    if ( $saat >= 20 && $saat <= 23 ) {
        $mesajlar[] = [
            'tur'  => 'message',
            'metin' => '⚡ Gece indirimi aktif! Tüm ürünlerde ekstra %5 indirim.'
        ];
    }

    // Mesajları render et
    foreach ( $mesajlar as $mesaj ) {
        $class = 'woocommerce-' . esc_attr( $mesaj['tur'] );
        echo '<div class="' . $class . '">' . wp_kses_post( $mesaj['metin'] ) . '</div>';
    }
}

Bu yaklaşım, tüm mesaj mantığını tek yerden yönetmenizi sağlar. Yeni bir mesaj eklemek istediğinizde sadece $mesajlar[] dizisine yeni bir eleman eklemeniz yeterli.

Güvenlik ve Performans Notları

Kodu production’a almadan önce dikkat etmeniz gereken birkaç önemli nokta var:

  • esc_attr() ve wp_kses_post() kullanımı: Dinamik içerik çıktısı verirken her zaman sanitize edin. Yukarıdaki son örnekte bunu yaptım, diğer örneklerde static string kullandım ama karışık içerik varsa kesinlikle sanitize edin
  • WC() global’inin kontrolü: Hook içinde WooCommerce’in yüklenip yüklenmediğini kontrol etmek iyi bir alışkanlık, ancak woocommerce_before_cart hook’u zaten WC yüklendiğinde tetiklendiğinden bu senaryolarda ekstra kontrol zorunlu değil
  • Performans: foreach ile sepet ürünlerini döngüye almak çok maliyetli değil ama sayfalama olmayan büyük sepetlerde dikkatli olun
  • Caching: W3 Total Cache veya LiteSpeed Cache kullanıyorsanız, dinamik mesajların cache’lenmesi sorun yaratabilir. Bu tür dinamik içerikler için sayfayı cache dışında tutun ya da JavaScript tabanlı bir çözüm düşünün
  • WooCommerce güncellemeleri: Bu hook’lar WooCommerce’in core’una ait ve genellikle stable’dır ama büyük major sürüm güncellemelerinden sonra hook adlarını kontrol etmek iyi bir alışkanlıktır

CSS ile Mesajları Özelleştirme

WooCommerce’in varsayılan notice stillerini beğenmiyorsanız, theme’inizin style.css dosyasına ya da WordPress Customizer > Additional CSS alanına aşağıdaki gibi kurallar ekleyebilirsiniz.

/* Özel sepet mesajı stilleri */
.sepet-ozel-mesaj {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: #ffffff;
    padding: 15px 20px;
    border-radius: 8px;
    margin-bottom: 20px;
    font-weight: 600;
    border-left: 4px solid #4a4a8a;
}

.sepet-ozel-mesaj a {
    color: #ffe66d;
    text-decoration: underline;
}

/* WooCommerce info notice override */
.woocommerce-info {
    border-top-color: #f0a500;
    background: #fff8e6;
    color: #7a5500;
}

Daha granüler kontrol istiyorsanız, PHP fonksiyonunuzda woocommerce-info yerine kendi özel class’ınızı kullanabilirsiniz:

add_action( 'woocommerce_before_cart', 'ozellesmis_stilin_mesaji' );

function ozellesmis_stilin_mesaji() {
    echo '<div class="sepet-ozel-mesaj">
        🎯 Bu ay üye olan müşterilerimize özel: İlk siparişinizde %20 indirim!
        Kod: <strong>HOSGELDIN20</strong>
    </div>';
}

Mesajları Sadece Bir Kez Göstermek

Kullanıcı her sayfa yenilemesinde aynı mesajı görmesin, mesajı bir kez gösterip session’a kaydetmek isteyebilirsiniz.

add_action( 'woocommerce_before_cart', 'bir_kez_goster_mesaj' );

function bir_kez_goster_mesaj() {
    // Session kontrolü
    if ( ! isset( WC()->session ) ) {
        return;
    }

    $gosterildi = WC()->session->get( 'kargo_mesaji_gosterildi' );

    if ( ! $gosterildi ) {
        echo '<div class="woocommerce-info">
            👋 Merhaba! Bugün ilk kez alışveriş yapıyorsanız <strong>ILKALISVERIS</strong> 
            kodunu kullanmayı unutmayın!
        </div>';

        // Session'a kaydet ki bir daha gösterilmesin
        WC()->session->set( 'kargo_mesaji_gosterildi', true );
    }
}

Bu yaklaşım WooCommerce’in kendi session mekanizmasını kullandığı için ekstra bağımlılık gerektirmiyor ve çoğu caching sistemiyle uyumlu çalışıyor.

Sonuç

WooCommerce sepet sayfasına özel mesaj eklemek, başlangıçta basit görünse de doğru senaryolar ve koşullarla birleştiğinde güçlü bir conversion optimization aracına dönüşebilir. Bu yazıda ele aldığımız temel konuları özetleyelim:

  • Temel add_action hook’larıyla statik mesaj eklemeyi öğrendik
  • WC()->cart metodlarıyla sepet verilerini okuyarak dinamik mesajlar oluşturduk
  • Kullanıcı rolü, tarih/saat, ürün kategorisi ve sepet tutarı gibi koşullara göre mesajları kişiselleştirdik
  • Birden fazla mesajı merkezi bir yapıyla yönetmenin daha temiz olduğunu gördük
  • Güvenlik için output sanitization ve performans için dikkat edilmesi gereken noktaları ele aldık

Tüm bu örnekleri bir anda uygulamak zorunda değilsiniz. İhtiyacınıza en uygun olanından başlayın, A/B testleriyle hangi mesajların dönüşümünüzü artırdığını ölçün ve zamanla optimize edin. İyi bir sepet deneyimi, müşteriyi hem bilgilendiren hem de alışverişini tamamlamaya motive eden bir deneyimdir.

Bir yanıt yazın

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