¿Nunca te ha pasado que has programado una entrada en WordPress o una oferta en WooCommerce y, pasado el momento de la publicación (o de aplicación de la oferta), te has encontrado con el aviso de Programación perdida? Supongo que si has llegado hasta este artículo las probabilidades de que la respuesta sea Sí son bastante altas.
Es una faena. Te vas dejándolo todo preparado, confiando en que mientras tú estás haciendo otra cosa WordPress va a hacer lo que le has dicho que haga, como un buen chico, y cuando vuelves a entrar en el escritorio te encuentras con el dichoso cartelito de Programación perdida.
Bueno, pues no te volverá a pasar. En este artículo vas a aprender por qué ocurre esto y no una forma de solucionarlo, sino dos diferentes. Para que elijas la que más te guste.
Tabla de contenidos
Programación perdida en WordPress. ¿Por qué sucede?
En realidad este fallo puede deberse a dos posibles motivos. Pero para poder comprender cómo y por qué se produce hay que ir al origen del asunto: el archivo wp-cron.php.
La programación de tareas en WordPress
En un ordenador hay un servicio llamado cron que se ejecuta siempre en segundo plano (lo que en la jerga informática conocemos como un demonio) y que revisa cada minuto la lista de tareas que hay programadas para ese momento.
Si para ese minuto no hay ninguna programación, cron (el nombre proviene del griego chronos, tiempo) espera un minuto más y vuelve a comprobar. Si hay tareas que cumplir, simplemente ejecuta el comando. Los usuarios de sistemas UNIX y *NIX (como GNU/Linux) seguro que tienen el concepto claro si han usado alguna vez el crontab. Pero me estoy yendo por las ramas: volvamos a WordPress.
WordPress no es un sistema operativo que pueda tener por sí mismo un demonio corriendo en segundo plano, así que utiliza un sistema muy ingenioso: un seudocron generado por el archivo wp-cron.php, que realiza la comprobación cuando se ejecuta cualquier script del CMS. ¿En cristiano? Pues que comprueba si hay tareas pendientes cuando se carga alguna página de nuestra web.
Este bucle es el «corazón» del archivo wp-cron.php
Supongo que ya no hace falta que explique más, seguro que ya te has dado cuenta por tí mismo/a: si no hay carga de páginas de WordPress, no hay comprobación (ni, por tanto, ejecución) de tareas programadas.
Así pues ya sabemos las dos posibles causas de que las tareas programadas en WordPress se queden en ocasiones como Programación perdida:
- Hay muy pocas visitas en la web, y en los momentos en que debería haberse publicado el post nadie la visitaba, por lo que wp-cron.php no pudo ejecutarse
- Estamos utilizando un plugin de caché que está realizando una caché de objetos, y cuando alguien visita la web se le sirve un HTML estático generado a partir del código PHP, pero sin realizar ninguna llamada al CMS, por lo que tampoco se ejecuta wp-cron.php
Con algunos de los plugins de caché más utilizados, como W3 Total Cache, es posible desactivar la caché de objetos de forma independiente. La opción la tienes en Performance > General Settings > Object Cache.
Caché de objetos en el plugin W3 Total Cache
Si el que tú usas no dispone de esa opción, o si la causa en tu caso es el bajo tráfico, no desesperes: aún hay dos soluciones que puedes aplicar. Sigue leyendo.
Soluciones al problema
Como decía al principio, no hay una única solución al problema, sino dos alternativas. Así que es posible elegir entre una fácil y una buena. Empezaremos con la buena.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Programar un cron real en el servidor
Y digo buena porque siempre que se pueda evitar instalar un plugin, hay que evitarlo. Los plugins sobrecargan la instalación y la web, lo que la hace menos eficiente y la ralentiza. Piensa que, en la mayoría de ocasiones, estás cargando un montón de código, estilos y javascripts innecesarios o accesorios para una tarea que podría quedar limpiamente despachada con un par de líneas de código. En este caso, ni eso.
Porque la primera solución pasa por utilizar el cron real del servidor para que llame al seudocron de WordPress, al archivo wp-cron.php. Es decir, vamos a crear una tarea en el servidor para que nos haga el trabajo.
Ésta es la solución buena porque sólo tendrás que hacerlo una vez y ya tendrás el problema resuelto para siempre, sin instalar nada en tu WordPress y sin que afecte en lo más mínimo al rendimiento de tu sitio web. Así que calcula si merece la pena ensuciarse un poco las manos.
Lo malo es que no puedo guiarte paso a paso porque cada servidor es distinto, y no sé cómo será el panel de control del tuyo, pero no te será demasiado difícil encontrar el sitio. Te voy a poner como ejemplo el panel de control de CDmon, la empresa de hosting que yo suelo utilizar.
En mi caso como digo la opción se llama CRON Jobs, y seguro que en el tuyo se llama también así, o Tareas Cron, Programación de tareas, Tareas programadas o un nombre similar.
Pues bien, sólo necesitas entrar en esa opción y añadir una nueva tarea. En ella tendrás que especificar los siguientes valores:
- Comando a ejecutar. Aquí puedes encontrar dos opciones: que simplemente te pida la ruta o el comando completo. Dependiendo del dato que te pida, tendrías que poner:
- Ruta: http://www.tuwebsuperchula.com/wp-cron.php?doing_wp_cron
- Comando: wget -q -O – -t 1 http://www.tuwebsuperchula.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
- Rango de tiempo:
- Cada 30 minutos (esto es suficiente y, de hecho, es la frecuencia máxima que muchos hosting imponen para no sobrecargar la CPU del servidor)
- Cada hora
- Cada día
- Cada mes
Después pulsas en Añadir cron o Añadir tarea o como sea que ponga el botón guardar, y listo. Asunto resuelto para el resto de la eternidad.
Utilizar un plugin
Y si ésa era la solución buena, también tenemos la fácil: instalar un plugin. Ya sabes que te recomiendo la opción anterior, pero si no hay más remedio también puedes echar mano del plugin Improved Cron.
Improved Cron lo que hace es simular una visita a tu sitio web cada minuto, con lo que el problema queda resuelto. Sí, he dicho cada minuto. No incluye ninguna opción para cambiar el periodo de tiempo, aunque el autor ha tenido el detalle de incluir un hook en el código para poder hacerlo fácilmente con una sencilla función, que puedes añadir en tu functions.php o, mejor aún, en tu plugin de funciones personalizadas:
add_filter ('cron_schedules', 'ejr_improved_cron_intervalo' );
function ejr_improved_cron_intervalo () {
$segundos= 900; // Aquí el número de segundos que quieras. Lo he puesto a 15*60=900, 15 minutos
$intervalo ['ejr_mi_intervalo'] = array ('intervalo' => $segundos, 'display' => sprintf ('%d segundos', $segundos));
return $interval;
}
add_filter ('imcron_interval_id', 'ejr_establece_improved_cron_intervalo' );
function ejr_establece_improved_cron_intervalo () {
return 'ejr_mi_intervalo';
}
Pero en fin, esto no es necesario si no quieres, puedes perfectamente dejarlo en sesenta segundos, que es lo que viene por defecto. Así, una vez que lo has instalado y activado, sólo tienes que ir a Herramientas > Improved Cron y pulsar Start. Asunto resuelto.
Y un problema menos. Ya has visto que te ofrezco dos soluciones, la fácil y la buena. Y te recuerdo que las tareas de mantenimiento como ésta están incluidas en mi servicio de mantenimiento y soporte profesional para WordPress, con lo que no tienes que preocuparte más del correcto funcionamiento de tu web.
Lea Dominguez dice
Hola Enrique. Probé con la primera opción, la buena. No me dio resultado. Agregué la linea de código que sugeriste en un apartado que se llama «tareas programadas», cambié el dominio y otra vez programación perdida. hay algún truco que no estoy teniendo en cuenta?
Enrique J. Ros dice
Hola Lea. En principio debería funcionar sin problemas, salvo que el servidor tenga restringido el comando wget por alguna directiva de seguridad. Deberías consultarlo con tu proveedor de hosting, y si es así ellos podrían decirte qué otro comando (que tengan permitido) puedes usar.
Un saludo.
Lino H. dice
Hola Enrique.
Gracias por la ayuda, lo que me pasa ahora es que no arranca, doy click en Start y se mantiene en Stopped.
Más gracias
Enrique J. Ros dice
Hola Lino
Así es imposible conocer la causa. Quien mejor te puede ayudar es el propio autor del plugin, puedes consultarle a través del foro de soporte.
Un saludo.