• Saltar a la navegación principal
  • Saltar al contenido principal
  • Saltar a la barra lateral principal

DecodeCMS

Tu WordPress a otro Nivel ...

  • Acerca de
  • Contacto
  • Inicio
  • Tutoriales
    • Themes
    • Plugins
    • Core
    • Recursos
  • Cursos
  • Acceder
    • Mis cursos
    • Mi Cuenta
    • Acceder
Inicio / Tutoriales / Core / Tareas automáticas con wp-cron en WordPress

Tareas automáticas con wp-cron en WordPress

wp-cron en WordPress

[ 30 enero 2018 ] [ Autor: Jhon Marreros Guzmán ][ Core - Avanzado] [ ]

funcionalidad optimización

¿Me ayudas a llegar a más gente?

Twittear Compartir LinkedIn WhatsApp

¿Te has preguntado cómo WordPress detecta actualizaciones, ya sea del propio WordPress, de Plugins o Themes?, ¿Acaso WordPress esta monitoreando continuamente si hay una nueva versión?. Esto es precisamente lo que hace wp-cron en WordPress.

 

Generalidades

WordPress usa un archivo llamado wp-cron.php para realizar un cron virtual de tareas programadas, con la finalidad de automatizar las actualizaciones, la autopublicación de entradas, envío de correos, etc.

Fijémonos en la siguiente imagen para reconocer las tareas programadas de un sitio web de ejemplo:

wp-cron ejemplo de tareas programadas

Para ver un listado de tus eventos programados puedes usar el plugin WP Control, que entre otras funcionalidades permite listar las tareas programadas.

Si no quieres usar un plugin, puedes ver las tareas programadas por código, usando la función _get_cron_array(), por ejemplo con el siguiente código:


echo '<pre>'; print_r( _get_cron_array() ); echo '</pre>';

 

¿Qué es un cron virtual?

WordPress no usa un cron real, para que wp-cron se ejecute tu sitio debe ser cargado, es decir, cada vez que se carga una página de tu sitio, entonces es cuando WordPress verifica si tiene alguna tarea programada por realizar.

Al depender de la carga de tu sitio, si tu sitio no tiene mucho tráfico y tienes tareas programadas en un intervalo muy corto, entonces es posible que algunas programaciones del cron no se ejecuten.

 

Creando una tarea programada

A continuación verás un ejemplo de cómo crear un nuevo cron en WordPress:

1- Registra la nueva tarea

El registro de un nueva tarea recurrente en el wp-cron lo puedes realizar con la función wp_schedule_event, esta función suele llamarse cuando se activa un plugin, tal como se muestra en el siguiente código:


register_activation_hook( __FILE__, 'dcms_plugin_activation' );

function dcms_plugin_activation() {
    if( ! wp_next_scheduled( 'dcms_my_cron_hook' ) ) {
        wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'dcms_my_cron_hook' );
    }
}

En el código anterior:

  • Usamos la función dcms_plugin_activation() como callback de la activación
  • Nuestro cron se basa en una acción personalizada llamada: ‘dcms_my_cron_hook’
  • Usamos wp_next_scheduled() para hacer una comprobación de si este hook ya existe antes de registrarlo
  • La función wp_schedule_event() acepta hasta cuatro parámetros.
  • El primer parámetro indica el tiempo en el que la tarea se ejecutará por primera vez
  • El segundo parámetro es el intervalo de tiempo, WordPress tiene por defecto: ‘hourly’, ‘daily’, ‘twicedaily’
  • El tercer parámetro es el nombre de la acción
  • Existe un cuarto parámetro que es un array de argumentos, en este caso no lo usaremos

Si quieres programar una tarea que sólo se ejecute una vez puedes usar la función wp_schedule_single_event()

2- Crea la acción personalizada

Una vez has registrado un nuevo cron, usarás el nombre de la acción para crear el callback.


add_action( 'dcms_my_cron_hook', 'dcms_my_process' );

function dcms_my_process() {
	error_log('Mi evento se ejecutó: '.Date("h:i:sa"));
}

