WP WC Order ile Sipariş Listeleme ve Durum Güncelleme

E-ticaret sitelerini yönetirken en çok zaman harcanan işlerden biri sipariş takibi ve durum güncellemeleridir. Yüzlerce, hatta binlerce siparişin olduğu bir WooCommerce mağazasında bu işi WordPress admin panelinden yapmak hem yavaş hem de hataya açık bir süreçtir. İşte tam bu noktada WP-CLI’nin wp wc order komutları devreye giriyor ve hayatı ciddi ölçüde kolaylaştırıyor. Bu yazıda wp wc order komutunu kullanarak sipariş listeleme, filtreleme ve durum güncelleme işlemlerini gerçek dünya senaryolarıyla ele alacağız.

WP-CLI WooCommerce Eklentisi Hakkında

WP-CLI, WordPress’i komut satırından yönetmenizi sağlayan resmi araçtır. Ancak WooCommerce komutları (wp wc) için WooCommerce’in kendi WP-CLI entegrasyonu kullanılır ve bu entegrasyon WooCommerce eklentisi kurulu olduğunda otomatik olarak aktif hale gelir.

Başlamadan önce şunları kontrol edin:

# WP-CLI versiyonunu kontrol et
wp --version

# WooCommerce'in aktif olup olmadığını kontrol et
wp plugin status woocommerce

# WooCommerce WP-CLI komutlarının mevcut olup olmadığını kontrol et
wp wc --help

Eğer wp wc komutları çalışmıyorsa, WooCommerce eklentisinin etkin olmadığı anlamına gelir. Ayrıca wp wc order komutları için REST API anahtarına ihtiyacınız var. Bunu aşağıdaki gibi oluşturabilirsiniz:

# Kullanıcı ID'sini öğren (genellikle admin kullanıcısı)
wp user get admin --field=ID

# WooCommerce REST API anahtarı oluştur (kullanıcı ID'sini gir)
wp wc tool run regenerate_keys --user=1

Pek çok sysadmin bu adımı atlıyor ve komutlar neden çalışmıyor diye saatlerce uğraşıyor. --user parametresi zorunludur, bunu aklınızın bir köşesine yazın.

Siparişleri Listeleme

Temel Listeleme Komutu

En basit haliyle siparişleri listelemek için:

# Tüm siparişleri listele
wp wc shop_order list --user=1

# Daha okunaklı bir çıktı için JSON formatı
wp wc shop_order list --user=1 --format=json

# Tablo formatında listele
wp wc shop_order list --user=1 --format=table

Burada dikkat etmeniz gereken nokta, WP-CLI WooCommerce komutlarında siparişler için shop_order ifadesinin kullanılmasıdır. Bazı kaynaklar order yazıyor ama doğrusu shop_order‘dır. WooCommerce 3.x ve sonrasında bu böyle çalışır.

Belirli Alanları Listeleme

Varsayılan çıktı çok fazla bilgi içerir ve terminalde okumak zorlaşır. Sadece ihtiyacınız olan alanları çekmek daha verimli olur:

# Sadece ID, durum ve toplam tutarı listele
wp wc shop_order list --user=1 --fields=id,status,total --format=table

# Müşteri bilgileriyle birlikte listele
wp wc shop_order list --user=1 --fields=id,status,billing_first_name,billing_last_name,total,date_created --format=table

Yaygın kullanılan alanlar:

  • id: Sipariş numarası
  • status: Sipariş durumu (processing, completed, on-hold, cancelled vb.)
  • total: Toplam tutar
  • date_created: Oluşturulma tarihi
  • date_modified: Son değiştirilme tarihi
  • billing_first_name: Fatura adı
  • billing_last_name: Fatura soyadı
  • billing_email: Müşteri e-posta adresi
  • customer_id: Müşteri ID’si
  • payment_method: Ödeme yöntemi

Duruma Göre Filtreleme

Gerçek hayatta en çok ihtiyaç duyduğunuz şey belirli durumdaki siparişleri görmektir. Mesela “işleniyor” durumundaki siparişleri görmek istiyorsunuz:

# Sadece "processing" durumundaki siparişleri listele
wp wc shop_order list --user=1 --status=processing --format=table

# "On-hold" yani beklemedeki siparişleri listele
wp wc shop_order list --user=1 --status=on-hold --format=table

# İptal edilmiş siparişleri listele
wp wc shop_order list --user=1 --status=cancelled --format=table

