
# WP-Cron-korvaaja

Queuety voi korvata sisäänrakennetun WordPress cron-järjestelmän. Kun se on käytössä, `wp_schedule_event()`-kutsut siepataan ja ohjataan Queuetyn ajastimen kautta oletusarvoisen WP-Cron-mekanismin sijaan. Tapahtumat käsittelee Queuety-työntekijä, joka suorittaa ne sivuston liikenteestä riippumatta.

> **Nykyinen rajoitus:** silta luo Queuety-ajastukset, mutta työntekijällä ei ole käsittelijää niiden tuottamille `__queuety_cron_{hook}`-töille, joten alkuperäisiä WordPress-takaisinkutsuja ei koskaan suoriteta. Jokainen työ epäonnistuu, sitä yritetään uudelleen viiveajan jälkeen, ja lopulta se siirretään sivuun ([#9](https://github.com/inline0/queuety/issues/9)). Älä ota siltaa käyttöön sivustolla, jolla cron-tapahtumien on suorituttava, ennen kuin tämä on korjattu.

## Korvaajan käyttöönotto

Kutsu `Queuety::replace_wp_cron()` ajoissa lisäosasi tai teemasi alustuksessa:

```php
use Queuety\Queuety;

Queuety::replace_wp_cron();
```

Tämä kutsutaan yleensä lisäosan päätiedostossa tai `plugins_loaded`-koukussa. Kutsu on tehtävä, kun WordPress on ladattu eli lisäosan on oltava aktiivinen.

## Siepattavat kutsut

cron-silta kytkeytyy kolmeen WordPress-suodattimeen:

| WordPress-funktio | Kytketty suodatin | Toiminta |
|---|---|---|
| `wp_schedule_event()` | `pre_schedule_event` | Luo Queuety-ajastuksen samalla aikavälillä |
| `wp_unschedule_event()` | `pre_unschedule_event` | Poistaa vastaavan Queuety-ajastuksen |
| `wp_get_scheduled_event()` | `pre_get_scheduled_event` | Palauttaa ajastustiedot lähteestä Queuety |

Vain **toistuvat** tapahtumat (joilla on `schedule`-ominaisuus, kuten `hourly`, `twicedaily`, `daily`) siepataan. `wp_schedule_single_event()`-komennolla ajastettuja kertaluonteisia tapahtumia ei siepata.

## Tapahtumien yhdistäminen

Kun lisäosa kutsuu `wp_schedule_event()`, Queuety selvittää ajastuksen nimen käyttämällä `wp_get_schedules()`-toimintoa, luo Queuety-ajastuksen käsittelijän nimellä `__queuety_cron_{hook}` ja tallentaa alkuperäisen WordPress-koukun nimen ja argumentit ajastuksen sisältöön.

Tarkoituksena on, että ajastetun työn käsittelevä Queuety-työntekijä kutsuu `do_action()`-toimintoa alkuperäisellä koukun nimellä ja argumenteilla, jolloin olemassa olevat WordPress-takaisinkutsut suoritetaan ja Queuety ohjaa ajankohtaa. `CronBridge::process_cron_event()` toteuttaa tämän kutsun, mutta sitä ei vielä kutsuta (katso yllä oleva rajoitus). Ajastukset käsittelee lisäksi vain pitkään käynnissä oleva `wp queuety work`-prosessi noin kerran minuutissa (katso [Ajastus](https://queuety.inline0.dev/fi/docs/features/scheduling)).

### Aikavälin määrittäminen

Silta selvittää ajastusten nimet ensin käyttämällä `wp_get_schedules()`-toimintoa ja turvautuu sitten sisäänrakennettuihin oletusarvoihin:

| Ajastuksen nimi | Aikaväli |
|---|---|
| `hourly` | 3,600 sekuntia |
| `twicedaily` | 43,200 sekuntia |
| `daily` | 86,400 sekuntia |
| `weekly` | 604,800 sekuntia |

`cron_schedules`-suodattimella rekisteröidyt mukautetut ajastusvälit ovat tuettuja, kunhan `wp_get_schedules()` palauttaa ne.

## WP-Cronn palauttaminen

Palaa oletusarvoiseen WordPress cron-järjestelmään:

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

Tämä poistaa suodinkoukut ja sallii WordPressn käsitellä cron-tapahtumia jälleen sisäänrakennetulla mekanismillaan. Huomaa, että siltaa asennettaessa `DISABLE_WP_CRON` määritetään arvoksi `true` eikä sitä voi poistaa määrityksistä suorituksen aikana, joten vakio on ehkä poistettava kohteesta `wp-config.php` tai prosessi käynnistettävä uudelleen.

## Milloin sitä kannattaa käyttää

Korvaaja on hyödyllisimmillään, kun sivustosi liikenne on vähäistä, tarvitset tarkempaa ajoitusta kuin WP-Cron pystyy tarjoamaan tai käytössäsi on jo Queuety-työntekijöitä ja haluat cron-suorituksen samaan operatiiviseen järjestelmään. Se helpottaa myös keskitettyä seurantaa, koska cron-tapahtumat näkyvät samoissa lokeissa ja mittareissa kuin muut jonotyöt.

## Rajoitukset

Käyttöön liittyy muutamia tärkeitä rajoituksia. Käynnissä oleva Queuety-työntekijä on välttämätön, muuten ajastettuja tapahtumia ei koskaan suoriteta. Vain toistuvat ajastukset siepataan; komennolla `wp_schedule_single_event()` luodut kertaluonteiset tapahtumat jäävät edelleen sillan ulkopuolelle. `replace_wp_cron()` määrittää myös `DISABLE_WP_CRON`n nykyisen PHP-prosessin loppuajaksi, joten `restore_wp_cron()` poistaa koukut, mutta ei voi poistaa vakiota määrityksistä. Lopuksi silta toimii vain, kun WordPress on ladattu, sillä se on riippuvainen WordPress-suodattimista ja `do_action()`-toiminnosta.

## Esimerkki: täydellinen määritys

```php
use Queuety\Queuety;

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

Tässä ei tarvitse kutsua toimintoa `Queuety::init()`: aktiivinen Queuety-lisäosa muodostaa yhteyden WordPress-tietokannan tunnistetiedoilla ja alustaa itsensä `plugins_loaded`-tapahtumassa. `replace_wp_cron()` asentaa vain suodattimet, joten sen toiminta ei edellytä, että alustus olisi tehty ensin.

Tämän jälkeen lisäosien `wp_schedule_event()`-toiminnolla rekisteröimät toistuvat tapahtumat tallennetaan Queuety-ajastuksina. Niiden takaisinkutsuja ei suoriteta, ennen kuin [#9](https://github.com/inline0/queuety/issues/9) on korjattu.
