WPLake > Blog > 5 cosas importantes sobre WordPress Cron
  • English
  • Deutsch
  • Français
  • Italiano

5 cosas importantes sobre WordPress Cron

Hora de leer: 9 minutos

-

General Tutoriales

-

Actualizado 14.07.23

WordPress Cron proporciona una manera fácil de programar acciones sin tener que ocuparse de la implementación. Repasamos momentos concretos para ayudarte a gestionar Cron correctamente.

Índice

¿Qué es Cron?

#enlace copiado

El Cron en pocas palabras, es una manera de ejecutar algunas tareas (o trabajos si se quiere) en un horario. Por ejemplo, para mantener los tipos de cambio actualizados en su sitio web necesita actualizarlos una vez al día. En lugar de hacerlo manualmente, creas una tarea cron y la configuras con la frecuencia de una vez al día. Cron es ampliamente utilizado en muchos plugins y temas de WordPress para mantener la información actualizada.

Cron del sistema VS Cron de WordPress

#enlace copiado

Con WordPress tienes 2 formas diferentes de hacerlo.

Cron del sistema

#enlace copiado

La primera forma es añadirlo en el cron del sistema Linux (esto es en tu servidor de hosting). Estas tareas se encuentran en el /etc/crontab archivo y con este enfoque es la forma más universal y más fiable para ejecutar tareas Cron. El sistema operativo de su servidor (por ejemplo, Linux, Ubuntu o RedHat) garantiza que las tareas en nuestros archivos PHP serán llamadas tal y como fueron programadas, independientemente de cualquier evento externo.

Aunque es más universal y fiable, no tiene integración con WordPress. Esto significa que si llama a archivos PHP dentro de su tema directamente, entonces no tendrán acceso a ninguna función de WordPress ni a la Base de Datos. Debido al hecho de que WordPress no puede cargar correctamente de esta manera. Además, no es adecuado para plugins, porque si usted está usando el plugin, no se puede simplemente configurar el sistema Cron para todos sus clientes.

WordPress Cron

#enlace copiado

Entonces aquí entra WordPress Cron y es la segunda forma de ejecutar tareas cron. Puede registrar fácilmente su tarea cron dentro de WordPress, y WordPress se encargará de cargar y ejecutar sus tareas dentro del horario especificado. Suena bien, y es adecuado para plugins.

¿Qué puede haber mejor, verdad? Pero nada es perfecto y este enfoque también tiene inconvenientes.

WordPress es una aplicación basada en PHP y no tiene acceso a su sistema Cron (sistema operativo que se ejecuta en su host). De hecho, esto significa que WP necesita algún evento externo para comprobar la lista de programación y ejecutar las tareas relevantes. Otra cosa es que WordPress SÓLO puede ejecutar tareas Cron cuando alguien visita o abre una página en el sitio web. Si nadie visita su sitio web, las tareas Cron NO se ejecutarán.

Esto puede sonar aterrador, pero la buena noticia es que WordPress garantiza que las tareas serán llamadas, sólo que no hay garantía de cuándo exactamente serán llamadas. Por ejemplo, ha configurado una tarea Cron de tipos de cambio para que se ejecute una vez al día. Ahora bien, en la vida real esto significa que la tarea se ejecutará con el primer visitante, al cabo de un día a la hora establecida. No antes, pero tal vez más tarde, tal vez incluso mucho más tarde si no ha tenido visitantes durante varios días.

Hay algunas tareas que están bien para ejecutar con este enfoque, sin embargo, mientras nadie visita su sitio, Cron no se ejecuta y por lo tanto en realidad no "funciona". Pero hay otras tareas que requieren fiabilidad. Por lo tanto, si sus tareas Cron consisten en obtener información de fuentes externas, o simplemente tareas muy importantes que deben ejecutarse, como cualquier cosa de la API, no puede confiar en este enfoque.

Veredicto

#enlace copiado

Ambas formas tienen sus ventajas y sus inconvenientes.

Por ello, la mejor solución que utilizan los profesionales, y que recomienda WordPress, es una combinación de los dos enfoques, que le ofrece lo mejor de ambos y contrarresta los inconvenientes de cada uno.

Como propietario de un sitio web (o desarrollador) necesita configurar el sistema Cron job que llamará a WordPress Cron. En general, es relativamente sencillo de hacer, y de esta forma WordPress Cron será más fiable manteniendo el enfoque nativo de WordPress.

Véase el punto nº 2 para saber cómo hacerlo.

Acerca de WordPress Cron

#enlace copiado

Anteriormente, hemos aprendido que WordPress es una aplicación basada en PHP, y que su Cron interno depende de eventos externos, es decir, de las peticiones de los usuarios. Además de este hecho, hay una lista de aspectos importantes, que repasaremos con más detalle.

