Pengganti WP-Cron
Queuety dapat menggantikan sistem WordPress cron bawaan. Saat diaktifkan, pemanggilan wp_schedule_event() akan dicegat dan diarahkan melalui penjadwal Queuety alih-alih mekanisme WP-Cron default. Event dirancang untuk diproses oleh worker Queuety, yang menjalankan tugas terlepas dari lalu lintas situs.
Batasan saat ini: bridge membuat jadwal Queuety, tetapi worker tidak memiliki handler untuk job
__queuety_cron_{hook}yang dihasilkannya, sehingga callback WordPress asli tidak pernah dijalankan. Setiap job gagal, dicoba ulang dengan jeda bertahap, lalu akhirnya dikubur (#9). Jangan aktifkan bridge di situs yang event cron-nya harus berjalan sampai masalah ini diperbaiki.
Mengaktifkan pengganti
Panggil Queuety::replace_wp_cron() lebih awal saat inisialisasi plugin atau tema Anda:
use Queuety\Queuety;
Queuety::replace_wp_cron();
Biasanya ini dipanggil di file utama plugin atau pada hook plugins_loaded. Ini harus dipanggil saat WordPress dimuat (plugin harus aktif).
Yang diintersepsi
Bridge cron terhubung ke tiga filter WordPress:
| Fungsi WordPress | Filter yang dipasang hook | Perilaku |
|---|---|---|
wp_schedule_event() |
pre_schedule_event |
Membuat jadwal Queuety dengan interval yang sama |
wp_unschedule_event() |
pre_unschedule_event |
Menghapus jadwal Queuety yang sesuai |
wp_get_scheduled_event() |
pre_get_scheduled_event |
Mengembalikan data jadwal dari Queuety |
Hanya event berulang (yang memiliki properti schedule seperti hourly, twicedaily, daily) yang diintersepsi. Event sekali jalan yang dijadwalkan dengan wp_schedule_single_event() tidak diintersepsi.
Cara pemetaan event
Saat plugin memanggil wp_schedule_event(), Queuety mencari nama jadwal melalui wp_get_schedules(), membuat jadwal Queuety dengan nama handler __queuety_cron_{hook}, lalu menyimpan nama hook WordPress asli dan argumennya dalam payload jadwal.
Perilaku yang diharapkan adalah worker Queuety yang memproses job terjadwal memanggil do_action() dengan nama hook dan argumen asli, sehingga callback WordPress yang ada berjalan dengan Queuety mengatur waktunya. CronBridge::process_cron_event() menerapkan pemanggilan tersebut, tetapi belum ada yang memanggilnya (lihat batasan di atas). Jadwal juga hanya dievaluasi oleh proses wp queuety work yang berjalan lama, kira-kira sekali per menit (lihat Penjadwalan).
Resolusi interval
Bridge mencari nama jadwal melalui wp_get_schedules() terlebih dahulu, lalu menggunakan nilai bawaan:
| Nama jadwal | Interval |
|---|---|
hourly |
3,600 detik |
twicedaily |
43,200 detik |
daily |
86,400 detik |
weekly |
604,800 detik |
Interval jadwal khusus yang didaftarkan melalui filter cron_schedules didukung selama wp_get_schedules() mengembalikannya.
Memulihkan WP-Cron
Untuk kembali ke sistem WordPress cron bawaan:
Queuety::restore_wp_cron();
Ini menghapus hook filter dan memungkinkan WordPress menangani event cron lagi melalui mekanisme bawaannya. Perhatikan bahwa DISABLE_WP_CRON ditetapkan sebagai true saat bridge dipasang dan tidak dapat dibatalkan saat runtime, jadi Anda mungkin perlu menghapus konstanta tersebut dari wp-config.php atau memulai ulang proses.
Kapan menggunakannya
Pengganti ini paling berguna ketika situs Anda memiliki lalu lintas rendah, ketika Anda membutuhkan waktu yang lebih andal daripada yang dapat diberikan WP-Cron, atau ketika Anda sudah menjalankan worker Queuety dan ingin eksekusi cron berada dalam sistem operasional yang sama. Ini juga membantu ketika observabilitas terpusat penting, karena event cron akan muncul di log dan metrik yang sama dengan pekerjaan antrean lainnya.
Batasan
Ada beberapa batasan penting. Worker Queuety yang aktif diperlukan; jika tidak, event terjadwal tidak akan pernah berjalan. Hanya jadwal berulang yang diintersepsi; event sekali jalan yang dibuat dengan wp_schedule_single_event() tetap berada di luar bridge. replace_wp_cron() juga menetapkan DISABLE_WP_CRON untuk sisa proses PHP saat ini, sehingga restore_wp_cron() menghapus hook tetapi tidak dapat membatalkan konstanta tersebut. Terakhir, bridge hanya berfungsi saat WordPress dimuat, karena bergantung pada filter WordPress dan do_action().
Contoh: penyiapan lengkap
use Queuety\Queuety;
// In your plugin's main file.
add_action( 'plugins_loaded', function () {
Queuety::replace_wp_cron();
} );
Anda tidak perlu memanggil Queuety::init() di sini: plugin Queuety yang aktif membuat koneksinya dari kredensial database WordPress dan menginisialisasi dirinya pada plugins_loaded. replace_wp_cron() hanya memasang filter, jadi tidak bergantung pada proses tersebut yang sudah berjalan lebih dahulu.
Setelah ini, event berulang yang didaftarkan plugin dengan wp_schedule_event() disimpan sebagai jadwal Queuety. Sampai #9 diperbaiki, callback-nya tidak berjalan.