Consejos para API REST externas en WordPress

Después de un par de años, mi post sobre cómo utilizar API REST externas en WordPress sigue siendo visitada. Sin embargo, algunas personas me han contactado para pedirme consejos sobre el manejo de los datos.

Problemas al usar API REST externas en WordPress

He detectado que algunos desarrolladores, después de implementar algunas API REST externas en WordPress, éste se ve afectado en cuanto a performance.

Otros no saben dónde poner su código, si en el archivo functions.php o en un plugin. ¿Cuál es mejor?

A continuación te daré un par de consejos al momento de desarrollar e integrar una API REST en WordPress.

Consejo #1. Cachea los resultados

Después de implementar tu API REST en WordPress, se ejecutará una petición cada vez que se recargue la página.

Quiere decir que tu página tendrá que esperar (o no muestre nada) hasta que la petición haya terminado, originando los siguientes problemas:

  • Un tiempo de carga muy lento. Tal vez afecte el SEO.
  • Más uso de recursos de tu servidor y posiblemente el servidor de la API REST.

La solución será cachear/guardar los resultados de la petición en nuestra base de datos, para que la próxima vez que se requieran no vuelva a ejecutarse otra petición remota.

Un diagrama de flujo puede ayudar a la explicación:

Diagrama de flujo sobre el cacheo de resultados de una petición API REST.
Diagrama de flujo sobre el cacheo de resultados de una petición API REST.

Y en código PHP/WordPress sería:

add_action( 'wp_loaded', 'rmr_load_rick_and_morty_data' );

function rmr_load_rick_and_morty_data() {
  $cached_results = get_option( 'rick_and_morty_cached_results' );

  if ( $cached_results ) {
    echo $cached_results[0]['name'];
    return;
  }

  $response = wp_remote_get( 'https://rickandmortyapi.com/api/character/' );

  if ( is_wp_error( $response ) ) {
      return;
  }

  $http_code = wp_remote_retrieve_response_code( $response );
  
  if ( 200 !== $http_code ) {
    return;
  }

  $results = wp_remote_retrieve_body( $response );
  $results = json_decode( $results, true );
  $results = $results['results']; // Contiene la información que queremos.

  update_option( 'rick_and_morty_cached_results', $results, 'no' );
  echo $results[0]['name'];
}

El código anterior guardará los personajes de la serie Rick & Morty en la base de datos de WordPress haciendo una petición a la API REST cuando la acción wp_loaded sea llamada. La segunda vez que se intente hacer la petición, ésta no se hará porque los datos ya existen.

Consejo #2. Usar una acción para actualizar los resultados

Imagina que los resultados de la API REST ya están guardados en tu base de datos, pero digamos que uno de los datos que guardaste ya cambió en todo este tiempo.

Sí puedes ir a borrar el campo que guarda los datos en tu base de datos, pero eso no es para nada óptimo, no harás esto cada vez que haya un cambio, ¿o si?

Lo más sano y seguro es agregar un botón o cualquier otro tipo de acción (acorde a tus requerimientos) para actualizar estos datos.

Una acción puede ser un click, un evento scroll e incluso un evento periódico (cron job). Cualquier acción que tú como administrador o simple usuario pueda ejecutar.

Por ejemplo, para actualizar los datos al momento de dar click en un botón usando AJAX, la lógica sería de la siguiente forma:

Diagrama de flujo sobre la actualización de resultados de una petición API REST al ejecutar una acción.
Diagrama de flujo sobre la actualización de resultados de una petición API REST al ejecutar una acción.

Y en código se puede representar en esta forma:

add_action( 'wp_ajax_rmr_update_api_data', 'rmr_update_api_data' );

function rmr_update_api_data() {
  check_ajax_referer( 'rmr_update_api_data' );
  
  $response = wp_remote_get( 'https://rickandmortyapi.com/api/character/' );

  if ( is_wp_error( $response ) ) {
      return;
  }
  
  $http_code = wp_remote_retrieve_response_code( $response );
  
  if ( 200 !== $http_code ) {
    return;
  }

  $results = wp_remote_retrieve_body( $response );
  $results = json_decode( $results, true );
  $results = $results['results']; // Contiene la información que queremos.

  update_option( 'rick_and_morty_cached_results', $results, 'no' );
}

