WP CLI ile WooCommerce Siparişlerine Not Ekleme: wp wc order_note Kullanımı

WooCommerce mağazanızı yönetirken sipariş notları, müşteri iletişiminin ve iç operasyonların bel kemiğini oluşturur. Bir müşteriye kargo takip numarası iletmek, ödeme durumu hakkında not düşmek ya da depo ekibine özel talimat vermek… Bunların hepsini WP-CLI üzerinden yapmak, özellikle toplu işlemler söz konusu olduğunda hayat kurtarıcıdır. Bu yazıda wp wc order_note komutunu her yönüyle ele alacağız.

WooCommerce Sipariş Notları Nedir?

WooCommerce’de sipariş notları iki farklı türde bulunur. Müşteri notları (customer notes), alışveriş yapan kişinin sipariş takip sayfasında görebildiği ve e-posta ile iletilen notlardır. İç notlar (private notes) ise yalnızca mağaza yöneticisinin görebildiği, operasyonel amaçlı kayıtlardır.

Yönetim panelinden bu notları tek tek eklemek küçük bir mağaza için yeterli olabilir. Ancak yüzlerce siparişi aynı anda güncellemek gerektiğinde, ya da otomasyona dayalı bir süreç kurduğunuzda, WP-CLI’nin gücünden yararlanmak zorunlu hale gelir.

WP-CLI ile WooCommerce Kurulum Kontrolü

Komutları çalıştırmadan önce ortamın hazır olduğundan emin olalım.

# WP-CLI versiyonunu kontrol et
wp --version

# WooCommerce eklentisinin aktif olduğunu doğrula
wp plugin status woocommerce

# WooCommerce REST API namespace kontrolü
wp wc --help

Eğer wp wc komutu tanınmıyorsa, WooCommerce ya aktif değildir ya da WP-CLI’nin WooCommerce entegrasyonu düzgün yüklenmemiştir. WooCommerce 3.0 ve sonrasında bu komutlar varsayılan olarak gelir.

order_note Komutunun Yapısı

wp wc order_note komutu dört temel alt komut içerir:

  • create: Siparişe yeni not ekler
  • get: Belirli bir notu getirir
  • list: Siparişe ait tüm notları listeler
  • delete: Belirli bir notu siler

Temel sözdizimi şu şekildedir:

wp wc order_note <komut> <siparis_id> [parametreler] --user=admin

--user parametresi kritik önem taşır. WooCommerce REST API komutları yetkilendirme gerektirir, bu yüzden yeterli yetkiye sahip bir kullanıcı belirtmek zorunludur.

Sipariş Notu Ekleme: create Komutu

Temel Kullanım

En basit haliyle bir sipariş notu eklemek:

wp wc order_note create 145 
  --note="Kargo firmasına teslim edildi." 
  --user=admin

Bu komut, 145 numaralı siparişe bir iç not ekler. Çıktı olarak oluşturulan notun ID’si döner.

Müşteri Bildirimi ile Not Ekleme

Müşteriyi bilgilendirmek istediğinizde --customer_note parametresini kullanırsınız:

wp wc order_note create 145 
  --note="Siparişiniz kargoya verilmiştir. Takip numaranız: TRK123456789" 
  --customer_note=true 
  --user=admin

--customer_note=true olarak ayarlandığında, WooCommerce bu notu müşteriye e-posta ile iletir ve sipariş takip sayfasında gösterir. Bu parametre için:

  • –customer_note=true: Müşteriye görünür ve e-posta gönderilir
  • –customer_note=false: Yalnızca yönetici görebilir (varsayılan davranış)

JSON Formatında Çıktı Alma

Otomasyon senaryolarında JSON çıktısı işleri kolaylaştırır:

wp wc order_note create 145 
  --note="Ödeme onaylandı, hazırlanıyor." 
  --customer_note=false 
  --format=json 
  --user=admin

Dönen çıktı şuna benzer bir yapıda olur:

{"id": 47, "author": "WooCommerce", "date_created": "2024-01-15T14:30:00", "note": "Ödeme onaylandı, hazırlanıyor.", "customer_note": false}

