WooCommerce Checkout Alanlarını Özelleştirme

E-ticaret sitenizde müşteri deneyimini iyileştirmenin en etkili yollarından biri, checkout sayfasını tam olarak ihtiyacınıza göre şekillendirmektir. WooCommerce varsayılan olarak gayet kullanışlı bir ödeme sayfası sunar, ancak gerçek dünyada her işletmenin farklı ihtiyaçları vardır. Kimi zaman gereksiz alanları kaldırmanız gerekir, kimi zaman ise hiç olmayan özel alanlar eklemeniz. Bu yazıda functions.php dosyasına ekleyeceğiniz kod parçacıklarıyla checkout alanlarını nasıl tam anlamıyla kontrol altına alacağınızı göstereceğim.

Neden Checkout Alanlarını Özelleştirirsiniz?

Diyelim ki yalnızca dijital ürün satıyorsunuz. Bu durumda fatura adresi, telefon numarası gibi alanlar sayfayı gereksiz yere karmaşıklaştırır ve müşteriyi sıkar. Ya da tam tersi: kargo teslimatı için kapı numarası, kat bilgisi veya “faturamı şirket adına kesin” gibi ek bilgiler almanız gerekiyor. Bunların hepsini WooCommerce’in kancaları ve filtreleri aracılığıyla çözebilirsiniz.

Bir diğer yaygın senaryo: B2B satış yapan firmalar genellikle vergi numarası, şirket adı zorunluluğu ve farklı fatura bilgileri ister. Bunları plugin olmadan, sade functions.php kodlarıyla halledebilirsiniz.

Temel Kavramlar: Hook ve Filter Sistemi

WooCommerce checkout alanları woocommerce_checkout_fields filtresiyle yönetilir. Bu filtre dört ana alan grubunu kapsar:

  • billing: Fatura bilgileri alanları
  • shipping: Kargo adresi alanları
  • account: Hesap oluşturma alanları
  • order: Sipariş notu gibi ek alanlar

Her alan için kullanabileceğiniz parametreler şunlardır:

  • label: Alanın kullanıcıya gösterilen etiketi
  • placeholder: Input içinde görünen yardımcı metin
  • required: Zorunlu alan mı? (true/false)
  • class: CSS sınıfları (form-row-wide, form-row-first, form-row-last)
  • type: Alan tipi (text, select, textarea, checkbox, radio)
  • priority: Alanın sıralanma önceliği (küçük sayı = üstte)

Mevcut Alanları Kaldırma

En sık yapılan işlem budur. Telefon numarasını, ikinci adres satırını ya da şirket adı alanını kaldırmak için:

// functions.php
add_filter('woocommerce_checkout_fields', 'checkout_alanlari_kaldir');

function checkout_alanlari_kaldir($fields) {
    // Fatura bölümünden kaldırılanlar
    unset($fields['billing']['billing_phone']);
    unset($fields['billing']['billing_company']);
    unset($fields['billing']['billing_address_2']);
    
    // Kargo bölümünden kaldırılanlar
    unset($fields['shipping']['shipping_company']);
    unset($fields['shipping']['shipping_address_2']);
    
    return $fields;
}

Bu kadar basit. Ama dikkat: bir alanı kaldırdığınızda WooCommerce o veriyi kaydetmez. Eğer ileride o veriye ihtiyaç duyacaksanız kaldırmak yerine gizlemek daha akıllıca bir tercih olabilir.

Alan Etiketlerini ve Placeholder Metinlerini Değiştirme

Varsayılan Türkçe çeviriler bazen pek doğal gelmiyor. “Fatura Ülkesi / Bölge” yerine daha sade bir ifade kullanmak isteyebilirsiniz. Ya da placeholder metniyle kullanıcıya rehberlik etmek istersiniz:

// functions.php
add_filter('woocommerce_checkout_fields', 'checkout_alan_etiket_degistir');

