WP CLI ile wp term Komutu: Terim Oluşturma ve Yönetimi

WordPress sitenizde onlarca, hatta yüzlerce kategori ve etiket yönetmek zorunda kaldıysanız, admin panelinden tek tek bu işlemleri yapmak ne kadar can sıkıcı olabiliyor iyi biliyorsunuzdur. WP-CLI’nin wp term komutu tam da bu noktada hayat kurtarıyor. Toplu terim oluşturma, güncelleme, silme ve listeleme işlemlerini terminal üzerinden saniyeler içinde halledebiliyorsunuz. Bu yazıda wp term komutunun tüm inceliklerini, gerçek dünya senaryolarıyla birlikte ele alacağız.

wp term Nedir ve Ne İşe Yarar?

WordPress’te “term” kavramı, herhangi bir taxonomy’ye ait sınıflandırma birimidir. Kategoriler, etiketler, WooCommerce ürün kategorileri, özel taxonomy’ler… bunların hepsi birer term’dir. wp term komutu bu terimleri komut satırından yönetmenizi sağlar.

Temel alt komutlar şunlardır:

  • wp term create: Yeni terim oluşturur
  • wp term get: Belirli bir terimin bilgilerini getirir
  • wp term list: Terimleri listeler
  • wp term update: Mevcut terimi günceller
  • wp term delete: Terimi siler
  • wp term meta: Terim meta verilerini yönetir
  • wp term recount: Post sayılarını yeniden hesaplar

Terim Oluşturma

Temel Kullanım

En basit haliyle bir kategori oluşturmak için:

wp term create category "Teknoloji" --slug=teknoloji --description="Teknoloji haberleri ve incelemeleri"

Bu komut çalıştığında WordPress, category taxonomy’si altında yeni bir terim oluşturur ve size terim ID’sini döndürür. --slug parametresi verilmezse WordPress otomatik bir slug üretir, ama özellikle Türkçe karakter içeren isimlerde slug’ın ne olacağı tahmin edilemeyebilir. Bu yüzden her zaman manuel belirtmek daha güvenli.

Hiyerarşik Terimler Oluşturma

Blog sitenizde “Yazılım” kategorisi altında “Frontend”, “Backend” ve “DevOps” alt kategorileri oluşturmanız gerektiğini düşünelim:

# Önce ana kategoriyi oluştur
wp term create category "Yazılım" --slug=yazilim
# Dönen ID'yi not al, diyelim ki 15 oldu

# Alt kategorileri oluştur
wp term create category "Frontend" --slug=frontend --parent=15
wp term create category "Backend" --slug=backend --parent=15
wp term create category "DevOps" --slug=devops --parent=15

--parent parametresi terim ID’si alır. Eğer parent’ın ID’sini bilmiyorsanız önce wp term list ile bulabilirsiniz.

Etiket Oluşturma

Etiketler (tags) hiyerarşik olmadığından --parent parametresi kullanılmaz:

wp term create post_tag "docker" --slug=docker --description="Docker container teknolojisi"
wp term create post_tag "kubernetes" --slug=kubernetes
wp term create post_tag "linux" --slug=linux

WooCommerce Ürün Kategorisi Oluşturma

WooCommerce kullananlar için bu komut özellikle güçlü. Bir e-ticaret sitesinde yüzlerce ürün kategorisi olabilir:

# Ana ürün kategorisi
wp term create product_cat "Elektronik" --slug=elektronik --description="Elektronik ürünler"

# Alt kategoriler
PARENT_ID=$(wp term list product_cat --name="Elektronik" --field=term_id)
wp term create product_cat "Telefon" --slug=telefon --parent=$PARENT_ID
wp term create product_cat "Laptop" --slug=laptop --parent=$PARENT_ID
wp term create product_cat "Tablet" --slug=tablet --parent=$PARENT_ID

Burada shell’in değişken özelliğini kullanarak ID’yi otomatik alıyoruz, böylece komutları birbirinden bağımsız çalıştırmak yerine bir akış haline getiriyoruz.

Terimleri Listeleme ve Sorgulama

wp term list Kullanımı

# Tüm kategorileri listele
wp term list category

