Un vistazo a la API HTTP de WordPress: Un ejemplo práctico de wp_remote_get
Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)
En el último artículo de esta serie, echamos un vistazo a las funciones PHP que están disponibles para realizar solicitudes remotas.
En concreto, revisamos lo siguiente:
file_get_contents
cURL
Y también hablamos sobre la función de WordPress wp_remote_get
.
En este artículo, vamos a poner wp_remote_get
a trabajar. Esta función forma parte de la API HTTP, y la vamos a usar en un caso práctico para recuperar las dos siguientes cosas:
- El número de seguidores que tenemos en Twitter
- Nuestro Tweet más reciente
Lo bueno es que no necesitaremos usar ningún OAuth ni nigún mecanismo de autenticación, solo tendremos que aprovechar las respuestas de Twitter y la funcionalidad JSON de PHP.
Así que en este artículo, vamos a echar un vistazo a cómo llevar exactamente esto a la práctica, luego terminaremos la serie revisando toda la información que wp_remote_get
devuelve para que sepamos cómo manejarla correctamente en futuros proyectos.
Preparar el directorio del plugin
Al igual que con todos los plugins, lo primero que tenemos que hacer es crear un nuevo directorio en nuestro propio directorio wp-content/plugins. Para los fines de esta demostración, llamaremos a nuestro plugin Twitter Demo.
Por lo tanto, vamos a nombrar el directorio del plugin twitter-demo y al archivo del plugin asociado lo denominaremos twitter-demo.php.



