Blog

🔌 WordPress Eklentilerinden REST API Verilerine Erişim

Leonardo Losoviz
Yazan: Leonardo Losoviz ·

Pek çok WordPress eklentisi verileri REST API aracılığıyla sunar ancak bir GraphQL katmanı sağlamaz. Gato GraphQL ile yine de bu verileri tek bir GraphQL isteğinde kullanabilirsiniz: HTTP Client uzantısı, herhangi bir REST endpoint'ini çağırmanıza ve JSON yanıtıyla doğrudan queries'inizde çalışmanıza olanak tanır.

Dolayısıyla bir eklentinin GraphQL entegrasyonu olmadığında çıkmaza girmezsiniz; REST API'sini GraphQL'den sorgular ve her şeyi tek bir yerde tutarsınız.

Bu yazı bunu nasıl yapacağınızı göstermektedir. Aynı kalıp, REST endpoint'leri sunan herhangi bir eklenti için geçerlidir.

Ön Koşullar

  1. HTTP Client uzantısının yüklü olduğundan emin olun (Gato GraphQL Power uzantıları ve paketlerinde yer almaktadır).
  2. Eklentinin REST tabanına izin verilmesi için İzin Verilen URL'leri yapılandırın. Aynı sitedeki istekler için site URL'nize izin verin (ör. #https://siteniz.com/wp-json/.*# veya tam REST tabanınız). Bkz. HTTP isteklerine izin verilen URL'leri yapılandırma.

Eklentinin API'si yetkilendirme gerektiriyorsa, yetkilendirme token'ı oluşturmanız ve onu isteğe eklemeniz gerekecektir (ör. header'lar aracılığıyla).

Örnek: Randevu Rezervasyon Verilerini Alma

BookingPress, randevu verilerini almak için REST API endpoint'leri sunan bir randevu rezervasyon eklentisidir. Bu nedenle, söz konusu endpoint'leri GraphQL'den çağırabilir ve randevu verilerini alabiliriz.

BookingPress REST API belgelerine bakıldığında, mevcut endpoint tabanının wp-json/bookingpress/v1 olduğu görülmektedir.

1. Randevuları Listeleme (Koleksiyon)

API bir liste döndürdüğünde (ör. randevu dizisi) _sendJSONObjectCollectionHTTPRequest kullanın. API listeyi bir nesneye sarıyorsa (ör. { "data": [ ... ] }), _sendJSONObjectItemHTTPRequest kullanmanız ve ardından sonuçtan data özelliğini okumanız gerekebilir.

Aynı query'nin her ortamda çalışması için optionValue(name: "home") ile sitenizin ana URL'sinden URL'yi oluşturun:

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
          }
        ]
      }
    }
  )
}

BOOKINGPRESS_API_KEY'i ortamınızda tanımlayın (ör. wp-config.php içinde). Query, bunu PHP Constants and Environment Variables uzantısının _env alanı aracılığıyla okur ve ardından @remove ile yanıttan kaldırır.

// In wp-config.php
define( 'BOOKINGPRESS_API_KEY', 'your-secret-key' );

2. ID'ye Göre Tek Randevu

Tek bir randevu için _sendJSONObjectItemHTTPRequest kullanın ve URL'yi ID ile oluşturun:

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. Yanıttan Veri Çıkarma

Yanıttan ihtiyacınız olan belirli özellikleri çıkarabilir ve bunları query'nizde kullanabilirsiniz.

Yanıt nesnesindeki özelliğe gitmek için _underJSONObjectProperty, değeri çıkarıp query'de kullanılabilir hale getirmek için @export kullanın.

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") {
{
  # Randevu verileriyle bir şeyler yapın
  appointmentId: _echo(value: $appointmentId)
  selectedDate: _echo(value: $selectedDate)
  startTime: _echo(value: $startTime)
  serviceId: _echo(value: $serviceId)
  customerId: _echo(value: $customerId)
}

Diğer Eklentiler için Aynı Kalıp

REST endpoint'leri sunan herhangi bir eklenti için:

  1. Temel URL'yi ve yolu bulun (ör. eklentinin REST/API belgelerinden).
  2. Bu URL'yi (veya bunun için bir regex ifadesini) HTTP Client'ın izin verilen listesine ekleyin.
  3. API kimlik doğrulaması gerektiriyorsa, _send* alanına verilen input'ta options.headers (veya basic auth için options.auth) kullanın.
  4. Tek bir kaynak için _sendJSONObjectItemHTTPRequest, liste için _sendJSONObjectCollectionHTTPRequest kullanın.
  5. Yanıttan ihtiyacınız olan belirli özellikleri çıkarın ve query'nizde kullanın.

Bu REST destekli alanları yerel GraphQL türleriyle (yazılar, kullanıcılar vb.) tek bir query'de birleştirebilirsiniz; böylece istemci, WordPress çekirdek verilerini ve eklenti verilerini REST API'sinden harmanlayan tek bir yanıt alır.

REST çağrıları ve yanıt işlemeye ilişkin daha fazla örnek için HTTP Client uzantısı belgelerine ve harici bir API'den veri alma eğitimine bakın.


Bültenimize abone olun

Gato GraphQL'deki tüm güncellemelerden haberdar olun.