WordPress eklentilerinin kalbi: Kancalar

Image: Pixabay

Aşağıdaki gereksiz teorik bilgiyi şöyle ortaya bıraktıktan sonra, dileyenlerin basmadan üzerinden atlayıp direkt konuya gelebileceklerini belirterek yazıma başlamak istiyorum.

API, “Application Programming Interface” yani “Uygulama Programlama Arayüzü” demektir.

API kısaca, bir yazılımın belirli işlevlerinin diğer yazılımlar tarafından kullanılabilmesini sağlamak amacıyla oluşturulmuş, açıkça tanımlanmış metotlar bütünüdür.

Programlamada hooking (kancalamak/takılmak), bir işletim sisteminin veya yazılımın davranışını değiştirmek veya geliştirmek amacıyla, fonksiyon çağrılarını, mesajlarını veya olaylarını keserek gerçekleştirilen bir dizi tekniktir.

Not: Bazı kelimelerin Türkçe’ye çevirince kulağa değişik geldiğinin farkında olsam da Türkçe olarak devam etmeye çalışacağım.

Bilmemiz gereken kısaca şudur: Filters & Actions (Filtre Kancaları ve Eylem Kancaları), WordPress Plugin API’nin (eklenti geliştirme arayüzü) birer parçasıdırlar. Eylem kancaları ve filtre kancaları ile WordPress’in davranışına ve içeriğe müdahale edebiliriz.

Basit bir örnekle, konu daha anlaşılır olacaktır. Kullandığımız add_filter() fonksiyonunun adından da anlaşılabileceği üzere “the_content” bir filtre kancasıdır. Aşağıdaki kod her makalenin sonunda “Lütfen kaynak göstermeden alıntı yapmayınız.” yazısının görünmesini sağlayacaktır. Filtre ve eylem kancaları daha çok eklenti geliştirmekte kullanılıyor olsa da, aşağıdaki kodu hemen mevcut temanızın functions.php dosyası içerisine yazarak test edebilirsiniz.


add_filter( 'the_content', 'my_the_content_filter');
 
function my_the_content_filter( $content ) {
    if ( is_single() ) {
        $content .= "<p>Lütfen kaynak göstermeden alıntı yapmayınız.<p>";
    }
    return $content;
}

Tabii ki bu örnek farazi bir örnek ve yapmaya çalıştığımız şeyi tema dosyasının içerisine yazarak da yapabilirdik. Bu örnek, “the_content” filtresinin kullanımını anlatmaya yönelikti. Örneğin, her yazının sonuna sosyal medyada paylaşma butonları ekleyen, birbirinin aynısı birçok eklentiyi düşünelim. Bu eklentiler de yukarıda anlatılan yol ile butonları  içeriğe ekliyorlar. Filtre kancalarının listesine buradan ulaşabilirsiniz.

Bir örnek de eylem kancalarına verelim. Bu örnekte tarayıcının sayfayı önbelleğe (cache) almasını HTML <meta> etiketleriyle engellemeye çalıştığımızı farz edelim. Örnekte, daha sonra aşağıda anlatılacak olan “wp_head” eylem filtresi kullanılmıştır.


add_action('wp_head', 'my_no_cache_meta');

function my_no_cache_meta() {
    ?>
        <meta http-equiv="cache-control" content="no-cache" />
        <meta http-equiv="cache-control" content="max-age=0" />
        <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
        <meta http-equiv="pragma" content="no-cache" />        
    <?php
}

Diğer bir örnekte, bu cache engelleme işini, kendi göndereceğimiz HTTP başlıkları ile yapmaya çalıştığımızı farz edelim. Görüleceği üzere, burada HTTP başlıkları (HTTP headers) göndereceğimiz için “send_headers” eylem filtresini kullandık. “wp_head” kullansaydık, HTTP başlıkları göndermek için geç kalmış olurduk, çünkü çıktı (OUTPUT) çoktan başlamış olurdu. Aslında HTTP başlıklarını, çıktı başlamadan önce herhangi bir eylem filtresi içerisinde de gönderebilirdik, fakat bu iş için yapılmış olan “send_headers” eylem filtresini tercih edebiliriz.


