Jak wyłączyć WP-Cron i uruchomić systemowy CRON w WordPress — przewodnik z przykładami

WP-Cron spowalnia stronę i nie działa na stronach z małym ruchem? Pokazuję jak go wyłączyć i zastąpić prawdziwym CRON-em systemowym — przez cPanel, DirectAdmin, Plesk i ręcznie przez SSH.

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.

Jak 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

  1. Zaloguj się do cPanel.
  2. Przejdź do sekcji „Cron Jobs” (lub „Zadania CRON”).
  3. W ustawieniach częstotliwości wybierz „Every 5 minutes” (lub wpisz ręcznie: */5 * * * *).
  4. W polu „Command” wklej:
    wget -q -O /dev/null https://twojadomena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  5. 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

  1. Zaloguj się do DirectAdmin.
  2. Przejdź do „Advanced Features → Cron Jobs”.
  3. Wpisz */5 * * * * w pola minuty/godziny/dzień/miesiąc/dzień tygodnia (lub wybierz z rozwijanej listy „Every 5 minutes”).
  4. W polu „Command” wklej jedną z komend powyżej (wget, curl lub php).
  5. Kliknij „Add”.

Plesk

  1. Zaloguj się do Plesk.
  2. Przejdź do „Scheduled Tasks” (Cron) pod domeną.
  3. Kliknij „Add Task”.
  4. Typ zadania: „Run a command”.
  5. Harmonogram: co 5 minut.
  6. 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.

Picture of Tomasz Zieliński
Tomasz Zieliński

Tomasz zajmuje się tematyką SEO, sztucznej inteligencji i automatyzacji pracy w marketingu internetowym. W swoich artykułach analizuje zmiany w algorytmach wyszukiwarek, rozwój narzędzi AI oraz nowe sposoby tworzenia i optymalizacji treści. Interesuje go przede wszystkim to, jak technologia wpływa na codzienną pracę specjalistów SEO, marketerów i twórców internetowych.

Facebook
Twitter
LinkedIn
Pinterest

Najnowsze Wpisy

Śledź nas