Este semana he querido comenzarla contando que es lo que hace uno de los ficheros del Core de WordPress, y porque y como deshabilitar wp-cron (wp-cron.php) o como suele llamarse el WordPress Cron o el Cron de WordPress, pero antes me gustaría contarte el porque este fichero me hizo “pelear” con el blog.

Hace unas semanas atrás estaba “peleado” con el blog debido a que no quería hacer lo que le pedía, y era sencillamente que publicara en un determinado horario alguna de las entradas más antiguas en mi Twitter, para esto le había instalado un plugins que realizaba dicha tarea, pero llegaba la hora de publicar y no pasaba nada, incluso se dejaron de publicar las entradas programadas.

En un comienzo solo lo considere algo anecdótico, pero al pasara algunos días, y algunas entradas publicadas “a mano” en un horario que no era el habitual comencé a pesquisar cual era realmente el problema.

En un comienzo descubrí que una función del core de WordPress no se lleva muy bien con W3 Total Cache, que es el plugin de cache que utilizo, la función en concreto es el Cron de WordPress.

El Cron de WordPress puede ser una muy buena solución para programar las tareas de WordPress sin toquetear mucho ninguna otra cosa, supuestamente más complicada, pero también hace que el uso de los recursos del servidor se vean afectados mientras más visitas y paginas vistas tenga tu blog.

Al final, y luego de mucha búsqueda, hipótesis, pruebas y errores, o sea aplicando el método científico, tanto para saber cual era el problema, una mezcla entre W3 Total Cache, Cloudflare y alguna que otra visita, la única solución que vi como viable era deshabilitar wp-cron y reemplazarlo por el Cron del sistema, que en la practica esta mucho mejor preparado para ejecutar tareas recurrentes.

Qué es wp-cron

Según el propio sitio de WordPres.org wp_cron como función hace “Run scheduled callbacks or spawn cron for all scheduled events.“ que en español y de una manera fácil de entender, esta función es la encargada de que todo lo que requiera que sea ejecutado en un determinado horario o de forma periódica cada determinado espacio de tiempo sea, aunque suene repetitivo, ejecutado sin contratiempo.

Una de las mejores soluciones para hacer la vida de WordPress mucho más sencilla, supuestamente, y de esta forma adaptarse a una gran variedad de situaciones y escenarios en donde se instala, especialmente en servidores compartidos, donde tu como dueño de tu espacio no tienes permisos de toquetear las funciones del servidor, especialmente el Cron del sistema.

En definitiva el wp-cron realmente es el encargado de algunas tareas sumamente importante e interesante, que sin enfrentarte a algún problema su ejecución pasaría desapercibida, algunas de las tareas que realiza son:

  • Buscara actualizaciones automáticamente de WordPress, los temas, los plugins y las traducciones
  • Publicar las entradas que han sido programadas para una fecha futura.
  • Crear copias de seguridad, si es que has instalado algún plugins para esto.
  • Publicar tus entradas más antiguas, algo muy recomendado si tus artículos son evergreen y te has instalado algun plugin para esto.
  • Enviar pingbacks.

El gran problema del Cron de WordPress es debido a su propia ventaja, específicamente la forma en que se ha de ejecutar para que pueda reemplazar al Cron del sistema. Para poder ejecutarse y que funcione sin problema alguno wp-cron es llamado a que se “active” en cada visualización de alguna de las páginas y entradas de tu blog, de esta forma se asegura de consultar la hora y ver que ha de ejecutar en ese determinado tiempo.

La forma como se ejecuta suena muy bonita y casi mágica, pero he encontrado que conlleva dos grandes problemas, uno con la cache, en mi caso fue el mix entre W3 Total Cache y Cloudflare, y el otro es con una sobrecarga en los recursos del servidor, mientras más visitas tenga el blog, más llamadas a ejecutar el archivo wp-cron.php

wp-cron y W3 Total Cache

Como he dicho y a quedado claro, espero, para una mejor respuesta de tu blog frente a quienes lo visitan, sean Personas o Google, es necesario contar con un sistema de Cacheo, de esta manera el servidor no esta constantemente descifrando el código php y transformándolo en html estático, sino que muestra las paginas ya “transformadas” en html, proceso que hace una vez y no por cada visitante al sitio, por lo que en resumen es más rápida la respuesta del servidor.

Pero el ejecutar antes, y una sola vez el código php y luego solo mostrar páginas html hace que no se ejecuten las llamadas a wp-cron, por lo que el Cron de WordPress ni se entera que tiene que mandar a trabajar alguna función especifica o algún plugin que necesita hacer alguna tarea en determinado horario.

Esto no solo afecta a W3 Total Cache, es algo que puede llegar a afectar a cualquier WordPress con cualquier sistema o plugin de cache, al final pase una semana entera rompiéndome la cabeza para descubrir este “problemita”, que aunque trae consigo varios errores, la suma y resta de utilizar cache inclina la balanza hacia su uso, por lo que tenia que buscar una alternativa.

wp-cron y las visitas al sitio

Si me hubiera decantado por eliminar el cache, me habría enfrentado, a corto o largo plazo, todo depende de ti que lees y compartes el blog, a que saturara los recursos del servidor donde se encuentra el blog, que esta con un plan de Hosting compartido, por lo que los recursos son siempre escasos.

