WooCommerce CLI ile Stok Yönetimi ve Güncelleme

E-ticaret sitelerinde stok yönetimi, gecenin ikisinde alarm çaldığında uğraşmak istemeyeceğin türden bir işlemdir. Ürünlerin tükenmesi, toplu güncellemeler, sezonluk stok ayarlamaları… Bunların hepsini WooCommerce admin paneli üzerinden yapmak hem zaman alıcı hem de hata yapmaya açık bir süreçtir. İşte tam bu noktada WP-CLI devreye giriyor ve hayatını ciddi ölçüde kolaylaştırıyor.

Bu yazıda WooCommerce CLI komutlarını kullanarak stok yönetimini nasıl verimli hale getirebileceğini, toplu güncellemeleri nasıl otomatize edebileceğini ve gerçek dünya senaryolarında bu araçları nasıl kullanacağını detaylı olarak ele alacağız.

WP-CLI WooCommerce Eklentisini Tanıyalım

WP-CLI, WordPress’in komut satırı arayüzüdür ve WooCommerce ile birlikte çalışmak için wc komutunu kullanırsın. WooCommerce 3.0 sonrasında WP-CLI entegrasyonu oldukça olgunlaştı. Stok yönetimi için ihtiyacın olan komutların büyük çoğunluğu doğrudan wc product ve wc product_variation alt komutları altında bulunuyor.

Önce WP-CLI’nin düzgün kurulu olduğundan ve WooCommerce eklentisinin aktif olduğundan emin ol:

wp --version
wp plugin status woocommerce
wp wc --help

WooCommerce CLI komutlarını kullanmak için her zaman --user parametresi ile bir yönetici kullanıcısı belirtmen gerekiyor. Bu çok önemli, unutursan “yetki hatası” alırsın:

wp wc product list --user=admin --fields=id,name,stock_quantity,stock_status

Ürün Stok Bilgilerini Listeleme ve Sorgulama

Stok yönetimine başlamadan önce mevcut durumu görmek lazım. Aşağıdaki komutla tüm ürünlerin stok durumunu listeleyebilirsin:

wp wc product list 
  --user=admin 
  --fields=id,name,sku,stock_quantity,stock_status 
  --format=table 
  --per_page=100

Bu komut, ürün ID’si, adı, SKU kodu, stok miktarı ve stok durumunu tablo formatında getirir. Büyük kataloglarda --per_page değerini artırman gerekebilir, varsayılan değer 10’dur.

Sadece stokta olmayan ürünleri görmek istiyorsan:

wp wc product list 
  --user=admin 
  --stock_status=outofstock 
  --fields=id,name,sku,stock_quantity 
  --format=csv

CSV formatında almak, daha sonra bu veriyi bir spreadsheet’e aktarıp analiz etmeni sağlar. Özellikle muhasebe departmanıyla çalışıyorsan bu format çok işe yarar.

Belirli bir ürünün detaylı stok bilgisini görmek için:

wp wc product get 1234 --user=admin --fields=id,name,stock_quantity,stock_status,manage_stock,backorders

Buradaki alanların ne anlama geldiğini kısaca açıklayalım:

  • manage_stock: Stok yönetiminin aktif olup olmadığı
  • stock_quantity: Mevcut stok adedi
  • stock_status: instock, outofstock veya onbackorder değerlerini alır
  • backorders: Ön sipariş özelliğinin durumu (no, notify, yes)

Tek Ürün Stok Güncellemesi

Bir ürünün stok miktarını güncellemek en temel operasyondur. Örneğin, depodan yeni mal geldi ve sistemde güncelleme yapman gerekiyor:

wp wc product update 1234 
  --user=admin 
  --stock_quantity=150 
  --stock_status=instock 
  --manage_stock=true

Stok sıfırlandığında ürünü otomatik olarak “stokta yok” yapmak ve stok takibini açmak için:

wp wc product update 1234 
  --user=admin 
  --stock_quantity=0 
  --stock_status=outofstock 
  --manage_stock=true

Önemli bir not: manage_stock değeri true olmadan stock_quantity güncellemesi yapmak bazen beklediğin sonucu vermez. WooCommerce stok takibini manuel modda tutuyorsa sayısal değeri görmezden gelebilir.

Toplu Stok Güncellemesi – Shell Script ile

Gerçek dünyada nadiren tek ürün güncellersin. Genellikle elimde 200-300 ürünlük bir CSV dosyası olur ve bunları tek tek girmek yerine script yazarım. İşte basit ama etkili bir örnek:

Önce stock_updates.csv dosyan şöyle görünsün:

1234,150
1235,0
1236,75
1237,200
1238,30

Şimdi bu dosyayı okuyup toplu güncelleme yapan script:

#!/bin/bash
# toplu_stok_guncelle.sh

WP_PATH="/var/www/html/wordpress"
WP_USER="admin"
CSV_FILE="stock_updates.csv"
LOG_FILE="stok_guncelleme_log_$(date +%Y%m%d_%H%M%S).txt"

echo "Stok güncellemesi başladı: $(date)" | tee -a $LOG_FILE

while IFS=',' read -r product_id stock_qty; do
    # Boş satırları atla
    [[ -z "$product_id" ]] && continue
    
    # Ürün adını al
    PRODUCT_NAME=$(wp --path="$WP_PATH" wc product get "$product_id" 
        --user="$WP_USER" 
        --fields=name 
        --format=json 2>/dev/null | python3 -c "import sys,json; print(json.load(sys.stdin).get('name','Bilinmiyor'))")
    
    # Stok güncelle
    if wp --path="$WP_PATH" wc product update "$product_id" 
        --user="$WP_USER" 
        --stock_quantity="$stock_qty" 
        --manage_stock=true 2>/dev/null; then
        echo "BASARILI: ID=$product_id | $PRODUCT_NAME | Stok=$stock_qty" | tee -a $LOG_FILE
    else
        echo "HATA: ID=$product_id güncellenemedi" | tee -a $LOG_FILE
    fi
    
    # Sunucuyu yormamak için kısa bekleme
    sleep 0.5
    
done < "$CSV_FILE"

echo "İşlem tamamlandı: $(date)" | tee -a $LOG_FILE
echo "Log dosyası: $LOG_FILE"

Bu script’i çalıştırmak için:

chmod +x toplu_stok_guncelle.sh
./toplu_stok_guncelle.sh

sleep 0.5 satırı küçük ama kritik bir detay. Özellikle paylaşımlı hosting ortamlarında veya düşük kaynaklı VPS’lerde 200 ürünü arka arkaya güncellerken MySQL’i boğabilirsin. Bu bekleme süresi bunu önler.

Varyasyonlu Ürünlerin Stok Yönetimi

WooCommerce’de işler en çok varyasyonlarda karmaşık hale gelir. Bir tişörtün S, M, L, XL bedenlerinin her birinin ayrı stoğu var ve bunları yönetmek zorundayız.

Önce bir variable product’ın tüm varyasyonlarını listeleyelim:

wp wc product_variation list 
  --parent_id=1234 
  --user=admin 
  --fields=id,sku,attributes,stock_quantity,stock_status 
  --format=table

Tek bir varyasyonu güncellemek için product_variation update kullanırsın:

wp wc product_variation update 5678 
  --parent_id=1234 
  --user=admin 
  --stock_quantity=25 
  --stock_status=instock 
  --manage_stock=true

Burada --parent_id parametresini unutma, olmadan komut çalışmaz.

Şimdi daha ileri gidelim. Bir ana ürünün tüm varyasyonlarını aynı anda güncelleyen bir script:

#!/bin/bash
# varyasyon_stok_sifirla.sh
# Belirli bir ürünün tüm varyasyonlarını stoka ekler

PARENT_ID=$1
NEW_STOCK=$2
WP_USER="admin"

