Wordpress İle Özel Bir Kullanıcı Dinamik İndirim Kuponu Sistemi Nasıl Yapılır?

Wordpress İle Özel Bir Kullanıcı Dinamik İndirim Kuponu Sistemi Nasıl Yapılır?
Wordpress İle Özel Bir Kullanıcı Dinamik İndirim Kuponu Sistemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu sistemi kurmadan önce teknik ortamınızın hazır olduğundan emin olmalısınız. Yanlış yapılan bir kodlama, sitenizin ödeme süreçlerini aksatabilir.

  • WordPress Sürümü: 6.5 ve üzeri güncel sürüm.
  • WooCommerce: En son kararlı sürümün yüklü ve aktif olması gereklidir.
  • PHP Sürümü: 8.1 veya 8.2 (Performans ve güvenlik için önerilir).
  • Alt Tema (Child Theme): Kodlarınızı doğrudan ana tema dosyalarına yazmak yerine mutlaka bir alt tema kullanın.
  • Kod Düzenleyici: VS Code veya benzeri bir editör ile FTP/SFTP erişimi.

Adım 1: Kullanıcıya Özel İndirim Mantığını Kurgulama

Dinamik indirim sistemi için öncelikle kullanıcı verilerini kontrol etmemiz gerekir. Örneğin, kullanıcının "VIP" rolünde olup olmadığını veya daha önce belirli bir tutarda harcama yapıp yapmadığını sorgulayacağız. Aşağıdaki kod, basit bir kullanıcı rolü kontrolü mantığını göstermektedir.


// Kullanıcının VIP rolüne sahip olup olmadığını kontrol eden fonksiyon
function ozel_kullanici_rolu_kontrol() {
    $current_user = wp_get_current_user();
    if (in_array('vip_musteri', (array) $current_user->roles)) {
        return true;
    }
    return false;
}

Bu fonksiyon, sistemin geri kalanında kullanıcının indirim hakkına sahip olup olmadığını belirlemek için temel teşkil eder. wp_get_current_user() fonksiyonu, mevcut oturum açmış kullanıcı nesnesini döndürür.

Adım 2: WooCommerce Sepetine Dinamik İndirim Ekleme

WooCommerce sepetine indirim eklemek için woocommerce_cart_calculate_fees kancasını (hook) kullanırız. Bu yöntem, sepete "sanal" bir ücret ekleyerek fiyatı düşürmenizi sağlar.


add_action('woocommerce_cart_calculate_fees', 'dinamik_vip_indirimi_uygula');

function dinamik_vip_indirimi_uygula($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    if (ozel_kullanici_rolu_kontrol()) {
        $indirim_orani = 0.10; // %10 indirim
        $sepet_toplami = $cart->get_subtotal();
        $indirim_tutari = $sepet_toplami * $indirim_orani;

        // Sepete negatif bir ücret ekleyerek indirim uygular
        $cart->add_fee(__('VIP İndirimi (%10)', 'text-domain'), -$indirim_tutari);
    }
}

Bu kod bloğu, add_fee metodunu kullanarak sepete negatif bir değer ekler. Bu, WooCommerce'in toplam tutarı otomatik olarak yeniden hesaplamasını sağlar.

Adım 3: İndirimleri Güvenli Hale Getirme ve Doğrulama

Dinamik indirim sistemlerinde en büyük risk, kullanıcıların bu indirimleri manipüle etmesidir. Veri doğrulaması ve güvenlik kontrolleri burada kritik rol oynar.


// Güvenli indirim hesaplama kontrolü
function guvenli_indirim_hesapla($toplam) {
    // Toplam tutarın sayısal olduğunu doğrula
    if (!is_numeric($toplam)) return 0;
    
    // Maksimum indirim limiti belirle (Örn: 500 TL)
    $max_indirim = 500;
    $hesaplanan = $toplam * 0.10;
    
    return min($hesaplanan, $max_indirim);
}

Bu fonksiyon, kullanıcının çok yüksek tutarlı sepetlerde sınırsız indirim almasını engeller. min() fonksiyonu, hesaplanan indirim ile belirlenen üst sınır arasındaki küçük olanı döndürür.

Adım 4: Kullanıcıya İndirim Bilgisi Gösterme

Kullanıcının indirimden haberdar olması için sepet sayfasında bir bildirim göstermek UX (Kullanıcı Deneyimi) açısından önemlidir.


