WP CLI ile WooCommerce Varyasyonlu Ürün Yönetimi: wp wc product_variation Komutları

E-ticaret sitelerinde en çok baş ağrıtan konulardan biri varyasyonlu ürün yönetimidir. Bir tişörtün 5 rengi ve 4 bedeni varsa, bunu elle tek tek girmek saatler alabilir. WP CLI ile WooCommerce’in product_variation post tipi üzerinden bu işlemleri otomatize etmek hem zamandan hem de hata payından ciddi ölçüde tasarruf sağlar. Bu yazıda, WP CLI kullanarak varyasyonlu ürünleri nasıl oluşturacağınızı, yöneteceğinizi ve toplu işlemler uygulayacağınızı gerçek dünya senaryolarıyla ele alacağız.

Varyasyonlu Ürün Yapısını Anlamak

WooCommerce’de varyasyonlu ürünler iki katmanlı bir yapıdan oluşur. Üst seviyede variable tipinde bir ürün bulunur ve bu ürüne bağlı her varyasyon, product_variation post tipiyle ayrı bir kayıt olarak veritabanında tutulur. Yani 3 renk ve 4 beden kombinasyonu olan bir ürününüz varsa, teorik olarak 12 adet product_variation kaydınız olabilir.

Bu ilişkiyi anlamak kritik çünkü WP CLI ile işlem yaparken hem parent ürünü hem de her bir varyasyonu ayrı ayrı yönetmeniz gerekiyor. wp post list --post_type=product_variation komutu size bu kayıtları doğrudan listeler.

# Tüm product_variation kayıtlarını listele
wp post list --post_type=product_variation --fields=ID,post_title,post_parent,post_status

# Belirli bir parent ürüne ait varyasyonları görüntüle
wp post list --post_type=product_variation --post_parent=142 --fields=ID,post_title,post_status

Burada post_parent alanı, varyasyonun hangi variable ürüne ait olduğunu gösterir. Bu basit ama çok önemli bir bağlantı noktası.

Parent Variable Ürün Oluşturma

Varyasyonları eklemeden önce bir variable ürün oluşturmanız gerekiyor. WooCommerce’in ürün tipini variable olarak ayarlamak için _product_attributes ve product_type meta alanlarını doğru şekilde yazmanız şart.

# Variable tipinde ana ürün oluştur
wp post create 
  --post_type=product 
  --post_title="Premium Pamuk Tişört" 
  --post_status=publish 
  --post_content="100% organik pamuk, yıkamaya dayanıklı baskı." 
  --porcelain

# Ürün tipini 'variable' olarak ayarla
wp wc product update 145 
  --type=variable 
  --user=admin

# Ürüne renk ve beden attribute'larını ekle
wp post meta update 145 _product_attributes 'a:2:{s:5:"renk";a:6:{s:4:"name";s:4:"Renk";s:5:"value";s:21:"Siyah | Beyaz | Kırmızı";s:8:"position";i:0;s:10:"is_visible";i:1;s:12:"is_variation";i:1;s:11:"is_taxonomy";i:0;}s:5:"beden";a:6:{s:4:"name";s:5:"Beden";s:5:"value";s:14:"S | M | L | XL";s:8:"position";i:1;s:10:"is_visible";i:1;s:12:"is_variation";i:1;s:11:"is_taxonomy";i:0;}}'

Bu kısım biraz karmaşık görünebilir ama serialized PHP formatındaki _product_attributes alanını doğru yazmak varyasyon sisteminin çalışması için zorunlu. Eğer bunu script üzerinden yapıyorsanız, PHP betiğiyle oluşturup WP CLI ile import etmek daha sağlıklı olur.

WP WC Komutuyla Varyasyon Oluşturma

WP CLI’ın WooCommerce eklentisi sayesinde wp wc product_variation komutu doğrudan kullanılabilir. Bu komut, WooCommerce REST API’sini CLI üzerinden çalıştırır ve en temiz yöntemdir.

# Siyah / S beden varyasyonu oluştur
wp wc product_variation create 145 
  --attributes='[{"id":0,"name":"Renk","option":"Siyah"},{"id":0,"name":"Beden","option":"S"}]' 
  --regular_price="299.90" 
  --stock_quantity=50 
  --manage_stock=true 
  --status=publish 
  --user=admin

# Beyaz / M beden varyasyonu oluştur
wp wc product_variation create 145 
  --attributes='[{"id":0,"name":"Renk","option":"Beyaz"},{"id":0,"name":"Beden","option":"M"}]' 
  --regular_price="299.90" 
  --sale_price="249.90" 
  --stock_quantity=30 
  --manage_stock=true 
  --sku="TSH-BEYAZ-M" 
  --user=admin

