Programar WordPress tú mismo: Dominar WP-Cron
Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)
Al ser una de las características de WordPress menos utilizadas, WP-Cron es a menudo pasado por alto por los desarrolladores. Sus aplicaciones, sin embargo, no son materia de risa. Desde el almacenamiento en caché hasta las notificaciones y la limpieza, programar tareas cron puede funcionar para crear una clara ventaja incluso en el blog de WordPress más simple. Únete mientras exploramos las importantes aplicaciones de este sistema.
¿Simplemente un trabajo cron promedio? Piénsalo de nuevo.


WP-Cron no es lo mismo que el programador cron de Unix...
Inmediatamente después de ver la palabra cron, estoy seguro de que has pronosticado a qué nos referimos: programar eventos cron perfectamente temporizados para que se ejecuten a intervalos especificados. Pero por el contrario, WP-Cron no es lo mismo que el programador cron de Unix. La distinción clave radica en cómo se ejecuta; a diferencia de un proceso en segundo plano, WP-Cron entra en acción cada vez que un usuario visita tu sitio creado con WordPress. Por tanto, conserva la característica vital de la sincronización imprecisa.
Sí, has leído bien: tiempo impreciso. Aunque las palabras cron y precisión son como dos guisantes en una vaina, en el sistema de WordPress no armonizan. Pero, ¿es esto realmente un problema? Si se considera en el contexto del usuario, esto realmente se convierte en un activo.
Tomemos el ejemplo de un trabajo cron normal que se ejecuta cada cinco minutos para actualizar la información de la base de datos utilizada en un sitio web. Si ningún usuario visita el sitio durante 40 minutos, ¿qué sentido tendría entonces ejecutar este trabajo ocho veces? Todos los valores intermedios estarían obsoletos y no utilizados. Si, por el contrario, se iniciara en la primera visita del usuario después de un mínimo de cinco minutos, no sólo conseguiría la misma tarea, sino que también evitaría actualizaciones innecesarias. En otras palabras, debido a que WP-Cron se basa en el usuario, tiene la ventaja de ejecutarse solo cuando los visitantes están presentes.
No te andes por las ramas. ¡Muéstramelo!
Para aplicar WP-Cron, consideremos la aplicación de administración de RSS frecuentemente utilizada, FeedBurner. Con mucho, una de las características más populares de esta aplicación es su capacidad para computar suscriptores RSS. Una vez indexado el RSS, se puede acceder al recuento de suscriptores de un sitio a través de una simple llamada a la API. A continuación, se deduce que esta llamada a la API se puede realizar una vez por vista de página para entregar el recuento de suscriptores a los espectadores. Esto, sin embargo, conlleva un problema.
Entra en el mundo del almacenamiento en caché
Si se accede a la API de FeedBurner una vez por vista de página, inevitablemente conduce a una solicitud HTTP adicional, por no mencionar, que es además una a otro dominio, para cada visitante. Esto aumentará el tiempo de carga de la página para los usuarios.
Para contrarrestar este problema, es importante realizar algo clave sobre este método de entrega: es poco probable que la cantidad de suscriptores RSS se actualice en cada vista de la página. De hecho, FeedBurner solo actualiza su recuento una vez al día. Incluso aunque cambiara rápidamente, ¿es realmente necesario mostrar el último recuento para cada visitante? ¿Es tan importante que el recuento esté ligeramente anticuado, y que sea actualizado con posterioridad en el margen de un día?
Para nuestros propósitos, es totalmente inútil conseguir el número de suscriptores RSS para cada vista de página. En lugar de eso, si se recupera para un visitante, basta con reutilizarlo para los futuros. A continuación, transcurrido un día, se puede realizar una actualización de este recuento. Este proceso se conoce como almacenamiento en caché. Tras actualizar el número de suscriptores RSS, este dato se almacena en caché (para su futuro uso en lugar de volver a calcularse) hasta que haya pasado un día. Y, con eso, entramos en el mundo de WP-Cron.
Paso 1 Explora la documentación


