๐จ๐ปโ๐ซ Query GraphQL untuk secara otomatis mengirim pelanggan newsletter dari InstaWP ke Mailchimp
(Baca posting blog ๐ Mengirim pelanggan newsletter dari InstaWP ke Mailchimp secara otomatis untuk melihat konteks dari query ini.)
Query GraphQL ini menangkap email dari pengunjung yang mencentang kotak "Subscribe to mailing list" dari InstaWP (saat membuat sandbox baru), dan mendaftarkan email tersebut ke daftar 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"
}
}
})
}Sebagai alternatif, Anda juga dapat mendaftarkan pelanggan di plugin newsletter WordPress Anda (misalnya: Noptin atau lainnya).
Mari kita lihat bagaimana query GraphQL ini bekerja.
Memecah query GraphQL menjadi unit-unit independen
Sebuah dokumen GraphQL dapat berisi beberapa operasi (queries dan mutations), tetapi hanya satu yang akan dieksekusi. Kita menunjukkan operasi mana yang dieksekusi melalui parameter ?operationName=... pada endpoint GraphQL; jika tidak, operasi terakhir yang akan dieksekusi.
Perhatikan bahwa ada 2 operasi query dalam dokumen di atas:
HasSubscribedToNewsletterMaybeCreateContactOnMailchimp
URL webhook mengandung ?operationName=MaybeCreateContactOnMailchimp, sehingga itulah operasi yang akan dieksekusi.
Berkat ekstensi Multiple Query Execution, MaybeCreateContactOnMailchimp akan terlebih dahulu mengeksekusi HasSubscribedToNewsletter, seperti yang ditunjukkan melalui direktif @depends:
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
# ...
{
#
}Selain itu, MaybeCreateContactOnMailchimp akan dieksekusi secara kondisional, hanya jika nilai variabel $subscribedToNewsletter adalah true:
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
@include(if: $subscribedToNewsletter)
{
#
}$subscribedToNewsletter adalah sebuah variabel dinamis, yang diekspor dalam operasi HasSubscribedToNewsletter:
query HasSubscribedToNewsletter {
# ...
subscribedToNewsletter: _and(values: [$__hasSubscriberOptIn, $__isNotSubscriberOptInNAValue])
@export(as: "subscribedToNewsletter")
}Oleh karena itu, operasi MaybeCreateContactOnMailchimp hanya akan dieksekusi ketika pengguna telah mencentang kotak "Subscribe to mailing list".
Menghitung apakah pengguna mencentang kotak
Dokumentasi webhook InstaWP menunjukkan bahwa data payload mengandung field-field berikut (di antara lainnya):
marketing_optin: Menunjukkan apakah pengguna mencentang kotakemail: Email pengunjung
Dokumentasi hanya menjelaskan bahwa field marketing_optin bernilai NA ketika kotak tidak dicentang, sehingga kita harus bekerja dengan itu.
Untuk mengetahui apakah pengguna mencentang kotak, logikanya adalah:
- Periksa apakah field
marketing_optinhadir, dan - Periksa bahwa nilainya bukan
NA
Ini dihitung dalam operasi HasSubscribedToNewsletter. Berikut adalah operasinya beserta komentar, yang menjelaskan apa yang dilakukan setiap baris dalam query:
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")
}Ada beberapa hal menarik dalam query ini.
Global Fields
Apakah Anda memperhatikan field-field yang dimulai dengan _? Yaitu:
_httpRequestHasParam_httpRequestStringParam_notEquals_and
Ini adalah global fields, yaitu field yang tersedia di semua tipe dalam skema GraphQL. Global fields menawarkan fungsionalitas alih-alih data, dan sesuai konvensi dimulai dengan _.
Field to Input
Apakah Anda memperhatikan variabel-variabel yang dimulai dengan $__? Yaitu:
$__subscriberOptIn$__hasSubscriberOptIn$__isNotSubscriberOptInNAValue
Ini adalah variabel dinamis yang mengandung nilai field yang didefinisikan sebelumnya dalam operasi yang sama. Misalnya, variabel $__subscriberOptIn mengandung nilai field subscriberOptIn yang dideklarasikan di atasnya.
Ini adalah fitur yang disediakan oleh ekstensi Field to Input, yang memungkinkan penggunaan output sebuah field sebagai input ke field lain. Inilah cara kita dapat menciptakan fungsionalitas di dalam query GraphQL.
Dalam query, field isNotSubscriberOptInNAValue memeriksa bahwa nilai field subscriberOptIn yang di-query sebelumnya tidak sama dengan "NA", dan subscribedToNewsletter menghitung operasi AND yang melibatkan nilai field hasSubscriberOptIn dan isNotSubscriberOptInNAValue.
Terhubung ke Mailchimp
Operasi MaybeCreateContactOnMailchimp mengandung logika untuk mengekstrak data payload, dan memanggil API Mailchimp untuk mendaftarkan email ke daftar newsletter.
Berikut adalah operasinya beserta komentar, yang menjelaskan apa yang dilakukan setiap baris:
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"
}
}
})
}Mari kita jelajahi fitur-fitur yang digunakan dalam query ini.
Variabel Lingkungan
Kita perlu menyediakan kredensial saat terhubung ke API Mailchimp. Namun, kita tidak ingin langsung memasukkannya ke dalam query GraphQL, karena bisa bocor di suatu tempat (misalnya: bisa tercetak dalam suatu log).
Itulah mengapa kita menggunakan global field _env (disediakan oleh ekstensi PHP Constants and Environment via Schema) untuk membaca variabel lingkungan atau konstanta PHP, bersama dengan direktif @remove (disediakan oleh ekstensi Field Response Removal) untuk melewati pencetakan kredensial dalam respons.
Sekarang, kita dapat mendeklarasikan kredensial kita di wp-config.php:
define( 'MAILCHIMP_API_CREDENTIALS_USERNAME', '{ username }' );
define( 'MAILCHIMP_API_CREDENTIALS_PASSWORD', '{ password }' );Mengirim permintaan HTTP ke Mailchimp
Bagian terakhir dari logika adalah field _sendJSONObjectItemHTTPRequest, yang mengirim permintaan HTTP ke suatu layanan.
Karena kita ingin terhubung ke API Mailchimp, field mailchimpListMembersJSONObject menyediakan data yang dibutuhkan oleh endpoint REST API Mailchimp, seperti yang ditunjukkan dalam dokumentasi untuk mendaftarkan anggota ke daftar Mailchimp:
- Kirim permintaan
POST - Endpointnya adalah
https://{subdomain}.api.mailchimp.com/3.0/lists/{listCode}/members - Body harus menyertakan field
email_addressdanstatus
Membuat webhook untuk berinteraksi dengan API apa pun
Query GraphQL dalam posting ini meneruskan data dari InstaWP ke Mailchimp.
Anda dapat menerapkan ide yang sama untuk kombinasi apa pun yang Anda butuhkan, mengekstrak data dari layanan sumber (apa pun itu), mengadaptasinya, dan mengirimkannya ke layanan tujuan (apa pun itu).
Selamat berkreasi!