WP CLI ile WooCommerce Ürün Kategorisi Yönetimi

WooCommerce mağazanızda yüzlerce ürün kategorisi varsa ve bunları tek tek yönetmek sizi yoruyorsa, WP-CLI’nin wp wc product_cat komutu tam aradığınız şey. Bu yazıda, ürün kategorisi yönetiminin her aşamasını WP-CLI ile nasıl halledebileceğinizi, gerçek dünya senaryolarıyla birlikte ele alacağız.

WP-CLI ve WooCommerce Entegrasyonu

WP-CLI, WordPress’in komut satırı arayüzüdür ve WooCommerce eklentisi kurulu olduğunda wp wc alt komutları da otomatik olarak kullanılabilir hale gelir. product_cat ise bu komutların içinde ürün kategorilerini yönetmek için kullanılan özel bir nesne tipidir.

Başlamadan önce birkaç ön koşulu kontrol etmek gerekiyor. WooCommerce eklentisinin aktif olması, WP-CLI’nin 2.x veya üzeri bir sürümde olması ve WooCommerce REST API’nin etkin olması şart. Ayrıca komutları çalıştıracak kullanıcının yeterli yetkiye sahip olması gerekiyor.

# WP-CLI versiyonunu kontrol et
wp --version

# WooCommerce eklentisinin aktif olduğunu doğrula
wp plugin status woocommerce

# Kullanılabilir wc komutlarını listele
wp wc --help

wp wc product_cat komutunun çalışabilmesi için bir kullanıcı bağlamına ihtiyaç var. Çoğu komutta --user=admin veya yetkili bir kullanıcı ID’si belirtmeniz gerekecek. Bu, WooCommerce REST API’nin kimlik doğrulama gereksinimininden kaynaklanıyor.

Temel Komut Yapısı

wp wc product_cat komutu dört temel alt komut üzerine kurulu:

  • list: Mevcut kategorileri listeler
  • get: Belirli bir kategoriyi görüntüler
  • create: Yeni kategori oluşturur
  • update: Mevcut kategoriyi günceller
  • delete: Kategoriyi siler

Her komutun ortak parametreleri şunlar:

  • –user=: Komutu çalıştıracak kullanıcı, genellikle admin
  • –format=: Çıktı formatı, json, csv veya table olabilir
  • –porcelain: Sadece ID döndürür, script yazarken çok işe yarar

Kategorileri Listeleme

Mağazanızdaki mevcut kategorilerin envanterini çıkarmak istediğinizde list alt komutunu kullanırsınız. Özellikle büyük mağazalarda hangi kategorilerin var olduğunu görmek için bu komut çok değerli.

# Tüm ürün kategorilerini listele
wp wc product_cat list --user=admin

# JSON formatında listele (script'lerde kullanım için ideal)
wp wc product_cat list --user=admin --format=json

# Sadece ID ve isim kolonlarını göster
wp wc product_cat list --user=admin --fields=id,name,slug,count

# Belirli bir üst kategorinin alt kategorilerini listele
wp wc product_cat list --user=admin --parent=15

# Tüm kategorileri CSV olarak dışa aktar
wp wc product_cat list --user=admin --format=csv > kategoriler.csv

--fields parametresi ile hangi alanları görmek istediğinizi belirleyebilirsiniz. Sık kullanılan alanlar şunlar:

  • id: Kategori ID’si
  • name: Kategori adı
  • slug: URL dostu isim
  • parent: Üst kategori ID’si
  • description: Açıklama
  • count: Bu kategorideki ürün sayısı
  • image: Kategori görseli bilgisi

Tek Kategori Görüntüleme

Belirli bir kategorinin detaylarına bakmak istediğinizde get komutunu kullanırsınız. Özellikle bir kategoriyi güncellemeden önce mevcut durumunu görmek için faydalı.

# ID'si 23 olan kategoriyi görüntüle
wp wc product_cat get 23 --user=admin

