Jadi ada skenario berikut.
Saya menambahkan tindakan untuk membersihkan log dari database:
add_action( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Sekarang saya ingin menjalankan tindakan ini secara berkala:
wp_schedule_event( current_time( 'timestamp' ), 'daily', 'myplugin_clean_logs' );
dan jalankan secara manual:
do_action( 'myplugin_clean_logs' );
Metode MyPlugin_Logs::clean_logs
mengembalikan jumlah baris yang terpengaruh atau salah jika ada sesuatu yang berlawanan arah.
Sekarang saya ingin menampilkan jumlah baris yang telah dihapus. Saya akan membayangkan sesuatu seperti ini:
$affected_rows = do_action( 'myplugin_clean_logs' );
echo $affected_rows . ' entries have been deleted.';
Tetapi karena do_action
tidak akan mengembalikan nilai apa pun, saya tidak tahu cara mendapatkan nilai kembali.
Haruskah saya mengeksekusi metode langsung pada menjalankan manual, tetapi menggunakan tindakan pada jadwal acara?
Jawaban:
Yang keren adalah filter sama dengan tindakan, hanya saja mengembalikan nilai, jadi setel saja sebagai filter:
add_filter( 'myplugin_clean_logs', array( 'MyPlugin_Logs', 'clean_logs' ) );
Maka sesuatu seperti:
harus diteruskan
$affected_rows
keclean_logs()
(dan fungsi apa pun yang mungkin Anda kaitkanmyplugin_clean_logs
) dan menetapkan kembali nilai kembali$affected_rows
.sumber
do_action()
semuanya tidak lebih dari perincian rumitapply_filters()
:)do_action()
tidak mengembalikan nilai daripada bagaimana merancang solusi yang sesuai dengando_action()
niat. Jika seseorang mampu melakukan apa yang dia minta, jawaban itu pantas menjadi jawaban yang diterima. Pikiran pertama saya adalah memiliki metode bengkok (dengan asumsi OP menggunakan desain OOP untuk plugin ini) jatuhkan hasilnya ke properti yang dilindungi dari kelas plugin dan kemudian menulis getter cepat untuk menariknya di beberapa titik kemudian. Tapi itu hanya ide liar!Tidak pernah menggunakan fungsi ini dan belum menguji ini, tetapi mungkinkah ini berfungsi? do_action_ref_array () .
Jika itu tidak berhasil, mengapa tidak menyaring hal seperti yang disarankan Caspar? Maksud saya, itu adalah tujuan dari filter, dan dalam hal ini jumlah baris yang terpengaruh adalah hal yang disaring. (Saya merindukan MortCore yang lama. Adakah yang ingat bagaimana ia menangani nilai balik, pass-by-reference, dan argumen hanya dengan fungsi tiga parameter tunggal?)
sumber