WooCommerce CLI ile Müşteri Verilerini Dışa Aktarma

E-ticaret operasyonlarında müşteri verilerini yönetmek, zamanla gerçek bir baş ağrısına dönüşebilir. Binlerce siparişi olan bir WooCommerce mağazasında müşteri listesini export etmek istediğinizde WordPress admin paneli yetersiz kalır, eklentiler çakışır ya da sunucu tarafında timeout hatası alırsınız. İşte tam bu noktada WP-CLI devreye giriyor ve hayatı ciddi ölçüde kolaylaştırıyor.

Bu yazıda WP-CLI kullanarak WooCommerce müşteri verilerini nasıl dışa aktaracağınızı, filtreleyeceğinizi ve işleyeceğinizi adım adım ele alacağız. Sadece teorik değil, gerçek dünya senaryolarıyla birlikte pratik komut örnekleri sunacağım.

WP-CLI ile WooCommerce’e Giriş

WP-CLI, WordPress’i komut satırından yönetmenizi sağlayan resmi araçtır. WooCommerce ise kendi WP-CLI komutlarını bu araca entegre etmiştir. Yani sunucuya SSH ile bağlanıp doğrudan wp wc komutlarını çalıştırabilirsiniz.

Öncelikle WP-CLI’nin kurulu olup olmadığını ve WooCommerce entegrasyonunun aktif olduğunu kontrol edelim:

wp --version
wp plugin list | grep woocommerce
wp wc --help

Eğer wp wc komutu hata veriyorsa WooCommerce eklentisinin aktif olduğundan emin olun. WP-CLI komutları, aktif olmayan eklentilerin sağladığı komutları tanımaz.

Müşteri verilerine erişmek için kullanacağımız temel komut wp wc customer komutudur. Bu komut altında list, get, create, update, delete gibi alt komutlar bulunur. Biz bu yazıda ağırlıklı olarak list ve get üzerinde duracağız.

Temel Müşteri Listeleme Komutu

En basit haliyle mevcut müşterileri listelemek için şu komutu kullanırsınız:

wp wc customer list --user=admin

Buradaki --user=admin parametresi, WooCommerce REST API çağrısını hangi kullanıcı yetkisiyle yapacağınızı belirtir. Bu kullanıcının administrator rolüne sahip olması gerekir, aksi halde yetki hatası alırsınız.

Bu komut size varsayılan olarak JSON formatında bir çıktı verir. Terminalde okumak biraz zordur ama boru hattıyla (pipe) başka araçlara aktarmak için idealdir.

Çıktıyı daha okunabilir hale getirmek için --format parametresini kullanabilirsiniz:

wp wc customer list --user=admin --format=table

Desteklenen formatlar şunlardır:

  • json: Varsayılan format, makine okuma için idealdir
  • table: Terminal üzerinde okunabilir tablo çıktısı
  • csv: Virgülle ayrılmış değerler, Excel ile açmak için
  • yaml: YAML formatı, konfigürasyon araçlarıyla uyumlu
  • ids: Sadece ID listesi döner, script yazarken kullanışlıdır
  • count: Toplam kayıt sayısını döner

Belirli Alanları Dışa Aktarma

Tüm müşteri verisini almak yerine sadece ihtiyacınız olan alanları seçebilirsiniz. Bu hem performansı artırır hem de çıktıyı temiz tutar:

wp wc customer list --user=admin 
  --fields=id,email,first_name,last_name,username 
  --format=csv

Bu komut size sadece ID, email, ad, soyad ve kullanıcı adını CSV olarak döndürür. Bunu direkt bir dosyaya yönlendirerek kaydedebilirsiniz:

wp wc customer list --user=admin 
  --fields=id,email,first_name,last_name,username,orders_count,total_spent 
  --format=csv > /tmp/musteri_listesi.csv

orders_count ve total_spent alanları özellikle değerlidir. Kaç sipariş verdiğini ve toplam ne kadar harcadığını bu şekilde görebilirsiniz. Pazarlama segmentasyonu için bu iki alan altın değerindedir.

Sayfalama ile Büyük Veri Setlerini Yönetme

WooCommerce CLI komutları varsayılan olarak sayfalama uygular ve tek seferde sınırlı sayıda kayıt döner. Büyük mağazalarda tüm müşterileri çekmek için --page ve --per_page parametrelerini kullanmanız gerekir:

# İlk 100 müşteriyi al
wp wc customer list --user=admin --per_page=100 --page=1 --format=csv

# İkinci 100 müşteriyi al
wp wc customer list --user=admin --per_page=100 --page=2 --format=csv