# JSON formatında detaylı görüntüle
wp wc product_cat get 23 --user=admin --format=json

# Sadece belirli alanları görüntüle
wp wc product_cat get 23 --user=admin --fields=id,name,description,count

Kategori Oluşturma

Yeni bir ürün kategorisi oluşturmak için create alt komutunu kullanırsınız. Bu komut, WooCommerce’in REST API’si üzerinden çalıştığı için tüm kategori özelliklerini destekler.

# Basit bir kategori oluştur
wp wc product_cat create --name="Elektronik" --user=admin

# Slug ve açıklama ile birlikte oluştur
wp wc product_cat create 
  --name="Bilgisayarlar" 
  --slug="bilgisayarlar" 
  --description="Laptop, masaüstü ve aksesuarlar" 
  --user=admin

# Alt kategori oluştur (parent ID'si 15 olan kategorinin altına)
wp wc product_cat create 
  --name="Laptoplar" 
  --slug="laptoplar" 
  --parent=15 
  --description="Taşınabilir bilgisayarlar" 
  --user=admin

# Porcelain flag ile sadece yeni kategori ID'sini al
NEW_CAT_ID=$(wp wc product_cat create --name="Tabletler" --parent=15 --user=admin --porcelain)
echo "Yeni kategori ID: $NEW_CAT_ID"

create komutunun önemli parametreleri:

  • –name=: Kategori adı, zorunlu alan
  • –slug=: URL slug’ı, girilmezse isimden otomatik oluşturulur
  • –parent=: Üst kategori ID’si, 0 ise kök kategori olur
  • –description=: Kategori açıklaması
  • –display=: Görüntüleme tipi, default, products, subcategories, both olabilir
  • –image=: Kategori görseli, JSON formatında ID veya src içerir
  • –menu_order=: Menüdeki sıralama

Kategori Güncelleme

Mevcut bir kategoriyi güncellemek için update komutunu kullanırsınız. Komut sözdizimi create ile çok benzer, tek fark başa kategori ID’sini eklemeniz.

# Kategori adını güncelle
wp wc product_cat update 23 --name="Elektronik Ürünler" --user=admin

# Açıklama ekle veya güncelle
wp wc product_cat update 23 
  --description="Tüm elektronik ürünler burada" 
  --user=admin

# Bir kategoriyi başka bir üst kategoriye taşı
wp wc product_cat update 45 --parent=23 --user=admin

# Slug'ı güncelle
wp wc product_cat update 23 --slug="elektronik-urunler" --user=admin

# Menu sırasını güncelle
wp wc product_cat update 23 --menu_order=5 --user=admin

Kategori Silme

Bir kategoriyi silmek için delete komutunu kullanırsınız. Silme işlemi geri alınamaz, bu yüzden dikkatli olmak gerekiyor.

# Tek bir kategoriyi sil
wp wc product_cat delete 23 --user=admin

# Silme işlemini zorla (bazı durumlarda gerekebilir)
wp wc product_cat delete 23 --user=admin --force=true

Burada önemli bir nokta var: WooCommerce, içinde ürün bulunan bir kategoriyi sildiğinizde bu ürünleri otomatik olarak “Kategorisiz” grubuna taşır. Alt kategoriler de etkilenebilir, bu yüzden silmeden önce get komutuyla durumu kontrol edin.

Gerçek Dünya Senaryoları

Senaryo 1: Toplu Kategori İçe Aktarma

Diyelim ki bir CSV dosyasından yüzlerce kategori oluşturmanız gerekiyor. Excel’den veya başka bir sistemden aktarma yapıyorsunuz. Bunun için basit bir bash script yazabilirsiniz.

#!/bin/bash
# kategoriler.csv formatı: kategori_adi,slug,ust_kategori_id,aciklama

WP_USER="admin"
CSV_DOSYA="kategoriler.csv"

