WP CLI ile WordPress Kategori ve Etiket Yönetimi: wp taxonomy Rehberi

WordPress sitelerini yönetirken en çok zaman kaybettiren konuların başında içerik organizasyonu gelir. Binlerce ürün veya yazıyla uğraşırken kategori ve etiket düzenini elle yapmak hem yorucu hem de hata yaratmaya müsait bir süreç. İşte tam bu noktada WP CLI devreye giriyor ve wp taxonomy komutuyla bu süreci tamamen terminalden yönetebilir hale getiriyor. Bu yazıda gerçek dünya senaryolarıyla WP CLI üzerinden kategori ve etiket yönetimini tüm detaylarıyla ele alacağız.

WP Taxonomy Nedir, Ne İşe Yarar?

WordPress’te taxonomy (taksonomi), içerikleri sınıflandırmak için kullanılan yapının genel adıdır. Kategori ve etiket, WordPress’in varsayılan taksonomileridir. Bunların yanı sıra WooCommerce ürün kategorileri (product_cat), ürün etiketleri (product_tag) ve özel attribute’lar da birer taksonomidur.

WP CLI ile taxonomy yönetimi iki ana komut grubu üzerinden yürür:

  • wp term – Taksonomi terimlerini (kategori, etiket vb.) yönetir
  • wp taxonomy – Kayıtlı taksonomi tiplerini listeler ve bilgi verir

Bu iki komut grubunu birlikte kullanarak oldukça güçlü otomasyon senaryoları yazabilirsiniz.

Başlamadan Önce: Ortam Kontrolü

WP CLI’nin kurulu ve çalışır durumda olduğundan emin olalım:

wp --info
wp core version
wp taxonomy list

wp taxonomy list komutu sitedeki tüm kayıtlı taksonomi tiplerini listeler. Bir WooCommerce sitesinde çıktı şuna benzer:

wp taxonomy list --fields=name,label,public,hierarchical

Bu komut size category, post_tag, product_cat, product_tag, pa_renk gibi taksonomileri listeler. hierarchical alanı kategorilerin (hiyerarşik) ve etiketlerin (hiyerarşik olmayan) farkını gösterir.

Kategorilerle Çalışmak

Kategori Listeleme ve Sorgulama

Mevcut kategorileri listelemek için wp term list komutunu kullanıyoruz:

# Tüm kategorileri listele
wp term list category --fields=term_id,name,slug,parent,count

# Sadece ana kategorileri göster (parent=0)
wp term list category --parent=0 --fields=term_id,name,slug,count

# Belirli bir üst kategorinin alt kategorilerini göster
wp term list category --parent=5 --fields=term_id,name,slug

count alanı o kategoride kaç yazı olduğunu gösterir. Büyük bir sitede hangi kategorilerin aktif hangilerinin boş olduğunu bulmak için bu oldukça işlevsel.

Kategori Oluşturma

Yeni kategori oluşturmak son derece basit:

# Basit kategori oluşturma
wp term create category "Teknoloji" --slug="teknoloji" --description="Teknoloji haberleri ve incelemeleri"

# Alt kategori oluşturma (parent ID belirtilmeli)
wp term create category "Mobil Cihazlar" --slug="mobil-cihazlar" --parent=12

# Oluşturma sonrası term ID'yi al
TERM_ID=$(wp term create category "Yapay Zeka" --slug="yapay-zeka" --porcelain)
echo "Oluşturulan kategori ID: $TERM_ID"

--porcelain parametresi sadece oluşturulan terimin ID’sini döndürür, bu da bash scriptlerinde değişkene atama için çok kullanışlıdır.

Kategori Güncelleme ve Düzenleme

# Kategori adını güncelle
wp term update category 15 --name="Yapay Zeka ve ML"

# Slug değiştir
wp term update category 15 --slug="yapay-zeka-ml"

# Açıklama ekle veya güncelle
wp term update category 15 --description="Makine öğrenimi, derin öğrenme ve yapay zeka haberleri"

# Kategoriyi başka bir üst kategoriye taşı
wp term update category 15 --parent=8

Kategori Silme

# Tek kategori silme
wp term delete category 15

# Birden fazla kategori silme
wp term delete category 15 20 25

# Boş kategorileri toplu silme (0 yazı içerenleri)
wp term list category --count=0 --fields=term_id --format=ids | xargs wp term delete category

Etiketlerle Çalışmak

Etiketler kategorilerle aynı komut yapısını kullanır, tek fark taksonomi adının post_tag olmasıdır.

# Tüm etiketleri listele
wp term list post_tag --fields=term_id,name,slug,count --orderby=count --order=DESC

