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.