while IFS=, read -r ad slug ust_id aciklama; do
  # Başlık satırını atla
  [[ "$ad" == "kategori_adi" ]] && continue
  
  echo "Kategori oluşturuluyor: $ad"
  
  if [ "$ust_id" == "0" ] || [ -z "$ust_id" ]; then
    # Kök kategori
    wp wc product_cat create 
      --name="$ad" 
      --slug="$slug" 
      --description="$aciklama" 
      --user=$WP_USER 
      --porcelain
  else
    # Alt kategori
    wp wc product_cat create 
      --name="$ad" 
      --slug="$slug" 
      --parent="$ust_id" 
      --description="$aciklama" 
      --user=$WP_USER 
      --porcelain
  fi
  
  echo "Tamamlandi: $ad"
  sleep 0.5  # API'yi fazla yüklememek için kısa bekleme
done < "$CSV_DOSYA"

echo "Tüm kategoriler içe aktarıldı!"

Senaryo 2: Boş Kategorileri Temizleme

Zamanla mağazanızda içinde hiç ürün bulunmayan boş kategoriler birikmiş olabilir. Bunları toplu olarak temizlemek için şu script’i kullanabilirsiniz.

#!/bin/bash
# İçinde ürün bulunmayan kategorileri temizle

WP_USER="admin"
KORUNAN_KATEGORILER=(1 2 3)  # Silmek istemediğiniz kategori ID'leri

echo "Boş kategoriler aranıyor..."

# Tüm kategorileri JSON olarak al
KATEGORILER=$(wp wc product_cat list 
  --user=$WP_USER 
  --format=json 
  --fields=id,name,count)

# jq ile count=0 olanları filtrele
echo "$KATEGORILER" | jq -r '.[] | select(.count == 0) | "(.id) (.name)"' | while read -r id isim; do
  
  # Korunan kategorileri atla
  KORUNAN=false
  for korunan_id in "${KORUNAN_KATEGORILER[@]}"; do
    if [ "$id" == "$korunan_id" ]; then
      KORUNAN=true
      break
    fi
  done
  
  if [ "$KORUNAN" == "true" ]; then
    echo "Atlanıyor (korunan): $isim ($id)"
    continue
  fi
  
  echo "Siliniyor: $isim (ID: $id)"
  wp wc product_cat delete "$id" --user=$WP_USER --force=true
done

echo "Temizlik tamamlandı!"

Senaryo 3: Kategori Hiyerarşisi Oluşturma

Yeni bir mağaza kuruyorsunuz ve kategorilerin tüm hiyerarşisini tek seferde script ile oluşturmak istiyorsunuz. Bu yaklaşım özellikle staging’den production’a geçişte işe yarar.

#!/bin/bash
# Kategori hiyerarşisi oluştur

WP_USER="admin"

# Ana kategorileri oluştur
echo "Ana kategoriler oluşturuluyor..."

ELEKTRONIK_ID=$(wp wc product_cat create 
  --name="Elektronik" 
  --slug="elektronik" 
  --description="Tüm elektronik ürünler" 
  --user=$WP_USER 
  --porcelain)
echo "Elektronik ID: $ELEKTRONIK_ID"

GIYIM_ID=$(wp wc product_cat create 
  --name="Giyim" 
  --slug="giyim" 
  --description="Giyim ve aksesuar ürünleri" 
  --user=$WP_USER 
  --porcelain)
echo "Giyim ID: $GIYIM_ID"

EV_ID=$(wp wc product_cat create 
  --name="Ev ve Yaşam" 
  --slug="ev-ve-yasam" 
  --description="Ev dekorasyon ve yaşam ürünleri" 
  --user=$WP_USER 
  --porcelain)
echo "Ev ve Yaşam ID: $EV_ID"

# Elektronik alt kategorileri
echo "Elektronik alt kategorileri oluşturuluyor..."