# Yeni etiket oluştur
wp term create post_tag "docker" --slug="docker"
wp term create post_tag "kubernetes" --slug="kubernetes"

# Etiket güncelle
wp term update post_tag 45 --name="Docker Container"

# Etiket sil
wp term delete post_tag 45

Gerçek Dünya Senaryosu 1: Toplu Kategori Aktarımı

Diyelim ki bir müşterinin sitesini yeniden yapılandırıyorsunuz. Eski yapıdan 50 kategori var ve bunların hepsini yeni bir kategori hiyerarşisine taşımanız gerekiyor. Elle yapmak yerine bir CSV dosyasından toplu aktarım yapabilirsiniz.

kategoriler.csv dosyası şu formatta olsun:

ad,slug,ust_kategori_slug,aciklama
Elektronik,elektronik,,Elektronik ürünler
Telefon,telefon,elektronik,Akıllı telefonlar
Laptop,laptop,elektronik,Dizüstü bilgisayarlar
Giyim,giyim,,Giyim ürünleri

Bu dosyayı işlemek için bir bash script yazalım:

#!/bin/bash
# toplu_kategori_olustur.sh

CSV_DOSYASI="kategoriler.csv"
SITE_YOLU="/var/www/html/wordpress"

# Başlık satırını atla, CSV'yi işle
tail -n +2 "$CSV_DOSYASI" | while IFS=',' read -r ad slug ust_slug aciklama; do
    
    # Üst kategori slug'ı varsa ID'sini bul
    if [ -n "$ust_slug" ]; then
        UST_ID=$(wp term list category --slug="$ust_slug" --field=term_id --path="$SITE_YOLU")
        if [ -z "$UST_ID" ]; then
            echo "UYARI: Üst kategori bulunamadı: $ust_slug"
            continue
        fi
        YENI_ID=$(wp term create category "$ad" --slug="$slug" --description="$aciklama" --parent="$UST_ID" --porcelain --path="$SITE_YOLU")
    else
        YENI_ID=$(wp term create category "$ad" --slug="$slug" --description="$aciklama" --porcelain --path="$SITE_YOLU")
    fi
    
    echo "Oluşturuldu: $ad (ID: $YENI_ID)"
done

echo "İşlem tamamlandı."

Gerçek Dünya Senaryosu 2: Yazılara Toplu Kategori Atama

Yeni bir kategori oluşturdunuz ve belirli anahtar kelimeleri içeren yazıları bu kategoriye taşımak istiyorsunuz. Örneğin başlığında “docker” geçen tüm yazılara Docker kategorisi ekleyelim:

#!/bin/bash
# docker_kategori_ata.sh

# Docker kategorisinin ID'sini al veya oluştur
DOCKER_CAT=$(wp term list category --slug="docker" --field=term_id)
if [ -z "$DOCKER_CAT" ]; then
    DOCKER_CAT=$(wp term create category "Docker" --slug="docker" --porcelain)
    echo "Docker kategorisi oluşturuldu: ID $DOCKER_CAT"
fi

# Başlığında docker geçen yazıların ID'lerini al
POST_IDS=$(wp post list --post_type=post --search="docker" --field=ID --format=ids)

if [ -z "$POST_IDS" ]; then
    echo "Hiç yazı bulunamadı."
    exit 0
fi

# Her yazıya kategoriyi ata
for POST_ID in $POST_IDS; do
    wp post term add $POST_ID category $DOCKER_CAT
    BASLIK=$(wp post get $POST_ID --field=post_title)
    echo "Kategori eklendi: '$BASLIK' (ID: $POST_ID)"
done

echo "Toplam işlenen yazı: $(echo $POST_IDS | wc -w)"

WooCommerce Ürün Kategorileri Yönetimi

WooCommerce sitelerinde ürün kategorileri product_cat taksonomisi ile yönetilir. Binlerce ürün olan bir e-ticaret sitesinde bu işlemler kritik önem taşır.

# WooCommerce ürün kategorilerini listele
wp term list product_cat --fields=term_id,name,slug,parent,count --orderby=name

# Yeni ürün kategorisi oluştur
wp term create product_cat "Spor Ekipmanları" --slug="spor-ekipmanlari"

# WooCommerce kategori thumbnail'i (meta ile) güncelle
wp term meta set 25 thumbnail_id 150

# Kategori display type ayarla (products, subcategories, both)
wp term meta set 25 display_type "products"

# Ürün kategorisinin öne çıkan ürününü ayarla
wp term meta set 25 product_cat_image 150

WooCommerce Ürün Etiketleri

# Ürün etiketlerini listele
wp term list product_tag --fields=term_id,name,slug,count

