WordPress ofrece una funcionalidad llama cron que te permite agendar tareas cada cierto tiempo. Éstas tareas son ejecutadas cada cierto tiempo según lo definido. De esta forma puedes ejecutar funciones de forma automática. Por ejemplo: respaldo de base de datos, sincronización con servicios externos, borrar caché entre otros.

¿Cómo funciona el cron de WordPress

WordPress posee un archivo llamado cron.php que al ejecutarlo. Revisa todas las tareas definidas en el cron para ejecutar las funciones de aquellas programadas a la hora actual o anterior. Por ejemplo, si decides ejecutar una tarea cada 12 horas. La primera vez que lo ejecutes lo agendará para ser ejecutado luego de 12 horas. Cada vez que se llama a al archivo cron.php bien sea de forma manual (accediendo directamente a él) o como lo hace por defecto, donde chequea cada vez que la página recibe una visita (no lo hace todo el tiempo). El archivo chequea si existen eventos registrado para la hora actual o ya pasada (es decir se le culminó el tiempo de agendado) y llama a la función definida en cada evento.

Agendar nuestros eventos al cron

Como comenté anteriormente, necesitamos definir el nombre de nuestro evento y la función a ejecutar. Primero debemos chequear que el evento no está agendado previamente para agregarlo. Una vez agregado no es necesario hacerlo de nuevo, con una sola vez se ejecutará varias veces automáticamente. De lo contrario será agregado infinidad de veces al cron. A continuación podemos ver un ejemplo de como hacer este proceso en tu plugin o tema.

if ( ! wp_next_scheduled( 'mi_evento' ) ) {
    wp_schedule_event( time(), 12 * HOUR_IN_SECONDS, 'mi_evento' );
}

En el segundo parámetro podemos ver 12 * HOUR_IN_SECONDS, ésta es una constante definida en WordPress, aunque podemos utilizar las cadenas de texto como ‘daily‘ (diariamente una vez al día), ‘twicedaily‘ (dos veces al día), ‘hourly‘ (cada hora). De esta forma tenemos control de la periodicidad del evento.

Cómo definir mis propios intervalos

Puedes definir tu propio período de tiempo para ejecutar tareas en el cron. Por ejemplo cada 3 horas o crear un período definido por un usuario a través de una caja de texto. Para ello, debes hacerlo de la siguiente forma:

function miprefijo_agregar_intervalo_de_cron( $schedules ) {
    $schedules['medio_minuto'] = array(
        'interval' => 30,
        'display'  => esc_html__( 'Every Five Seconds','mi-dominio-idioma'),
    );
 
    return $schedules;
}

add_filter( 'cron_schedules', 'miprefijo_agregar_intervalo_de_cron' );

Ahí vemos como WordPress posee en la variable $schedules la lista de intervalos y su cantidad en segundos. Nosotros a través de un filtro, vamos a agregar nuestro intervalo de medio minuto a la lista definida en la variable $schedules. Finalmente cada vez que se llame al listado de intervalos, nuestro período personalizado aparecerá allí. Y podemos utilizarlo en el segundo parámetro de wp_schedule_event().

Espero que esta guía os haya gustado, para mas información puedes chequear la documentación oficial de WordPress Cron. Cualquier duda que tengas no dudes en preguntarla.

WordPress es uno de los CMS mas usados en el mundo. Al parecer 33% de Internet esta soportado por WordPress. Tal vez por su facilidad de uso para crear contenido de forma rápida y fácil para un usuario promedio de Internet. Pero la plataforma no está diseñada para resolver todo tipo de problemas. Por esta razón si tenemos una aplicación web (en este caso hecha con Yii2) o un sistema mas complejo es necesario realizarla con otro tecnología y no a través de plugins.

¿Por que integrar autenticación de WordPress a Yii2

En el párrafo anterior comenté como WordPress no puede ser usado para todo tipo de problemas. A veces necesitamos crear una aplicación con un framework para resolver cierto tipos de problemas o tener mayor control. Yo suelo usar el framework Yii2 permite realizar buenas aplicaciones en poco tiempo. Llevo un par de años usándolo y me gusta mucho.

