WP CLI ile WooCommerce Kargo Bölgesi Yönetimi: wp wc shipping_zone Komutları

E-ticaret sitenizde kargo bölgesi yönetimi, müşteri deneyimini doğrudan etkileyen kritik bir operasyonel konudur. WooCommerce admin panelinden tek tek tıklayarak kargo bölgesi eklemek, düzenlemek veya silmek hem zaman alıcı hem de hata yapmaya açık bir süreçtir. Özellikle onlarca bölge ve yüzlerce yöntem söz konusu olduğunda, WP-CLI’nin wp wc shipping_zone komutları hayat kurtarıcı olur. Bu yazıda gerçek dünya senaryolarıyla WP-CLI üzerinden kargo bölgesi yönetimini en ince detayına kadar ele alacağız.

WP-CLI ile WooCommerce Shipping Zone Komutlarına Giriş

WP-CLI, WordPress kurulumlarını komut satırından yönetmek için kullanılan güçlü bir araçtır. WooCommerce eklentisi de kendi WP-CLI komutlarını sunarak mağaza yönetimini otomatize etmenize olanak tanır. Kargo bölgeleri söz konusu olduğunda kullanacağımız temel komut grubu wp wc shipping_zone olacak.

Başlamadan önce WooCommerce WP-CLI komutlarının çalışması için şu şartların sağlanmış olması gerekir:

  • WP-CLI 2.x veya üzeri kurulu olmalı
  • WooCommerce eklentisi aktif olmalı
  • Komutları çalıştıracak kullanıcı WooCommerce REST API yetkisine sahip olmalı
  • --user parametresiyle yönetici kullanıcı belirtilmeli
# WP-CLI ve WooCommerce versiyon kontrolü
wp --version
wp plugin status woocommerce

# Mevcut shipping_zone komutlarını listele
wp wc shipping_zone --help

Temel Komut Yapısı ve Parametreler

wp wc shipping_zone komut ailesi birkaç alt komuttan oluşur. Bunları şöyle sıralayabiliriz:

  • list: Mevcut kargo bölgelerini listeler
  • create: Yeni kargo bölgesi oluşturur
  • get: Belirli bir bölgenin detaylarını getirir
  • update: Mevcut bölgeyi günceller
  • delete: Bölgeyi siler

Her komutta ortak olarak kullanılan bazı parametreler var:

  • –user=: Komutu çalıştıracak WordPress kullanıcısının ID’si veya kullanıcı adı
  • –format=: Çıktı formatı (table, json, csv, yaml, ids, count)
  • –fields=: Görüntülenecek alanları belirler
  • –porcelain: Sadece ID çıktısı verir, betiklerde kullanışlıdır
# Tüm kargo bölgelerini listele
wp wc shipping_zone list --user=admin

# JSON formatında listele
wp wc shipping_zone list --user=admin --format=json

# Sadece ID ve isimlerini göster
wp wc shipping_zone list --user=admin --fields=id,name

Kargo Bölgesi Oluşturma

Yeni bir kargo bölgesi oluştururken create alt komutunu kullanırsınız. En temel parametreler şunlardır:

  • –name=: Bölge adı (zorunlu)
  • –order=: Bölgelerin öncelik sırası, düşük sayı önce gelir
# Basit bir kargo bölgesi oluştur
wp wc shipping_zone create --name="İstanbul" --order=1 --user=admin

# Porcelain flag ile sadece ID al
wp wc shipping_zone create --name="Anadolu Yakası" --order=2 --user=admin --porcelain

Gerçek dünyada karşılaştığım senaryolardan biri şu: Bir müşterimin sitesini yeni bir sunucuya taşıdık ve tüm WooCommerce ayarlarını sıfırdan kurmamız gerekiyordu. Kargo bölgelerini tek tek panel üzerinden girmek yerine bir bash betiği yazdık. Bu yaklaşım hem daha hızlıydı hem de tekrarlanabilir bir kurulum süreci oluşturdu.