1. WordPress Cron es asíncrono

#enlace copiado

En primer lugar, debe saber que WordPress Cron es asíncrono. Asíncrono significa que ejecuta Cron jobs en una petición separada del propio evento.

Así, una petición de usuario no tendrá retrasos debidos a WordPress Cron, un usuario que disparó algún trabajo Cron no esperará hasta que el trabajo termine para ver el resultado de su petición. Así que puede respirar tranquilo sabiendo que no hay retrasos para sus visitantes. WordPress lo gestiona todo silenciosamente en segundo plano.

Si está interesado en los detalles, técnicamente sucede de la siguiente manera;

WordPress comprueba la programación Cron en cada petición de usuario a un sitio web, y si hay necesidad de ejecutar trabajos Cron, crea una nueva petición al archivo cron del sitio web (/cron.php), usando la librería cURL. El usuario recibe la respuesta a su solicitud inmediatamente, mientras que Cron ejecuta las demás tareas cron en una solicitud separada, que es independiente.

2. WP Cron no es fiable (out-of-the-box). Manera de arreglar

#enlace copiado

Como ya sabemos, WordPress Cron depende de eventos externos. Comparado con el sistema Cron, tiene un gran inconveniente. Pero podemos arreglarlo fácilmente fusionando el Cron del sistema y el Cron de WordPress.

Así que la solución es crear un trabajo Cron dentro del Cron del sistema y llamar al Cron de WordPress desde allí. De esta manera, recibimos un Cron fiable con todas las características de WordPress y soporte para plugin cron jobs. Puede sonar un poco complicado, pero en realidad no lo es.

Para el manual oficial ver aquí.

La tarea puede dividirse en 2 pasos. El primer paso consiste en crear una nueva tarea Cron del sistema. Básicamente, hay dos tipos diferentes de alojamiento (compartido y dedicado), y la forma de crear cron jobs depende de su tipo de alojamiento.

Cómo añadir una tarea Cron al sistema para alojamiento compartido

#enlace copiado

Cuando se utiliza alojamiento compartido, hay muchos proveedores diferentes, y es necesario comprobar las características ofrecidas por su proveedor acerca de las tareas Cron. Usualmente, un panel de administración de hosting tiene una pestaña o ítem especial sobre Cron, donde puede administrar las tareas Cron. El panel de administración más común es cPanel, puedes leer más sobre cómo añadir una tarea Cron para cPanel en el artículo oficial . Abajo está el video oficial.

Cómo agregar un trabajo Cron del sistema para el alojamiento VPS

#enlace copiado

En caso de que usted es un propietario de VPS (Servidor Privado Virtual es decir, Dedicado), es necesario iniciar sesión en su servidor con SSH y ejecute el siguiente comando para abrir un archivo en modo de edición.

crontab -e

Paso 1. Configurar una tarea Cron del sistema para WordPress Cron

#enlace copiado

Ahora es el momento de crear un trabajo Cron del sistema que llamará a WordPress Cron.

a) Enfoque clásico (con wget)

#enlace copiado

Añada una nueva línea en su archivo cron y copie el contenido de abajo.

*/10 * * * * wget -q -O - https://YOUR_DOMAIN_HERE/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Nota: La línea anterior no es adecuada para el modo WordPress Multisite. Si utiliza el modo WP Multisite y necesita un Cron fiable, lea más sobre las soluciones aquí.

No olvide sustituir YOUR_DOMAIN_HERE por su dominio.

La primera parte del comando indica que queremos que nuestro comando se ejecute una vez cada diez minutos, independientemente del número de hora, día de la semana y otras opciones. La parte central usa la herramienta wget para solicitar el archivo Cron de WordPress, y la última parte indica que no queremos guardar la salida del archivo Cron.

Puedes leer más sobre los argumentos aquí.

b) Enfoque Pro (con WP-CLI)

#enlace copiado

Si tienes un sitio web protegido por contraseña (por ejemplo, Dev), el método anterior no funcionará, ya que wget no podrá llamar al archivo wp-cron.php. La solución en este caso es usar la herramienta WP-CLI en tu servidor. Sólo tiene que instalarlo como se describe en el manual oficial, y añadir la siguiente línea a su horario cron, que llamará a Cron a través de la herramienta CLI para el sitio web específico :

// don't forget to replace the path below to yours
wp cron event run --due-now --path=/home/admin/domains/YOUR_DOMAIN_HERE/public_html >/dev/null 2>&1

Este método llamará al Cron directamente a través del sistema de ficheros, sin ninguna petición HTTP. Esto significa que no tendremos problemas con ningún sitio web, incluidos los protegidos con contraseña.

