WordPress Hooks (Kancalar): Filter ve Action

WordPress – Visual Composer (VC) shortcode temizliği yazısında kısmen değindiğim add_filter ve add_action ile ilgili detaylı bir anlatımda bulunmanın vakti geldi sanırım.

AA

O halde hızlı bir özetle konuya girişimizi yapalım.

WordPress Hooks

WordPress web sayfalarında tema kodlarına müdahale ederek JS ve CSS değişiklikleri ve kısmi geliştirmeler yapabiliriz. Ancak, konu WordPress’in, temanın veya bir eklentinin davranışlarını değiştirmeye geldiğinde front-end ve/veya functions.php müdahaleleri sınırlı kalacaktır. İşte bu aşamada WordPress Hooks yapılarından faydalanırız. Unutmadan, bu yapıları da yine bir eklenti olarak sunabilir veya sadece functions.php içerisinden işleme alınmasını sağlayabiliriz1.

Hook karşılığı olarak kancayı kullanabiliriz. Plugin API bağlamında sıklıkla değineceğim kancalar bir kod işleminin bir başka kod işlemi ile etkileşime geçmesi ve/veya var olan bir işleme geliştirme/değiştirme amacıyla müdahale etmesi olarak ifade edilebilir2 3. Hook olarak ifade edilmesinin nedeni, var olan işlemler hali hazırda WordPress tarafından zatın yürütülmekteler. WordPress 2.1 sürümü ile kullanıma kavuşan hook ifadelerini kullanarak yürütülen WordPress işlemlerine entegre olabilen ek işlemler oluştururuz. Yani bir action ve/veya filter’a ilişik bir işlem gerçekleştirildiğinde, işlemin uygulanması için ilişik olduğu fonksiyonun da tetiklenmiş olması gerekir.

Hemen bir örnekle özetleyeyim;

add_filter( 'the_content', 'removeVCShortcodes' );
function removeVCShortcodes( $currentContent ) {
    $cleanContent = preg_replace('/\[(.*?)\]/', '', $currentContent );
    return $cleanContent;
}

Yukarıdaki add_filter işlemi the_content() fonksiyonuna müdahale etmektedir. Dolayısıyla bu fonksiyonun kullanıldığı alanlarda işleme alınır. Fonksiyon içeriğinin ise bir karşılığının olup olmaması önemli değil. Yani, fonksiyon içerisinde bir regex şablon oluşturduk ve bu şablon Visual Composer etiketlerini filtrelemekte. Şayet, içerikte bu eklentiye ait etiket kullanılmamışsa şablon preg_replace('/\[(.*?)\]/', '', $currentContent ); sonucunda sonucunda bir işlem gerçekleştir(a)memiş olacaktır. Bu işlem içerik sürecine ilişirken the_content() yerine publish_post() kullanmış olsaydık ilgili işlem içeriğin veri tabanına eklendiği aşamada işleme alınmış olurdu. Hooks yapısını açıklamaya devam edelim. WordPress Core içeriğinde ilişkilendirilebilir pek çok işlem yürütmektedir. Hooks, eklentilerin ve temaların WordPress Core ile nasıl etkileşime girdiğinin de temelini oluştururlar. Ancak, Core’un kendisi de yaygın olarak hooks yapılarını kullanmaktadır.

Action (add_action()) ve Filter (add_filer())

Wordpress iki tür hook kullanımına sahip; actions (eylemler) ve filters (filtreler). Kimi zaman hooks ifadelerinin actions ve filters dışında da kullanıldığına denk gelebilirsiniz4. Ancak, işin özünde WordPress çekirdeğinin yer aldığını ve kancaların bu çekirdek ile doğrudan ya da dolaylı olarak işlemler gerçekleştirdiğini bilmeniz yeterli. Her iki kancanın da kullanılabilmek için, Callback olarak bilinen özel bir fonksiyona yine bir fonksiyon ile iliştirilmesi gerekir. Örneğin;

add_filter( 'the_content', 'fonksiyon-adi-1' );
function fonksiyon-adi-1(){
/* ... */
}
add_action( 'woocommerce_thankyou', 'fonksiyon-adi-2' );
function fonksiyon-adi-2(){
/* ... */
}

İlk fonksiyon olan fonksiyon-adi-1() görüldüğü üzere add_filter() içerisinden çağırılmakta ve bunun sonucunda fonksiyon içerisinde uygulanan işlemin (filtreleme) sonucu the_content()‘e uygulanmakta. Bir diğer örnekte ise fonksiyon-adi-2() içeriği woocommerce_thankyou işlemine ilişkilenmektedir. Bu örneği WooCommerce – Facebook dönüşüm kodu tanımlama işleminde, WooCommerce ödeme sonuç sayfasında dönüşüm kodunun tetiklenmesi amacıyla kullanmıştık.

add_action()