Binlerce müşterisi olan bir mağaza için bunu otomatikleştirmek mantıklıdır. İşte bunu yapan basit bir bash script:

#!/bin/bash

OUTPUT_FILE="/tmp/tum_musteriler.csv"
TEMP_FILE="/tmp/musteri_temp.csv"
PAGE=1
PER_PAGE=100
TOPLAM=0

# CSV başlığını yaz
echo "id,email,first_name,last_name,username,orders_count,total_spent" > "$OUTPUT_FILE"

while true; do
    # Sayfayı çek, başlık satırını atla (-n +2)
    wp wc customer list 
        --user=admin 
        --fields=id,email,first_name,last_name,username,orders_count,total_spent 
        --format=csv 
        --per_page=$PER_PAGE 
        --page=$PAGE 2>/dev/null | tail -n +2 > "$TEMP_FILE"
    
    # Dosya boşsa döngüden çık
    if [ ! -s "$TEMP_FILE" ]; then
        break
    fi
    
    # Ana dosyaya ekle
    cat "$TEMP_FILE" >> "$OUTPUT_FILE"
    
    SATIR_SAYISI=$(wc -l < "$TEMP_FILE")
    TOPLAM=$((TOPLAM + SATIR_SAYISI))
    echo "Sayfa $PAGE işlendi, $SATIR_SAYISI müşteri eklendi (Toplam: $TOPLAM)"
    
    # Son sayfaya ulaştık mı?
    if [ "$SATIR_SAYISI" -lt "$PER_PAGE" ]; then
        break
    fi
    
    PAGE=$((PAGE + 1))
done

rm -f "$TEMP_FILE"
echo "Tamamlandi! Toplam $TOPLAM musteri $OUTPUT_FILE dosyasina yazildi."

Bu script’i çalıştırabilmek için önce çalıştırma izni vermeniz gerekir:

chmod +x musteri_export.sh
./musteri_export.sh

Tek Bir Müşterinin Detaylı Bilgilerini Alma

Belirli bir müşteriyi ID’si ile sorgulamak için get komutunu kullanırsınız:

wp wc customer get 42 --user=admin

Bu komut size o müşteriye ait tüm veriyi JSON formatında döndürür. Fatura adresi, teslimat adresi, meta veriler ve daha fazlası buradadır.

Belirli alanları görmek için yine --fields kullanabilirsiniz:

wp wc customer get 42 --user=admin 
  --fields=id,email,first_name,last_name,billing,shipping

Fatura ve teslimat adres bilgileri iç içe geçmiş (nested) JSON objesi olarak gelir. Bunu parse etmek için jq aracı çok işinize yarar:

wp wc customer get 42 --user=admin --format=json | 
  jq '{
    ad: .first_name,
    soyad: .last_name,
    email: .email,
    fatura_sehir: .billing.city,
    fatura_ulke: .billing.country,
    telefon: .billing.phone
  }'

Müşterileri Filtreleyerek Dışa Aktarma

WooCommerce CLI, müşteri sorgularında bazı filtreleme seçenekleri sunar. Ancak gelişmiş filtreleme için WP-CLI’nin wp user komutu ve WordPress’in veritabanı sorgularından yararlanmak gerekebilir.

Belirli bir rolü olan kullanıcıları listelemek için:

wp user list --role=customer 
  --fields=ID,user_email,first_name,last_name,user_registered 
  --format=csv > /tmp/customer_role.csv

Belirli bir tarihten sonra kayıt olan müşterileri almak için:

wp user list --role=customer 
  --fields=ID,user_email,display_name,user_registered 
  --format=csv 
  --after=2024-01-01

Yüksek değerli müşterileri WooCommerce meta verisinden çekmek daha ileri seviye bir işlemdir. Bunun için doğrudan veritabanı sorgusu kullanmak çok daha pratiktir:

wp db query "
SELECT u.ID, u.user_email, u.display_name,
       MAX(CASE WHEN m.meta_key = '_order_count' THEN m.meta_value END) as siparis_sayisi,
       MAX(CASE WHEN m.meta_key = '_money_spent' THEN m.meta_value END) as toplam_harcama
FROM wp_users u
JOIN wp_usermeta m ON u.ID = m.user_id
WHERE m.meta_key IN ('_order_count', '_money_spent')
GROUP BY u.ID
HAVING toplam_harcama > 1000
ORDER BY toplam_harcama DESC
LIMIT 50;
" --skip-column-names | column -t

Bu sorgu 1000 TL üzerinde harcama yapmış müşterileri en yüksekten en düşüğe sıralar.

Gerçek Dünya Senaryosu: E-posta Pazarlama Listesi Hazırlama

