Reemplazo de WP-Cron
Queuety puede reemplazar el sistema WordPress cron integrado. Al activarse, las llamadas a wp_schedule_event() se interceptan y se redirigen al programador de Queuety en lugar de usar el mecanismo predeterminado de WP-Cron. Los eventos están pensados para que los procese el trabajador Queuety, que permite ejecutarlos independientemente del tráfico del sitio.
Limitación actual: el puente crea las programaciones de Queuety, pero el trabajador no tiene un controlador para los trabajos de
__queuety_cron_{hook}que generan, por lo que las devoluciones de llamada originales de WordPress nunca se ejecutan. Cada trabajo falla, se vuelve a intentar con un intervalo de espera y finalmente queda enterrado (#9). No active el puente en un sitio cuyos eventos de cron deban ejecutarse hasta que se corrija el problema.
Activar el reemplazo
Llame a Queuety::replace_wp_cron() al principio de la inicialización del plugin o del tema:
use Queuety\Queuety;
Queuety::replace_wp_cron();
Normalmente, esto se llama en el archivo principal del plugin o en un hook plugins_loaded. Debe llamarse mientras WordPress esté cargado (el plugin debe estar activo).
Qué intercepta
El puente cron se conecta a tres filtros WordPress:
| Función de WordPress | Filtro conectado | Comportamiento |
|---|---|---|
wp_schedule_event() |
pre_schedule_event |
Crea una programación de Queuety con el mismo intervalo |
wp_unschedule_event() |
pre_unschedule_event |
Elimina la programación correspondiente de Queuety |
wp_get_scheduled_event() |
pre_get_scheduled_event |
Devuelve los datos de programación de Queuety |
Solo se interceptan los eventos recurrentes (los que tienen una propiedad schedule como hourly, twicedaily o daily). Los eventos de una sola ejecución programados con wp_schedule_single_event() no se interceptan.
Cómo se asignan los eventos
Cuando un plugin llama a wp_schedule_event(), Queuety resuelve el nombre de la programación mediante wp_get_schedules(), crea una programación de Queuety con el nombre del controlador __queuety_cron_{hook} y guarda el nombre original del hook WordPress y sus argumentos en los datos de la programación.
La idea es que el trabajador Queuety que procesa el trabajo programado llame a do_action() con el nombre original del hook y sus argumentos, de modo que las devoluciones de llamada existentes de WordPress se ejecuten según los tiempos que determine Queuety. CronBridge::process_cron_event() implementa esa llamada, pero aún no hay nada que la invoque (consulte la limitación anterior). Además, las programaciones solo se evalúan en un proceso wp queuety work de larga duración, aproximadamente una vez por minuto (consulte Programación).
Resolución de intervalos
El puente resuelve primero los nombres de programación mediante wp_get_schedules() y, si no los encuentra, recurre a los valores predeterminados integrados:
| Nombre de la programación | Intervalo |
|---|---|
hourly |
3,600 segundos |
twicedaily |
43,200 segundos |
daily |
86,400 segundos |
weekly |
604,800 segundos |
Se admiten intervalos de programación personalizados registrados mediante el filtro cron_schedules, siempre que wp_get_schedules() los devuelva.
Restaurar WP-Cron
Para volver al sistema predeterminado de WordPress cron:
Queuety::restore_wp_cron();
Esto elimina los hooks de filtro y permite que WordPress vuelva a gestionar los eventos de cron mediante el mecanismo integrado. Tenga en cuenta que DISABLE_WP_CRON se define como true al instalar el puente y no se puede desdefinir durante la ejecución; quizá deba eliminar esa constante de wp-config.php o reiniciar el proceso.
Cuándo usarlo
El reemplazo resulta especialmente útil si su sitio tiene poco tráfico, si necesita una programación más fiable que la que puede ofrecer WP-Cron o si ya ejecuta trabajadores Queuety y quiere que la ejecución de cron forme parte del mismo sistema operativo. También facilita la observabilidad centralizada, ya que los eventos de cron aparecen en los mismos registros y métricas que el resto del trabajo de la cola.
Limitaciones
Hay varias limitaciones importantes. Se necesita un trabajador Queuety activo; de lo contrario, los eventos programados nunca se ejecutarán. Solo se interceptan las programaciones recurrentes; los eventos de una sola ejecución creados con wp_schedule_single_event() quedan fuera del puente. replace_wp_cron() también define DISABLE_WP_CRON durante el resto del proceso actual de PHP, por lo que restore_wp_cron() elimina los hooks, pero no puede desdefinir la constante. Por último, el puente solo funciona si WordPress está cargado, ya que depende de los filtros WordPress y de do_action().
Ejemplo: configuración completa
use Queuety\Queuety;
// In your plugin's main file.
add_action( 'plugins_loaded', function () {
Queuety::replace_wp_cron();
} );
No es necesario llamar a Queuety::init() aquí: el plugin activo Queuety crea su conexión con las credenciales de la base de datos de WordPress y se inicializa en plugins_loaded. replace_wp_cron() solo instala los filtros, por lo que no depende de que eso haya ocurrido antes.
Después de esto, los eventos recurrentes que los plugins registren con wp_schedule_event() se guardarán como programaciones de Queuety. Hasta que se corrija #9, sus devoluciones de llamada no se ejecutarán.