Dalam functions.php
file saya, saya ingin menghapus filter di bawah ini, tetapi saya tidak yakin bagaimana melakukannya karena ini ada di kelas. Seperti apa seharusnya remove_filter()
?
add_filter('comments_array',array( &$this, 'FbComments' ));
Ada di saluran 88 di sini .
&
dari Anda&$this
, itu adalah hal PHP 4Jawaban:
Itu pertanyaan yang sangat bagus. Itu turun ke jantung gelap dari plugin API dan praktik pemrograman terbaik.
Untuk jawaban berikut ini saya membuat plugin sederhana untuk menggambarkan masalah dengan kode yang mudah dibaca.
Sekarang kita melihat ini:
WordPress membutuhkan nama untuk filter. Kami tidak menyediakan satu, jadi WordPress memanggil
_wp_filter_build_unique_id()
dan membuat satu. Nama ini tidak dapat diprediksi karena digunakanspl_object_hash()
.Jika kita menjalankan
var_export()
pada,$GLOBALS['wp_filter'][ 'wp_footer' ]
kita mendapatkan sesuatu seperti ini sekarang:Untuk menemukan dan menghapus tindakan jahat kita, kita harus melalui filter terkait untuk kait (tindakan hanyalah filter yang sangat sederhana), periksa apakah itu adalah array dan jika objek adalah turunan dari kelas. Lalu kami mengambil prioritas dan menghapus filter, tanpa pernah melihat pengenal yang sebenarnya .
Oke, mari kita fungsi itu:
Kapan kita memanggil fungsi ini? Tidak ada cara untuk mengetahui dengan pasti kapan objek asli dibuat. Mungkin terkadang sebelumnya
'plugins_loaded'
? Mungkin nanti?Kami menggunakan kait yang sama dengan objek yang dikaitkan dan melompat di awal dengan prioritas
0
. Itulah satu-satunya cara untuk benar-benar yakin. Inilah cara kami menghapus metodeprint_message_3()
:Hasil:
Dan itu akan menghapus tindakan dari pertanyaan Anda (tidak diuji):
Kesimpulan
'plugins_loaded'
. Bukan hanya ketika plugin Anda dipanggil oleh WordPress.sumber
plugins_loaded
dipanggil, yang memang untuk apaplugins_loaded
. Tentu saja, instance kelas masih perlu diakses, mungkin melalui pola singleton.remove_action()
Saya tidak yakin tetapi Anda dapat mencoba menggunakan singleton.
Anda harus menyimpan referensi objek di properti statis kelas Anda dan kemudian mengembalikan variabel statis dari metode statis. Sesuatu seperti ini:
sumber
Selama Anda tahu objek (dan Anda menggunakan PHP 5.2 atau lebih tinggi - versi PHP stabil saat ini adalah 5.5, 5.4 masih didukung, 5.3 adalah akhir hidup), Anda bisa menghapusnya dengan
remove_filter()
metode ini. Yang perlu Anda ingat adalah objek, nama-metode, dan prioritas (jika digunakan):Namun Anda melakukan sedikit kesalahan dalam kode Anda. Jangan awali
$this
dengan ampersand&
, yang diperlukan di PHP 4 (!) Dan sudah lama ditunggu. Ini bisa membuat berurusan dengan kait Anda bermasalah, jadi biarkan saja:Dan itu saja.
sumber
$this
dari luar (plugin / tema lain).