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

26 de julio de 2020

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' );Lenguaje del código: JavaScript (javascript)

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',
  ) );
}Lenguaje del código: PHP (php)

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;
}Lenguaje del código: PHP (php)

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' );Lenguaje del código: JavaScript (javascript)
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',
    ),
  ) );
}Lenguaje del código: PHP (php)
function sumar_rest( $params ) {
  $resultado = array();

  $n1 = intval( $params['n1'] );
  $n2 = intval( $params['n2'] );

  $resultado[] = $n1 + $n2;

  return $resultado;
}
Lenguaje del código: PHP (php)

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;
}
Lenguaje del código: PHP (php)
let url = 'midominio.tld/wp-json/soyunignorante/v2/suma'
let data = { 'n1': 1, 'n2': 2 }

jQuery.post( url, data, function( response ) {
  alert( response )
})
Lenguaje del código: JavaScript (javascript)

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.