Blog

🔌 Accediendo a datos de la API REST desde plugins de WordPress

Leonardo Losoviz
Por Leonardo Losoviz ·

Muchos plugins de WordPress exponen datos a través de la API REST, pero no proporcionan una capa de GraphQL. Con Gato GraphQL aún puedes usar esos datos en una única petición GraphQL: la extensión HTTP Client te permite llamar a cualquier endpoint REST y trabajar con la respuesta JSON directamente en tu consulta.

Así que cuando un plugin no tiene integración con GraphQL, no te quedas estancado: consultas su API REST desde GraphQL y mantienes todo en un solo lugar.

Esta publicación muestra cómo hacerlo. El mismo patrón funciona para cualquier plugin que exponga endpoints REST.

Requisitos previos

  1. Asegúrate de que la extensión HTTP Client esté instalada (incluida en las extensiones Power de Gato GraphQL y en los bundles).
  2. Configura las URLs permitidas para que la base REST del plugin esté permitida. Para peticiones al mismo sitio, permite la URL de tu sitio (por ejemplo, #https://tusitio.com/wp-json/.*# o tu base REST exacta). Consulta configurar qué URLs pueden recibir peticiones HTTP.

Si la API del plugin requiere autorización, deberás crear el token de autorización y pasarlo en la petición (por ejemplo, mediante cabeceras).

Ejemplo: Recuperando datos de reservas de citas

BookingPress es un plugin de reserva de citas que ofrece endpoints de API REST para recuperar datos de citas. Por lo tanto, podemos llamar a esos endpoints desde GraphQL y obtener los datos de las citas.

Consultando la documentación de la API REST de BookingPress, vemos que la base actual del endpoint es wp-json/bookingpress/v1.

1. Listar citas (colección)

Usa _sendJSONObjectCollectionHTTPRequest cuando la API devuelva una lista de elementos (por ejemplo, un array de citas). Si la API envuelve la lista en un objeto (por ejemplo, { "data": [ ... ] }), puede que necesites usar _sendJSONObjectItemHTTPRequest y luego leer la propiedad data del resultado.

Construye la URL a partir de la URL principal de tu sitio usando optionValue(name: "home") para que la misma consulta funcione en cualquier entorno:

query GetBookingPressAppointments {
  siteURL: optionValue(name: "siteurl")
    @remove
 
  restBase: _sprintf(
    string: "%s/wp-json/bookingpress/v1/appointments",
    values: [$__siteURL]
  )
    @remove
 
  bookingpressApiKey: _env(name: "BOOKINGPRESS_API_KEY")
    @remove
 
  authorizationHeader: _sprintf(
    string: "x-bookingpress-api-key %s",
    values: [$__bookingpressApiKey]
  )
    @remove
 
  appointments: _sendJSONObjectCollectionHTTPRequest(
    input: {
      url: $__restBase,
      method: GET,
      options: {
        headers: [
          {
            name: "Authorization",
            value: $__authorizationHeader
          }
        ]
      }
    }
  )
}

Define BOOKINGPRESS_API_KEY en tu entorno (por ejemplo, en wp-config.php). La consulta lo lee mediante el campo _env de la extensión Constantes PHP y Variables de Entorno via Schema, y luego lo elimina (@remove) de la respuesta.

// En wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );

2. Cita única por ID

Para una sola cita, usa _sendJSONObjectItemHTTPRequest y construye la URL con el ID:

query GetBookingPressAppointment($appointmentId: ID!) {
  siteURL: optionValue(name: "siteurl")
    @remove
 
  restURL: _sprintf(
    string: "%s/wp-json/bookingpress/v1/appointments/%s",
    values: [$__siteURL, $appointmentId]
  )
    @remove
 
  bookingpressApiKey: _env(name: "BOOKINGPRESS_API_KEY")
    @remove
 
  authorizationHeader: _sprintf(
    string: "x-bookingpress-api-key %s",
    values: [$__bookingpressApiKey]
  )
    @remove
 
  appointment: _sendJSONObjectItemHTTPRequest(
    input: {
      url: $__restURL,
      method: GET,
      options: {
        headers: [
          {
            name: "Authorization",
            value: $__authorizationHeader
          }
        ]
      }
    }
  )
}

3. Extrayendo datos de la respuesta

Puedes extraer de la respuesta las propiedades específicas que necesites y usarlas en tu consulta.

Usa _underJSONObjectProperty para navegar hasta la propiedad desde el objeto de la respuesta, y @export para extraer el valor y ponerlo a disposición en la consulta.

query GetBookingPressAppointment($appointmentId: ID!) {
  # ...
  appointment: _sendJSONObjectItemHTTPRequest(
    input: {
      url: $__restURL,
      method: GET,
      options: {
        headers: [
          {
            name: "Authorization",
            value: $__authorizationHeader
          }
        ]
      }
    }
  )
    @underJSONObjectProperty(by: { path: "data.id" })
      @export(as: "appointmentId")
    @underJSONObjectProperty(by: { path: "data.selected_date" })
      @export(as: "selectedDate")
    @underJSONObjectProperty(by: { path: "data.start_time" })
      @export(as: "startTime")
    @underJSONObjectProperty(by: { path: "data.service_id" })
      @export(as: "serviceId")
    @underJSONObjectProperty(by: { path: "data.customer_id" })
      @export(as: "customerId")
}
 
query DoSomethingWithTheAppointment @depends(on: "GetBookingPressAppointment") {
{
  # Hacer algo con los datos de la cita
  appointmentId: _echo(value: $appointmentId)
  selectedDate: _echo(value: $selectedDate)
  startTime: _echo(value: $startTime)
  serviceId: _echo(value: $serviceId)
  customerId: _echo(value: $customerId)
}

El mismo patrón para otros plugins

Para cualquier plugin que exponga endpoints REST:

  1. Encuentra la URL base y la ruta (por ejemplo, en los documentos REST/API del plugin).
  2. Añade esa URL (o una expresión regular para ella) a la lista de permitidas del HTTP Client.
  3. Si la API requiere autenticación, usa options.headers (o options.auth para autenticación básica) en el input del campo _send*.
  4. Usa _sendJSONObjectItemHTTPRequest para un único recurso y _sendJSONObjectCollectionHTTPRequest para una lista.
  5. Extrae de la respuesta las propiedades específicas que necesites y úsalas en tu consulta.

Puedes combinar estos campos respaldados por REST con tipos nativos de GraphQL (entradas, usuarios, etc.) en una misma consulta, de modo que el cliente reciba una única respuesta que mezcla datos del núcleo de WordPress con datos del plugin obtenidos de su API REST.

Para más ejemplos de llamadas a REST y manejo de respuestas, consulta la documentación de la extensión HTTP Client y el tutorial sobre recuperar datos desde una API externa.


Suscríbete a nuestra newsletter

Mantente al tanto de todas las novedades de Gato GraphQL.