wp wc product_cat create 
  --name="Telefonlar" 
  --slug="telefonlar" 
  --parent=$ELEKTRONIK_ID 
  --user=$WP_USER 
  --porcelain > /dev/null

wp wc product_cat create 
  --name="Bilgisayarlar" 
  --slug="bilgisayarlar" 
  --parent=$ELEKTRONIK_ID 
  --user=$WP_USER 
  --porcelain > /dev/null

wp wc product_cat create 
  --name="Tabletler" 
  --slug="tabletler" 
  --parent=$ELEKTRONIK_ID 
  --user=$WP_USER 
  --porcelain > /dev/null

# Giyim alt kategorileri
echo "Giyim alt kategorileri oluşturuluyor..."

wp wc product_cat create 
  --name="Erkek Giyim" 
  --slug="erkek-giyim" 
  --parent=$GIYIM_ID 
  --user=$WP_USER 
  --porcelain > /dev/null

wp wc product_cat create 
  --name="Kadın Giyim" 
  --slug="kadin-giyim" 
  --parent=$GIYIM_ID 
  --user=$WP_USER 
  --porcelain > /dev/null

echo "Kategori hiyerarşisi tamamlandı!"

# Son durumu kontrol et
wp wc product_cat list --user=$WP_USER --fields=id,name,parent,count

Senaryo 4: Kategorileri Başka Siteye Aktarma

Çok siteli yapılarda veya domain taşımalarında, bir sitedeki kategorileri olduğu gibi başka bir siteye kopyalamak gerekebilir.

#!/bin/bash
# Kategorileri bir siteden diğerine aktar

KAYNAK_PATH="/var/www/eski-site"
HEDEF_PATH="/var/www/yeni-site"
WP_USER="admin"

# Kaynaktan kategorileri JSON olarak al
echo "Kaynak siteden kategoriler alınıyor..."
wp --path=$KAYNAK_PATH wc product_cat list 
  --user=$WP_USER 
  --format=json 
  --fields=id,name,slug,parent,description,menu_order > /tmp/kategoriler.json

echo "Kategoriler /tmp/kategoriler.json dosyasına kaydedildi"

# Önce kök kategorileri oluştur (parent=0 olanlar)
echo "Kök kategoriler oluşturuluyor..."
cat /tmp/kategoriler.json | jq -r '.[] | select(.parent == 0) | "(.name)|(.slug)|(.description)"' | while IFS="|" read -r isim slug aciklama; do
  wp --path=$HEDEF_PATH wc product_cat create 
    --name="$isim" 
    --slug="$slug" 
    --description="$aciklama" 
    --user=$WP_USER 2>/dev/null
  echo "Oluşturuldu: $isim"
done

echo "Aktarım tamamlandı! Alt kategoriler için ID eşleştirmesi gerekebilir."

Sık Yapılan Hatalar ve Çözümleri

“Error: No WooCommerce product categories found” hatası genellikle kullanıcı yetkisi eksikliğinden kaynaklanır. --user parametresini mutlaka belirtin ve admin yetkisine sahip bir kullanıcı kullanın.

Slug çakışması sorunu: Aynı slug’a sahip iki kategori oluşturmaya çalıştığınızda WooCommerce otomatik olarak slug’a sayı ekler. Bunu önlemek için import öncesinde mevcut slug’ları kontrol edin.

# Mevcut slugları listele ve benzersizliği kontrol et
wp wc product_cat list --user=admin --fields=slug --format=csv | sort | uniq -d

Büyük mağazalarda performans sorunu: Çok sayıda kategori işlemi yapıyorsanız, her komut arasına sleep 0.5 veya sleep 1 eklemek API’yi aşırı yüklemekten korur. Özellikle shared hosting ortamlarında bu kritik.

Parent ID hatası: Alt kategori oluştururken parent ID’nin doğru olduğundan emin olun. Yanlış bir parent ID sessizce hata vermeyebilir, bunun yerine kök kategori oluşturabilir.

