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?
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:
Gunakan echountuk menyuntikkan beberapa HTML atau konten lain ke buffer respon,
Ubah status variabel global untuk satu atau lebih variabel, dan / atau
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.
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.
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 .
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'.]
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.
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
Jika Anda melihat sumber untuk
add_action()
fungsi inti, itu hanya pembungkus untukadd_filter()
fungsi ...Dan jika Anda melihat
do_action()
fungsi inti, ini sangat mirip denganapply_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.
sumber
Dengan kata sederhana.
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.php
file tema Anda .Program di atas mencetak output:
[CATATAN: Ini tes () cukup panggil fungsi. Dan jalankan fungsi callback 'test'.]
Program di atas mencetak output:
[CATATAN: Ini
do_action('test')
berfungsi seperti fungsi panggilan. Dan jalankan fungsi callback 'test1'.]Program di atas mencetak output:
[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:
functions.php
Program di atas mencetak output:
Sekarang, Buat contoh plugin untuk memeriksa cara kerjanya untuk Pengembang pihak ke-3.
/wp-content/plugins/
direktori.Sekarang, Aktifkan plugin sederhana kami dari dashboard admin WordPress.
Goto menu plugin dan aktifkan.
Setelah mengaktifkan plugin di atas program, cetak hasilnya:
[CATATAN: Jika kami menambahkan prioritas untuk tindakan plugin kami dari 1 hingga 9, maka itu mencetak hasilnya seperti:
Karena, WordPress mempertimbangkan
10 priority by default
untuk semua tindakan yang ditambahkan.]Filter
Lihat contoh di bawah ini:
Contoh PHP sederhana:
Program di atas mencetak output:
Program di atas mencetak output:
Di sini, Kami telah menambahkan filter
my_filter_name
dan mengubah output yang adaarray( 'one', 'two' )
denganarray( 'three', 'four' )
tanpa mengubah file tema / plugin.sumber