WooCommerce CLI ile Varyasyon Fiyatlarını Toplu Güncelleme
E-ticaret sitelerinde yüzlerce ürün varyasyonunun fiyatını tek tek güncellemek, sysadmin’lerin kabusu haline gelebilir. Bir müşteri sana “300 ürünümüzün tüm S bedeni ürünlerini yüzde 15 zam yaptık, günceller misin?” dediğinde, WordPress admin paneline girip tek tek tıklamak yerine terminal açıp birkaç komutla işi bitirmek istiyorsun. İşte tam bu noktada WP-CLI ve WooCommerce CLI kombinasyonu hayat kurtarıyor.
Bu yazıda WooCommerce CLI kullanarak ürün varyasyonlarının fiyatlarını toplu olarak nasıl güncelleyebileceğini, gerçek dünya senaryolarıyla birlikte anlatacağım.
WP-CLI ve WooCommerce CLI Kurulumu
Öncelikle ortamın hazır olduğundan emin olalım. WP-CLI zaten kuruluysa WooCommerce CLI otomatik olarak aktif geliyor, çünkü WooCommerce kendi WP-CLI komutlarını eklenti içinde barındırıyor.
# WP-CLI versiyonunu kontrol et
wp --version
# WooCommerce CLI komutlarının aktif olup olmadığını kontrol et
wp wc --help
# Mevcut store bilgisini görüntüle
wp wc --user=admin tool get system_status --format=json
Eğer wp wc komutu çalışmıyorsa WooCommerce eklentisinin aktif olduğunu doğrula:
wp plugin status woocommerce
wp plugin activate woocommerce
Önemli bir nokta: WooCommerce CLI komutları için --user parametresi zorunludur. Admin yetkisine sahip bir kullanıcı adı veya ID belirtmen gerekiyor, aksi halde authentication hatası alırsın.
Varyasyon Yapısını Anlamak
WooCommerce’de varyasyonlar hiyerarşik bir yapıda çalışır. Bir “variable product” (değişken ürün) ana ürün olarak yer alır, altında ise her kombinasyon için ayrı varyasyon kayıtları bulunur. CLI’da bu yapıya erişmek için önce ana ürün ID’sini, sonra o ürüne ait varyasyon ID’lerini almanız gerekiyor.
# Tüm variable product'ları listele
wp wc product list --user=admin --type=variable --format=table --fields=id,name,status
# Belirli bir ürünün varyasyonlarını listele (örnek: ürün ID 42)
wp wc product_variation list 42 --user=admin --format=table
Bu komutun çıktısında her varyasyonun ID’si, fiyatı, stok durumu ve attribute değerleri görünür. İşte bu ID’ler üzerinde çalışacağız.
# Tek bir varyasyonun detaylı bilgisini görüntüle
wp wc product_variation get 42 156 --user=admin --format=json
Burada 42 ana ürün ID’si, 156 ise varyasyon ID’si. JSON çıktısında regular_price, sale_price ve price alanlarını göreceksin.
Tek Bir Varyasyonun Fiyatını Güncelleme
Toplu işlemlere geçmeden önce tek varyasyon güncellemeyi öğrenelim:
# Tek varyasyonun normal fiyatını güncelle
wp wc product_variation update 42 156 --user=admin --regular_price=299.99
# Hem normal hem indirimli fiyatı aynı anda güncelle
wp wc product_variation update 42 156 --user=admin --regular_price=299.99 --sale_price=249.99
# İndirimli fiyatı kaldırmak için boş string gönder
wp wc product_variation update 42 156 --user=admin --sale_price=""
Güncelleme başarılı olduğunda WooCommerce CLI sana güncellenmiş varyasyon bilgilerini JSON formatında döndürür. Bu çıktıyı parse edip işlem doğrulaması yapabilirsin.
Bash Script ile Toplu Varyasyon Fiyat Güncellemesi
Gerçek işler bash script’lerle başlıyor. Diyelim ki 42 ID’li ürünün tüm varyasyonlarına yüzde 10 zam yapman gerekiyor:
#!/bin/bash
# Dosya: update_variation_prices.sh
PRODUCT_ID=42
ADMIN_USER="admin"
ZAM_ORANI=1.10 # %10 zam
# Ürünün tüm varyasyon ID'lerini al
VARIATION_IDS=$(wp wc product_variation list $PRODUCT_ID
--user=$ADMIN_USER
--format=csv
--fields=id,regular_price 2>/dev/null | tail -n +2)
echo "Varyasyon güncellemesi başlıyor: Ürün ID $PRODUCT_ID"
echo "-------------------------------------------"
while IFS=',' read -r var_id current_price; do
if [ -z "$current_price" ] || [ "$current_price" == "0" ]; then
echo "ATLA: Varyasyon $var_id - Fiyat boş veya sıfır"
continue
fi
# Yeni fiyatı hesapla (bc ile float aritmetik)
NEW_PRICE=$(echo "scale=2; $current_price * $ZAM_ORANI" | bc)
echo "Güncelleniyor: Varyasyon $var_id | Eski: $current_price | Yeni: $NEW_PRICE"
wp wc product_variation update $PRODUCT_ID $var_id
--user=$ADMIN_USER
--regular_price=$NEW_PRICE
done <<< "$VARIATION_IDS"
echo "-------------------------------------------"
echo "İşlem tamamlandı."
Bu script’i çalıştırmadan önce chmod +x update_variation_prices.sh ile çalıştırma izni vermeyi unutma.
Birden Fazla Ürünün Varyasyonlarını Toplu Güncelleme
Daha gerçekçi senaryo: Sitedeki tüm giyim kategorisindeki ürünlerin varyasyonlarını güncellemek istiyorsun. Önce kategori bazında ürünleri çekip, sonra her ürünün varyasyonlarını işleyeceksin:
#!/bin/bash
# Dosya: bulk_category_price_update.sh
ADMIN_USER="admin"
KATEGORI_SLUG="giyim"
ZAM_ORANI=1.15 # %15 zam
LOG_FILE="/var/log/wc_price_update_$(date +%Y%m%d_%H%M%S).log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "Toplu fiyat güncellemesi başlıyor - Kategori: $KATEGORI_SLUG"
# Belirtilen kategorideki variable product'ları çek
PRODUCT_LIST=$(wp wc product list
--user=$ADMIN_USER
--category=$KATEGORI_SLUG
--type=variable
--format=csv
--fields=id,name
--per_page=100 2>/dev/null | tail -n +2)
TOPLAM_URUN=0
TOPLAM_VARIASYON=0
HATA_SAYISI=0
while IFS=',' read -r product_id product_name; do
log "Ürün işleniyor: $product_name (ID: $product_id)"
TOPLAM_URUN=$((TOPLAM_URUN + 1))
# Bu ürünün varyasyonlarını çek
VARIATIONS=$(wp wc product_variation list $product_id
--user=$ADMIN_USER
--format=csv
--fields=id,regular_price
--per_page=100 2>/dev/null | tail -n +2)
while IFS=',' read -r var_id reg_price; do
[ -z "$var_id" ] && continue
if [ -z "$reg_price" ] || [ "$reg_price" == "0" ]; then
log " ATLANDI: Varyasyon $var_id - Geçerli fiyat yok"
continue
fi
NEW_PRICE=$(echo "scale=2; $reg_price * $ZAM_ORANI" | bc)
if wp wc product_variation update $product_id $var_id
--user=$ADMIN_USER
--regular_price=$NEW_PRICE 2>/dev/null; then
log " OK: Varyasyon $var_id | $reg_price -> $NEW_PRICE TL"
TOPLAM_VARIASYON=$((TOPLAM_VARIASYON + 1))
else
log " HATA: Varyasyon $var_id güncellenemedi"
HATA_SAYISI=$((HATA_SAYISI + 1))
fi
done <<< "$VARIATIONS"
done <<< "$PRODUCT_LIST"
log "========================================="
log "ÖZET: $TOPLAM_URUN ürün, $TOPLAM_VARIASYON varyasyon güncellendi"
log "Hata sayısı: $HATA_SAYISI"
log "Log dosyası: $LOG_FILE"
Belirli Attribute’a Göre Varyasyon Filtreleme
Bazen sadece belirli bir renk veya bedenin fiyatını güncellemen gerekir. Örneğin sadece “Kırmızı” renkli varyasyonlara özel indirim uygulamak istiyorsun:
#!/bin/bash
# Dosya: filter_by_attribute.sh
# Sadece belirli attribute değerine sahip varyasyonları güncelle
ADMIN_USER="admin"
HEDEF_ATTRIBUTE="kirmizi" # Attribute slug değeri
INDIRIM_ORANI=0.80 # %20 indirim
PRODUCT_ID=$1 # Script'e parametre olarak ürün ID'si ver
if [ -z "$PRODUCT_ID" ]; then
echo "Kullanım: $0 <product_id>"
exit 1
fi
echo "Ürün $PRODUCT_ID - '$HEDEF_ATTRIBUTE' varyasyonları işleniyor..."
# Varyasyonları JSON formatında al ve jq ile filtrele
wp wc product_variation list $PRODUCT_ID
--user=$ADMIN_USER
--format=json 2>/dev/null |
jq -r --arg attr "$HEDEF_ATTRIBUTE"
'.[] | select(.attributes[].option | ascii_downcase == $attr) | "(.id),(.regular_price)"' |
while IFS=',' read -r var_id reg_price; do
[ -z "$reg_price" ] || [ "$reg_price" == "0" ] && continue
NEW_PRICE=$(echo "scale=2; $reg_price * $INDIRIM_ORANI" | bc)
SALE_END="2024-12-31T23:59:59"
echo "İndirim uygulanıyor: Varyasyon $var_id | Normal: $reg_price | İndirimli: $NEW_PRICE"
wp wc product_variation update $PRODUCT_ID $var_id
--user=$ADMIN_USER
--sale_price=$NEW_PRICE
--date_on_sale_to="$SALE_END"
done
Bu script jq aracına ihtiyaç duyuyor. Sisteminizde yoksa apt install jq veya yum install jq ile kurabilirsiniz.
CSV Dosyasından Fiyat Güncelleme
Müşteri sana Excel’den dönüştürdüğü CSV dosyası gönderip “Bu fiyatları gir” diyebilir. Bu senaryo için:
# Örnek CSV formatı (prices.csv):
# product_id,variation_id,regular_price,sale_price
# 42,156,199.99,149.99
# 42,157,219.99,169.99
# 85,301,89.99,
# 85,302,99.99,79.99
#!/bin/bash
# Dosya: csv_price_import.sh
ADMIN_USER="admin"
CSV_FILE="${1:-prices.csv}"
BASARILI=0
BASARISIZ=0
if [ ! -f "$CSV_FILE" ]; then
echo "HATA: $CSV_FILE dosyası bulunamadı"
exit 1
fi
echo "CSV dosyasından fiyat güncellemesi başlıyor: $CSV_FILE"
# Header satırını atla, virgülle böl
tail -n +2 "$CSV_FILE" | while IFS=',' read -r product_id variation_id regular_price sale_price; do
# Boşlukları temizle
product_id=$(echo "$product_id" | tr -d ' ')
variation_id=$(echo "$variation_id" | tr -d ' ')
regular_price=$(echo "$regular_price" | tr -d ' ')
sale_price=$(echo "$sale_price" | tr -d ' r')
[ -z "$product_id" ] || [ -z "$variation_id" ] && continue
CMD="wp wc product_variation update $product_id $variation_id --user=$ADMIN_USER"
[ -n "$regular_price" ] && CMD="$CMD --regular_price=$regular_price"
# Sale price boşsa kaldır, doluysa uygula
if [ -z "$sale_price" ]; then
CMD="$CMD --sale_price=''"
else
CMD="$CMD --sale_price=$sale_price"
fi
if eval $CMD > /dev/null 2>&1; then
echo "OK: Ürün $product_id | Varyasyon $variation_id | Normal: $regular_price | İndirimli: $sale_price"
BASARILI=$((BASARILI + 1))
else
echo "HATA: Ürün $product_id | Varyasyon $variation_id güncellenemedi"
BASARISIZ=$((BASARISIZ + 1))
fi
done
echo ""
echo "Tamamlandı. Başarılı: $BASARILI | Başarısız: $BASARISIZ"
WP-CLI eval-file ile PHP Tabanlı Toplu Güncelleme
Bazen WooCommerce CLI yeterince esnek olmayabiliyor veya çok sayıda API çağrısı yavaşlatıyor. Bu durumda wp eval-file komutuyla doğrudan PHP üzerinden toplu güncelleme yapabilirsin:
# update_prices.php dosyasını oluştur, sonra wp eval-file ile çalıştır
wp eval-file update_prices.php --user=admin
<?php
// Dosya: update_prices.php
// wp eval-file ile çalıştırılır
$zam_orani = 1.10; // %10 zam
$kategori_id = 15; // Giyim kategorisi ID
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $kategori_id,
),
),
'meta_query' => array(
array(
'key' => '_product_attributes',
'compare' => 'EXISTS',
),
),
);
$products = get_posts( $args );
$guncellenen = 0;
$atlanan = 0;
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
if ( ! $product || ! $product->is_type( 'variable' ) ) {
continue;
}
$variations = $product->get_children();
foreach ( $variations as $variation_id ) {
$variation = wc_get_product( $variation_id );
if ( ! $variation ) {
continue;
}
$mevcut_fiyat = (float) $variation->get_regular_price();
if ( $mevcut_fiyat <= 0 ) {
WP_CLI::log( "ATLANDI: Varyasyon $variation_id - geçerli fiyat yok" );
$atlanan++;
continue;
}
$yeni_fiyat = round( $mevcut_fiyat * $zam_orani, 2 );
$variation->set_regular_price( $yeni_fiyat );
$variation->save();
WP_CLI::log( "OK: Varyasyon $variation_id | $mevcut_fiyat -> $yeni_fiyat" );
$guncellenen++;
}
}
WP_CLI::success( "Tamamlandı: $guncellenen varyasyon güncellendi, $atlanan atlandı." );
Bu yöntem özellikle büyük kataloglarda çok daha hızlı çalışır çünkü her güncelleme için ayrı bir HTTP isteği açmak yerine doğrudan WordPress veritabanına yazıyor.
Cron ile Zamanlanmış Fiyat Güncellemesi
Kampanya dönemlerinde belirli saatlerde fiyatları otomatik güncellemek isteyebilirsin. Bunun için crontab’a ekleyebilirsin:
# Crontab düzenle
crontab -e
# Her gün gece yarısı kategori bazlı indirim uygula
0 0 * * * /usr/local/bin/wp --path=/var/www/html wc product list
--user=admin --type=variable --format=ids 2>/dev/null |
xargs -I{} /usr/local/bin/wp --path=/var/www/html
eval-file /opt/scripts/nightly_sale.php --user=admin >>
/var/log/wc_nightly_update.log 2>&1
# Sadece Cuma-Cumartesi hafta sonu indirimi
0 18 * * 5 /opt/scripts/weekend_sale.sh >> /var/log/wc_weekend.log 2>&1
0 23 * * 0 /opt/scripts/weekend_sale_end.sh >> /var/log/wc_weekend.log 2>&1
Cron job’larda WP-CLI kullanırken --path parametresiyle WordPress kurulum dizinini belirtmeyi unutma. Ayrıca kullanıcı ile ilgili sorun yaşarsan --allow-root bayrağını ekleyebilirsin, ancak production ortamında root ile çalışmak yerine www-data veya özel bir kullanıcı tercih et.
Güncelleme Öncesi ve Sonrası Doğrulama
Özellikle production ortamında çalışırken önce dry-run mantığıyla ne yapacağını görmen önemli:
#!/bin/bash
# Dosya: verify_prices.sh
# Güncelleme öncesi ve sonrası fiyat raporu oluştur
ADMIN_USER="admin"
PRODUCT_ID=$1
RAPOR_DOSYASI="/tmp/fiyat_raporu_${PRODUCT_ID}_$(date +%Y%m%d).txt"
echo "=== Fiyat Raporu - Ürün ID: $PRODUCT_ID ===" > "$RAPOR_DOSYASI"
echo "Tarih: $(date)" >> "$RAPOR_DOSYASI"
echo "" >> "$RAPOR_DOSYASI"
wp wc product_variation list $PRODUCT_ID
--user=$ADMIN_USER
--format=table
--fields=id,sku,regular_price,sale_price,stock_status 2>/dev/null |
tee -a "$RAPOR_DOSYASI"
echo ""
echo "Rapor kaydedildi: $RAPOR_DOSYASI"
echo "Toplam varyasyon sayısı:"
wp wc product_variation list $PRODUCT_ID
--user=$ADMIN_USER
--format=count 2>/dev/null
Production’da değişiklik yapmadan önce bu script ile anlık raporu al, sonra güncellemeleri yap, ardından script’i tekrar çalıştırıp karşılaştır. Bu basit önlem seni çok büyük hatalardan korur.
Sık Karşılaşılan Sorunlar ve Çözümleri
“Error: Please specify a valid user.” hatası alıyorsan:
--userparametresi eksiktir ya da belirtilen kullanıcının yetkileri yetersizdirwp user list --role=administratorile admin kullanıcılarını listele ve doğru kullanıcıyı belirt
Fiyatlar güncelleniyor ama frontend’de görünmüyor:
- WooCommerce fiyat cache’i temizlemek gerekebilir
wp wc tool run clear_transients --user=adminkomutunu çalıştır- Ardından
wp cache flushile object cache’i temizle
Script yavaş çalışıyor:
- Her
wp wcçağrısı yeni bir PHP process başlatır, büyük kataloglarda çok yavaş olabilir wp eval-fileile PHP tabanlı güncellemeye geç, fark çok belirgin olur- 500+ varyasyonluk işlemlerde PHP yolunu kesinlikle tavsiye ederim
“variation_id not found” hatası:
- Varyasyon ID’si ile ana ürün ID’si uyuşmuyordur
wp wc product_variation list --user=adminile doğru ID eşleşmesini kontrol et
Ondalık sayı sorunları:
- Bazı sistemlerde
bcvirgüllü sayıları noktalı bekliyor LC_NUMERIC=Cortam değişkenini script başına ekle:export LC_NUMERIC=C
Sonuç
WooCommerce CLI ve bash script kombinasyonu, fiyat yönetimini ciddi ölçüde hızlandırıyor. Yüzlerce varyasyonu elle güncellemek yerine birkaç dakika içinde binlerce kaydı otomatik işleyebiliyorsun.
Özetlemek gerekirse:
- Tek varyasyon güncellemesi için
wp wc product_variation updatekomutunu kullan - Toplu kategori güncellemeleri için bash script içinde döngüye al
- Büyük kataloglarda
wp eval-fileile PHP tabanlı güncelleme çok daha performanslı - CSV import senaryolarında basit bash script ile müşteriden gelen veriyi direkt işleyebilirsin
- Cron entegrasyonu ile zamanlanmış kampanya yönetimini otomatize edebilirsin
- Log tutmayı asla atlamayalım, üretimde yapılan her fiyat değişikliği kayıt altına alınmalı
Production ortamında herhangi bir toplu güncelleme yapmadan önce veritabanı yedeği almayı alışkanlık haline getir. wp db export backup_$(date +%Y%m%d).sql komutu bunu tek satırda halleder. Sonradan pişman olmak yerine önceden hazırlıklı olmak, iyi bir sysadmin’in temel alışkanlığıdır.