# Toplu ürün etiketi oluşturma
for ETIKET in "organik" "glutensiz" "vegan" "dondurulmuş"; do
    wp term create product_tag "$ETIKET" --slug="$ETIKET"
    echo "Etiket oluşturuldu: $ETIKET"
done

Gerçek Dünya Senaryosu 3: Boş ve Gereksiz Terimleri Temizleme

Uzun süredir yönetilen sitelerde zamanla yüzlerce kullanılmayan etiket birikir. Bu temizleme işlemi SEO açısından da önemlidir:

#!/bin/bash
# etiket_temizle.sh
# Hiç yazıyla ilişkilendirilmemiş etiketleri siler

echo "Kullanılmayan etiketler aranıyor..."

# Count=0 olan tüm etiket ID'lerini al
BOSE_ETIKETLER=$(wp term list post_tag --count=0 --format=ids --fields=term_id)

if [ -z "$BOSE_ETIKETLER" ]; then
    echo "Silinecek boş etiket bulunamadı."
    exit 0
fi

SAYI=$(echo $BOSE_ETIKETLER | tr ' ' 'n' | wc -l)
echo "Bulunan boş etiket sayısı: $SAYI"

# Onay iste
read -p "Bu etiketleri silmek istiyor musunuz? (e/h): " ONAY
if [ "$ONAY" != "e" ]; then
    echo "İşlem iptal edildi."
    exit 0
fi

# Silme işlemi
echo $BOSE_ETIKETLER | xargs wp term delete post_tag

echo "Temizleme tamamlandı. $SAYI etiket silindi."

Term Meta Yönetimi

WordPress 4.4’ten itibaren term meta desteği geldi. Bu özellik özellikle WooCommerce ve özel tema geliştirmede çok kullanılıyor.

# Term meta ekle
wp term meta add 15 "ozel_icon" "fa-laptop"
wp term meta add 15 "banner_renk" "#ff6600"

# Term meta güncelle
wp term meta update 15 "ozel_icon" "fa-mobile"

# Term meta oku
wp term meta get 15 "ozel_icon"

# Tüm meta değerlerini listele
wp term meta list 15

# Term meta sil
wp term meta delete 15 "banner_renk"

Kategori ve Etiket Birleştirme

İki kategoriyi birleştirmek WP CLI’de doğrudan bir komut olmasa da şu yaklaşımla yapılabilir:

#!/bin/bash
# kategori_birlestir.sh
# Kaynak kategorideki tüm yazıları hedef kategoriye taşır

KAYNAK_ID=45   # Silinecek kategori
HEDEF_ID=12    # Kalacak kategori

echo "Yazılar taşınıyor: Kategori $KAYNAK_ID -> $HEDEF_ID"

# Kaynak kategorideki tüm yazı ID'lerini al
POST_IDS=$(wp post list --category=$KAYNAK_ID --field=ID --format=ids)

if [ -z "$POST_IDS" ]; then
    echo "Kaynak kategoride yazı bulunamadı."
else
    for POST_ID in $POST_IDS; do
        # Hedef kategoriyi ekle
        wp post term add $POST_ID category $HEDEF_ID
        # Kaynak kategoriyi kaldır
        wp post term remove $POST_ID category $KAYNAK_ID
        echo "Yazı $POST_ID taşındı."
    done
fi

# Kaynak kategoriyi sil
wp term delete category $KAYNAK_ID
echo "Kaynak kategori silindi. Birleştirme tamamlandı."

Çok Siteli (Multisite) WordPress’te Taxonomy Yönetimi

WordPress multisite kurulumlarında her site için --url parametresi kullanılır:

# Alt site 1 için kategorileri listele
wp term list category --url=site1.example.com --fields=term_id,name,count

# Tüm alt sitelere aynı kategoriyi ekle
wp site list --field=url | while read SITE_URL; do
    wp term create category "Duyurular" --slug="duyurular" --url="$SITE_URL"
    echo "$SITE_URL - Duyurular kategorisi oluşturuldu"
done

JSON ile Toplu Import/Export

Taxonomy verilerini JSON formatında export edip başka bir siteye import etmek için:

# Kategorileri JSON olarak dışa aktar
wp term list category 
  --fields=term_id,name,slug,parent,description,count 
  --format=json > kategoriler_yedek.json

# JSON'dan oluşturma (jq gerekli)
cat kategoriler_yedek.json | jq -c '.[]' | while read SATIR; do
    AD=$(echo $SATIR | jq -r '.name')
    SLUG=$(echo $SATIR | jq -r '.slug')
    ACIKLAMA=$(echo $SATIR | jq -r '.description')
    
    wp term create category "$AD" 
      --slug="$SLUG" 
      --description="$ACIKLAMA" 2>/dev/null || echo "Zaten mevcut: $AD"