--user=admin parametresini unutmayın. WooCommerce REST API tabanlı komutlar yetki kontrolü yaptığından bu parametre olmadan komut çalışmaz. Admin rolünde bir kullanıcı adı veya ID vermeniz gerekiyor.

Mevcut Varyasyonları Listeleme ve Detaylarına Bakma

Bir ürünün tüm varyasyonlarını görmek ve her birinin stok, fiyat gibi bilgilerini incelemek için:

# Ürün 145'in tüm varyasyonlarını listele
wp wc product_variation list 145 --user=admin

# JSON formatında detaylı çıktı al
wp wc product_variation list 145 --user=admin --format=json | python3 -m json.tool

# Sadece ID ve SKU bilgisini al
wp wc product_variation list 145 --user=admin --fields=id,sku,stock_quantity,regular_price

Bir varyasyonun tüm meta verilerini görmek istiyorsanız:

# Belirli bir varyasyonun tüm meta verilerini listele
wp post meta list 187 --keys=_price,_regular_price,_sale_price,_stock,_sku

# Varyasyon attribute'larını görüntüle
wp post meta get 187 _variation_description
wp post meta list 187 | grep "attribute_"

Toplu Fiyat Güncelleme Senaryosu

Gerçek hayatta en sık karşılaşılan senaryo budur: Bir ürün grubunun fiyatlarını %10 artırmanız gerekiyor veya kampanya sırasında indirimli fiyat eklemeniz gerekiyor. Bunu elle yapmak yerine bir döngüyle halledebilirsiniz.

#!/bin/bash
# Ürün 145'in tüm varyasyonlarına %10 zam uygula

PRODUCT_ID=145
USER="admin"

# Varyasyon ID'lerini al
VARIATION_IDS=$(wp wc product_variation list $PRODUCT_ID 
  --user=$USER 
  --field=id 
  --format=ids)

for VAR_ID in $VARIATION_IDS; do
  # Mevcut fiyatı al
  CURRENT_PRICE=$(wp wc product_variation get $PRODUCT_ID $VAR_ID 
    --user=$USER 
    --field=regular_price)
  
  # %10 artır (bash ile float hesabı için bc kullan)
  NEW_PRICE=$(echo "$CURRENT_PRICE * 1.10" | bc -l | xargs printf "%.2f")
  
  echo "Varyasyon $VAR_ID: $CURRENT_PRICE -> $NEW_PRICE"
  
  # Fiyatı güncelle
  wp wc product_variation update $PRODUCT_ID $VAR_ID 
    --regular_price="$NEW_PRICE" 
    --user=$USER
done

echo "Tüm varyasyonlar güncellendi."

Bu script, büyük kataloglarda hayat kurtarır. Özellikle yılbaşı zamları veya döviz kuru ayarlamaları sırasında yüzlerce varyasyonu birkaç dakikada güncelleyebilirsiniz.

Stok Yönetimi ve Toplu Stok Güncelleme

Depo sayımından sonra stokları güncellemek de sık karşılaşılan bir ihtiyaç. Bir CSV dosyasından stok bilgisi okuyarak varyasyonları güncelleyen bir yapı kuralım:

#!/bin/bash
# stok_guncelleme.csv formatı: variation_id,product_id,stock_quantity
# Örnek: 187,145,25

CSV_FILE="stok_guncelleme.csv"
USER="admin"

