🔌 Accéder aux données de l'API REST depuis les plugins WordPress
De nombreux plugins WordPress exposent des données via l'API REST mais ne fournissent pas de couche GraphQL. Avec Gato GraphQL, vous pouvez quand même utiliser ces données dans une seule requête GraphQL : l'extension HTTP Client vous permet d'appeler n'importe quel endpoint REST et de travailler avec la réponse JSON directement dans votre requête.
Ainsi, quand un plugin n'a pas d'intégration GraphQL, vous n'êtes pas bloqué — vous interrogez son API REST depuis GraphQL et gardez tout au même endroit.
Cet article montre comment faire. Le même schéma fonctionne pour tout plugin qui expose des endpoints REST.
Prérequis
- Assurez-vous que l'extension HTTP Client est installée (incluse dans les extensions Power de Gato GraphQL et les bundles).
- Configurez les URLs autorisées pour que la base REST du plugin soit autorisée. Pour les requêtes vers le même site, autorisez l'URL de votre site (par exemple,
#https://votresite.com/wp-json/.*#ou votre base REST exacte). Consultez configurer quelles URLs peuvent faire l'objet de requêtes HTTP.
Si l'API du plugin nécessite une autorisation, vous devrez créer le jeton d'autorisation et le transmettre dans la requête (par exemple via des en-têtes).
Exemple : Récupérer des données de réservation de rendez-vous
BookingPress est un plugin de réservation de rendez-vous qui propose des endpoints d'API REST pour récupérer des données de rendez-vous. Nous pouvons donc appeler ces endpoints depuis GraphQL et récupérer les données de rendez-vous.
En consultant la documentation de l'API REST de BookingPress, on constate que la base de l'endpoint actuelle est wp-json/bookingpress/v1.
1. Lister les rendez-vous (collection)
Utilisez _sendJSONObjectCollectionHTTPRequest lorsque l'API retourne une liste d'éléments (par exemple, un tableau de rendez-vous). Si l'API encapsule la liste dans un objet (par exemple, { "data": [ ... ] }), vous devrez peut-être utiliser _sendJSONObjectItemHTTPRequest puis lire la propriété data du résultat.
Construisez l'URL à partir de l'URL d'accueil de votre site en utilisant optionValue(name: "home") pour que la même requête fonctionne dans n'importe quel environnement :
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
}
]
}
}
)
}Définissez BOOKINGPRESS_API_KEY dans votre environnement (par exemple dans wp-config.php). La requête le lit via le champ _env de l'extension Constantes PHP et Variables d'Environnement via le Schéma, puis le supprime (@remove) de la réponse.
// Dans wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );2. Rendez-vous unique par ID
Pour un seul rendez-vous, utilisez _sendJSONObjectItemHTTPRequest et construisez l'URL avec l'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. Extraire des données de la réponse
Vous pouvez extraire les propriétés spécifiques de la réponse dont vous avez besoin et les utiliser dans votre requête.
Utilisez _underJSONObjectProperty pour naviguer jusqu'à la propriété depuis l'objet de réponse, et @export pour extraire la valeur et la rendre disponible dans la requête.
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") {
{
# Faire quelque chose avec les données du rendez-vous
appointmentId: _echo(value: $appointmentId)
selectedDate: _echo(value: $selectedDate)
startTime: _echo(value: $startTime)
serviceId: _echo(value: $serviceId)
customerId: _echo(value: $customerId)
}Le même schéma pour d'autres plugins
Pour tout plugin qui expose des endpoints REST :
- Trouvez l'URL de base et le chemin (par exemple dans la documentation REST/API du plugin).
- Ajoutez cette URL (ou une expression régulière pour celle-ci) à la liste autorisée du HTTP Client.
- Si l'API nécessite une authentification, utilisez
options.headers(ouoptions.authpour l'authentification basique) dans l'inputdu champ_send*. - Utilisez
_sendJSONObjectItemHTTPRequestpour une ressource unique et_sendJSONObjectCollectionHTTPRequestpour une liste. - Extrayez les propriétés spécifiques de la réponse dont vous avez besoin et utilisez-les dans votre requête.
Vous pouvez combiner ces champs alimentés par REST avec des types GraphQL natifs (posts, utilisateurs, etc.) dans une même requête, afin que le client reçoive une seule réponse mélangeant des données du cœur de WordPress et des données du plugin issues de son API REST.
Pour plus d'exemples d'appels REST et de gestion des réponses, consultez la documentation de l'extension HTTP Client et le tutoriel sur la récupération de données depuis une API externe.