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.