# Tamamlanmış siparişleri listele
wp wc shop_order list --user=1 --status=completed --format=table

WooCommerce varsayılan sipariş durumları:

  • pending: Bekleyen ödeme
  • processing: İşleniyor (ödeme alındı, kargo hazırlanıyor)
  • on-hold: Beklemede (manuel onay bekleniyor)
  • completed: Tamamlandı
  • cancelled: İptal edildi
  • refunded: İade edildi
  • failed: Başarısız ödeme
  • trash: Çöp kutusu

Sayfa ve Limit Parametreleri

Büyük mağazalarda binlerce sipariş olabilir. Hepsini bir anda çekmek sunucuyu zorlayabilir:

# Sayfa başına 20 sipariş, ilk sayfayı göster
wp wc shop_order list --user=1 --per_page=20 --page=1 --format=table

# Sadece son 50 siparişi getir
wp wc shop_order list --user=1 --per_page=50 --format=table

# İkinci sayfaya geç
wp wc shop_order list --user=1 --per_page=50 --page=2 --format=table

Belirli Bir Siparişin Detaylarını Görme

Sipariş ID’sini biliyorsanız detaylarını tek komutla çekebilirsiniz:

# Sipariş 1234'ün tüm detaylarını göster
wp wc shop_order get 1234 --user=1

# JSON formatında göster (parse etmek için daha uygun)
wp wc shop_order get 1234 --user=1 --format=json

# Sadece belirli bir alanı getir
wp wc shop_order get 1234 --user=1 --field=status
wp wc shop_order get 1234 --user=1 --field=total
wp wc shop_order get 1234 --user=1 --field=billing_email

Bu komut özellikle müşteri desteği yaparken çok işe yarıyor. Müşteri siparişini soruyor, siz terminale iki satır yazıyorsunuz ve tüm detaylar önünüzde.

Sipariş Durumunu Güncelleme

Tek Siparişin Durumunu Güncelleme

# Sipariş 1234'ü "completed" yap
wp wc shop_order update 1234 --status=completed --user=1

# Sipariş 1234'ü "cancelled" yap
wp wc shop_order update 1234 --status=cancelled --user=1

# Sipariş 1234'ü "on-hold" yap
wp wc shop_order update 1234 --status=on-hold --user=1

Güncelleme sonrasında WP-CLI size JSON formatında güncellenmiş siparişi döndürür. Durum değişikliğinin başarılı olduğunu bu çıktıdan teyit edebilirsiniz.

Toplu Durum Güncelleme – Gerçek Senaryo

Diyelim ki kargo şirketinizle bir sorun yaşadınız ve “processing” durumundaki 50 siparişi “on-hold” durumuna almanız gerekiyor. Bunu admin panelinden tek tek yapmak saatlerce sürer. WP-CLI ile bunu bir döngüyle halledebilirsiniz:

# Processing durumundaki tüm sipariş ID'lerini al ve on-hold'a çevir
wp wc shop_order list --user=1 --status=processing --field=id --format=ids | 
  xargs -I{} wp wc shop_order update {} --status=on-hold --user=1

Bu komut önce processing durumundaki tüm sipariş ID’lerini alır, sonra her biri için güncelleme komutunu çalıştırır. Yüzlerce siparişi dakikalar içinde güncelleyebilirsiniz.

Daha güvenli bir yaklaşım için önce neyi güncelleyeceğinizi görün:

# Önce kaç sipariş etkileneceğini gör
wp wc shop_order list --user=1 --status=processing --format=ids | wc -w

# Sonra güncellemeyi yap
wp wc shop_order list --user=1 --status=processing --field=id --format=ids | 
  xargs -I{} wp wc shop_order update {} --status=on-hold --user=1

Gelişmiş Kullanım Senaryoları

Senaryo 1: Günlük Sipariş Raporu

Her sabah kaç tane işlenmemiş sipariş olduğunu görmek istiyorsunuz. Bunu bir bash scriptiyle otomatize edebilirsiniz:

#!/bin/bash
# /usr/local/bin/wc-daily-report.sh

WP_PATH="/var/www/html/wordpress"
WP_USER="1"
DATE=$(date +%Y-%m-%d)

echo "=== WooCommerce Sipariş Raporu - $DATE ==="
echo ""

echo "Bekleyen Ödemeler (pending):"
wp --path=$WP_PATH wc shop_order list --user=$WP_USER --status=pending --format=ids | wc -w

