Перейти к содержимому

Любой может запустить запланированные задачи вашего сайта через wp-cron.php

Предупреждение Весь домен Безопасность

Общие инструкции. Откройте эту статью из отчёта PageCheck, чтобы увидеть её с адресом вашего сайта и правилами для его веб-сервера.

Что это такое

WordPress выполняет запланированные задачи — публикацию запланированных записей, отправку писем, резервные копии, обновления плагинов — через файл wp-cron.php. По умолчанию он сам запускает этот файл, пока посетители просматривают сайт, поэтому файл должен отвечать на запросы из интернета.

Что не так

Файл отвечает всем, поэтому любой, включая ботов, может запускать запланированные задачи сайта сколько угодно раз. Каждый запрос полностью загружает WordPress, поэтому повторные запросы — дешёвый способ нагрузить сервер и замедлить сайт. Задачи, запускаемые посещениями, к тому же ненадёжны: на малопосещаемом сайте они выполняются с опозданием.

Как исправить

Выполните шаги в этом порядке: если сначала закрыть файл, запланированные записи и письма перестанут уходить.

1. Запускайте запланированные задачи с сервера. Добавьте в панели хостинга запланированное задание (cron), которое выполняется каждые 5 минут:

  • Plesk: Websites & Domains → Scheduled Tasks → Add Task, тип «Run a PHP script», скрипт httpdocs/wp-cron.php.
  • cPanel: Cron Jobs, команда cd /home/USER/public_html && php wp-cron.php (со своим именем учётной записи и папкой).
  • Сервер с WP-CLI: wp cron event run --due-now --path=/path/to/site.

Запускайте файл через PHP на сервере, а не открывая его адрес через интернет (wget или curl): шаг 3 это заблокирует. У управляемых хостингов WordPress задание на сервере часто уже есть — спросите у них.

2. Отключите запуск через WordPress при просмотре страниц. Добавьте эту строку в wp-config.php над строкой /* That's all, stop editing! */:

wp-config.php

define( 'DISABLE_WP_CRON', true );

3. Закройте файл для доступа извне. Используйте правило для своего веб-сервера (хостинг подскажет, какой он):

Apache или LiteSpeed: в файле .htaccess в главной папке сайта, над строкой «# BEGIN WordPress»

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

nginx: в блоке server сайта

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

В Cloudflare его можно закрыть и там: Security → WAF → Custom rules, правило «URI Path equals /wp-cron.php» с действием Block.

4. Проверьте. Откройте https://example.com/wp-cron.php: теперь адрес должен отвечать «Forbidden» (403). Запланируйте тестовую запись на несколько минут вперёд и убедитесь, что она опубликована вовремя, затем запустите эту проверку снова.

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/

Проверьте свой сайт, чтобы узнать, есть ли у него эта проблема. Проверить сайт