Учебник по схеме
Учебник по схемеУрок 2: Запрос динамических данных

Урок 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.

Через применённую конфигурацию схемы и настройки плагина можно настроить какие константы и переменные окружения доступны для запросов.