# Parent kategorinin varlığını kontrol et
wp wc product_cat get 15 --user=admin --fields=id,name

Otomasyon ve Cron Entegrasyonu

Kategori yönetimini otomatize etmek istiyorsanız, WP-CLI komutlarını cron job’larla entegre edebilirsiniz. Örneğin her ay belirli bir tarihte sezonluk kategorileri aktif etmek veya pasif hale getirmek için:

# /etc/cron.d/woocommerce-kategoriler
# Her Pazartesi sabahı 02:00'de boş kategorileri logla
0 2 * * 1 www-data /usr/local/bin/wp --path=/var/www/html wc product_cat list 
  --user=admin 
  --format=csv 
  --fields=id,name,count 
  >> /var/log/woocommerce/kategori-raporu.log 2>&1

WP-CLI komutlarını cron ile kullanırken dikkat edilmesi gerekenler:

  • Tam path kullanın: wp yerine /usr/local/bin/wp gibi tam yolu belirtin
  • –path parametresi: WordPress kurulum dizinini açıkça belirtin
  • –allow-root: Root olarak çalıştırıyorsanız bu flag gerekebilir, ama önerilmez
  • Log yönlendirmesi: Çıktıları mutlaka log dosyasına yönlendirin

Kategori Görsellerini Yönetme

WooCommerce kategori görselleri, wp wc product_cat komutu üzerinden de yönetilebilir. Görsel atamak için önce medyayı WordPress’e yüklemeniz gerekiyor.

# Önce görseli medya kütüphanesine yükle
GORSEL_ID=$(wp media import /tmp/elektronik-banner.jpg 
  --title="Elektronik Kategori Görseli" 
  --porcelain)

# Sonra kategori görselini güncelle
wp wc product_cat update 23 
  --image='{"id": '$GORSEL_ID'}' 
  --user=admin

echo "Kategori görseli güncellendi. Görsel ID: $GORSEL_ID"

Debug Modu ve Sorun Giderme

Bir şeyler ters gittiğinde WP-CLI’nin debug modunu kullanmak çok yardımcı oluyor.

# Debug modunda çalıştır
wp wc product_cat list --user=admin --debug

# Sadece WC ile ilgili debug mesajlarını göster
wp wc product_cat create --name="Test" --user=admin --debug=wc

# HTTP request detaylarını gör
wp wc product_cat get 23 --user=admin --debug=http

--debug flag’i API çağrılarının ne döndürdüğünü, hangi endpoint’in kullanıldığını ve olası hataları detaylıca gösterir. Özellikle beklenmedik davranışları analiz ederken vazgeçilmez.

Sonuç

wp wc product_cat komutları, WooCommerce mağazanızdaki kategori yönetimini tamamen farklı bir seviyeye taşıyor. Elle yapılan işlemleri otomatize etmek, büyük mağazalarda toplu değişiklikler yapmak veya deployment süreçlerine kategori yönetimini dahil etmek artık çok daha kolay.

Özellikle vurgulamak istediğim nokta şu: Bu komutları script’lerle birleştirdiğinizde gerçek güçlerini görüyorsunuz. Tek tek komut çalıştırmak faydalı, ama asıl değer otomasyonda. Bir kere yazıp yüzlerce kez çalıştırabileceğiniz script’ler, uzun vadede çok ciddi zaman tasarrufu sağlıyor.

Prodüksiyon ortamında delete ve update komutlarını kullanmadan önce her zaman bir yedek alın. wp db export ile veritabanını yedeklemek sadece birkaç saniye alıyor ama sizi büyük bir felaketten kurtarabilir. WooCommerce kategori değişikliklerinin ürün görünürlüğünü ve SEO’yu doğrudan etkilediğini unutmayın, bu yüzden özellikle slug değişikliklerinde dikkatli olun.

Bir yanıt yazın

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