echo "İşleniyor (processing):"
wp --path=$WP_PATH wc shop_order list --user=$WP_USER --status=processing --format=ids | wc -w

echo "Beklemede (on-hold):"
wp --path=$WP_PATH wc shop_order list --user=$WP_USER --status=on-hold --format=ids | wc -w

echo "Başarısız Ödemeler (failed):"
wp --path=$WP_PATH wc shop_order list --user=$WP_USER --status=failed --format=ids | wc -w

echo ""
echo "Rapor tamamlandı."

Bu scripti crontab’a ekleyerek her sabah 08:00’de çalıştırabilirsiniz:

# Crontab'a ekle
crontab -e

# Şu satırı ekle:
0 8 * * * /usr/local/bin/wc-daily-report.sh | mail -s "Günlük Sipariş Raporu" [email protected]

Senaryo 2: Eski Bekleyen Siparişleri İptal Etme

Ödeme yapılmamış ve 7 günden eski olan siparişleri otomatik iptal etmek yaygın bir ihtiyaçtır. WooCommerce bunu belirli ölçüde otomatik yapıyor olsa da bazı durumlarda manuel müdahale gerekir:

#!/bin/bash
# Eski "pending" siparişleri bul ve iptal et
# Bu scripti dikkatli kullanın, geri alınamaz!

WP_PATH="/var/www/html/wordpress"
LOG_FILE="/var/log/wc-auto-cancel.log"

echo "$(date): Script başladı" >> $LOG_FILE

# Pending durumdaki sipariş ID'lerini al
PENDING_ORDERS=$(wp --path=$WP_PATH wc shop_order list 
  --user=1 
  --status=pending 
  --field=id 
  --format=ids)

for ORDER_ID in $PENDING_ORDERS; do
  # Siparişin oluşturulma tarihini al
  ORDER_DATE=$(wp --path=$WP_PATH wc shop_order get $ORDER_ID 
    --user=1 
    --field=date_created 
    --format=json)
  
  echo "Sipariş $ORDER_ID kontrol ediliyor... Tarih: $ORDER_DATE" >> $LOG_FILE
done

echo "$(date): Script tamamlandı" >> $LOG_FILE

Senaryo 3: Belirli Ödeme Yöntemine Göre Sipariş Listeleme

Banka havalesi ile gelen siparişleri ayrı tutup onaylamanız gerekebilir:

# Tüm siparişleri JSON olarak al ve ödeme yöntemine göre filtrele
wp wc shop_order list --user=1 --format=json --per_page=100 | 
  python3 -c "
import json, sys
orders = json.load(sys.stdin)
for order in orders:
    if order.get('payment_method') == 'bacs':  # bacs = banka havalesi
        print(f"Sipariş #{order['id']} - {order['billing']['first_name']} {order['billing']['last_name']} - {order['total']} TL")
"

Bu yaklaşım Python ile WP-CLI çıktısını birleştirerek güçlü bir filtreleme yapmanızı sağlar.

Senaryo 4: CSV Raporu Oluşturma

Muhasebe ekibine sipariş raporu hazırlamanız gerekiyor:

#!/bin/bash
# Aylık tamamlanmış siparişleri CSV'ye aktar

WP_PATH="/var/www/html/wordpress"
OUTPUT_FILE="/tmp/wc-tamamlanan-siparisler-$(date +%Y%m).csv"

echo "Siparis_ID,Musteri_Adi,Email,Toplam,Tarih" > $OUTPUT_FILE

wp --path=$WP_PATH wc shop_order list 
  --user=1 
  --status=completed 
  --per_page=200 
  --format=json | 
  python3 -c "
import json, sys
orders = json.load(sys.stdin)
for order in orders:
    print(f"{order['id']},{order['billing']['first_name']} {order['billing']['last_name']},{order['billing']['email']},{order['total']},{order['date_created']}")
" >> $OUTPUT_FILE

echo "CSV dosyası oluşturuldu: $OUTPUT_FILE"
wc -l $OUTPUT_FILE

Sipariş Metaverisi ile Çalışmak

WooCommerce siparişleri üzerinde özel meta veriler de saklayabilirsiniz. Bu özellikle özel alanlar kullanan mağazalarda önem kazanır:

# Siparişin tüm meta verilerini gör
wp post meta list 1234

# Belirli bir meta değerini oku
wp post meta get 1234 _order_key

