👨🏻🏫 InstaWP'den Mailchimp'e bülten abonelerini otomatik olarak gönderen GraphQL query
(Bu query'nin bağlamını görmek için 🚀 InstaWP'den Mailchimp'e bülten abonelerini otomatik olarak gönderme blog yazısını okuyun.)
Bu GraphQL query, InstaWP'de "Subscribe to mailing list" onay kutusunu işaretleyen ziyaretçilerin (yeni bir sandbox sitesi oluştururken) e-postasını yakalar ve bu e-postayı bir Mailchimp listesine kaydeder:
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"
}
}
})
}Alternatif olarak, aboneleri WordPress bülten eklentinize de kaydedebilirsiniz (ör: Noptin veya başka bir eklenti).
Bu GraphQL query'nin nasıl çalıştığına bakalım.
GraphQL query'yi bağımsız birimlere bölmek
Bir GraphQL belgesi birden fazla işlem (queries ve mutations) içerebilir; ancak bunlardan yalnızca biri çalıştırılır. Hangisinin çalıştırılacağını GraphQL uç noktasındaki ?operationName=... parametresiyle belirtiriz; aksi takdirde son işlem çalıştırılır.
Yukarıdaki belgede 2 adet query işlemi bulunduğuna dikkat edin:
HasSubscribedToNewsletterMaybeCreateContactOnMailchimp
Webhook URL'si ?operationName=MaybeCreateContactOnMailchimp içerir, dolayısıyla çalıştırılacak işlem budur.
Multiple Query Execution uzantısı sayesinde, MaybeCreateContactOnMailchimp, @depends yönergesiyle belirtildiği üzere önce HasSubscribedToNewsletter işlemini çalıştırır:
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
# ...
{
#
}Bunun yanı sıra, MaybeCreateContactOnMailchimp yalnızca $subscribedToNewsletter değişkeninin değeri true olduğunda koşullu olarak çalıştırılır:
query MaybeCreateContactOnMailchimp
@depends(on: "HasSubscribedToNewsletter")
@include(if: $subscribedToNewsletter)
{
#
}$subscribedToNewsletter, HasSubscribedToNewsletter işlemi içinde dışa aktarılan bir dinamik değişkendir:
query HasSubscribedToNewsletter {
# ...
subscribedToNewsletter: _and(values: [$__hasSubscriberOptIn, $__isNotSubscriberOptInNAValue])
@export(as: "subscribedToNewsletter")
}Dolayısıyla, MaybeCreateContactOnMailchimp işlemi yalnızca kullanıcı "Subscribe to mailing list" onay kutusunu işaretlediğinde çalıştırılır.
Kullanıcının onay kutusunu işaretleyip işaretlemediğini hesaplamak
InstaWP'nin webhook belgesi, yük verisinin (diğerlerinin yanı sıra) şu alanları içerdiğini belirtir:
marketing_optin: Kullanıcının onay kutusunu işaretleyip işaretlemediğini gösteriremail: Ziyaretçinin e-postası
Belgede yalnızca marketing_optin alanının onay kutusu işaretlenmediğinde NA değerini aldığı açıklanmaktadır; dolayısıyla bununla çalışmamız gerekecektir.
Kullanıcının onay kutusunu işaretleyip işaretlemediğini anlamak için mantık şöyledir:
marketing_optinalanının mevcut olup olmadığını kontrol edin ve- Değerinin
NAolmadığını kontrol edin
Bu işlem HasSubscribedToNewsletter işleminde hesaplanır. Aşağıda query'nin her satırının ne yaptığını açıklayan yorumlarla birlikte verilmiştir:
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")
}Bu query'de dikkat çeken birkaç ilginç nokta var.
Global Alanlar
_ ile başlayan alanlara dikkat ettiniz mi? Yani:
_httpRequestHasParam_httpRequestStringParam_notEquals_and
Bunlar global alanlardır; GraphQL şemasındaki tüm türlerin altında kullanılabilen alanlardır. Global alanlar veri yerine işlevsellik sunar ve kural olarak _ ile başlar.
Field to Input
$__ ile başlayan değişkenlere dikkat ettiniz mi? Yani:
$__subscriberOptIn$__hasSubscriberOptIn$__isNotSubscriberOptInNAValue
Bunlar, aynı işlem içinde kendilerinden önce tanımlanan bir alanın değerini içeren dinamik değişkenlerdir. Örneğin $__subscriberOptIn değişkeni, onun üstünde tanımlanan subscriberOptIn alanının değerini içerir.
Bu özellik, bir alanın çıktısını başka bir alana girdi olarak kullanmaya olanak tanıyan Field to Input uzantısı tarafından sağlanır. GraphQL query içinde işlevsellik bu şekilde oluşturulur.
Query'de isNotSubscriberOptInNAValue alanı, daha önce sorgulanan subscriberOptIn alanının değerinin "NA" olmadığını kontrol eder; subscribedToNewsletter ise hasSubscriberOptIn ve isNotSubscriberOptInNAValue alanlarının değerlerini kapsayan bir AND işlemi hesaplar.
Mailchimp'e bağlanmak
MaybeCreateContactOnMailchimp işlemi, yük verisini çıkarmak ve e-postayı bülten listesine kaydetmek için Mailchimp API'sini çağırma mantığını içerir.
Aşağıda her satırın ne yaptığını açıklayan yorumlarla birlikte işlem verilmiştir:
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"
}
}
})
}Bu query'de kullanılan özellikleri inceleyelim.
Ortam Değişkenleri
Mailchimp API'sine bağlanırken kimlik bilgilerimizi sağlamamız gerekir. Ancak bunları doğrudan GraphQL query'ye girmek istemeyiz; zira bir yerlerde sızabilirler (ör: bazı günlüklerde yazdırılabilirler).
Bu nedenle, bir ortam değişkeni veya PHP sabiti okumak için _env global alanını (PHP Constants and Environment via Schema uzantısı tarafından sağlanır) ve kimlik bilgilerinin yanıtta yazdırılmasını engellemek için @remove yönergesini (Field Response Removal uzantısı tarafından sağlanır) birlikte kullanırız.
Artık kimlik bilgilerimizi wp-config.php dosyasında tanımlayabiliriz:
define( 'MAILCHIMP_API_CREDENTIALS_USERNAME', '{ username }' );
define( 'MAILCHIMP_API_CREDENTIALS_PASSWORD', '{ password }' );Mailchimp'e HTTP isteği göndermek
Mantığın son parçası, bir servise HTTP isteği gönderen _sendJSONObjectItemHTTPRequest alanıdır.
Mailchimp API'sine bağlanmak istediğimizden, mailchimpListMembersJSONObject alanı, bir üyeyi Mailchimp listesine abone etmek için belgelerinde belirtildiği üzere Mailchimp'in REST API uç noktasının gerektirdiği verileri sağlar:
- Bir
POSTisteği gönderin - Uç nokta:
https://{subdomain}.api.mailchimp.com/3.0/lists/{listCode}/members - Gövde,
email_addressvestatusalanlarını içermelidir
Herhangi bir API ile etkileşim için webhook oluşturmak
Bu yazıdaki GraphQL query, verileri InstaWP'den Mailchimp'e iletir.
İhtiyaç duyduğunuz her kombinasyon için aynı fikri uygulayabilirsiniz: verileri bir kaynak servisten (hangisi olursa olsun) çıkarın, uyarlayın ve bir hedef servise (hangisi olursa olsun) gönderin.
İyi eğlenceler!