A veces, tienes un sitio web con WordPress donde tienes una base de datos de usuario. Por ejemplo, una tienda registra todos sus usuarios allí o un sitio de noticias tiene cuentas para todos los redactores. Es posible reutilizar esta información en otro sistema que este alojado en el mismo servidor y usarlo como medio de autenticación.

Se que lo ideal es hacer una autenticación a través de OAuth o un API pero en algunos casos donde es un sistema pequeño, no hay presupuesto ni tiempo para invertir en esta solución es posible hacerlo de la siguiente manera.

Incluir el código base de WordPress

Antes de incluir el código de WordPress para la autenticación, tenemos la posibilidad de descartar la carga de código que no hemos usado, para esto podemos incluir en nuestro archivo PHP las siguientes constantes. Esto lo podemos escribir en en el archivo principal de Yii2, ubicado en /web/index.php antes de iniciar la aplicación.

define( 'WP_USE_THEMES', false);
define( 'COOKIE_DOMAIN', false );
define( 'DISABLE_WP_CRON', true );

Estas 3 constantes desactivan: la carga de temas, limitar la cookie al dominio del sitio y desactivar el cron. Este último evita que se tarde mucho tiempo la autenticación al lanzar los eventos pendientes del cron.

Luego simplemente incluimos los archivos wp-load.php y pluggable.php para cargar las funciones de autenticación de WordPress.

$wp_folder = 'RUTA_AL_WORDPRESS';
require(__DIR__ . '/../' . $wp_folder . '/wp-load.php');
require(__DIR__ . '/../' . $wp_folder . '/wp-includes/pluggable.php');

(new yii\web\Application($config))->run();

Modificación de la autenticación

