Perbedaan Antara Filter dan Action Hooks?

51

Saya telah melihat API plugin sedikit lebih mendalam baru-baru ini dan saya bertanya-tanya apa perbedaan nyata antara tindakan dan filter hooks . Keduanya adalah peristiwa yang menerima data sebagai parameter dan mereka tampaknya dapat melakukan hal yang sama.

Jelas saya melihat bahwa tindakan dipanggil saat tindakan berlangsung dan filter dipanggil saat data dimanipulasi, tetapi tampaknya itu hanya perbedaan penamaan semantik.

Selain semantik dan untuk apa mereka digunakan, perbedaan nyata apa yang ada di antara mereka?

Dengan sopan
sumber

Jawaban:

58

Hai @Sruly :

Anda sudah cukup banyak menjawab pertanyaan Anda sendiri, tetapi saya akan sedikit menguraikan.

Kait Aksi

Actions Hooks dimaksudkan untuk digunakan ketika WordPress inti atau beberapa plugin atau tema memberi Anda kesempatan untuk memasukkan kode Anda pada titik tertentu dan melakukan satu atau lebih hal berikut ini:

  1. Gunakan echountuk menyuntikkan beberapa HTML atau konten lain ke buffer respon,
  2. Ubah status variabel global untuk satu atau lebih variabel, dan / atau
  3. Ubah parameter yang diteruskan ke fungsi hook Anda (dengan asumsi hook dipanggil oleh do_action_ref_array()alih-alih do_action()karena yang terakhir tidak mendukung lewat variabel oleh-referensi .)

Kait Filter

Filter Hooks berperilaku sangat mirip dengan Hooks Aksi tetapi tujuan penggunaannya adalah untuk menerima nilai dan berpotensi mengembalikan versi nilai yang dimodifikasi. Hook filter juga dapat digunakan seperti Hook Aksi yaitu untuk memodifikasi variabel global atau menghasilkan beberapa HTML, dengan asumsi itulah yang perlu Anda lakukan ketika hook dipanggil. Satu hal yang sangat penting tentang Filter Hooks yang tidak perlu Anda khawatirkan dengan Action Hooks adalah bahwa orang yang menggunakan Filter Hook harus mengembalikan (versi modifikasi dari) parameter pertama yang dilewatkan. Kesalahan pemula yang baru adalah lupa mengembalikan nilai itu!

Menggunakan Parameter Tambahan untuk Memberikan Konteks dalam Filter Hooks

Sebagai tambahan saya merasa bahwa Filter Hooks tertatih-tatih di versi WordPress sebelumnya karena mereka hanya akan menerima satu parameter; yaitu mereka akan mendapatkan nilai untuk mengubah tetapi tidak ada parameter ke-2 atau ke-3 untuk memberikan konteks apa pun. Namun belakangan, dan secara positif, sepertinya tim inti WordPress dengan gembira (bagi saya) telah menambahkan parameter tambahan ke Filter Hooks sehingga Anda dapat menemukan lebih banyak konteks. Contoh yang bagus adalah posts_wherehook; Saya percaya beberapa versi di belakangnya hanya menerima satu parameter menjadi " SQL " kueri saat ini tetapi sekarang ia menerima klausa mana dan referensi ke instance instance dari WP_Querykelas yang menggunakan hook.

Jadi apa perbedaan nyata?

Pada kenyataannya Filter Hooks cukup banyak superset dari Action Hooks. Yang pertama dapat melakukan apa pun yang dapat dilakukan yang terakhir dan sedikit lebih meskipun pengembang tidak memiliki tanggung jawab untuk mengembalikan nilai dengan Action Hook yang dia lakukan dengan Hook Filter.

Memberikan Bimbingan dan Tujuan Telegraphing

Tapi itu mungkin bukan yang penting. Saya pikir apa yang penting adalah bahwa oleh pengembang memilih untuk menggunakan Action Hook vs Filter Hook atau sebaliknya mereka telegraphing maksud mereka dan dengan demikian memberikan panduan kepada themer atau pengembang plugin yang mungkin menggunakan hook. Pada dasarnya mereka mengatakan, "Aku akan memanggilmu, melakukan apa pun yang perlu kamu lakukan" ATAU "Aku akan memberimu nilai ini untuk dimodifikasi tetapi pastikan kamu mengembalikannya ."

Jadi pada akhirnya saya berpikir bahwa panduan yang disediakan oleh pilihan tipe kait adalah nilai nyata di balik perbedaan . IMO, pokoknya.

Semoga ini membantu!

MikeSchinkel
sumber
Bagi saya sepertinya Anda bisa saja menggunakan filter untuk semuanya, karena mengembalikan variabel adalah opsional dalam PHP. Adakah yang tahu mengapa pengembang WordPress memilih untuk memiliki dua istilah terpisah? Apakah ini murni karena alasan semantik? Secara teknis saya tidak bisa melihat perlunya ...
TheStoryCoder
2
@TheStoryCoder "Apakah ini murni karena alasan semantik?" Sepertinya itulah yang dijelaskan oleh jawaban saya, lima (5) tahun yang lalu ...?
MikeSchinkel
11

Jika Anda melihat sumber untuk add_action()fungsi inti, itu hanya pembungkus untuk add_filter()fungsi ...