Paso 2. Desactivar las comprobaciones por defecto de WordPress

#enlace copiado

Como ya hemos integrado WordPress Cron con el Cron del sistema, WordPress ya no necesita comprobar la lista de programación en cada petición de usuario. Se lo decimos a WordPress configurando una constante especial en el archivo wp-config.php.

/* Add any custom values between this line and the "stop editing" line. */

define( 'DISABLE_WP_CRON', true );

/* That's all, stop editing! Happy publishing. */

Como puede ver el archivo tiene una sección especial para valores personalizados, por lo que necesita añadir esta constante después del primer comentario, y antes del segundo.

No se preocupe por la etiqueta de la constante, "DISABLE_WP_CRON" en realidad no significa desactivar completamente WordPress Cron. Desactiva la comprobación de la lista de programación con cada petición del usuario. WP Cron debería seguir funcionando correctamente, ya que llamamos al archivo wp-cron.php directamente a través del Cron del sistema.

¡Ya está! ¡Enhorabuena! Ahora su instalación de WordPress tiene un Cron fiable con todas las características de WordPress. Cron ejecutará los trabajos de acuerdo a la programación, independientemente de la cantidad de visitantes' al sitio web.

3. Cómo añadir y eliminar Cron jobs

#enlace copiado

WordPress Cron job es sólo un poco de código PHP que se ejecuta por algún horario. Además, puede utilizar todas las características de WordPress y tiene acceso a la Base de Datos. Aquí puedes encontrar un artículo para desarrolladores de WordPress sobre este tema.

Elegir un intervalo

#enlace copiado

En primer lugar, necesitamos elegir un intervalo por el cual Cron repetirá nuestro trabajo. Los intervalos por defecto de WordPress son cada hora, dos veces al día, diariamente, semanalmente. Aunque es suficiente para la mayoría de los casos, es posible que necesite un intervalo personalizado. Podemos definirlo añadiendo el siguiente código.

add_filter('cron_schedules', function ($schedules) {
    return array_merge($schedules, [
        // here is the name of our custom interval. used when adding a new job
        'five_hours' => [
            // the number here represents seconds, so the formula is: 5 hours * 60 minutes * 60 seconds
            'interval' => 5 * 60 * 60,
            'display' => esc_html__('Every Five Hours'),
        ],
    ]);
});

Añadir un nuevo trabajo recurrente

#enlace copiado

Para añadir un nuevo trabajo Cron necesitamos añadir un nuevo shortcode y adjuntar un horario al shortcode. El intervalo (el segundo argumento de la función wp_schedule_event()) debe ser uno de los intervalos predeterminados, o algún nombre personalizado que puede añadir utilizando el fragmento de código anterior.

add_action('YOUR_NAME_HERE', function () {
    /* your job here
    you can use all the WordPress features and functions
    e.g. wp_insert_post() */
});

// we must check that the event wasn't scheduled as each call creates a new one
// otherwise, if we've skipped the check it'll create a new event for each user request
if (!wp_next_scheduled('YOUR_NAME_HERE')) {
     /* the first argument is the timestamp which controls when the job 
       will be run for the first time
       the next argument  reflects the chosen interval */
    wp_schedule_event(time(), 'hourly', 'YOUR_NAME_HERE');
    return;
}

En el código anterior hemos creado un trabajo vacío que Cron ejecuta una vez por hora.

Añadir un nuevo trabajo único

#enlace copiado

El ejemplo anterior añade un trabajo que Cron ejecuta de forma recurrente. Pero también tiene la opción de programar un único trabajo. Para ello, debe utilizar la función wp_schedule_single_event() en lugar de la función wp_schedule_event(). Puede aceptar dos (2) tipos de argumentos: timestamp con la próxima hora de ejecución y el hook que contiene el job. Así que vamos a crear un trabajo que Cron ejecutará sólo una vez, después de 5 horas:

add_action('YOUR_NAME_HERE', function () {
    /* your job here
     you can use all the WordPress features and functions
     e.g. wp_insert_post() */
});

// it's necessary to check that the event wasn't scheduled as each call creates a new one
// if you've skipped the check it'll create a new event for each user request
if (!wp_next_scheduled('YOUR_NAME_HERE')) {
    // as before, the first argument is the timestamp which controls when the job will be run
    // it's presented in seconds, so the formula is: 5 hours * 60 minutes * 60 seconds
    wp_schedule_single_event(time() + 5 * 60 * 60, 'YOUR_NAME_HERE');
    return;
}

Eliminar una tarea Cron

#enlace copiado

Puede eliminar un trabajo programado que haya añadido previamente. Es especialmente útil para tareas recurrentes. Para ello, llamaremos a la función wp_unschedule_event() con un par de argumentos. El primero debe contener la siguiente marca de tiempo para el evento (la obtenemos dinámicamente) y el segundo es el nombre de su trabajo.