Cada ejecución de código php requiere un determinado uso de los recursos del servidor y si lo unimos con que por cada vista de pagina se llama a que se ejecute wp-cron y lo que conlleva su ejecución en gastos de recursos nos podríamos encontrar que el limite de recursos asignado se sobrepasaría, y con creces, al que tu proveedor tiene asignado para el servicio que contrataste.

Al final resultaría que tu sitio es “cerrado”, con un bonito error 503, por alto consumo de recursos y te verías en la necesidad de gastar invertir más en tu servicio de hospedaje, algo que a priori seria la gran solución, pero estarías perpetuando el problema y la supuesta solución en una escalada sin fin aparente, resintiéndose tu bolsillo quizás al punto de verte en la necesidad de cerrar tu blog, y si lo utilizas como negocio, desviando recursos que te serian más provechosos en otras cosas.

Como deshabilitar wp-cron

La solución al problema pasa por desactivar wp-cron y habilitar el Cron del Sistema, en palabras puede sonar facilito, pero depende de que tan buen soporte y servicio tenga tu proveedor de hosting, algunos te negaran “de plano” que puedas crear tareas en el Cron del sistema. En mi caso no tuve problemas con el soporte de inc.cl, que luego de explicarle no tuvieron problema en habilitarme el uso del cron del sistema.

Pero primero te muestro como deshabilitar wp-cron, que como todo en WordPres no es para nada complicado y solo basta con poner una linea en el wp-config de tu sitio en un determinado lugar, la linea en cuestión es:

define('DISABLE_WP_CRON', true);

En muchos lados se recomienda que se sitúe justo debajo de las lineas en donde se define la base de datos, de esta forma

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'db_name);

/** MySQL database username */
define('DB_USER', 'db_user');

/** MySQL database password */
define('DB_PASSWORD', 'db_pass');

/** MySQL hostname */
define('DB_HOST', 'localhost');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

/** Disable WordPress Cron */
define('DISABLE_WP_CRON', true);

Con esto ya esta deshabilitado en wp-cron, si nos quedamos aquí veremos como nada funciona como se espera, para eso hay que habilitar el cron del sistema para que llame a ejecutar en determinados periodos el archivo wp-cron.php que si tu blog no es un periódico con una infinidad de noticias urgentes de ultima hora, es recomendable que se ejecute cada una hora o más.

Cómo habilitar el cron de sistema con CPanel

En mi proveedor actual de Hosting (inc.cl), el panel de control es CPanel, así que te puedo mostrar como fue que lo hice para lograr activar el Cron de Sistema (Linux), que por defecto para las cuentas de hosting compartido esta deshabilitado.

A primera vista el manejo de Cron se encuentra en la sección avanzada como Cron Trabajos

CPanel de inc.cl

Primero y para que me permitieran el poner tareas en cron tuve que contactarme con el soporte de INC, les explique y les mande el comando a poner en cron, al poco tiempo me responden y me liberan para que pueda incorporar tareas a Cron.

Luego de la aprobación para incorporar tareas a cron, ingresa nuevamente al CPanel y especificamente a Cron Trabajos para poder crear uno y reemplazar el Cron de WordPress, en definitiva el comando a incorporar es php /home/usuario/public_html/wp-cron.php, si o dejas tal cual te llegara un lindo e-mail cada vez que se ejecute la tarea, en lo personal lo deje asi por algunos día para ver si existía algún error.

Si no quieres que te llegue a tu e-mail la respuesta del comando reemplázalo por php /home/usuario/public_html/wp-cron.php >/dev/null 2>&1, con lo ultimo envió la salida del comando a /dev/null y no al e-mail.

Volviendo al CPanel, en Añadir un nuevo trabajo de Cron configuras la tarea (comando) a ejecutar. Si programas tus contenidos en una determinada hora, en mi caso a las 13:00 ten en consideración esto para señalarle a cron cada cuanto ejecutar el comando, yo lo tengo cada hora en el minuto 5; o sea, cron ejecuta la tarea a las 12:05, luego a las 13:05 y así cada hora, en la siguiente imagen te muestro como lo configure.

Configurando cron para WordPress

Con esto ya funcionando, el problema de wp-cron estaría solucionado sin perder funcionalidad alguna en tu WordPress.

Palabras al Cierre

Hasta aquí es el articulo de hoy, pero antes déjame señalarte que la solución que te presento solo funciona en instalaciones de WordPress con un solo sitio web, por la red se encuentran otros comandos que hacen uso de wget o curl como por ejemplo:

wget -q -O – -t 1 http://tusitioweb.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

en lo personal lo probé pero no me funciono, la razón no la tengo clara pero le hecho la culpa a que utilizo Cloudflare delante del blog.

También existe un servicio externo que provee la posibilidad para crear tareas cron y reemplazar, en parte, al cron nativo del servidor donde tienes tu blog, el servicio en cuestión es EasyCron, no te puedo decir si es bueno o malo, nunca lo he utilizado; por lo que si lo pruebas cuéntame en los comentarios como te va con él.