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 eklerwoocommerce_before_cart_table: Sepet tablosunun hemen öncesine eklerwoocommerce_after_cart_table: Sepet tablosunun hemen altına eklerwoocommerce_after_cart: Tüm sepet içeriğinin altına eklerwoocommerce_cart_collaterals: Sepet özeti (totals) kutusunun yanına eklerwoocommerce_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 kutusuwoocommerce-error: Kırmızı hata kutusuwoocommerce-message: Yeşil başarı kutusuwoocommerce-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()vewp_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 edinWC()global’inin kontrolü: Hook içinde WooCommerce’in yüklenip yüklenmediğini kontrol etmek iyi bir alışkanlık, ancakwoocommerce_before_carthook’u zaten WC yüklendiğinde tetiklendiğinden bu senaryolarda ekstra kontrol zorunlu değil- Performans:
foreachile 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_actionhook’larıyla statik mesaj eklemeyi öğrendik WC()->cartmetodları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.