Bir e-ticaret danışmanı olarak sık karşılaştığım durum şu: Müşteri 6 ay boyunca sipariş vermemiş, mail göndermek istiyor ama mail pazarlama aracına aktaracak temiz bir liste yok.

Bu senaryo için şu adımları izliyorum:

#!/bin/bash

# Son 6 ayda sipariş vermeyen ama daha önce alışveriş yapmış müşteriler
# Bu sorgu WooCommerce'in standart meta yapısını kullanır

TARIH_SINIR=$(date -d "6 months ago" +%Y-%m-%d)

wp db query "
SELECT DISTINCT
    u.ID,
    u.user_email,
    um_ad.meta_value AS first_name,
    um_soyad.meta_value AS last_name,
    um_siparis.meta_value AS toplam_siparis,
    um_harcama.meta_value AS toplam_harcama,
    MAX(p.post_date) AS son_siparis_tarihi
FROM wp_users u
LEFT JOIN wp_usermeta um_ad ON u.ID = um_ad.user_id AND um_ad.meta_key = 'first_name'
LEFT JOIN wp_usermeta um_soyad ON u.ID = um_soyad.user_id AND um_soyad.meta_key = 'last_name'
LEFT JOIN wp_usermeta um_siparis ON u.ID = um_siparis.user_id AND um_siparis.meta_key = '_order_count'
LEFT JOIN wp_usermeta um_harcama ON u.ID = um_harcama.user_id AND um_harcama.meta_key = '_money_spent'
LEFT JOIN wp_posts p ON p.post_author = u.ID AND p.post_type = 'shop_order'
WHERE um_siparis.meta_value > 0
GROUP BY u.ID
HAVING son_siparis_tarihi < '$TARIH_SINIR'
ORDER BY toplam_harcama DESC
INTO OUTFILE '/tmp/uyuyan_musteriler.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY 'n';
"

echo "Uyuyan musteri listesi /tmp/uyuyan_musteriler.csv dosyasina yazildi."

Bu yaklaşım hem WP-CLI’nin güvenli veritabanı bağlantısını kullanır hem de karmaşık filtrelemeyi doğrudan SQL üzerinde yapar.

WooCommerce Sipariş Bazlı Müşteri Verisi Çekme

Bazen müşteri listesi değil, siparişlerle birlikte müşteri bilgisi gerekir. Özellikle muhasebe entegrasyonlarında bu durum çok sık karşıma çıkıyor.

Siparişleri müşteri bilgileriyle birlikte çekmek için:

wp wc order list --user=admin 
  --fields=id,status,date_created,total,billing 
  --format=json 
  --after=2024-01-01T00:00:00 
  --before=2024-12-31T23:59:59 
  --per_page=100 | 
  jq -r '.[] | [.id, .status, .date_created, .total, .billing.first_name, .billing.last_name, .billing.email] | @csv'

Bu komut 2024 yılına ait siparişleri müşteri adı ve email’iyle birlikte CSV formatında çıktılar. jq ile yapılan @csv dönüşümü özel karakterleri otomatik olarak escape eder.

Müşteri Verilerini Toplu Güncelleme

Dışa aktarmanın yanı sıra WP-CLI ile toplu güncelleme de yapabilirsiniz. Örneğin tüm müşterilerin bir meta alanını güncellemek istiyorsanız:

# Tüm müşteri ID'lerini al
wp wc customer list --user=admin --format=ids | 
tr ',' 'n' | 
while read CUSTOMER_ID; do
    # Her müşteriyi güncelle
    wp wc customer update $CUSTOMER_ID 
        --user=admin 
        --meta_data='[{"key":"newsletter_status","value":"opted_in"}]'
    echo "Musteri $CUSTOMER_ID guncellendi"
done

Bu tür toplu işlemlerde dikkatli olun. Özellikle büyük mağazalarda binlerce müşteri için döngü çalıştırmak sunucuyu yorabilir. Aşağıdaki gibi bir sleep eklemek sunucu yükünü dengeler:

wp wc customer list --user=admin --format=ids | 
tr ',' 'n' | 
while read CUSTOMER_ID; do
    wp wc customer update $CUSTOMER_ID 
        --user=admin 
        --meta_data='[{"key":"loyalty_tier","value":"standard"}]'
    echo "Musteri $CUSTOMER_ID guncellendi"
    sleep 0.1
done

Otomatik Yedekleme ve Zamanlama

Müşteri verilerini düzenli olarak yedeklemek iyi bir pratiktir. Crontab ile bunu kolayca otomatize edebilirsiniz:

# Crontab'a eklemek için
crontab -e

