WP CLI ile WooCommerce Ürün Etiketi Yönetimi: wp wc product_tag Komutları
WooCommerce mağazanızda yüzlerce ürün varsa ve bu ürünleri etiketlerle organize etmeye çalışıyorsanız, WordPress yönetim panelinden tek tek işlem yapmak gerçek anlamda bir işkenceye dönüşebilir. WP CLI’nin wp wc product_tag komutu tam bu noktada hayat kurtarıcı oluyor. Toplu etiket oluşturma, güncelleme, silme ve ürünlere atama işlemlerini terminal üzerinden dakikalar içinde halledebilirsiniz. Bu yazıda gerçek dünya senaryolarıyla bu komutu derinlemesine inceleyeceğiz.
WP CLI WooCommerce Kurulum Kontrolü
Komutlara geçmeden önce ortamın hazır olduğundan emin olalım. WP CLI ve WooCommerce eklentisinin aktif olması gerekiyor.
# WP CLI versiyonunu kontrol et
wp --version
# WooCommerce eklentisinin aktif olup olmadığını kontrol et
wp plugin status woocommerce
# WooCommerce CLI komutlarının listelendiğini doğrula
wp wc --help
Eğer wp wc komutları çalışmıyorsa büyük ihtimalle --user parametresini unutmuşsunuzdur. WooCommerce REST API tabanlı CLI komutları için admin yetkisine sahip bir kullanıcı belirtmek zorundasınız.
# Doğru kullanım - kullanıcı belirtilmeli
wp wc product_tag list --user=admin
Bu detayı atlarsanız Error: Sorry, you are not allowed to do that hatası alırsınız. Bunu aklınızın bir köşesine yazın, çünkü WooCommerce CLI komutlarının neredeyse tamamında bu kural geçerlidir.
product_tag Komutunun Temel Yapısı
wp wc product_tag komutu beş ana alt komuttan oluşur:
- list: Mevcut etiketleri listeler
- get: Belirli bir etiketi getirir
- create: Yeni etiket oluşturur
- update: Mevcut etiketi günceller
- delete: Etiketi siler
Her alt komutun parametrelerini görmek için --help flag’ini kullanabilirsiniz.
wp wc product_tag create --help
wp wc product_tag list --help
Etiket Listeleme ve Sorgulama
Tüm Etiketleri Listeleme
# Basit liste
wp wc product_tag list --user=admin
# JSON formatında çıktı
wp wc product_tag list --user=admin --format=json
# Sadece belirli alanları göster
wp wc product_tag list --user=admin --fields=id,name,slug,count
# Tablo formatında daha okunaklı çıktı
wp wc product_tag list --user=admin --format=table
Büyük bir mağazada çalışıyorsanız --per_page parametresiyle sayfalama yapabilirsiniz. Varsayılan değer 10’dur, maksimum 100’e kadar çekebilirsiniz.
# Sayfa başına 100 etiket, 2. sayfa
wp wc product_tag list --user=admin --per_page=100 --page=2
# Toplam etiket sayısını bul
wp wc product_tag list --user=admin --per_page=100 | wc -l
Belirli Bir Etiketi Sorgulama
# ID ile sorgula
wp wc product_tag get 42 --user=admin
# Daha temiz JSON çıktısı
wp wc product_tag get 42 --user=admin --format=json
Gerçek dünya senaryosu: Diyelim ki bir etiketi güncellemek istiyorsunuz ama slug’ını bilmiyorsunuz. Önce listeyi çekip ID’yi bulun, sonra detaylarına bakın.
# İsme göre filtrele (grep ile)
wp wc product_tag list --user=admin --fields=id,name,slug --format=json | grep -i "indirim"
Etiket Oluşturma
Tek Etiket Oluşturma
# Basit etiket oluşturma
wp wc product_tag create --name="Yeni Sezon" --user=admin
# Slug ve açıklama ile birlikte
wp wc product_tag create
--name="Yaz Koleksiyonu 2024"
--slug="yaz-koleksiyonu-2024"
--description="2024 yaz sezonu ürünleri"
--user=admin
Başarılı bir oluşturma işleminde şuna benzer bir çıktı alırsınız:
Success: Created product_tag 87.
Bu 87 numarası oluşturulan etiketin ID’sidir, not edin.
Toplu Etiket Oluşturma – Bash Script
Gerçek hayatta onlarca etiketi tek seferde oluşturmanız gerekebilir. Bunun için basit bir bash scripti yazalım.
#!/bin/bash
# bulk_create_tags.sh
# Kullanım: bash bulk_create_tags.sh
ADMIN_USER="admin"
SITE_PATH="/var/www/html/wordpress"
# Etiket listesi (isim:slug:açıklama formatında)
declare -a TAGS=(
"Organik:organik:Organik sertifikalı ürünler"
"Glutensiz:glutensiz:Gluten içermeyen ürünler"
"Vegan:vegan:Vegan dostu ürünler"
"El Yapımı:el-yapimi:El yapımı özel ürünler"
"Sınırlı Stok:sinirli-stok:Sınırlı miktarda bulunan ürünler"
"Yeni Geliş:yeni-gelis:Son eklenen yeni ürünler"
"Çok Satan:cok-satan:En popüler ürünler"
)
cd "$SITE_PATH"
for tag_data in "${TAGS[@]}"; do
IFS=':' read -r name slug description <<< "$tag_data"
result=$(wp wc product_tag create
--name="$name"
--slug="$slug"
--description="$description"
--user="$ADMIN_USER" 2>&1)
if echo "$result" | grep -q "Success"; then
echo "[OK] Etiket oluşturuldu: $name"
else
echo "[HATA] Etiket oluşturulamadı: $name - $result"
fi
done
echo "İşlem tamamlandı."
Bu scripti çalıştırmadan önce SITE_PATH ve ADMIN_USER değişkenlerini kendi ortamınıza göre düzenleyin.
Etiket Güncelleme
Tek Etiket Güncelleme
# İsim güncelle
wp wc product_tag update 87 --name="Yaz Koleksiyonu 2024 - Güncel" --user=admin
# Açıklama güncelle
wp wc product_tag update 87
--description="Güncellenmiş açıklama metni"
--user=admin
# Slug güncelle (dikkatli olun, SEO'yu etkiler)
wp wc product_tag update 87 --slug="yaz-2024" --user=admin
Önemli uyarı: Slug değiştirmek mevcut URL’leri kırar. Eğer etiket sayfanız Google’da indexlenmişse, slug değiştirmeden önce mutlaka redirect ayarlarınızı yapın.
Toplu Güncelleme Senaryosu
Diyelim ki bir CSV dosyanız var ve bu dosyadaki etiketlerin açıklamalarını toplu güncellemek istiyorsunuz.
#!/bin/bash
# bulk_update_tags.sh
# CSV formatı: id,yeni_aciklama
ADMIN_USER="admin"
CSV_FILE="tag_updates.csv"
while IFS=',' read -r tag_id new_description; do
# Başlık satırını atla
[[ "$tag_id" == "id" ]] && continue
result=$(wp wc product_tag update "$tag_id"
--description="$new_description"
--user="$ADMIN_USER" 2>&1)
if echo "$result" | grep -q "Success"; then
echo "[OK] Etiket $tag_id güncellendi"
else
echo "[HATA] Etiket $tag_id güncellenemedi: $result"
fi
done < "$CSV_FILE"
tag_updates.csv dosyası şu formatta olmalı:
id,yeni_aciklama
42,Bu sezonun en çok tercih edilen organik ürünleri
87,Sertifikalı vegan ürünler koleksiyonu
103,El işçiliğiyle üretilen benzersiz parçalar
Etiket Silme
Tekil Silme
# ID ile sil
wp wc product_tag delete 87 --user=admin
# Zorla sil (onay istemez)
wp wc product_tag delete 87 --force --user=admin
Toplu Silme
Boş etiketleri (hiç ürün atanmamış) temizlemek çok yaygın bir ihtiyaçtır.
#!/bin/bash
# delete_empty_tags.sh
# Ürün sayısı 0 olan etiketleri siler
ADMIN_USER="admin"
echo "Boş etiketler aranıyor..."
# JSON formatında etiketleri çek, count=0 olanları filtrele
empty_tags=$(wp wc product_tag list
--user="$ADMIN_USER"
--per_page=100
--format=json |
python3 -c "
import json, sys
tags = json.load(sys.stdin)
empty = [str(t['id']) for t in tags if t['count'] == 0]
print('n'.join(empty))
")
if [ -z "$empty_tags" ]; then
echo "Boş etiket bulunamadı."
exit 0
fi
echo "Silinecek etiketler:"
echo "$empty_tags"
read -p "Devam etmek istiyor musunuz? (e/h): " confirm
if [ "$confirm" != "e" ]; then
echo "İşlem iptal edildi."
exit 0
fi
while IFS= read -r tag_id; do
[ -z "$tag_id" ] && continue
result=$(wp wc product_tag delete "$tag_id"
--force
--user="$ADMIN_USER" 2>&1)
if echo "$result" | grep -q "Deleted"; then
echo "[OK] Etiket $tag_id silindi"
else
echo "[HATA] $tag_id: $result"
fi
done <<< "$empty_tags"
echo "Temizlik tamamlandı."
Ürünlere Etiket Atama
wp wc product_tag komutları etiketleri yönetir ama ürünlere atama işlemi wp wc product update komutu üzerinden yapılır. İkisini birlikte kullanmak gerekir.
Tek Ürüne Etiket Atama
# Önce mevcut etiket ID'lerini öğren
wp wc product_tag list --user=admin --fields=id,name
# Ürüne etiket ata (ID: 101 olan ürüne 42 ve 87 ID'li etiketleri ata)
wp wc product update 101
--tags='[{"id":42},{"id":87}]'
--user=admin
Toplu Ürün Etiketleme Scripti
Bu senaryo çok gerçekçi: Belirli bir kategorideki tüm ürünlere “İndirim” etiketi eklemek istiyorsunuz.
#!/bin/bash
# bulk_tag_products.sh
# Belirli kategorideki ürünlere etiket ekler
ADMIN_USER="admin"
CATEGORY_ID="15" # Hedef kategori ID'si
TAG_ID="42" # Eklenecek etiket ID'si
echo "Kategori $CATEGORY_ID'deki ürünler getiriliyor..."
# Kategorideki ürün ID'lerini çek
product_ids=$(wp wc product list
--user="$ADMIN_USER"
--category="$CATEGORY_ID"
--per_page=100
--fields=id
--format=json |
python3 -c "
import json, sys
products = json.load(sys.stdin)
print('n'.join([str(p['id']) for p in products]))
")
if [ -z "$product_ids" ]; then
echo "Bu kategoride ürün bulunamadı."
exit 0
fi
total=$(echo "$product_ids" | wc -l)
echo "$total ürün bulundu. Etiketleme başlıyor..."
counter=0
while IFS= read -r product_id; do
[ -z "$product_id" ] && continue
# Mevcut etiketleri al
current_tags=$(wp wc product get "$product_id"
--user="$ADMIN_USER"
--format=json 2>/dev/null |
python3 -c "
import json, sys
try:
product = json.load(sys.stdin)
tags = product.get('tags', [])
tag_ids = [t['id'] for t in tags]
print(json.dumps([{'id': tid} for tid in tag_ids]))
except:
print('[]')
")
# Yeni etiketi mevcut etiketlere ekle (tekrar eklememek için kontrol)
new_tags=$(python3 -c "
import json
current = json.loads('$current_tags')
current_ids = [t['id'] for t in current]
if $TAG_ID not in current_ids:
current.append({'id': $TAG_ID})
print(json.dumps(current))
")
result=$(wp wc product update "$product_id"
--tags="$new_tags"
--user="$ADMIN_USER" 2>&1)
counter=$((counter + 1))
echo "[$counter/$total] Ürün $product_id işlendi"
done <<< "$product_ids"
echo "Etiketleme tamamlandı. $counter ürün işlendi."
Etiket Birleştirme ve Yeniden Yapılandırma
Zamanla mağazalarda etiket kaosuna girilir. “indirim”, “İndirim”, “indirimli” gibi aynı anlama gelen onlarca etiket oluşur. Bunları birleştirmek için sistematik bir yaklaşım gerekir.
#!/bin/bash
# merge_tags.sh
# Birden fazla etiketi tek bir etikette birleştirir
ADMIN_USER="admin"
TARGET_TAG_ID="42" # Kalacak etiket
SOURCE_TAG_IDS="95 103 117" # Silinecek etiketler
echo "Etiket birleştirme işlemi başlıyor..."
echo "Hedef etiket: $TARGET_TAG_ID"
for source_id in $SOURCE_TAG_IDS; do
echo ""
echo "Kaynak etiket $source_id işleniyor..."
# Bu etikete sahip ürünleri bul
products=$(wp post list
--post_type=product
--tax_query="[{'taxonomy':'product_tag','field':'term_id','terms':[$source_id]}]"
--fields=ID
--format=json 2>/dev/null)
# Daha basit yöntem: wp term komutunu kullan
product_ids=$(wp post list
--post_type=product
--fields=ID
--format=json |
python3 -c "
import json, sys
# Bu yaklaşım tüm ürünleri çeker, production'da dikkatli kullanın
posts = json.load(sys.stdin)
print('n'.join([str(p['ID']) for p in posts]))
")
# Her ürün için kaynak etiketi hedef etiketle değiştir
while IFS= read -r pid; do
[ -z "$pid" ] && continue
# Ürünün etiketlerini güncelle (bu kısım mağazanızın yapısına göre özelleştirin)
wp wc product update "$pid"
--user="$ADMIN_USER" &>/dev/null
echo " Ürün $pid güncellendi"
done <<< "$product_ids"
# Kaynak etiketi sil
wp wc product_tag delete "$source_id" --force --user="$ADMIN_USER"
echo "Kaynak etiket $source_id silindi"
done
echo ""
echo "Birleştirme tamamlandı."
Etiket Raporlama ve Analiz
Mağazanızdaki etiket kullanım istatistiklerini çıkarmak yönetimsel kararlar için çok değerlidir.
#!/bin/bash
# tag_report.sh
# Etiket kullanım raporu oluşturur
ADMIN_USER="admin"
OUTPUT_FILE="tag_report_$(date +%Y%m%d).txt"
echo "=== WooCommerce Ürün Etiketi Raporu ===" > "$OUTPUT_FILE"
echo "Tarih: $(date)" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
# Tüm etiketleri JSON olarak çek ve raporla
wp wc product_tag list
--user="$ADMIN_USER"
--per_page=100
--fields=id,name,slug,count
--format=json |
python3 -c "
import json, sys
tags = json.load(sys.stdin)
tags_sorted = sorted(tags, key=lambda x: x['count'], reverse=True)
print('--- Kullanım Sırasına Göre Etiketler ---')
print()
for tag in tags_sorted:
bar = '#' * min(tag['count'], 50)
print(f"ID:{tag['id']:5} | {tag['name']:30} | Ürün: {tag['count']:4} | {bar}")
print()
print(f'Toplam etiket sayısı: {len(tags)}')
print(f'Toplam etiketli ürün: {sum(t["count"] for t in tags)}')
print(f'Hiç kullanılmayan etiket: {sum(1 for t in tags if t["count"] == 0)}')
" >> "$OUTPUT_FILE"
echo "Rapor oluşturuldu: $OUTPUT_FILE"
cat "$OUTPUT_FILE"
Sık Karşılaşılan Hatalar ve Çözümleri
Hata: --user parametresi eksik
Error: Sorry, you are not allowed to do that.
Çözüm: Her wp wc komutuna --user=admin ekleyin ya da sudo ile çalıştırıyorsanız web sunucu kullanıcısına geçin.
sudo -u www-data wp wc product_tag list --user=admin --path=/var/www/html
Hata: Duplicate entry slug
Aynı slug’a sahip bir etiket zaten varsa oluşturma başarısız olur. Script yazarken bunu kontrol edin.
# Slug'ın var olup olmadığını kontrol et
wp wc product_tag list --user=admin --format=json |
python3 -c "
import json, sys
tags = json.load(sys.stdin)
slugs = [t['slug'] for t in tags]
print('n'.join(slugs))
" | grep "^yeni-sezon$"
Hata: JSON parse hatası
--tags parametresine JSON geçerken tırnak işaretleri sorun çıkarabilir. Single quote yerine double quote kullanıp shell escaping’e dikkat edin.
# Sorunlu kullanım
wp wc product update 101 --tags="[{"id":42}]" --user=admin
# Doğru kullanım
wp wc product update 101 --tags='[{"id":42}]' --user=admin
Cron ile Otomatik Etiket Yönetimi
Düzenli çalıştırılması gereken etiket temizleme işlemlerini cron’a alabilirsiniz.
# Crontab'ı düzenle
crontab -e
# Her Pazar gece yarısı boş etiketleri temizle
0 0 * * 0 /usr/local/bin/wp wc product_tag list --user=admin --format=json --per_page=100 --path=/var/www/html | python3 /home/admin/scripts/cleanup_empty_tags.py >> /var/log/woocommerce-tag-cleanup.log 2>&1
# Her gün sabah 6'da etiket raporu oluştur
0 6 * * * /home/admin/scripts/tag_report.sh >> /var/log/woocommerce-tag-report.log 2>&1
Sonuç
wp wc product_tag komutları başta basit görünse de toplu işlemler ve otomasyon senaryolarında gerçek gücünü ortaya koyuyor. Özellikle yüzlerce veya binlerce ürünü olan mağazalarda yönetim paneli üzerinden yapılacak işlemler saatler alırken, iyi yazılmış bir bash scriptiyle aynı işi dakikalar içinde bitirebilirsiniz.
Bu yazıda ele aldığımız konuları özetlersek:
- Etiket listeleme, sorgulama, oluşturma, güncelleme ve silme temel işlemleri
- Toplu etiket oluşturma ve güncelleme scriptleri
- Ürünlere toplu etiket atama
- Etiket birleştirme ve temizleme senaryoları
- Raporlama ve analiz araçları
- Cron entegrasyonu
Scriptle çalışırken her zaman önce test ortamında deneyin, özellikle toplu silme işlemlerinde. Etiketleri silmek ürünlere zarar vermez (sadece ilişki kopar) ama geri almak zahmetli olabilir. Canlıya geçmeden önce bir veritabanı yedeği almak hiç zarar vermez.
Sorularınız veya farklı senaryolarınız varsa yorumlarda paylaşın, birlikte çözüm üretelim.
