
# Náhrada za WP-Cron

Queuety môže nahradiť vstavaný systém WordPress cron. Po zapnutí sa volania `wp_schedule_event()` zachytia a presmerujú cez plánovač Queuety namiesto predvoleného mechanizmu WP-Cron. Udalosti má spracovať worker Queuety, ktorý zabezpečuje vykonávanie nezávislé od návštevnosti stránky.

> **Aktuálne obmedzenie:** prepojovací most vytvára plány Queuety, no worker nemá obslužný program pre úlohy `__queuety_cron_{hook}`, ktoré vytvárajú, takže pôvodné spätné volania WordPress sa nikdy nespustia. Každá úloha zlyhá, opakuje sa po uplynutí čakacej doby a napokon sa odloží ([#9](https://github.com/inline0/queuety/issues/9)). Kým sa tento problém nevyrieši, nezapínajte prepojovací most na stránke, na ktorej sa musia spúšťať udalosti cron.

## Zapnutie náhrady

Zavolajte `Queuety::replace_wp_cron()` na začiatku inicializácie pluginu alebo témy:

```php
use Queuety\Queuety;

Queuety::replace_wp_cron();
```

Zvyčajne sa volá v hlavnom súbore pluginu alebo v hooku `plugins_loaded`. Musí sa zavolať, keď je načítaný WordPress (plugin musí byť aktívny).

## Čo zachytáva

Most cron sa pripája k trom filtrom WordPress:

| Funkcia WordPress | Pripojený filter | Správanie |
|---|---|---|
| `wp_schedule_event()` | `pre_schedule_event` | Vytvorí plán Queuety s rovnakým intervalom |
| `wp_unschedule_event()` | `pre_unschedule_event` | Odstráni zodpovedajúci plán Queuety |
| `wp_get_scheduled_event()` | `pre_get_scheduled_event` | Vráti údaje plánu z Queuety |

Zachytávajú sa iba **opakujúce sa** udalosti (tie, ktoré majú vlastnosť `schedule`, napríklad `hourly`, `twicedaily` či `daily`). Jednorazové udalosti naplánované pomocou `wp_schedule_single_event()` sa nezachytávajú.

## Mapovanie udalostí

Keď plugin zavolá `wp_schedule_event()`, Queuety vyhľadá názov plánu pomocou `wp_get_schedules()`, vytvorí plán Queuety s názvom obslužného programu `__queuety_cron_{hook}` a uloží pôvodný názov hooku WordPress a argumenty do dátovej časti plánu.

Zámer je, aby worker Queuety pri spracovaní naplánovanej úlohy zavolal `do_action()` s pôvodným názvom hooku a argumentmi. Existujúce spätné volania WordPress by tak spúšťal plánovač Queuety. `CronBridge::process_cron_event()` toto volanie implementuje, no zatiaľ ho nič nevyvoláva (pozrite si vyššie uvedené obmedzenie). Plány tiež vyhodnocuje iba dlho bežiaci proces `wp queuety work`, približne raz za minútu (pozrite si časť [Plánovanie](https://queuety.inline0.dev/sk/docs/features/scheduling)).

### Určovanie intervalu

Most najprv vyhľadá názvy plánov pomocou `wp_get_schedules()` a potom použije vstavané predvolené hodnoty:

| Názov plánu | Interval |
|---|---|
| `hourly` | 3,600 sekúnd |
| `twicedaily` | 43,200 sekúnd |
| `daily` | 86,400 sekúnd |
| `weekly` | 604,800 sekúnd |

Vlastné intervaly plánov zaregistrované cez filter `cron_schedules` sú podporované, ak ich `wp_get_schedules()` vracia.

## Obnovenie WP-Cron

Ak chcete obnoviť predvolený systém WordPress cron:

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

Tým sa odstránia hooky filtrov a WordPress bude môcť znova spracúvať udalosti cron pomocou vstavaného mechanizmu. Upozorňujeme, že po nainštalovaní mosta sa `DISABLE_WP_CRON` definuje ako `true` a počas behu ho nemožno oddefinovať. Možno ho preto bude potrebné odstrániť z `wp-config.php` alebo proces reštartovať.

## Kedy ho použiť

Náhrada je najvhodnejšia pre stránky s nízkou návštevnosťou, keď potrebujete presnejšie časovanie, než dokáže zabezpečiť WP-Cron, alebo už používate workery Queuety a chcete, aby vykonávanie cron prebiehalo v tom istom prevádzkovom systéme. Pomáha aj vtedy, keď záleží na centralizovanom monitorovaní, pretože udalosti cron sa potom zobrazujú v rovnakých záznamoch a metrikách ako ostatné úlohy vo fronte.

## Obmedzenia

Existuje niekoľko dôležitých obmedzení. Vyžaduje sa aktívny Queuety pracovník, inak sa naplánované udalosti nikdy nespustia. Zachytávajú sa iba opakované plány; jednorazové udalosti vytvorené pomocou `wp_schedule_single_event()` zostávajú mimo mostíka. `replace_wp_cron()` tiež definuje `DISABLE_WP_CRON` pre zvyšok aktuálneho procesu PHP, takže `restore_wp_cron()` odstráni hooky, ale nedokáže zrušiť definíciu konštanty. A napokon, mostík funguje iba vtedy, keď je načítané WordPress, pretože závisí od filtrov WordPress a `do_action()`.

## Príklad: kompletné nastavenie

```php
use Queuety\Queuety;

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

Tu netreba volať `Queuety::init()`: aktívny plugin Queuety vytvorí svoje pripojenie pomocou prihlasovacích údajov k databáze WordPress a inicializuje sa pri `plugins_loaded`. `replace_wp_cron()` iba nainštaluje filtre, takže nezávisí od toho, či sa to už predtým vykonalo.

Potom sa opakované udalosti, ktoré pluginy registrujú pomocou `wp_schedule_event()`, ukladajú ako plány Queuety. Kým sa neopraví [#9](https://github.com/inline0/queuety/issues/9), ich callbacky sa nespustia.
