Una de las funcionalidades menos conocidas de WordPress que afecta de manera importante a la optimización de recursos de tu web es el cron de WordPress: WP-Cron.
Si eres aficionado – como yo – a optimizar WordPress para pagar menos hosting, te animo a conocer qué es WP-Cron, cómo funciona, por qué es importante y cómo controlarlo y hasta desactivarlo.
Índice de contenidos
Qué es un cron
Cron es un comando UNIX con el que programar trabajos que se ejecutarán en el futuro.
Un cron se usa normalmente para programar un trabajo que se ejecuta periódicamente. Por ejemplo, puedes utilizar una función de cron para enviar un aviso cada mañana. También es un proceso demonio, lo que significa que se ejecuta continuamente, esperando a que ocurran eventos específicos.
Cómo funciona el WP-Cron de WordPress
Como WordPress se instala con multitud de distintas configuraciones, para que todo funcione correctamente los desarrolladores de WordPress incluyeron un pseudo cron que incluye las funciones de WP-Cron functions, que ayudan a ejecutar trabajos programados como:
- Buscar actualizaciones de temas y plugins
- Publicar entradas programadas
- Enviar pingbacks
- … muchas más cosas.
Al contrario que los trabajos cron reales, que se ejecutan a una hora específica basada en los ajustes del servidor, la función WP-Cron se ejecuta cada vez que alguien visita un sitio creado con WordPress.
Con esto se consigue que casi cualquier sitio WordPress se ejecute correctamente en distintas configuraciones de servidores, ya que elimina montones de requisitos específicos de los servidores.
En cada carga de página, WordPress comprueba si hace falta ejecutar un WP-Cron, y si así fuera, hace una petición por HTTP al archivo wp-cron.php.
El motivo de esta llamada al archivo wp-cron.php es porque algunos trabajos llevan más tiempo y no se puede hacer esperar al usuario que quiere ver la página del sitio WordPress. Lógico ¿no?
Al hacer la llamada a wp-cron.php se ayuda a mantener en funcionamiento la función WP-Cron como un proceso separado de fondo, sin generar retrasos en los tiempos de carga de las páginas para los visitantes.
Una vez se inicia la función WP-Cron, sigue ejecutándose hasta que se completen todos los trabajos requeridos, o hasta que alcance un tiempo de ejecución definido en la configuración del servidor.
Dependiendo de la configuración de tu servidor, puede que WP-Cron no termine de completar sus trabajos, o que incluso ni siquiera funcione.
Luego está el hecho de que en los sitios con mucho tráfico el que haya múltiples procesos de WP-cron ejecutándose en cada acción generen problemas de rendimiento, e incluso caídas de la web.
Hay gente (sí, la hay) que critica por esto a WordPress, pero no es en sí un problema de WordPress, pues cada instalación es diferente y, conociéndola, podemos personalizar nuestro WordPress para se ejecute del modo más óptimo posible.
Problemas con el cron
Ahora que ya conocemos los principios básicos del cron de WordPress vamos a ver posibles problemas, y más adelante soluciones.
Múltiples procesos de WP-Cron en sitios con mucho tráfico
Si eres administrador de un servidor o gestionas tu propio servidor con un cortafuegos, es posible que hayas recibido correos electrónicos de tu cortafuegos sobre que hay un archivo wp-cron.php ejecutándose durante un largo período de tiempo.
Esto ocurre cuando el tiempo de ejecución del script configurado en tu servidor es superior a 60 segundos. Como el proceso no se termina, y se inician nuevos procesos, se ejecutan múltiples instancias del proceso WP-Cron en el servidor.
Esto no sucede en webs con poco tráfico, pero si tu web WordPress tiene usuarios simultáneos en un momento dado y el tiempo máximo de ejecución del script está configurado con valores altos, entonces habrá muchas instancias de la función WP-Cron ejecutándose.
Hasta la versión 3.3 de WordPress, siempre había un problema de múltiples procesos cron que se ejecutaban en bucle sobre los mismos eventos.
Entradas programadas que no se publican
Otro problema muy conocido, y que los proveedores de hosting especializados en WordPress conocen bien, es que en algunas web con muy poco tráfico las publicaciones programadas no se publican.
Como la función WP-Cron sólo se ejecuta cuando hay una solicitud de página, si no hay solicitudes entonces los trabajos programados no se ejecutan.
Esto antiguamente también pasaba por otros motivos, pero hace bastantes versiones de WordPress que se ha convertido en un problema relativamente residual. Que pasa poco vaya.
WP-Cron no se ejecuta
De nuevo, esto es un problema con la configuración del servidor.
Debido a una configuración incorrecta, el cortafuegos bloquea los scripts que impiden que se llamen a sí mismos, por lo que la función WP-Cron no funciona.
Cómo solucionar la mayoría de los problemas con WP-Cron
Para evitar múltiples instancias de WP-Cron ejecutándose en tu servidor para una sola web, vamos a ver la forma habitual de configurar trabajos cron en un servidor Linux (Apache). La ventaja de este método es:
- Más control sobre cómo se ejecuta la función WP-Cron.
- Permitir múltiples loops.
- Si tienes un servidor con un montón de webs WordPress esto puede reducir la carga del servidor.
Antes de meterte en esto, asegúrate de que tu servidor te permite configurar trabajos cron de Linux.
Su configuración será diferente según el panel de control que ofrezca tu hosting, pero en esta guía veremos con configurar un trabajo cron usando el panel de control cPanel, muy habitual en servidores Linux hoy en día, y en el panel de herramientas de SiteGround, uno de los proveedores de hosting más utilizados por los usuarios de WordPress
Los pasos a seguir son:
- Desactivar la función WP-Cron interna de WordPress que se ejecuta en cada carga de página.
- Configurar una función cron real que haga una solicitud
get
al archivo wp-cron.php a intervalos regulares basados en tus preferencias y/o necesidades.
Sí, así de sencillo, solo dos pasos para hacer que todo funcione mejor, más fluido y rápido.
NOTA IMPORTANTE: Antes de seguir ten en cuenta que desactivar el WP-Cron también puede resultar en que algo en la web deje de funcionar, dependiendo de tu configuración o de los plugins que uses.
Desactivar la función WP-Cron
Abre el archivo wp-config.php en tu editor o IDE favorito y añade la siguiente línea (justo antes de la que dice «Deja de editar… »):
/* Desactivar Wp-Cron */ define('DISABLE_WP_CRON', true);
Esta constante hará que la función WP-Cron de WordPress deje de ejecutarse y no llame al archivo wp-cron.php.
Configurar una función cron real en tu servidor
Si tienes acceso en tu hosting a alguna herramienta para configurar trabajos cron tienes que configurar un trabajo cron nuevo como el siguiente:
wget -q -O - https://tudominio.es/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Nota: Antes de usar este comando recuerda cambiar el dominio de ejemplo por el tuyo.
Cómo crear y configurar un trabajo cron real
El proceso visto en el punto anterior, varía dependiendo de tu alojamiento, de tu empresa de hosting, así que vamos a ver dos de los casos más comunes.
Crear un trabajo cron real con cPanel
Si tu empresa de hosting utiliza cPanel primero localiza la herramienta de trabajos cron.
Una vez accedas a la herramienta configura un nuevo trabajo cron a partir de las configuraciones comunes que verás en el desplegable.
En este brevísimo vídeo se ve lo fácil que es…
En el vídeo anterior he seleccionado la de «Una vez cada 5 minutos», y como habrás visto se rellenan automáticamente todos los campos necesarios menos el del comando.
El comando es el que vimos antes, este:
wget -q -O - https://tudominio.es/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Cuando añadas el nuevo trabajo cron, y si has desactivado la función WP-Cron previamente como hemos visto, en este ejemplo, el servidor hará una solicitud al archivo wp-cron.php cada 5 minutos, en vez de en cada visita a cualquier página de tu web.
Crear un trabajo cron real en SiteGround
Si tienes tus sitios WordPress alojados en SiteGround tienes un panel diferente, pero es igual de fácil crear trabajos cron reales.
Desde las Site Tools simplemente ve a la sección de desarrolladores y ahí encontrarás dónde crear trabajos cron.
Como ves en este corto vídeo es igual o más fácil que en cPanel…
Por supuesto, da igual la herramienta que uses, puedes cambiar los ajustes de programación a otras opciones si lo prefieres y compruebes que es más óptimo para tu web; cada minuto, cada media hora, lo que veas.
Cómo controla los trabajos cron de WP-Cron
Una decisión diferente a la anterior, para evitar los problemas de WP-Cron, sería controlar, añadir, borrar y personalizar los trabajos cron de WP-Cron.
Para eso mi consejo es que te ayudes del maravilloso plugin WP-Crontrol, uno de mis plugins esenciales de siempre.
Una vez activo te ofrece una completísima interfaz desde la que puedes ver los procesos de WP-Cron programados y realizar acciones sobre ellos, como ejecutarlos, editarlos e incluso borrarlos.
También verás que hay trabajos cron huérfanos, dejados por plugins alguna vez activos, que en este caso puedes borrar sin piedad, para evitar procesos innecesarios.
Si decides editar un trabajo cron la interfaz es muy sencilla.
También tienes una pantalla en la que crear nuevas programaciones cron personalizadas, para luego aplicarlas rápidamente a los trabajos cron.
Además, puedes añadir nuevos trabajos cron con la programación que quieras, por defecto o creada por ti previamente.
Y, por último, también puedes añadir trabajos cron mediante PHP, con tus propios ganchos de WordPress por ejemplo, desde una sencilla interfaz.
Como puedes comprobar, muy potente, realmente completo, y muy interesante para todo aquél que quiera tener crontrolado WP-Cron.
Bueno, espero que esta guía sobre WP-Cron te haya ayudado a conocer y comprender esta funcionalidad de WordPress tan importante, sus implicaciones de cara al WPO y cómo controlarla y desactivarla, si quieres.
Si te quedan dudas déjalas en la sección de comentarios y trataremos de resolverlas.
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!
Buenas tardes
Excelente post felicitaciones…
Por favor m dices cual es tiempo recomendado de actualización de las tareas con el CRON
Cada 30, 60 min etc
No hay nada recomendado «universal» sino lo que cada web necesite. No es lo mismo si necesitas tareas cron automatizadas cada hora o solo 2 al día, depende de cada sitio.
Excelente como siempre!
que sucede si trabajo con https://cron-job.org/en/ no me deja poner la url de esta manera:
wget -q -O – https://www.dominio.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
será que es lo mismo que la ingrese así?: https://www.dominio.com/wp-cron.php?doing_wp_cron
gracias
En un servidor cloud con más de 90 webs WP, lo ideal entiendo que sería diferir cada web con una diferencia de minutos para que no se ejecuten las 90 webs juntas.
Siendo así, lo ideal sería hacer que en cada web quedara una de estas configs?:
1 * * * *
2 * * * *
3 * * * *
…
Entiendo que esta config lo que hace es que cada hora, se ejecuta una al minuto 1, otra al minuto 2, etc,
Siendo así llegaría a la web 59 así:
59 * * * *
y volvería a empezar.
Es demasiado una espera de una hora (me imagino que un woocommerce tardaría una hora en enviar los emails de confirmación de compra?)
gracias!
Buenas tardes fernando . E lSabado pasado cambie el panel de control de mi VPS por Hestia , y no tuve problema alguno salvo que ( como siempre en carne propia, justo en mi web ) me da este error:
La API REST es una forma en que WordPress y otras aplicaciones se comunican con el servidor. Un ejemplo es la pantalla del editor de bloques, que se basa en esto para mostrar y guardar tus publicaciones y páginas.
Ha fallado la solicitud a la API REST debido a un error.
Error: cURL error 7: Failed to connect to paucompany.es port 443 after 0 ms: Connection refused (http_request_failed)
He creado una regla en el cortafuegos del servidor para aceptar la conexión al puerto, he seguido por supuesto, al pie de la letra tu tutorial, pero no encuentro la manera de conseguir reactivar el cron. Esto me produce problemas de cacheo con WP-Rocket. Si pudieras ayudarme te lo agradecería un monton.
yo cree una configuración cron para que mi academia on line envíe una notificación e-mail cada vez que alguien inicie un curso, el asunto es que lo envía desde el usuario «wordpress», mi pregunta es, ¿Cómo puedo cambiar ese usuario? de hecho hasta creó un e-mail llamado [email protected] para enviar los emails (o quizas ya existía de antes). Sinceramente lo hice con la guía mínima y funcionó, solo me queda ese detalle, te agradezco de ante mano, mil gracias, un saludo! siempre los leo…