Plugin básico para mostrar datos recuperados de una API en wordpress

El otro día en el trabajo se me planteó un problema que cada vez creo que será más común, mostrar los datos devueltos de una API (en json) en una página de wordpress. No encontré un plugin o una solución ya preparada en mi búsqueda fugaz en google, así que pongo aquí lo que hice yo por si a alguien le sirve. No está listo para publicarlo porque para un uso real tendría que añadir opciones y ser más estricto con la seguridad, pero en un entorno controlado (cómo es el caso) con lo que tengo me vale y puede servir de base para en un futuro mejorarlo y publicarlo.

El caso es bastante simple, para uso interno (pero podría usarse con una externa) tenemos un API para acceder a algunos apartados de nuestra base de datos y queríamos mostrar esos datos en un blog de worpress que tenemos instalado, en realidad, en una red de blogs.

La cuestión de hacerlo mediante un plugin es que me da la suficiente flexibilidad para poder reutilizarlo y tampoco me crea una dificultad excesiva.

Para facilitar el uso a la persona que administra los blogs decidí crear un plugin que con un shortcode pudiera mostrar los datos de la API, en este caso y por ir ya centrándome en el ejemplo, unas actividades. El shortcode quedaría algo así: [actividades proyecto="nombreproyecto"]

Y el código del plugin paso a paso:

Lo primero es crear la cabecera para que wordpress lo identifique como plugin:

<?php
/**
 * Plugin Name: Cargar actividades de los proyectos
 * Plugin URI: http://example.com
 * Description: Plugin para cargar las actividades de los proyectos a través de un shortcode con la siguiente estructura. [actividades proyecto="nombreproyecto"]
 * Version: 0.1
 * Author: Ander San Miguel
 * Author URI: http://lacuevaenruso.com
 * License: GPL2
 */

Luego el plugin se compone de tres funciones, la primera sería la que recupera los datos del API, tal y cómo está configurado nuestro servidor funciona, pero podría no ser el caso para otra configuración:

function ljf_load_json_data( $url ) {
  // Recupero el contenido de la URL (aquí podría utilizar curl u otra opción)
  $json_data = file_get_contents($url);
  // Y lo devuelvo como un array (al ser un entorno controlado, sé de buena tinta que siempre me va a devolver un array de objetos, así que no compruebo nada, es para uso interno)
  return json_decode($json_data, true);
}

La segunda se encarga de rellenar una plantilla con esos datos, otra vez es en su formato más básico, lo ideal sería que el HTML de la plantilla no estuviera dentro de la función y dar la opción para personalizarla, pero otra vez, es para uso interno y el ratio tiempo de desarrollo/funcionalidad es lo que primaba:

function ljf_get_html( $json_data ) {

  // Inicializo la variable
  $html_content = '';
  // Comprobación básica para que no dé error el bucle
  if (!empty($json_data) && is_array($json_data)) {
    foreach ($json_data as $item) {
      // La plantilla usa elementos muy básicos y neutros que, otra vez, es el compromiso de hacer algo para uso interno y en un entorno controlado
      $html_content .= '<h2>'.$item['title'].'</h2>';
      $html_content .= '<p>'.$item['description'].'</p>';
      $html_content .= '<p><small><strong>Lugar:</strong> '.$item['place'].'<br />';
      $html_content .= '<strong>Fecha:</strong> '.$item['date'].'<br />';
      $html_content .= '<strong>Horario:</strong> '.$item['time'].'</small></p>';
      $html_content .= '<hr />';
    }
  }

  return $html_content;
}

Y ya por último, establezco el shortcode y lo añado a la instalación de wordpress:

function ljf_define_shortcode( $atts ) {

  // Combino el array de valores por defecto con los que se pasan a través del shortcode
  // la URL del ejemplo sería http://api.example.com/actividades/proyectos/nombreproyecto
  $a = shortcode_atts( array(
    'base_url' => 'http://api.example.com/actividades/proyectos/',
    // El nombre por defecto lo dejo vacío, si no se pasara ningún valor en el shortcode devolvería las de todos los proyectos
    'proyecto' => ''
  ), $atts );

  // Recupero los valores de la API
  $data = ljf_load_json_data($a['base_url'].$a['proyecto']);
  // Recupero la plantilla ya cargada con los valores de la API
  $html = ljf_get_html($data);

  // Y devuelvo el HTML que sustituirá al shortcode en el post o página en el que se utilice
  return $html;
}
// Y añado el shortcode a wordpress
add_shortcode( 'actividades', 'ljf_define_shortcode' );

El resultado final del plugin todo junto lo he publicado en este gist.