WordPress'i bir blog motoru gibi kullanirken kategori ve etiket ikilisi genellikle yeterli gelir. Ama site buyudugunde, urun katalogu, emlak ilani, etkinlik takvimi ya da bir referans galerisi eklemeye basladiginizda bu iki alan hizla dar gelmeye baslar. Bir emlak ofisinin ilanlarini "kategori" altinda toplamaya calismak, kisa surede birbirine karisan yuzlerce terime ve icinden cikilmaz bir menuye donusur. Iste tam bu noktada ozel taksonomiler devreye girer.
Ozel taksonomi (custom taxonomy), iceriginizi kendi mantiginiza gore gruplayabileceginiz, kategori ve etiketten tamamen bagimsiz siniflandirma katmanlaridir. Bir arac galerisinde "Marka", "Yakit Tipi" ve "Vites"; bir emlak sitesinde "Sehir", "Ilce" ve "Oda Sayisi" gibi eksenleri ayri ayri tanimlayabilir, her birini filtrelenebilir arsiv sayfalarina donusturebilirsiniz. Bu yazida taksonominin ne oldugunu, hiyerarsik ve duz taksonomi ayrimini, register_taxonomy ile kod yazarak ve CPT UI eklentisiyle kodsuz sekilde nasil olusturuldugunu, arsiv sablonlarini ve URL yapisini adim adim ele alacagiz.
Taksonomi Nedir ve Neden Ozel Taksonomiye Ihtiyaciniz Var#
Taksonomi, en yalin haliyle "icerigi gruplama yontemi"dir. WordPress kurulumuyla birlikte iki hazir taksonomi gelir: category (kategori) ve post_tag (etiket). Bunlarin disinda menuleri yoneten nav_menu ve bicimleri tutan post_format gibi arka plan taksonomileri de vardir ama gunluk kullanimda gorunmezler. Yani kategori ve etiket aslinda ozel bir sey degil; sadece WordPress'in sizin icin onceden tanimladigi iki taksonomidir.
Bir taksonomi altindaki her bir deger "terim" (term) olarak adlandirilir. Ornegin category taksonomisi altinda "Haberler", "Rehberler" birer terimdir; bir "Marka" taksonomisi altinda "Toyota", "Ford", "Renault" birer terimdir. Bu ayrimi netlestirmek onemli: taksonomi kutunun kendisi, terim ise kutunun icindeki etiketlerdir.
Ozel taksonomiye ne zaman ihtiyaciniz oldugunu anlamak icin basit bir soru sorun: "Bu bilgi, iceriklerimi filtrelemek icin ayri bir eksen mi olusturuyor?" Cevap evetse, o bilgiyi ozel bir alan (custom field) yerine taksonomi olarak modellemek genellikle daha dogrudur. Cunku taksonomi terimleri otomatik olarak arsiv sayfasi, URL, filtreleme ve iliskili icerik listeleme yetenegi kazanir. Su tabloyu bir dusunun:
| Ihtiyac | Kotu cozum | Dogru cozum |
|---|---|---|
| Aracin markasi | Kategori olarak "Toyota" | marka taksonomisi + Toyota terimi |
| Aracin sasi numarasi | Taksonomi | Ozel alan (custom field) |
| Emlak sehri | Etiket olarak "Istanbul" | sehir taksonomisi + Istanbul terimi |
| Etkinlik tarihi | Taksonomi | Ozel alan / tarih alani |
Kural sudur: sinirli sayida, tekrar eden ve uzerinden filtreleme yapacaginiz degerler taksonomi olur; benzersiz veya serbest metin degerler (fiyat, seri numarasi, aciklama) custom field olur.
Hiyerarsik ve Duz Taksonomi Arasindaki Fark#
Ozel taksonomi olustururken vereceginiz en kritik karar, taksonominin hiyerarsik mi yoksa duz mu olacagidir. Bu karar hierarchical parametresiyle belirlenir ve sonradan degistirmek verilerinizi karmasiklastirdigi icin bastan dogru secmek onemlidir.
Hiyerarsik taksonomi tipki kategori gibi calisir: terimlerin ust-alt iliskisi vardir. "Elektronik > Telefon > Akilli Telefon" seklinde bir agac kurabilirsiniz. Duzenleme ekraninda onay kutulari (checkbox) seklinde gorunur ve editor mevcut terimlerden secim yapar. Bu yapi, iceriginizin dogal olarak dallandigi durumlar icin idealdir: sehir/ilce, kategori/alt kategori, departman/birim gibi.
Duz taksonomi ise etiket gibi davranir: ust-alt iliskisi yoktur, tum terimler ayni seviyededir. Duzenleme ekraninda serbest metin kutusu olarak gorunur, editor virgulle ayirarak yeni terimler ekleyebilir. Renkler, ozellikler, anahtar kelimeler gibi birbirinden bagimsiz etiketler icin uygundur. Iki yapiyi karsilastiralim:
| Ozellik | Hiyerarsik (kategori benzeri) | Duz (etiket benzeri) |
|---|---|---|
hierarchical degeri | true | false |
| Ust-alt iliskisi | Var | Yok |
| Editor arayuzu | Onay kutusu listesi | Serbest metin kutusu |
| Tipik kullanim | Sehir/ilce, kategori agaci | Renk, ozellik, marka |
| Yeni terim ekleme | Genelde onceden tanimli | Yazarken aninda eklenir |
Emin degilseniz sunu dusunun: editorunuzun her yazida yeni terim yazarak eklemesini mi istiyorsunuz, yoksa yonetimin onceden belirledigi sabit bir listeden mi secmesini? Ilki duz, ikincisi hiyerarsik taksonomiye isaret eder. Tema seciminizin bu arsiv sayfalarini nasil gosterecegini de goz onunde bulundurun; WordPress tema secimi rehberimizde arsiv sablonu destegine deginiyoruz.
register_taxonomy ile Ozel Taksonomi Olusturma#
Kod yazarak taksonomi olusturmak, en esnek ve en surdurulebilir yontemdir. Cunku taksonomi tanimi tema ya da eklenti dosyanizin icinde versiyon kontrollu bir sekilde durur; sunucu tasindiginda, yedek geri yuklendiginde ya da yeni bir gelistirici projeye katildiginda tanim kaybolmaz. Taksonomileri her zaman init kancasi (hook) icinde kaydederiz.
Asagida "kitap" temali bir CPT icin "Yayinevi" adinda hiyerarsik bir ozel taksonomi orneginiz var. Bu kodu temanizin functions.php dosyasina degil, tercihen kucuk bir site-ozel eklentiye (wp-content/plugins/site-taksonomi/site-taksonomi.php) koymanizi oneririm; boylece tema degistirdiginizde taksonominiz silinmez.
<?php
/**
* Plugin Name: Site Taksonomileri
* Description: Ozel taksonomi tanimlari
*/
add_action( 'init', 'cloutr_yayinevi_taksonomisi', 0 );
function cloutr_yayinevi_taksonomisi() {
$labels = array(
'name' => 'Yayinevleri',
'singular_name' => 'Yayinevi',
'search_items' => 'Yayinevi Ara',
'all_items' => 'Tum Yayinevleri',
'edit_item' => 'Yayinevini Duzenle',
'add_new_item' => 'Yeni Yayinevi Ekle',
'menu_name' => 'Yayinevi',
);
$args = array(
'labels' => $labels,
'hierarchical' => true, // kategori gibi davransin
'public' => true,
'show_ui' => true,
'show_admin_column' => true, // yazi listesinde sutun goster
'show_in_rest' => true, // Gutenberg + REST API destegi
'query_var' => true,
'rewrite' => array( 'slug' => 'yayinevi' ),
);
register_taxonomy( 'yayinevi', array( 'kitap' ), $args );
}
Burada dikkat edilecek birkac nokta var. hierarchical => true bu taksonomiyi kategori gibi yapar; duz (etiket) bir taksonomi isteseydiniz false verirdiniz. show_in_rest => true cok onemlidir cunku Gutenberg blok editorunun taksonomi kutusunu gostermesi ve REST API uzerinden erisim icin gereklidir; bunu unutursaniz taksonomi klasik editorde gorunur ama Gutenberg'de ortadan kaybolur. show_admin_column => true ise yazi listesine hizli bir sutun ekleyerek yonetimi kolaylastirir.
Kodu ekledikten sonra kritik bir adim vardir: kalici baglantilari (permalink) yenilemek. Aksi halde /yayinevi/... URL'leri 404 verir. WP-CLI kullaniyorsaniz sunucuda tek komutla yapabilirsiniz:
# Taksonomi kaydini dogrula
wp taxonomy list --fields=name,object_type
# Rewrite kurallarini yenile (permalink 404'larini onler)
wp rewrite flush --hard
WP-CLI'ye erisiminiz yoksa Ayarlar > Kalici Baglantilar sayfasini acip hicbir sey degistirmeden "Degisiklikleri Kaydet" demeniz de ayni isi gorur. WP-CLI'yi verimli kullanmak icin SSH erisimi sunan bir hosting paketi veya WordPress hosting ortami islerinizi ciddi olcude hizlandirir.
Taksonomiyi Bir Ozel Icerik Turune (CPT) Baglama#
Taksonomiler tek baslarina bir ise yaramaz; mutlaka bir icerik turune (post type) bagli olmalidir. Yukaridaki ornekte taksonomiyi kitap adinda bir CPT'ye bagladik. Peki bu CPT'nin de kayitli olmasi gerekir. Ozel icerik turunu ve taksonomiyi ayni eklentide birlikte tanimlamak en temiz yaklasimdir. Once CPT'yi olusturalim:
add_action( 'init', 'cloutr_kitap_cpt', 0 );
function cloutr_kitap_cpt() {
$args = array(
'labels' => array(
'name' => 'Kitaplar',
'singular_name' => 'Kitap',
'add_new_item' => 'Yeni Kitap Ekle',
),
'public' => true,
'has_archive' => true,
'show_in_rest' => true,
'menu_icon' => 'dashicons-book',
'rewrite' => array( 'slug' => 'kitap' ),
'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ),
// taksonomileri burada da bildirmek iyi bir aliskanlik
'taxonomies' => array( 'yayinevi' ),
);
register_post_type( 'kitap', $args );
}
Iki tarafli bir baglanti gorursunuz: register_taxonomy cagrisinda taksonomiyi kitap CPT'sine, register_post_type cagrisinda ise CPT'yi yayinevi taksonomisine bagliyoruz. Teknik olarak bir tarafta bildirmeniz yeterlidir, ama iki tarafta da belirtmek kodun okunabilirligini artirir ve baska eklentilerin CPT'yi bu taksonomiyle iliskilendirmesini garanti eder.
Var olan, hazir bir icerik turune de taksonomi ekleyebilirsiniz. Ornegin varsayilan "Yazilar" (post) turune bir "Kaynak" taksonomisi eklemek isterseniz register_taxonomy_for_object_type fonksiyonunu kullanabilirsiniz:
add_action( 'init', function () {
register_taxonomy_for_object_type( 'yayinevi', 'post' );
}, 11 ); // taksonomi kaydindan sonra calissin diye 11 onceligi
Onceliginin 11 olmasina dikkat edin; taksonominin (priority 0) once kaydedilmesi, ardindan bu baglantinin yapilmasi gerekir. Yanlis siralama sessiz bir sekilde calismaz ve saatlerce hata ararsiniz.
CPT UI ile Kodsuz Taksonomi Olusturma#
Kod yazmak istemeyen ya da hizli bir prototip cikarmak isteyenler icin Custom Post Type UI (CPT UI) eklentisi mukemmel bir secenektir. Eklentiler > Yeni Ekle uzerinden "Custom Post Type UI" araterak kurabilirsiniz. Kurulumdan sonra yonetim menusune "CPT UI" baslikli bir bolum eklenir.
Taksonomi olusturmak icin CPT UI > Taksonomi Ekle / Duzenle adimini izleyin. Doldurmaniz gereken temel alanlar sunlardir:
- Taxonomy Slug: Kod tarafindaki
yayinevigibi makine adi. Sadece kucuk harf, rakam ve alt cizgi kullanin; 32 karakteri asmayin. - Plural / Singular Label: "Yayinevleri" ve "Yayinevi" gibi gorunen etiketler.
- Attach to Post Type: Bu taksonominin baglanacagi icerik turu(leri). Onay kutusundan
kitapveyaYazilari secin. - Hierarchical: Kategori gibi olsun istiyorsaniz "True", etiket gibi olsun istiyorsaniz "False".
- Show in REST API: Gutenberg destegi icin mutlaka "True".
CPT UI'nin cok pratik bir ozelligi, olusturdugunuz taksonominin PHP kodunu "Get Code" sekmesinden verebilmesidir. Prototipi arayuzden kurar, uretime gecerken bu kodu kopyalayip site-ozel eklentinize tasiyarak arayuz bagimliligindan kurtulabilirsiniz. Bu, hem hizli baslangicin hem de surdurulebilir kodun avantajlarini birlestiren guzel bir yontemdir.
Kod ile CPT UI arasindaki tercihi soyle ozetleyebiliriz:
| Kriter | Kod (register_taxonomy) | CPT UI eklentisi |
|---|---|---|
| Ogrenme egrisi | Yuksek | Dusuk |
| Versiyon kontrolu | Kolay (Git) | Zor (veritabaninda) |
| Tasima / yedekleme | Dosyayla gelir | Ayar aktarimi gerekir |
| Prototip hizi | Orta | Cok hizli |
| Uretim onerisi | Ideal | Kod'a cevirip kullanin |
Hangi eklentilerin projenize deger kattigini secerken WordPress eklenti onerileri rehberimiz de yol gosterici olabilir. Cok sayida eklenti kurmadan once, sitenizi bir yedekleme cozumuyle guvence altina almanizi tavsiye ederim.
Arsiv Sablonu ve URL Yapisi#
Taksonomiyi kaydettikten sonra WordPress her terim icin otomatik olarak bir arsiv sayfasi olusturur. yayinevi taksonomisindeki "Iletisim Yayinlari" terimi icin URL su sekilde olur:
https://siteniz.com/yayinevi/iletisim-yayinlari/
Bu sayfanin nasil gorunecegini WordPress sablon hiyerarsisi belirler. Tema, su siradaki ilk buldugu dosyayi kullanir:
taxonomy-yayinevi-iletisim-yayinlari.php # belirli terim
taxonomy-yayinevi.php # bu taksonominin tumu
taxonomy.php # tum ozel taksonomiler
archive.php # genel arsiv
index.php # son care
Yani taxonomy-yayinevi.php adinda bir dosya olusturursaniz, sadece bu taksonominin arsiv sayfalarina ozel bir gorunum verebilirsiniz. Basit bir ornek:
<?php get_header(); ?>
<h1><?php single_term_title(); ?> Yayinlari</h1>
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; endif; ?>
<?php get_footer(); ?>
URL yapisini ozellestirmek isterseniz register_taxonomy icindeki rewrite parametresini kullanirsiniz. Ornegin URL'yi /yayinevleri/... yapmak ya da bir on ek eklemek icin:
'rewrite' => array(
'slug' => 'yayinevleri', // /yayinevleri/...
'with_front' => false, // /blog on ekini eklemesin
'hierarchical' => true, // ust/alt terimi URL'de yansit
),
hierarchical => true (rewrite icinde) hiyerarsik taksonomilerde ust terimi URL'ye yansitir: /yayinevleri/ust-terim/alt-terim/. Sunucu tarafinda dostane URL'lerin calismasi icin Nginx kullaniyorsaniz WordPress'in standart yonlendirme blogunun etkin olmasi gerekir:
location / {
try_files $uri $uri/ /index.php?$args;
}
Apache'de bu is .htaccess ve mod_rewrite ile otomatik hallolur; Nginx'te ise yukaridaki try_files satiri sarttir. Bu tur sunucu ayarlarinda takildiginizda sunucu yonetimi hizmetimiz veya yonetimli WordPress hosting ortami, try_files ve rewrite kurallarini sizin yerinize dogru yapilandirir. Kalici baglantilari her taksonomi degisikliginden sonra yenilemeyi (wp rewrite flush) unutmayin.
Performans, SEO ve Yaygin Hatalar#
Ozel taksonomiler cogu zaman performans dostudur cunku terim iliskileri wp_term_relationships tablosunda indeksli tutulur ve sorgulari hizlidir. Ancak arsiv sayfalari sitenizde yuzlerce yeni URL uretebilir; bu da SEO acisindan hem firsat hem risktir. Ic degeri olmayan, tek yazi iceren ya da bos terim arsivlerinin arama motorlarinda gereksiz "ince icerik" (thin content) olusturmasini engellemek icin dikkatli olun.
SEO tarafinda pratik bir sorgu ile kac icerigi olmayan terim oldugunu gorebilirsiniz. Veritabaninda hizli bir kontrol:
SELECT t.name, tt.taxonomy, tt.count
FROM wp_term_taxonomy tt
JOIN wp_terms t ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'yayinevi'
ORDER BY tt.count ASC;
count degeri 0 veya 1 olan terimler ya birlestirilmeli ya da arama motorlarina kapatilmalidir. Bir SEO eklentisiyle bu arsivleri noindex yapabilir ya da site haritasindan cikarabilirsiniz; konuya butunsel bakmak icin SEO hizmetimize goz atabilirsiniz. Genel bir SEO kontrolu icin araclar sayfamizdaki yardimci araclar da ise yarar.
En sik karsilasilan hatalari ve cozumlerini toparlayalim:
- Taksonomi kaydediliyor ama URL 404 veriyor: Permalink yenilenmemistir.
wp rewrite flush --hardcalistirin veya Kalici Baglantilar'i kaydedin. - Taksonomi Gutenberg'de gorunmuyor:
show_in_rest => trueeksiktir. - Tema degisince taksonomi kayboldu: Tanim
functions.phpicindeydi. Site-ozel eklentiye tasiyin. - Terimler yazi listesinde gorunmuyor:
show_admin_column => trueekleyin. - Slug 32 karakteri asiyor: Taksonomi slug'i veritabani sinirini asar ve sessizce basarisiz olur; kisa tutun.
Uretim oncesinde her zaman bir kopya (staging) ortamda deneyin. Site tasima ihtiyaci dogarsa site tasima hizmetimiz taksonomi ve rewrite kurallarinizi bozmadan tasima yapar. Bu tur yapisal degisikliklerden once mutlaka tam yedek alin.
Sıkça Sorulan Sorular#
Ozel taksonomi ile kategori arasindaki fark nedir?#
Teknik olarak hicbir fark yoktur; kategori zaten category adinda hazir gelen bir taksonomidir. Ozel taksonomi olusturdugunuzda, WordPress'in size verdigi kategori ve etiketin yaninda kendi siniflandirma eksenlerinizi eklemis olursunuz. Yani ozel taksonomi, kategorinin yaptigi her seyi yapar ama farkli bir amac ve URL yapisi altinda, sizin belirlediginiz baglama gore calisir.
Var olan yazilara ozel taksonomi ekleyebilir miyim?#
Evet, kesinlikle. register_taxonomy cagrisinda hedef icerik turu olarak post belirtir ya da register_taxonomy_for_object_type fonksiyonunu kullanirsaniz taksonomi mevcut yazilarinizda da gorunur hale gelir. Var olan yazilardaki verileriniz silinmez; sadece yeni bir siniflandirma alani eklenmis olur ve her yaziyi tek tek ilgili terimlerle etiketleyebilirsiniz.
Kod yazmadan ozel taksonomi olusturabilir miyim?#
Evet. Custom Post Type UI (CPT UI) gibi bir eklenti ile arayuz uzerinden slug, etiket, hiyerarsi ve REST destegi gibi ayarlari doldurarak kod yazmadan taksonomi olusturabilirsiniz. Ancak uretim ortaminda bu tanimlarin CPT UI'nin "Get Code" ozelliginden alinip bir site-ozel eklentiye tasinmasi daha guvenli ve surdurulebilir bir yaklasimdir.
Taksonomiyi kaydettim ama sayfasi 404 veriyor, neden?#
Bu neredeyse her zaman kalici baglantilarin (permalink) yenilenmemis olmasindan kaynaklanir. WordPress yeni rewrite kurallarini yalnizca permalink ayarlari kaydedildiginde yeniden olusturur. wp rewrite flush --hard komutunu calistirin ya da Ayarlar > Kalici Baglantilar sayfasini acip hicbir sey degistirmeden kaydedin; sorun genellikle aninda cozulur.
Ozel taksonomileri hiyerarsik mi yoksa duz mu yapmaliyim?#
Karar iceriginizin yapisina baglidir. Terimleriniz arasinda ust-alt iliskisi varsa (sehir/ilce, kategori/alt kategori gibi) hiyerarsik yapin; editorunuz onceden tanimli bir listeden onay kutusuyla secim yapsin. Terimler birbirinden bagimsizsa ve editorun yazarken serbestce yeni terim eklemesini istiyorsaniz duz yapin. Emin degilseniz, kullanicinin secim mi yoksa serbest metin girisi mi yapacagini dusunerek karar verin.
Kapanış#
Ozel taksonomiler, WordPress'i basit bir bloktan gercek bir icerik yonetim sistemine donusturen en guclu araclardan biridir. Kategori ve etiketin dar geldigi her senaryoda, iceriginizi kendi is mantiginiza gore modelleyebilir; hiyerarsik ya da duz yapiyla, kod yazarak ya da CPT UI ile, arsiv sablonlarini ve URL'leri kontrol ederek profesyonel bir yapi kurabilirsiniz. Onemli olan, taksonomi tanimlarini tema yerine site-ozel bir eklentide tutmak, show_in_rest gibi kritik ayarlari atlamamak ve her degisiklikten sonra kalici baglantilari yenilemektir.
Tum bu yapiyi saglam bir zeminde calistirmak istiyorsaniz altyapiniz kadar sunucunuz da onemli. SSH ve WP-CLI destekli, hizli ve yonetimli bir ortam icin WordPress hosting ve genel hosting paketlerimize goz atabilir; daha fazla kaynak gerektiginde sanal sunucu veya VDS cozumlerimizle olceklendirebilirsiniz. Sitenizi ucretsiz SSL, WAF ve yedekleme ile guvence altina almak, ozel taksonomilerle kurdugunuz bu degerli yapinin uzun omurlu olmasini saglar. Sorulariniz icin ekibimiz her zaman yaninizda.