done

Performans İpuçları

Büyük sitelerde taxonomy işlemleri bazen yavaş çalışabilir. Birkaç pratik ipucu:

  • --quiet parametresi: Gereksiz çıktıları bastırır, toplu işlemlerde hız kazandırır
  • --format=ids: Sadece ID döndürür, parse işlemini hızlandırır
  • --fields: Sadece ihtiyaç duyulan alanları çeker, sorgu süresini kısaltır
  • wp cache flush: Taxonomy işlemlerinden sonra önbelleği temizleyin
# Hızlı toplu işlem örneği
wp term list category --format=ids --quiet | 
  xargs -P 4 -I {} wp term get category {} --field=name --quiet

Taxonomy URL Yapısı ve Yeniden Yazma

Kategori slug’larını değiştirdikten sonra permalink yapısını yenilemek kritik öneme sahiptir:

# Permalink yapısını yenile
wp rewrite flush

# Rewrite kurallarını listele (kontrol için)
wp rewrite list --fields=match,query,source

# Kategori base'ini kontrol et
wp option get category_base
wp option set category_base "konu"

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

Duplicate slug hatası: Aynı slug’a sahip terim oluşturmaya çalışırken hata alırsınız:

# Slug'ın mevcut olup olmadığını kontrol et
MEVCUT=$(wp term list category --slug="teknoloji" --field=term_id)
if [ -z "$MEVCUT" ]; then
    wp term create category "Teknoloji" --slug="teknoloji"
else
    echo "Bu slug zaten kullanımda: ID $MEVCUT"
fi

Parent ID bulunamama hatası: Üst kategori oluşturulmadan alt kategori oluşturmaya çalışmak:

# Önce üst kategoriyi oluştur, sonra alt kategoriyi
UST_ID=$(wp term create category "Ana Kategori" --slug="ana-kategori" --porcelain)
ALT_ID=$(wp term create category "Alt Kategori" --slug="alt-kategori" --parent=$UST_ID --porcelain)
echo "Hiyerarşi oluşturuldu: $UST_ID -> $ALT_ID"

Monitoring ve Raporlama

Büyük sitelerde taxonomy sağlığını düzenli kontrol etmek iyi bir alışkanlık:

#!/bin/bash
# taxonomy_rapor.sh

echo "=== TAXONOMY DURUM RAPORU ==="
echo "Tarih: $(date)"
echo ""

echo "--- Kategori Özeti ---"
TOPLAM_KAT=$(wp term list category --format=count)
BOS_KAT=$(wp term list category --count=0 --format=count)
echo "Toplam kategori: $TOPLAM_KAT"
echo "Boş kategori: $BOS_KAT"

echo ""
echo "--- Etiket Özeti ---"
TOPLAM_ETIKET=$(wp term list post_tag --format=count)
BOS_ETIKET=$(wp term list post_tag --count=0 --format=count)
echo "Toplam etiket: $TOPLAM_ETIKET"
echo "Kullanılmayan etiket: $BOS_ETIKET"

echo ""
echo "--- En Çok Kullanılan Kategoriler (Top 5) ---"
wp term list category --orderby=count --order=DESC --fields=name,count --format=table | head -7

echo ""
echo "=== RAPOR SONU ==="

Sonuç

WP CLI ile taxonomy yönetimi, WordPress sitelerinin bakımını ve içerik organizasyonunu dramatik biçimde kolaylaştırır. Özellikle çok sayıda yazı veya ürün barındıran sitelerde elle yapılan işlemlerin yerini alan bu otomasyon scriptleri hem zaman kazandırır hem de insan kaynaklı hataların önüne geçer.

Bu yazıda ele aldığımız temel konuları özetleyecek olursak:

  • wp term list, wp term create, wp term update, wp term delete komutlarıyla kategori ve etiket CRUD işlemleri
  • WooCommerce product_cat ve product_tag yönetimi
  • CSV ve JSON üzerinden toplu aktarım scriptleri
  • Boş ve gereksiz terimlerin temizlenmesi
  • Term meta yönetimi
  • Multisite ortamlarında taxonomy işlemleri
  • Hata yönetimi ve önleyici kontroller

Buradaki script örneklerini doğrudan üretim ortamında kullanmadan önce mutlaka test ortamında denemenizi, önemli işlemler öncesinde veritabanı yedeği almanızı öneririm. WP CLI’nin gücü büyük, ama yanlış bir delete komutu da o oranda zararlı olabilir.

Bir yanıt yazın

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