#!/bin/bash
# Toplu kargo bölgesi oluşturma betiği
WP_PATH="/var/www/html/mystore"
ADMIN_USER="admin"

# Bölge listesi
declare -A ZONES
ZONES["İstanbul"]=1
ZONES["Ankara"]=2
ZONES["İzmir"]=3
ZONES["Bursa"]=4
ZONES["Diğer Türkiye"]=5

for zone_name in "${!ZONES[@]}"; do
    order=${ZONES[$zone_name]}
    zone_id=$(wp wc shipping_zone create 
        --name="$zone_name" 
        --order=$order 
        --user=$ADMIN_USER 
        --path=$WP_PATH 
        --porcelain)
    echo "Oluşturuldu: $zone_name (ID: $zone_id)"
done

Kargo Bölgesi Detaylarını Görüntüleme ve Güncelleme

Mevcut bir bölgenin detaylarını görüntülemek için get komutunu kullanırsınız:

# ID'si 1 olan bölgenin detaylarını getir
wp wc shipping_zone get 1 --user=admin

# JSON formatında getir
wp wc shipping_zone get 1 --user=admin --format=json

Bölgeyi güncellemek içinse update komutunu kullanıyoruz. Örneğin bölge adını değiştirmek ya da öncelik sırasını düzenlemek istediğinizde:

# Bölge adını güncelle
wp wc shipping_zone update 1 --name="İstanbul ve Çevresi" --user=admin

# Öncelik sırasını güncelle
wp wc shipping_zone update 1 --order=0 --user=admin

Kargo Bölgesi Lokasyonları Yönetimi

Kargo bölgelerinin en kritik parçası lokasyonlardır. Hangi il, ülke veya posta kodu bu bölgeye dahil? Bu işlemleri wp wc shipping_zone_location komutlarıyla yönetiyoruz.

# Bölgenin mevcut lokasyonlarını listele
wp wc shipping_zone_location list 1 --user=admin

# Ülke bazlı lokasyon ekle (TR = Türkiye)
wp wc shipping_zone_location add 1 
    --code="TR" 
    --type="country" 
    --user=admin

Lokasyon eklerken --type parametresi için şu değerleri kullanabilirsiniz:

  • country: Ülke bazlı (ör: TR, DE, US)
  • state: Eyalet veya il bazlı (ör: TR:34 İstanbul için)
  • postcode: Posta kodu bazlı (ör: 34000 veya 34* wildcard destekler)
  • continent: Kıta bazlı (ör: EU Avrupa için)
# İstanbul iline özel lokasyon ekle
wp wc shipping_zone_location add 2 
    --code="TR:34" 
    --type="state" 
    --user=admin

# Posta kodu bazlı lokasyon ekle
wp wc shipping_zone_location add 2 
    --code="34*" 
    --type="postcode" 
    --user=admin

# Lokasyonları toplu güncelle (mevcut lokasyonları değiştirir)
wp wc shipping_zone_location update 1 
    --user=admin 
    '[{"code":"TR","type":"country"}]'

Burada dikkat edilmesi gereken önemli bir nokta var: update komutu mevcut tüm lokasyonların üzerine yazar. Bu yüzden mevcut lokasyonları önce alıp, üzerine ekleyerek geri yazmanız gerekir. Bunu yaparken bir müşteri için şöyle bir yaklaşım kullandım:

#!/bin/bash
# Belirli bir bölgeye güvenli lokasyon ekleme
ZONE_ID=$1
NEW_CODE=$2
NEW_TYPE=$3
WP_USER="admin"

# Mevcut lokasyonları al
current_locs=$(wp wc shipping_zone_location list $ZONE_ID 
    --user=$WP_USER 
    --format=json)

echo "Bölge $ZONE_ID için mevcut lokasyonlar: $current_locs"
echo "Yeni lokasyon ekleniyor: $NEW_CODE ($NEW_TYPE)"

