BU DERSİN BAŞLIKLARI
- 1 Şablon Dosyalarının Hiyerarşisi
- 2 Şablon Hiyerarşisi Diyagramı
- 3 Şablon Hiyerarşisi Detayları
- 3.1 Ana Sayfa Şablonu (Site Front Page)
- 3.2 Tek Yazı (Single Post)
- 3.3 Tek Sayfa (Single Page)
- 3.4 Kategori (Category)
- 3.5 Etiket (Tag)
- 3.6 Özel Sınıflandırmalar (Custom Taxonomies)
- 3.7 Özel Yazı Tipleri (Custom Post Types)
- 3.8 Yazar (Author)
- 3.9 Tarih (Date)
- 3.10 Arama Sonuçları
- 3.11 404 – Hata Sayfası (Sayfa Bulunamadı)
- 3.12 Ortam Dosyası (Attachment)
- 3.13 Gömülü İçerikler (Embeds)
- 3.14 Non-ASCII (ASCII Dışı) Karakter Kullanımı
- 4 Hiyerarşiyi Etkileme
Bu dersin amacı, WordPress temasındaki, şablon dosyaları arasında kaybolanlara yolunu göstermektir. Bu dersi anladığınızda, WordPress’in, şablon dosyalarını kullanma mantığını anlamış olacaksınız, oluşturduğunuz her içerik için, ona özel bir şablon hazırlayabileceksiniz, Çünkü; WordPress’in, hangi şablon dosyasını hangi içerik için ve hangi koşullarda kullandığını anlayacaksınız. Dahası, hazır bir tema kullanıyorsanız, temada bir değişiklik yapmak istediğinizde hangi şablon dosyasına bakmanız gerektiğini anlamış olacaksınız.
WordPress’in şablon dosyaları; tam sayfa şablon dosyaları ve şablon parçaları olarak iki şekilde düşünülebilir. “Şablon dosyası” denildiğinde kastedilen şey, genellikle tam sayfa şablon dosyasısıdır. header.php
ve footer.php
… gibi dosyalar, şablon parçalarıdır. single.php
, category.php
, page.php
… gibi dosyalar ise tam sayfa şablonlarıdır. Şablon hiyerarşisi denildiğinde, tam sayfa şablon dosyalarının hiyerarşisi kastedilir.
Koşullu ifadeler kullanarak, bir şablonun belli sayfalarda veya belli koşullarda görünmesini de sağlayabilirsiniz.
Şablon Dosyalarının Hiyerarşisi
WordPress, bir sayfayı, hangi şablon dosyasını kullanarak gösterileceğine o sayfanın URI (Uniform Resource Identifier) ifadesine, yani bizim bildiğimiz anlamda adresine bakarak karar verir. WordPress sayfa adreslerine “kalıcı bağlantılar” der. Sayfaların adresinde bulunan GET
parametrelerine query_string
(sorgu ifadesi) denir. Query string
ifadeleri, sitenin kök adından hemen sonra gelen bir soru işareti (?) ile başlar ve ampersand (&) işareti ile birbirinden ayrılmış bir çok parametre içerebilir ve bu parametreler, sayfada gösterilen içerik hakkında bilgi verir.
Örnek-1
https://benimsitem.com/?post_type=post&author_name=baris%20manco
Yukarıdaki sayfa adresi (URI ifadesi) ile bir WordPress sitesinde, Baris MANCO adlı yazarın yazdığı bütün “yazılar” listelenecektir.
WordPress, daha okunaklı adresler (kalıcı bağlantılar) kullandığı için, yukarıdaki örnekte yazdığınız adres, sayfa açıldıktan sonra daha anlaşılır bir hale dönüşecektir. Bu WordPress’in SEO için kullandığı güzel bir özelliktir.
Basitçe ifade etmek gerekirse, WordPress, sayfanın adresindeki parametrelere denk gelen içerik tipini anlar ve bu içerik tipi için oluşturulmuş şablonu bulana kadar, şablon hiyerarşisini tarar ve uygun olanı bulduğunda gösterir. Bu olayı bir başka şekilde ifade etmek gerekirse, WordPress, hangi şablon dosyasının uygun olduğuna şöyle karar verir:
- WordPress, sayfanın adresine (
query string
ifadesine) bakarak, önce hangi içerik tipinin çağırıldığını anlar. (Örneğin, bir yazı, bir yazı arşivi, bir sayfa, bir arama sayfası gibi) - Şablon hiyerarşisini tarayarak, o içerik için kullanılabilecek şablon dosyasını bulur.
- Bu içerik için kullanılabilecek birden fazla şablon dosyası varsa, hiyerarşide daha üst sırada olanı kullanır.
index.php
dosyası, şablon hiyerarşisinin en altında bulunur. Eğer, WordPress, adres (query string) ifadesindeki parametrelere uygun bir şablon dosyası bulamazsa, son çare olarak index.php
dosyasını kullanır. Yani index.php
dosyası, bütün içerikler için, joker şablon dosyasıdır ve bu yüzden de WordPress temalarında zorunlu olan iki dosyadan biridir.
Örnek-2
Örnekler, WordPress’in kullandığı kalıcı bağlantılar (SEO dostu URI’lar) üzerinden verilecektir.
Blog adresiniz; https://siteadi.com/
şeklinde olsun. Bir ziyaretçiniz, https://siteadi.com/category/kitaplar/
şeklinde bir linki tıklasın. WordPress, bu URI ifadesinden, “kitaplar” kategorisine ait yazı arşivini göstermesi gerektiğini anlar. Bu arşiv sayfasını, göstermek için uygun şablonu, şu adımları izleyerek bulur:
- Önce bu kategori adına hazırlanmış bir şablon dosyası var mı ona bakar:
category-kitaplar.php
- Eğer
category-kitaplar.php
dosyasını bulamazsa bu defa bu kategorinin id değeri için hazılanmış bir şablon dosyası var mı ona bakar. Eğer “kitaplar” kategorisinin id değeri 6 ise:category-6.php
- Eğer
category-6.php
dosyasını bulamazsa bu defa bütün kategoriler için kullanılancategory.php
dosyasını arar. - Eğer
category.php
dosyasını da bulamazsa, bütün arşivler için kullanılanarchive.php
dosyasını arar. - Eğer
archive.php
dosyasını da bulamazsa, bu defa son çare olarakindex.php
dosyasını kullanır.
Şablon Hiyerarşisi Diyagramı
Aşağıdaki diyagram, WordPress’in şablon hiyerarşisini gösterir. Bu diyagrama bakarak, WordPress’in hangi içerik türü için, önce hangi dosyayı aradığını ve bir dosyayı bulamadığı zaman hangi dosyaya baktığını görebilirsiniz.
WordPress, bu diyagramı soldan sağa doğru (—>) takip ederek, ekrandaki içeriğe uygun olan ilk şablon dosyasını kullanır. Yani, bir içerik için, iki farklı şablon dosyası hazırlamak demek, birini boşuna hazırlamak demektir. Çünkü, WordPress, her zaman, bu iki dosyadan, diyagramın daha sağında olanı tercih edecektir ve solda kalan hiç bir zaman kullanılmayacaktır. Mesela, temanızda;
archive.php
singular.php
home.php
404.php
search.php
şablon dosyalarının hepsi varsa, index.php
dosyanızın yolu kesilmiş olur ve hiç bir zaman kullanılmaz. Fakat, her WordPress temasında, oluşturulması zorunlu bir dosya olduğu için, tasarımcılar, bu durumlarda index.php
dosyalarına, “Söz gümüşse sukut altındır” anlamına gelen şu ifadeyi yazarlar:
/* Silence is golden */
Aynı şekilde, temanızda:
single.php
page.php
şablon dosyaları varsa da, singular.php
şablon dosyasının yolu kesilir ve temanızda bu dosyayı bulundurmak, sadece zaman ve yer kaybı olur.
Diyagramdaki renklerin anlamları şöyledir:
- Siyah: Bu alanlar şablon dosyalarını değil, sayfa tiplerini, bir başka ifade ile içerik tiplerini gösterir. WordPress, önce ekrandaki sayfanın içeriğine bakar ve içerik tipini anladıktan sonra, o içerik tipi için hazırlanmış şablon dosyasını aramaya başlar.
- Turuncu: Değişken şablonlardır. Bu şablonlar yoksa, yerlerine yeşil şablonlar kullanılır.
- Yeşil: İkincil şablonlardır. Bu şablonlar yoksa, yerlerine mor şablon dosyaları kullanılır.
front-page.php
şablonu bu kuralın istisnasıdır. Bazı durumlarda,front-page.php
şablonu yerine, değişken şablonlar da kullanılabilir. Bu ayrıntı ile ilgili detaylı bilgiyi aşağıda bulacaksınız. - Mor: Birincil şablonlardır. Bu şablonlardan sadece
index.php
dosyası zorunludur. Çünkü, diğer birincil şablonların yokluğunda, yerlerine,index.php
dosyası kullanılır.
Şablon Hiyerarşisi Detayları
Diyagramlar ile veya İngilizce ile aram iyi değildir diyorsanız, buyurun, WordPress’in şablon hiyerarşisini bir de böyle anlamaya çalışalım.
Ana Sayfa Şablonu (Site Front Page)
Ana sayfa konusu başlangıçta biraz karmaşık gelebilecek bir konudur. Fakat biz, bu başlık altında bu karmaşıklığı çözeceğiz ve her şey berrak olacak.
Öncelikle, WordPress sitenizinin ana sayfası için, hangi şablonun kullanılacağı, yönetim panelinizdeki Ayarlar->Okuma menüsünde yaptığınız tercihe bağlıdır.
Yukarıdaki resimde de görüldüğü gibi, ana sayfanız iki farklı şekilde oluşturulabilir. Bunlar:
- En son yazılarınız: Eğer bu seçeneği işaretlerseniz, WordPress ana sayfanızı oluşturmak için, tema dosyalarınız arasında, önce
front-page.php
dosyasını arar. Bulamazsahome.php
dosyasını arar. Onu da bulamazsa, ana sayfanızıindex.php
dosyasındaki şablona göre oluşturur. - Sabit sayfa -> Ana sayfa: Ana sayfa görüntülenmesi için “Sabit sayfa” seçeneğini seçerseniz, sizden iki alan için, ayrı ayrı sayfa tercihi yapmanız istenir. Bunlardan ilki, “Ana sayfa” alanıdır. Ana sayfa alanı için hangi sayfayı seçerseniz seçin, WordPress, sitenizin ana sayfasını oluşturmak için önce
front-page.php
dosyasını arar. Bulamazsa seçtiğimiz sayfaya özel bir şablon dosyası arar (page-{sayfa-adi}.php
veyapage-{id}.php
veyabenim-sayfam.php
gibi…). Onu da bulamazsapage.php
dosyasını arar. Onu da bulmazsaindex.php
dosyasındaki şablona göre bir anasayfa oluşturur.
Sabit sayfa -> Yazı sayfası: Sabit sayfa seçeneğinde, Yazı sayfası adında ikinci bir tercih alanı daha vardır. Yazı sayfası olarak tercih ettiğiniz sayfanın şablonu ise, home.php
dosyası, yoksa index.php
dosyasıdır.
Ana sayfa görüntülenmesinde, sabit sayfa seçeneğini seçtiysek, ana sayfa ve yazı sayfası tercihleriden en az biri için bir sayfa seçmemiz gerekir. Eğer hiç bir seçim yapmazsak, WordPress, ana sayfamız olarak, “En son yazılarınız” seçeneğini geçerli sayar.
Hala kafanızda soru işaretleri varsa, belki aşağıdaki diyagram bütün bu soru işaretlerini silebilir.
Ana sayfa tercihi Hiyerarşi
=================== ====================
En son yazılarınız -> front-page.php -> home.php -> index.php
Sabit sayfa: Ana sayfa -> front-page.php -> ozel-sablon.php -> page-{sayfa-adi}.php -> page-{sayfa-id}.php -> page.php -> index.php
Sabit sayfa: Yazı sayfası -> home.php -> index.php
Belki sizin de dikkatinizi çekmiştir: Eğer temanızda front-page.php
şablonu varsa, ana sayfanız, her koşulda bu şablon ile oluşturuluyor.
Tek Yazı (Single Post)
Yönetim paneli : Yazılar->Yeni ekle menüsünü kullanarak oluşturduğunuz her içerik bir yazıdır. Kullanıcılarınız, web sitenizde, yazı türünden bir içeriğinize tıklayarak, o yazıyı görmek isterse, WordPress, o yazının şablonunu, şu hiyerarşiye göre oluşturur:
single-{yazi-tipi}-{yazi-adi}.php
: Bu şablon, WordPress 4.4 versiyonundan itibaren tanınır. WordPress, dosya isminde, adını belirttiğiniz yazıyı göstermek için bu şablonu kullanır. Yani bu şablon tek bir yazıya aittir. Örneğin, “kitaplar” diye bir yazı tipiniz var ve bu yazı tipinde yazdığınız “son-kitabimdan-parcalar” adında bir yazınız var. Eğer bu yazınıza özel bir sayfa şablonu oluşturmak istiyorsanız bunu,single-kitaplar-son-kitabimdan-parcalar.php
dosyası ile yapabilirsiniz.single-{yazi-tipi}.php
: Bir yazının kendisine özel bir şablonu yoksa, o yazı, ait olduğu yazı tipine özgü olarak hazırlanan bu şablona göre sunulur. Örneğin, “kitaplar” adında bir yazı tipiniz varsa, bu yazı tipinde oluşturulan bütün yazılarınızsingle-kitaplar.php
şablonu ile gösterilecektir.single.php
: Bir yazı tipine mahsus bir şablon hazırlamazsanız, o yazı tipinizde yazılan bütün yazılar, bu şablona göre gösterilecektir.singular.php
:single.php
dosyasının olmadığı temalarda, onun yerine bu şablon kullanılır.index.php
: Eğer yukarıdaki hiyerarşide bulunan dosyalardan hiç biri yoksa, WordPress son çare olarak, bu doyayı şabon olarak kullanır.
Tek Sayfa (Single Page)
WordPress ile gelen standart içerik tiplerinden ikincisi de sayfalardır. Yönetim paneli:Sayfalar->Yeni ekle menüsünü kullanarak oluşturduğunuz her içerik bir sayfadır. Sayfalarınız için kullanılacak şablon hiyerarşisi şu şekildedir:
- Genel şablon: Adını, istediğiniz gibi koyarak bir sayfa şablonu oluşturabilirsiniz. Daha sonra bu şablonu, yeni bir sayfa eklerken, Belge->Sayfa özellikleri->Şablon menüsünü takip ederek, istediğiniz her sayfa için kullanabilirsiniz. Ya da, temanızın herhangi bir yerinde, bu şablonu çağırmak isterseniz,
get_page_template()
fonksiyonunu kullanarak çağırabilirsiniz. page-{sayfa-link-adi}.php
: Eğer sayfanız için genel bir şablon kullanmadıysanız ve syafanızın link adı, “en-son-haberler” ise, Wodpress bu sayfayı göstermek için tema dosyalarınızın arasındapage-en-son-haberler.php
dosyasını kullanacaktır.page-{id}.php
: Eğer bir önceki adımdaki şablon dosyası yoksa ve sayfanızın id değeri 6 ise WordPress, bu sayfa içinpage-6.php
şablonunu kullanacaktır.page.php:
Eğer sayfanıza ait yukarıdaki şablonlardan hiç biri yoksa, bu şablon kullanılır.singular.php
: Eğerpage.php
dosyanız yoksa, onun yerine bu dosya kullanılır.index.php
: Hiç biri yoksa, yine can simidi bu dosyadır.
Kategori (Category)
WordPress, bir kategoriye ait yazı arşivinizi sunmak istediğinizde, aşağıdaki hiyerarşiyi kullanır:
category-{katetori-adi}.php
: Eğer “haberler” diye bir kategoriniz varsa, WordPress, bu kategorinin arşivi için öncecategory-haberler.php
doyasını arar.category-{id}.php
: Yukarıdaki şablon yoksa ve kategorinin ID değeri 6 ise, WordPresscategory-6.php
dosyasını arar. Bu da yoksa, aşağıdaki sırayla aramaya devam eder.cagetory.php
archive.php
index.php
Etiket (Tag)
Tıpkı kategori gibi, bir etikete sahip yazı arşivinizi sunmak istediğinizde, WordPress bu arşivi aşağıdaki hiyerarşik düzende, ilk bulduğu dosya şablonuna göre gösterir.
tag-{etiket-adi}.php
: Eğer “spor” diye bir etiketiniz varsa, bu etiketi eklediğiniz yazıları göstermek için, WordPress öncetag-spor.php
doyasını arar.tage-{id}.php
: Eğer etiketin id değeri 6 isetag-6.php
dosyası kullanılır.tag.php
arcihve.php
index.php
Özel Sınıflandırmalar (Custom Taxonomies)
Özel sınıflandırmalar, register_taxonomy()
fonksiyonu ile, sizin oluşturduğunuz sınıflandırma yöntemleridir. Bu sınıflandırma yöntemleri için WordPress, şu hiyerarşiye göre hareket eder:
taxonomy-{siniflandirma_adi}-{sinif-adi}.php
: Mesela sitenizde çok fazla ürün var ve “arabalar” diye bir sınıflandırma yöntemi oluşturdunuz. Bu sınıflandırma yöntemine ait olarak da “opel” diye bir sınıf oluşturdunuz.taxonomy-arabalar-opel.php
sayfası, bu sınıftaki bütün içerik arşiviniz şablon olarak kullanılacaktır.taxonomy-{siniflandirma_adi}.php
: “arabalar” adında bir sınıflandırma yönteminiz varsa,taxonomy-arabalar.php
şablonu bu sınflandırmaya ait bütün içeriklerinize şablon olacaktır.taxonomy.php
archive.php
index.php
Özel Yazı Tipleri (Custom Post Types)
register_post_type()
fonksiyonu ile sizin oluşturduğunuz yazı tiplerine, özel yazı tipi denir. Özel bir yazı tipine ait arşivinizi göstermek için kullanılacak şablon hiyerarşisi şöyledir:
archive-{post_type}.php
: Eğer yazı tipinizi “urunler” olarak kaydettiyseniz, ürünlerinizin sıralanması için önce,archive-urunler.php
dosyası aranır.archive.php
index.php
Yazar (Author)
Bir yazara ait bütün yazıları göstermek için, sırasıyla, aşağıdaki şablonlara başvurulur:
author-{guzel-adi}.php
: Yazarın güzel adı “ahmet” ise, önceauthor-ahmet.php
dosyası aranır.author-{id}.php
: Eğer yazarın id değei 6 iseauthor-6.php
dosyası aranır.author.php
archive.php
index.php
Tarih (Date)
Tarihe dayalı yazı arşiviniz için kullanılan şablon hiyerarşisi:
date.php
archive.php
index.php
Arama Sonuçları
Arama sonuçlarını, aşağıdaki şablon hiyerarşisi ile sunarsınız:
search.php
index.php
404 – Hata Sayfası (Sayfa Bulunamadı)
Eğer, sitenizde olmayan bir bağlantıya ulaşılmak istenirse, bulunamadı mesajı için dilediğiniz gibi bir şablon hazırlayabilirsiniz. WordPress bu sayfa için şu hiyerarşiyi takip eder:
404.php
index.php
Ortam Dosyası (Attachment)
Bir ortam dosyası için (ortam tipindeki içerikler için) kullanılacak şablon dosyasının hiyerarşisi şöyledir:
{MIME-type}.php
: Ortam dosyalarının MIME tipine bağlı olarak, oluşturulabilecek şablonlar şunlardır:image.php, video.php, pdf.php
. Text dosyaları için de sırasıyla;text-plain.php, plain.php, text.php
şablonları kullanılır.attachment.php
single-attachment-{doya-adi}.php
: Eğer, ortam dosyanızın adı “tatil” ise, WordPresssingle-attachment-tatil.php
şablonunu arar.single-attachment.php
single.php
singular.php
index.php
Gömülü İçerikler (Embeds)
Gömülü içerikler için kullanılacak şablon dosyası, gömülü durumdaki yazılar için kullanılır. WordPress 4.5 sürümünden bu yana, gömülü yazılar için şu hiyerarşiyi kullanır.
embed-{yazi-tipi}-{yazi-formati}.php
: WordPress, önce yazı tipine göre bir şablon arar ve daha sonra da bu yazının formatına bakar. Örneğin, audio formatında bir yazınız varsa ve yazı tipi de post (yazı) ise, WordPress,embed-post-audio.php
dosyasını arayacaktır.embed-{yazi-tipi}.php
: Eğer yazı tipiniz kitap ise, WordPress;embed-kitap.php
şablonunu arayacaktır.embed.php
: Yukarıdaki şablonlar yoksa bu şablon kullanılır.- Hiç biri yoksa, WordPress,
wp-includes/theme-compat/embed.php
şablonunu kullanacaktır.
Non-ASCII (ASCII Dışı) Karakter Kullanımı
WordPress, 4.7 versiyonundan bu yana, şabon isimlerinin değişken kısımlarında, non-ASCII karakterlerini kabul etmektedir. Non-ASCII karakterleri içeren şablon isimlerinde, dosya ismi, önce un-encoded ardından encoded karakter gelecek şekilde yazılmalıdır.
Örneğin; “Merhaba ☺” adında bir sayfanız varsa, ve bu sayfanın ID değeri de 6 ise, şablon hiyerarşisi şöyle olacaktır:
page-merhaba-☺-.php
page-merhaba-%E2%98%BA.php
page-6.php
page.php
singular.php
Aynı durum, yazı isimleri, term (terim) isimleri, yazarların güzel isimleri (author nicenames) için de geçerlidir.
Hiyerarşiyi Etkileme
WordPress şablon sistemi, bize, yukarıda bahsettiğimiz hiyerarşiyi filtreleyerek etkileme imkanı da tanır. Yani, hiyerarşinin belli noktalarında, bazı eklemeler yapabilirsiniz ve bazı şeyleri değiştirebilirsiniz. Bunun için WordPress’in filtreleme fonksiyonunu (add_filter()) kullanmalısınız (Bu iş için kullanacağınız filtreleme fonksiyonu get_query_template() fonksiyonu içinde bulunmaktadır.).
Filtrelemek istediğiniz şablonların, filtre etiketleri (tags) aşağıda verilmiştir:
embed_template
404_template
search_template
frontpage_template
home_template
taxonomy_template
attachment_template
single_template
page_template
singular_template
category_template
tag_template
author_template
date_template
archive_template
index_template
Örnek:
Bu örnekte, yazarlara ait şablon hiyerarşisine, yazar rölüne göre oluşturacağımız şablon dosylarını dahil edeceğiz. Dahil edeceğimiz bu şablonlar, author.php dosyasından hemen önce uygulanacak.
Yazarlar şablonlarının varsayılan hiyerarşisi şöyledir:
author-{guzel-adi}.php
author-{id}.php
author.php
author.php
şablonundan önce, author-{rol}.php
şeklinde bir dosya ile, yazarların rolüne göre bir şablon eklemek isityorsak, author_template
etiketini kullanarak şablon hiyerarşisini filtrelememiz gerekir. Bunu yaptığmızda şunu başarmış olacağız: Mesela, kullanıcınız bir “editör” ise rolü de “editor” olacaktır. O zaman, “author-editor.php
” adında bir şablon hazırlarsak, WordPress bu kullanıcının ve rolü aynı olan bütün kullanıcıların, yazdığı yazıları göstermek için bu şablonu kullanacaktır. Aşağıda, bu işi yapan kodları görüyorsunuz:
function yazar_rol_sablonu( $templates = '' ) {
$author = get_queried_object(); // yazarın bilgilerini getirdik
$role = $author->roles[0]; // yazarın rolünü öğrendik
if ( ! is_array( $templates ) && ! empty( $templates ) ) {
$templates = locate_template( array( "author-$role.php", $templates ), false );
} elseif ( empty( $templates ) ) {
$templates = locate_template( "author-$role.php", false );
} else {
$new_template = locate_template( array( "author-$role.php" ) );
if ( ! empty( $new_template ) ) {
array_unshift( $templates, $new_template );
}
}
return $templates;
}
add_filter( 'author_template', 'yazar_rol_sablonu' );
Murat says:
Mükemmel bir anlatım, size ne kadar teşekkür etsem azdır.
Gökalp AY says:
Beğenmenize sevindim.