WordPress’in tema kullanım gücü gün geçtikçe artmakta. Artık temalarımızın daha çok özelliğine müdahale edebiliyor, onları kendi isteklerimize daha kolay uyarlayabiliyoruz. Üstelik child tema kullanarak da, ana temamıza hiç müdahale etmeden kulandığımız temayı, güncelleştirmelerle bozulmayacak bir şekilde özelleştirebiliyoruz. Bu yazıda wordpress child tema kullanımına ilişkin bir iki hatırlatma yapıp, bir de fonksiyon değiştirmeye kısaca değineceğim.

WordPress Tema için Child (Alt) Tema Oluşturmak

1.Adım: Child Tema Klasörünü Yaratma

WordPress temamız için en basit şekliyle bir child tema oluşturmak, sadece bir kaç dakikamızı alıyor. Klasik ve basit yöntem child tema kullanımında, wordpress sitemizin wp-content -> themes dizini içerisine ana tema isminin sonuna “-child” ekleyerek isimlendirdiğimiz bir klasör oluşturuyoruz. Bu isimlendirme aslında zorunlu değil (en azından benim test ettiğim kadarıyla), çünkü wordpress için esas tanıtımı, bu klasör içerisine yerleştirmek zorunda olduğumuz style.css dosyasında yapıyoruz.

2.Adım: Child Tema için style.css Dosyası Yaratma

WordPress’in child temayı kabul etmesi için, child tema klasörümüzde style.css dosyası mutlaka olmalı. Bu dosyada gerekli tanımlamalar yapılmışsa, child temamızın çalışması için ana tema dışında başka hiç bir şeye ihtiyaç duymuyoruz. O halde bu zorunluluğu yerine getirmek için klasörümüzde yeni bir css dosyası oluşturup, style.css olarak adlandırabiliriz. Style dosyamızın başlangıcında wordpress için tanımlamalar yapmamız gerekiyor. Tıpkı ana temaların style dosyalarında olduğu gibi… Tanıtım kodumuz şuna benzer olacaktır:

/*
Theme Name: Divi child
Theme URI: http://www.elegantthemes.com/gallery/divi/
Version: 2.5.5
Description: ElegantTheme Divi Teması geliştirmesi.
Author: Barış ERTUĞRUL (ERT Yazılım Çalışma Grubu)
Author URI: http://www.barisertugrul.com
Template: Divi
Tags: responsive-layout, one-column, two-columns, three-columns, four-columns, left-sidebar, right-sidebar, custom-background, custom-colors, featured-images, full-width-template, post-formats, rtl-language-support, theme-options, threaded-comments, translation-ready
License: GNU General Public License v2
License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/

Burada, ana temamızın hangisi olduğunu, Template belirteci ile wordpresse bildiriyoruz.Daha sonra, ana temamızın css tanımlamalarını kullanabilmek için style dosyamızın içerisine ana tema style.css dosyasını import komutu ile aktarıyoruz.

@import url("../ana_tema_klasor_adi/style.css")

Bu dosya içerisinde tanımlayacağımız bütün css elementleri, sitemiz için kullanılabilir olacaktır. Böylelikle hem ana tema stillerini, hem de kendi oluşturacaklarımızı rahatça sitemizde kullanabileceğiz.

3.Adım: Özelleştirilmek İstenen Şablonların Kopyalanması

WordPress child tema yapısı, sadece görsel kişiselleştirme için kullanılmıyor tabi ki. Aynı zamanda sayfa şablonlarını da kişiselleştirmemizi sağlayacaktır. Bunun için de, değişiklik yapmak istediğimiz ana tema sayfa şablonunu, child tema klasörümüze kopyalayıp, içinde yapmak istediğimiz değişiklikleri gerçekleştirmek yeterli olacaktır. Örneğin, tekil yazı gösteriminde bir değişiklik yapacaksak, ana temadaki single.php, kenar çubuğunda bir değişiklik yapacaksak, sidebar.php, anasayfada bir değişiklik yapacaksak index.php veya home.php gibi dosyaları ana temadan, child tema klasörümüze kopyalamamız gerekir. Bu dosyalarda yapılacak değişiklikler, ana tema şablonlarının yerine geçecektir.

Bu şekilde özelleştirdiğimiz dosyalar, child temamız içerisinde yer aldığından, ana tema güncelleştirmelerinden etkilenmeyecek, böylelikle oluşturduğumuz kişiselleştirmeler, her güncellemeden sonra sıfırlanmamış olacaktır.

Ana Tema Fonksiyonları ile Child Temamızın İlişkisi

Kolayca anlaşılacağı üzere, wordpress temalarına kalıcı olarak müdahale etmek, child tema işleviyle mümkün. Yukarıda, bir wordpress siteyi hem görsel açıdan, hem de şablonlara kodlama olarak müdahale edebildiğimizi gördük. Üstelik bu işlemi çok kolay yapabildiğimizi de biliyoruz. Ancak bir wordpress teması sadece css elementleri veya sayfa şablonlarından oluşmuyor. Hatta aslında bir tema kendisini daha çok kullandığı fonksiyonlarla var ediyor diyebiliriz. Çoğu kez, kullandığım temaların her yerine müdahale edebilmek için denemeler yaparım. Sanırım kontrolün bende olmasını istiyorum bu konuda. Ama iş tema fonksiyonlarına veya sınıflarına geldiğinde epeyce kez duvara tosladığımı hissetmişimdir. Üstelik bu müdahale isteği, deneme amaçlı değil de, olmazsa olmaz bir değişiklik için ortaya çıktığında, olumsuz sonuçlarda yaşadığım hayal kırıklığı daha da büyük olmuştur. Çünkü tema işlevlerine müdahale etmek, bir css veya sayfa şablonunu değiştirmede kullandığımız yöntemlerle mümkün olmuyor ve onlar kadar da kolay değil. Örneğin, alt temamızın style.css dosyası içerisine, ana temada kullanılan bir elementi farklı değerlerle biçimlediğimizde, bu yeni değerlerimiz sorun çıkarmadan görüntülenecektir. Ancak, alt temamızda bir functions.php dosyası oluşturup, ana temadaki bir işlevi buraya kopyalayıp sitemizi görüntülemeye kalktığımızda, aynı adlı fonksiyonu (aynı parametreleri alan) iki defa kullanamayacağımız için sayfamız hata verecektir.

Epey bir araştırma ve deneme yanılma çalışmalarından sonra, bu konuda artık eski sorunları yaşamadığımı söyleyebilirim. Bir temanın işlevlerini kontrol etmenin, onları baskılayıp, yerine kendi işlevlerimizin çalışmasını sağlamanın, tema işlevlerini tümüyle geçersiz kılmanın bir kaç farklı yöntemi var. Ama bir temanın fonksiyonlarına müdahale etmenin, temanın fonksiyon yazım ve tetikleme yapısıyla doğrudan bağlantılı olduğunu, her yöntemin her zaman işe yaramayabileceğini unutmamak gerek.

WordPress’in çalışma prensibine göre, alt temalar, ana temadan önce yüklenir. Bu nedenle, alt tema içerisine, ana temanın fonksiyonlarını aktarmanız gerekmeden, kullanabilirsiniz. Ama aynı zamanda, sonra yüklenen fonksiyonun öncelikli olması nedeniyle de, işlev kullanımınız veya ana tema işlevini baskılamanız sınırlanmış olur.

Alt temamızda, ana tema fonksiyonlarını geçersiz kılmak, ya da yerine kendi işlevimizi geçirmek için kullanabileceğimiz üç yöntem var:

  1. Modüler (Takılabilir) İşlevlerden Yararlanma
  2. İşlev Önceliğinden Yararlanma
  3. İşlevlerin Eklendikleri Kancayı Kaldırma

Farklı yapılarda oluşturulmuş tema işlevleri için bu üç yöntemden uygun olanını kullanabiliriz.

Modüler (Takılabilir) İşlevlerden yararlanabilmek için, baskılamak istediğimiz ana tema fonksiyonunun

 <?php
      if ( ! function_exists ( 'my_function' ) ) {
           function my_function() {
                // Contents of your function here.
           }
      }
 ?>
yapısında olması gerekir. Burada, fonksiyon tetiklendiğinde, tetiklenen fonksiyonun daha önce tanımlanıp tanımlanmadığı denetlenir ve eğer daha önce tanımlanmamış ise buradaki fonksiyon devreye sokulur. Bu yapıdaki bir fonksiyon, doğrudan alt temamızda kullanacağımız aynı isimli fonksiyonla kolayca yer değiştirir. Yani, ana temamızdaki fonksiyon bu tarz bir denetlemeye tabi tutulmuşsa, alt temamızın functions.php sayfasında (veya alt tema kodlarının başka herhangi bir yerinde), ana temadaki fonksiyon ismiyle aynı isimde bir fonksiyon tanımlayıp, bu fonksiyonun çalıştırmasını istediğimiz kodları da eklediğimizde, artık ana temadaki fonksiyon geçersiz olacaktır.

Fakat bu yapıda olmayan, daha önce kullanıma sokulup sokulmadığı denetlenmeyen bir fonksiyonu, kendi alt temamızda kullanacak olursak, daha önce söylediğim hatayı almamız kaçınılmazdır. Dolayısıyla böyle bir durumda bu yöntemi kullanamayız. Onun yerine, bu iş için diğer iki yöntemden hangisinin uygun olacağına karar vermemiz gerekir. Fakat diğer iki yöntemle, bir ana tema fonksiyonu geçersiz kılabilmemiz için de, bu fonksiyonların, wordpress sisteminin

add_action()

veya

add_filter()

işlevleriyle çalıştırılıyor olması gerekir.

WordPress,

add_action()

veya

add_filter()

işlevleri, sisteme fonksiyon eklenmesi sırasında, bu fonksiyonlara işlem önceliği de atanabilmesini sağlar. Tanımlama sırasında bu parametreye bir değer verilmemişse, varsayılan olarak, eklenen işlevin işlem önceliği değeri 10’dur. İşte işlem önceliğinden yararlanarak bir ana tema fonksiyonunu geçersiz kılmak istiyorsak, kendi fonksiyonumuza daha yüksek değerli bir işlem önceliği atamamız gerekir.

Ana Tema Fonksiyonu:
<?php
     function parent_function() {
          // Contents for your function here.
     }
     add_action( 'init', 'parent_function', 20 );
?>
Alt Tema Fonksiyonu:
<?php
     function child_function() {
          // Contents for your function here.
     }
     add_action( 'init', 'child_function', 25 );
?> 

İşlevlerin eklendikleri kancayı kaldırma yöntemi ise, add_action() ile eklenmiş bir fonksiyonun bağlantısını, remove_action() ile, add_filter() ile eklenmiş bir fonksiyonu da remove_filter() ile kaldırıp, ana tema fonksiyonu çalıştıran tetikleyicileri kaldırarak geçersiz kılma temeline dayanır.

Daha Fazlası için

Yukarıda değindiğim bu yöntemlere ilişkin ayrıntıları, envatotuts+ içerisinde yayınlanmış olan A Guide to Overriding Parent Theme Functions in Your Child Theme yazısının, çevirisini benim yaptığım Türkçe versiyonunda (Ana Tema İşlevlerini Çocuk Tema İşlevleriyle Geçersiz Kılmaya Yönelik Bir Rehber) bulabilirsiniz