Notları Listeleme ve Görüntüleme

Siparişe Ait Tüm Notları Listele

wp wc order_note list 145 --user=admin

Varsayılan tablo formatında çıktı verir. Sütunlar ID, yazar, tarih ve not içeriğini gösterir.

Belirli Bir Notu Getirme

Not ID’sini biliyorsanız direkt olarak o notu sorgulayabilirsiniz:

wp wc order_note get 145 47 --user=admin

Burada 145 sipariş ID’si, 47 ise not ID’sidir.

Sadece Müşteri Notlarını Filtreleme

Liste çıktısını JSON olarak alıp filtreleyebilirsiniz:

wp wc order_note list 145 
  --format=json 
  --user=admin | python3 -c "
import json, sys
notes = json.load(sys.stdin)
customer_notes = [n for n in notes if n['customer_note']]
print(json.dumps(customer_notes, indent=2))
"

Gerçek Dünya Senaryoları

Senaryo 1: Toplu Kargo Takip Numarası Ekleme

Bir e-ticaret mağazasında günde 200-300 sipariş çıkıyorsa ve kargo firmasından toplu takip numaraları CSV olarak geliyorsa, bu işlemi manuel yapmak saatler sürebilir. Aşağıdaki bash scripti bu süreci otomatize eder:

#!/bin/bash
# kargo_notlari.sh
# CSV Format: siparis_id,takip_no
# Kullanim: ./kargo_notlari.sh kargo_listesi.csv

CSV_FILE="$1"
WP_PATH="/var/www/html"
ADMIN_USER="admin"
LOG_FILE="/var/log/kargo_notlari.log"

if [ -z "$CSV_FILE" ]; then
    echo "Kullanim: $0 <csv_dosyasi>"
    exit 1
fi

echo "Islem basladi: $(date)" >> "$LOG_FILE"

while IFS=',' read -r order_id tracking_no; do
    # Bos satir ve baslik satirini atla
    [[ -z "$order_id" || "$order_id" == "siparis_id" ]] && continue

    NOTE="Siparişiniz kargoya verilmiştir. Takip Numarası: ${tracking_no} - Takip için: https://sureklikargo.com.tr/sorgula"

    RESULT=$(wp wc order_note create "$order_id" 
        --note="$NOTE" 
        --customer_note=true 
        --user="$ADMIN_USER" 
        --path="$WP_PATH" 
        --format=json 2>&1)

    if echo "$RESULT" | grep -q '"id"'; then
        echo "BASARILI: Siparis $order_id - Takip: $tracking_no" | tee -a "$LOG_FILE"
    else
        echo "HATA: Siparis $order_id - $RESULT" | tee -a "$LOG_FILE"
    fi

    # API limitlerini zorlamaktan kacin
    sleep 0.5

done < "$CSV_FILE"

echo "Islem tamamlandi: $(date)" >> "$LOG_FILE"

Senaryo 2: Belirli Durumdaki Siparişlere Toplu Not Düşme

Uzun süredir bekleyen “processing” durumundaki siparişlere otomatik not eklemek için:

#!/bin/bash
# bekleyen_siparisler_not.sh

WP_PATH="/var/www/html"
ADMIN_USER="admin"

# 3 gunden eski processing siparislerini bul
ORDERS=$(wp wc order list 
    --status=processing 
    --field=id 
    --user="$ADMIN_USER" 
    --path="$WP_PATH" 
    --format=ids 2>/dev/null)

if [ -z "$ORDERS" ]; then
    echo "Not eklenecek siparis bulunamadi."
    exit 0
fi

BUGUN=$(date +%Y-%m-%d)
NOTLANAN=0

