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.
/tmpveya 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 listkomutu ve format seçenekleri - Büyük veri setleri için sayfalama ve otomatik bash scriptleri
jqile 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.
