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=true parametresini 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.

Bir yanıt yazın

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