WP CLI ile WooCommerce Müşteri Yönetimi ve Sorguları
E-ticaret sitenizde yüzlerce, belki binlerce müşteri var ve bunları manuel olarak WordPress admin panelinden yönetmeye çalışıyorsunuz. Her müşteri için tıkla, bekle, filtrele, tekrar tıkla… Bu döngü hem zaman kaybı hem de sinir bozucu. WP-CLI’nin WooCommerce eklentisiyle gelen wp wc customer komutu tam da bu sorunu çözmek için tasarlanmış.
Bu yazıda wp wc customer komutunu her açıdan ele alacağız. Temel sorgulardan toplu işlemlere, gerçek dünya senaryolarına kadar elimden geldiğince pratik tutmaya çalışacağım.
WP WC Customer Komutuna Giriş
Öncelikle WP-CLI’nin kurulu ve WooCommerce eklentisinin aktif olduğundan emin olmanız gerekiyor. wp wc komutları WooCommerce REST API’ını arkada kullanır, dolayısıyla bir API kullanıcısı belirtmeniz şart.
wp wc customer --help
Bu komutu çalıştırdığınızda mevcut alt komutları görürsünüz:
- list: Müşterileri listeler
- get: Belirli bir müşteriyi getirir
- create: Yeni müşteri oluşturur
- update: Mevcut müşteriyi günceller
- delete: Müşteri siler
Komutları kullanırken --user= parametresini geçmeniz gerekir. Bu parametre WooCommerce API kimlik doğrulaması için WordPress kullanıcı ID’si ya da kullanıcı adı alır. Genellikle admin kullanıcısını kullanırsınız:
wp wc customer list --user=admin
Eğer her seferinde --user= yazmak istemiyorsanız, shell alias oluşturabilirsiniz:
alias wpcustomer='wp wc customer --user=admin'
Müşteri Listeleme ve Temel Sorgular
Tüm Müşterileri Listeleme
En temel kullanım şekliyle tüm müşterileri listelemek:
wp wc customer list --user=admin --format=table
Çıktıyı farklı formatlarda alabilirsiniz:
- table: Tablo formatında (terminal için okunabilir)
- json: JSON formatında (script’lerde işlemek için)
- csv: CSV formatında (Excel’e aktarmak için)
- yaml: YAML formatında
- ids: Sadece ID’leri getirir
Müşteri sayısı fazlaysa pagination kullanmak gerekir. WooCommerce API varsayılan olarak sayfa başına 10 kayıt döner:
wp wc customer list --user=admin --per_page=100 --page=1
Belirli Alanları Filtrelemek
Bazen sadece belirli alanları görmek istersiniz. --fields= parametresiyle bunu yapabilirsiniz:
wp wc customer list --user=admin --fields=id,email,first_name,last_name,orders_count,total_spent
Bu çok işe yarayan bir filtreleme. Özellikle toplu raporlama yaparken gereksiz alanları eleyip sadece ihtiyacınız olanları almak hem performansı artırır hem de çıktıyı okunabilir kılar.
Belirli Bir Müşteriyi Getirmek
Müşteri ID’sini biliyorsanız doğrudan o müşteriyi çekebilirsiniz:
wp wc customer get 42 --user=admin
Bu komut müşteriyle ilgili tüm bilgileri döker. Fatura adresi, teslimat adresi, toplam harcama miktarı, sipariş sayısı gibi detayların hepsini görürsünüz.
Sadece belirli alanları görmek için:
wp wc customer get 42 --user=admin --fields=email,first_name,last_name,billing
Müşteri Oluşturma
Temel Müşteri Oluşturma
Yeni bir müşteri oluşturmak için create alt komutunu kullanırsınız:
wp wc customer create
--user=admin
--email="[email protected]"
--first_name="Ahmet"
--last_name="Yilmaz"
--username="ahmetyilmaz"
--password="GucluBirSifre123!"
Fatura ve Teslimat Adresiyle Müşteri Oluşturma
Gerçek dünyada müşteri oluştururken genellikle adres bilgilerini de eklemek istersiniz:
wp wc customer create
--user=admin
--email="[email protected]"
--first_name="Fatma"
--last_name="Kaya"
--username="fatmakaya"
--password="SifreTest123!"
--billing='{"first_name":"Fatma","last_name":"Kaya","address_1":"Ataturk Caddesi No:15","city":"Istanbul","state":"","postcode":"34000","country":"TR","email":"[email protected]","phone":"05301234567"}'
--shipping='{"first_name":"Fatma","last_name":"Kaya","address_1":"Ataturk Caddesi No:15","city":"Istanbul","state":"","postcode":"34000","country":"TR"}'
JSON formatında adres bilgisi geçmek biraz garip görünebilir ama alıştıktan sonra oldukça güçlü bir yöntem. Özellikle toplu müşteri import işlemlerinde script içinde bu yapıyı dinamik olarak oluşturabilirsiniz.
Müşteri Güncelleme
Temel Güncelleme
Mevcut bir müşterinin bilgilerini güncellemek için:
wp wc customer update 42
--user=admin
--first_name="Ahmet"
--last_name="Demir"
E-posta Adresi Güncelleme
Müşteri e-posta adresini değiştirmeniz gerektiğinde:
wp wc customer update 42
--user=admin
--email="[email protected]"
Bu işlem hem WooCommerce müşteri kaydını hem de WordPress kullanıcı kaydını günceller.
Gerçek Dünya Senaryoları
Senaryo 1: Toplu Müşteri Raporu Oluşturma
Diyelim ki muhasebe departmanı sizden tüm müşterilerin toplam harcama raporunu istedi. CSV olarak vermek istiyorsunuz:
wp wc customer list
--user=admin
--per_page=100
--fields=id,email,first_name,last_name,orders_count,total_spent
--format=csv > musteri_raporu.csv
Ama bekleyin, 100’den fazla müşteriniz varsa ne olacak? Basit bir bash döngüsü yazmanız gerekiyor:
#!/bin/bash
OUTPUT_FILE="tum_musteriler.csv"
PAGE=1
PER_PAGE=100
# Header satırı yaz
echo "id,email,first_name,last_name,orders_count,total_spent" > $OUTPUT_FILE
while true; do
# Sayfayı çek, header'ı atla (tail -n +2)
RESULT=$(wp wc customer list
--user=admin
--per_page=$PER_PAGE
--page=$PAGE
--fields=id,email,first_name,last_name,orders_count,total_spent
--format=csv 2>/dev/null | tail -n +2)
# Sonuç boşsa döngüyü kır
if [ -z "$RESULT" ]; then
break
fi
echo "$RESULT" >> $OUTPUT_FILE
echo "Sayfa $PAGE islendi..."
PAGE=$((PAGE + 1))
done
echo "Rapor tamamlandi: $OUTPUT_FILE"
Bu script’i çalıştırdığınızda tüm müşterilerinizi tek bir CSV dosyasına aktarır.
Senaryo 2: Hiç Sipariş Vermemiş Müşterileri Bulma
Pazarlama ekibi, kayıt olmuş ama hiç alışveriş yapmamış müşterileri bulmak istiyor. Bunlara özel bir kampanya mail’i gönderecekler:
#!/bin/bash
echo "Siparis vermemis musteriler aranıyor..."
wp wc customer list
--user=admin
--per_page=100
--fields=id,email,first_name,orders_count
--format=json |
python3 -c "
import json, sys
data = json.load(sys.stdin)
no_orders = [c for c in data if c['orders_count'] == 0]
print('Email,Ad')
for c in no_orders:
print(f"{c['email']},{c['first_name']}")
print(f'nToplam: {len(no_orders)} musteri', file=sys.stderr)
"
Eğer Python kullanmak istemiyorsanız, jq ile de yapabilirsiniz:
wp wc customer list
--user=admin
--per_page=100
--fields=id,email,first_name,orders_count
--format=json |
jq -r '.[] | select(.orders_count == 0) | [.email, .first_name] | @csv'
Senaryo 3: Belirli Bir Ülkedeki Müşterileri Filtreleme
WooCommerce API’ı ülke bazlı filtreleme destekliyor:
wp wc customer list
--user=admin
--country=TR
--per_page=100
--fields=id,email,first_name,last_name
--format=table
Senaryo 4: VIP Müşteri Tespiti
Belirli bir tutarın üzerinde harcama yapmış müşterileri bulmak ve bunlara özel bir rol atamak istiyorsunuz. Mesela 5000 TL üzeri harcama yapanları “VIP” segmentine almak:
#!/bin/bash
VIP_THRESHOLD=5000
PAGE=1
echo "VIP musteri tespiti basliyor (Esik: ${VIP_THRESHOLD} TL)..."
while true; do
CUSTOMERS=$(wp wc customer list
--user=admin
--per_page=100
--page=$PAGE
--fields=id,email,first_name,last_name,total_spent
--format=json 2>/dev/null)
if [ "$CUSTOMERS" = "[]" ] || [ -z "$CUSTOMERS" ]; then
break
fi
# total_spent VIP eşiğinin üzerindeki müşterileri bul
VIP_IDS=$(echo $CUSTOMERS | jq -r ".[] | select(.total_spent >= $VIP_THRESHOLD) | .id")
for ID in $VIP_IDS; do
EMAIL=$(echo $CUSTOMERS | jq -r ".[] | select(.id == $ID) | .email")
SPENT=$(echo $CUSTOMERS | jq -r ".[] | select(.id == $ID) | .total_spent")
echo "VIP Musteri: $EMAIL - Harcama: $SPENT TL"
# WordPress kullanıcı rolüne custom meta ekle
wp user meta update $ID vip_customer 1 --allow-root
done
PAGE=$((PAGE + 1))
done
echo "Islem tamamlandi."
Senaryo 5: Müşteri Silme (Dikkatli Kullanın!)
Eski ve artık aktif olmayan test hesaplarını temizlemek isteyebilirsiniz. Bu işlemi yapmadan önce mutlaka yedek alın:
# Önce silinecek müşteriyi kontrol edin
wp wc customer get 99 --user=admin
# Müşteriyi sil (force=true siparişleri de siler)
wp wc customer delete 99 --user=admin --force=true
Toplu silme işlemi için çok dikkatli olun. Bunu asla production’da test etmeden çalıştırmayın:
#!/bin/bash
# UYARI: Bu script test ortamında deneyin!
# Test kullanıcılarını bul (email'i test.com ile bitenler)
TEST_CUSTOMERS=$(wp wc customer list
--user=admin
--per_page=100
--fields=id,email
--format=json |
jq -r '.[] | select(.email | endswith("test.com")) | .id')
for ID in $TEST_CUSTOMERS; do
echo "Siliniyor: ID $ID"
wp wc customer delete $ID --user=admin --force=true
done
Performans İpuçları
Komutları Hızlandırmak
Büyük veritabanlarında wp wc customer list yavaş çalışabilir. Birkaç şey yapabilirsiniz:
Sadece gerekli alanları isteyin: Tüm alanları çekmek yerine sadece işinize yarayanları --fields= ile belirtin. Bu API yanıt boyutunu önemli ölçüde küçültür.
Per_page değerini ayarlayın: Çok küçük değerler çok fazla API isteği yapmanıza yol açar, çok büyük değerler ise tek bir isteği yavaşlatır. 100 genellikle iyi bir başlangıç noktasıdır.
Paralel işleme: Eğer bağımsız müşteri işlemleri yapıyorsanız xargs veya parallel komutu ile paralelleştirme yapabilirsiniz:
# Müşteri ID listesini al
CUSTOMER_IDS=$(wp wc customer list --user=admin --format=ids)
# Her ID için paralel işlem yap (max 4 paralel)
echo $CUSTOMER_IDS | tr ' ' 'n' |
xargs -P 4 -I {} wp wc customer get {} --user=admin --format=json
Sonuçları Cache’leme
Sık çalıştırılan sorgular için sonuçları geçici olarak dosyaya yazabilirsiniz:
#!/bin/bash
CACHE_FILE="/tmp/wc_customers_cache.json"
CACHE_MAX_AGE=3600 # 1 saat
# Cache dosyası yoksa veya eskiyse güncelle
if [ ! -f "$CACHE_FILE" ] ||
[ $(($(date +%s) - $(stat -c %Y "$CACHE_FILE"))) -gt $CACHE_MAX_AGE ]; then
echo "Cache yenileniyor..."
wp wc customer list
--user=admin
--per_page=100
--format=json > "$CACHE_FILE"
fi
# Cache'den oku
cat "$CACHE_FILE" | jq '.'
Hata Ayıklama ve Yaygın Sorunlar
“Error: No ID specified” Hatası
Bu hata get, update veya delete komutlarında ID belirtmediğinizde çıkar. Komutun doğru formatı:
wp wc customer get <ID> --user=admin
“Error: Sorry, you are not allowed to list resources” Hatası
Bu hata --user= parametresinde belirttiğiniz kullanıcının yeterli yetkiye sahip olmadığını gösterir. Kullanıcının Administrator rolünde olduğundan emin olun:
wp user get admin --fields=roles
API Zaman Aşımı Sorunları
Çok büyük sorgularda zaman aşımı yaşayabilirsiniz. wp-cli.yml dosyasına timeout ayarı ekleyebilirsiniz:
# wp-cli.yml
config:
require:
- wp-cli-config.php
apache_modules:
- mod_rewrite
Ya da PHP’nin max_execution_time değerini artırabilirsiniz. Ama en sağlıklı çözüm sorguları parçalamak:
# Büyük sorguları sayfalara böl
for i in 1 2 3 4 5; do
wp wc customer list --user=admin --page=$i --per_page=20
sleep 1 # Sunucuyu rahatlatmak için kısa bekleme
done
Debug Modu
Bir şeyler ters gidiyorsa --debug flag’ini ekleyerek detaylı çıktı alabilirsiniz:
wp wc customer list --user=admin --debug 2>&1 | head -50
Müşteri Verilerini Başka Araçlarla Birleştirme
WP-CLI çıktısını diğer araçlarla pipeline’a bağlamak güçlü kombinasyonlar yaratır.
MySQL ile Birleştirme
Bazen WooCommerce API’ının sunmadığı filtreleri doğrudan veritabanından çekmeniz gerekir:
# Belirli bir tarihten sonra kayıt olan müşterilerin WP user ID'lerini bul
RECENT_USER_IDS=$(wp db query
"SELECT ID FROM wp_users WHERE user_registered > '2024-01-01'"
--skip-column-names)
# Bu ID'leri WooCommerce customer ID'lerine dönüştür
for UID in $RECENT_USER_IDS; do
wp wc customer get $UID --user=admin --fields=id,email,orders_count 2>/dev/null
done
Mail Gönderimi ile Entegrasyon
Müşteri listesini çekip WP-CLI mail komutuyla birleştirerek toplu bildirim gönderebilirsiniz (WP mail komutunun kurulu olduğunu varsayıyoruz):
#!/bin/bash
# Son 30 günde sipariş vermemiş müşterilere hatırlatma maili
INACTIVE_CUSTOMERS=$(wp wc customer list
--user=admin
--per_page=100
--fields=id,email,first_name
--format=json |
jq -r '.[] | select(.orders_count > 0) | [.email, .first_name] | @tsv')
while IFS=$'t' read -r EMAIL NAME; do
echo "Mail gonderiliyor: $EMAIL"
# Burada wp mail send veya başka bir mail komutu kullanılabilir
# wp eval "wp_mail('$EMAIL', 'Sizi özledik $NAME!', 'Yeni kampanyalarımız için tıklayın...');"
done <<< "$INACTIVE_CUSTOMERS"
Güvenlik Notları
WP-CLI komutlarını cron job’larına eklerken bazı güvenlik konularına dikkat edin:
- Cron script’lerinde
--user=için mümkünse ayrı bir API kullanıcısı oluşturun, admin kullanıcısını doğrudan kullanmaktan kaçının - Script’leri world-readable yapmayın:
chmod 700 script.sh - Log dosyalarına hassas müşteri bilgileri yazmaktan kaçının
--force=trueparametresini içeren silme script’lerini çok dikkatli koruyun
Sonuç
wp wc customer komutu, WooCommerce mağazanızın müşteri yönetimini terminal üzerinden yapmanızı sağlayan güçlü bir araç. Admin panelinde tıklamakla geçireceğiniz zamanı bash script’leri ve otomasyon ile dakikalar hatta saniyelere indirebilirsiniz.
Özellikle şu senaryolarda bu komutu kullanmanızı öneririm: büyük veri aktarımları, toplu müşteri güncellemeleri, düzenli raporlama ihtiyaçları ve cron tabanlı otomasyon görevleri. Küçük tek seferlik işler için admin paneli yeterli olabilir, ama tekrarlayan görevler için WP-CLI’ye geçiş yapmanın zamanı geldi.
Script’leri her zaman önce staging ortamında test edin, özellikle silme ve güncelleme işlemleri içerenleri. Bir hata production’da ciddi sorunlara yol açabilir. Yedek almayı alışkanlık haline getirin ve --dry-run benzeri test modlarını kullanın (WooCommerce komutlarının bazıları bunu destekler).
Sorularınız varsa yorum bırakın, elimden geldiğince yardımcı olmaya çalışırım.