if [[ -z "$PARENT_ID" || -z "$NEW_STOCK" ]]; then
    echo "Kullanim: $0 <parent_id> <stok_miktari>"
    exit 1
fi

echo "Ürün ID: $PARENT_ID için varyasyonlar alınıyor..."

# Tüm varyasyon ID'lerini al
VARIATION_IDS=$(wp wc product_variation list 
    --parent_id="$PARENT_ID" 
    --user="$WP_USER" 
    --fields=id 
    --format=csv 
    --per_page=200 | tail -n +2)

for VAR_ID in $VARIATION_IDS; do
    wp wc product_variation update "$VAR_ID" 
        --parent_id="$PARENT_ID" 
        --user="$WP_USER" 
        --stock_quantity="$NEW_STOCK" 
        --stock_status=instock 
        --manage_stock=true
    echo "Varyasyon $VAR_ID güncellendi -> Stok: $NEW_STOCK"
done

echo "Tüm varyasyonlar güncellendi."

Kullanımı basit:

./varyasyon_stok_sifirla.sh 1234 50

Düşük Stok Raporlama ve Uyarı Sistemi

Sysadmin olarak sadece güncelleme yapmak değil, proaktif izleme de önemli. Stok seviyesi belirli bir eşiğin altına düşen ürünleri tespit edip bildirim gönderebiliriz.

#!/bin/bash
# dusuk_stok_raporu.sh
# Stoku belirli eşiğin altındaki ürünleri raporlar

ESIK=10
WP_USER="admin"
MAIL_ALICI="[email protected]"
TARIH=$(date '+%d.%m.%Y %H:%M')

echo "Düşük Stok Raporu - $TARIH" > /tmp/stok_raporu.txt
echo "Stok eşiği: $ESIK adet" >> /tmp/stok_raporu.txt
echo "================================" >> /tmp/stok_raporu.txt

# JSON formatında al ve işle
wp wc product list 
    --user="$WP_USER" 
    --per_page=500 
    --format=json 
    --fields=id,name,sku,stock_quantity,stock_status | 
python3 << 'EOF'
import sys
import json

data = json.load(sys.stdin)
esik = 10
dusuk_stok = []

for urun in data:
    stok = urun.get('stock_quantity')
    durum = urun.get('stock_status', '')
    
    if stok is not None and int(stok) < esik and durum != 'outofstock':
        dusuk_stok.append({
            'id': urun['id'],
            'name': urun['name'],
            'sku': urun.get('sku', 'SKU YOK'),
            'stock': stok
        })

if dusuk_stok:
    print(f"nToplam {len(dusuk_stok)} ürün düşük stokta:n")
    for u in sorted(dusuk_stok, key=lambda x: int(x['stock'])):
        print(f"[{u['sku']}] {u['name']} - Stok: {u['stock']} adet (ID: {u['id']})")
else:
    print("Düşük stoklu ürün bulunamadı.")
EOF

# Mail gönder (mailutils kurulu olmalı)
if command -v mail &> /dev/null; then
    cat /tmp/stok_raporu.txt | mail -s "Düşük Stok Raporu - $TARIH" "$MAIL_ALICI"
    echo "Rapor $MAIL_ALICI adresine gönderildi."
fi

cat /tmp/stok_raporu.txt

Bu script’i crontab’a ekleyerek her sabah 08:00’de otomatik çalıştırabilirsin:

0 8 * * * /usr/local/bin/dusuk_stok_raporu.sh >> /var/log/stok_rapor.log 2>&1

SKU ile Stok Güncelleme

Gerçek dünyada çoğu zaman ürün ID’leri değil SKU kodları elimde olur. Tedarikçiden gelen Excel dosyasında SKU var, WooCommerce’de ID… Aralarındaki köprüyü kurmak lazım.

#!/bin/bash
# sku_ile_stok_guncelle.sh

SKU=$1
YENI_STOK=$2
WP_USER="admin"

