Урок 2: Запрос динамических данных
Gato GraphQL может ещё больше расширить возможности WordPress для поиска данных с помощью полей «функций» (особый тип поля, предоставляющий функциональность вместо данных), позволяя динамически вычислять данные, передавать их обратно в запрос и гибко управлять ответом.
Примеры
Gato GraphQL предоставляет поля функций в рамках концепции Глобальных полей: полей, доступных для всех типов схемы GraphQL. (Обычные поля в GraphQL, напротив, доступны только для определённых типов, таких как Post или User).
По соглашению, глобальные поля в Gato GraphQL начинаются с _ (а обычные поля — нет).
Расширение PHP Functions Via Schema предоставляет многие наиболее распространённые функции PHP в виде глобальных полей, в том числе:
_arrayItem_arrayJoin_date_equals_inArray_intAdd_isEmpty_isNull_makeTime_objectProperty_sprintf_strContains_strRegexReplace_strSubstr_time,- И многие другие...
Мы можем создавать динамически сгенерированные данные и передавать их в фильтр для получения записей, комментариев и т. д.
Этот запрос получает количество комментариев, добавленных на сайт за последние 24 часа, которое вычисляется как «текущее время минус 86400 секунд»:
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 — переменная, динамически создаваемая расширением Field to Input, которое позволяет получить значение поля и передать его в другое поле в той же операции.
Поле, из которого берётся значение, задаётся с помощью синтаксиса «переменной» $ и __ перед псевдонимом или именем поля:
{
posts {
excerpt
# Referencing previous field with name "excerpt"
isEmptyExcerpt: _isEmpty(value: $__excerpt)
# Referencing previous field with alias "isEmptyExcerpt"
isNotEmptyExcerpt: _not(value: $__isEmptyExcerpt)
}
}Этот запрос получает количество комментариев, добавленных на сайт, начиная с «24 часа назад», «1 год назад», «начала месяца» и «начала года»:
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 } } )
}Этот запрос аналогичен предыдущему, однако получает стандартизированный формат времени "Y-m-d\\TH:i:sO" из 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
)
}Поле _env предоставляется расширением PHP Constants and Environment Variables via Schema.
Через применённую конфигурацию схемы и настройки плагина можно настроить какие константы и переменные окружения доступны для запросов.