Filtre ve Eylem Kancaları Arasındaki Fark?


51

Eklenti API'sine son zamanlarda biraz daha derinlemesine bakıyordum ve eylem ile filtre kancaları arasındaki gerçek farkların ne olduğunu merak ediyordum . İkisi de parametre olarak veri alan olaylardır ve her ikisinin de aynı şeyleri yapabileceği görülmektedir.

Açıkçası, eylemler gerçekleştiğinde eylemlerin çağrıldığını ve veriler manipüle edildiğinde filtrelerin çağrıldığını görüyorum, ancak bu sadece anlamsal bir adlandırma farkı gibi görünüyor.

Anlambilim dışında ve ne için kullanıldığı, aralarında ne gibi gerçek farklılıklar var?

Yanıtlar:


58

Merhaba @Sruly :

Kendi sorunuzu hemen hemen cevapladınız, ancak ben biraz daha ayrıntılı olacağım.

Eylem Kancaları

Eylemler Hooks , WordPress çekirdeği veya bir eklenti veya tema, kodunuzu belirli bir noktaya koyma ve aşağıdakilerden birini veya birkaçını yapma fırsatı verirken kullanılmak üzere tasarlanmıştır:

  1. Kullanım echoiçin bazı HTML enjekte tepki tampon içine veya başka bir içeriği,
  2. Bir veya daha fazla değişken için genel değişken durumunu ve / veya
  3. Kanca işlevinize geçirilen parametreleri değiştirin ( ikincisi do_action_ref_array()yerine do_action()değişkenleri referans alarak desteklemediği için kancanın yerine çağrıldığı varsayılır .)

Filtre Kancaları

Filtre Kancaları , Eylem Kancalara çok benzer davranır, ancak kullanım amaçları bir değer almak ve potansiyel olarak değerin değiştirilmiş bir halini döndürmektir. Bir filtre kancası, aynı zamanda bir Eylem Kancası gibi, yani genel bir değişkeni değiştirmek veya bazı HTML oluşturmak için, kanca çağrıldığında yapmanız gereken şeyin ne olduğunu varsayarak da kullanılabilir. Action Hooks ile endişelenmeniz gerekmeyen Filter Hooks hakkında çok önemli olan bir şey, Filter Hook kullanan kişinin geçtiği ilk parametrenin (değiştirilmiş bir versiyonunu) geri göndermesi gerektiğidir . Yaygın bir acemi hata bu değeri iade etmeyi unutmaktır!

Filtre Kancalarında Bağlam Sağlamak İçin Ek Parametreler Kullanma

Bir kenara , Filtre Kancalarının WordPress'in önceki sürümlerinde tutulduğunu hissettim, çünkü sadece bir parametre alacaklardı; yani, değiştirilecek bir değer elde edeceklerdir ancak herhangi bir bağlam sağlayacak 2. veya 3. parametrelere sahip olmayacaklardır. Ancak son zamanlarda ve olumlu bir şekilde, WordPress çekirdek ekibinin keyifli bir şekilde (benim için) Filter Hooks'a ek parametreler eklediği ve böylece daha fazla bağlam keşfedebildiğiniz anlaşılıyor. İyi bir örnek posts_wherekancadır; Birkaç versiyonları sadece şimdiki sorgunun olmanın bir parametre kabul geri inanıyoruz "nerede" sınıfı SQL ama şimdi nerede maddesini hem kabul ve güncel örneği başvurusu WP_Querykanca başlatıyordur sınıfın.

Peki, Gerçek Fark nedir?

Gerçekte, Filter Hooks, hemen hemen Action Hooks'un süper bir parçası. İlki, ikincisinin yapabileceği her şeyi yapabilir ve geliştiricinin, Filtre Kancası ile yaptığı Action Hook ile bir değer döndürme sorumluluğuna sahip olmasa da, biraz daha fazlasını yapabilir.

Rehberlik ve Telgraf Verme Amacı Verme

Ama muhtemelen önemli olan bu değil. Bence asıl önemli olan, bir Geliştiriciden bir Eylem Kancası ya da Filtre Kancası kullanmayı seçen bir geliştirici tarafından ya da tam tersi , niyetlerini telgrafladıkları ve böylece kancayı kullanan tema veya eklenti geliştiricisine rehberlik ettikleri. Özünde ya "Seni arayacağım, ne gerekiyorsa onu yap" ya da " VEYA " Değiştirmek için sana bu değeri vereceğim, ama onu geri verdiğinden emin ol "diyorlar .

Sonuçta , kanca tipi seçimi tarafından sağlanan rehberliğin, ayrımın arkasındaki gerçek değer olduğunu düşünüyorum . IMO, yine de.

Bu yardımcı olur umarım!


Bana göre, PHP'de bir değişken döndürmek isteğe bağlı olduğundan, her şey için yalnızca filtreler kullanmış olabilirsiniz. WordPress geliştiricilerinin neden iki ayrı terim seçtiklerini bilen var mı? Sadece anlamsal nedenlerden dolayı mı? Teknik olarak buna ihtiyacım olduğunu göremiyorum ...
TheStoryCoder

2
@TheStoryCoder "Sadece anlamsal nedenlerden dolayı mı?" Görünüşe göre cevabım tam olarak açıkladı, beş (5) yıl önce ...?
MikeSchinkel

11

Eğer add_action()çekirdek fonksiyonun kaynağına bakarsanız, sadece add_filter()fonksiyon için bir sarmalayıcıdır .

