WordPress ma wbudowany system zadań cyklicznych zwany WP-Cron, który obsługuje publikację zaplanowanych wpisów, wysyłkę powiadomień email, sprawdzanie aktualizacji, czyszczenie kosza i dziesiątki innych operacji w tle. Problem? WP-Cron nie jest prawdziwym cronem — uruchamia się tylko wtedy, gdy ktoś odwiedzi Twoją stronę. Na stronach z małym ruchem zadania są opóźnione o godziny, a na stronach z dużym ruchem WP-Cron odpala się przy każdym żądaniu, dokładając niepotrzebne obciążenie.
Rozwiązanie: wyłączasz WP-Cron i zamiast niego konfigurujesz prawdziwy CRON systemowy, który odpala zadania WordPressa co minutę lub co 5 minut — niezależnie od ruchu na stronie. W tym poradniku pokazuję jak to zrobić na każdym typie hostingu.
Spis treści
ToggleJak działa WP-Cron i dlaczego to problem?
Standardowy cron (w Linuxie) działa tak: systemowy demon sprawdza co minutę, czy jest jakieś zaplanowane zadanie do wykonania. Jeżeli jest — uruchamia je. Jeżeli nie — czeka. Działa niezależnie od tego, czy ktoś jest na serwerze.
WP-Cron działa zupełnie inaczej. Za każdym razem, gdy ktoś wchodzi na stronę WordPress, przeglądarka pobiera plik wp-cron.php (WordPress wpina go jako dodatkowe żądanie HTTP). Ten plik sprawdza, czy są zaplanowane zadania do wykonania. Jeżeli są — odpalają się w tle. To oznacza trzy problemy:
- Na stronach z małym ruchem — jeżeli nikt nie odwiedza strony przez 8 godzin, przez 8 godzin żadne zadanie WP-Cron się nie uruchomi. Zaplanowany post, który miał wyjść o 7:00, opublikuje się dopiero, gdy ktoś otworzy stronę — może o 15:00.
- Na stronach z dużym ruchem — WP-Cron sprawdza zadania przy każdym page view. Na stronie z 10 000 wizyt dziennie to 10 000 dodatkowych sprawdzeń, z których 9 990 jest zbędnych. To marnowanie zasobów serwera i zwiększanie TTFB.
- Niestabilność — WP-Cron polega na dodatkowym żądaniu HTTP do samego siebie. Jeżeli serwer jest obciążony, firewall blokuje loopback, lub strona stoi za reverse proxy z nieprawidłową konfiguracją — WP-Cron po prostu nie działa.
Krok 1. Wyłącz WP-Cron
Otwórz plik wp-config.php i dodaj tę linię (przed /* That's all, stop editing! */):
define( 'DISABLE_WP_CRON', true );
Od tego momentu WordPress nie będzie odpalał wp-cron.php przy każdej wizycie. Ale zanim zapiszesz tę zmianę, upewnij się, że masz już gotowy CRON systemowy (kroki poniżej) — inaczej zaplanowane zadania po prostu przestaną się wykonywać.
Krok 2. Skonfiguruj CRON systemowy
Musisz powiedzieć serwerowi, żeby co X minut samodzielnie odpalał plik wp-cron.php. Sposób konfiguracji zależy od panelu hostingu.
cPanel
- Zaloguj się do cPanel.
- Przejdź do sekcji „Cron Jobs” (lub „Zadania CRON”).
- W ustawieniach częstotliwości wybierz „Every 5 minutes” (lub wpisz ręcznie:
*/5 * * * *). - W polu „Command” wklej:
wget -q -O /dev/null https://twojadomena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Zapisz.
Alternatywnie zamiast wget możesz użyć curl:
curl -s https://twojadomena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Lub — najbardziej wydajne — wywołaj PHP bezpośrednio (bez HTTP):
/usr/local/bin/php /home/user/public_html/wp-cron.php >/dev/null 2>&1
Ta ostatnia opcja omija serwer HTTP i działa nawet wtedy, gdy strona jest na chwilę niedostępna (np. podczas Maintenance mode).
DirectAdmin
- Zaloguj się do DirectAdmin.
- Przejdź do „Advanced Features → Cron Jobs”.
- Wpisz
*/5 * * * *w pola minuty/godziny/dzień/miesiąc/dzień tygodnia (lub wybierz z rozwijanej listy „Every 5 minutes”). - W polu „Command” wklej jedną z komend powyżej (wget, curl lub php).
- Kliknij „Add”.
Plesk
- Zaloguj się do Plesk.
- Przejdź do „Scheduled Tasks” (Cron) pod domeną.
- Kliknij „Add Task”.
- Typ zadania: „Run a command”.
- Harmonogram: co 5 minut.
- Komenda: jak wyżej.
SSH / VPS (ręcznie)
Zaloguj się przez SSH i wpisz:
crontab -e
Dodaj linię:
*/5 * * * * /usr/bin/php /var/www/twojadomena.pl/wp-cron.php >/dev/null 2>&1
Zapisz i wyjdź (w nano: Ctrl+X, Y, Enter). Sprawdź, czy ścieżka do PHP jest poprawna — na Twoim serwerze może być /usr/local/bin/php lub /usr/bin/php8.2. Aby to ustalić:
which php
Krok 3. Sprawdź, czy działa
Po skonfigurowaniu CRONa i wyłączeniu WP-Cron chcesz mieć pewność, że zadania się wykonują. Kilka metod weryfikacji:
Zaplanuj testowy wpis
Utwórz nowy wpis w WordPress z datą publikacji za 10 minut w przyszłości. Poczekaj — jeżeli wpis opublikuje się o czasie (±5 minut), CRON działa. Jeżeli nie — wróć do konfiguracji i sprawdź ścieżki.
Wtyczka WP Crontrol
Zainstaluj WP Crontrol — darmową wtyczkę, która pokazuje wszystkie zaplanowane zadania WP-Cron, ich czas ostatniego i następnego uruchomienia, oraz pozwala uruchamiać je ręcznie. W Narzędzia → Cron Events zobaczysz pełną listę. Sprawdź, czy czasy „Next Run” się aktualizują co 5 minut.
Logi CRONa na VPS
Jeżeli masz dostęp SSH, sprawdź czy CRON loguje wykonania:
grep wp-cron /var/log/syslog | tail -5
Powinieneś zobaczyć wpisy co 5 minut. Jeżeli nie — upewnij się, że usługa cron jest włączona (systemctl status cron).
Jaką częstotliwość ustawić?
Domyślna rekomendacja to co 5 minut (*/5 * * * *). Dla większości stron to idealny kompromis: zadania wykonują się terminowo, a obciążenie serwera jest minimalne.
- Co minutę (
* * * * *) — uzasadnione dla sklepów WooCommerce, gdzie zamówienia muszą być przetwarzane natychmiast, lub dla stron z wieloma zaplanowanymi publikacjami o precyzyjnych godzinach. - Co 5 minut (
*/5 * * * *) — standard dla blogów, stron firmowych, portfolio. - Co 15 minut (
*/15 * * * *) — akceptowalne dla stron, na których precyzja czasu nie ma znaczenia i chcesz minimalizować obciążenie serwera.
Typowe problemy i rozwiązania
Zaplanowane posty się nie publikują
Klasyczny objaw „Missed schedule” — wpis miał wyjść o 8:00, jest 12:00, a on wciąż w szkicach. Przyczyny:
- WP-Cron wyłączony, a systemowy CRON nie skonfigurowany — sprawdź oba punkty.
- Strefa czasowa WordPressa nie zgadza się z serwerem — Ustawienia → Ogólne → Strefa czasowa powinna być ustawiona na Twoją strefę (Warszawa/Europe).
- Wtyczka cache’ująca serwuje starą stronę — po publikacji wyczyść cache.
WooCommerce nie przetwarza zamówień
WooCommerce używa WP-Cron do przetwarzania zamówień, wysyłki emaili transakcyjnych i odświeżania statusów płatności. Jeżeli po wyłączeniu WP-Cron zamówienia się „zawieszają”, sprawdź czy systemowy CRON rzeczywiście odpala wp-cron.php — najczęstsza przyczyna to literówka w ścieżce lub brak prawa do wykonywania PHP.
CRON działa, ale niektóre zadania nie
Może być zbyt mało pamięci. Zadania WP-Cron (szczególnie backupy, importy) potrafią być ciężkie. Zwiększ WP_MEMORY_LIMIT do 256 MB w wp-config.php i max_execution_time do 300 sekund.
Najczęściej zadawane pytania
Czy wyłączenie WP-Cron przyspiesza stronę?
Tak, ale różnica zależy od ruchu. Na stronie z 1000+ wizyt dziennie wyłączenie WP-Cron potrafi zmniejszyć TTFB o 50–200 ms, bo WordPress nie musi przy każdym żądaniu sprawdzać, czy jest zadanie do wykonania. Na stronie z 50 wizytami dziennie różnica jest marginalna.
Czy mogę wyłączyć WP-Cron bez systemowego CRONa?
Technicznie tak — ale wtedy żadne zaplanowane zadanie się nie wykona. Bez CRONa: nie opublikują się zaplanowane posty, nie odświeżą się aktualizacje, nie wyczyszczą się transienty, nie wyślą się zaplanowane emaile. Dlatego: najpierw ustaw systemowy CRON, potem dopiero wyłącz WP-Cron.
Czy mój hosting obsługuje systemowy CRON?
Praktycznie każdy hosting współdzielony w Polsce (home.pl, nazwa.pl, cyber_Folks, zenbox, seohost, mydevil.net, dhosting, hekko) daje dostęp do CRONa w panelu. Jedynym wyjątkiem mogą być najtańsze plany typu „free hosting” — tam CRON bywa zablokowany. W takim przypadku możesz użyć zewnętrznej usługi typu cron-job.org (darmowe): ustawiasz URL https://twojadomena.pl/wp-cron.php?doing_wp_cron i częstotliwość co 5 minut.
Co to jest „?doing_wp_cron” w URL?
Parametr ?doing_wp_cron mówi WordPressowi, że żądanie pochodzi z zewnętrznego CRONa. Bez tego parametru WordPress może zignorować żądanie na niektórych konfiguracjach. Zawsze go dodawaj.
Podsumowanie
Zamiana WP-Cron na systemowy CRON to jedna z najlepszych optymalizacji, jakie możesz zrobić dla swojego WordPressa — szczególnie jeśli prowadzisz sklep, serwis z zaplanowanymi postami lub stronę o małym ruchu. Cała operacja to dwa kroki: dodaj DISABLE_WP_CRON do wp-config.php i ustaw */5 * * * * w panelu hostingu. 5 minut pracy, które eliminują opóźnione publikacje i niepotrzebne obciążenie serwera na lata.