if [[ -z "$SKU" || -z "$YENI_STOK" ]]; then
    echo "Kullanim: $0 <sku> <stok_miktari>"
    exit 1
fi

# SKU'dan ürün ID'sini bul
URUN_ID=$(wp wc product list 
    --user="$WP_USER" 
    --sku="$SKU" 
    --fields=id 
    --format=csv | tail -n 1)

if [[ -z "$URUN_ID" || "$URUN_ID" == "id" ]]; then
    echo "HATA: '$SKU' SKU'lu ürün bulunamadı"
    exit 1
fi

echo "SKU: $SKU -> ID: $URUN_ID"
echo "Stok güncelleniyor: $YENI_STOK adet"

wp wc product update "$URUN_ID" 
    --user="$WP_USER" 
    --stock_quantity="$YENI_STOK" 
    --stock_status=instock 
    --manage_stock=true

echo "Güncelleme tamamlandı."

Toplu SKU güncellemesi için CSV dosyandan okuyarak bu mantığı genişletebilirsin:

# sku_bulk.csv formatı: SKU,MIKTAR
# TSHIRT-S,45
# TSHIRT-M,60
# PANTS-32,20

while IFS=',' read -r sku miktar; do
    ./sku_ile_stok_guncelle.sh "$sku" "$miktar"
    sleep 0.3
done < sku_bulk.csv

WooCommerce Stok Durumu Toplu Sıfırlama

Sezon sonu, büyük kampanya sonrası veya depo sayımı sonrasında tüm stokları sıfırlamak gerekebilir. Bu kritik bir operasyon, mutlaka önce yedek al:

# ÖNCE YEDEĞİ AL
wp db export stok_oncesi_yedek_$(date +%Y%m%d).sql --add-drop-table

# Tüm ürünlerin stoğunu sıfırla (dikkatli kullan!)
wp wc product list 
    --user=admin 
    --per_page=500 
    --fields=id 
    --format=csv | tail -n +2 | while read -r id; do
    wp wc product update "$id" 
        --user=admin 
        --stock_quantity=0 
        --stock_status=outofstock
    echo "Ürün $id sıfırlandı"
done

Bu komutu production’da çalıştırmadan önce mutlaka staging ortamında test et. “Dikkatli kullan” uyarısı şaka değil.

Performans İpuçları ve Yaygın Hatalar

Büyük kataloglarda (1000+ ürün) WP-CLI ile çalışırken birkaç önemli nokta var:

–per_page Limiti: WooCommerce REST API varsayılan olarak sayfa başına maksimum 100 kayıt döndürür. Daha fazlası için döngü kurman gerekir:

SAYFA=1
TOPLAM=0

while true; do
    SONUC=$(wp wc product list 
        --user=admin 
        --per_page=100 
        --page=$SAYFA 
        --fields=id,name,stock_quantity 
        --format=json)
    
    KAYIT_SAYISI=$(echo "$SONUC" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))")
    
    [[ "$KAYIT_SAYISI" -eq 0 ]] && break
    
    echo "$SONUC" >> tum_urunler.json
    TOPLAM=$((TOPLAM + KAYIT_SAYISI))
    echo "Sayfa $SAYFA: $KAYIT_SAYISI kayıt alındı (Toplam: $TOPLAM)"
    
    SAYFA=$((SAYFA + 1))
done

WordPress Cache Sorunu: WP-CLI komutları çalıştıktan sonra object cache temizlemek iyi bir alışkanlıktır. Redis veya Memcached kullanıyorsan:

wp cache flush

Error Handling: Uzun süren batch işlemlerinde her hatayı yakala, script’i durdurma:

set -o pipefail
# hata olursa devam et ama logla
wp wc product update "$id" --user=admin --stock_quantity=50 2>&1 || 
    echo "HATA: ID $id güncellenemedi" >> hata_log.txt

Pratik Senaryo: Tedarikçi Entegrasyonu