add_action('woocommerce_before_cart', 'vip_indirim_bildirimi');

function vip_indirim_bildirimi() {
    if (ozel_kullanici_rolu_kontrol()) {
        echo '
VIP üye olduğunuz için sepetinize özel %10 indirim uygulandı!
'; } }

Bu kod, sepet sayfasının en üstünde WordPress'in standart mesaj kutusunu kullanarak kullanıcıyı bilgilendirir.

Yöntem Karşılaştırması

Yöntem Avantaj Dezavantaj
add_fee (Hook) Hızlı, temiz, veritabanı yormaz. Kupon kodları ile çakışabilir.
WooCommerce API Tam kontrol sağlar. Daha karmaşık kodlama gerektirir.
Eklenti Kullanımı Kod gerektirmez. Sitenin yükünü artırır, esneklik azdır.

Adım 5: Hata Ayıklama ve Test Süreçleri

Geliştirme aşamasında hataları görmek için WP_DEBUG modunu aktif etmelisiniz. Ayrıca, sistemin doğru çalışıp çalışmadığını farklı tarayıcılar ve kullanıcı rolleri ile test edin.


// Debugging için basit loglama
if (defined('WP_DEBUG') && WP_DEBUG) {
    error_log('VIP İndirimi tetiklendi. Kullanıcı ID: ' . get_current_user_id());
}

Bu kod, indirim her tetiklendiğinde WordPress hata günlüğüne (debug.log) bir kayıt düşer. Bu, sistemin arka planda ne zaman çalıştığını izlemenize olanak tanır.

Kritik Güvenlik Uyarısı: Dinamik indirim sistemlerinde asla kullanıcıdan gelen veriye ($_GET veya $_POST) doğrudan güvenmeyin. Tüm hesaplamaları sunucu tarafında (server-side) yapın ve veritabanı sorgularınızda mutlaka $wpdb->prepare() metodunu kullanarak SQL Injection saldırılarına karşı önlem alın.

Sıkça Sorulan Sorular

Bu indirim sistemi diğer kuponlarla birleşebilir mi?

Evet, add_fee yöntemi sepete bir ücret kalemi olarak eklendiği için standart kuponlarla birlikte çalışabilir. Ancak, kuponların birleşmesini engellemek istiyorsanız WooCommerce ayarlarından "Kuponların birleşmesine izin ver" seçeneğini devre dışı bırakmalısınız.

İndirim sadece belirli ürün kategorileri için geçerli olabilir mi?

Evet, $cart->get_cart() döngüsü ile sepet içeriğini tarayıp, sadece belirli kategoriye sahip ürünlerin toplamını alarak indirim hesaplamasını özelleştirebilirsiniz.

Kullanıcı giriş yapmadığında indirim görünür mü?

Hayır, is_user_logged_in() kontrolü ve rol kontrolü sayesinde indirim sadece giriş yapmış ve yetkili kullanıcılara özel kalır.

Bu kodlar sitemi yavaşlatır mı?

Kodlarınız optimize edildiği ve gereksiz veritabanı sorgularından kaçınıldığı sürece (örneğin transient API kullanımı ile), performans üzerinde gözle görülür bir etki yaratmaz.

Sistemde hata oluşursa ne yapmalıyım?

Öncelikle functions.php dosyanıza eklediğiniz kodları geçici olarak devre dışı bırakın. Hata devam ederse, WordPress hata günlüklerini inceleyerek kodun hangi satırında hata olduğunu tespit edin.

İleri Seviye Optimizasyon ve Performans İpuçları

Dinamik indirim sistemleri, özellikle yüksek trafikli e-ticaret sitelerinde sepet hesaplamaları sırasında ek yük oluşturabilir. Her sayfa yenilemesinde veya sepet güncellemesinde çalışan woocommerce_cart_calculate_fees kancası, veritabanı sorgularınız optimize edilmediğinde performans darboğazlarına yol açabilir. Bu süreci hızlandırmak için WordPress Transients API kullanarak hesaplanan indirim oranlarını belirli bir süre önbelleğe alabilirsiniz.

Aşağıdaki örnekte, kullanıcının indirim hakkını her seferinde veritabanından çekmek yerine, 1 saatlik bir süreyle geçici olarak saklayan bir yapı görebilirsiniz:

function get_cached_user_discount($user_id) {
    $transient_key = 'user_discount_' . $user_id;
    $discount = get_transient($transient_key);

    if (false === $discount) {
        // İndirim hesaplama mantığı buraya gelir
        $discount = 10; // Örnek değer
        set_transient($transient_key, $discount, HOUR_IN_SECONDS);
    }

    return $discount;
}

Bu yaklaşım, özellikle binlerce kayıtlı kullanıcısı olan sitelerde sunucu üzerindeki CPU yükünü ciddi oranda azaltacaktır. Ayrıca, sepet içeriği değiştiğinde veya kullanıcı profilinde bir güncelleme yapıldığında delete_transient() fonksiyonunu kullanarak önbelleği temizlemeyi unutmamalısınız.

Ölçeklenebilir İndirim Senaryoları İçin Mimari Yaklaşım

Sisteminizi daha esnek hale getirmek için kodunuzu tek bir functions.php dosyası yerine, modüler bir yapıya dönüştürmek uzun vadede yönetimi kolaylaştıracaktır. İndirim kurallarını bir sınıf (Class) yapısı içerisinde toplamak, kodun okunabilirliğini artırır ve çakışmaları minimize eder.

Aşağıda, nesne yönelimli programlama (OOP) prensiplerine dayalı temel bir sınıf yapısı örneği yer almaktadır:

class DynamicDiscountManager {
    public function __construct() {
        add_action('woocommerce_cart_calculate_fees', [$this, 'apply_custom_discount']);
    }

    public function apply_custom_discount($cart) {
        if (is_admin() && !defined('DOING_AJAX')) return;

        $user_id = get_current_user_id();
        if (!$user_id) return;

        $discount_percentage = $this->calculate_user_discount($user_id);
        
        if ($discount_percentage > 0) {
            $discount_amount = $cart->get_subtotal() * ($discount_percentage / 100);
            $cart->add_fee(__('Özel Üye İndirimi', 'text-domain'), -$discount_amount);
        }
    }

    private function calculate_user_discount($user_id) {
        // İndirim hesaplama algoritması
        return 15; 
    }
}

new DynamicDiscountManager();

Bu modüler yapı, indirim mantığınızı değiştirmek istediğinizde tüm kod tabanını taramak yerine sadece calculate_user_discount metoduna odaklanmanızı sağlar. Ayrıca, bu sınıfı ayrı bir dosyada tutup require_once ile ana temanıza dahil ederek kodunuzu temiz tutabilirsiniz.

İleri Düzey Güvenlik Kontrolleri

Dinamik indirimler uygularken dikkat etmeniz gereken en kritik nokta, indirimlerin "istismar edilebilir" olmamasıdır. Özellikle sepet toplamı üzerinden yapılan indirimlerde, negatif değerlerin veya mantıksal hataların oluşmadığından emin olun. Her zaman $cart->get_subtotal() değerini doğrulayın ve indirim miktarının hiçbir zaman toplam tutardan fazla olmamasını sağlamak için max() fonksiyonunu kullanın:

$final_discount = min($discount_amount, $cart->get_subtotal());
$cart->add_fee(__('İndirim', 'text-domain'), -$final_discount);

Bu basit kontrol, sisteminizde oluşabilecek "negatif sepet tutarı" gibi kritik hataların önüne geçerek ödeme ağ geçidinizin (Iyzico, Stripe vb.) hata vermesini engeller.

Sonuç

WordPress üzerinde özel bir kullanıcı dinamik indirim kuponu sistemi oluşturmak, müşterilerinize değer verdiğinizi göstermenin en profesyonel yollarından biridir. Bu rehberde öğrendiğiniz kancalar ve mantık yapısı ile sadece rol tabanlı değil, harcama miktarına veya üyelik süresine dayalı gelişmiş indirim senaryoları da geliştirebilirsiniz.

Bir sonraki adım olarak, bu indirimleri bir veritabanı tablosunda tutarak yönetilebilir bir yönetim paneli arayüzü (Settings API kullanarak) oluşturmayı deneyebilirsiniz. Kod güvenliği konusunda her zaman güncel kalmayı ve canlı sitenizde yapacağınız değişikliklerden önce mutlaka bir yedek almayı unutmayın.

Bu yazıya tepkinizi paylaşın:
Emre Cansever

Teknik rehberler ve kendin yap (DIY) projeleri üzerine yoğunlaşıyorum. Detaylı ve güvenilir içerikler hazırlayarak okuyucuların teknik sorunlarını çözmelerine yardımcı oluyorum.

Yorumlar (0)

Yorum Yaz