En el código anterior:

  • El hook de la acción hace referencia a la función dcms_my_process() como callback
  • Dentro de la función puedes colocar el código que desees, en el ejemplo simplemente enviamos un mensaje al error_log

Para que puedas ver los mensajes que crea la función error_log() en el archivo /wp-content/debug.log, tienes que habilitar WP_DEBUG_LOG y WP_DEBUG, revisa Debug en WordPress

3- Desregistra la tarea

Si vas a desactivar el plugin es conveniente desregistrar igualmente el cron, esto lo puedes hacer a través del nombre de la acción que le hemos dado, puedes usar el siguiente código:


register_deactivation_hook( __FILE__, 'dcms_plugin_desativation' );

function dcms_plugin_desativation() {
    wp_clear_scheduled_hook( 'dcms_my_cron_hook' );
}

En el código anterior:

  • Usamos el desregistro del plugin para eliminar o desregistrar la tarea cron creada
  • La función wp_clear_scheduled_hook() nos permite desregistrar la tarea creado

 

Creando un intervalo personalizado

Con el código anterior has podido crear una tarea personalizada que se ejecutará cada hora, sin embargo si quieres tener un intervalo diferente a los que te ofrece WordPress (‘hourly’, ‘daily’, ‘twicedaily’), entonces tienes que crear un intervalo personalizado, puedes usar el siguiente código:


add_filter( 'cron_schedules', 'dcms_my_custom_schedule');
function dcms_my_custom_schedule( $schedules ) {
     $schedules['5seconds'] = array(
        'interval' => 5,
        'display' =>'5 segundos'
     );
     return $schedules;
}

En el código anterior:

  • Estamos usando el filtro cron_schedules el cual hace referencia a la función dcms_my_custom_schedule
  • La función callback acepta como argumento la variable $schedules, que es un array con los intervalos
  • Simplemente agregamos un nuevo intervalo con el nombre 5seconds
  • ‘interval’ es un número en segundos
  • Finalmente retornamos el array modificado

 
Entonces este nuevo intervalo lo puedes usar en el registro del cron, es decir en la función wp_schedule_event()


wp_schedule_event( current_time( 'timestamp' ), '5seconds', 'dcms_my_cron_hook' );

El código completo del plugin de ejemplo lo puedes encontrar en el Gist de ejemplo-cron

 

Desactiva el comportamiento por defecto de wp-cron

Anteriormente te comenté que WordPress verifica si tiene una tarea programada cada ves que tu sitio web es cargado, o lo que es lo mismo cada vez que un usuario visita tu sitio. Si tu sitio tiene un tráfico alto esto no es lo más óptimo, lo mejor es deshabilitar el comportamiento que tiene el cron por defecto y en su lugar usar un cron real.

1- Editando el archivo wp-config.php

En este archivo agregarás el siguiente código que establece la constante DISABLE_WP_CRON a true.


define('DISABLE_WP_CRON', true);

Con esto hemos deshabilitado el cron virtual de WordPress, pero ahora necesitamos configurar un cron real.

2- Cron real en tu cuenta de hosting

El cron real será ejecutado por una aplicación cron de tu cuenta de hosting, en el caso de Cpanel tienes la opción en : Avanzados > Trabajos de Cron

Opción de Trabajos cron en Cpanel

 
Al ingresar a esta opción verás que puedes programar una tarea en diferentes intervalos, el mínimo es 1 minuto, además necesitas agregar el comando a ejecutar.

El comando a ejecutar será el wp-cron de WordPress, es decir usaremos la siguiente línea de comando:

wget -q "https://dominio.com/wp-cron.php?doing_wp_cron"
Al usar el comando haciendo referencia al archivo wp-cron.php nos aseguramos que todas las tareas programadas por WordPress se ejecuten.

Pantalla para agregar tarea cron

 
Finalmente veremos que la tarea se agregó como tarea programada

Registro de nuevo trabajo cron cpanel

 

Conclusión