Gerçek bir senaryoyu ele alalım. Tedarikçin her sabah FTP’ye yeni bir stok dosyası yüklüyor, sen de bunu otomatik olarak WooCommerce’e aktarıyorsun:

#!/bin/bash
# tedarikci_stok_sync.sh
# Her sabah 06:00'da cron ile çalışır

FTP_HOST="ftp.tedarikci.com"
FTP_USER="kullanici"
FTP_PASS="sifre"
UZAK_DOSYA="/stok/gunluk_stok.csv"
YEREL_DOSYA="/tmp/tedarikci_stok_$(date +%Y%m%d).csv"
WP_USER="admin"
LOG="/var/log/stok_sync.log"

echo "[$(date)] Senkronizasyon başladı" | tee -a $LOG

# FTP'den indir
curl -s --ftp-ssl "ftp://$FTP_HOST$UZAK_DOSYA" 
    --user "$FTP_USER:$FTP_PASS" 
    -o "$YEREL_DOSYA"

if [[ ! -f "$YEREL_DOSYA" || ! -s "$YEREL_DOSYA" ]]; then
    echo "[$(date)] HATA: Dosya indirilemedi" | tee -a $LOG
    exit 1
fi

BASARILI=0
HATALI=0

# CSV formatı: SKU,STOK_MIKTARI
tail -n +2 "$YEREL_DOSYA" | while IFS=',' read -r sku stok; do
    # SKU'dan ID bul
    URUN_ID=$(wp wc product list 
        --user="$WP_USER" 
        --sku="$sku" 
        --fields=id 
        --format=csv 2>/dev/null | tail -n 1)
    
    if [[ -n "$URUN_ID" && "$URUN_ID" != "id" ]]; then
        STOK_DURUM="instock"
        [[ "$stok" -le 0 ]] && STOK_DURUM="outofstock"
        
        wp wc product update "$URUN_ID" 
            --user="$WP_USER" 
            --stock_quantity="$stok" 
            --stock_status="$STOK_DURUM" 
            --manage_stock=true > /dev/null 2>&1
        
        echo "[$(date)] OK: SKU=$sku ID=$URUN_ID Stok=$stok" >> $LOG
        BASARILI=$((BASARILI + 1))
    else
        echo "[$(date)] ATLANDI: SKU=$sku bulunamadı" >> $LOG
        HATALI=$((HATALI + 1))
    fi
    
    sleep 0.2
done

echo "[$(date)] Tamamlandı. Başarılı: $BASARILI, Hatalı: $HATALI" | tee -a $LOG

Sonuç

WP-CLI ile WooCommerce stok yönetimi, admin panelinde zaman harcamak yerine işleri otomatize etmeni sağlar. Toplu güncellemeler, düşük stok raporlamaları, tedarikçi entegrasyonları… Bunların hepsi birkaç satır bash scripti ile çözülebilecek problemler.

Özetlemek gerekirse bu yazıda öğrendiklerimiz:

  • wp wc product list ile stok sorgulama ve raporlama
  • wp wc product update ile tekil ve toplu stok güncellemeleri
  • wp wc product_variation komutlarıyla varyasyon yönetimi
  • SKU tabanlı stok güncelleme
  • Düşük stok izleme ve mail bildirimi
  • Tedarikçi FTP entegrasyonu ile otomatik senkronizasyon

Bu script’leri kendi ortamına uyarlarken dikkat etmen gereken en önemli şey: her büyük operasyon öncesi wp db export ile yedek almak. WP-CLI hızlı ve güçlü bir araç, ama yapılan değişiklikler anında aktif olur ve geri alma şansın olmayabilir.

Staging ortamında test et, logları düzenli tut, ve crontab işlerini MAILTO değişkeniyle hata bildirimlerine bağla. Bu alışkanlıkları edindikten sonra WooCommerce stok yönetimi seni artık gecenin ikisinde uyandırmaz.

Bir yanıt yazın

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