Przejdź do treści

Każdy może uruchomić zaplanowane zadania Twojej witryny przez wp-cron.php

Ostrzeżenie Cała domena Bezpieczeństwo

Ogólne instrukcje. Otwórz ten artykuł z raportu PageCheck, aby zobaczyć go wypełnionego adresem Twojej witryny i regułami dla jej serwera WWW.

Co to jest

WordPress wykonuje zaplanowane zadania – publikację zaplanowanych wpisów, wysyłkę e-maili, kopie zapasowe, aktualizacje wtyczek – przez plik wp-cron.php. Domyślnie sam uruchamia ten plik, gdy odwiedzający przeglądają witrynę, więc plik musi odpowiadać na żądania z internetu.

Co jest nie tak

Plik odpowiada każdemu, więc każdy, także boty, może uruchamiać zaplanowane zadania witryny tak często, jak chce. Każde żądanie wczytuje cały WordPress, więc powtarzane żądania to tani sposób na obciążenie serwera i spowolnienie witryny. Zadania uruchamiane przez odwiedziny są też zawodne: na rzadko odwiedzanej witrynie wykonują się z opóźnieniem.

Jak naprawić

Wykonaj kroki w tej kolejności: zablokowanie pliku na początku zatrzymałoby zaplanowane wpisy i e-maile.

1. Uruchamiaj zaplanowane zadania z serwera. Dodaj w panelu hostingu zadanie harmonogramu (cron) uruchamiane co 5 minut:

  • Plesk: Websites & Domains → Scheduled Tasks → Add Task, typ „Run a PHP script”, skrypt httpdocs/wp-cron.php.
  • cPanel: Cron Jobs, polecenie cd /home/USER/public_html && php wp-cron.php (z własną nazwą konta i folderem).
  • Serwer z WP-CLI: wp cron event run --due-now --path=/path/to/site.

Uruchamiaj plik przez PHP na serwerze, a nie przez otwieranie jego adresu z internetu (wget lub curl): krok 3 to blokuje. Zarządzane hostingi WordPressa często mają już zadanie na serwerze – zapytaj je.

2. Wyłącz uruchamianie go przez WordPress przy wyświetleniach stron. Dodaj ten wiersz do wp-config.php, nad wierszem /* That's all, stop editing! */:

wp-config.php

define( 'DISABLE_WP_CRON', true );

3. Zamknij plik dla świata. Użyj reguły dla swojego serwera WWW (Twój hosting powie Ci, który to):

Apache lub LiteSpeed: w pliku .htaccess w głównym folderze witryny, nad wierszem „# BEGIN WordPress”

<Files "wp-cron.php">
    Require all denied
</Files>

nginx: w bloku server witryny

location = /wp-cron.php {
    deny all;
}

W Cloudflare możesz zamiast tego zablokować go tam: Security → WAF → Custom rules, reguła „URI Path equals /wp-cron.php” z akcją Block.

4. Sprawdź. Otwórz https://example.com/wp-cron.php: adres powinien teraz odpowiadać „Forbidden” (403). Zaplanuj wpis testowy kilka minut naprzód i sprawdź, czy zostanie opublikowany na czas, a potem uruchom ten test ponownie.

Close wp-cron.php on my WordPress site to requests from the internet, without breaking scheduled tasks. https://example.com/wp-cron.php currently answers anyone.
The web server type is not known; check which one the site runs on.

Steps, in this order:
1. Set up a server-side scheduled task that runs WordPress cron every 5 minutes with PHP on the server (php wp-cron.php from the site's folder, or wp cron event run --due-now). Not wget/curl over HTTP: step 3 would block it.
2. Add define( 'DISABLE_WP_CRON', true ); to wp-config.php above "That's all, stop editing!".
3. Deny HTTP access to /wp-cron.php: on Apache/LiteSpeed a <Files "wp-cron.php"> Require all denied </Files> block in .htaccess above # BEGIN WordPress; on nginx location = /wp-cron.php { deny all; } in the server block.
4. Verify: /wp-cron.php answers 403, wp cron event list shows no overdue events after 10 minutes, and a post scheduled a few minutes ahead is published on time.
Tell me exactly which files you changed and what to check in the hosting control panel.

Resources:
- Hooking WP-Cron into the system task scheduler (WordPress.org): https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

Sprawdź swoją stronę, aby zobaczyć, czy ma ten problem. Sprawdź stronę