WooCommerce CLI ile Kategori Hiyerarşisi Yönetimi

E-ticaret sitelerinde kategori yönetimi, zamanla kaotik bir hal alabiliyor. Yüzlerce ürün, onlarca kategori, eksik üst-alt ilişkileri, tutarsız slug’lar… Hepsini WordPress admin panelinden tek tek düzeltmeye çalıştığınızı hayal edin. WP-CLI’nin WooCommerce entegrasyonu tam da bu noktada hayat kurtarıyor. Komut satırından kategori hiyerarşisini okuyabilir, düzenleyebilir, toplu güncellemeler yapabilir ve tüm süreci script’e dökerek otomatikleştirebilirsiniz.

WP-CLI ile WooCommerce Kategori Komutlarına Giriş

WooCommerce kategorileri teknik olarak WordPress’in özel taksonomi sistemi üzerinde çalışır. product_cat adlı bu taksonomi, standart wp term komutlarıyla yönetilebilir. Ancak WooCommerce’e özgü meta veriler, görsel atamaları ve özel alanlar için biraz daha dikkatli olmak gerekiyor.

Başlamadan önce WP-CLI’nin doğru kurulu olduğunu ve WooCommerce’in aktif olduğunu doğrulayalım:

wp --info
wp plugin status woocommerce
wp term list product_cat --fields=term_id,name,parent,count

Bu son komut size mevcut tüm ürün kategorilerini listeler. Çıktıda parent kolonu 0 olan kayıtlar kök kategorilerdir, 0’dan büyük olanlar ise bir üst kategoriye bağlıdır.

Kategori Hiyerarşisini Okumak ve Analiz Etmek

Tüm Kategori Ağacını Görüntüleme

Büyük bir mağazada önce mevcut durumu anlamak şart. Şu komutla tüm kategori yapısını çekebilirsiniz:

wp term list product_cat 
  --fields=term_id,name,slug,parent,count,description 
  --format=table

Daha ileri düzey analiz için JSON çıktısı alıp işleyebilirsiniz:

wp term list product_cat --format=json | python3 -m json.tool

Sadece üst kategorileri (parent = 0) görmek istiyorsanız:

wp term list product_cat --parent=0 --fields=term_id,name,count

Belirli bir kategorinin alt kategorilerini listelemek için, önce üst kategorinin ID’sini öğrenin:

# Önce ID'yi bulalım
wp term get product_cat elektrik-elektronik --by=slug --field=term_id

# Çıktıdaki ID ile alt kategorileri listele (örnek ID: 45)
wp term list product_cat --parent=45 --fields=term_id,name,slug,count

Hiyerarşi Derinliğini Analiz Etme

Gerçek dünyada bazen kategori ağacı ne kadar derin gittiğini bilmiyorsunuz. Şu bash script’i tüm hiyerarşiyi okunabilir bir ağaç formatında gösterir:

#!/bin/bash
# category-tree.sh
# WooCommerce kategori ağacını görselleştir

print_tree() {
    local parent_id=$1
    local indent=$2
    
    wp term list product_cat 
        --parent=$parent_id 
        --fields=term_id,name,count 
        --format=csv 
        --quiet | tail -n +2 | while IFS=',' read -r id name count; do
        
        echo "${indent}├── ${name} (ID: ${id}, Ürün: ${count})"
        print_tree "$id" "${indent}│   "
    done
}

echo "WooCommerce Kategori Hiyerarşisi"
echo "================================"
print_tree 0 ""

Çalıştırmak için:

chmod +x category-tree.sh
./category-tree.sh

Yeni Kategori Hiyerarşisi Oluşturmak

Üst Kategori Oluşturma

Sıfırdan bir kategori yapısı kurarken önce kök kategorileri oluşturursunuz:

wp term create product_cat "Elektronik" 
  --slug=elektronik 
  --description="Tüm elektronik ürünler" 
  --porcelain

--porcelain parametresi sadece oluşturulan term ID’sini döner, bu değeri hemen bir değişkene atayabilirsiniz:

ELEKTRONIK_ID=$(wp term create product_cat "Elektronik" 
  --slug=elektronik 
  --description="Tüm elektronik ürünler" 
  --porcelain)

echo "Elektronik kategori ID: $ELEKTRONIK_ID"

Alt Kategori Oluşturma

Üst kategori ID’sini --parent parametresiyle geçiriyorsunuz:

# Elektronik altına Telefon kategorisi
TELEFON_ID=$(wp term create product_cat "Telefon & Aksesuar" 
  --slug=telefon-aksesuar 
  --parent=$ELEKTRONIK_ID 
  --description="Akıllı telefonlar ve aksesuar ürünleri" 
  --porcelain)