function checkout_alan_etiket_degistir($fields) {
    // Adres satırı 1 etiketini özelleştir
    $fields['billing']['billing_address_1']['label'] = 'Açık Adres';
    $fields['billing']['billing_address_1']['placeholder'] = 'Sokak, mahalle, cadde bilgilerini girin';
    
    // Telefon alanını özelleştir
    $fields['billing']['billing_phone']['label'] = 'Cep Telefonu';
    $fields['billing']['billing_phone']['placeholder'] = '05XX XXX XX XX';
    
    // Şehir alanını özelleştir
    $fields['billing']['billing_city']['label'] = 'İlçe / Şehir';
    
    // Posta kodu
    $fields['billing']['billing_postcode']['label'] = 'Posta Kodu';
    $fields['billing']['billing_postcode']['placeholder'] = '34XXX';
    
    return $fields;
}

Alan Zorunluluğunu Değiştirme

Telefon numarasını zorunlu yapmak ya da tam tersi, zorunlu olan bir alanı opsiyonel hale getirmek çok yaygın bir ihtiyaç:

// functions.php
add_filter('woocommerce_checkout_fields', 'checkout_zorunluluk_ayarla');

function checkout_zorunluluk_ayarla($fields) {
    // Telefonu zorunlu yap
    $fields['billing']['billing_phone']['required'] = true;
    
    // Şirket adını zorunlu olmaktan çıkar
    $fields['billing']['billing_company']['required'] = false;
    
    // Posta kodunu opsiyonel yap
    $fields['billing']['billing_postcode']['required'] = false;
    
    return $fields;
}

Özel Alan Ekleme

İşte asıl güç burada ortaya çıkıyor. WooCommerce’in sunmadığı alanları kendiniz ekleyebilirsiniz. Mesela teslimat tercihi, fatura türü seçimi veya hediye notu gibi alanlar.

Metin Alanı Ekleme

// functions.php - Kapı numarası ve kat bilgisi alanı ekle
add_filter('woocommerce_checkout_fields', 'checkout_ozel_metin_alani_ekle');

function checkout_ozel_metin_alani_ekle($fields) {
    $fields['billing']['billing_kapi_no'] = array(
        'label'       => 'Kapı No / Daire',
        'placeholder' => 'Örn: Kat 3, Daire 12',
        'required'    => false,
        'class'       => array('form-row-first'),
        'priority'    => 55, // billing_address_1'den sonra gelir
        'type'        => 'text',
    );
    
    $fields['billing']['billing_kat'] = array(
        'label'       => 'Kat',
        'placeholder' => 'Örn: 3',
        'required'    => false,
        'class'       => array('form-row-last'),
        'priority'    => 56,
        'type'        => 'text',
    );
    
    return $fields;
}

// Özel alanı veritabanına kaydet
add_action('woocommerce_checkout_update_order_meta', 'checkout_ozel_alan_kaydet');

function checkout_ozel_alan_kaydet($order_id) {
    if (!empty($_POST['billing_kapi_no'])) {
        update_post_meta($order_id, '_billing_kapi_no', sanitize_text_field($_POST['billing_kapi_no']));
    }
    if (!empty($_POST['billing_kat'])) {
        update_post_meta($order_id, '_billing_kat', sanitize_text_field($_POST['billing_kat']));
    }
}

Dropdown (Select) Alan Ekleme

Fatura türü seçimi için select kutusu eklemek çok yaygın bir B2B ihtiyacı:

// functions.php - Fatura türü seçimi
add_filter('woocommerce_checkout_fields', 'checkout_fatura_turu_ekle');

function checkout_fatura_turu_ekle($fields) {
    $fields['order']['fatura_turu'] = array(
        'label'    => 'Fatura Türü',
        'required' => true,
        'class'    => array('form-row-wide'),
        'type'     => 'select',
        'priority' => 5,
        'options'  => array(
            ''          => 'Fatura türü seçin...',
            'bireysel'  => 'Bireysel Fatura',
            'kurumsal'  => 'Kurumsal Fatura (E-Fatura)',
        ),
    );
    
    return $fields;
}