El código siguiente elimina los trabajos únicos y recurrentes. Además, preste atención, que para los trabajos recurrentes, no sólo eliminará la programación o el siguiente evento, sino también todos los eventos futuros del trabajo.

$timestamp = wp_next_scheduled('YOUR_NAME_HERE');
if ($timestamp) {
    wp_unschedule_event($timestamp, 'YOUR_NAME_HERE');
}

4. Cómo monitorizar Cron jobs

#enlace copiado

La información sobre todos los Cron jobs de WordPress se almacena en la Base de Datos. Esto significa que podemos obtener una lista de todos los trabajos programados y gestionarlos. Es algo importante para desarrolladores y propietarios de sitios web.

Si ha visto el esquema de la Base de Datos de WordPress, entonces sabrá que no hay una tabla separada para Cron. Todas las tareas Cron se almacenan dentro de una única opción en la tabla Opciones. Lo más probable es que ya conozca esta tabla, ya que cualquier buen desarrollador de WordPress conoce las tablas principales de la Base de Datos de WordPress. Este conocimiento es necesario para entender claramente los procesos internos. Si quiere comprobar y mejorar sus conocimientos, lea lo que debe saber un buen desarrollador de WordPress.

WordPress almacena las tareas Cron como una opción en la tabla Opciones

Pero mirar los datos serializados directamente a través de PhpMyAdmin no es la mejor idea. Por eso usaremos el plugin WP Crontrol que nos dará una interfaz de usuario clara. Usando la herramienta podemos depurar nuestros Cron jobs o comprobar los externos que son añadidos por plugins. Por ejemplo, creamos nuestro Cron job personalizado y lo ejecutamos inmediatamente usando la herramienta para asegurarnos de que funciona correctamente.

El plugin proporciona la interfaz para gestionar tanto los Cron jobs como los intervalos. Usarlo es muy sencillo. Instale y active el plugin y visite la opción "Herramientas" - "Eventos Cron" en su menú de administración.

Aquí puede gestionar Cron jobs (llamados Cron Events) y Cron Intervals (llamados Cron Schedules).

Puede controlar cada trabajo individualmente. Pase el cursor sobre el elemento de destino para ver la lista de acciones

5. Plugins Cron y Caché

#enlace copiado

Lo importante a lo que hay que prestar atención es a la colaboración de los plugins Cron y cache de WordPress. La mayoría de los sitios web de WordPress utilizan algún plugin de caché para reducir el tiempo de respuesta. En general, el enfoque es bueno e importante para SEO. Además, la caché significa mucho para la optimización de la velocidad de WordPress. Pero en nuestro caso, también significa que nos saltamos la ejecución de PHP y devolver HTML.

Por defecto, WordPress Cron depende de las peticiones del usuario. El que WordPress Cron sea llamado o no durante las peticiones a páginas cacheadas depende del plugin que esté en uso. Según nuestra experiencia, los plugins de caché no llaman a WordPress Cron o lo hacen más raramente que cuando está instalado.

WordPress Cron seguirá siendo llamado durante las visitas del editor al panel de control, pero puede que no sea suficiente. Este enfoque está bien en caso de que sus Cron jobs no sean importantes y puedan retrasarse durante periodos más largos. De lo contrario, considere la segunda parte del artículo.

La solución descrita en la segunda parte del artículo, en relación con la fusión del sistema Cron y WordPress Cron, muestra los beneficios claros, por lo que si usted lo ha utilizado de esa manera entonces usted está listo y no necesita preocuparse por ello nunca más.

Se llama directamente al archivo wp-cron.php y WordPress Cron funcionará correctamente.

Conclusión

#enlace copiado

Hemos revisado las 5 cosas importantes sobre WordPress Cron. Recomendamos seguir la segunda parte (fusionar Cron del sistema y Cron de WordPress) para cada uno de tus sitios WordPress. Te ahorrará toneladas de dolores de cabeza en el futuro. Además, no te olvides de las herramientas que te permiten monitorizar tus Cron jobs. Son muy útiles.

Esperamos que nuestro artículo le haya sido útil, y que ahora tenga una idea clara de WordPress Cron y de cómo añadir sus propios Cron jobs utilizando los fragmentos de código.

Sobre el autor
Maxim Akimov

Certified WordPress expert from Ukraine with over 8 years of experience. Advocate of the BEM methodology and the overall modular approach. Loves sporting activities and enjoys going to the gym and regularly plays table tennis.

0 Comentarios

    Deja un comentario

    Responder a 

    Por favor, sea considerado al dejar un comentario.

    No expuesto al público

    Got it