Una vez realizado el paso anterior, procedemos a modificar la autenticación para que en vez de buscar en la base de datos, utilice la información de WordPress. Para ello en el método de findIdentity lo podemos realizar de la siguiente forma

  public static function findIdentity( $id ) {

    $wp_user = get_user_by($wp_attribute, trim($value));

    if ($wp_user) {
      $user                 = new self();
      $user->id             = $wpUser->ID;
      $user->username       = $wpUser->data->user_login;
      $user->niceName       = $wpUser->data->user_nicename;
      $user->displayName    = $wpUser->data->display_name;
      $user->email          = $wpUser->data->user_email;
      $user->dateRegistered = $wpUser->data->user_registered;
      $user->roles          = $wpUser->roles;
      $user->password       = $wpUser->user_pass;

      return $user;
    } else {
      return null;
    }

¡Listo! Ya podrás iniciar sesión en tu aplicación Yii2 utilizando las credenciales de tu instalación de WordPress. Nota como una vez teniendo el objeto de tipo WP_User podemos acceder a toda la información del usuario.

Espero que te guste y te sirva esta información.


Tal vez hayas escuchado sobre el servicio AWS Lambda. Su popularidad ha crecido gracias al auge de la arquitectura sin servidores (serverless en inglés). Ésta consiste en desplegar aplicaciones sin preocuparse por las tareas del servidor, pues éstas son manejadas por un servicio exerno. Permitiendo a los desarrolladores enfocarse en la aplicación como tal y no en el mantenimiento de las capas inferiores a él.

¿Qué es AWS Lambda?

Es el servicio de Amazon para ofrecer el desarrollo de aplicaciones serverless. Y como todo producto de esta compañía, tiene su propia forma de trabajar. Por lo que se requiere una pequeña cantidad de conocimientos iniciales para usar el servicio.

¿Cómo iniciarse en AWS Lambda?

Pero no te preocupes, que mi amigo Carlos Guerrero (ya he publicado su material en mi blog) ha desarrollado un excelente video de 1 hora. Conocerás en poco tiempo lo necesario para crear tu primer servicio bajo arquitectura sin servidor. El video se encuentra en español, posee ejemplo de código y muestra la interfaz del servicio para que no te pierdas.

Si te ha gustado, recuerda compartirlo para que otros aprendan. Escríbele a Carlos para que se anime a crear mas contenido. Recuerda comentar si deseas compartir algo en esta entrada.

Happy Development!

Hace unos meses tuve la oportunidad de participar en el NgColombia con la ponencia El navegador es tu mejor amigo para el desarrollo con Angular. Aunque en realidad el titulo real es Your browser is your best friend for Angular development. Pues la dicté en inglés, de hecho, fue mi primera charla en ese idioma.

Luego de varias semanas de espera. Os comparto el video de mi corta ponencia. En ella hablo sobre las herramientas disponibles en el navegador para mejorar tu flujo de desarrollo con Angular. Además en el inicio os comparto una graciosa historia para muchos.

El navegador es tu mejor amigo para el desarrollo con Angular

Si te gustó (o no) comenta tu opinión y compártela en redes sociales para hacer llegar el mensaje a mas personas. Si la viste completa, muchas gracias por ello.

Luego de 3 años y medio sin realizar ningún desarrollo en mi primer plugin de WordPress: jQuery Archive List (además de cumplir exactamente 8 años de crearlo). Pude conseguir un tiempo para actualizarlo e incluir funcionalidades pendientes.

Lo primero en hacer fue reescribir el código siguiendo las convenciones de código de WordPress. Durante este procesó note código adaptado a versiones viejas de PHP (cuando lo escribí inicialmente PHP 5.2 era la versión mas usada). Otras partes tenían código que hoy me daba risa lo ilegible o ineficiente. También habían cosas que había escrito y ahora WordPress incluye funciones para realizar esas tareas. Otras funciones fueron marcadas como obsoletas o inseguras y tocaba usar la forma correcta.

Fue una gran experiencia arreglar mi propio código. Ver como he crecido todos estos años profesionalmente, los cambios en la tecnología y como va madurando el software con los años.

En fin espero que disfruten jQuery Archive List, gracias a desarrollar este plugin pude conseguir los clientes mas importantes en mi carrera. Recibí buenas donaciones durante los inicios y me ayudó a mantenerme un poco. Además, que me ayudó a darme conocer en la comunidad de WordPress y crecer como profesional.

El pasado noviembre estuve en el JsConf Colombia 2017 dictando una charla sobre Reutilizar tu código y has aplicaciones de alto rendimiento con WebAssembly. En ella explico una introducción sobre cómo funciona Javascript, problemas de rendimiento, que es WebAssembly, ejemplos, entre otros.

Si te llama la atención esta grandiosa tecnología, no dudes en ver mi presentación en español sobre WASM. Son sólo 20 minutos donde aprenderás muchas cosas.

Así que a continuación te dejo con la presentación:

Si les gustó no duden en compartirlo en sus redes sociales para que mas personas conozcan sobre esta grandiosa tecnología.

Cuando necesitas modificar la plantilla de una instalación de WordPress, la forma correcta de hacerlo es mediante un tema hijo. De esta manera puedes realizar modificaciones solo a los archivos que necesites y es mas fácil llevar los cambios; si actualizas no perderás nada pues solo los archivos del “tema padre” se sobrescribe y no tus cambios.

La configuración de tema hijo

WordPress guarda la configuración del tema (incluyendo datos de los widgets y su posición en las barras laterales) en la base de datos. Al momento de almacenarlo utiliza el nombre de la carpeta del tema como identificador esto ocasiona la pérdida de la configuración si el nombre de la carpeta cambia por:
  • Agregaron el número de la versión del tema al nombre de la carpeta y el mismo es distinto en una versión superior.
  • Se crea un tema hijo que obviamente tendrá otro nombre.
Algunos temas posee una configuración compleja o tal vez en algunos sitios tienes una configuración de widgets muy larga como para recrearla. Por ello puedes automatizar este proceso utilizando la herramienta WP-CLI que te permite realizar tareas desde la consola.

Migrar la configuración

Asumiento que el tema padre se encuentra en la carpeta llamada tema_padre y el hijo en la carpeta tema_hijo el comando a ejecutar sería:
wp option get tema_padre --format=json > tema_hijo_settings.txt

wp option update tema_hijo "`cat tema_hijo_settings.txt`" --format=json
¡Listo! Al refrescar verás como la configuración del tema fue actualizada correctamente.Espero que te sirva de gran utilidad y recuerda compartir esta información si te fue útil.