Samouczek schematu
Samouczek schematuLekcja 2: Odpytywanie danych dynamicznych

Lekcja 2: Odpytywanie danych dynamicznych

Gato GraphQL może jeszcze bardziej rozszerzyć możliwości WordPressa w zakresie wyszukiwania danych poprzez użycie pól „funkcji" (odrębny typ pola, który dostarcza funkcjonalność zamiast danych), umożliwiając nam dynamiczne obliczanie danych, przekazywanie ich z powrotem do query i kontrolowanie odpowiedzi z dużą precyzją.

Przykłady

Gato GraphQL udostępnia pola funkcji w ramach koncepcji Pól globalnych: pól dostępnych we wszystkich typach schematu GraphQL. (Zwykłe pola w GraphQL, w przeciwieństwie do nich, są dostępne tylko w określonym typie, takim jak Post lub User).

Zgodnie z konwencją, pola globalne w Gato GraphQL zaczynają się od _ (a zwykłe pola nie).

Rozszerzenie PHP Functions Via Schema udostępnia wiele najczęściej używanych funkcji PHP jako pola globalne, w tym:

  • _arrayItem
  • _arrayJoin
  • _date
  • _equals
  • _inArray
  • _intAdd
  • _isEmpty
  • _isNull
  • _makeTime
  • _objectProperty
  • _sprintf
  • _strContains
  • _strRegexReplace
  • _strSubstr
  • _time,
  • I wiele więcej...

Możemy tworzyć dynamicznie generowane dane i przekazywać je do filtra, aby pobierać posty, komentarze itp.

Ta query pobiera liczbę komentarzy dodanych do witryny w ciągu ostatnich 24 godzin, obliczoną jako „czas teraz minus 86400 sekund":

query {
  timeNow: _time  
  time24HsAgo: _intSubtract(
    subtract: 86400,
    from: $__timeNow
  )
  date24HsAgo: _date(
    format: "Y-m-d\\TH:i:sO",
    timestamp: $__time24HsAgo
  )  
  commentsAddedInLast24Hs: commentCount(
    filter: {
      dateQuery: {
        after: $__date24HsAgo
      }
    }
  ) 
}

$__timeNow to zmienna tworzona dynamicznie przez rozszerzenie Field to Input, które umożliwia pobranie wartości pola i przekazanie jej do innego pola w tej samej operacji.

Pole, z którego chcemy pobrać wartość, jest odwoływane przy użyciu składni „Zmienna" $, a __ poprzedza alias lub nazwę pola:

{
  posts {
    excerpt
 
    # Referencing previous field with name "excerpt"
    isEmptyExcerpt: _isEmpty(value: $__excerpt)
 
    # Referencing previous field with alias "isEmptyExcerpt"
    isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
  }
}

Ta query pobiera liczbę komentarzy dodanych do witryny począwszy od „24 godziny temu", „1 rok temu", „początku miesiąca" i „początku roku":

query {
  timeNow: _time  
  time24HsAgo: _intSubtract(subtract: 86400, from: $__timeNow)
  date24HsAgo: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__time24HsAgo)  
  time1YearAgo: _intSubtract(subtract: 31536000, from: $__timeNow)
  date1YearAgo: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__time1YearAgo)
  timeBegOfThisMonth: _makeTime(hour: 0, minute: 0, second: 0, day: 1)
  dateBegOfThisMonth: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__timeBegOfThisMonth)
  timeBegOfThisYear: _makeTime(hour: 0, minute: 0, second: 0, month: 1, day: 1)
  dateBegOfThisYear: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__timeBegOfThisYear)
  
  commentsAddedInLast24Hs: commentCount(filter: { dateQuery: { after: $__date24HsAgo } } )  
  commentsAddedInLast1Year: commentCount(filter: { dateQuery: { after: $__date1YearAgo } } )  
  commentsAddedSinceBegOfThisMonth: commentCount(filter: { dateQuery: { after: $__dateBegOfThisMonth } } )  
  commentsAddedSinceBegOfThisYear: commentCount(filter: { dateQuery: { after: $__dateBegOfThisYear } } )
}

Ta query jest identyczna z poprzednią, jednak pobiera standardowy format czasu "Y-m-d\\TH:i:sO" ze stałej PHP DATE_ISO8601:

query {
  # This PHP constant will provide standard time format "Y-m-d\\TH:i:sO"
  DATE_ISO8601: _env(name: DATE_ISO8601)
  timeNow: _time  
  time24HsAgo: _intSubtract(
    subtract: 86400,
    from: $__timeNow
  )
  date24HsAgo: _date(
    format: $__DATE_ISO8601,
    timestamp: $__time24HsAgo
  )
}

Pole _env jest udostępniane przez rozszerzenie PHP Constants and Environment Variables via Schema.

Za pomocą zastosowanej konfiguracji schematu i ustawień wtyczki możemy skonfigurować które stałe i zmienne środowiskowe mogą być odpytywane.