# Belirli alanları göster
wp term list category --fields=term_id,name,slug,count

# Sadece üst seviye kategorileri listele
wp term list category --parent=0

# Belirli bir parent'ın alt terimlerini listele
wp term list category --parent=15

# Boş terimleri bul (post sayısı 0 olan)
wp term list category --hide_empty=false --fields=term_id,name,count

Çıktı Formatlarını Kullanma

WP-CLI’nin güçlü taraflarından biri farklı çıktı formatları sunmasıdır. Bunu script’lerde kullanmak işleri çok kolaylaştırır:

# JSON formatında al (script işleme için ideal)
wp term list category --format=json

# CSV olarak dışa aktar
wp term list category --format=csv > kategoriler.csv

# Sadece ID listesi al
wp term list category --field=term_id

# Sadece slug listesi
wp term list category --field=slug

Terim Bilgisi Almak

Belirli bir terimin detaylarına bakmak için:

# ID ile sorgula
wp term get category 15

# Belirli alanları getir
wp term get category 15 --field=name
wp term get category 15 --fields=name,slug,description,count

# Slug ile ID bul
wp term list category --slug=teknoloji --field=term_id

Terimleri Güncelleme

Temel Güncelleme İşlemleri

# İsim güncelle
wp term update category 15 --name="Yazılım Geliştirme"

# Slug güncelle
wp term update category 15 --slug=yazilim-gelistirme

# Açıklama ekle veya güncelle
wp term update category 15 --description="Yazılım geliştirme süreçleri, araçlar ve best practice'ler"

# Parent değiştir
wp term update category 20 --parent=15

Toplu Güncelleme Senaryosu

Diyelim ki tüm etiketlerin slug’larını küçük harfe çevirmek ve Türkçe karakterleri düzeltmek istiyorsunuz. Bunun için bir bash script yazabilirsiniz:

#!/bin/bash
# Tüm etiketlerin ID'lerini al ve her birini işle
wp term list post_tag --field=term_id --format=ids | tr ' ' 'n' | while read term_id; do
    current_name=$(wp term get post_tag $term_id --field=name)
    current_slug=$(wp term get post_tag $term_id --field=slug)
    echo "İşleniyor: $current_name (ID: $term_id, Slug: $current_slug)"
    # Slug'ı güncelle (örnek olarak mevcut adı küçük harfle yeniden yaz)
    new_slug=$(echo "$current_name" | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g')
    wp term update post_tag $term_id --slug="$new_slug"
done

Terimleri Silme

Tekil Silme

# ID ile sil
wp term delete category 15

# Birden fazla ID sil
wp term delete category 15 20 25

# Slug ile sil (önce ID bul, sonra sil)
TERM_ID=$(wp term list category --slug=eski-kategori --field=term_id)
wp term delete category $TERM_ID

Boş Terimleri Toplu Silme

Uzun süredir kullanılan sitelerde post içermeyen onlarca boş kategori veya etiket birikebilir. Bunları temizlemek için:

# Boş etiketleri bul ve sil
wp term list post_tag --hide_empty=true --count=0 --field=term_id | while read id; do
    wp term delete post_tag $id
done

# Daha temiz bir yöntem
wp term list post_tag --format=ids --count=0 | xargs -I{} wp term delete post_tag {}

Dikkat: Silme işlemi geri alınamaz. Önemli terimleri silmeden önce mutlaka bir yedek alın ya da en azından wp term list ile sileceklerinizi önce listeleyin.

Terim Meta Verileri

WordPress 4.4’ten itibaren terimler de meta veri depolayabiliyor. WooCommerce ürün kategorilerinde thumbnail image ID’si gibi bilgiler term meta olarak saklanır.

# Meta ekle
wp term meta add 15 "featured" "true"

# Meta oku
wp term meta get 15 "featured"

# Meta güncelle
wp term meta update 15 "featured" "false"

# Tüm meta verileri listele
wp term meta list 15

# Meta sil
wp term meta delete 15 "featured"

WooCommerce Kategori Thumbnail Ayarlama

WooCommerce’de ürün kategorilerine thumbnail (küçük resim) atamak için term meta kullanılır:

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

# Ürün kategorisine thumbnail ata
CATEGORY_ID=$(wp term list product_cat --slug=elektronik --field=term_id)
wp term meta update $CATEGORY_ID "thumbnail_id" $IMAGE_ID

echo "Kategori $CATEGORY_ID için görsel $IMAGE_ID atandı."

Post Sayılarını Yeniden Hesaplama

Büyük veri aktarımları, eklenti çakışmaları ya da doğrudan veritabanı müdahaleleri sonrasında terimlerin post sayıları yanlış olabilir. wp term recount bu sorunu çözer:

# Kategorilerin post sayısını yeniden hesapla
wp term recount category

# Etiketleri de dahil et
wp term recount post_tag

# WooCommerce ürün kategorilerini güncelle
wp term recount product_cat

# Tüm taxonomy'leri güncelle (dikkatli kullan, yavaş çalışabilir)
wp taxonomy list --field=name | while read tax; do
    echo "Yeniden sayılıyor: $tax"
    wp term recount $tax
done

Gerçek Dünya Senaryoları

Senaryo 1: İçe Aktarma Sonrası Kategori Yapısı Oluşturma

Bir müşterinin eski sitesinden yeni WordPress kurulumuna geçiş yapıyorsunuz ve kategori yapısını script ile oluşturmanız gerekiyor:

#!/bin/bash
# Kategori yapısını oluşturan script

echo "Ana kategoriler oluşturuluyor..."

# Ana kategoriler
HABER_ID=$(wp term create category "Haberler" --slug=haberler --porcelain)
ANALIZ_ID=$(wp term create category "Analizler" --slug=analizler --porcelain)
REHBER_ID=$(wp term create category "Rehberler" --slug=rehberler --porcelain)

echo "Haberler ID: $HABER_ID"
echo "Analizler ID: $ANALIZ_ID"
echo "Rehberler ID: $REHBER_ID"

echo "Alt kategoriler oluşturuluyor..."

# Haberler alt kategorileri
wp term create category "Teknoloji Haberleri" --slug=teknoloji-haberleri --parent=$HABER_ID
wp term create category "Dünya Haberleri" --slug=dunya-haberleri --parent=$HABER_ID
wp term create category "Spor Haberleri" --slug=spor-haberleri --parent=$HABER_ID

# Analizler alt kategorileri
wp term create category "Piyasa Analizi" --slug=piyasa-analizi --parent=$ANALIZ_ID
wp term create category "Teknoloji Analizi" --slug=teknoloji-analizi --parent=$ANALIZ_ID

echo "Tüm kategoriler başarıyla oluşturuldu!"
wp term list category --fields=term_id,name,parent,slug

--porcelain parametresi komutun sadece oluşturulan terimin ID’sini döndürmesini sağlar, bu da script’lerde değişkene atama yaparken çok kullanışlıdır.

Senaryo 2: WooCommerce Ürün Attribute Yönetimi

WooCommerce’de ürün attribute’larının terimleri de wp term ile yönetilir. Örneğin renk seçenekleri:

#!/bin/bash
# Ürün renk attribute'u için terimleri toplu oluştur

RENKLER=("Siyah:siyah" "Beyaz:beyaz" "Kırmızı:kirmizi" "Mavi:mavi" "Yeşil:yesil" "Sarı:sari" "Gri:gri")

for RENK in "${RENKLER[@]}"; do
    ISIM="${RENK%%:*}"
    SLUG="${RENK##*:}"
    echo "Renk oluşturuluyor: $ISIM ($SLUG)"
    wp term create pa_color "$ISIM" --slug="$SLUG"
done

echo "Renk terimleri oluşturuldu:"
wp term list pa_color --fields=term_id,name,slug

Senaryo 3: Yinelenen Terimleri Tespit Etme

Uzun süreli sitelerde bazen aynı anlama gelen terimler farklı şekillerde eklenmiş olabilir. Bunları tespit edip birleştirmek gerekebilir:

#!/bin/bash
# Benzer slug'lara sahip terimleri listele

echo "Mevcut tüm etiketler:"
wp term list post_tag --fields=term_id,name,slug,count --orderby=name --order=ASC

echo ""
echo "Post içermeyen etiketler:"
wp term list post_tag --fields=term_id,name,count --hide_empty=false --format=csv | awk -F',' '$3 == 0 {print $1, $2}'

Senaryo 4: Terim Birleştirme (Merge)

WP-CLI’de doğrudan bir “merge terms” komutu yok ama bu işlemi adım adım yapabilirsiniz. Diyelim “javascript” ve “js” etiketlerini birleştirmek istiyorsunuz:

#!/bin/bash
# "js" etiketindeki postları "javascript" etiketine taşı

OLD_TERM_SLUG="js"
NEW_TERM_SLUG="javascript"

# ID'leri al
OLD_ID=$(wp term list post_tag --slug=$OLD_TERM_SLUG --field=term_id)
NEW_ID=$(wp term list post_tag --slug=$NEW_TERM_SLUG --field=term_id)

echo "Eski terim ID: $OLD_ID, Yeni terim ID: $NEW_ID"

# Eski etiketle işaretlenmiş postları bul
POST_IDS=$(wp post list --post_status=publish --tag=$OLD_TERM_SLUG --field=ID --format=ids)

# Her post için yeni etiketi ekle
for POST_ID in $POST_IDS; do
    echo "Post $POST_ID işleniyor..."
    wp post term add $POST_ID post_tag $NEW_ID
    wp post term remove $POST_ID post_tag $OLD_ID
done

# Eski etiketi sil
wp term delete post_tag $OLD_ID
echo "Birleştirme tamamlandı!"

Performans İpuçları

Büyük sitelerle çalışırken wp term komutlarını daha verimli kullanmak için birkaç önerim var:

  • --quiet parametresi: Toplu işlemlerde gereksiz çıktıyı bastırır, işlemi hızlandırır.
  • --porcelain parametresi: Sadece oluşturulan nesnenin ID’sini döndürür, script’lerde kullanışlıdır.
  • --format=ids: Sadece ID listesi alır, metin işleme için idealdir.
  • Çok sayıda terim oluşturacaksanız döngü yerine toplu işlem yapan bir SQL script’i veya CSV import eklentisi kullanmayı değerlendirin.
  • wp term recount yoğun saatlerden kaçınarak çalıştırın, büyük sitelerde bellek tükebilir.

Sık Yapılan Hatalar

  • Taxonomy adını yanlış yazmak: category yerine categories yazmak çok yaygın bir hata. Doğru taxonomy adını wp taxonomy list ile kontrol edin.
  • Parent ID yerine slug vermek: --parent parametresi integer (sayı) kabul eder, slug değil.
  • Çoklu site kurulumlarında yanlış site: --url=site-adresiniz.com veya --blog-id=2 parametresini unutmayın.
  • İzin sorunları: WP-CLI’yi web sunucu kullanıcısından farklı bir kullanıcı ile çalıştırırsanız dosya izin sorunları çıkabilir. --allow-root bazen gerekli olsa da production’da önerilmez.

Sonuç

wp term komutu, WordPress terim yönetimini komut satırı üzerinden yapmak isteyenler için son derece kapsamlı bir araç. Özellikle yeni site kurulumlarında kategori yapısını otomatik oluşturmak, büyük WooCommerce mağazalarında ürün kategorilerini ve attribute’larını toplu yönetmek ya da eski sitelerden veri geçişi yaparken terim yapısını yeniden kurmak gibi senaryolarda bu komutun değeri anlaşılıyor.

Tek tek admin panelinden yapmak yerine birkaç satır bash script ile onlarca terimi oluşturup yapılandırmak, hem zaman kazandırıyor hem de tekrarlanabilir bir süreç ortaya koyuyor. Özellikle çok sayıda benzer site yönetiyorsanız bu tür script’leri bir kez yazıp defalarca kullanabilirsiniz.

wp term‘i öğrendikten sonra wp post term, wp taxonomy gibi ilgili komutlara da göz atmanızı tavsiye ederim. Bunlar birlikte kullanıldığında WordPress’in içerik yapısını CLI üzerinden tam anlamıyla kontrol altına alabiliyorsunuz.

Bir yanıt yazın

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