
# Náhrada za WP-Cron

Queuety může nahradit vestavěný systém WordPress cron. Po aktivaci zachytává volání `wp_schedule_event()` a směruje je přes plánovač Queuety místo výchozího mechanismu WP-Cron. Události má zpracovávat pracovní proces Queuety, který umožňuje spouštění nezávisle na návštěvnosti webu.

> **Aktuální omezení:** most vytváří naplánované úlohy Queuety, ale pracovní proces nemá obslužnou rutinu pro úlohy `__queuety_cron_{hook}`, které vytváří, takže původní zpětná volání WordPress se nikdy nespustí. Každá úloha selže, opakovaně se zkouší spustit s prodlevou a nakonec se odloží ([#9](https://github.com/inline0/queuety/issues/9)). Most neaktivujte na webu, kde se musí spouštět události cron, dokud nebude tato chyba opravena.

## Aktivace náhrady

Zavolejte `Queuety::replace_wp_cron()` na začátku inicializace pluginu nebo šablony:

```php
use Queuety\Queuety;

Queuety::replace_wp_cron();
```

Obvykle se volá v hlavním souboru pluginu nebo v hooku `plugins_loaded`. Je třeba jej zavolat, když je načten WordPress (plugin musí být aktivní).

## Co zachytává

Most cron se připojuje ke třem filtrům WordPress:

| Funkce WordPress | Použitý filtr | Chování |
|---|---|---|
| `wp_schedule_event()` | `pre_schedule_event` | Vytvoří plánovanou úlohu Queuety se stejným intervalem |
| `wp_unschedule_event()` | `pre_unschedule_event` | Odebere odpovídající plánovanou úlohu Queuety |
| `wp_get_scheduled_event()` | `pre_get_scheduled_event` | Vrátí data plánované úlohy z Queuety |

Zachytávají se pouze **opakované** události (ty, které mají vlastnost `schedule`, například `hourly`, `twicedaily`, `daily`). Jednorázové události naplánované pomocí `wp_schedule_single_event()` se nezachytávají.

## Jak se události mapují

Když plugin zavolá `wp_schedule_event()`, Queuety vyhledá název plánu pomocí `wp_get_schedules()`, vytvoří plánovanou úlohu Queuety s názvem obslužné rutiny `__queuety_cron_{hook}` a do datové části plánu uloží původní název hooku WordPress a argumenty.

Záměrem je, aby pracovní proces Queuety zpracovávající naplánovanou úlohu zavolal `do_action()` s původním názvem hooku a argumenty, aby se spustila stávající zpětná volání WordPress a časování řídilo Queuety. `CronBridge::process_cron_event()` toto volání implementuje, zatím ho však nic nevyvolává (viz výše uvedené omezení). Plány vyhodnocuje pouze dlouho běžící proces `wp queuety work`, a to přibližně jednou za minutu (viz [Plánování](https://queuety.inline0.dev/cs/docs/features/scheduling)).

### Určení intervalu

Most nejprve vyhledá intervaly plánů pomocí `wp_get_schedules()` a poté použije vestavěné výchozí hodnoty:

| Název plánu | Interval |
|---|---|
| `hourly` | 3,600 sekund |
| `twicedaily` | 43,200 sekund |
| `daily` | 86,400 sekund |
| `weekly` | 604,800 sekund |

Vlastní intervaly plánů registrované pomocí filtru `cron_schedules` jsou podporovány, pokud je vrací `wp_get_schedules()`.

## Obnovení WP-Cron

Chcete-li obnovit výchozí systém WordPress cron:

```php
Queuety::restore_wp_cron();
```

Tím se odstraní hooky filtrů a WordPress bude moci znovu zpracovávat události cron pomocí vestavěného mechanismu. Mějte na paměti, že při instalaci mostu se `DISABLE_WP_CRON` definuje jako `true` a za běhu ji nelze zrušit, takže bude možná nutné tento konstantní výraz odstranit z `wp-config.php` nebo proces restartovat.

## Kdy jej použít

Náhrada se nejvíce hodí pro weby s nízkou návštěvností, když potřebujete spolehlivější časování, než jaké nabízí WP-Cron, nebo pokud už používáte pracovní procesy Queuety a chcete, aby se úlohy cron spouštěly ve stejném provozním systému. Pomáhá také v situacích, kdy je důležitá centralizovaná observabilita, protože se pak události cron zobrazují ve stejných protokolech a metrikách jako ostatní úlohy ve frontě.

## Omezení

Existuje několik důležitých omezení. Bez aktivního pracovního procesu Queuety se naplánované události nikdy nespustí. Zachytávají se pouze opakované plány; jednorázové události vytvořené pomocí `wp_schedule_single_event()` zůstávají mimo tento most. `replace_wp_cron()` také po zbytek aktuálního procesu PHP definuje `DISABLE_WP_CRON`, takže `restore_wp_cron()` odstraní hooky, ale nemůže zrušit definici konstanty. A konečně, most funguje pouze tehdy, když je načten WordPress, protože závisí na filtrech WordPress a `do_action()`.

## Příklad: kompletní nastavení

```php
use Queuety\Queuety;

// In your plugin's main file.
add_action( 'plugins_loaded', function () {
    Queuety::replace_wp_cron();
} );
```

Není třeba zde volat `Queuety::init()`: aktivní plugin Queuety vytvoří připojení z přihlašovacích údajů databáze WordPress a inicializuje se v `plugins_loaded`. `replace_wp_cron()` pouze přidá filtry, takže není závislý na tom, zda k inicializaci došlo dříve.

Poté se opakované události, které pluginy registrují pomocí `wp_schedule_event()`, ukládají jako plánované úlohy Queuety. Dokud nebude opravena chyba [#9](https://github.com/inline0/queuety/issues/9), jejich zpětná volání se nespustí.