Para entender WP-Cron, es importante saber dónde está disponible la documentación. WordPress.org proporciona resúmenes de cada función cron en su Codex. Para completar la tarea previamente definida, tendremos que mirar la función wp_schedule_event, que requiere cuatro parámetros:
- Time: una marca de tiempo UNIX que especifica cuándo debe desencadenarse el evento
- Recurrence: la frecuencia con la que se debe volver a activar el evento tras la hora programada
- Hook: un gancho utilizado para añadir funcionalidad cuando se desencadena el evento
- Args: una matriz de argumentos a pasar a todas las funciones enganchadas (opcional)
Nuestro evento se desencadenará cuando la hora actual cumpla o supere el tiempo pasado a esta función, según lo prescrito por un futuro visitante del sitio web. A continuación, volveré a reactivarlo en función del parámetro de periodicidad o recurrencia, que puede ser establecido en cada hora, una o dos veces al día, o ninguna. También se pueden definir programaciones de recurrencia personalizadas.
Para gestionar el evento, se utiliza un gancho. En resumen, un gancho de WordPress puede ser considerado como un marcador de posición para una acción. Las acciones pueden asignarse a ganchos a través de la función de WordPress add_action. Más concretamente, para añadir un controlador de función al gancho dado, se podría invocar a:
1 |
add_action( 'hook_name', 'function_name' ); |
donde hook_name y function_name son el nombre del gancho y de la función controladora, respectivamente.
Paso 2 Llamar a la función
Dado que FeedBurner se actualiza una vez al día, especificaremos una programación diaria, según el siguiente código:
1 |
wp_schedule_event( time(), 'daily', 'feedburner_refresh' ); |
Ten en cuenta que time() es la marca de tiempo UNIX actual en segundos. Si se ejecuta, el gancho 'FeedBurner Update' se activará inmediatamente y posteriormente una vez al día. Ten en cuenta que si pusiésemos esto en nuestro archivo functions.php de WordPress, se programará un nuevo evento en cada carga de página. Esta no es la funcionalidad que deseamos; más bien, sólo queremos programar este evento una vez. La forma más sencilla de hacerlo consiste en comprobar si el evento ya está programado. Esto se puede hacer a través de la función wp_next_scheduled, que devolverá false si el evento no está configurado para ser desencadenado en el futuro o de lo contrario, la hora de su siguiente desencadenador:
1 |
if( !wp_next_scheduled( 'feedburner_refresh' ) ) { |
2 |
wp_schedule_event( time(), 'daily', 'feedburner_refresh' ); |
3 |
}
|
Si necesitamos anular la programación de este evento en alguna ocasión, es tan simple como invocar la función wp_unschedule_event, que toma los mismos parámetros (excepto para la recurrencia) que wp_schedule_event. Ten en cuenta que el tiempo que pasemos debe ser el tiempo del siguiente desencadenador, que puede ser recuperado a través de wp_next_scheduled:
1 |
if( false !== ( $time = wp_next_scheduled( 'feedburner_refresh' ) ) ) { |
2 |
wp_unschedule_event( $time, 'feedburner_refresh' ); |
3 |
}
|
También podemos anular la programación de este evento a través del nombre de su gancho mediante la función wp_clear_scheduled_hook. Ten en cuenta que esta alternativa también eliminará todos los demás eventos que usen el mismo gancho.
1 |
wp_clear_scheduled_hook( 'feedburner_refresh' ); |
Paso 3 Desplegar el gancho


Ahora que nuestro evento está programado, debemos añadirle un controlador:
1 |
add_action( 'feedburner_refresh', 'update_rss_subscriber_count' ); |
Esto establece la función denominada update_rss_subscriber_count que será invocada una vez que se active el gancho feedburner_refresh. Ahora es el momento de escribir esta función.
Paso 4 Recuperar el recuento de suscriptores de FeedBurner
Para recuperar el número de suscriptores en la función update_rss_subscriber_count, podemos hacer una llamada a la API de FeedBurner a través de la URL <https: feedburner.google.com/api/awareness/1.0/GetFeedData?uri=[NAME]>, donde [NAME] es el nombre de nuestro feed.
Esto devolverá datos XML de la siguiente forma:
1 |
<rsp stat="ok"> |
2 |
<!--
|
3 |
This information is part of the FeedBurner Awareness API. If you want to hide this information, you may do so via your FeedBurner Account.
|
4 |
-->
|
5 |
<feed id="8olmjno1k05rb1som1frr6u854" uri="nettuts"> |
6 |
<entry date="2011-06-22" circulation="84673" hits="152325" reach="25865"/> |
7 |
</feed>
|
8 |
</rsp>
|
La información que estamos buscando está en el atributo circulation. La siguiente expresión regular puede analizar fácilmente a través de los datos para este valor: circulation="(.*?)".
En inglés, nuestra expresión regular coincide con lo siguiente:
-
circulation=– La palabra circulation seguida de un signo igual -
"(.*?)"– Comillas y todo lo que haya dentro
Si se ejecuta esto mediante la función preg_match, se recuperará una matriz de coincidencias que contendrá el número de suscriptores en la primera posición del índice. Al reunir esta información se produce el siguiente código:
1 |
// find the FeedBurner url and get the data from it
|
2 |
// change [NAME] to the name of your FeedBurner feed
|
3 |
$url = 'https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=[NAME]'; |
4 |
$data = @file_get_contents( $url ); // @ will surpress errors |
5 |
|
6 |
// use a regular expression to parse the data
|
7 |
$regex = '%circulation="(.*?)"%'; |
8 |
preg_match( $regex, $data, $matches ); |
9 |
|
10 |
// get the resultant count if available
|
11 |
$count = false; |
12 |
if( $matches && $matches[1] ) |
13 |
$count = (int) $matches[1]; |
Paso 5 Almacenar el recuento de suscriptores


Ahora que hemos recuperado el recuento de suscriptores, tendremos que almacenarlo para que sea accesible; en lugar de volver a visitar los datos XML de la API, los visitantes simplemente accederán a este valor almacenado.
En lugar de crear una base de datos o un archivo para almacenarlo, podemos emplear otra característica de WordPress: las opciones. Las opciones de WordPress son formas sencillas de almacenar bits de datos junto con nombres de identificación. Añadir, eliminar y acceder a las opciones es algo tan sencillo como las siguientes funciones:
-
update_option( $name, $value )- añade o actualiza una opción con el nombre$namey el valor$value. -
delete_option( $name )- Eliminar una opción con el nombre$name. -
get_option( $name )- obtiene el valor de opción asociado al nombre$name.
Aunque nuestro número de suscriptores no es técnicamente un valor de configuración, el uso de las opciones de WordPress es una de las maneras más convenientes, si no la más, para almacenar datos tan simples. Por lo tanto, para almacenar nuestro número de suscriptores, usaremos el método update_option, que no solo invalidará los anteriores valores, sino que también creará la opción en primer lugar:
1 |
// if a count could not be found, do not update
|
2 |
// instead, stick with the previous count
|
3 |
if( $count !== false ) |
4 |
update_option( 'subscriber_count', $count ); |
¡Nuestra función ya está completa! Después de configurar el evento, recuperar los datos a través de la API de FeedBurner y almacenar el valor deseado, ¡todo lo que queda por hacer es darle salida! A continuación puedes encontrar el código completo para la función de programación y recuperación, que puedes colocar en functions.php:
1 |
// schedule the feedburner_refresh event only once
|
2 |
if( !wp_next_scheduled( 'feedburner_refresh' ) ) { |
3 |
wp_schedule_event( time(), 'daily', 'feedburner_refresh' ); |
4 |
}
|
5 |
|
6 |
add_action( 'feedburner_refresh', 'update_rss_subscriber_count' ); |
7 |
function update_rss_subscriber_count() { |
8 |
// find the FeedBurner url and get the data from it
|
9 |
// change [NAME] to the name of your FeedBurner feed
|
10 |
$url = 'https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=[NAME]'; |
11 |
$data = @file_get_contents( $url ); // @ will surpress errors |
12 |
|
13 |
// use a regular expression to parse the data
|
14 |
$regex = '%circulation="(.*?)"%'; |
15 |
preg_match( $regex, $data, $matches ); |
16 |
|
17 |
// get the resultant count if available
|
18 |
$count = false; |
19 |
if( $matches && $matches[1] ) |
20 |
$count = (int) $matches[1]; |
21 |
|
22 |
// if a count could not be found, do not update
|
23 |
// instead, stick with the previous count
|
24 |
if( $count !== false ) |
25 |
update_option( 'subscriber_count', $count ); |
26 |
}
|
Paso 6 Salida
Ahora, el número de suscriptores es sólo una simple llamada de función en cualquier archivo de plantilla:
1 |
echo get_option( 'subscriber_count' ); |
Conclusión


Nuestro número de suscriptores RSS está ahora optimizado; en lugar de ser recuperado para cada solicitud, se almacena en la caché con la ayuda de WP-Cron, ahorrando tiempo a nuestros usuarios y reduciendo el uso de ancho de banda. Debido a que sólo se activa cuando nuestro sitio recibe realmente un visitante, nuestra función es "perezosa", un término que sin duda puede ser considerado bueno en este contexto. Pero, por desgracia, aquí sólo hemos descubierto una aplicación de WP-Cron; el resto depende de ti.
¿Tienes tu propia aplicación innovadora de WP-Cron? ¡Compártela con nosotros a través de los comentarios!