for ORDER_ID in $ORDERS; do
    # Siparis tarihini al
    ORDER_DATE=$(wp wc order get "$ORDER_ID" 
        --field=date_created 
        --user="$ADMIN_USER" 
        --path="$WP_PATH" 2>/dev/null | cut -d'T' -f1)

    # Tarih farkini hesapla
    FARK=$(( ($(date -d "$BUGUN" +%s) - $(date -d "$ORDER_DATE" +%s)) / 86400 ))

    if [ "$FARK" -ge 3 ]; then
        wp wc order_note create "$ORDER_ID" 
            --note="UYARI: Bu siparis $FARK gundur 'processing' durumunda. Kontrol gerekiyor. Kontrol eden: Otomatik Sistem - $BUGUN" 
            --customer_note=false 
            --user="$ADMIN_USER" 
            --path="$WP_PATH" > /dev/null 2>&1

        echo "Not eklendi: Siparis #$ORDER_ID ($FARK gün bekliyor)"
        NOTLANAN=$((NOTLANAN + 1))
    fi
done

echo "Toplam $NOTLANAN siparişe not eklendi."

Senaryo 3: Ödeme Hatası Loglama

Ödeme gateway’lerinden gelen hata kodlarını sipariş notuna otomatik yazmak, debug süreçlerini ciddi ölçüde hızlandırır:

#!/bin/bash
# odeme_hata_log.sh
# Kullanim: ./odeme_hata_log.sh <siparis_id> <hata_kodu> <hata_mesaji>

ORDER_ID="$1"
ERROR_CODE="$2"
ERROR_MSG="$3"
WP_PATH="/var/www/html"
ADMIN_USER="admin"

if [ -z "$ORDER_ID" ] || [ -z "$ERROR_CODE" ]; then
    echo "Kullanim: $0 <siparis_id> <hata_kodu> [hata_mesaji]"
    exit 1
fi

TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
NOTE="[ODEME HATASI] Zaman: $TIMESTAMP | Kod: $ERROR_CODE | Mesaj: ${ERROR_MSG:-Detay yok} | Otomatik log."

wp wc order_note create "$ORDER_ID" 
    --note="$NOTE" 
    --customer_note=false 
    --user="$ADMIN_USER" 
    --path="$WP_PATH"

echo "Hata notu eklendi: Siparis #$ORDER_ID - Kod: $ERROR_CODE"

Not Silme İşlemleri

Yanlış eklenen ya da gereksiz notları temizlemek için:

# Belirli bir notu sil
wp wc order_note delete 145 47 --user=admin

# Onay istemeden sil
wp wc order_note delete 145 47 --user=admin --force

Dikkat edilmesi gereken nokta: WooCommerce bazı sistem notlarının silinmesine izin vermez. Durum geçiş notları bu kategoriye girer.

Eski Notları Toplu Temizleme

#!/bin/bash
# eski_notlari_temizle.sh
# Bir siparisteki tum notlari listeler ve siler (dikkatli kullanin!)

ORDER_ID="$1"
WP_PATH="/var/www/html"
ADMIN_USER="admin"

if [ -z "$ORDER_ID" ]; then
    echo "Siparis ID gerekli."
    exit 1
fi

# Tum not ID'lerini al
NOTE_IDS=$(wp wc order_note list "$ORDER_ID" 
    --field=id 
    --user="$ADMIN_USER" 
    --path="$WP_PATH" 
    --format=ids 2>/dev/null)

if [ -z "$NOTE_IDS" ]; then
    echo "Siparis #$ORDER_ID icin not bulunamadi."
    exit 0
fi

echo "Siparis #$ORDER_ID icin silinecek notlar: $NOTE_IDS"
read -p "Devam etmek istiyor musunuz? (e/h): " CONFIRM

if [ "$CONFIRM" = "e" ]; then
    for NOTE_ID in $NOTE_IDS; do
        wp wc order_note delete "$ORDER_ID" "$NOTE_ID" 
            --force 
            --user="$ADMIN_USER" 
            --path="$WP_PATH" > /dev/null 2>&1
        echo "Not silindi: #$NOTE_ID"
    done
    echo "Tum notlar temizlendi."
else
    echo "Islem iptal edildi."
fi

Cron ile Otomatik Not Sistemi Kurma

Günlük rutin kontroller için cron entegrasyonu kurmak son derece pratiktir:

# Crontab'a eklenecek satirlar
# Her sabah 09:00'da bekleyen siparisleri kontrol et
0 9 * * * /bin/bash /opt/scripts/bekleyen_siparisler_not.sh >> /var/log/woo_cron.log 2>&1

# Her Pazartesi kargo takip notlarini guncelle
0 8 * * 1 /bin/bash /opt/scripts/kargo_notlari.sh /data/haftalik_kargo.csv >> /var/log/kargo_cron.log 2>&1

Cron scriptlerinde --path parametresini mutlaka belirtmek gerekir, çünkü cron farklı bir working directory ile çalışır:

wp wc order_note create 145 
  --note="Otomatik sistem kontrolü tamamlandı." 
  --user=admin 
  --path=/var/www/html 
  --url=https://magazaniz.com

Çoklu site (multisite) yapılarında --url parametresi de şarttır.

Hata Ayıklama ve Sorun Giderme

Yaygın Hatalar ve Çözümleri

“Error: Sorry, you are not allowed to do this.” hatası alıyorsanız:

# Kullanicinin rolunu kontrol et
wp user get admin --field=roles --user=admin

# Yeterli rol atanmis mi kontrol et
wp user list --role=administrator

“Error: Invalid parameter(s): note” hatası genellikle not içeriğinin boş geçilmesinden kaynaklanır. Shell değişkenlerini her zaman tırnak içinde kullanın.

Sipariş bulunamıyor hatası için:

# Once siparisın var olup olmadigini dogrula
wp wc order get 145 --user=admin --path=/var/www/html

# Siparis listesinde ara
wp wc order list --search="145" --user=admin

Performans ve Güvenlik Notları

Toplu işlemlerde dikkat edilmesi gereken bazı kritik noktalar vardır:

  • Rate limiting: Döngü içinde sleep 0.5 veya sleep 1 kullanmak, veritabanı üzerindeki anlık yükü dengeler. Yüzlerce kayıt işlenirken bu küçük bekleme ciddi fark yaratır.
  • Log tutma: Her toplu işlemin çıktısını bir log dosyasına yönlendirin. Bir şeyler ters gittiğinde hangi siparişlere not eklendiğini bilmek çok önemlidir.
  • Test ortamı: Üretim ortamında büyük toplu işlemler yapmadan önce staging ortamında deneyin. Yanlış not içeriğiyle 500 müşteriye e-posta gitmesi hoş olmaz.
  • Kullanıcı yetkileri: WP-CLI işlemleri için mümkünse özel bir “CLI kullanıcısı” oluşturun. Bu kullanıcıya administrator rolü verin fakat sadece sunucu üzerinden giriş yapabilsin. Bu sayede audit loglarında hangi işlemlerin otomatik hangileri manuel yapıldığını ayırt edebilirsiniz.
  • Not içeriği sanitizasyonu: Dışarıdan gelen verilerle (CSV, API yanıtları vs.) not oluştururken özel karakterlere dikkat edin. Tek tırnak veya çift tırnak içeren veriler komutu bozabilir. printf '%q' kullanımı veya heredoc yapısı bu sorunları önler.

Sonuç

wp wc order_note komutu, WooCommerce mağaza yönetiminde küçük ama etkili bir araçtır. Tek başına kullanıldığında hızlı bir şekilde not eklemenizi sağlar; bash scriptleriyle ve cron ile birleştirildiğinde ise tam anlamıyla bir otomasyon gücüne dönüşür.

Özellikle kargo takip numaralarının toplu iletilmesi, bekleyen siparişlerin işaretlenmesi ve ödeme hatalarının loglanması gibi tekrarlayan operasyonel görevlerde bu komutu kullanmak, hem zamandan tasarruf sağlar hem de insan hatasını en aza indirir.

WP-CLI ile WooCommerce yönetimi bu komutla sınırlı değil elbette. Sipariş durumu güncelleme, ürün yönetimi, müşteri işlemleri gibi onlarca başka komut da aynı mantıkla çalışır ve birbirleriyle zincirlenebilir. Bir sonraki yazıda wp wc order komutunu ve sipariş durumu yönetimini ele alacağız.

Bir yanıt yazın

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