WooCommerce Minimum Sepet Tutarı Belirleme
E-ticaret sitelerinde minimum sepet tutarı belirlemek, hem operasyonel maliyetleri kontrol altına almak hem de ortalama sipariş değerini artırmak açısından oldukça kritik bir adım. Özellikle kargo maliyetlerinin yüksek olduğu dönemlerde, 50 TL’lik bir sipariş için aynı işlem gücünü ve kargo ücretini harcamak işletme açısından sürdürülebilir değil. WooCommerce bu ihtiyacı karşılamak için yerleşik bir arayüz sunmuyor, ama functions.php üzerinden birkaç hook ile bu sorunu kolayca çözebiliyoruz.
Temel Mantık: WooCommerce Hook’ları ile Sepet Kontrolü
WooCommerce’in güzel yanı, alışveriş sürecinin neredeyse her adımında müdahale etmemizi sağlayan hook sistemi. Minimum sepet tutarı için iki farklı hook kullanacağız:
woocommerce_check_cart_items: Sepet geçerliliğini kontrol eden hookwoocommerce_cart_has_errors: Sepet sayfasında hata mesajı göstermek için
Checkout sayfasında siparişin tamamlanmasını engellemek için ise woocommerce_checkout_process hook’u devreye giriyor.
Şimdi adım adım ilerleyelim.
En Basit Yöntem: Sabit Minimum Tutar
İlk örneğimiz, tüm kullanıcılar için geçerli sabit bir minimum sepet tutarı belirliyor. Bu kodu functions.php dosyasına eklemeniz yeterli:
// functions.php
add_action( 'woocommerce_check_cart_items', 'minimum_sepet_tutari_kontrol' );
function minimum_sepet_tutari_kontrol() {
$minimum_tutar = 200; // TL cinsinden minimum tutar
$sepet_toplami = WC()->cart->get_subtotal();
if ( $sepet_toplami < $minimum_tutar ) {
wc_add_notice(
sprintf(
'Minimum sipariş tutarımız <strong>%s</strong> tutarındadır. Sepetinizde şu an <strong>%s</strong> değerinde ürün bulunmaktadır.',
wc_price( $minimum_tutar ),
wc_price( $sepet_toplami )
),
'error'
);
}
}
Bu kod, kullanıcı sepete gittiğinde veya checkout sayfasına geçtiğinde devreye giriyor. get_subtotal() fonksiyonu vergi hariç tutarı döndürüyor; vergi dahil tutar istiyorsanız get_cart_contents_total() kullanabilirsiniz.
Checkout Sırasında Sipariş Tamamlamayı Engelleme
Sadece uyarı göstermek yetmez; kullanıcı “Siparişi Tamamla” butonuna basıldığında da kontrol yapmalısınız. Aksi takdirde teknik bilgisi olan birisi veya hatalı bir form gönderimi siparişi geçirebilir:
// Checkout sırasında minimum tutar kontrolü
add_action( 'woocommerce_checkout_process', 'checkout_minimum_tutar_kontrol' );
function checkout_minimum_tutar_kontrol() {
$minimum_tutar = 200;
$sepet_toplami = WC()->cart->get_subtotal();
if ( $sepet_toplami < $minimum_tutar ) {
wc_add_notice(
sprintf(
'Siparişinizi tamamlayabilmek için minimum %s tutarında ürün eklemeniz gerekmektedir.',
wc_price( $minimum_tutar )
),
'error'
);
}
}
Bu iki hook’u birlikte kullanmak, hem kullanıcı deneyimi hem de güvenlik açısından en doğru yaklaşım.
Gelişmiş Senaryo: Kullanıcı Rolüne Göre Minimum Tutar
Gerçek dünyada tüm kullanıcılara aynı kuralı uygulamak her zaman mantıklı değil. Mesela B2B müşterileri için 500 TL minimum tutar koyarken, bireysel müşteriler için 150 TL yeterli olabilir. Hatta kayıtlı premium üyelere hiç minimum tutar koymak istemeyebilirsiniz:
// Kullanıcı rolüne göre dinamik minimum tutar
add_action( 'woocommerce_check_cart_items', 'rol_bazli_minimum_tutar' );
add_action( 'woocommerce_checkout_process', 'rol_bazli_minimum_tutar' );
function rol_bazli_minimum_tutar() {
// Yönetici ve editörlere kural uygulanmasın
if ( current_user_can( 'manage_options' ) || current_user_can( 'editor' ) ) {
return;
}
$kullanici = wp_get_current_user();
$kullanici_rolu = isset( $kullanici->roles[0] ) ? $kullanici->roles[0] : 'guest';
// Role göre minimum tutarlar
$minimum_tutarlar = array(
'wholesale_customer' => 500, // Toptan müşteri
'premium_member' => 0, // Premium üye - sınırsız
'subscriber' => 100, // Abone
'guest' => 150, // Misafir kullanıcı
);
// Tanımlanmamış roller için varsayılan değer
$minimum_tutar = isset( $minimum_tutarlar[ $kullanici_rolu ] )
? $minimum_tutarlar[ $kullanici_rolu ]
: 150;
// Minimum tutar 0 ise kontrol yapma
if ( $minimum_tutar <= 0 ) {
return;
}
$sepet_toplami = WC()->cart->get_subtotal();
if ( $sepet_toplami < $minimum_tutar ) {
wc_add_notice(
sprintf(
'Hesap tipiniz için minimum sipariş tutarı <strong>%s</strong> olarak belirlenmiştir. '
. 'Şu an sepetinizde <strong>%s</strong> değerinde ürün bulunuyor.',
wc_price( $minimum_tutar ),
wc_price( $sepet_toplami )
),
'error'
);
}
}
Kullanıcı Rolü Tanımlama
Eğer wholesale_customer veya premium_member gibi özel roller kullanıyorsanız, bu rolleri önce tanımlamanız gerekiyor:
// Özel kullanıcı rolleri ekleme (tema aktive olduğunda bir kez çalışır)
add_action( 'after_switch_theme', 'ozel_kullanici_rolleri_olustur' );
function ozel_kullanici_rolleri_olustur() {
add_role(
'wholesale_customer',
'Toptan Müşteri',
array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
)
);
add_role(
'premium_member',
'Premium Üye',
array(
'read' => true,
'edit_posts' => false,
'delete_posts' => false,
)
);
}
Bu rolleri sitenizde zaten kullanıyorsanız bu adımı atlayabilirsiniz.
Kategori Bazlı Minimum Tutar
Bazı senaryolarda belirli kategorilerdeki ürünler için ayrı minimum tutar uygulamak gerekiyor. Örneğin elektronik ürünler kategorisi için 500 TL minimum tutar isterken, kitap kategorisi için böyle bir kısıt koymak istemeyebilirsiniz:
// Sepetteki belirli kategori ürünlerine özel minimum tutar kontrolü
add_action( 'woocommerce_check_cart_items', 'kategori_bazli_minimum_tutar' );
function kategori_bazli_minimum_tutar() {
// Kategori slug => minimum tutar eşleşmesi
$kategori_kurallari = array(
'elektronik' => 500,
'bilgisayar' => 750,
'telefon' => 1000,
);
$sepet_urunleri = WC()->cart->get_cart();
$kategori_toplamlari = array();
foreach ( $sepet_urunleri as $cart_item ) {
$urun_id = $cart_item['product_id'];
$urun_toplami = $cart_item['line_subtotal'];
foreach ( $kategori_kurallari as $kategori_slug => $min_tutar ) {
if ( has_term( $kategori_slug, 'product_cat', $urun_id ) ) {
if ( ! isset( $kategori_toplamlari[ $kategori_slug ] ) ) {
$kategori_toplamlari[ $kategori_slug ] = 0;
}
$kategori_toplamlari[ $kategori_slug ] += $urun_toplami;
}
}
}
foreach ( $kategori_toplamlari as $kategori_slug => $toplam ) {
$min_tutar = $kategori_kurallari[ $kategori_slug ];
if ( $toplam < $min_tutar ) {
$kategori_obj = get_term_by( 'slug', $kategori_slug, 'product_cat' );
$kategori_adi = $kategori_obj ? $kategori_obj->name : $kategori_slug;
wc_add_notice(
sprintf(
'<strong>%s</strong> kategorisindeki ürünler için minimum sipariş tutarı <strong>%s</strong> olmalıdır.',
esc_html( $kategori_adi ),
wc_price( $min_tutar )
),
'error'
);
}
}
}
Mini Sepet ve Sepet Widget’ında Uyarı Gösterme
Kullanıcının sepet sayfasına gitmesini beklemeden, mini sepet üzerinde de uyarı göstermek çok daha iyi bir kullanıcı deneyimi sağlıyor. Bunun için woocommerce_widget_shopping_cart_before_buttons hook’unu kullanabiliriz:
// Mini sepet widget'ında minimum tutar uyarısı
add_action( 'woocommerce_widget_shopping_cart_before_buttons', 'mini_sepet_minimum_tutar_uyarisi' );
function mini_sepet_minimum_tutar_uyarisi() {
$minimum_tutar = 200;
$sepet_toplami = WC()->cart->get_subtotal();
if ( WC()->cart->is_empty() ) {
return;
}
if ( $sepet_toplami < $minimum_tutar ) {
$kalan_tutar = $minimum_tutar - $sepet_toplami;
echo '<div class="minimum-tutar-uyarisi" style="background: #fff3cd; border: 1px solid #ffc107; padding: 10px; margin-bottom: 15px; border-radius: 4px; font-size: 13px;">';
echo '<strong>Minimum sipariş tutarı:</strong> ' . wc_price( $minimum_tutar ) . '<br>';
echo 'Checkout için <strong>' . wc_price( $kalan_tutar ) . '</strong> daha eklemeniz gerekiyor.';
echo '</div>';
} else {
echo '<div class="minimum-tutar-basari" style="background: #d4edda; border: 1px solid #28a745; padding: 10px; margin-bottom: 15px; border-radius: 4px; font-size: 13px;">';
echo 'Minimum sipariş tutarını karşıladınız!';
echo '</div>';
}
}
Bu küçük detay, kullanıcının “neden sipariş veremiyorum” diye kafasını karıştırmadan önce durumu anlamasını sağlıyor.
İlerleme Çubuğu ile Görsel Geri Bildirim
Modern e-ticaret sitelerinde “X TL daha ekleyin, ücretsiz kargo kazanın” tarzında ilerleme çubukları çok popüler. Aynı mantığı minimum tutar için de uygulayabiliriz. Bu kodu sepet sayfasına entegre etmek için shortcode olarak tanımlıyoruz:
// Minimum tutar ilerleme çubuğu shortcode'u
add_shortcode( 'minimum_tutar_progress', 'minimum_tutar_progress_bar' );
function minimum_tutar_progress_bar() {
if ( ! WC()->cart || WC()->cart->is_empty() ) {
return '';
}
$minimum_tutar = 200;
$sepet_toplami = WC()->cart->get_subtotal();
$yuzde = min( 100, ( $sepet_toplami / $minimum_tutar ) * 100 );
$kalan = max( 0, $minimum_tutar - $sepet_toplami );
ob_start();
?>
<div class="min-tutar-wrapper" style="margin: 15px 0;">
<?php if ( $kalan > 0 ) : ?>
<p style="margin-bottom: 8px; font-size: 14px;">
Sipariş verebilmek için <strong><?php echo wc_price( $kalan ); ?></strong> daha ekleyin.
</p>
<?php else : ?>
<p style="margin-bottom: 8px; font-size: 14px; color: #28a745;">
<strong>Minimum sipariş tutarına ulaştınız!</strong>
</p>
<?php endif; ?>
<div style="background: #e9ecef; border-radius: 10px; height: 12px; overflow: hidden;">
<div style="
background: <?php echo $kalan > 0 ? '#ffc107' : '#28a745'; ?>;
width: <?php echo esc_attr( $yuzde ); ?>%;
height: 100%;
border-radius: 10px;
transition: width 0.3s ease;
"></div>
</div>
<small style="color: #6c757d; font-size: 12px;">
<?php echo wc_price( $sepet_toplami ); ?> / <?php echo wc_price( $minimum_tutar ); ?>
</small>
</div>
<?php
return ob_get_clean();
}
Bu shortcode’u [minimum_tutar_progress] şeklinde sepet sayfanızdaki herhangi bir metin alanına veya Elementor/Gutenberg bloklarına ekleyebilirsiniz.
Ayarları WordPress Admin’den Yönetme
Kodda sabit değer tutmak uzun vadede zahmetli oluyor. Müşteriniz “minimum tutarı 200’den 300’e çıkar” dediğinde dosyayı açıp değiştirmek yerine, bu değeri WordPress seçenekler tablosunda saklamak çok daha pratik:
// Admin paneline minimum tutar ayarı ekleme
add_filter( 'woocommerce_general_settings', 'minimum_tutar_ayari_ekle' );
function minimum_tutar_ayari_ekle( $settings ) {
$ozel_ayarlar = array(
array(
'title' => 'Minimum Sipariş Tutarı',
'type' => 'title',
'desc' => 'Müşterilerin sipariş verebilmesi için gereken minimum sepet tutarını belirleyin.',
'id' => 'minimum_tutar_section',
),
array(
'title' => 'Minimum Tutar (TL)',
'desc' => '0 girerseniz minimum tutar kontrolü devre dışı kalır.',
'id' => 'wc_minimum_order_amount',
'default' => '0',
'type' => 'number',
'desc_tip' => true,
'custom_attributes' => array(
'min' => '0',
'step' => '1',
),
),
array(
'type' => 'sectionend',
'id' => 'minimum_tutar_section',
),
);
// Ayarları "Genel" sekmesinin sonuna ekle
array_splice( $settings, count( $settings ) - 1, 0, $ozel_ayarlar );
return $settings;
}
// Admin ayarından okunan değerle minimum tutar kontrolü
add_action( 'woocommerce_check_cart_items', 'admin_ayarli_minimum_tutar' );
add_action( 'woocommerce_checkout_process', 'admin_ayarli_minimum_tutar' );
function admin_ayarli_minimum_tutar() {
$minimum_tutar = (float) get_option( 'wc_minimum_order_amount', 0 );
if ( $minimum_tutar <= 0 ) {
return;
}
$sepet_toplami = WC()->cart->get_subtotal();
if ( $sepet_toplami < $minimum_tutar ) {
wc_add_notice(
sprintf(
'Minimum sipariş tutarımız <strong>%s</strong> tutarındadır. '
. 'Sepetinize <strong>%s</strong> değerinde daha ürün eklemeniz gerekmektedir.',
wc_price( $minimum_tutar ),
wc_price( $minimum_tutar - $sepet_toplami )
),
'error'
);
}
}
Artık WooCommerce > Ayarlar > Genel sekmesinden minimum tutarı doğrudan admin panelinden yönetebilirsiniz.
Sıkça Karşılaşılan Sorunlar ve Çözümleri
Hata Mesajı Defalarca Gösteriliyor
Bu durum, hook’un birden fazla kez tetiklenmesinden kaynaklanıyor. Çözüm olarak wc_has_notice() kontrolü ekleyebilirsiniz:
add_action( 'woocommerce_check_cart_items', 'tekrarsiz_minimum_tutar_kontrol' );
function tekrarsiz_minimum_tutar_kontrol() {
$minimum_tutar = 200;
$sepet_toplami = WC()->cart->get_subtotal();
if ( $sepet_toplami < $minimum_tutar ) {
$mesaj = sprintf(
'Minimum sipariş tutarımız <strong>%s</strong> tutarındadır.',
wc_price( $minimum_tutar )
);
// Aynı mesaj zaten gösteriliyorsa tekrar ekleme
if ( ! wc_has_notice( $mesaj, 'error' ) ) {
wc_add_notice( $mesaj, 'error' );
}
}
}
Kupon veya İndirim Sonrası Tutar Hesaplama
Bazen müşteri sepetine indirim kuponu ekliyor ve tutar minimumun altına düşüyor. Bu durumu da handle etmeniz gerekebilir:
add_action( 'woocommerce_check_cart_items', 'indirim_sonrasi_minimum_tutar' );
function indirim_sonrasi_minimum_tutar() {
$minimum_tutar = 200;
// İndirim sonrası toplam (kupon ve indirimler uygulandıktan sonra)
$sepet_toplami = WC()->cart->get_cart_contents_total();
// Alternatif: vergi dahil tutar için get_total() kullanılabilir
if ( $sepet_toplami < $minimum_tutar ) {
wc_add_notice(
sprintf(
'İndirimler uygulandıktan sonra sepet tutarınız <strong>%s</strong> olan minimum tutarın altına düştü. '
. 'Lütfen sepetinize ürün ekleyin.',
wc_price( $minimum_tutar )
),
'error'
);
}
}
Belirli Ödeme Yöntemleri İçin Minimum Tutar
Kredi kartıyla ödeme yapanlara minimum tutar koymak istiyorsunuz ama havale ile ödeyenlere koymak istemiyorsunuz gibi bir senaryo var mı? Bunu da halledebiliriz:
add_action( 'woocommerce_checkout_process', 'odeme_yontemi_bazli_minimum_tutar' );
function odeme_yontemi_bazli_minimum_tutar() {
$secilen_odeme = isset( $_POST['payment_method'] ) ? sanitize_text_field( $_POST['payment_method'] ) : '';
// Sadece kredi kartı ödemelerinde minimum tutar kontrolü
$kontrol_gereken_yontemler = array( 'stripe', 'iyzico', 'paytr' );
if ( ! in_array( $secilen_odeme, $kontrol_gereken_yontemler, true ) ) {
return;
}
$minimum_tutar = 100;
$sepet_toplami = WC()->cart->get_subtotal();
if ( $sepet_toplami < $minimum_tutar ) {
wc_add_notice(
sprintf(
'Kredi kartı ile ödeme için minimum sipariş tutarı <strong>%s</strong> olmalıdır.',
wc_price( $minimum_tutar )
),
'error'
);
}
}
Performans İpuçları
Sepet sayfası zaten yoğun işlem yapan bir sayfa. Eklediğiniz her hook biraz daha yük bindiriyor. Birkaç pratik öneri:
get_subtotal()vsget_cart_total(): İhtiyacınıza göre doğru fonksiyonu seçin.get_subtotal()daha hızlı,get_cart_total()tam toplam için gerekli- Transient kullanımı: Çok karmaşık hesaplamalar yapıyorsanız sonucu kısa süreliğine cache’leyebilirsiniz
- Koşullu yükleme: Hook’u sadece
is_cart()veyais_checkout()sayfalarında çalıştırmak performansı artırır
// Sadece sepet ve checkout sayfalarında çalışır
add_action( 'wp', function() {
if ( is_cart() || is_checkout() ) {
add_action( 'woocommerce_check_cart_items', 'minimum_sepet_tutari_kontrol' );
}
});
Sonuç
WooCommerce’de minimum sepet tutarı belirlemek, birkaç satır kod ile halledebileceğiniz ama yanlış implemente edildiğinde kullanıcı deneyimini ciddi şekilde zedeleyebilecek bir özellik. En temel yaklaşımdan başlayarak, ihtiyacınıza göre kullanıcı rolü bazlı, kategori bazlı veya ödeme yöntemi bazlı kurallara kadar genişletebilirsiniz.
Bu yazıdaki örnekleri functions.php‘ye eklerken dikkat etmeniz gerekenler:
- Çocuk tema kullanın: Tema güncellemelerinde kodlarınız kaybolmasın diye her zaman child theme’in
functions.phpdosyasını kullanın - Önce staging’de test edin: Özellikle checkout sürecini etkileyen kodları doğrudan production’a atmayın
- Hata mesajlarını Türkçe tutun: Müşterileriniz ne yapmaları gerektiğini net anlamalı
- Admin panel entegrasyonu: Sık değişen değerleri kodda sabit tutmak yerine
get_option()ile yönetin
Eğer tüm bu kodları bir arada, düzenli bir şekilde kullanmak istiyorsanız, hepsini class yapısına taşımanızı öneririm; böylece fonksiyon isim çakışmaları yaşamazsınız ve kodu ilerleyen dönemde plugin’e dönüştürmeniz çok daha kolay olur.
