WooCommerce CLI ile Ürün Meta Verisi Toplu Güncelleme
E-ticaret sitelerinde yüzlerce, hatta binlerce ürünün meta verilerini tek tek güncellemek, sysadmin olarak en can sıkıcı görevlerden biri. WooCommerce admin panelinden bu işi yapmaya çalışırsan ya saatlerini harcarsın ya da tarayıcın yarı yolda seni bırakır. WP CLI’nin WooCommerce entegrasyonu tam da bu noktada devreye giriyor ve toplu işlemleri dakikalar içinde halletmeni sağlıyor.
Bu yazıda gerçek dünya senaryolarıyla WooCommerce CLI komutlarını kullanarak ürün meta verilerini nasıl toplu güncelleyeceğini, hangi parametrelerin ne işe yaradığını ve production ortamında dikkat etmen gereken kritik noktaları ele alacağız.
WP CLI WooCommerce Eklentisini Kurma ve Hazırlık
Önce temel kurulumu halledelim. WP CLI’nin sistemde kurulu olduğunu varsayıyorum, ama WooCommerce komutları için ek bir eklentiye ihtiyacın var.
# WP CLI'nin güncel olduğundan emin ol
wp --version
# WooCommerce CLI komutlarını kontrol et
wp wc --help
# Eğer komutlar gelmediyse, WC REST API'yi etkinleştirmen gerekiyor
wp plugin is-active woocommerce && echo "WooCommerce aktif"
WooCommerce 3.0 ve sonrasında wp wc komutları built-in geliyor, ayrı eklenti kurmana gerek yok. Ama bazı toplu işlemler için WP CLI’nin wp eval ve wp post meta komutlarını da kullanacağız çünkü bunlar çok daha hızlı çalışıyor.
Bir de authentication meselesini halledelim. WP CLI komutlarını çalıştırırken kullanıcı bağlamı önemli:
# Hangi kullanıcıyla çalıştığını kontrol et
wp user list --role=administrator --fields=ID,user_login
# Komutları admin kullanıcısıyla çalıştır
wp --user=1 wc product list --status=publish --format=ids
–user parametresini unutma, özellikle cron job veya script içinde çalıştırıyorsan yetki sorunlarıyla karşılaşabilirsin.
Ürün Meta Verilerini Listeleme ve İnceleme
Toplu güncellemeye geçmeden önce mevcut durumu anlamak gerekiyor. Hangi meta verilerin olduğunu görmek için birkaç farklı yol var.
# Tüm yayınlanmış ürünleri ID listesi olarak al
wp wc product list --status=publish --format=ids --user=1
# Belirli bir ürünün tüm meta verilerini gör
wp post meta list 1234 --format=table
# Belirli bir meta key'i sorgula
wp post meta get 1234 _custom_brand
# Ürün listesini JSON formatında al, daha kolay parse edilir
wp wc product list --status=publish --format=json --user=1 | python3 -m json.tool | head -100
Gerçek hayatta en sık karşılaştığım senaryo şu: Bir müşteri binlerce ürünü olan bir mağaza devralıyor ve önceki ajansın eklediği custom meta field’lar ya tutarsız doldurulmuş ya da tamamen boş. Bu durumda önce hasarı tespit etmek lazım.
# Belirli meta key'i olmayan ürünleri bul
wp post list --post_type=product --posts_per_page=-1 --format=ids | tr ',' 'n' | while read id; do
val=$(wp post meta get $id _custom_brand 2>/dev/null)
if [ -z "$val" ]; then
echo "Eksik meta: Product ID $id"
fi
done
Bu script yavaş çalışır çünkü her ürün için ayrı bir DB sorgusu yapıyor. Büyük kataloglarda bunu doğrudan SQL ile yapman daha mantıklı, ama fikir edinmek için işe yarıyor.
Tekil Ürün Meta Verisi Güncelleme
Toplu işlemlere geçmeden önce tekil güncellemenin nasıl çalıştığını anlamak önemli. Bu aynı zamanda scriptlerin temelini oluşturuyor.
# wp wc komutuyla ürün güncelleme
wp wc product update 1234 --user=1 --sku="YENI-SKU-001"
# wp post meta ile custom meta güncelleme (daha hızlı)
wp post meta update 1234 _custom_brand "Nike"
# Meta yoksa ekle, varsa güncelle
wp post meta update 1234 _warranty_period "2 yil"
# WooCommerce native alanları için wc komutunu kullan
wp wc product update 1234 --user=1 --weight="1.5" --length="20" --width="15" --height="10"
wp post meta update ile wp wc product update arasındaki farka dikkat et. WooCommerce’in kendi alanları için (fiyat, stok, ağırlık vs.) wp wc product update kullanmak daha güvenli çünkü WooCommerce’in kendi hook ve action’larını tetikliyor, cache’leri temizliyor. Custom meta field’lar için ise wp post meta update çok daha hızlı.
Toplu Meta Veri Güncelleme Senaryoları
Senaryo 1: Tüm Ürünlere Sabit Meta Değeri Ekleme
Diyelim ki yeni bir “made_in” meta field’ı ekledin ve tüm mevcut ürünlere “Türkiye” değerini ataman gerekiyor.
#!/bin/bash
# Tüm yayınlanmış ürünlere 'made_in' meta değeri ekle
WP_PATH="/var/www/html/magazam"
LOG_FILE="/tmp/meta_update_$(date +%Y%m%d_%H%M%S).log"
echo "Meta güncelleme başlıyor: $(date)" | tee -a $LOG_FILE
# Ürün ID'lerini al
PRODUCT_IDS=$(wp --path=$WP_PATH post list
--post_type=product
--post_status=publish
--posts_per_page=-1
--format=ids
--quiet)
TOTAL=$(echo $PRODUCT_IDS | wc -w)
echo "Toplam ürün sayısı: $TOTAL" | tee -a $LOG_FILE
COUNTER=0
for ID in $PRODUCT_IDS; do
wp --path=$WP_PATH post meta update $ID made_in "Türkiye" 2>/dev/null
COUNTER=$((COUNTER + 1))
# Her 100 üründe bir ilerleme raporu
if [ $((COUNTER % 100)) -eq 0 ]; then
echo "İşlendi: $COUNTER / $TOTAL" | tee -a $LOG_FILE
fi
done
echo "Tamamlandı: $(date)" | tee -a $LOG_FILE
echo "Log dosyası: $LOG_FILE"
Bu scripti production’da çalıştırmadan önce –dry-run mantığı eklemeni öneririm. Yukarıdaki script silah gibi çalışır, geri dönüşü olmayan değişiklikler yapar.
Senaryo 2: CSV Dosyasından Meta Veri Güncelleme
En yaygın senaryo bu: Müşteri Excel’de binlerce ürünün güncellenmiş bilgilerini gönderdi, sen de bunu sisteme aktarman gerekiyor.
#!/bin/bash
# CSV formatı: SKU,META_KEY,META_VALUE
# Örnek: URУН-001,_custom_brand,Nike
CSV_FILE="$1"
WP_PATH="/var/www/html/magazam"
LOG_FILE="/tmp/csv_meta_update_$(date +%Y%m%d).log"
ERROR_FILE="/tmp/csv_meta_errors_$(date +%Y%m%d).log"
if [ -z "$CSV_FILE" ]; then
echo "Kullanım: $0 dosya.csv"
exit 1
fi
echo "CSV güncelleme başlıyor: $(date)" | tee -a $LOG_FILE
# Header satırını atla
tail -n +2 "$CSV_FILE" | while IFS=',' read -r SKU META_KEY META_VALUE; do
# SKU'dan Post ID bul
POST_ID=$(wp --path=$WP_PATH wc product list
--sku="$SKU"
--format=ids
--user=1 2>/dev/null | head -1)
if [ -z "$POST_ID" ]; then
echo "HATA: SKU bulunamadı - $SKU" | tee -a $ERROR_FILE
continue
fi
# Meta güncelle
wp --path=$WP_PATH post meta update $POST_ID "$META_KEY" "$META_VALUE" 2>/dev/null
if [ $? -eq 0 ]; then
echo "OK: SKU=$SKU, ID=$POST_ID, $META_KEY=$META_VALUE" >> $LOG_FILE
else
echo "HATA: SKU=$SKU güncelleme başarısız" | tee -a $ERROR_FILE
fi
done
echo "Tamamlandı: $(date)" | tee -a $LOG_FILE
echo "Hatalar için bak: $ERROR_FILE"
CSV dosyasını hazırlarken şu formatta olduğundan emin ol:
SKU,META_KEY,META_VALUE
URUN-001,_custom_brand,Nike
URUN-002,_custom_brand,Adidas
URUN-003,_warranty_period,2 yil
Senaryo 3: Belirli Kategorideki Ürünlerin Toplu Güncellenmesi
Sadece “elektronik” kategorisindeki ürünlere “returns_policy” meta değeri eklemek istiyorsun:
#!/bin/bash
# Belirli kategorideki ürünlere meta ekle
CATEGORY_SLUG="elektronik"
META_KEY="_returns_policy"
META_VALUE="30 gun iade garantisi"
WP_PATH="/var/www/html/magazam"
# Kategoriye göre ürün ID'lerini al
PRODUCT_IDS=$(wp --path=$WP_PATH post list
--post_type=product
--post_status=publish
--posts_per_page=-1
--format=ids
--tax_query[0][taxonomy]="product_cat"
--tax_query[0][field]="slug"
--tax_query[0][terms]="$CATEGORY_SLUG")
# Alternatif yol - daha güvenilir
PRODUCT_IDS=$(wp --path=$WP_PATH eval
"echo implode(' ', wc_get_products(['category' => ['$CATEGORY_SLUG'], 'limit' => -1, 'return' => 'ids']));")
echo "Bulunan ürün sayısı: $(echo $PRODUCT_IDS | wc -w)"
for ID in $PRODUCT_IDS; do
wp --path=$WP_PATH post meta update $ID "$META_KEY" "$META_VALUE"
echo "Güncellendi: $ID"
done
--tax_query parametresi WP CLI’de her zaman beklendiği gibi çalışmayabiliyor. Bu yüzden wp eval ile PHP kodunu doğrudan çalıştırmak daha güvenilir bir yol.
WP Eval ile Karmaşık Meta Güncellemeleri
Bazı durumlarda bash scripting yetmiyor, PHP’nin gücüne ihtiyaç duyuyorsun. wp eval tam burada devreye giriyor.
# Inline PHP ile toplu meta güncelleme
wp --path=/var/www/html/magazam eval '
$products = wc_get_products([
"limit" => -1,
"status" => "publish",
"return" => "ids"
]);
$updated = 0;
$errors = 0;
foreach ($products as $product_id) {
$product = wc_get_product($product_id);
// Mevcut fiyata göre koşullu meta güncelleme
$price = $product->get_regular_price();
if ($price > 1000) {
$tier = "premium";
} elseif ($price > 500) {
$tier = "mid-range";
} else {
$tier = "budget";
}
$result = update_post_meta($product_id, "_price_tier", $tier);
if ($result !== false) {
$updated++;
} else {
$errors++;
echo "Hata: Product ID $product_idn";
}
}
echo "Güncellenen: $updated, Hata: $errorsn";
' --user=1
Bu yaklaşımın avantajı WooCommerce’in tüm fonksiyonlarına erişebilmek. wc_get_product() ile ürün nesnesini alıp tüm özelliklerini sorgulayabilir, koşullu mantık kurabilirsin.
PHP Script Dosyasından Çalıştırma
Inline PHP uzun scriptler için okunaksız hale geliyor. Bunun yerine bir PHP dosyası oluşturup wp eval-file ile çalıştırmak çok daha temiz:
# update_product_meta.php dosyası oluştur ve çalıştır
wp --path=/var/www/html/magazam eval-file /tmp/update_product_meta.php --user=1
/tmp/update_product_meta.php içeriği:
<?php
// Toplu ürün meta güncelleme scripti
// Kullanım: wp eval-file update_product_meta.php --user=1
$args = [
'limit' => -1,
'status' => 'publish',
'return' => 'ids',
'orderby' => 'ID',
'order' => 'ASC',
];
$product_ids = wc_get_products($args);
$total = count($product_ids);
$updated = 0;
$skipped = 0;
WP_CLI::log("Toplam ürün: $total");
foreach ($product_ids as $index => $product_id) {
$product = wc_get_product($product_id);
if (!$product) {
WP_CLI::warning("Ürün yüklenemedi: $product_id");
continue;
}
// Mevcut meta değerini kontrol et, varsa atla
$existing = get_post_meta($product_id, '_seo_optimized', true);
if (!empty($existing)) {
$skipped++;
continue;
}
// Ürün başlığından slug oluştur
$seo_slug = sanitize_title($product->get_name());
update_post_meta($product_id, '_seo_slug', $seo_slug);
update_post_meta($product_id, '_seo_optimized', '1');
$updated++;
// Her 50 üründe progress göster
if ($updated % 50 === 0) {
WP_CLI::log("İşlendi: $updated / $total (Atlanan: $skipped)");
}
}
WP_CLI::success("Tamamlandı. Güncellenen: $updated, Atlanan: $skipped");
WP_CLI::log() ve WP_CLI::success() kullanmak, özellikle cron job çıktılarını log dosyasına yazarken çok daha temiz çıktı üretiyor.
WooCommerce Ürün Özelliklerine Özgü Güncellemeler
Custom meta field’ların yanı sıra WooCommerce’in kendi alanlarını da toplu güncelleyebilirsin. Stok durumu, vergi sınıfı gibi WC native alanlar için wp wc product update kullanman gerekiyor.
# Tüm ürünlerin vergi sınıfını güncelle
for ID in $(wp wc product list --format=ids --user=1 --per_page=100); do
wp wc product update $ID --tax_class="standard" --user=1
echo "Vergi sınıfı güncellendi: $ID"
sleep 0.1 # Rate limiting - sunucuyu bunaltma
done
sleep 0.1 küçük bir detay ama önemli. Özellikle shared hosting veya kaynak kısıtlı sunucularda binlerce sorguyu art arda göndermek MySQL bağlantılarını patlatabilir.
Cache Temizleme ve Performans
Meta veri güncelledikten sonra WooCommerce cache’lerini temizlemek şart. Aksi takdirde değişiklikler sitede görünmeyebilir.
# Tüm WooCommerce transient cache'lerini temizle
wp wc tool run clear_transients --user=1
# WordPress object cache temizle
wp cache flush
# WooCommerce'in kendi cache sistemini sıfırla
wp eval 'wc_delete_product_transients(); WP_CLI::success("WC transient temizlendi.");'
# Redis kullanıyorsan
wp redis flush-cache
# Tam temizlik scripti
wp wc tool run clear_transients --user=1 &&
wp wc tool run clear_expired_transients --user=1 &&
wp cache flush &&
echo "Tüm cache'ler temizlendi"
Büyük toplu güncellemelerde cache temizleme işlemini script sonunda bir kere yapmak, her güncelleme sonrasında yapmaktan çok daha verimli.
Production Ortamında Dikkat Edilmesi Gerekenler
Canlı sistemde bu komutları çalıştırmadan önce kesinlikle uyulması gereken bazı kurallar var.
Önce yedek al:
# Database yedeği
wp db export /backups/pre_meta_update_$(date +%Y%m%d_%H%M%S).sql
# Yedek boyutunu kontrol et
ls -lh /backups/pre_meta_update_*.sql | tail -1
Maintenance mode aç:
# Maintenance mode aktif et
wp maintenance-mode activate
# Güncellemeleri yap...
# Maintenance mode kapat
wp maintenance-mode deactivate
Script’i önce test ortamında çalıştır:
# Sadece ilk 10 ürünle test et
wp post list --post_type=product --posts_per_page=10 --format=ids |
tr ',' 'n' | head -10 | while read id; do
echo "Test - ID: $id, Meta güncellenecek"
# wp post meta update $id test_meta "test_value"
done
Gerçek güncelleme satırını comment’de bırakıp önce sadece neyin güncelleneceğini görmek, production’da rezalet çıkmasını önlüyor.
Büyük kataloglarda batch işleme:
Bin üzeri ürünlerde her şeyi bir anda çalıştırmak MySQL timeout’larına yol açabilir. Batch’ler halinde çalıştırmak çok daha güvenli:
#!/bin/bash
# 100'er ürünlük batch'ler halinde güncelle
BATCH_SIZE=100
OFFSET=0
while true; do
IDS=$(wp post list
--post_type=product
--posts_per_page=$BATCH_SIZE
--offset=$OFFSET
--format=ids
--quiet)
[ -z "$IDS" ] && break
for ID in $IDS; do
wp post meta update $ID _batch_processed "1" --quiet
done
echo "Batch tamamlandı. Offset: $OFFSET"
OFFSET=$((OFFSET + BATCH_SIZE))
# Batch'ler arası kısa bekleme
sleep 2
done
echo "Tüm batch'ler tamamlandı"
Sonuç
WP CLI ile WooCommerce meta veri güncellemesi, doğru araçları ve doğru yaklaşımı kullandığında gerçekten güçlü bir iş akışına dönüşüyor. Yüzlerce tıklama gerektiren admin panel işlerini dakikalar içinde bitirip daha önemli işlere odaklanabiliyorsun.
Özet olarak hatırlatmak istediğim kritik noktalar:
- Her zaman yedek al, ne kadar basit görünürse görünsün
- WooCommerce native alanları için
wp wc product update, custom meta içinwp post meta updatekullan - Karmaşık mantık gerektiren işlemler için
wp eval-fileile PHP dosyası daha temiz çözüm - Binlerce ürün varsa batch’ler halinde çalış ve sleep ekle
- İşlem sonunda mutlaka cache temizle
- Production’a geçmeden önce küçük bir subset’te test et
Bu komutları cron job’lara bağlayarak periyodik meta veri senkronizasyonları da kurabilirsin. Örneğin harici bir PIM sisteminden gelen güncellemeleri her gece otomatik olarak WooCommerce’e aktarmak artık birkaç satır bash scriptiyle halledilebiliyor. WP CLI’yi bir kez ciddiye aldıktan sonra “bunu neden daha önce kullanmamışım” diyeceksin.