do_action()Çekirdek işlevine bakarsanız, çekirdek işlevine çok benzer apply_filters()bir fark vardır: bir değer döndürmez.

Peki bu ne anlama geliyor? İşlemler, filtreler gibidir, çünkü işlem bir değer döndürmez, bu nedenle verileri değiştiremezsiniz. Yalnızca filtre mekanizmasını kopyalayarak ve bir değer döndürmeyerek WordPress'in eylem mekanizmasını oluşturmanın basit olduğunu gösteriyor. Temel olarak, bir eylemle yapabileceğiniz tek şey, bazı değerleri değiştirmeden basitçe bir işlevi çalıştırmaktır.


5

Basit bir deyişle.

İşlemler çıktıyı çalıştıran PHP fonksiyonlarıdır.

Filtreler çıktıyı döndüren PHP fonksiyonlarıdır.

Güncelleme: Buradaki kodu değiştirmeden eylemleri ve filtreleri kullanan herhangi bir eklentiyi genişletebiliriz. Kendi temamıza veya eklentimize filtreler ve eylemler ekleyerek.


Nasıl kullanılır?

Aksiyon:

Tema functions.phpdosyanızdaki basit örnekleri aşağıda kontrol edin .

  1. Örnek Bir: (Basit PHP örneği)
fonksiyon testi() {
     yankı "Çıktı";
}

Ölçek();

Yukarıdaki program çıktısını yazdırır:

Çıktı

[NOT: İşte test () sadece işlevi çağırın. Ve geri arama işlevini 'test' yapın.


  1. İkinci Örnek: (Basit Eylem Kullanımı)
İşlev test1 () {
     yankı "Çıktı";
}
add_action ('test', 'test1');

do_action ('test');

Yukarıdaki program çıktısını yazdırır:

Çıktı

[NOT: İşte do_action('test')arama fonksiyonu gibi çalışır. Ve geri çağırma işlevini 'test1' yürütün.]


  1. Örnek Üç: (Eylemlerin başka bir kullanımı)
İşlev test2 () {
     eko "Test 2";
}
add_action ('test', 'test2', 1);

İşlev test1 () {
     yankı "Test 1";
}
add_action ('test', 'test1', 2);

do_action ('test');

Yukarıdaki program çıktısını yazdırır:

Test 2Test 1

[NOT: İşte do_action('test')arama fonksiyonu gibi çalışır. Ve geri arama fonksiyonlarını önceliklerine göre yürütün.

Geri arama işlevi 'test1' 2 önceliğe sahiptir ve 'test2' 1 önceliğine sahiptir.

Öncelikler öncelik 1 ile 'test1' ve öncelik 2 ile 'test2' gibi değişiyorsa, çıktı şöyle olacaktır:

Test 1Test 2

  1. Örnek Dört: (3. parti desteği) kod aşağıda eklefunctions.php
İşlev test1 () {
     do_action ('test_before');
     yankı "Test 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('test');

Yukarıdaki program çıktısını yazdırır:

Test 1

Şimdi, 3. parti Geliştirici için nasıl çalıştığını kontrol etmek için örnek bir eklenti oluşturun.

  1. Dizinde 'simple' klasörü oluşturun /wp-content/plugins/.
  2. 'Simple.php' adında bir dosya oluşturun ve aşağıdaki kodu ekleyin.
/ *
* Eklenti Adı: Basit Eklenti
* /
İşlev test_callback_function () {
     echo "Eklentiden";
}
add_action ('test', 'test_callback_function');

Şimdi, Basit eklentimizi WordPress admin panelinden etkinleştirin .

Menü eklentisine gidin ve etkinleştirin.

Programın yukarısındaki eklentiyi etkinleştirdikten sonra çıktı alın:

Eklentiden 1 Test

[NOT: Eklenti işlemimiz için önceliği 1'den 9'a kadar eklersek, çıktı şöyle yazdırır:

PluginTest itibaren 1

Çünkü, WordPress 10 priority by defaulttüm eklenen eylemleri dikkate alır .]

Filtreler

Aşağıdaki örnekleri kontrol edin:

Basit PHP örneği:

$ data = array ('bir', 'iki');
print_r ($ veri);

Yukarıdaki program çıktısını yazdırır:

Dizi ([0] => bir [1] => iki)
  1. Örnek Bir: (Basit Filtre Kullanımı)
$ data = application_filters ('my_filter_name', dizi ('bir', 'iki'));
print_r ($ veri);

add_filter ('my_filter_name', işlev ($ old_data) {
     return dizisi ('üç', 'dört');
});

Yukarıdaki program çıktısını yazdırır:

Dizi ([0] => üç [1] => dört)

Burada, Biz filtreyi ekledik my_filter_nameve mevcut çıkışını değiştirmek array( 'one', 'two' )ile array( 'three', 'four' )teması / eklenti dosyaları değiştirmeden.



Böyle basit bir numara için @ maheshwaghmare teşekkürler. Lütfen 'Filtreler' hakkında da yazınız
Adi

"Yakında" derken tam olarak ne demek istiyorsun?
Rapti

@Rapti Gecikme için üzgünüm. Bu gece filtrelerle ilgili cevabı ekleyeceğim. Gelecekte Hooks (Actions & Filters) ile ilgili açıklayıcı bir makale oluşturacağım.
maheshwaghmare

@ maheshwaghmare fazla ertelemek? : P

İyi açıklama, şimdi daha iyi bir anlayışa
sahibim
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.