# Telefon altına daha spesifik kategoriler
wp term create product_cat "Akıllı Telefonlar" 
  --slug=akilli-telefonlar 
  --parent=$TELEFON_ID 
  --description="iOS ve Android akıllı telefonlar"

wp term create product_cat "Telefon Kılıfları" 
  --slug=telefon-kiliflar 
  --parent=$TELEFON_ID

wp term create product_cat "Şarj Aletleri" 
  --slug=sarj-aletleri 
  --parent=$TELEFON_ID

Toplu Kategori İçe Aktarma

Yüzlerce kategori oluşturmanız gerektiğinde bunu script ile halledebilirsiniz. Önce bir CSV dosyası hazırlayın:

# kategoriler.csv
# ad,slug,ust_kategori_slug,aciklama
cat > kategoriler.csv << 'EOF'
ad,slug,ust_kategori_slug,aciklama
Giyim,giyim,,Erkek kadın ve çocuk giyim
Erkek Giyim,erkek-giyim,giyim,Erkek kıyafet koleksiyonu
Kadın Giyim,kadin-giyim,giyim,Kadın kıyafet koleksiyonu
Çocuk Giyim,cocuk-giyim,giyim,Çocuk kıyafet koleksiyonu
Erkek Tişört,erkek-tisort,erkek-giyim,Erkek tişört modelleri
Erkek Pantolon,erkek-pantolon,erkek-giyim,Erkek pantolon modelleri
EOF

Bu CSV’yi işleyen script:

#!/bin/bash
# bulk-category-import.sh

CSV_FILE="kategoriler.csv"

# Başlık satırını atla, her satırı işle
tail -n +2 "$CSV_FILE" | while IFS=',' read -r ad slug ust_slug aciklama; do
    
    # Üst kategori slug'ı varsa ID'sini bul
    if [ -n "$ust_slug" ]; then
        PARENT_ID=$(wp term get product_cat "$ust_slug" --by=slug --field=term_id 2>/dev/null)
        
        if [ -z "$PARENT_ID" ]; then
            echo "HATA: Üst kategori bulunamadı: $ust_slug"
            continue
        fi
    else
        PARENT_ID=0
    fi
    
    # Kategori zaten var mı kontrol et
    MEVCUT=$(wp term get product_cat "$slug" --by=slug --field=term_id 2>/dev/null)
    
    if [ -n "$MEVCUT" ]; then
        echo "Atlandı (zaten mevcut): $ad (ID: $MEVCUT)"
        continue
    fi
    
    # Kategori oluştur
    NEW_ID=$(wp term create product_cat "$ad" 
        --slug="$slug" 
        --parent="$PARENT_ID" 
        --description="$aciklama" 
        --porcelain 2>/dev/null)
    
    if [ -n "$NEW_ID" ]; then
        echo "Oluşturuldu: $ad (ID: $NEW_ID, Üst: $PARENT_ID)"
    else
        echo "HATA: Oluşturulamadı: $ad"
    fi
done

echo ""
echo "İşlem tamamlandı."

Kategori Hiyerarşisini Yeniden Düzenlemek

Kategoriyi Taşıma (Parent Değiştirme)

Mevcut bir kategorinin üst kategorisini değiştirmek için wp term update kullanırsınız:

# Kategori ID 78'i, ID 45'in altına taşı
wp term update product_cat 78 --parent=45

# Slug kullanarak da yapabilirsiniz
KATEGORI_ID=$(wp term get product_cat eski-kategori --by=slug --field=term_id)
YENI_PARENT_ID=$(wp term get product_cat yeni-ust-kategori --by=slug --field=term_id)

wp term update product_cat $KATEGORI_ID --parent=$YENI_PARENT_ID

Slug ve İsim Güncelleme

Yanlış slug’ları veya isimleri düzeltmek çok yaygın bir ihtiyaç:

# Slug düzeltme
wp term update product_cat 78 --slug=dogru-slug-formati

# İsim güncelleme
wp term update product_cat 78 --name="Doğru Kategori Adı"

# Açıklama ekleme
wp term update product_cat 78 --description="SEO uyumlu kategori açıklaması"

Toplu Slug Düzeltme

Türkçe karakter içeren veya boşluklu slug’ları temizleyen script:

#!/bin/bash
# fix-slugs.sh
# Türkçe karakter içeren slug'ları düzelt

wp term list product_cat --fields=term_id,slug --format=csv --quiet | 
tail -n +2 | while IFS=',' read -r id slug; do
    
    # Türkçe karakterleri dönüştür
    TEMIZ_SLUG=$(echo "$slug" | 
        sed 's/ç/c/g; s/ğ/g/g; s/ı/i/g; s/ö/o/g; s/ş/s/g; s/ü/u/g' | 
        sed 's/Ç/C/g; s/Ğ/G/g; s/İ/I/g; s/Ö/O/g; s/Ş/S/g; s/Ü/U/g' | 
        tr '[:upper:]' '[:lower:]' | 
        sed 's/ /-/g; s/[^a-z0-9-]//g; s/--*/-/g')
    
    if [ "$slug" != "$TEMIZ_SLUG" ]; then
        echo "Güncelleniyor: '$slug' -> '$TEMIZ_SLUG'"
        wp term update product_cat "$id" --slug="$TEMIZ_SLUG"
    fi