# Kullanım: ./add_location.sh 1 TR:06 state

Kargo Yöntemleri Yönetimi

Kargo bölgelerine yöntem eklemek wp wc shipping_zone_method komutlarıyla yapılır. Her bölgeye düz ücret (flat_rate), ücretsiz kargo (free_shipping) veya yerel teslim (local_pickup) gibi yöntemler ekleyebilirsiniz.

# Bölgenin mevcut kargo yöntemlerini listele
wp wc shipping_zone_method list 1 --user=admin

# Düz ücret yöntemi ekle
wp wc shipping_zone_method create 1 
    --method_id="flat_rate" 
    --user=admin

# Ücretsiz kargo yöntemi ekle
wp wc shipping_zone_method create 1 
    --method_id="free_shipping" 
    --user=admin

# Yerel teslim yöntemi ekle
wp wc shipping_zone_method create 1 
    --method_id="local_pickup" 
    --user=admin

Yöntem oluşturduktan sonra dönen ID ile yöntemi güncelleyebilirsiniz:

# Kargo yöntemini güncelle (enabled/disabled)
wp wc shipping_zone_method update 1 3 
    --enabled=true 
    --user=admin

# Kargo yöntemini sil
wp wc shipping_zone_method delete 1 3 
    --user=admin

Gerçek Dünya Senaryosu: Çok Bölgeli Kargo Yapısı Kurulumu

Bir tekstil firmasının e-ticaret sitesini yönetirken karşılaştığım senaryo şuydu: Firma İstanbul için özel fiyatlandırma, büyük şehirler için farklı ücret, diğer Türkiye için standart ücret ve uluslararası kargo için ayrı yapı istiyordu. Bunu WP-CLI ile nasıl kurduğumu anlatalım.

#!/bin/bash
# Kapsamlı kargo bölgesi kurulum betiği
WP_PATH="/var/www/html/eticaret"
ADMIN="1"

echo "=== Kargo Bölgeleri Kuruluyor ==="

# 1. İstanbul Bölgesi
echo "İstanbul bölgesi oluşturuluyor..."
IST_ID=$(wp wc shipping_zone create 
    --name="İstanbul" 
    --order=1 
    --user=$ADMIN 
    --path=$WP_PATH 
    --porcelain)

# İstanbul lokasyonu ekle
wp wc shipping_zone_location update $IST_ID 
    --user=$ADMIN 
    --path=$WP_PATH 
    '[{"code":"TR:34","type":"state"}]'

# İstanbul için flat rate yöntemi ekle
IST_METHOD=$(wp wc shipping_zone_method create $IST_ID 
    --method_id="flat_rate" 
    --user=$ADMIN 
    --path=$WP_PATH 
    --porcelain)

echo "İstanbul bölgesi kuruldu. Bölge ID: $IST_ID, Yöntem ID: $IST_METHOD"

# 2. Büyük Şehirler Bölgesi
echo "Büyük şehirler bölgesi oluşturuluyor..."
BIG_ID=$(wp wc shipping_zone create 
    --name="Büyük Şehirler" 
    --order=2 
    --user=$ADMIN 
    --path=$WP_PATH 
    --porcelain)

# Ankara, İzmir, Bursa ekle
wp wc shipping_zone_location update $BIG_ID 
    --user=$ADMIN 
    --path=$WP_PATH 
    '[{"code":"TR:06","type":"state"},{"code":"TR:35","type":"state"},{"code":"TR:16","type":"state"}]'

BIG_METHOD=$(wp wc shipping_zone_method create $BIG_ID 
    --method_id="flat_rate" 
    --user=$ADMIN 
    --path=$WP_PATH 
    --porcelain)

echo "Büyük şehirler bölgesi kuruldu. Bölge ID: $BIG_ID"

# 3. Diğer Türkiye
echo "Diğer Türkiye bölgesi oluşturuluyor..."
TR_ID=$(wp wc shipping_zone create 
    --name="Diğer Türkiye" 
    --order=3 
    --user=$ADMIN 
    --path=$WP_PATH 
    --porcelain)

wp wc shipping_zone_location update $TR_ID 
    --user=$ADMIN 
    --path=$WP_PATH 
    '[{"code":"TR","type":"country"}]'

TR_METHOD=$(wp wc shipping_zone_method create $TR_ID 
    --method_id="flat_rate" 
    --user=$ADMIN 
    --path=$WP_PATH 
    --porcelain)

echo "=== Kurulum Tamamlandı ==="
echo "İstanbul: $IST_ID | Büyük Şehirler: $BIG_ID | Türkiye: $TR_ID"

Kargo Bölgesi Silme ve Temizlik İşlemleri

Test ortamlarında veya yeniden yapılandırma süreçlerinde mevcut bölgeleri temizlemeniz gerekebilir. delete komutuyla bunu yapabilirsiniz:

# Tek bir bölgeyi sil
wp wc shipping_zone delete 5 --user=admin

# Silme işlemini zorla (onay istemeden)
wp wc shipping_zone delete 5 --user=admin --force

# Tüm bölgeleri sil (DİKKATLİ KULLANIN!)
wp wc shipping_zone list --user=admin --format=ids | 
    xargs -I{} wp wc shipping_zone delete {} --user=admin --force

Son komutu dikkatli kullanmanızı önemle belirtmek isterim. Üretim ortamında çalıştırmadan önce mutlaka veritabanı yedeği alın.

# Silmeden önce yedek al
wp db export backup_before_zone_cleanup.sql --path=/var/www/html/eticaret
echo "Yedek alındı, bölgeler temizleniyor..."

Kargo Bölgelerini Dışa ve İçe Aktarma

Bir siteden diğerine kargo bölgelerini taşımak istediğinizde JSON formatını kullanabilirsiniz. Bu özellikle staging-production senkronizasyonunda işe yarar.

# Mevcut bölgeleri JSON olarak dışa aktar
wp wc shipping_zone list 
    --user=admin 
    --format=json > shipping_zones_backup.json

# Her bölgenin detaylarını ve lokasyonlarını da kaydet
#!/bin/bash
OUTPUT_FILE="full_shipping_config.json"
echo "[]" > $OUTPUT_FILE

for zone_id in $(wp wc shipping_zone list --user=admin --format=ids); do
    zone_data=$(wp wc shipping_zone get $zone_id --user=admin --format=json)
    locations=$(wp wc shipping_zone_location list $zone_id --user=admin --format=json)
    methods=$(wp wc shipping_zone_method list $zone_id --user=admin --format=json)
    
    echo "Bölge $zone_id yedeklendi"
    echo "--- Bölge $zone_id ---" >> zone_details.log
    echo "Veri: $zone_data" >> zone_details.log
    echo "Lokasyonlar: $locations" >> zone_details.log
    echo "Yöntemler: $methods" >> zone_details.log
done

echo "Yedekleme tamamlandı: zone_details.log"

Hata Ayıklama ve Sık Karşılaşılan Sorunlar

WP-CLI ile kargo bölgesi yönetiminde bazı yaygın sorunlar ve çözümleri:

Yetki Hatası: Error: Sorry, you are not allowed to do this. hatası alıyorsanız --user parametresinde belirttiğiniz kullanıcının yönetici yetkisine sahip olduğundan emin olun.

# Kullanıcı yetkisini kontrol et
wp user get admin --field=roles --user=admin

# Kullanıcıyı yönetici yap
wp user set-role admin administrator

WooCommerce REST API Devre Dışı: Bazı güvenlik eklentileri REST API’yi kapayabilir. Bunu kontrol edin:

# REST API durumunu kontrol et
wp eval 'echo rest_url();'

# WooCommerce sistem durumunu kontrol et
wp wc system_status --user=admin

Lokasyon Kodu Hatası: Yanlış formatta il veya ülke kodu girdiğinizde sessiz hata alabilirsiniz. WooCommerce’in kabul ettiği format ÜLKE:İL_KODU şeklindedir. Türkiye için il kodları WooCommerce’in kendi veritabanında tanımlıdır.

# Desteklenen ülkeleri ve kodları listele
wp eval 'print_r(WC()->countries->get_countries());' | head -50

# Türkiye illerini listele
wp eval 'print_r(WC()->countries->get_states("TR"));'

Otomatizasyon ve Cron ile Entegrasyon

Kargo bölgelerini periyodik olarak güncellemeniz gerekiyorsa, örneğin mevsimlik kampanyalarda veya bölgesel promosyonlarda, cron job ile WP-CLI komutlarını birleştirebilirsiniz.

# /etc/cron.d/woo_shipping dosyası
# Her Pazartesi sabah 6'da kargo bölgelerini güncelle
0 6 * * 1 www-data wp wc shipping_zone update 1 --name="İstanbul Kampanya" --user=admin --path=/var/www/html/eticaret >> /var/log/woo_shipping.log 2>&1

Daha karmaşık senaryolar için Python veya Node.js ile WooCommerce REST API’yi kullanmak daha esnek bir yaklaşım olabilir. Ancak WP-CLI, sunucuya doğrudan erişiminiz olduğunda her zaman en hızlı ve güvenilir yoldur.

Staging ve Production Arasında Senkronizasyon

Gerçek bir prodüksiyon senaryosunda kargo bölgelerini staging’de test edip production’a geçirmek isteyebilirsiniz. Bunu şu yaklaşımla yapabilirsiniz:

#!/bin/bash
# Staging'den production'a kargo bölgesi senkronizasyonu
STAGING_PATH="/var/www/html/staging"
PROD_PATH="/var/www/html/production"

echo "Staging kargo bölgeleri kontrol ediliyor..."
staging_zones=$(wp wc shipping_zone list --user=admin --path=$STAGING_PATH --format=json)

echo "Production yedekleniyor..."
wp db export /backup/prod_before_sync_$(date +%Y%m%d).sql --path=$PROD_PATH

echo "Senkronizasyon başlıyor..."
# Burada her zone için kopyalama mantığı eklenebilir
echo "Staging bölgeleri: $staging_zones"
echo "Manuel doğrulama yapmanızı öneririm. Otomatik senkronizasyon risklidir!"

Bu adımda tam otomasyonu tavsiye etmiyorum. Kargo bölgesi değişiklikleri sipariş süreçlerini doğrudan etkilediğinden, production’a geçişte mutlaka manuel doğrulama yapın.

Sonuç

wp wc shipping_zone komut ailesi, WooCommerce kargo bölgesi yönetimini dramatik biçimde hızlandırır. Panel üzerinde saatlerce uğraşabileceğiniz yapılandırmaları dakikalar içinde tamamlayabilir, scriptlerle tekrarlanabilir hale getirebilirsiniz.

Özellikle şu durumlarda WP-CLI yaklaşımı kesinlikle tercih edilmeli:

  • Çok sayıda bölge ve yöntem kurulumu yapıyorsanız
  • Staging-production arasında yapılandırma taşıyorsanız
  • Periyodik kargo bölgesi güncellemelerini otomatize etmek istiyorsanız
  • Birden fazla siteye aynı kargo yapısını uygulamanız gerekiyorsa
  • Felaket kurtarma senaryolarında hızlı yeniden kurulum gerekiyorsa

Unutmayın, her WP-CLI komutu öncesinde veritabanı yedeği almak iyi bir alışkanlıktır. wp db export backup.sql komutu bir dakikanızı alır ama sizi saatlik baş ağrısından kurtarabilir. WooCommerce kargo yapısı sitenizin para kazanan kısmıyla doğrudan ilişkili olduğundan, prodüksiyon ortamında değişiklikleri her zaman önce staging üzerinde test edin.

Bir yanıt yazın

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