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:
$_POSTverilerini her zamansanitize_text_field(),sanitize_email()veyasanitize_textarea_field()ile temizleyin. Güvenlik için bu şart.
- Child Theme Kullanımı: Bu kodları mutlaka child theme’in
functions.phpdosyası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_metaYetersizliği: Yeni WooCommerce sürümlerinde (8.0+) bu hook’un yanı sırawoocommerce_checkout_order_createdkancası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.