Hacemos uso de la acción wp_ajax_{action}, la cual ejecutará la acción AJAX desde un click o scroll, algo que ejecute el AJAX request. Después hacemos las validaciones necesarias y si todo está bien, hacemos una petición a la API REST y actualizamos los datos.

Lo anterior es algo complicado para desarrolladores nuevos, pero en la web hay mucha información sobre cómo trabajar con AJAX; aquí te dejo unos recursos:

Consejo #3. Agrega validaciones

En cualquier código siempre debes agregar validaciones para no generar errores en el log del sistema. Siempre debes programar de manera defensiva.

No ejecutes código que no va a funcionar después de hacer una petición API REST fallida.

En el caso de peticiones a API REST, mayormente debes checar lo siguiente:

  • Si el resultado es un WP_Error.
  • Si el código HTTP es o no 200.

Cuando ocurre un error interno de WordPress al hacer una petición, podría ocurrir un WP_Error, es por eso que debes hacer esta validación:

$response = wp_remote_get( 'https://rickandmortyapi.com/api/character/' );

if ( is_wp_error( $response ) ) {
    return;
}

Y de vez en cuando, el servicio REST podría no estar funcionando y tal vez retorne distintos errores como, 401, 500, etc. En este caso no podríamos procesar los datos que queremos.

Para verificar el código HTTP se hace de la siguiente manera:

$response = wp_remote_get( 'https://rickandmortyapi.com/api/character/' );

if ( is_wp_error( $response ) ) {
    return;
}

$http_code = wp_remote_retrieve_response_code( $response );

if ( 200 !== $http_code ) {
  return;
}

Si alguna validación anterior ocurre, el código principal ya no se ejecutará, evitando así posibles errores.

También puedes agregar validaciones extras, acorde a tus requerimientos, por ejemplo, si el HTTP es 200 pero solo quieres guardar los datos si el primer resultado equivale a un cierto valor.

Consejo #4. No guardes datos que no necesitas

Ten en cuenta que algunas API REST devuelven algunos meta datos, como la página actual, fechas de actualización, etc.

Hay que ser inteligentes al momento de manejar datos, ¿necesitas almacenar esos meta datos?

El guardar datos que no necesitas solo incrementará innecesariamente la base de datos.

Por ejemplo, la API REST que hemos estado usando sobre Rick & Morty, devuelve un campo llamado info:

Resultado de API REST de Rick & Morty.
Resultado de API REST de Rick & Morty.

Si en realidad necesitas los datos del campo info, entonces guardalos, si no, no los guardes.

Con el código puedes acceder fácilmente a los datos usando arreglos (arrays):

$results = wp_remote_retrieve_body( $response );
$results = json_decode( $results, true );
$results = $results['results']; // Contiene la información que queremos.
$info    = $results['info']; // Contiene información no valiosa.

update_option( 'rick_and_morty_cached_results', $results, 'no' );

Consejo #5. Desarrolla con plugins no con temas

Al inicio es muy común desarrollar dentro del archivo functions.php, el cual es el archivo principal de ejecución de funciones extras del tema activo.

Trabajar ahi está bien para funciones internas del tema activo, sin embargo, cuando uno va agregar una funcionalidad extra al sitio web del cliente, no debes trabajar directamente en él.

En el caso de una funcionalidad como integrar una API REST u otra funcionalidad debes trabajar en:

  • Temas hijos.
  • Plugins.

Los temas hijos son una opción, pero siguen siendo atenidos al tema activo padre. Esto está bien si el cliente nunca va cambiar el tema.

Por otra parte, lo que yo recomiendo es desarrollar un plugin, de esta manera el plugin siempre quedará activo a pesar de cambiar/desactivar el tema actual. Mantiene su funcionalidad.

Conclusión

Cada uno de los consejos trabajan en conjunto y separado, y en lo personal, deben aplicarse siempre que uno trabaje con API REST.

Quedará de ti y tus requerimientos el implementar uno de estos consejos u otros que se te ocurran.

¿Crees que me faltó algún consejo? ¿Cuál agregarías?

¿Te gustó mi contenido? Compártelo con los demás:

1 comentario en “Consejos para API REST externas en WordPress”

Deja un comentario