Ir al contenido

Cualquiera puede ejecutar las tareas programadas de tu sitio a través de wp-cron.php

Aviso Todo el dominio Seguridad

Instrucciones generales. Abre este artículo desde tu informe de PageCheck para verlo con la dirección de tu sitio y las reglas para su servidor web.

Qué es

WordPress ejecuta sus tareas programadas —publicar entradas programadas, enviar correos, copias de seguridad, actualizaciones de plugins— a través del archivo wp-cron.php. Por defecto lo lanza él mismo mientras los visitantes navegan por el sitio, así que el archivo tiene que responder a peticiones de internet.

Qué falla

El archivo responde a cualquiera, así que cualquiera, bots incluidos, puede lanzar las tareas programadas del sitio tantas veces como quiera. Cada petición hace que WordPress se cargue entero, así que las peticiones repetidas son una forma barata de cargar el servidor y ralentizar el sitio. Las tareas lanzadas por las visitas además no son fiables: en un sitio con poco tráfico se ejecutan tarde.

Cómo arreglarlo

Sigue los pasos en este orden: bloquear primero el archivo detendría las entradas programadas y los correos.

1. Ejecuta las tareas programadas desde el servidor. Añade en el panel del hosting una tarea programada (cron) que se ejecute cada 5 minutos:

  • Plesk: Websites & Domains → Scheduled Tasks → Add Task, tipo «Run a PHP script», script httpdocs/wp-cron.php.
  • cPanel: Cron Jobs, comando cd /home/USER/public_html && php wp-cron.php (con tu propio nombre de cuenta y carpeta).
  • Un servidor con WP-CLI: wp cron event run --due-now --path=/path/to/site.

Ejecuta el archivo con PHP en el servidor, no abriendo su dirección por internet (wget o curl): el paso 3 lo bloquea. Los hostings de WordPress gestionado suelen tener ya una tarea de servidor; pregúntales.

2. Impide que WordPress lo lance en cada visita. Añade esta línea a wp-config.php, encima de la línea /* That's all, stop editing! */:

wp-config.php

define( 'DISABLE_WP_CRON', true );

3. Cierra el archivo al exterior. Usa la regla de tu servidor web (tu hosting puede decirte cuál es):

Apache o LiteSpeed: en el archivo .htaccess de la carpeta principal del sitio, encima de la línea «# BEGIN WordPress»

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

nginx: en el bloque server del sitio

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

Con Cloudflare puedes bloquearlo allí en su lugar: Security → WAF → Custom rules, una regla «URI Path equals /wp-cron.php» con la acción Block.

4. Compruébalo. Abre https://example.com/wp-cron.php: ahora debería responder «Forbidden» (403). Programa una entrada de prueba unos minutos más tarde, comprueba que se publica a su hora y después vuelve a ejecutar esta comprobación.

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/

Revisa tu sitio para ver si tiene este problema. Revisar un sitio web