Cómo acceder a la API de WordPress desde PHP

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

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.

2 comentarios en “Cómo acceder a la API de WordPress desde PHP

  1. 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&#039;;
    $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?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *