¿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:

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.
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
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
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' );
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

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"

Finalmente veremos que la tarea se agregó como tarea programada

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
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
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.
Muchísimas gracias Jhon, muy buen articulo.
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?
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.
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 😉
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
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.
Jhon, gracias por tu respuesta, ya tengo más luces para implementar dicha solución Gracias
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?
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.
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!!!
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
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
Hola, en realidad veo que hay plugins que podrías evaluar para lo que comentas, revisa: https://es.wordpress.org/plugins/tags/forex/
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
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.
Muchas gracias por el artículo Jhon!! Me resultó muy útil