🔌 Acessando dados da API REST de plugins WordPress
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
- Certifique-se de que a extensão HTTP Client está instalada (incluída nas extensões Power do Gato GraphQL e nos bundles).
- 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:
- Encontre a URL base e o caminho (por exemplo, na documentação REST/API do plugin).
- Adicione essa URL (ou uma expressão regular para ela) à lista de URLs permitidas do HTTP Client.
- Se a API exigir autenticação, use
options.headers(ouoptions.authpara autenticação basic) noinputdo campo_send*. - Use
_sendJSONObjectItemHTTPRequestpara um único recurso e_sendJSONObjectCollectionHTTPRequestpara uma lista. - 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.