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 1komutu 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.sqlile 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.
