Filtreler ve kancalar gerçekten PHP'de nasıl çalışır?


21

Filtreler ve kancalar gerçekten WordPress'te nasıl çalışır?

Gelişmiş bir şey soruyorum. PHP'de nasıl uygulanır? Örneğin, farklı kancalardaki tüm kancaları nasıl toplar ve bunları çekirdek kancalarına vb. "Bağlar".


2
Bildiğim kadarıyla php'de 'kanca' veya 'filtre' yok, fonksiyonlar var. Wordpress, yürütmeden önce başka işlevlerin geri çağrılmasını kullanan özel işlevlere sahiptir.
Ofir Baruch


3
@OfirBaruch, OP'nin WordPress'teki uygulamalarına atıfta bulunduğundan eminim ve bunun bazı yerel PHP uygulamaları olduğunu düşünmemiştim.
Tom Auger,

Yanıtlar:


33

genel bakış

Temel olarak, Filtreleri ve Kancaları toplayan " Eklenti API "'si aşağıdaki işlevlerden oluşur:

  1. apply_filters()- yürüt
  2. do_action- yürüt
  3. apply_filters_ref_array()- yürüt
  4. do_action_ref_array()- yürüt
  5. add_filter()- yığına ekle
  6. add_action()- yığına ekle

Temel iç

Genel olarak, birkaç küresel kelime var (WordPress dünyasında başka neler var):

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Birincisi , tüm filtre adlarını altdiziler olarak tutan $wp_filterbir geneldir Array. Bu alt dizilerin her biri daha sonra bir öncelik dizisi altında toplanan geri çağrılar olan daha fazla alt diziyi tutar.

Kısa derinliği

Bir yürütme işlevi çağrıldığında, WordPress bu küre dizilerini bu ada sahip anahtarlar için arar. Ardından ekli geri aramalar öncelikten sonra öncelikli olur. Ön tarafta olan tek şey, allfiltreye takılan geri çağrılardır .

add_actionVeya kullanarak bir geri arama eklediğinizde add_filter, WordPress ilk önce zaten eklenmiş geri aramaların üzerine yazmamak için "benzersiz" bir kimlik hesaplar.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Sonra geri çağrınızı global $wp_filteryığına ekler :

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Gördüğünüz gibi ana alt dizi $tag(veya action / filter name), sonra her şey belirli bir öncelik altında toplanır ve sonra "benzersiz" geri arama / ID dizesi anahtar olarak kullanılır.

Daha sonra, bir filtre çağrıldığında - $tag/ action- / filter-name ile oluyor - dizi aranır ve geri aramalar çağrılır. Kullandığı gibi call_user_func_arraykaç argüman ekli olduğu önemli değil. WordPress bunu kendiliğinden çözer.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
geri aramalardan geçerken, aynı kanca üzerinde birden fazla geri çağırma işleminin aynı önceliğe göre yapılmasını emrettiğini (isteğe bağlı olarak) add_action () ve application_filters () ve varsayılan olarak 10 olarak ayarlayın.
Tom Auger

1
@TomAuger Lütfen cevabınıza ek notlar ve düzenlemeler eklemekten çekinmeyin.
kaiser

5

Kancalar hem WordPress çekirdek dosyalarına hem de bazı ana tema dosyalarına dahil edilir. İçeriği, dosyada belirli bir yere bağlamanızı sağlar.

Bir örnek WordPress'teki wp_head kancasıdır. Bu temayı, bu temaya içerik eklemek için alt temanızda kullanabilirsiniz '

Örnek:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Bazı premium temalar , aynı şeyi yapmak için bir çocuk temasında kullanabileceğiniz eylem kancalarını da içerir . İşte tüm aksiyon kancalarını ve içeriğinizi Genesis tema çerçevesinde çıkardıkları pozisyonu içeren görsel bir harita .

Örnek:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

İşte header.php dosyasını Genesis tema çerçevesinde açtıysanız, kancaya benziyor:

do_action( 'genesis_header' );

İşte size birçok şekilde kullanabileceğiniz WordPress kancalarının bir listesi .

Filtreler , varolan bir işlevin çıktısını değiştirmenizi sağlar ve hem WordPress çekirdek dosyalarına hem de Genesis gibi bazı ana tema çerçevelerine dahil edilir.

Genesis Tasarım Çerçevesi ile kullanabileceğiniz filtrelerin bir listesi

İşte WordPress'e dahil olan filtrelerin listesi

İşte bir filtreyi Genesis gibi bir tema çerçevesinde nasıl kullanabileceğinizi gösteren bir örnek:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Yukarıdaki kod bir alt temada kullanılabilir ve yazarı değiştirmek için yazarı yorumlarınızı yazar. Herhangi bir temada çalışır.

İşte alıntıların uzunluğunu 50 kelimeye ayarlayan başka bir örnek:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

The_excerpt () işlevini wp-include / post-template.php dosyasında bulabilirsiniz.

İşte göründüğü gibi:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Aynı şeyi yapmak için eklentilerdeki kancaları ve filtreleri de kullanabilirsiniz; ana temayı veya WordPress'i güncellediğinizde kod kaybolmaz.

Temel olarak, kancalar ve filtreler, temel WordPress dosyalarını veya ana tema dosyalarınızı düzenlemeden hem WordPress'i hem de ana temanızı özelleştirmenizi ve değiştirmenizi sağlar.

Üst tema çerçevesi, kancalar ve filtreler içerdiğinde alt temaların özelleştirilmesi önemli ölçüde daha kolaydır, çünkü üst tema şablon dosyalarını hiçbir zaman düzenlemeniz gerekmez. Bu şekilde temaları da güvenle değiştirebilirsiniz.


2
Bu, kancalara ve filtrelere genel bir bakış, ancak korkarım OP'nin sorusunu tamamen özlüyorum, bu, kancaların nasıl çalıştığı ve WordPress'in onları nasıl oluşturduğu, sakladığı ve işlediğinin içselleri hakkında. Mükemmel cevap; muhtemelen WP Sitelerindeki eğitiminize bağlantı vermelisiniz.
Tom Auger,

Tamam onu ​​sileceğim. Benim sorunum, soruyu daha iyi okumalıydım, ancak daha önce verilmiş olan cevapların, ilk önce temel bilgileri bilip bilmediklerini anlamayı kolaylaştıracağını düşündüm.
Brad Dalton,

2
Brad, bu bilgiyi burada da kullanmanın faydalı olabileceğini düşündüğüm için geri aldım. Kabul etmiyorsan, beni burada söyle / ping at, sonra tekrar çıkaracağım.
kaiser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.