Dan jika Anda melihat do_action()fungsi inti, ini sangat mirip dengan apply_filters()fungsi inti, dengan satu perbedaan utama: tidak mengembalikan nilai.

Jadi apa artinya ini? tindakan seperti filter, kecuali tindakan tidak mengembalikan nilai, jadi Anda tidak dapat mengubah data. Ini menunjukkan bahwa itu sederhana untuk membuat mekanisme aksi WordPress dengan hanya menyalin mekanisme filter, dan tidak mengembalikan nilai. Pada dasarnya, yang dapat Anda lakukan dengan suatu tindakan hanyalah menjalankan fungsi tanpa mengubah beberapa nilai.

trusktr
sumber
5

Dengan kata sederhana.

Actions adalah fungsi-fungsi PHP yang menjalankan output.

Filter adalah fungsi-fungsi PHP yang mengembalikan output.

Diperbarui: Kami dapat memperluas plugin apa pun yang menggunakan tindakan dan filter tanpa mengubah kode di sana. Dengan menambahkan filter dan tindakan di tema atau plugin kita sendiri.


Cara Penggunaan?

Tindakan:

Lihat contoh sederhana di bawah ini di functions.phpfile tema Anda .

  1. Contoh Satu: (Contoh PHP sederhana)
tes fungsi () {
     gema "Keluaran";
}

uji();

Program di atas mencetak output:

Keluaran

[CATATAN: Ini tes () cukup panggil fungsi. Dan jalankan fungsi callback 'test'.]


  1. Contoh Dua: (Penggunaan Aksi Sederhana)
function test1 () {
     gema "Keluaran";
}
add_action ('test', 'test1');

do_action ('test');

Program di atas mencetak output:

Keluaran

[CATATAN: Ini do_action('test')berfungsi seperti fungsi panggilan. Dan jalankan fungsi callback 'test1'.]


  1. Contoh Tiga: (Penggunaan lain dari Tindakan)
function test2 () {
     gema "Tes 2";
}
add_action ('test', 'test2', 1);

function test1 () {
     gema "Tes 1";
}
add_action ('test', 'test1', 2);

do_action ('test');

Program di atas mencetak output:

Tes 2 Tes 1

[CATATAN: Ini do_action('test')berfungsi seperti fungsi panggilan. Dan menjalankan fungsi callback pada prioritas itu.

Fungsi panggilan balik 'test1' memiliki prioritas 2 Dan 'test2' memiliki prioritas 1.]

Jika prioritas berubah seperti 'test1' dengan prioritas 1 Dan 'test2' dengan prioritas 2 maka output akan menjadi:

Tes 1 Tes 2

  1. Contoh Empat: (dukungan pihak ketiga) Tambahkan kode di bawah ini difunctions.php
function test1 () {
     do_action ('test_before');
     gema "Tes 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('test');

Program di atas mencetak output:

Tes 1

Sekarang, Buat contoh plugin untuk memeriksa cara kerjanya untuk Pengembang pihak ke-3.

  1. Buat folder 'sederhana' di /wp-content/plugins/direktori.
  2. Buat file bernama 'simple.php' dan tambahkan kode di bawah ini.
/ *
* Nama Plugin: Plugin Sederhana
* /
function test_callback_function () {
     gema "Dari plugin";
}
add_action ('test', 'test_callback_function');

Sekarang, Aktifkan plugin sederhana kami dari dashboard admin WordPress.

Goto menu plugin dan aktifkan.

Setelah mengaktifkan plugin di atas program, cetak hasilnya:

Uji 1dari plugin

[CATATAN: Jika kami menambahkan prioritas untuk tindakan plugin kami dari 1 hingga 9, maka itu mencetak hasilnya seperti:

Dari pluginTest 1

Karena, WordPress mempertimbangkan 10 priority by defaultuntuk semua tindakan yang ditambahkan.]

Filter

Lihat contoh di bawah ini:

Contoh PHP sederhana:

$ data = array ('one', 'two');
print_r ($ data);

Program di atas mencetak output:

Array ([0] => satu [1] => dua)
  1. Contoh Satu: (Penggunaan sederhana Filter)
$ data = apply_filters ('my_filter_name', array ('one', 'two'));
print_r ($ data);

add_filter ('my_filter_name', function ($ old_data) {
     return array ('tiga', 'empat');
});

Program di atas mencetak output:

Array ([0] => tiga [1] => empat)

Di sini, Kami telah menambahkan filter my_filter_namedan mengubah output yang ada array( 'one', 'two' )dengan array( 'three', 'four' )tanpa mengubah file tema / plugin.


maheshwaghmare
sumber
Terima kasih @maheshwaghmare untuk trik sederhana ini. tolong tulis tentang 'Filter' juga
Adi
Apa yang sebenarnya Anda maksud dengan "segera"?
Rapti
@Rapti Maaf atas keterlambatan. Malam ini saya akan menambahkan jawaban terkait filter. Di masa depan saya akan membuat artikel deskriptif tentang Hooks (Tindakan & Filter).
maheshwaghmare
@maheshwaghmare banyak menunda-nunda? : P
Penjelasan yang bagus, saya memiliki pemahaman yang lebih baik sekarang
budiantoip