# Özel meta değeri ekle veya güncelle
wp post meta update 1234 _kargo_takip_no "TK123456789TR"

# Meta değerini sil
wp post meta delete 1234 _gecici_not

Meta verilerle çalışırken wp post meta komutlarını kullanıyoruz çünkü WooCommerce siparişleri teknik olarak WordPress post tipindedir (özellikle HPOS aktif değilse).

HPOS (High Performance Order Storage) ile Uyumluluk

WooCommerce 7.1 ve sonrasında gelen HPOS (Yüksek Performanslı Sipariş Depolama) özelliği aktif edilmişse, siparişler artık özel tablolarda saklanır. Bu durumda wp post meta yerine doğrudan WooCommerce komutlarını kullanmanız gerekir:

# HPOS aktif mi kontrol et
wp option get woocommerce_feature_hpos_orders_enabled

# HPOS aktifken sipariş meta verisi güncelleme
wp wc shop_order update 1234 --meta_data='[{"key":"_kargo_takip_no","value":"TK123456789TR"}]' --user=1

HPOS konusu başlı başına uzun bir yazı konusu, ama en azından WP-CLI komutlarını kullanırken hangi modda çalıştığınızı bilmeniz önemli.

Hata Ayıklama ve Sorun Giderme

WP-CLI komutları bazen hata verebilir. İşte en sık karşılaşılan sorunlar ve çözümleri:

--user parametresi hatası:

# Hata: "Please provide a user ID or login to link API requests to"
# Çözüm: Her wp wc komutuna --user parametresi ekleyin
wp wc shop_order list --user=1

# Veya ortam değişkeni olarak tanımlayın
export WC_USER=1
wp wc shop_order list --user=$WC_USER

İzin hatası:

# Belirtilen kullanıcının admin yetkisi var mı kontrol et
wp user get 1 --fields=ID,user_login,roles

# Kullanıcıya admin rolü ver (gerekiyorsa)
wp user set-role 1 administrator

Boş sonuç dönmesi:

# WooCommerce'in düzgün yüklenip yüklenmediğini kontrol et
wp plugin list --status=active | grep woocommerce

# PHP hata loglarını kontrol et
tail -f /var/log/php/error.log

# WP-CLI'yi debug modunda çalıştır
wp wc shop_order list --user=1 --debug

İpuçları ve En İyi Uygulamalar

Sysadmin olarak bu komutları günlük rutinine katarken şu noktalara dikkat et:

  • Her zaman önce test et: Toplu güncelleme yapmadan önce --format=ids ile kaç siparişin etkileneceğini gör.
  • Log tut: Özellikle otomatik çalışan scriptlerde her işlemi log dosyasına yaz.
  • Yedek al: Büyük toplu güncellemeler öncesinde veritabanı yedeği al.
  • --per_page sınırını bil: Varsayılan değer genellikle 10’dur, büyük mağazalarda artırman gerekir ama çok yüksek değerler sunucuyu zorlayabilir.
  • Cron ile dikkatli ol: WP-CLI scriptlerini cron ile çalıştırırken tam path kullan (/usr/local/bin/wp gibi).
  • REST API limitleri: Çok fazla istek gönderirsen WooCommerce’in dahili rate limiting mekanizması devreye girebilir, istekler arasına sleep 1 eklemek bazen işe yarar.

Sonuç

wp wc shop_order komutları, WooCommerce mağazalarını yöneten sysadminlerin ve geliştiricilerin cephaneliğinde olması gereken temel araçlardandır. Sipariş listeleme, durum güncelleme ve raporlama işlemlerini komut satırından yapabilmek; hem zaman kazandırır hem de insan hatasını azaltır. Özellikle yüksek sipariş hacimli mağazalarda toplu güncelleme scriptleri, günde saatlerce sürebilecek manuel işleri dakikalara indirir.

Bu yazıda anlattığımız komutları ve senaryoları kendi ortamınıza göre uyarlayabilirsiniz. Başlangıçta --format=json çıktılarını inceleyerek hangi alanların mevcut olduğunu keşfetmenizi öneririm. Her mağaza farklı eklentiler ve özelleştirmeler içerdiğinden, zaman zaman çıktı yapısı değişebilir.

Bir sonraki yazıda WooCommerce ürün yönetimini WP-CLI ile nasıl yapabileceğimizi ele alacağız. Sorularınızı yorumlarda bırakın, elimden geldiğince cevaplamaya çalışırım.

Bir yanıt yazın

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