done

WooCommerce Kategori Meta Verilerini Yönetmek

Kategori Görselini Atama

WooCommerce kategorilerinin özel thumbnail’leri var. Bu görsel aslında bir term meta olarak saklanır:

# Önce görselin medya kütüphanesindeki ID'sini bulun
wp media list --fields=ID,post_title,post_mime_type | grep image

# Kategori ID 45'e görsel ata (görsel ID: 123)
wp term meta update 45 thumbnail_id 123

# Atandığını doğrula
wp term meta get 45 thumbnail_id

Kategori Görüntüleme Ayarları

WooCommerce, kategori sayfasında ne gösterileceğini display_type meta değeriyle kontrol eder:

# Görüntüleme tipini ayarla
# Değerler: '' (default), 'products', 'subcategories', 'both'
wp term meta update 45 display_type subcategories

# Belirli bir kategorinin mevcut ayarını kontrol et
wp term meta get 45 display_type

Öne Çıkan Kategori Ayarı

Kategori görselleri için order meta değerini güncellemek:

# Kategori sıralama
wp term meta update 45 order 1
wp term meta update 46 order 2
wp term meta update 47 order 3

Gerçek Dünya Senaryoları

Senaryo 1: E-ticaret Migrasyonu Sonrası Kategori Onarımı

Farklı bir platformdan WooCommerce’e geçtiniz ve import sonrası kategori hiyerarşisi bozuldu. Tüm kategoriler düz listede, parent-child ilişkileri yok:

#!/bin/bash
# migration-fix.sh
# Migrasyon sonrası kategori ilişkilerini onar

echo "Mevcut düz kategori listesi:"
wp term list product_cat --parent=0 --fields=term_id,name,count

# Bilinen hiyerarşiyi uygula
declare -A KATEGORILER=(
    ["elektronik"]="0"
    ["telefon-aksesuar"]="elektronik"
    ["bilgisayar"]="elektronik"
    ["tablet"]="elektronik"
    ["giyim"]="0"
    ["erkek-giyim"]="giyim"
    ["kadin-giyim"]="giyim"
)

for SLUG in "${!KATEGORILER[@]}"; do
    UST_SLUG="${KATEGORILER[$SLUG]}"
    
    KATEGORI_ID=$(wp term get product_cat "$SLUG" --by=slug --field=term_id 2>/dev/null)
    
    if [ -z "$KATEGORI_ID" ]; then
        echo "Atlandı (bulunamadı): $SLUG"
        continue
    fi
    
    if [ "$UST_SLUG" = "0" ]; then
        wp term update product_cat "$KATEGORI_ID" --parent=0
        echo "Kök kategori ayarlandı: $SLUG"
    else
        UST_ID=$(wp term get product_cat "$UST_SLUG" --by=slug --field=term_id 2>/dev/null)
        
        if [ -n "$UST_ID" ]; then
            wp term update product_cat "$KATEGORI_ID" --parent="$UST_ID"
            echo "İlişki kuruldu: $SLUG -> $UST_SLUG (ID: $UST_ID)"
        else
            echo "HATA: Üst kategori bulunamadı: $UST_SLUG"
        fi
    fi
done

echo "Migrasyon onarımı tamamlandı."

Senaryo 2: Mevsimsel Kategori Yönetimi

Her sezon kategorileri aktif/pasif yapmak yerine, sadece ürün sayısını kontrol edip boş kategorileri raporlayan script:

#!/bin/bash
# empty-categories.sh
# Ürün içermeyen kategorileri raporla ve opsiyonel olarak sil

echo "Ürün içermeyen kategoriler:"
echo "==========================="

BOS_SAYAC=0

wp term list product_cat --fields=term_id,name,slug,parent,count --format=csv 
    --quiet | tail -n +2 | while IFS=',' read -r id name slug parent count; do
    
    if [ "$count" -eq 0 ]; then
        PARENT_NAME=""
        if [ "$parent" -ne 0 ]; then
            PARENT_NAME=$(wp term get product_cat "$parent" --field=name 2>/dev/null)
        fi
        
        echo "- $name (Slug: $slug, Üst: ${PARENT_NAME:-'Kök Kategori'}, ID: $id)"
        BOS_SAYAC=$((BOS_SAYAC + 1))
    fi
done

echo ""
echo "Silmek istediğiniz kategori ID'sini girin (0 = çıkış):"
read -r SILINECEK_ID

