đšđ»âđ« RequĂȘte GraphQL pour envoyer automatiquement les abonnĂ©s Ă la newsletter d'InstaWP Ă Mailchimp
(Lisez l'article de blog đ Envoi automatique des abonnĂ©s Ă la newsletter d'InstaWP Ă Mailchimp pour voir le contexte de cette requĂȘte.)
Cette requĂȘte GraphQL capture l'e-mail des visiteurs qui ont cochĂ© la case « Subscribe to mailing list » dans InstaWP (lors de la crĂ©ation d'un nouveau site sandbox), et abonne cet e-mail Ă une liste Mailchimp :
query HasSubscribedToNewsletter {
hasSubscriberOptIn: _httpRequestHasParam(name: "marketing_optin")
subscriberOptIn: _httpRequestStringParam(name: "marketing_optin")
isNotSubscriberOptInNAValue: _notEquals(value1: $__subscriberOptIn, value2: "NA")
subscribedToNewsletter: _and(values: [$__hasSubscriberOptIn, $__isNotSubscriberOptInNAValue])
@export(as: "subscribedToNewsletter")
}
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
@include(if: $subscribedToNewsletter)
{
subscriberEmail: _httpRequestStringParam(name: "email")
mailchimpUsername: _env(name: "MAILCHIMP_API_CREDENTIALS_USERNAME")
@remove
mailchimpPassword: _env(name: "MAILCHIMP_API_CREDENTIALS_PASSWORD")
@remove
mailchimpListMembersJSONObject: _sendJSONObjectItemHTTPRequest(input: {
url: "https://us7.api.mailchimp.com/3.0/lists/{listCode}/members",
method: POST,
options: {
auth: {
username: $__mailchimpUsername,
password: $__mailchimpPassword
},
json: {
email_address: $__subscriberEmail,
status: "subscribed"
}
}
})
}Vous pouvez également enregistrer les abonnés dans votre plugin de newsletter WordPress (ex : Noptin ou un autre).
Voyons comment cette requĂȘte GraphQL fait sa magie.
Diviser la requĂȘte GraphQL en unitĂ©s indĂ©pendantes
Un document GraphQL peut contenir plusieurs opĂ©rations (requĂȘtes et mutations), mais une seule d'entre elles sera exĂ©cutĂ©e. Nous indiquons laquelle via le paramĂštre ?operationName=... sur l'endpoint GraphQL ; sinon, la derniĂšre opĂ©ration sera exĂ©cutĂ©e.
Remarquez qu'il y a 2 opérations query dans le document ci-dessus :
HasSubscribedToNewsletterMaybeCreateContactOnMailchimp
L'URL du webhook contient ?operationName=MaybeCreateContactOnMailchimp, donc c'est l'opération qui sera exécutée.
GrĂące Ă l'extension ExĂ©cution de multiples requĂȘtes, MaybeCreateContactOnMailchimp exĂ©cutera d'abord HasSubscribedToNewsletter, comme indiquĂ© via la directive @depends :
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
# ...
{
#
}De plus, MaybeCreateContactOnMailchimp sera exécutée conditionnellement, seulement si la valeur de la variable $subscribedToNewsletter est true :
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
@include(if: $subscribedToNewsletter)
{
#
}$subscribedToNewsletter est une variable dynamique, exportée dans l'opération HasSubscribedToNewsletter :
query HasSubscribedToNewsletter {
# ...
subscribedToNewsletter: _and(values: [$__hasSubscriberOptIn, $__isNotSubscriberOptInNAValue])
@export(as: "subscribedToNewsletter")
}Ainsi, l'opération MaybeCreateContactOnMailchimp ne sera exécutée que lorsque l'utilisateur a coché la case « Subscribe to mailing list ».
Calculer si l'utilisateur a coché la case
La documentation du webhook d'InstaWP indique que les données du payload contiennent les champs suivants (entre autres) :
marketing_optin: Indique si l'utilisateur a coché la caseemail: E-mail du visiteur
La documentation explique seulement que le champ marketing_optin a la valeur NA lorsque la case n'est pas cochée, donc nous devrons travailler avec cela.
Pour savoir si l'utilisateur a coché la case, la logique est :
- Vérifier si le champ
marketing_optinest présent, et - Vérifier que sa valeur n'est pas
NA
Cela est calculĂ© dans l'opĂ©ration HasSubscribedToNewsletter. La voici avec des commentaires, expliquant ce que fait chaque ligne de la requĂȘte :
query HasSubscribedToNewsletter {
# Check if field `marketing_optin` is present
hasSubscriberOptIn: _httpRequestHasParam(name: "marketing_optin")
# Get the value of field `marketing_optin`
subscriberOptIn: _httpRequestStringParam(name: "marketing_optin")
# Check if the value of the field is not "NA"
isNotSubscriberOptInNAValue: _notEquals(value1: $__subscriberOptIn, value2: "NA")
# Perform an AND operation: field present && value != "NA"
subscribedToNewsletter: _and(values: [$__hasSubscriberOptIn, $__isNotSubscriberOptInNAValue])
# Export the result under dynamic variable $subscribedToNewsletter
@export(as: "subscribedToNewsletter")
}Il y a plusieurs choses intĂ©ressantes dans cette requĂȘte.
Champs globaux
Avez-vous remarqué les champs commençant par _ ? à savoir :
_httpRequestHasParam_httpRequestStringParam_notEquals_and
Ce sont des champs globaux, qui sont des champs disponibles sous tous les types dans le schéma GraphQL. Les champs globaux offrent des fonctionnalités plutÎt que des données, et par convention ils commencent par _.
Field to Input
Avez-vous remarqué ces variables commençant par $__ ? à savoir :
$__subscriberOptIn$__hasSubscriberOptIn$__isNotSubscriberOptInNAValue
Ce sont des variables dynamiques qui contiennent la valeur d'un champ dĂ©fini avant elles dans la mĂȘme opĂ©ration. Par exemple, la variable $__subscriberOptIn contient la valeur du champ subscriberOptIn dĂ©clarĂ© au-dessus d'elle.
C'est une fonctionnalitĂ© fournie par l'extension Field to Input, qui permet d'utiliser la sortie d'un champ comme entrĂ©e dans un autre champ. C'est ainsi que nous pouvons crĂ©er des fonctionnalitĂ©s dans la requĂȘte GraphQL.
Dans la requĂȘte, le champ isNotSubscriberOptInNAValue vĂ©rifie que la valeur du champ prĂ©cĂ©demment interrogĂ© subscriberOptIn n'est pas Ă©gale Ă "NA", et subscribedToNewsletter calcule une opĂ©ration AND impliquant les valeurs des champs hasSubscriberOptIn et isNotSubscriberOptInNAValue.
Se connecter Ă Mailchimp
L'opération MaybeCreateContactOnMailchimp contient la logique pour extraire les données du payload, et appeler l'API Mailchimp pour inscrire l'e-mail à la liste de newsletter.
Voici l'opération avec des commentaires, expliquant ce que fait chaque ligne :
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
@include(if: $subscribedToNewsletter)
{
# Extract form field `email` from the body of the request
subscriberEmail: _httpRequestStringParam(name: "email")
# Obtain Mailchimp credentials, defined in wp-config.php
mailchimpUsername: _env(name: "MAILCHIMP_API_CREDENTIALS_USERNAME")
# Do not print the credentials in the response
@remove
mailchimpPassword: _env(name: "MAILCHIMP_API_CREDENTIALS_PASSWORD")
@remove
# Connect to Mailchimp to add a new member to the list
mailchimpListMembersJSONObject: _sendJSONObjectItemHTTPRequest(input: {
url: "https://us7.api.mailchimp.com/3.0/lists/{listCode}/members",
method: POST,
options: {
# Provide credentials to connect to the API
auth: {
username: $__mailchimpUsername,
password: $__mailchimpPassword
},
# Provide form data
json: {
email_address: $__subscriberEmail,
status: "subscribed"
}
}
})
}Explorons les fonctionnalitĂ©s utilisĂ©es dans cette requĂȘte.
Variables d'environnement
Nous devons fournir nos identifiants lors de la connexion Ă l'API Mailchimp. Cependant, nous ne voulons pas les saisir directement dans la requĂȘte GraphQL, car ils pourraient fuiter quelque part (ex : ils pourraient ĂȘtre imprimĂ©s dans un log).
C'est pourquoi nous utilisons le champ global _env (fourni par l'extension Constantes PHP et Variables d'Environnement via le Schéma) pour lire une variable d'environnement ou une constante PHP, ainsi que la directive @remove (fournie par l'extension Suppression de la Réponse d'un Champ) pour éviter d'imprimer les identifiants dans la réponse.
Maintenant, nous pouvons déclarer nos identifiants dans wp-config.php :
define( 'MAILCHIMP_API_CREDENTIALS_USERNAME', '{ username }' );
define( 'MAILCHIMP_API_CREDENTIALS_PASSWORD', '{ password }' );Envoi de la requĂȘte HTTP Ă Mailchimp
Le dernier Ă©lĂ©ment de la logique est le champ _sendJSONObjectItemHTTPRequest, qui envoie une requĂȘte HTTP Ă un service.
Comme nous voulons nous connecter à l'API Mailchimp, le champ mailchimpListMembersJSONObject fournit les données requises par l'endpoint de la REST API de Mailchimp, comme indiqué dans la documentation pour souscrire un membre à une liste Mailchimp :
- Envoyer une requĂȘte
POST - L'endpoint est
https://{subdomain}.api.mailchimp.com/3.0/lists/{listCode}/members - Le corps doit inclure les champs
email_addressetstatus
Créer un webhook pour interagir avec n'importe quelle API
La requĂȘte GraphQL de cet article transfĂšre les donnĂ©es d'InstaWP Ă Mailchimp.
Vous pouvez appliquer la mĂȘme idĂ©e pour n'importe quelle combinaison dont vous avez besoin, en extrayant les donnĂ©es d'un service source (quel qu'il soit), en les adaptant, et en les envoyant Ă un service de destination (quel qu'il soit).
Amusez-vous bien !