En este artÃculo te muestro un ejemplo de una API de una aplicación web, en este caso la API REST de WordPress. Tras la explicación inicial te planteo un reto para que intentes ver en la práctica como funciona esta API, que utilidades podrÃas darle y cómo atacarla desde PHP. Más adelante tienes una posible solución al ejercicio por si te has quedado atascado en el alguno de los pasos o para que puedas compararla con la tuya.
Bueno, pero ¿qué es una API?
Una API, Application Programming Interface o Interfaz de Programación de Aplicaciones, es un conjunto de métodos que permiten acceder a las funciones de un programa. SerÃa algo asà como un programa hablando con otro programa o una máquina hablando con otra máquina. Las APIs suelen devolver resultado en dos formatos: XML, que es muy parecido a HTML pero más estructurado (y que se usa menos en este ámbito porque es una lata) y JSON que es más fácil de generar y de procesar posteriormente. Es el creador de la API quién decidirá que funcionalidad expone públicamente, que nivel de autorización será necesario para utilizar cada una de ellas y que información proporcionará en cada momento. Las buenas aplicaciones web suelen tener una API potente y bien documentada que permite acceder a sus funciones desde otras propias aplicaciones, aquà tienes algunos ejemplos de APIs:
Esta última es la base de este artÃculo y el punto de partida para que comience tu reto.
¿Qué es la API de WordPress?
Cuando accedes como usuario a un sitio web hecho con WordPress puedes ver en tu navegador los contenidos que el autor publica, maquetados con fotos, columnas, menús, etc. Si un programa informático intentará acceder a esta misma información lo que obtendrÃa es un documento de texto en formato HTML que pintarÃa más o menos asÃ.
<article id="post-1" class="post">
<header class="entry-header">
<div class="entry-meta">May 23, 2017</div>
<h2 class="entry-title"><a href="https://demo.wp-api.org/2017/05/23/hello-world/" rel="bookmark">Hello world!</a></h2>
</header>
<div class="entry-content">
Welcome to <a href="http://wp-api.org/">WP API Demo Sites</a>. This is your first post. Edit or delete it, then start blogging!
</div>
</article>
...
Si te fijas un poco hay bastante información, pero es difÃcil de entender porque no vemos claramente la estructura, tal como aparece cuando se nos presenta en modo gráfico. Para las personas es más fácil ver y consumir esta información en el contexto de un navegador, que se mostrarÃa más o menos como en la imagen.

Este formato, tan agradable para nosotros, es muy difÃcil de digerir para un programa informático que necesite extraer información a partir de la página. Imagina que te pido que crees un programa que obtenga los tÃtulos de los artÃculos o posts que aparecen en esta página y un enlace a su contenido completo. Lo tendrÃas crudo ¿verdad? Por suerte hay otra forma de acceder a esta información utilizando un formato más estructurado, y por tanto más fácil de procesar para un programa informático, además, no sólo permite leer contenido del sitio web, sino que, con la autenticación pertinente, podrÃas modificar la información o agregar nuevo contenido. Si accedes al sitio web anterior utilizando la siguiente url http://demo.wp-api.org/wp-json obtendrás algo parecido a esto:
{"name":"WP REST API Demo","description":"Just another WP API Demo Sites
site","url":"https:\/\/demo.wp-api.org","home":"https:\/\/demo.wp-
api.org","gmt_offset":"0","timezone_string":"","permalink_structure":"\/%year%\/%monthnum%\/%da
y%\/%postname%\/","namespaces":["oembed\/1.0","broker\/v1","wp\/v2"],"authentication":
{"oauth1":{"request":"https:\/\/demo.wp-
api.org\/oauth1\/request","authorize":"https:\/\/demo.wp-
api.org\/oauth1\/authorize","access":"https:\/\/demo.wp-
api.org\/oauth1\/access","version":"0.1"},"broker":"https:\/\/demo.wp-api.org\/wp-
json\/broker\/v1\/connect"},"routes":{"\/":{"namespace":"","methods":["GET"],"endpoints":
[{"methods":["GET"],"args":{"context":{"required":false,"default":"view"}}}],"_links":
{"self":"https:\/\/demo.wp-api.org\/wp-json\/"}},
...
Este galimatÃas es un fichero JSON que contiene, de manera muy estructurada, toda la información que devuelve la API del sitio cuando haces una llamada por defecto. Si tienes una versión actualizada de Firefox podrás verlo asà de bonito:

El ejemplo que acabas de ver es sólo un fragmento mÃnimo de toda la funcionalidad de la API de WordPress, una API que además sigue en desarrollo e incorporando nuevas funciones. Si tienes curiosidad aquà tienes una lista de todas las APIs disponibles en WordPress. Hasta hace poco en los sitios web de WordPress esto se hacÃa con un plugin que el administrador del sitio instalaba , pero desde la versión 4.7 viene como una funcionalidad activa por defecto.
¿Porqué se llama API REST?
No todas las APIs funcionan de la misma manera, pero serÃa una locura que cada vez que alguien crea una API lo hiciera sin ceñirse a unos estándares o convenciones. Uno de los estándares más extendidos para APIs basadas en el protocolo HTTP (el protocolo de la Web) es REST, Representational State Transfer o Transferencia de Estado Representacional. REST es un protocolo cliente servidor sin estado (al igual que HTTP), con unas pocas operaciones básicas definidas: GET, POST, PUT y DELETE; los recursos son accedidos mediante URIs bien definidas (una URI es como una URL pero más completa); además la información que devuelve una API REST debe contener hiperenlaces para acceder a otros recursos.
Planteamiento del reto
En lugar de leer este tutorial de cabo a rabo te animo a asumirlo como un reto intentando hallar tu propia solución antes de ver la que planteo al final como ejemplo. En el camino aprenderás a confiar en tus propios recursos, a desarrollar tus capacidades de búsqueda y rastreo de la información y a encontrar una solución original que seguramente supere la aquà propuesta.
¿Te apuntas? ¡Vamos a ello!
El reto que te planteo consiste en crear una sencilla página web con PHP accediendo al contenido de algún blog basado en WordPress, como ejemplo puedes usar el blog de ejemplo de la API de WordPress, a cuya API se accede con la siguiente URL http://demo.wp-api.org/wp-json/. Usando esta API te propongo obtener una lista de los artÃculos que aparecen en portada con un enlace a cada artÃculo. Cuidado porque la API anterior da alguna pista para encontrar los posts, pero no da directamente los posts, para eso hay otra URL que debes descubrir, pero cuidado porque la URL ha cambiado un par de veces con las versiones de la API y puede que encuentres alguna información anticuada. Una vez obtenida la URL correcta hay varias maneras de llamar a una API desde PHP, busca en el manual en lÃnea o mejor pregunta directamente en Google hasta encontrar una que sea lo más simple posible. Luego tendrás que procesar la información que te devuelve y generar una página HTML sencilla pero completa con el listado de artÃculos enlazados al contenido de cada uno de ellos en el blog de origen. Cuando termines puedes dejar tu solución en los comentarios de esta entrada del blog, también puedes acudir ahà para preguntarme alguna duda, aunque te advierto que yo mismo estoy todavÃa empezando con este tema.
¡Atención Spoiler!
A partir de aquà te doy mi solución al reto que planteo. Seguro que no es la mejor, espero que alguien aporte algo más elegante o completo en los comentarios. Para el ejemplo voy a utilizar mi blog personal al que tengo un poco abandonado, la URL o mejor la URI de la API con los últimos posts serÃa la siguiente: http://wikijuanan.com/wp-json/wp/v2/posts Aquà tienes el código PHP que permite acceder a la API y formatear lo que esta me devuelve para generar mi propia página web:
<?php
$uri = 'http://wikijuanan.com/wp-json/wp/v2/posts';
$json = file_get_contents($uri);
$posts= json_decode($json);
echo "<html><h1>Blog Wikijuanan</h1><ul>";
foreach ($posts as $post) {
echo "<li><a href='" . $post->link . "'>" . $post->title->rendered . "</a></li>\n";
}
echo "</ul>";
Se podrÃan hacer muchas más cosas, como poner el autor de cada artÃculo, la fecha de publicación, un resumen del mismo, etc. Y esto no es nada, también podrÃamos acceder a la API autenticándonos previamente para publicar contenidos, contestar comentarios automáticamente, etc. Pero yo ahà todavÃa no he llegado…
Me encantarÃa que me hicieras llegar tus avances en este tema o tus dudas utilizando los comentarios de esta entrada.
Resumiendo
La API REST de WordPress provee la funcionalidad necesaria para que una aplicación pueda consultar, añadir, modificar y eliminar información de una instalación de WordPress. Para obtener y enviar información al sitio se utiliza el formato JSON, que es la notación de JavaScript para representar objetos de manera literal. Para «atacar» esta API se puede utilizar cualquier lenguaje o tecnologÃa: JavaScript, PHP, Java, Node.js, Python, etc. Con la API de WordPress se puede hacer cualquier cosa, el lÃmite es nuestra imaginación.
Enlaces para seguir aprendiendo
- https://developer.wordpress.org/rest-api/
- https://www.genbetadev.com/desarrollo-web/wordpress-rest-api
- https://decodecms.com/como-usar-la-rest-api-de-wordpress/
- https://www.hostinger.es/tutoriales/guia-para-principiantes-api-rest-wordpress/
- https://codex.wordpress.org/WordPress_APIs
Agradecimientos
Este artÃculo va dedicado a dos personas: A mi compañero Mario, junto al que aprendo Symfony mientras comemos palmeras como si no hubiera mañana, que fue quien me introdujo el gusanillo este de la API de WordPress. Y a Nuria, a quien intento enseñar programación, y que con sus constantes maquinaciones para dominar WordPress me animó sin saberlo a escribir este artÃculo para empezar a explorar el asunto.
hola, he realizado la siguiente prueba, consumir el API REST desde mi propio dominio.
he realizado lo siguiente, he creado una carpeta que se llama test y dentro de ella un archivo que se llama index.php
en ese archivo llamo al código
<?php
$uri = 'http://wikijuanan.com/wp-json/wp/v2/posts';
$json = file_get_contents($uri);
$posts= json_decode($json);
echo "Blog Wikijuanan»;
foreach ($posts as $post) {
echo «link . «‘>» . $post->title->rendered . «\n»;
}
echo «»;
y me devuelve NULL.
lo he probado en otro HOSTING y funciona.
crees que pueda ser alguna restricción de seguridad de ese hosting?. algo de LOOKUP DE LOS DNS ?
de que forma puedo llamar desde mi mismo dominio a una ruta de la REST API DE wordpress?
Hola, Miguel.
Esto es debido a que la API REST de tu instalación está deshabilitada, posiblemente como medida de seguridad.
Si no lo has hecho tu, puede que te lo haya cerrado algún plugin como iThemes Security, Wordfence, Sucuri, etc. Te dejo un enlace a un artÃculo donde explica como debes desactivarla para que hagas lo contrario para activarla https://ayudawp.com/como-desactivar-la-rest-api/