// Seçimi kaydet
add_action('woocommerce_checkout_update_order_meta', 'checkout_fatura_turu_kaydet');

function checkout_fatura_turu_kaydet($order_id) {
    if (!empty($_POST['fatura_turu'])) {
        $izin_verilen = array('bireysel', 'kurumsal');
        $deger = sanitize_text_field($_POST['fatura_turu']);
        if (in_array($deger, $izin_verilen)) {
            update_post_meta($order_id, '_fatura_turu', $deger);
        }
    }
}

Checkbox Alan Ekleme

“Hediye olarak gönder” veya “Fatura istemiyorum” gibi onay kutuları:

// functions.php - Hediye seçeneği checkbox
add_filter('woocommerce_checkout_fields', 'checkout_hediye_secenegi_ekle');

function checkout_hediye_secenegi_ekle($fields) {
    $fields['order']['hediye_gonderim'] = array(
        'label'    => 'Bu siparişi hediye olarak göndermek istiyorum',
        'required' => false,
        'class'    => array('form-row-wide'),
        'type'     => 'checkbox',
        'priority' => 10,
    );
    
    $fields['order']['hediye_notu'] = array(
        'label'       => 'Hediye Notu',
        'placeholder' => 'Sevdiklerinize özel bir mesaj yazın...',
        'required'    => false,
        'class'       => array('form-row-wide'),
        'type'        => 'textarea',
        'priority'    => 11,
    );
    
    return $fields;
}

// Checkbox değerini kaydet
add_action('woocommerce_checkout_update_order_meta', 'checkout_hediye_bilgisi_kaydet');

function checkout_hediye_bilgisi_kaydet($order_id) {
    $hediye = isset($_POST['hediye_gonderim']) ? 'evet' : 'hayir';
    update_post_meta($order_id, '_hediye_gonderim', $hediye);
    
    if (!empty($_POST['hediye_notu'])) {
        update_post_meta($order_id, '_hediye_notu', sanitize_textarea_field($_POST['hediye_notu']));
    }
}

Özel Alanları Admin Sipariş Sayfasında Gösterme

Alanları kaydettiniz, ancak admin panelinde sipariş detaylarında görmek istiyorsunuz. Bunun için woocommerce_admin_order_data_after_billing_address kancasını kullanın:

// functions.php - Admin sipariş sayfasında özel alanları göster
add_action('woocommerce_admin_order_data_after_billing_address', 'admin_ozel_alan_goster', 10, 1);

function admin_ozel_alan_goster($order) {
    $order_id = $order->get_id();
    
    $kapi_no = get_post_meta($order_id, '_billing_kapi_no', true);
    $kat = get_post_meta($order_id, '_billing_kat', true);
    $fatura_turu = get_post_meta($order_id, '_fatura_turu', true);
    $hediye = get_post_meta($order_id, '_hediye_gonderim', true);
    $hediye_notu = get_post_meta($order_id, '_hediye_notu', true);
    
    if ($kapi_no) {
        echo '<p><strong>Kapı No / Daire:</strong> ' . esc_html($kapi_no) . '</p>';
    }
    if ($kat) {
        echo '<p><strong>Kat:</strong> ' . esc_html($kat) . '</p>';
    }
    if ($fatura_turu) {
        $etiket = ($fatura_turu === 'kurumsal') ? 'Kurumsal Fatura' : 'Bireysel Fatura';
        echo '<p><strong>Fatura Türü:</strong> ' . esc_html($etiket) . '</p>';
    }
    if ($hediye === 'evet') {
        echo '<p><strong>Hediye Gönderim:</strong> Evet</p>';
        if ($hediye_notu) {
            echo '<p><strong>Hediye Notu:</strong> ' . esc_html($hediye_notu) . '</p>';
        }
    }
}

Özel Alanları Sipariş E-postasına Ekleme

Müşteriye ve mağaza sahibine giden sipariş onay e-postasında bu özel alanların görünmesi için:

// functions.php - Sipariş e-postasına özel alan ekle
add_filter('woocommerce_email_order_meta_fields', 'email_ozel_alan_ekle', 10, 3);

function email_ozel_alan_ekle($fields, $sent_to_admin, $order) {
    $order_id = $order->get_id();
    
    $fatura_turu = get_post_meta($order_id, '_fatura_turu', true);
    $hediye = get_post_meta($order_id, '_hediye_gonderim', true);
    $hediye_notu = get_post_meta($order_id, '_hediye_notu', true);
    
    if ($fatura_turu) {
        $etiket = ($fatura_turu === 'kurumsal') ? 'Kurumsal Fatura' : 'Bireysel Fatura';
        $fields['fatura_turu'] = array(
            'label' => 'Fatura Türü',
            'value' => $etiket,
        );
    }
    
    if ($hediye === 'evet') {
        $fields['hediye_gonderim'] = array(
            'label' => 'Hediye Gönderim',
            'value' => 'Evet',
        );
        if ($hediye_notu) {
            $fields['hediye_notu'] = array(
                'label' => 'Hediye Notu',
                'value' => $hediye_notu,
            );
        }
    }
    
    return $fields;
}

Alanlara Özel Doğrulama Ekleme

Telefon numarasının Türkiye formatına uyup uymadığını kontrol etmek ya da vergi numarasının 10 haneli olup olmadığını doğrulamak için:

// functions.php - Özel alan doğrulama
add_action('woocommerce_checkout_process', 'checkout_ozel_dogrulama');

function checkout_ozel_dogrulama() {
    // Telefon numarası format kontrolü
    if (!empty($_POST['billing_phone'])) {
        $telefon = preg_replace('/D/', '', $_POST['billing_phone']);
        if (strlen($telefon) !== 10 && strlen($telefon) !== 11) {
            wc_add_notice(
                'Lütfen geçerli bir telefon numarası girin. (Örn: 05XX XXX XX XX)',
                'error'
            );
        }
    }
    
    // Fatura türü seçildi mi kontrolü
    if (empty($_POST['fatura_turu'])) {
        wc_add_notice('Lütfen fatura türünü seçin.', 'error');
    }
    
    // Kurumsal seçildiyse şirket adı zorunlu olsun
    if (isset($_POST['fatura_turu']) && $_POST['fatura_turu'] === 'kurumsal') {
        if (empty($_POST['billing_company'])) {
            wc_add_notice('Kurumsal fatura için şirket adı zorunludur.', 'error');
        }
    }
}

Gerçek Dünya Senaryosu: Sadece Türkiye’ye Satış Yapan Site

Eğer yalnızca Türkiye’ye hizmet veriyorsanız, ülke alanını tamamen kaldırıp sabit bırakmak hem sayfayı sadeleştirir hem de hata olasılığını sıfırlar:

// functions.php - Tek ülke için checkout sadeleştirme
add_filter('woocommerce_checkout_fields', 'checkout_tek_ulke_sadeleştir');

function checkout_tek_ulke_sadeleştir($fields) {
    // Ülke alanını kaldır (WooCommerce zaten Türkiye'ye kilitli olacak)
    unset($fields['billing']['billing_country']);
    unset($fields['shipping']['shipping_country']);
    
    // İkinci adres satırını kaldır
    unset($fields['billing']['billing_address_2']);
    unset($fields['shipping']['shipping_address_2']);
    
    // Şehir ve ilçe etiketlerini Türkçeleştir
    $fields['billing']['billing_state']['label'] = 'İl';
    $fields['billing']['billing_city']['label'] = 'İlçe';
    
    return $fields;
}

