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,outofstockveyaonbackorderdeğ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 listile stok sorgulama ve raporlamawp wc product updateile tekil ve toplu stok güncellemeleriwp wc product_variationkomutları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.
