WordPress Cron Jobs - zaplanowane zadania
WordPress ma własny system planowania zadań - WP-Cron. Używany do publikacji zaplanowanych postów, backupów, aktualizacji i czyszczenia. Ale ma swoje ograniczenia. Pokażę jak działa i jak go zoptymalizować.
Krótka odpowiedź
Jak działa WP-Cron
Mechanizm:
- Użytkownik odwiedza stronę
- WordPress sprawdza czy są zaległe zadania
- Jeśli tak - wykonuje je
- Następnie ładuje stronę
Problemy:
- Brak ruchu = brak wykonania zadań
- Zadania opóźnione o godziny/dni
- Może spowalniać ładowanie strony
- Wiele jednoczesnych requestów = chaos
Typowe zadania WP-Cron:
- wp_publish_scheduled - publikacja postów
- wp_update_plugins - sprawdzanie aktualizacji
- delete_expired_transients - czyszczenie cache
- Backupy (UpdraftPlus)
- Mailing (MailPoet)
Wyłączenie WP-Cron i użycie systemowego
Krok 1: Wyłącz WP-Cron:
Dodaj do wp-config.php:
```php
define('DISABLE_WP_CRON', true);
```
Krok 2: Ustaw systemowy cron:
W crontab serwera:
```
*/15 * * * * wget -q -O - https://domena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1
```
Lub:
```
*/15 * * * * curl https://domena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1
```
Częstotliwość:
- Co 15 minut dla większości stron
- Co 5 minut dla sklepów/aplikacji
- Co godzinę dla blogów
W panelu hostingu:
- cPanel → Cron Jobs
- DirectAdmin → Zadania Cron
- CloudPanel → Cron
Debugowanie i zarządzanie zadaniami
WP Crontrol (wtyczka):
- Podgląd wszystkich zaplanowanych zadań
- Ręczne uruchomienie zadania
- Edycja/usuwanie zadań
- Dodawanie własnych zadań
Narzędzia → Cron Events:
- Lista wszystkich hooków cron
- Następne wykonanie
- Interwał (hourly, daily, etc.)
WP-CLI:
```bash
# Lista zadań
wp cron event list
# Uruchom wszystkie zaległe
wp cron event run --due-now
# Uruchom konkretne
wp cron event run wp_update_plugins
```
Debugowanie:
```php
// Sprawdź następne wykonanie
wp_next_scheduled('hook_name');
```
Własne zaplanowane zadania
Tworzenie zadania:
```php
// Rejestracja interwału (jeśli niestandardowy)
add_filter('cron_schedules', function($schedules) {
$schedules['every_6_hours'] = [
'interval' => 21600, // 6h w sekundach
'display' => 'Every 6 Hours'
];
return $schedules;
});
// Zaplanowanie zadania
if (!wp_next_scheduled('my_custom_event')) {
wp_schedule_event(time(), 'every_6_hours', 'my_custom_event');
}
// Akcja przy wykonaniu
add_action('my_custom_event', function() {
// Twój kod
});
```
Usuwanie zadania:
```php
wp_clear_scheduled_hook('my_custom_event');
```