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.

Bir yanıt yazın

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