if [ "$SILINECEK_ID" -gt 0 ]; then
    wp term delete product_cat "$SILINECEK_ID"
    echo "Kategori silindi: $SILINECEK_ID"
fi

Senaryo 3: Kategori SEO Denetimi

Açıklaması olmayan kategorileri tespit etme:

#!/bin/bash
# seo-audit.sh
# Eksik SEO bilgilerini olan kategorileri raporla

echo "SEO Denetim Raporu"
echo "=================="
echo ""
echo "Açıklaması olmayan kategoriler:"

wp term list product_cat 
    --fields=term_id,name,slug,description 
    --format=csv 
    --quiet | tail -n +2 | while IFS=',' read -r id name slug description; do
    
    if [ -z "$description" ]; then
        echo "  - $name (Slug: /$slug/, ID: $id)"
    fi
done

echo ""
echo "Kısa açıklamaya sahip kategoriler (50 karakter altı):"

wp term list product_cat 
    --fields=term_id,name,description 
    --format=csv 
    --quiet | tail -n +2 | while IFS=',' read -r id name description; do
    
    DESC_LEN=${#description}
    if [ "$DESC_LEN" -gt 0 ] && [ "$DESC_LEN" -lt 50 ]; then
        echo "  - $name: '$description' ($DESC_LEN karakter)"
    fi
done

Yedekleme ve Geri Yükleme

Kategori yapısında büyük değişiklik yapmadan önce mutlaka yedek alın:

#!/bin/bash
# backup-categories.sh

BACKUP_FILE="kategori_yedek_$(date +%Y%m%d_%H%M%S).json"

wp term list product_cat 
    --fields=term_id,name,slug,parent,description,count 
    --format=json > "$BACKUP_FILE"

echo "Yedek alındı: $BACKUP_FILE"
echo "Toplam kategori sayısı: $(wp term list product_cat --format=count)"

# Term meta bilgilerini de yedekle
META_BACKUP="kategori_meta_yedek_$(date +%Y%m%d_%H%M%S).sql"
wp db export --tables=$(wp db tables 'wp_termmeta' --format=csv) "$META_BACKUP"
echo "Meta yedek alındı: $META_BACKUP"

Performans İpuçları

WooCommerce kategori işlemlerinde dikkat etmeniz gereken birkaç nokta var:

  • Cache temizleme: Toplu işlem sonrası mutlaka cache’i temizleyin
  • Term count güncelleme: Çok sayıda değişiklik sonrası term sayılarını yenileyin
  • Transient temizleme: WooCommerce kendi cache’ini transient ile tutar
# İşlemler bittikten sonra çalıştırın
wp cache flush
wp rewrite flush
wp transient delete --all

# WooCommerce term count'larını yenile
wp term recount product_cat

# Object cache varsa (Redis/Memcached)
wp cache flush --user=www-data

Kategori Silme İşlemleri

Kategori silerken dikkatli olun, alt kategorileri olan bir kategoriyi silmek onları yetim bırakır:

# Güvenli silme: Önce alt kategori var mı kontrol et
KATEGORI_ID=45
ALT_KATEGORI_SAYISI=$(wp term list product_cat --parent=$KATEGORI_ID --format=count)

if [ "$ALT_KATEGORI_SAYISI" -gt 0 ]; then
    echo "UYARI: Bu kategorinin $ALT_KATEGORI_SAYISI alt kategorisi var!"
    echo "Önce alt kategorileri taşıyın veya silin."
else
    wp term delete product_cat $KATEGORI_ID
    echo "Kategori silindi."
fi

Sonuç

WP-CLI ile WooCommerce kategori yönetimi, admin panelinde saatlerce harcayacağınız işleri dakikalara indiriyor. Özellikle migrasyon süreçlerinde, toplu güncellemelerde ve düzenli bakım scriptlerinde bu yaklaşım hem hız hem de güvenilirlik açısından çok değerli.

Pratik olarak şunları aklınızda tutun: Her büyük işlemden önce yedek alın, script’lerinizi önce test ortamında çalıştırın, ve işlem sonrasında mutlaka cache temizleme ile term recount adımlarını uygulayın. --dry-run benzeri bir test modu eklemek istiyorsanız, silme ve güncelleme komutlarını sadece echo ile yazdıran bir DRY_RUN=true değişkeni koymanız yeterli.

Zaman içinde bu script’lerin bir kütüphanesini oluşturduğunuzda, yeni bir WooCommerce kurulumunu ya da büyük bir yeniden yapılandırmayı birkaç komutla halledebilir hale geliyorsunuz. Terminal sevmeyenler için admin paneli varken neden zahmet çekesiniz diye sorabilirsiniz, ama 500 kategorili bir mağazayı yönettiğinizde cevabı kendiniz bulacaksınız.

Bir yanıt yazın

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