Aşağıdaki satırı ekleyin (her gece 02:00’de çalışır):

0 2 * * * cd /var/www/html && wp wc customer list --user=admin --fields=id,email,first_name,last_name,username,orders_count,total_spent --format=csv --per_page=1000 --allow-root > /backup/musteriler_$(date +%Y%m%d).csv 2>&1

--allow-root parametresi root kullanıcısıyla çalışırken gereklidir. WP-CLI normalde root ile çalışmayı engeller, bu parametre bu kısıtlamayı aşar.

Eski yedek dosyalarını temizlemek için buna bir de silme komutu ekleyebilirsiniz:

0 3 * * * find /backup -name "musteriler_*.csv" -mtime +30 -delete

Bu komut 30 günden eski CSV dosyalarını siler.

Güvenlik ve İzin Konuları

Müşteri verilerini dışa aktarırken güvenlik son derece önemlidir. Şu noktalara dikkat edin:

  • Dosya izinleri: Export edilen CSV dosyalarını web tarayıcısından erişilebilir bir konuma yazmayın. /tmp veya web kökünün dışında bir klasör kullanın.
  • SSH erişimi: WP-CLI komutlarını sadece SSH tüneli üzerinden çalıştırın, asla düz HTTP üzerinden.
  • Log kayıtları: Kimin ne zaman hangi veriyi export ettiğini kayıt altına alın.
  • KVKK uyumu: Türkiye’de faaliyet gösteren e-ticaret siteleri için kişisel veri işleme kayıtları tutulması zorunludur.
  • Şifreleme: Hassas verileri içeren dosyaları GPG ile şifreleyin:
wp wc customer list --user=admin --format=csv | 
  gpg --encrypt --recipient [email protected] 
  --output /backup/musteriler_sifrelenmis.csv.gpg

Ayrıca WP-CLI komutlarını çalıştıran kullanıcının gereksiz yetkilere sahip olmaması gerekir. Sadece WooCommerce verilerine okuma yapacak bir admin kullanıcı oluşturup o kullanıcıyla işlem yapabilirsiniz:

# Sadece API erişimi için özel kullanıcı oluştur
wp user create api_export [email protected] --role=administrator --user_pass=guclu_sifre_buraya
wp wc customer list --user=api_export --format=csv > /backup/export.csv

Sorun Giderme ve Yaygın Hatalar

WP-CLI ile WooCommerce komutlarını çalıştırırken bazı hatalarla karşılaşabilirsiniz:

“Error: ‘wc’ is not a registered command” hatası: WooCommerce eklentisi aktif değil demektir.

wp plugin activate woocommerce

“Sorry, you cannot do that” yetki hatası: Belirttiğiniz kullanıcının administrator rolü olduğundan emin olun.

wp user get admin --fields=roles

Timeout hatası büyük sorgularda: --per_page değerini düşürün veya sunucu PHP max execution time değerini artırın.

# PHP timeout'u geçici olarak artır
wp config set WP_MAX_EXECUTION_TIME 300

Karakter kodlama sorunları: Türkçe karakter içeren müşteri verilerinde CSV bozulabilir.

wp wc customer list --user=admin --format=csv | 
  iconv -f UTF-8 -t UTF-8-BOM > /tmp/musteriler_bom.csv

BOM eklemek Excel’in Türkçe karakterleri doğru tanımasını sağlar.

Sonuç

WP-CLI ile WooCommerce müşteri verilerini yönetmek, büyük mağazalarda vazgeçilmez bir beceridir. Admin panelinin limitlerini aşarak binlerce müşteriyi saniyeler içinde dışa aktarabilir, filtreyebilir ve işleyebilirsiniz. Bu yazıda ele aldığımız konuları özetleyecek olursak:

  • Temel wp wc customer list komutu ve format seçenekleri
  • Büyük veri setleri için sayfalama ve otomatik bash scriptleri
  • jq ile JSON verisini işleme
  • Gelişmiş filtreleme için doğrudan SQL sorguları
  • Crontab ile otomatik yedekleme
  • Güvenlik ve KVKK uyumluluk pratikleri

Tüm bu araçları birleştirdiğinizde WooCommerce mağaza yönetimi çok daha güçlü ve esnek hale gelir. Özellikle birden fazla mağazayı yöneten ya da büyük hacimli e-ticaret operasyonları yürüten sysadminler için WP-CLI vazgeçilmez bir araç haline gelmektedir.

Sonraki yazıda WooCommerce siparişlerini WP-CLI ile toplu yönetmeyi ve sipariş durumu otomasyonunu ele alacağım.

Bir yanıt yazın

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