WooCommerce Satın Al Butonunu Özelleştirme
E-ticaret sitelerinde dönüşüm oranını artırmanın en etkili yollarından biri, kullanıcı arayüzünü müşterinin beklentilerine göre şekillendirmektir. WooCommerce’in varsayılan “Sepete Ekle” butonu işlevsel olsa da çoğu zaman marka kimliğiyle uyuşmaz, yanlış yerde durur ya da yanlış mesaj verir. İşte tam bu noktada functions.php dosyası devreye giriyor. Tema dosyalarına dokunmadan, güncelleme güvenli bir şekilde buton metnini, davranışını ve görünümünü tamamen kontrol altına alabilirsiniz.
Neden functions.php Kullanıyoruz?
WooCommerce’i özelleştirmenin birden fazla yolu var: tema dosyalarını doğrudan düzenlemek, child tema oluşturmak ya da plugin yazmak. Ancak functions.php yolu, özellikle küçük ve orta ölçekli projeler için en pratik çözümü sunar. Şu avantajları var:
- Güncelleme güvenli: WooCommerce veya tema güncellendiğinde değişiklikleriniz kaybolmaz
- Hook sistemi: WordPress’in filter ve action sistemi sayesinde çekirdek dosyalara dokunmadan müdahale edersiniz
- Hız: Ayrı bir plugin yazmaktan çok daha hızlı sonuç alırsınız
- Bakım kolaylığı: Tüm özelleştirmeler tek bir dosyada toplanır
Tüm kod örneklerini child temanızın functions.php dosyasına eklemenizi öneriyorum. Ana temanın functions.php dosyasını düzenlerseniz, tema güncellemesinde her şey sıfırlanır.
Temel Buton Metni Değiştirme
En basit senaryo ile başlayalım. Müşteriler “Sepete Ekle” yerine “Hemen Satın Al” görmek istiyor. WooCommerce bunun için woocommerce_product_single_add_to_cart_text ve woocommerce_product_add_to_cart_text olmak üzere iki ayrı filter hook sunuyor.
// Ürün detay sayfasındaki buton metni
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
return 'Hemen Satın Al';
});
// Kategori/arşiv sayfalarındaki buton metni
add_filter( 'woocommerce_product_add_to_cart_text', function() {
return 'Sepete Ekle';
});
Bu iki hook’un farkını bilmek önemli. Birincisi tekil ürün sayfasında geçerli, ikincisi ise ürün listelerinde (kategori, mağaza, arama sonuçları) geçerli. Çoğu geliştirici sadece birini ekleyip neden diğer sayfalarda değişmedi diye saatlerce uğraşıyor.
Ürün Tipine Göre Dinamik Buton Metni
Gerçek dünyada tek tip buton metni yetmez. Basit ürün, değişken ürün, dijital ürün, abonelik ürünü… Hepsinin farklı bir call-to-action’a ihtiyacı var. Şöyle düşünün: dijital bir e-kitap için “Hemen İndir” yazmak, fiziksel bir ürün için “Sepete Ekle” yazmaktan çok daha ikna edici.
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
global $product;
if ( ! $product ) {
return 'Satın Al';
}
switch ( $product->get_type() ) {
case 'simple':
return 'Hemen Satın Al';
case 'variable':
return 'Seçenek Seç ve Satın Al';
case 'grouped':
return 'Ürünleri İncele';
case 'external':
return 'Dış Siteden Al';
case 'virtual':
case 'downloadable':
return 'Hemen İndir';
default:
return 'Sepete Ekle';
}
});
Bu yaklaşım özellikle karma kataloglu mağazalarda büyük fark yaratır. Hem fiziksel hem dijital ürün satan bir mağazada bu kodu kullandıktan sonra tıklama oranlarının nasıl değiştiğini görmek gerçekten ilginç.
Stok Durumuna Göre Buton Özelleştirme
Ürün stokta yoksa “Stok Dışı” yazan buton pek de kullanıcı dostu değil. Müşteriye ne yapması gerektiğini söyleyin. Stok takip bildirimi için kaydolmasını, alternatif ürünlere bakmasını ya da ön sipariş vermesini önerebilirsiniz.
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
global $product;
if ( ! $product ) {
return 'Sepete Ekle';
}
// Stokta yoksa
if ( ! $product->is_in_stock() ) {
return 'Stok Bildirimi Al';
}
// Az stok varsa (5 adet veya altı)
$stock_qty = $product->get_stock_quantity();
if ( $stock_qty !== null && $stock_qty <= 5 && $stock_qty > 0 ) {
return 'Son ' . $stock_qty . ' Adet - Hemen Al!';
}
return 'Sepete Ekle';
});
// Stokta olmayan ürün butonunu tamamen değiştir
add_filter( 'woocommerce_product_add_to_cart_text', function() {
global $product;
if ( $product && ! $product->is_in_stock() ) {
return 'Stok Bildirimi Al';
}
return 'Sepete Ekle';
});
Az stok durumunda dinamik metin gösterme taktiği harika bir aciliyet hissi yaratıyor. “Son 3 Adet – Hemen Al!” gibi bir buton metni, dönüşüm psikolojisi açısından çok güçlü bir mesaj veriyor.
Buton CSS Sınıfları ve Stilleri Ekleme
Buton metni yetmez, görsel tasarım da önemli. WooCommerce’in varsayılan buton CSS sınıflarını değiştirerek ya da yeni sınıflar ekleyerek butona farklı renkler, animasyonlar veya ikonlar ekleyebilirsiniz.
// Ürün detay sayfası butonuna özel CSS sınıfı ekle
add_filter( 'woocommerce_product_single_add_to_cart_text', function( $text ) {
return $text;
});
// Buton HTML'ini tamamen özelleştir
add_filter( 'woocommerce_loop_add_to_cart_link', function( $link, $product ) {
$link = str_replace(
'class="',
'class="custom-cart-btn ',
$link
);
return $link;
}, 10, 2 );
// Tekil ürün sayfası için buton argümanlarını değiştir
add_filter( 'woocommerce_product_single_add_to_cart_text', function( $text ) {
return '<span class="cart-icon">🛒</span> ' . $text;
});
Şimdi bu CSS sınıfına stil verelim. Buton özelleştirmesi sadece PHP tarafıyla bitmez, CSS tarafını da halledelim:
// CSS'i functions.php üzerinden sayfaya ekle
add_action( 'wp_head', function() {
?>
<style>
.custom-cart-btn,
.single_add_to_cart_button {
background-color: #e74c3c !important;
border-color: #c0392b !important;
color: #ffffff !important;
font-size: 18px !important;
padding: 15px 35px !important;
border-radius: 50px !important;
font-weight: 700 !important;
text-transform: uppercase !important;
letter-spacing: 1px !important;
transition: all 0.3s ease !important;
box-shadow: 0 4px 15px rgba(231, 76, 60, 0.3) !important;
}
.single_add_to_cart_button:hover {
background-color: #c0392b !important;
transform: translateY(-2px) !important;
box-shadow: 0 6px 20px rgba(231, 76, 60, 0.4) !important;
}
.woocommerce-cart .checkout-button {
background-color: #27ae60 !important;
border-color: #219a52 !important;
}
</style>
<?php
});
Inline CSS yazmayı sevmiyorum açıkçası, ama hızlı proje teslimlerinde bu yöntem hayat kurtarıyor. Daha temiz bir yaklaşım için bu stilleri child temanın style.css dosyasına taşıyın.
Kategoriye Göre Buton Metni Değiştirme
Farklı kategorilerde farklı buton metni göstermek isteyebilirsiniz. Mesela “Elektronik” kategorisindeki ürünler için “Garantili Ürünü Al”, “Kitap” kategorisi için “Kitabı Sipariş Et” gibi.
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
global $product;
if ( ! $product ) {
return 'Sepete Ekle';
}
// Ürünün kategorilerini al
$categories = get_the_terms( $product->get_id(), 'product_cat' );
if ( ! $categories || is_wp_error( $categories ) ) {
return 'Sepete Ekle';
}
// Kategori slug'larını diziye al
$cat_slugs = wp_list_pluck( $categories, 'slug' );
// Kategorilere göre özel metinler
$category_texts = array(
'elektronik' => 'Garantili Ürünü Sepete Ekle',
'kitaplar' => 'Kitabı Sipariş Et',
'giyim' => 'Ürünü Dene, Beğen, Al',
'yazilim' => 'Lisansı Hemen Al',
'kurslar' => 'Kursa Katıl',
'abonelik' => 'Abone Ol',
'indirimli' => 'Fırsatı Kaçırma!',
);
foreach ( $category_texts as $slug => $text ) {
if ( in_array( $slug, $cat_slugs ) ) {
return $text;
}
}
return 'Sepete Ekle';
});
Bu yaklaşımı kullanırken $category_texts dizisindeki slug’ların WordPress yönetim panelindeki kategori slug’larıyla tam olarak eşleştiğinden emin olun. Türkçe karakterlerin URL’lere nasıl dönüştüğünü kontrol edin.
Fiyat Aralığına Göre Buton Özelleştirme
Yüksek biletli ürünler için daha kurumsal bir dil kullanmak mantıklı. 10.000 TL’lik bir ürün için “Hemen Al!” demek yerine “Teklif Al” veya “Satış Ekibimizle İletişime Geç” gibi bir CTA daha güvenilir hissettiriyor.
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
global $product;
if ( ! $product ) {
return 'Sepete Ekle';
}
$price = (float) $product->get_price();
// 10.000 TL üzeri ürünler için özel akış
if ( $price >= 10000 ) {
return 'Satın Alma Talebi Oluştur';
}
// 1.000 - 9.999 TL arası
if ( $price >= 1000 ) {
return 'Güvenli Ödemeyle Satın Al';
}
// 500 TL altı
if ( $price < 500 ) {
return 'Hemen Sepete At!';
}
return 'Sepete Ekle';
});
Yüksek fiyatlı ürünlerde “Satın Alma Talebi Oluştur” butonu tıklandığında bir iletişim formuna yönlendirmek isteyebilirsiniz. Bunu da yönetebilirsiniz:
// Yüksek fiyatlı ürünlerde buton yönlendirmesini değiştir
add_filter( 'woocommerce_product_single_add_to_cart_text', '__return_false' ); // Örnek
// Daha kontrollü bir yaklaşım:
add_action( 'woocommerce_single_product_summary', function() {
global $product;
if ( ! $product ) {
return;
}
$price = (float) $product->get_price();
// Sadece yüksek fiyatlı ürünlerde özel buton göster
if ( $price >= 10000 ) {
// Varsayılan sepet formunu kaldır
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
echo '<div class="custom-inquiry-btn-wrapper">';
echo '<a href="/iletisim/?urun=' . esc_attr( $product->get_id() ) . '" class="button alt custom-inquiry-btn">';
echo 'Satış Ekibiyle İletişime Geç';
echo '</a>';
echo '<p class="inquiry-note">Bu ürün için özel fiyat teklifi alabilirsiniz.</p>';
echo '</div>';
}
}, 25 );
Sepet Sayfası ve Checkout Butonlarını Özelleştirme
Sadece ürün sayfasındaki butonla sınırlı kalmayın. Sepet ve ödeme sayfalarındaki butonlar da dönüşüm için kritik noktalardır.
// Sepet sayfasındaki "Ödemeye Geç" butonunu özelleştir
add_filter( 'woocommerce_order_button_text', function() {
return 'Siparişi Tamamla ve Öde';
});
// Sepet sayfasındaki checkout butonunu özelleştir
add_filter( 'woocommerce_proceed_to_checkout_button_text', function() {
return 'Güvenli Ödemeye Geç 🔒';
});
// Mini sepetteki buton metni
add_filter( 'woocommerce_widget_cart_button_text', function() {
return 'Sepete Git';
});
Ödeme sayfasında “Siparişi Tamamla” yerine “Siparişi Tamamla ve Öde” demek kulağa küçük bir fark gibi geliyor ama müşteri zihninde çok farklı bir etki yaratıyor. Kullanıcı tam olarak ne yapacağını biliyor.
Kullanıcı Durumuna Göre Buton Özelleştirme
Giriş yapmış kullanıcılar ile misafir kullanıcılara farklı buton metni gösterebilirsiniz. Özellikle üyelik avantajı sunan mağazalar için bu çok işe yarıyor.
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
global $product;
if ( ! $product ) {
return 'Sepete Ekle';
}
// Kullanıcı giriş yapmış mı?
if ( is_user_logged_in() ) {
$user_id = get_current_user_id();
// Kullanıcının VIP üyesi olup olmadığını kontrol et
$is_vip = get_user_meta( $user_id, 'vip_member', true );
if ( $is_vip ) {
$price = (float) $product->get_price();
$vip_price = $price * 0.85; // %15 indirim
return 'VIP Fiyatıyla Satın Al (' . number_format( $vip_price, 2, ',', '.' ) . ' TL)';
}
return 'Üye Fiyatıyla Satın Al';
}
// Misafir kullanıcı için
return 'Giriş Yap ve Daha Ucuza Al';
});
// Misafir kullanıcıyı giriş sayfasına yönlendir
add_filter( 'woocommerce_add_to_cart_redirect', function( $url ) {
if ( ! is_user_logged_in() ) {
// Misafir kullanıcı için özel yönlendirme (isteğe bağlı)
// return wp_login_url( wc_get_page_permalink( 'cart' ) );
}
return $url;
});
Yapışkan (Sticky) Satın Al Butonu Ekleme
Uzun ürün açıklamalarına sahip sayfalar için, kullanıcı sayfayı aşağı kaydırdığında butonun kaybolması dönüşüm öldürücü bir durum. Yapışkan buton ekleme çözümü:
// Yapışkan satın al butonu için HTML ve CSS ekle
add_action( 'woocommerce_after_single_product', function() {
global $product;
if ( ! $product || ! $product->is_purchasable() ) {
return;
}
$button_text = apply_filters( 'woocommerce_product_single_add_to_cart_text', 'Sepete Ekle', $product );
$price = wc_price( $product->get_price() );
echo '<div id="sticky-add-to-cart" class="sticky-cart-bar" style="display:none;">';
echo '<div class="sticky-product-info">';
echo '<strong>' . esc_html( $product->get_name() ) . '</strong>';
echo '<span class="sticky-price">' . $price . '</span>';
echo '</div>';
echo '<button class="button alt sticky-cart-btn" onclick="jQuery('.single_add_to_cart_button').click();">';
echo esc_html( $button_text );
echo '</button>';
echo '</div>';
?>
<style>
#sticky-add-to-cart {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #fff;
padding: 15px 20px;
box-shadow: 0 -3px 20px rgba(0,0,0,0.15);
z-index: 9999;
display: flex;
align-items: center;
justify-content: space-between;
}
</style>
<script>
jQuery(document).ready(function($) {
var $mainBtn = $('.single_add_to_cart_button');
var $stickyBar = $('#sticky-add-to-cart');
$(window).scroll(function() {
var mainBtnOffset = $mainBtn.offset().top + $mainBtn.outerHeight();
var scrollTop = $(window).scrollTop();
if (scrollTop > mainBtnOffset) {
$stickyBar.fadeIn(300);
} else {
$stickyBar.fadeOut(300);
}
});
});
</script>
<?php
});
A/B Test İçin Rastgele Buton Metni
Hangi buton metninin daha iyi performans gösterdiğini test etmek istiyorsanız, basit bir A/B test mekanizması kurabilirsiniz:
add_filter( 'woocommerce_product_single_add_to_cart_text', function() {
// Session başlat
if ( ! session_id() ) {
session_start();
}
// Kullanıcıya bir grup ata (ilk ziyarette)
if ( ! isset( $_SESSION['ab_group'] ) ) {
$_SESSION['ab_group'] = ( rand( 0, 1 ) === 0 ) ? 'A' : 'B';
}
$button_texts = array(
'A' => 'Sepete Ekle',
'B' => 'Hemen Satın Al',
);
$group = $_SESSION['ab_group'];
// Hangi grubun kullandığını cookie ile logla
setcookie( 'ab_cart_btn_group', $group, time() + ( 30 * DAY_IN_SECONDS ), '/' );
return $button_texts[ $group ];
});
Bu basit A/B test mekanizmasını Google Analytics veya herhangi bir analytics aracıyla birleştirerek hangi metnin daha fazla dönüşüm sağladığını ölçebilirsiniz.
Önemli Notlar ve Sık Yapılan Hatalar
Kod yazarken dikkat etmeniz gereken birkaç önemli nokta var:
global $productkullanımı: Hook içinde ürün nesnesine erişmek için global değişkeni kullanmanız gerekiyor. Bunu unutmak en yaygın hata.- Null kontrolü:
$producther zaman set olmayabilir.if ( ! $product )kontrolünü atlamamak gerekiyor. - Filter parametreleri:
woocommerce_product_add_to_cart_textfiltresi iki parametre alıyor:$textve$product. Detay sayfası filtresi sadece bir parametre alıyor. Bu fark bazen karışıklığa yol açıyor. - Child tema kullanımı: Ana tema
functions.phpyerine mutlaka child tema kullanın. - Önbellek sorunları: Buton metni değişikliği sayfa önbelleği olan sitelerde hemen görünmeyebilir. Test sonrası önbelleği temizleyin.
- Çakışan hook’lar: Birden fazla filter aynı hook’u değiştirmeye çalışırsa, öncelik parametresini kullanarak hangisinin önce çalışacağını belirleyin.
- Çok dil desteği: WPML veya Polylang kullanıyorsanız, string’leri
__()veya_e()fonksiyonlarıyla sarmanız gerekiyor.
Sonuç
WooCommerce’de satın alma butonunu özelleştirmek, kodlama açısından bakıldığında görece basit bir işlem. Ama bu basit değişikliklerin dönüşüm oranları üzerindeki etkisi hiç de küçük değil. “Sepete Ekle” yerine kategoriye ve ürüne özel bir metin kullanmak, kullanıcıya tam olarak ne alacağını anlatmak ve aciliyet hissi yaratmak, müşteri yolculuğunu ciddi ölçüde iyileştirebiliyor.
Bu yazıda anlattığım teknikler şunlardı:
- Temel metin değiştirme: En basit senaryo, iki farklı hook ile detay ve liste sayfaları
- Ürün tipine göre dinamik metin: Simple, variable, downloadable ürünler için farklı CTA’lar
- Stok durumu entegrasyonu: Az stok ve stok dışı senaryoları
- Kategori bazlı özelleştirme: Her kategori için ayrı buton dili
- Fiyat aralığı kontrolü: Yüksek biletli ürünler için farklı akış
- Kullanıcı durumu: Giriş yapmış ve misafir kullanıcı ayrımı
- Yapışkan buton: Uzun sayfalarda dönüşümü artırma
- A/B test altyapısı: Hangi metnin işe yaradığını ölçme
Başlangıç için en basit değişiklik olan ürün detay sayfası buton metnini değiştirmekle başlayın, ardından ihtiyaçlarınıza göre diğer katmanları ekleyin. Her değişikliği Analytics ile takip etmeyi unutmayın, çünkü en iyi buton metni her mağaza için farklıdır.