while IFS=',' read -r VAR_ID PRODUCT_ID STOCK; do
  # Boş satır ve yorum satırlarını atla
  [[ -z "$VAR_ID" || "$VAR_ID" == #* ]] && continue
  
  echo "Güncelleniyor: Ürün $PRODUCT_ID / Varyasyon $VAR_ID -> Stok: $STOCK"
  
  wp wc product_variation update $PRODUCT_ID $VAR_ID 
    --stock_quantity="$STOCK" 
    --manage_stock=true 
    --user=$USER
    
  if [ $? -eq 0 ]; then
    echo "  OK: $VAR_ID güncellendi"
  else
    echo "  HATA: $VAR_ID güncellenemedi" >&2
  fi
  
done < "$CSV_FILE"

Bunu bir cron job’a bağlayıp gece yarısı depo sisteminden gelen CSV ile otomatik senkronizasyon yapabilirsiniz. Bu tür bir entegrasyon küçük ve orta ölçekli e-ticaret siteleri için oldukça yaygın bir ihtiyaçtır.

Varyasyon Silme ve Temizlik İşlemleri

Ürün gamını daralttığınızda veya bir renk/bedeni artık satmadığınızda, gereksiz varyasyonları temizlemeniz gerekir. Bunu yaparken dikkatli olmak lazım çünkü eski siparişlerde referans verilen varyasyonlar silinirse veri tutarsızlığı oluşabilir.

# Tek bir varyasyonu sil
wp wc product_variation delete 145 187 --user=admin --force=true

# Belirli bir duruma sahip varyasyonları bul ve sil
# Önce stok sıfır olan varyasyonları tespit et
wp wc product_variation list 145 
  --user=admin 
  --format=json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for v in data:
    if v.get('stock_quantity', 1) == 0:
        print(v['id'])
"

# Yukarıdaki çıktıyı kullanarak toplu silme
for VAR_ID in 188 192 195; do
  wp wc product_variation delete 145 $VAR_ID 
    --user=admin 
    --force=true
  echo "Varyasyon $VAR_ID silindi"
done

Dikkat: --force=true olmadan silme işlemi varyasyonu trash’e taşır, kalıcı olarak silmez. Kalıcı silme için force parametresini kullanmalısınız ama öncesinde mutlaka yedek alın.

SKU ile Varyasyon Bulma ve Güncelleme

Büyük kataloglarda ID yerine SKU üzerinden işlem yapmak çok daha mantıklıdır. SKU’lar sisteminizde tutarlıysa, aşağıdaki yöntemi kullanabilirsiniz:

# SKU'ya göre ürün ID'si bul
wp wc product list 
  --sku="TSH-SIYAH-L" 
  --user=admin 
  --field=id

# Alternatif: Post meta üzerinden SKU ile varyasyon bul
wp post list 
  --post_type=product_variation 
  --meta_key=_sku 
  --meta_value="TSH-SIYAH-L" 
  --fields=ID,post_parent

# SKU listesinden toplu güncelleme
#!/bin/bash
declare -A SKU_PRICES=(
  ["TSH-SIYAH-S"]="279.90"
  ["TSH-SIYAH-M"]="279.90"
  ["TSH-BEYAZ-L"]="299.90"
  ["TSH-KIRMIZI-XL"]="319.90"
)

USER="admin"

for SKU in "${!SKU_PRICES[@]}"; do
  NEW_PRICE="${SKU_PRICES[$SKU]}"
  
  # SKU'ya göre varyasyon ID'sini bul
  VAR_ID=$(wp post list 
    --post_type=product_variation 
    --meta_key=_sku 
    --meta_value="$SKU" 
    --field=ID 
    --format=ids)
  
  if [ -n "$VAR_ID" ]; then
    PARENT_ID=$(wp post get $VAR_ID --field=post_parent)
    wp wc product_variation update $PARENT_ID $VAR_ID 
      --regular_price="$NEW_PRICE" 
      --user=$USER
    echo "$SKU -> $NEW_PRICE TL güncellendi"
  else
    echo "UYARI: $SKU bulunamadı"
  fi
done

Görsel Atama ve Varyasyon Görseli Yönetimi

Her varyasyonun kendi görseli olabilir. Özellikle renk varyasyonlarında bu çok önemlidir. WP CLI ile bunu da yönetebilirsiniz:

# Görseli medya kütüphanesine yükle
ATTACHMENT_ID=$(wp media import /var/www/uploads/tisort-siyah.jpg 
  --title="Tişört Siyah" 
  --porcelain)

echo "Yüklenen görsel ID: $ATTACHMENT_ID"

# Görseli varyasyona ata
wp wc product_variation update 145 187 
  --image='{"id": '"$ATTACHMENT_ID"'}' 
  --user=admin

# Birden fazla varyasyon için döngüyle görsel atama
declare -A VAR_IMAGES=(
  ["187"]="/var/www/uploads/tisort-siyah.jpg"
  ["188"]="/var/www/uploads/tisort-beyaz.jpg"
  ["189"]="/var/www/uploads/tisort-kirmizi.jpg"
)

for VAR_ID in "${!VAR_IMAGES[@]}"; do
  IMG_PATH="${VAR_IMAGES[$VAR_ID]}"
  PARENT_ID=$(wp post get $VAR_ID --field=post_parent)
  
  ATT_ID=$(wp media import "$IMG_PATH" --porcelain)
  
  wp wc product_variation update $PARENT_ID $VAR_ID 
    --image='{"id": '"$ATT_ID"'}' 
    --user=admin
    
  echo "Varyasyon $VAR_ID -> Görsel $ATT_ID atandı"
done

Kampanya Dönemi Yönetimi: Sale Price ve Tarih Ayarları

Black Friday gibi kampanya dönemlerinde yüzlerce varyasyona indirimli fiyat ve tarih aralığı girmek gerekir. WP CLI bu durumu da çok kolaylaştırır:

#!/bin/bash
# Black Friday kampanyası için varyasyonlara sale price ve tarih ekle

PRODUCT_IDS=(145 146 147 150 155)
DISCOUNT_RATE=0.20  # %20 indirim
SALE_FROM="2024-11-29"
SALE_TO="2024-12-02"
USER="admin"

for PRODUCT_ID in "${PRODUCT_IDS[@]}"; do
  echo "Ürün $PRODUCT_ID işleniyor..."
  
  VARIATION_IDS=$(wp wc product_variation list $PRODUCT_ID 
    --user=$USER 
    --field=id 
    --format=ids)
  
  for VAR_ID in $VARIATION_IDS; do
    REGULAR=$(wp wc product_variation get $PRODUCT_ID $VAR_ID 
      --user=$USER --field=regular_price)
    
    SALE=$(echo "$REGULAR * (1 - $DISCOUNT_RATE)" | bc -l | xargs printf "%.2f")
    
    wp wc product_variation update $PRODUCT_ID $VAR_ID 
      --sale_price="$SALE" 
      --date_on_sale_from="$SALE_FROM" 
      --date_on_sale_to="$SALE_TO" 
      --user=$USER
      
    echo "  Varyasyon $VAR_ID: $REGULAR -> $SALE (kampanya: $SALE_FROM / $SALE_TO)"
  done
done

echo "Kampanya kurulumu tamamlandı!"

Kampanya bittikten sonra sale_price’ları temizlemek için:

# Kampanya sonrası indirimli fiyatları kaldır
for VAR_ID in $VARIATION_IDS; do
  wp wc product_variation update $PRODUCT_ID $VAR_ID 
    --sale_price="" 
    --user=$USER
done

Yaygın Sorunlar ve Çözümleri

Varyasyonlar görünmüyor: Parent ürünün product_type taxonomy kaydının variable olduğunu kontrol edin.

wp post term list 145 product_type --format=table
# "variable" çıkması lazım, yoksa ekleyin:
wp post term add 145 product_type variable

Fiyat güncellenmiyor gibi görünüyor: WooCommerce fiyatları birden fazla meta alanda tutar. _price, _regular_price ve _sale_price hepsinin senkron olması gerekir. WP CLI’dan wp wc product_variation update kullandığınızda bu otomatik hallolur ama doğrudan wp post meta update ile _price yazarsanız diğerleriyle çakışabilir.

“User must be logged in” hatası: --user=admin parametresini unutmuşsunuzdur. Hatta bazen kullanıcı adı yerine ID ile denemek daha güvenli olabilir: --user=1

Attribute eşleşmeme sorunu: Attribute adları büyük/küçük harf ve boşluğa duyarlıdır. Varyasyon oluştururken yazdığınız attribute adı, parent üründe tanımlanan adla birebir aynı olmalıdır.

# Parent üründe tanımlı attribute'ları kontrol et
wp post meta get 145 _product_attributes

Performans İpuçları

Çok sayıda varyasyonla çalışırken birkaç pratik önlem almanız işlemleri hızlandırır ve server’ı yormaz:

  • Her güncelleme döngüsünden sonra kısa bir sleep 1 komutu ekleyin, MySQL’i rahatlatır.
  • Toplu işlem öncesinde wp cache flush çalıştırın, sonrasında da tekrarlayın.
  • 500’den fazla varyasyonu işleyecekseniz işlemi parçalara bölün, batch başına 50-100 varyasyon ideal.
  • İşlem öncesi daima wp db export backup_oncesi.sql ile yedek alın.
# İşlem öncesi yedek ve cache temizliği
wp db export before_variation_update_$(date +%Y%m%d_%H%M%S).sql
wp cache flush

# Uzun toplu işlemler için progress takibi
TOTAL=$(wp wc product_variation list 145 --user=admin --format=count)
COUNTER=0

for VAR_ID in $VARIATION_IDS; do
  COUNTER=$((COUNTER + 1))
  echo "[$COUNTER/$TOTAL] İşleniyor: $VAR_ID"
  # ... işlem ...
  sleep 0.5
done

Sonuç

WP CLI’ın product_variation komutları, WooCommerce’de varyasyonlu ürün yönetimini tamamen farklı bir boyuta taşıyor. Elle saatler sürecek işlemleri birkaç dakikaya indirmek, insan hatasını minimize etmek ve kampanya yönetimini otomatize etmek artık mümkün.

Özellikle şu senaryolarda WP CLI kullanımı zorunlu hale geliyor: Yüzlerce SKU’yu kapsayan fiyat güncellemeleri, harici sistemlerden stok senkronizasyonu, kampanya başlangıç ve bitiş tarihi yönetimi ve yeni sezon ürün yükleme süreçleri.

Başlangıçta serialize PHP formatları ve attribute yapısı biraz kafa karıştırıcı olabilir ama birkaç denemeden sonra bu yapıya alışıyorsunuz. Önemli olan bir şey: Production ortamında doğrudan çalıştırmadan önce her zaman staging üzerinde test edin ve veritabanı yedeğini almayı ihmal etmeyin. Bir kez otomatize bir altyapı kurduğunuzda, her yeni sezon veya kampanya döneminde bu yatırımın karşılığını fazlasıyla alıyorsunuz.

Bir yanıt yazın

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