// Ülkeyi otomatik olarak Türkiye yap
add_filter('default_checkout_billing_country', 'varsayilan_ulke_tr');
add_filter('default_checkout_shipping_country', 'varsayilan_ulke_tr');

function varsayilan_ulke_tr() {
    return 'TR';
}

Alan Sırasını Değiştirme

Priority değerini kullanarak alanların sıralamasını kontrol edebilirsiniz. WooCommerce’in varsayılan öncelik değerleri genellikle 10, 20, 30… şeklinde artar. Aranıza bir alan sıkıştırmak için ortadaki bir değer verin:

// functions.php - Alan sıralamasını düzenle
add_filter('woocommerce_checkout_fields', 'checkout_alan_sirasi_duzenle');

function checkout_alan_sirasi_duzenle($fields) {
    // E-posta alanını en başa al
    $fields['billing']['billing_email']['priority'] = 5;
    
    // Telefonu hemen arkasına koy
    $fields['billing']['billing_phone']['priority'] = 6;
    
    // Adı ve soyadı birlikte aynı satırda göster
    $fields['billing']['billing_first_name']['priority'] = 10;
    $fields['billing']['billing_first_name']['class'] = array('form-row-first');
    
    $fields['billing']['billing_last_name']['priority'] = 11;
    $fields['billing']['billing_last_name']['class'] = array('form-row-last');
    
    return $fields;
}

Dikkat Edilmesi Gereken Noktalar

WooCommerce checkout kodlarını yazarken birkaç kritik noktanın altını çizmek isterim:

  • Sanitizasyon: $_POST verilerini her zaman sanitize_text_field(), sanitize_email() veya sanitize_textarea_field() ile temizleyin. Güvenlik için bu şart.
  • Child Theme Kullanımı: Bu kodları mutlaka child theme’in functions.php dosyasına ekleyin. Ana tema güncellendiğinde değişiklikleriniz silinmez.
  • Test Ortamı: Canlı sitede doğrudan değişiklik yapmayın. Staging ortamında test edin.
  • WooCommerce Güncellemeleri: WooCommerce büyük sürüm geçişlerinde bazı hook isimleri değişebilir. Güncellemeden sonra checkout sayfasını mutlaka test edin.
  • woocommerce_checkout_update_order_meta Yetersizliği: Yeni WooCommerce sürümlerinde (8.0+) bu hook’un yanı sıra woocommerce_checkout_order_created kancasını da göz önünde bulundurun. Eski hook hala çalışır ancak resmi olarak deprecated sayılabilir.
  • Önbellek Sorunları: Sayfa önbellekleme eklentisi kullanıyorsanız (WP Rocket, W3 Total Cache vb.) checkout sayfasını önbelleğe alma kuralından çıkarın. Dinamik içerik önbellekle sorun yaratır.

Sonuç

WooCommerce checkout alanlarını özelleştirmek ilk bakışta karmaşık görünse de woocommerce_checkout_fields filtresi ve birkaç yardımcı kanca ile neredeyse her şeyi sıfırdan yazabilirsiniz. Gereksiz alanları kaldırmak dönüşüm oranını artırır, özel alanlar eklemek ise iş süreçlerinizi çok daha akıcı hale getirir.

Bu yazıdaki kod örneklerini kendi ihtiyaçlarınıza göre birleştirerek kullanabilirsiniz. Dijital ürün satıyorsanız kargo adresini tamamen kaldırın, B2B işletmeyseniz vergi numarası ve şirket bilgilerini zorunlu alan yapın, hediye paketi hizmetiniz varsa hediye notu alanı ekleyin. Hepsini plugin kurmadan, sade PHP koduyla halledebilirsiniz.

Sorun yaşarsanız önce tarayıcı konsolunda JavaScript hatası olup olmadığına bakın, ardından WP_DEBUG modunu açarak PHP hatalarını kontrol edin. Büyük ihtimalle sorun ya hook sıralamasından ya da eksik return $fields; satırından kaynaklanıyordur.

Bir yanıt yazın

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