A continuación, tenemos que seguir adelante y crear el encabezado del plugin para que WordPress sea capaz de detectar el archivo del mismo, así que hagamos eso ahora.
Crear el plugin
En primer lugar, coloca el siguiente código en el encabezado del archivo twitter-demo.php:
<?php /* Plugin Name: Twitter Demo * Plugin URI: http://example.com/twitter-demo/ * Description: Retrieves the number of followers and latest Tweet from your Twitter account. * Version: 1.0.0 * Author: Tom McFarlin * Author URI: http://tommcfarlin.com/ * License: GPL-2.0+ * License URI: http://www.gnu.org/licenses/gpl-2.0.txt */
Ten en cuenta que no vamos a internacionalizar este plugin. Hemos tratado este tema en otro tutorial y es algo que está más allá del alcance de lo que estamos tratando de hacer en este artículo.
En este punto, ya deberías ser capaz de ver el plugin mostrándose en el panel Plugins de tu instalación de WordPress. Puedes activarlo aunque, en realidad no hará nada.
Al menos, aún no.
Dar vida al plugin
Al igual que con el resto de los plugins de demostración que publico aquí, creo que es importante describir primero qué es lo que va a hacer el plugin antes de empezar a trabajar con el código.
Por tanto, esto es lo que podemos esperar:
- En la parte inferior de cada entrada, mostraremos una pequeña notificación que diga: Tengo un número X de seguidores en Twitter. Mi último tweet fue Y.
- Nos aseguraremos de hacer esto solo en la página de entrada individual para que no se muestre en el índice principal o en las páginas de archivo del sitio.
Evidentemente, es un poco desagradable mostrar esto en la parte inferior de una entrada, pero recuerda que el propósito de este plugin es demostrar cómo utilizar wp_remote_get
, cómo analizar una respuesta de Twitter, y cómo mostrarla.
Dónde se muestre el contenido es algo que nos preocupa mucho menos.
Por lo tanto, vamos a seguir adelante creando la clase que proporcionará esta funcionalidad.
1. Crear la clase Twitter de demostración
Antes de hacer nada, vamos a crear la clase que usaremos para realizar la solicitud a Twitter. He incluido todo el siguiente código junto con la documentación para cada atributo y método.
<?php /** * Plugin Name: Twitter Demo * Plugin URI: http://tommcfarlin.com/twitter-demo/ * Description: Retrieves the number of followers and latest Tweet from your Twitter account. * Version: 1.0.0 * Author: Tom McFarlin * Author URI: http://tommcfarlin.com/ * License: GPL-2.0+ * License URI: http://www.gnu.org/licenses/gpl-2.0.txt */ class Twitter_Demo { /** * Instance of this class. * * @var Twitter_Demo */ private static $instance; /** * Initializes the plugin so that the Twitter information is appended to the end of a single post. * Note that this constructor relies on the Singleton Pattern * * @access private */ private function __construct() { } // end constructor /** * Creates an instance of this class * * @access public * @return Twitter_Demo An instance of this class */ public function get_instance() { } // end get_instance /** * Appends a message to the bottom of a single post including the number of followers and the last Tweet. * * @access public * @param $content The post content * @return $content The post content with the Twitter information appended to it. */ public function display_twitter_information( $content ) { } // end display_twitter_information /** * Attempts to request the specified user's JSON feed from Twitter * * @access public * @param $username The username for the JSON feed we're attempting to retrieve * @return $json The user's JSON feed or null of the request failed */ private function make_twitter_request( $username ) { } // end make_twitter_request /** * Retrieves the number of followers from the JSON feed * * @access private * @param $json The user's JSON feed * @return The number of followers for the user. -1 if the JSON data isn't properly set. */ private function get_follower_count( $json ) { } // end get_follower_count /** * Retrieves the last tweet from the user's JSON feed * * @access private * @param $json The user's JSON feed * @return The last tweet from the user's feed. '[ No tweet found. ]' if the data isn't properly set. */ private function get_last_tweet( $json ) { } // end get_last_tweet } // end class // Trigger the plugin Twitter_Demo::get_instance();
Ten en cuenta que vamos a llenar el resto de estos métodos a medida que avancemos, y también tendré el código fuente completo del plugin al final del artículo.
Antes de ir más lejos, me gustaría señalar que vamos a usar el patrón Singleton para este plugin. Hemos cubierto este patrón de diseño en un artículo anterior, y aunque sus ventajas están fuera del alcance de este artículo, recomiendo que leas el artículo relacionado para asegurarme de que entiendas completamente por qué estamos configurando nuestro plugin de esta manera.
A continuación, echemos un vistazo a las funciones que hemos establecido para ser conscientes de hacia dónde nos dirigimos exactamente:
- En el constructor añadiremos una acción para anexar nuestra información de Twitter a una entrada individual
-
display_twitter_information
se utilizará para representar el mensaje en la parte inferior de la entrada -
make_twitter_request
solicitará y devolverá los datos de Twitter (o null si se produce un error en la solicitud) -
get_follower_count
devolverá el número de seguidores para el usuario especificado (o -1 si hay un problema) -
get_last_tweet
devolverá el último tweet del usuario o un mensaje si el plugin falla
¿Ha quedado suficientemente claro? En este punto, vamos a trabajar en la solicitud de información a Twitter para que podamos procesarla.
2. Solicitar datos a Twitter
En primer lugar, vamos a rellenar la función make_twitter_request
con el siguiente código. Ten en cuenta que lo explicaré después del código:
private function make_twitter_request( $username ) { $response = wp_remote_get( 'https://twitter.com/users/' . $username . '.json' ); try { // Note that we decode the body's response since it's the actual JSON feed $json = json_decode( $response['body'] ); } catch ( Exception $ex ) { $json = null; } // end try/catch return $json; }
En la primera línea del código estamos aprovechando wp_remote_get
para hacer nuestra solicitud. Ten en cuenta que estamos usando el parámetro $username
para recuperar el feed JSON del usuario. Observa lo sencillo que es realizar una solicitud mediante la función wp_remote_get
.
Este nombre de usuario se pasa desde una función distinta que veremos en breve.
A continuación, ten en cuenta que ajustamos el código en un try/catch
. Esto se debe a que la solicitud a Twitter podría fallar. Si no falla, usaremos la función json_decode
de PHP para decodificar el cuerpo de la respuesta; de lo contrario, estableceremos la respuesta a null
.
Esto hará que resulte fácil crear un condicional en la función de llamada.
Antes de ir más allá, es importante tener en cuenta que aquí hay un sutil aporte: Advierte que estamos decodificando la clave 'body
' de la matriz $response
que es devuelta. Para aquellos de vosotros que tengáis más curiosidad por esto, en el siguiente artículo vamos a echar un minucioso vistazo a la respuesta que recibimos al usar wp_remote_get
.
Por ahora, ten en cuenta simplemente que el índice de body
de la matriz $response
es solo una pieza de información que tenemos a nuestra disposición.
3. Llamada a la función de solicitud
Ahora que hemos definido la función responsable de hacer una solicitud a Twitter, vamos a definir la función que solicitará datos de Twitter y luego los mostrará bajo el contenido de la entrada.
Una vez más, aquí tienes el código, así que ahora voy a explicar qué está haciendo exactamente:
public function display_twitter_information( $content ) { // If we're on a single post or page... if ( is_single() ) { // ...attempt to make a response to twitter. Note that you should replace your username here! if ( null == ( $json_response = $this->make_twitter_request( 'wptuts' ) ) ) { // ...display a message that the request failed $html = ' <div id="twitter-demo-content">'; $html .= 'There was a problem communicating with the Twitter API..'; $html .= '</div> <!-- /#twitter-demo-content -->'; // ...otherwise, read the information provided by Twitter } else { $html = ' <div id="twitter-demo-content">'; $html .= 'I have ' . $this->get_follower_count( $json_response ) . ' followers and my last tweet was "' . $this->get_last_tweet( $json_response ) . '".'; $html .= '</div> <!-- /#twitter-demo-content -->'; } // end if/else $content .= $html; } // end if/else return $content; }
En primer lugar, indicarte que esta es la función más larga de todo el plugin. Si puedes entenderla, es que estás preparado para completarlo.
Recuerda: Esta función es lo que será invocado durante la acción the_content
que será definida en nuestro constructor una vez que el plugin esté terminado.
Por tanto, la función comprueba primero si estamos en una entrada individual. Si no es así, simplemente devolverá el contenido; de lo contrario, hará lo siguiente:
- Intentos de hacer una solicitud a Twitter
- Si se produce un error en la solicitud, se mostrará un mensaje indicándolo
- De lo contrario, imprimirá un mensaje que muestre el número de seguidores y el último tweet que la persona dejó
- Añadirá el mensaje al contenido de la entrada
Una nota importante: En esta función, especifica el nombre de usuario para del que deseas recuperar la información. Por ejemplo, observa que estoy intentando recuperar información para @WPTuts invocando a $this->make_twitter_request('wptuts')
.
4. Leer la información
En este punto, estamos listos para leer la información y concatenar las cadenas en nuestro mensaje para mostrar al usuario. Haremos esto usando el método get_follower_count
y get_last_tweet
.
Debido a que estos métodos son tan similares, echaremos un vistazo a ambos y luego los explicaré después del código:
private function get_follower_count( $json ) { return ( -1 < $json->followers_count ) ? $json->followers_count : -1; } // end get_follower_count private function get_last_tweet( $json ) { return ( 0 < strlen( $json->status->text ) ) ? $json->status->text : '[ No tweet found. ]'; } // end get_last_tweet
Ten en cuenta que las dos funciones son similares en el sentido en que ambas aceptan los anteriores datos $json
del plugin. A continuación, ambos usan un operador ternario para determinar si deben devolver el texto solicitado o un mensaje predeterminado.
En otras palabras, si pretendemos mostrar el número de seguidores (followers_count
) y el valor es mayor que -1
, sabremos que tenemos un valor a mostrar, así que lo devolveremos; de lo contrario, devolveremos -1
a modo de indicador de que el valor no está configurado correctamente.
Esto nos permite codificar defensivamente contra algo que puede salir mal cuando se procesen los datos.
El plugin de demostración de Twitter
Como prometí, aquí está el código fuente en su totalidad acompañado de su correspondiente documentación:
<?php /** * Plugin Name: Twitter Demo * Plugin URI: http://example.com/twitter-demo/ * Description: Retrieves the number of followers and latest Tweet from your Twitter account. * Version: 1.0.0 * Author: Tom McFarlin * Author URI: http://tommcfarlin.com/ * License: GPL-2.0+ * License URI: http://www.gnu.org/licenses/gpl-2.0.txt */ class Twitter_Demo { /** * Instance of this class. * * @var Twitter_Demo */ private static $instance; /** * Initializes the plugin so that the Twitter information is appended to the end of a single post. * Note that this constructor relies on the Singleton Pattern * * @access private */ private function __construct() { add_action( 'the_content', array( $this, 'display_twitter_information' ) ); } // end constructor /** * Creates an instance of this class * * @access public * @return Twitter_Demo An instance of this class */ public function get_instance() { if ( null == self::$instance ) { self::$instance = new self; } return self::$instance; } // end get_instance /** * Appends a message to the bottom of a single post including the number of followers and the last Tweet. * * @access public * @param $content The post content * @return $content The post content with the Twitter information appended to it. */ public function display_twitter_information( $content ) { // If we're on a single post or page... if ( is_single() ) { // ...attempt to make a response to twitter. Note that you should replace your username here! if ( null == ( $json_response = $this--->make_twitter_request('wptuts') ) ) { // ...display a message that the request failed $html = ' <div id="twitter-demo-content">'; $html .= 'There was a problem communicating with the Twitter API..'; $html .= '</div> <!-- /#twitter-demo-content -->'; // ...otherwise, read the information provided by Twitter } else { $html = ' <div id="twitter-demo-content">'; $html .= 'I have ' . $this->get_follower_count( $json_response ) . ' followers and my last tweet was "' . $this->get_last_tweet( $json_response ) . '".'; $html .= '</div> <!-- /#twitter-demo-content -->'; } // end if/else $content .= $html; } // end if/else return $content; } // end display_twitter_information /** * Attempts to request the specified user's JSON feed from Twitter * * @access public * @param $username The username for the JSON feed we're attempting to retrieve * @return $json The user's JSON feed or null of the request failed */ private function make_twitter_request( $username ) { $response = wp_remote_get( 'https://twitter.com/users/' . $username . '.json' ); try { // Note that we decode the body's response since it's the actual JSON feed $json = json_decode( $response['body'] ); } catch ( Exception $ex ) { $json = null; } // end try/catch return $json; } // end make_twitter_request /** * Retrieves the number of followers from the JSON feed * * @access private * @param $json The user's JSON feed * @return The number of followers for the user. -1 if the JSON data isn't properly set. */ private function get_follower_count( $json ) { return ( -1 < $json->followers_count ) ? $json->followers_count : -1; } // end get_follower_count /** * Retrieves the last tweet from the user's JSON feed * * @access private * @param $json The user's JSON feed * @return The last tweet from the user's feed. '[ No tweet found. ]' if the data isn't properly set. */ private function get_last_tweet( $json ) { return ( 0 < strlen( $json->status->text ) ) ? $json->status->text : '[ No tweet found. ]'; } // end get_last_tweet } // end class // Trigger the plugin Twitter_Demo::get_instance();
En realidad es relativamente simple, ¿verdad? De hecho, hay tantos comentarios de código como líneas de código real, por lo que el plugin en sí es muy pequeño.
Conclusión
Esta demo pretende mostrar lo fácil que es usar wp_remote_get
para interactuar con servicios de terceros, analizar su respuesta e integrarla en un plugin. Concedido, esto se queda muy en la superficie, pero aun así muestra el concepto.
En el siguiente artículo de esta parte de la serie, echaremos un vistazo a toda la información que podemos pasar a wp_remote_get
para ver cuán flexible es el método. Después de eso, echaremos un detallado vistazo a los datos de respuesta para que podamos escribir solicitudes más complejas y escribir más código defensivo, más defensivamente.