Saber cómo funciona y además cómo optimizar el wp-cron en WordPress te permite configurar correctamente plugins que usen tareas programadas, o incluir tus propias tareas programadas con facilidad en el desarrollo de tus plugins.

 
¿Aún con dudas?, en el siguiente video se detalla cada uno de los puntos anteriores

 

¿Me ayudas a llegar a más gente?

Twittear Compartir LinkedIn WhatsApp

Artículos Relacionados

  • CRUD en WordPress sin pluginsCRUD en WordPress sin plugins
  • Cómo eliminar todos los productos de WooCommerceCómo eliminar todos los productos de WooCommerce
  • Agrupar los resultados de búsqueda en WordPressAgrupar los resultados de búsqueda en WordPress
  • tipos de complementos de WordPress5 tipos de complementos de WordPress
Valora este artículo : 1 barra2 barras3 barras4 barras5 barras (4 votos, promedio: 5,00 de 5)
Cargando...

Interacciones con los lectores

Comentarios

  1. francisco Medina ruiz

    15 agosto, 2018

    hola muy buenas! mi nombre es fran estoy intentando enlazar por FTP el stock de mi distribuidor, he creado el plugin y la tarea cron como pones arriba y todo correcto pero me podrias indicar como seria el codigo para este tipo de importacion y donde tngo que colocar la url de mi distribuidor? Muchisimas gracias de antemanoo

    • Jhon Marreros Guzmán

      15 agosto, 2018

      Supongo que cuando dices “enlazar por FTP”, tienes un archivo con los datos actualizados del stock, tienes que buscar otra forma de acceder a esos datos, lo normal es usar una API desde la cual leer los datos, luego por programación puedes leer los datos y actualizar tu BD de tu sitio. Por otro lado si tienes un plugin que ya hace eso y sólo requiere un archivo, tendrías que revisar la documentación del plugin para ver como implementar el proceso de importación en un cron.

  2. Sindy

    17 octubre, 2018

    Muchísimas gracias Jhon, muy buen articulo.

  3. SINDY

    18 octubre, 2018

    Quede con dudas de cual intervalo es el que finalmente usa crontab, el declarado en el plugin o el establecido en administrador de tareas del cpanel?

    • Jhon Marreros Guzmán

      19 octubre, 2018

      Hola, la idea es que el cron de Cpanel ejecute el wp_cron (cron virtual de WordPress), lógicamente el cron de Cpanel tendría que tener un rango de tiempo más bajo que el que hayas configurado en algún plugin que tenga funcionalidad de cron.

      Es decir, si tienes por ejemplo un plugin que te permite configurar un cron de hacer backups cada hora, estas usando el wp_cron, por lo tanto tu cron de Cpanel tendría que ser menor o igual a cada hora para que pueda ejecutar wp_cron.

      • SINDY

        19 octubre, 2018

        Jhon, estoy intentando ejecutar una comprobación de datos en mi base de datos todos los días a las 12.00am. Afortunadamente tu articulo es justo la solución a mi necesidad, he tanteado con varias combinaciones en cuanto a las fechas, pero aun no logro el efecto deseado. Por favor tendrías alguna recomendación para mi. Gracias Jhon 😉

  4. Felipe

    10 enero, 2019

    Hola, excelente tu explicación, en la actualidad tengo un plugin que hace copias del sitio estéticamente, o sea voy a él plugin y le digo cuando hacer la copia. Si Yo quiero implementar la funcionalidad de que el plugin me haga una copia automáticamente por ejemplo cada dos horas, este método es el adecuado, lo he intentado hacer pero no pude, agradezco tu respuesta, gracias

    • Jhon Marreros Guzmán

      10 enero, 2019

      Hola, el plugin que usas debería soportar cron antes, usualmente una url que se pueda ejecutar. De manera general los plugins de backup tienen versiones premium, revisa si tu plugin tiene versión premium ya que este tipo de funcionalidad es usualmente incluída en una versión de pago.

      • Felipe

        10 enero, 2019

        Jhon, gracias por tu respuesta, ya tengo más luces para implementar dicha solución Gracias

  5. JORGE

    27 enero, 2019

    Gracias por el articulo.
    ¿Quiere decir que si en el momento de ejecutarse una tarea del cron la web no tienen visitas esa tarea ya no se realiza?
    Me refiero a que si yo tengo un plugin que realiza una copia diaria de mi web a una hora en concreto, si a esa hora nadie visita la web ¿la copia de ese día no se realiza?

    • Jhon Marreros Guzmán

      27 enero, 2019

      Efectivamente, si estas usando el cron virtual (el que viene por defecto con WordPress) tendrás eses problema, se ejecutará a destiempo hasta que alguien visite tu web, es por eso que mejor te recomiendo usar el cron de tu panel, usualmente Cpanel, de tu cuenta de hosting.

  6. Danny Hernandez

    26 junio, 2019

    Hola tengo la misma necesidad de Francisco Medina Ruiz.

    Necesito actualizar el stock de woocommerce, desde una API exterior, podrias por favor indicarnos como tendria que ser el proceso para crear el codigo y que en nuestra pagina del producto se actualice el stock cuando ingrese el cliente a ver la ficha del producto? gracias!!!

    • Jhon Marreros Guzmán

      27 junio, 2019

      Hola, de manera general para lo que comentas tendrías que colocar un archivo(s) .php en alguna ruta de tu alojamiento, estos archivos tendrían primero que leer la API externa y luego actualizar los stocks de WooCommerce, al archivo principal tendrías que llamarlo desde el cron, la manera de probarlo también es ejecutarlo directamente desde la url del navegador. Es un tema de programación, no es posible darte un código que funcione porque no conozco la estructura de tu API, de manera general puedes revisar: https://www.php.net/manual/es/curl.examples-basic.php

  7. david

    26 enero, 2021

    hola
    quería hacer una página web en wordpress que mostrara un valor de otra web.
    Por ejemplo, quería que mostrara el valor de una empresa en bolsa leyendo el valor desde otra web por ejemplo desde esta: https://www.expansion.com/mercados/cotizaciones/indices/ibex35_I.IB.html
    y quería que lo leyese cada x tiempo. seria posible hacerlo en wordpress?
    con esto se puede hacer?
    gracias y un saludo

    • Jhon Marreros Guzmán

      27 enero, 2021

      Hola, en realidad veo que hay plugins que podrías evaluar para lo que comentas, revisa: https://es.wordpress.org/plugins/tags/forex/

  8. Sara

    12 marzo, 2021

    Hola Jhon!
    Cómo hacer la tarea automática para que el listado de pedidos se envíe de forma automática a un mail o a un lugar de descarga con Cron? Es para un operador logístico
    Mil gracias

    • Jhon Marreros Guzmán

      16 marzo, 2021

      Hola, las órdenes son un CPT, por lo que puedes obtenerlas con WP_Query, obtener el ID de cada una, luego puedes obtener la orden completa con wc_get_order(), al final podrías hacer el cron con esa lógica.

  9. Javier

    15 abril, 2021

    Muchas gracias por el artículo Jhon!! Me resultó muy útil

Para escribir código envolver con: <pre class="language-xxx"><code> </code></pre> ,reemplaza las xxx (php, css, html)

*

* Gravatar habilitado

Barra lateral principal

Presentación

Curso Decodifica WordPress

Únete a DecodeCMS

Recibirás como regalo:

Guia práctica con video:
¿Quieres agregar código a WordPress? Revisa las diferentes opciones que tienes.Ver más

Jooble
Alojamiento Wordpress

Niveles

Básico Intermedio Avanzado

Etiquetas

accesibilidad css dashboard editor error funcionalidad herramientas imagen js librería mejoras optimización seguridad social woocommerce

Populares

Agregar endpoints a la API REST de WordPress

Crear un Widget para el dashboard de WordPress

Refrescar los estilos CSS almacenados en el navegador de un usuario

Agregar breadcrumbs de Yoast SEO a tu tema

© logo decode pie
Política de Privacidad | Política de devoluciones
Copyrigth 2023 Todos los derechos reservados