
# Zamenjava WP-Cron

Queuety lahko nadomesti vgrajeni sistem WordPress cron. Ko je omogočen, prestreže klice `wp_schedule_event()` in jih preusmeri prek razporejevalnika za Queuety namesto prek privzetega mehanizma WP-Cron. Dogodke naj bi obdeloval delavec Queuety, ki omogoča izvajanje neodvisno od prometa na spletnem mestu.

> **Trenutna omejitev:** most ustvari razporede Queuety, vendar delavec nima obravnavalnika za opravila `__queuety_cron_{hook}`, ki jih ti ustvarijo, zato se izvorni povratni klici WordPress nikoli ne izvedejo. Vsako opravilo se konča z napako, se znova poskusi po zakasnitvi in je nazadnje skrito ([#9](https://github.com/inline0/queuety/issues/9)). Mostu ne omogočite na spletnem mestu, kjer se morajo izvajati dogodki cron, dokler ta težava ni odpravljena.

## Omogočanje zamenjave

Pokličite `Queuety::replace_wp_cron()` zgodaj med inicializacijo vtičnika ali teme:

```php
use Queuety\Queuety;

Queuety::replace_wp_cron();
```

To se običajno pokliče v glavni datoteki vtičnika ali v kavlju `plugins_loaded`. Poklicati ga je treba, ko je naložen WordPress (vtičnik mora biti aktiven).

## Kaj prestreže

Most cron se priklopi na tri filtre WordPress:

| Funkcija WordPress | Priklopljeni filter | Delovanje |
|---|---|---|
| `wp_schedule_event()` | `pre_schedule_event` | Ustvari razpored Queuety z enakim intervalom |
| `wp_unschedule_event()` | `pre_unschedule_event` | Odstrani ustrezni razpored Queuety |
| `wp_get_scheduled_event()` | `pre_get_scheduled_event` | Vrne podatke razporeda iz Queuety |

Prestrezajo se samo **ponavljajoči se** dogodki (tisti, ki imajo lastnost `schedule`, kot so `hourly`, `twicedaily`, `daily`). Enkratni dogodki, načrtovani z `wp_schedule_single_event()`, se ne prestrezajo.

## Kako so dogodki preslikani

Ko vtičnik pokliče `wp_schedule_event()`, Queuety razreši ime razporeda prek `wp_get_schedules()`, ustvari razpored Queuety z imenom obravnavalnika `__queuety_cron_{hook}` ter v vsebino razporeda shrani ime izvornega kavlja WordPress in argumente.

Predvideno je, da delavec Queuety, ki obdeluje načrtovano opravilo, pokliče `do_action()` z izvornim imenom kavlja in argumenti, da se izvedejo obstoječi povratni klici WordPress, časovno usklajevanje pa vodi Queuety. `CronBridge::process_cron_event()` izvede ta klic, vendar ga za zdaj nič ne sproži (glejte zgornjo omejitev). Razporede ocenjuje samo dolgotrajno delujoči proces `wp queuety work`, približno enkrat na minuto (glejte [Razporejanje](https://queuety.inline0.dev/sl/docs/features/scheduling)).

### Razreševanje intervala

Most najprej razreši imena razporedov prek `wp_get_schedules()`, nato pa uporabi vgrajene privzete vrednosti:

| Ime razporeda | Interval |
|---|---|
| `hourly` | 3,600 sekund |
| `twicedaily` | 43,200 sekund |
| `daily` | 86,400 sekund |
| `weekly` | 604,800 sekund |

Podprti so tudi intervali po meri, registrirani prek filtra `cron_schedules`, če jih vrne `wp_get_schedules()`.

## Obnovitev WP-Cron

Za vrnitev na privzeti sistem WordPress cron:

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

S tem odstranite kavlje filtrov in omogočite, da WordPress znova obravnava dogodke cron z vgrajenim mehanizmom. Upoštevajte, da je ob namestitvi mostu `DISABLE_WP_CRON` definirano kot `true` in te definicije med izvajanjem ni mogoče odstraniti, zato boste morda morali to konstanto odstraniti iz `wp-config.php` ali znova zagnati proces.

## Kdaj jo uporabiti

Zamenjava je najbolj uporabna, ko je na vašem spletnem mestu malo prometa, ko potrebujete zanesljivejše časovno usklajevanje, kot ga omogoča WP-Cron, ali ko že uporabljate delavce Queuety in želite izvajanje cron vključiti v isti operativni sistem. Pomaga tudi, kadar je pomemben centraliziran nadzor, saj se dogodki cron prikažejo v istih dnevnikih in metrikah kot druga opravila v čakalni vrsti.

## Omejitve

Upoštevati je treba nekaj pomembnih omejitev. Potreben je aktiven delavec Queuety, sicer se načrtovani dogodki ne bodo nikoli izvedli. Prestrezajo se samo ponavljajoči se razporedi; enkratni dogodki, ustvarjeni z `wp_schedule_single_event()`, ostanejo zunaj mostu. `replace_wp_cron()` določi tudi `DISABLE_WP_CRON` za preostanek trenutnega procesa PHP, zato `restore_wp_cron()` odstrani kavlje, ne more pa odstraniti definicije konstante. Nazadnje, most deluje samo, ko je naložen WordPress, saj je odvisen od filtrov WordPress in `do_action()`.

## Primer: celotna nastavitev

```php
use Queuety\Queuety;

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

Tukaj ni treba poklicati `Queuety::init()`: aktivni vtičnik Queuety vzpostavi povezavo s poverilnicami zbirke podatkov WordPress in se inicializira ob `plugins_loaded`. `replace_wp_cron()` namesti samo filtre, zato ni odvisen od tega, da se je to zgodilo prej.

Po tem se ponavljajoči se dogodki, ki jih vtičniki registrirajo z `wp_schedule_event()`, shranijo kot razporedi Queuety. Dokler ni odpravljena težava [#9](https://github.com/inline0/queuety/issues/9), se njihovi povratni klici ne izvajajo.
