
# Zamiennik WP-Cron

Queuety może zastąpić wbudowany system WordPress cron. Po włączeniu wywołania `wp_schedule_event()` są przechwytywane i kierowane przez harmonogram Queuety zamiast domyślnego mechanizmu WP-Cron. Zdarzenia są przeznaczone do przetwarzania przez proces roboczy Queuety, który wykonuje zadania niezależnie od ruchu w witrynie.

> **Obecne ograniczenie:** most tworzy harmonogramy Queuety, ale proces roboczy nie ma programu obsługi zadań `__queuety_cron_{hook}`, które one tworzą, więc pierwotne wywołania zwrotne WordPress nigdy nie są uruchamiane. Każde zadanie kończy się niepowodzeniem, jest ponawiane po czasie oczekiwania i ostatecznie trafia do archiwum ([#9](https://github.com/inline0/queuety/issues/9)). Nie włączaj mostu w witrynie, w której zdarzenia cron muszą być wykonywane, dopóki problem nie zostanie naprawiony.

## Włączanie zamiennika

Wywołaj `Queuety::replace_wp_cron()` na wczesnym etapie inicjalizacji wtyczki lub motywu:

```php
use Queuety\Queuety;

Queuety::replace_wp_cron();
```

Zwykle wywołuje się to w głównym pliku wtyczki lub w punkcie zaczepienia `plugins_loaded`. Wywołanie musi nastąpić po załadowaniu WordPress (wtyczka musi być aktywna).

## Co jest przechwytywane

Most cron podłącza się do trzech filtrów WordPress:

| Funkcja WordPress | Podłączony filtr | Działanie |
|---|---|---|
| `wp_schedule_event()` | `pre_schedule_event` | Tworzy harmonogram Queuety o tym samym interwale |
| `wp_unschedule_event()` | `pre_unschedule_event` | Usuwa odpowiadający mu harmonogram Queuety |
| `wp_get_scheduled_event()` | `pre_get_scheduled_event` | Zwraca dane harmonogramu z Queuety |

Przechwytywane są tylko **zdarzenia cykliczne** (te z właściwością `schedule`, taką jak `hourly`, `twicedaily`, `daily`). Zdarzenia jednorazowe zaplanowane za pomocą `wp_schedule_single_event()` nie są przechwytywane.

## Mapowanie zdarzeń

Gdy wtyczka wywołuje `wp_schedule_event()`, Queuety rozpoznaje nazwę harmonogramu za pomocą `wp_get_schedules()`, tworzy harmonogram Queuety z nazwą programu obsługi `__queuety_cron_{hook}` i zapisuje pierwotną nazwę punktu zaczepienia WordPress oraz argumenty w ładunku harmonogramu.

Zgodnie z zamierzeniem proces roboczy Queuety przetwarzający zaplanowane zadanie wywołuje `do_action()` z pierwotną nazwą punktu zaczepienia i argumentami, dzięki czemu istniejące wywołania zwrotne WordPress są wykonywane, a czasem steruje Queuety. `CronBridge::process_cron_event()` implementuje to wywołanie, ale nic go jeszcze nie uruchamia (zob. powyższe ograniczenie). Harmonogramy są też oceniane tylko przez długotrwale działający proces `wp queuety work`, mniej więcej raz na minutę (zob. sekcję [Planowanie](https://queuety.inline0.dev/pl/docs/features/scheduling)).

### Ustalanie interwałów

Most najpierw rozpoznaje nazwy harmonogramów za pomocą `wp_get_schedules()`, a następnie korzysta z wbudowanych wartości domyślnych:

| Nazwa harmonogramu | Interwał |
|---|---|
| `hourly` | 3,600 sekund |
| `twicedaily` | 43,200 sekund |
| `daily` | 86,400 sekund |
| `weekly` | 604,800 sekund |

Obsługiwane są niestandardowe interwały harmonogramu zarejestrowane za pomocą filtra `cron_schedules`, o ile zwraca je `wp_get_schedules()`.

## Przywracanie WP-Cron

Aby wrócić do domyślnego systemu WordPress cron:

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

Usuwa to zaczepy filtrów i pozwala ponownie obsługiwać zdarzenia cron za pomocą wbudowanego mechanizmu WordPress. Pamiętaj, że podczas instalacji mostu `DISABLE_WP_CRON` jest definiowana jako `true` i nie można jej oddefiniować w czasie działania, więc może być konieczne usunięcie tej stałej z `wp-config.php` lub ponowne uruchomienie procesu.

## Kiedy używać

Zamiennik jest najbardziej przydatny, gdy witryna ma mały ruch, gdy potrzebujesz bardziej niezawodnego harmonogramu niż ten zapewniany przez WP-Cron albo gdy już uruchamiasz procesy robocze Queuety i chcesz, by wykonywanie cron odbywało się w tym samym systemie operacyjnym. Przydaje się też, gdy ważna jest scentralizowana obserwowalność, ponieważ zdarzenia cron pojawiają się wtedy w tych samych dziennikach i metrykach co pozostałe zadania kolejki.

## Ograniczenia

Obowiązuje kilka ważnych ograniczeń. Do działania zaplanowanych zdarzeń wymagany jest aktywny proces roboczy Queuety. Przechwytywane są tylko harmonogramy cykliczne; zdarzenia jednorazowe utworzone za pomocą `wp_schedule_single_event()` nadal nie są obsługiwane przez most. `replace_wp_cron()` definiuje też `DISABLE_WP_CRON` na czas działania bieżącego procesu PHP, więc `restore_wp_cron()` usuwa zaczepy, ale nie może oddefiniować stałej. Most działa tylko wtedy, gdy załadowano WordPress, ponieważ zależy od filtrów WordPress i `do_action()`.

## Przykład: pełna konfiguracja

```php
use Queuety\Queuety;

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

Nie trzeba tu wywoływać `Queuety::init()`: aktywna wtyczka Queuety tworzy połączenie na podstawie danych dostępowych bazy danych WordPress i inicjalizuje się podczas `plugins_loaded`. `replace_wp_cron()` instaluje tylko filtry, więc nie zależy od wcześniejszego wykonania tych czynności.

Następnie cykliczne zdarzenia rejestrowane przez wtyczki za pomocą `wp_schedule_event()` są zapisywane jako harmonogramy Queuety. Do czasu naprawienia [#9](https://github.com/inline0/queuety/issues/9) ich wywołania zwrotne nie będą wykonywane.