add_action('send_headers', 'my_no_cache_headers');

function my_no_cache_headers() {
    header("Cache-Control: no-cache, no-store, must-revalidate, max-age=0");
    header("Pragma: no-cache");
    header("Expires: 0");
}

Örneklerin farazi olduğunu tekrar hatırlatmakta fayda var. Normalde cache engelleme işi bu şekilde yapılmaz, bu iş için nocache_headers() WordPress hazır fonksiyonu mevcuttur. Yalnızca eylem filtrelerini ve akışı açıklamak maksadıyla yazılmış olan bu örnekler, sitenizin çalışma şeklini bozabilir.

Konunun daha iyi anlaşılması için şu listede bulunan eylem kancalarının bazılarından bahsedelim.


plugins_loaded

init

wp_loaded

wp

wp_head

plugins_loaded:

Bu aşamada tüm aktif eklentiler ve eklenti fonksiyonları yüklenmiştir.

init:

Bu kanca (yapılacak işe göre değişmekle birlikte) birçok eklenti tarafından giriş noktası olarak sıklıkla kullanılır. Bu aşamada, mevcut kullanıcı giriş yapmış ve artık WordPress tarafından tanınmaktadır.Kullanıcılarla ilgili fonksiyonlar çalışmaktadır. Örneğin;

$user = wp_get_current_user(); 

dediğimizde, wp_get_current_user() fonksiyonunun artık erişilebilir olduğunu görebiliriz.

wp_loaded:

Bu aşamada artık WordPress, tüm eklentiler ve seçili tema ile tamamen yüklenmiştir.

wp:

Bu aşamada WP nesnesi oluşturulmuştur.

wp_head:

Mevcut temada, ön yüze <head> etiketi altına çıktı göndermek üzere kullanılır. Örneğin yukarıdaki örnekte verilen <meta> etiketi gibi.

Bu aşamada artık HTML çıktısı gönderilmeye başlanmıştır. Yani artık HTTP başlıkları gönderemeyiz.

Eski dökümantasyonda, bu eylem fitresi ile HTML çıktısının <head> bölümüne Javascript veya CSS eklenebileceği örnekler verilmiş olsa da, bu işler için daha sonradan geliştirilen wp_enqueue_script(), wp_enqueue_style(), wp_add_inline_script(), wp_add_inline_style() fonksiyonları tercih edilebilir.

Buradan çıkarabileceğimiz bir diğer sonuç da WordPress’in yüklenmeye başlamasından sonlanmasına kadar geçen süreçte, her fonksiyonun veya nesnenin, her aşamada kullanılabilir olmadığıdır. Örneğin tek bir gönderinin gösteriliyor olup olmadığını teyit için kullanılan is_single() fonksiyonunu, “init” eylem filtresi içerisinde kullanırsak çalışmayacaktır, fakat “wp” eylem filtresi içerisinde kullanırsak çalışacaktır.

Kaynaklar:

https://codex.wordpress.org/Plugin_API
https://codex.wordpress.org/Plugin_API/Filter_Reference
https://developer.wordpress.org/reference/functions/add_filter/
https://codex.wordpress.org/Plugin_API/Filter_Reference/the_content
https://codex.wordpress.org/Plugin_API/Action_Reference
https://developer.wordpress.org/reference/functions/add_action/
https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head
https://codex.wordpress.org/Plugin_API/Action_Reference/send_headers
https://www.wikizero.com/en/Hooking
https://www.wikizero.com/en/Application_programming_interface

Kaynak: https://volkan.xyz

 

Bu yazıyı yalnızca kaynak göstererek ve önceden belirtilen Kullanım Koşulları altında paylaşabilirsiniz.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir