Añadir un endpoint para REST API en WordPress. Básico

Muy recientemente he tenido casi que improvisar para obtener datos de un WordPress y emplearlos en otro sitio web. Había oído hablar de API REST y se me ocurrió que podría ser una buena solución para resolver mi problema.

Este artículo no es más que unas notas rápidas, posiblemente con algún que otro error, para intentar comprender mejor este tema y que me sirva de punto de arranque si necesitase volver a usarlo.

Un endpoint es el punto a través del cual se inicia todo el proceso que acaba generando la respuesta que necesitamos. El endpoint se define, de manera básica con una URL, un método http y un callback, que es la función que se ejecutará al recibir una petición a en una URL a través de un método específico.

El hook

Vale para pedirle a WordPress que haga algo al inicializar el servicio REST. En este caso, lo que hará es registrar_mi_endpoint.

add_action( 'rest_api_init', 'registrar_mi_endpoint' );

Registrar el endpoint

Mediante la función que sigue, defino el endpoint y lo registro o añado a la colección que WordPress ya tiene disponible.

function registrar_mi_endpoint() { register_rest_route( 'namespace/v2', '/endpoint/', array( 'method' => 'GET', 'callback' => 'mi_consulta', ) ); }

Habilita una url de la forma midominio.tld/wp-json/namespace/v2/endpoint/. Al acceder a esta URL a través del método GET, se ejecutará la función «mi_consulta» y se devolverá su resultado.

Añadir la función que genera la respuesta

function mi_consulta() { $resultado = array(); $resultado[] = 1; $resultado[] = 'el resultado'; $resultado[6] = array(); $resultado[6]['color'] = 'verde'; return $resultado; }

La función que genera la respuesta normalmente devolverá un array de tal forma que este se convertirá en un formato json, que será lo que reciba el cliente.

Consultas con parámetros

Posiblemente, con esto no nos sea suficiente en muchas ocasiones y queramos añadir algunos parámetros que nos permitan tener alternativas en las respuestas. Por ejemplo, si estamos consultando las entradas de un post_type, pero queremos filtarlas por alguna característica.

Para esto tenemos que ser capaces de pasar parámetros en la consulta. Generaré un endpoint que devuelva el resultado de la suma de dos enteros.

add_action( 'rest_api_init', 'registrar_suma_endpoint' );
function registrar_suma_endpoint() { register_rest_route( 'soyunignorante/v2', '/suma/(?P<n1>\d+)/(?P<n2>\d+)', array( 'method' => 'GET', 'callback' => 'sumar_rest', 'args' => array( 'n1', 'n2', ), ) ); }
function sumar_rest( $params ) { $resultado = array(); $n1 = intval( $params['n1'] ); $n2 = intval( $params['n2'] ); $resultado[] = $n1 + $n2; return $resultado; }

Con esto, al acceder a midominio.tld/wp-json/soyunignorante/v2/suma/1/2 debaríamos obtener como resultado 3. Y al acceder a midominio.tld/wp-json/soyunignorante/v2/suma/1500/2, obtendríamos 1502.

Usando el método POST para pasar los parámetros

add_action( 'rest_api_init', 'registrar_suma_endpoint' ); function registrar_suma_endpoint() { register_rest_route( 'soyunignorante/v2', '/suma/', array( 'method' => 'POST', 'callback' => 'sumar_rest', ) ); } function sumar_rest() { $sumando = WP_REST_Request::get_params(); $resultado = intval( $sumando['n1'] ) + intval( $sumando['n2'] ); return $resultado; }
let url = 'midominio.tld/wp-json/soyunignorante/v2/suma' let data = { 'n1': 1, 'n2': 2 } jQuery.post( url, data, function( response ) { alert( response ) })

Deja una respuesta

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

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: Carlos Alberto Sobrino Lusquiños
  • Finalidad: Gestión de consentimiento para la publicación y moderación de comentarios.
  • Legitimación: Gestión de consentimiento
  • Destinatarios: No se cederán los datos a terceros, excepto por obligación legal.
  • Derechos: Acceso, rectificación, supresión y portabilidad.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad