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önetirwp 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:
--quietparametresi: 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ırwp 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 deletekomutlarıyla kategori ve etiket CRUD işlemleri- WooCommerce
product_catveproduct_tagyö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.
