
# 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](https://github.com/inline0/queuety/issues/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:

```php
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](https://queuety.inline0.dev/es/docs/features/scheduling)).

### 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:

```php
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

```php
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](https://github.com/inline0/queuety/issues/9), sus devoluciones de llamada no se ejecutarán.