Action (add_action) veri eklememizi veya WordPress işleminin çalışma şekline müdahale etmemizi sağlar. Callback fonksiyonları WordPress işlemlerinde spesifik bir noktada çalışırlar ve kullanıcının belirttiği çıktıları (tema ve eklentilerde) ve/veya veritabanı müdahaleleri gibi belirli görevleri gerçekleştirebilirler5.

add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 );
  • $tag filtreleme ve genişletme yapılacak fonksiyon (string)
  • $function_to_add filtre / genişletme amacıyla oluşturduğumuz fonksiyon (callable)
  • $priority filtrenin uygulanma önceliği (int). Boş bırakılması durumunda 10 değerini alır.
  • $accepted_args shortcode kullanımında ve/veya fonksiyon için gerekli olabilecek ek değerler için kullanılır (int). Boş bırakılırsa 1 değerini alır.

add_action() kullanımında en azından $tag ve $function_to_add kullanımlası gerekir. init‘e ilişecek bir fonksiyon tanımlamak istersek en temelde şu callback fonksiyonu işimizi görecektir.

add_action('init', 'newCallbackFunction');
function newCallbackFunction(){
    // gerçekleştirilecek işlemler
}

Kullanılabilecek fonksiyonlar şu şekildedir:

Fonksiyon Açıklama
has_action() İlgili herhangi bir hook tanımının yapılıp yapılmadığını kontrol eder.
add_action() Bir hook fonksiyonunun işleme alınmasını sağlar.
do_action() Birden fazla fonksiyonu tek bir hook ile ilişkilendirerek kullanabilmemizi sağlar.
do_action_ref_array() do_action()'a ek olarak argümanları dizi (array) olarak sıralayabilmemizi mümkün kılar.
did_action() İlgili hook’un kaç kez işlendiği bilgisini döner.
remove_action() Spesifik bir action hook’a ilişkilendirilmiş olan bir diğer fonksiyonu işlemden alır.
remove_all_actions() İlgili spesifik action hook ile ilişkili olan tüm diğer fonksiyonları işlemden alır.
doing_action() Bir action hook’un işlemde / aktif olup olmadığını kontrol etmemizi / görmemizi sağlar.

add_filter()

Filter (add_filter), WordPress’in yürütülmesi sırasında işlenen verileri değiştirme imkanı sunar. Filtreler için Callback fonksiyonu bir değişkeni kabul eder, değiştirir ve döndürür. Tüm bu işlem yalıtılmış bir şekilde uygulanır ve asla global değişkenleri ve çıktıları etkilemezler. Kullanımı şu şekildedir:

add_filter( $tag, $function_to_add, $priority, $accepted_args);
  • $tag filtreleme ve genişletme yapılacak fonksiyon (string)
  • $function_to_add filtre / genişletme amacıyla oluşturduğumuz fonksiyon (callable)
  • $priority filtrenin uygulanma önceliği (int). Boş bırakılması durumunda 10 değerini alır.
  • $accepted_args shortcode kullanımında ve/veya fonksiyon için gerekli olabilecek ek değerler için kullanılır (int). Boş bırakılırsa 1 değerini alır.

Kullanılabilecek fonksiyonlar şu şekildedir:

Fonksiyon Açıklama
has_filter() İlgili bir filtrenin bir hook olarak tanımlanıp tanımlanmadığını kontrol eder.
add_filter() Bir fonksiyon veya metotu filter hook olarak işleme almamızı sağlar.
apply_filters() Bir filter hook’a iliştirilmiş fonksiyonları çağırır.
apply_filters_ref_array() Spesifik bir filter hook’a iliştirilmiş fonksiyonları dizi olarak işleme almamızı sağlar.
current_filter() Aktif durumdaki bir filter hook’u döndürür.
remove_filter() Spesifik olarak bir filter hook ile ilişkilendirilmiş fonksiyonu işlemden alır.
remove_all_filters() Spesifik olarak bir filter hook ile ilişkilendirilmiş tüm fonksiyonları işlemden alır.
doing_filter() Bir filter hook’un işlem gerçekleştirip gerçekleştirmediğini kontrol etmemizi / görmemizi sağlar.

Fonksiyon Aktifleştirme/Pasifleştirme/Kaldırma

  • register_activation_hook()
  • register_uninstall_hook()
  • register_deactivation_hook()

Temel bilgileri ve özellikleri kullanarak mümkün olduğu kadar sade bir şekilde actions ve filters hook’tan bahsetmeye çalıştım. Zaman içerisinde yine eklemelerim olacaktır. İlerleyen yazılarda ise ilgili fonksiyonlar ve kullanım örneklerinin sıklıkla yer vereceğim. Bu sayede işlemlerin daha da netlik kazanacağını düşünüyorum. Ayrıca, ek sorular ve sorunlarınız olursa yorum olarak ekleyebilir ve/veya mesaj olarak iletebilirsiniz. Aşağıda, ayrıca işe yarayacağını düşündüğüm ek birkaç kaynağı listeledim.