1. Code
  2. Game Development

Un vistazo a la API HTTP de WordPress: Un ejemplo práctico de wp_remote_get

Scroll to top
This post is part of a series called A Look at the WordPress HTTP API.
A Look at the WordPress HTTP API: A Brief Survey of wp_remote_get
A Look at the WordPress HTTP API: wp_remote_get - the Response

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:

  1. El número de seguidores que tenemos en Twitter
  2. 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.

Twitter DemoTwitter DemoTwitter Demo

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:

1
<?php
2
/* Plugin Name: Twitter Demo

3
 * Plugin URI:  http://example.com/twitter-demo/

4
 * Description: Retrieves the number of followers and latest Tweet from your Twitter account.

5
 * Version:     1.0.0

6
 * Author:      Tom McFarlin

7
 * Author URI:  http://tommcfarlin.com/

8
 * License:     GPL-2.0+

9
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt

10
 */

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.

1
<?php
2
/**

3
 * Plugin Name: Twitter Demo

4
 * Plugin URI:  http://tommcfarlin.com/twitter-demo/

5
 * Description: Retrieves the number of followers and latest Tweet from your Twitter account.

6
 * Version:     1.0.0

7
 * Author:      Tom McFarlin

8
 * Author URI:  http://tommcfarlin.com/

9
 * License:     GPL-2.0+

10
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt

11
 */
12
13
class Twitter_Demo {
14
15
	/**

16
	 * Instance of this class.

17
	 *

18
	 * @var      Twitter_Demo

19
	 */
20
	private static $instance;
21
22
	/**

23
	 * Initializes the plugin so that the Twitter information is appended to the end of a single post.

24
	 * Note that this constructor relies on the Singleton Pattern

25
	 *

26
	 * @access private

27
	 */
28
	private function __construct() {
29
30
	} // end constructor

31
32
	/**

33
	 * Creates an instance of this class

34
	 *

35
	 * @access public

36
	 * @return Twitter_Demo    An instance of this class

37
	 */
38
	public function get_instance() {
39
40
	} // end get_instance

41
42
	/**

43
	 * Appends a message to the bottom of a single post including the number of followers and the last Tweet.

44
	 *

45
	 * @access public

46
	 * @param  $content    The post content

47
	 * @return $content    The post content with the Twitter information appended to it.

48
	 */
49
	public function display_twitter_information( $content ) {
50
51
	} // end display_twitter_information

52
53
	/**

54
	 * Attempts to request the specified user's JSON feed from Twitter

55
	 *

56
	 * @access public

57
	 * @param  $username   The username for the JSON feed we're attempting to retrieve

58
	 * @return $json       The user's JSON feed or null of the request failed

59
	 */
60
	private function make_twitter_request( $username ) {
61
62
	} // end make_twitter_request

63
64
	/**

65
	 * Retrieves the number of followers from the JSON feed

66
	 *

67
	 * @access private

68
	 * @param  $json     The user's JSON feed

69
	 * @return           The number of followers for the user. -1 if the JSON data isn't properly set.

70
	 */
71
	private function get_follower_count( $json ) {
72
73
	} // end get_follower_count

74
75
	/**

76
	 * Retrieves the last tweet from the user's JSON feed

77
	 *

78
	 * @access private

79
	 * @param  $json     The user's JSON feed

80
	 * @return           The last tweet from the user's feed. '[ No tweet found. ]' if the data isn't properly set.

81
	 */
82
	private function get_last_tweet( $json ) {
83
84
	} // end get_last_tweet

85
86
} // end class

87
88
// Trigger the plugin

89
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:

1
private function make_twitter_request( $username ) {
2
3
	$response = wp_remote_get( 'https://twitter.com/users/' . $username . '.json' );
4
	try {
5
6
		// Note that we decode the body's response since it's the actual JSON feed

7
		$json = json_decode( $response['body'] );
8
9
	} catch ( Exception $ex ) {
10
		$json = null;
11
	} // end try/catch

12
13
	return $json;
14
15
}

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:

1
public function display_twitter_information( $content ) {
2
3
	// If we're on a single post or page...

4
	if ( is_single() ) {
5
6
		// ...attempt to make a response to twitter. Note that you should replace your username here!

7
		if ( null == ( $json_response = $this->make_twitter_request( 'wptuts' ) ) ) {
8
9
			// ...display a message that the request failed

10
			$html = '

11
<div id="twitter-demo-content">';
12
 $html .= 'There was a problem communicating with the Twitter API..';
13
 $html .= '</div>

14
<!-- /#twitter-demo-content -->';
15
16
		// ...otherwise, read the information provided by Twitter

17
		} else {
18
19
			$html = '

20
<div id="twitter-demo-content">';
21
 $html .= 'I have ' . $this->get_follower_count( $json_response ) . ' followers and my last tweet was "' . $this->get_last_tweet( $json_response ) . '".';
22
 $html .= '</div>

23
<!-- /#twitter-demo-content -->';
24
25
		} // end if/else

26
27
		$content .= $html;
28
29
	} // end if/else

30
31
	return $content;
32
33
}

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:

1
private function get_follower_count( $json ) {
2
	return ( -1 < $json->followers_count ) ? $json->followers_count : -1;
3
} // end get_follower_count

4
5
private function get_last_tweet( $json ) {
6
	return ( 0 < strlen( $json->status->text ) ) ? $json->status->text : '[ No tweet found. ]';
7
} // 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:

1
<?php
2
/**

3
 * Plugin Name: Twitter Demo

4
 * Plugin URI:  http://example.com/twitter-demo/

5
 * Description: Retrieves the number of followers and latest Tweet from your Twitter account.

6
 * Version:     1.0.0

7
 * Author:      Tom McFarlin

8
 * Author URI:  http://tommcfarlin.com/

9
 * License:     GPL-2.0+

10
 * License URI: http://www.gnu.org/licenses/gpl-2.0.txt

11
 */
12
class Twitter_Demo {
13
	/**

14
	 * Instance of this class.

15
	 *

16
	 * @var      Twitter_Demo

17
	 */
18
	private static $instance;
19
20
	/**

21
	 * Initializes the plugin so that the Twitter information is appended to the end of a single post.

22
	 * Note that this constructor relies on the Singleton Pattern

23
	 *

24
	 * @access private

25
	 */
26
	private function __construct() {
27
		add_action( 'the_content', array( $this, 'display_twitter_information' ) );
28
	} // end constructor

29
30
	/**

31
	 * Creates an instance of this class

32
	 *

33
	 * @access public

34
	 * @return Twitter_Demo    An instance of this class

35
	 */
36
	public function get_instance() {
37
		if ( null == self::$instance ) {
38
			self::$instance = new self;
39
		}
40
		return self::$instance;
41
	} // end get_instance

42
43
	/**

44
	 * Appends a message to the bottom of a single post including the number of followers and the last Tweet.

45
	 *

46
	 * @access public

47
	 * @param  $content    The post content

48
	 * @return $content    The post content with the Twitter information appended to it.

49
	 */
50
	public function display_twitter_information( $content ) {
51
		// If we're on a single post or page...

52
		if ( is_single() ) {
53
			// ...attempt to make a response to twitter. Note that you should replace your username here!

54
			if ( null == ( $json_response = $this--->make_twitter_request('wptuts') ) ) {
55
56
				// ...display a message that the request failed

57
				$html = '

58
<div id="twitter-demo-content">';
59
 $html .= 'There was a problem communicating with the Twitter API..';
60
 $html .= '</div>

61
<!-- /#twitter-demo-content -->';
62
63
				// ...otherwise, read the information provided by Twitter

64
			} else {
65
66
				$html = '

67
<div id="twitter-demo-content">';
68
 $html .= 'I have ' . $this->get_follower_count( $json_response ) . ' followers and my last tweet was "' . $this->get_last_tweet( $json_response ) . '".';
69
 $html .= '</div>

70
<!-- /#twitter-demo-content -->';
71
72
			} // end if/else

73
74
			$content .= $html;
75
76
		} // end if/else

77
78
		return $content;
79
80
	} // end display_twitter_information

81
82
	/**

83
	 * Attempts to request the specified user's JSON feed from Twitter

84
	 *

85
	 * @access public

86
	 * @param  $username   The username for the JSON feed we're attempting to retrieve

87
	 * @return $json       The user's JSON feed or null of the request failed

88
	 */
89
	private function make_twitter_request( $username ) {
90
91
		$response = wp_remote_get( 'https://twitter.com/users/' . $username . '.json' );
92
		try {
93
94
			// Note that we decode the body's response since it's the actual JSON feed

95
			$json = json_decode( $response['body'] );
96
97
		} catch ( Exception $ex ) {
98
			$json = null;
99
		} // end try/catch

100
101
		return $json;
102
103
	} // end make_twitter_request

104
105
	/**

106
	 * Retrieves the number of followers from the JSON feed

107
	 *

108
	 * @access private

109
	 * @param  $json     The user's JSON feed

110
	 * @return           The number of followers for the user. -1 if the JSON data isn't properly set.

111
	 */
112
	private function get_follower_count( $json ) {
113
		return ( -1 < $json->followers_count ) ? $json->followers_count : -1;
114
	} // end get_follower_count

115
116
	/**

117
	 * Retrieves the last tweet from the user's JSON feed

118
	 *

119
	 * @access private

120
	 * @param  $json     The user's JSON feed

121
	 * @return           The last tweet from the user's feed. '[ No tweet found. ]' if the data isn't properly set.

122
	 */
123
	private function get_last_tweet( $json ) {
124
		return ( 0 < strlen( $json->status->text ) ) ? $json->status->text : '[ No tweet found. ]';
125
	} // end get_last_tweet

126
127
} // end class

128
129
// Trigger the plugin

130
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.