Blog

🔌 Acessando dados da API REST de plugins WordPress

Leonardo Losoviz
Por Leonardo Losoviz ·

Muitos plugins WordPress expõem dados por meio da API REST, mas não fornecem uma camada GraphQL. Com o Gato GraphQL você ainda pode usar esses dados em uma única requisição GraphQL: a extensão HTTP Client permite chamar qualquer endpoint REST e trabalhar com a resposta JSON diretamente na sua query.

Portanto, quando um plugin não tem integração GraphQL, você não está bloqueado — você consulta a API REST dele a partir do GraphQL e mantém tudo em um só lugar.

Este artigo mostra como fazer isso. O mesmo padrão funciona para qualquer plugin que exponha endpoints REST.

Pré-requisitos

  1. Certifique-se de que a extensão HTTP Client está instalada (incluída nas extensões Power do Gato GraphQL e nos bundles).
  2. Configure as URLs permitidas para que a base REST do plugin seja autorizada. Para requisições ao mesmo site, autorize a URL do seu site (por exemplo, #https://seusite.com/wp-json/.*# ou sua base REST exata). Veja configurar quais URLs podem receber requisições HTTP.

Se a API do plugin exigir autorização, você precisará criar o token de autorização e passá-lo na requisição (por exemplo, via headers).

Exemplo: Recuperando dados de agendamento de consultas

BookingPress é um plugin de agendamento de consultas que oferece endpoints de API REST para recuperar dados de agendamentos. Dessa forma, podemos chamar esses endpoints a partir do GraphQL e recuperar os dados de agendamento.

Consultando a documentação da API REST do BookingPress, vemos que a base do endpoint atual é wp-json/bookingpress/v1.

1. Listar agendamentos (coleção)

Use _sendJSONObjectCollectionHTTPRequest quando a API retorna uma lista de itens (por exemplo, um array de agendamentos). Se a API envolver a lista em um objeto (por exemplo, { "data": [ ... ] }), talvez seja necessário usar _sendJSONObjectItemHTTPRequest e depois ler a propriedade data do resultado.

Construa a URL a partir da URL home do seu site usando optionValue(name: "home") para que a mesma query funcione em qualquer ambiente:

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
          }
        ]
      }
    }
  )
}

Defina BOOKINGPRESS_API_KEY no seu ambiente (por exemplo, em wp-config.php). A query o lê por meio do campo _env da extensão Constantes PHP e Variáveis de Ambiente via Schema, e depois o remove (@remove) da resposta.

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

2. Agendamento único por ID

Para um único agendamento, use _sendJSONObjectItemHTTPRequest e construa a URL com o 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. Extraindo dados da resposta

Você pode extrair da resposta as propriedades específicas de que precisa e usá-las na sua query.

Use _underJSONObjectProperty para navegar até a propriedade no objeto de resposta, e @export para extrair o valor e disponibilizá-lo na query.

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") {
{
  # Faça algo com os dados do agendamento
  appointmentId: _echo(value: $appointmentId)
  selectedDate: _echo(value: $selectedDate)
  startTime: _echo(value: $startTime)
  serviceId: _echo(value: $serviceId)
  customerId: _echo(value: $customerId)
}

O mesmo padrão para outros plugins

Para qualquer plugin que exponha endpoints REST:

  1. Encontre a URL base e o caminho (por exemplo, na documentação REST/API do plugin).
  2. Adicione essa URL (ou uma expressão regular para ela) à lista de URLs permitidas do HTTP Client.
  3. Se a API exigir autenticação, use options.headers (ou options.auth para autenticação basic) no input do campo _send*.
  4. Use _sendJSONObjectItemHTTPRequest para um único recurso e _sendJSONObjectCollectionHTTPRequest para uma lista.
  5. Extraia da resposta as propriedades específicas de que precisa e use-as na sua query.

Você pode combinar esses campos alimentados por REST com tipos GraphQL nativos (posts, usuários, etc.) em uma única query, de modo que o cliente receba uma resposta única misturando dados do core do WordPress e dados do plugin provenientes da sua API REST.

Para mais exemplos de chamadas REST e tratamento de respostas, consulte a documentação da extensão HTTP Client e o tutorial sobre recuperar dados de uma API externa.


Assine nossa newsletter

Fique por dentro de todas as atualizações do Gato GraphQL.