Урок 1: Поиск данных в WordPress
Поиск данных в WordPress ограничен в ряде случаев, и Gato GraphQL помогает расширить эти возможности.
Один из таких примеров связан с пользовательскими полями (то есть мета-значениями): мы можем использовать custom fields для добавления дополнительной информации к записям (а также к пользователям, комментариям и таксономиям), однако при поиске записей по ключевому слову WordPress не выполняет поиск внутри мета-значений.
Мы можем использовать Gato GraphQL для поиска записей (а также пользователей, комментариев и таксономий) по мета-ключу и значению.
Примеры
- Создайте приведённые ниже queries как Persisted Queries, чтобы хранить их на сайте и выполнять снова и снова
- Публикуйте их как
private, чтобы они были доступны только в wp-admin и только администратору - Используйте иерархию API для управления ими (например: сделайте Persisted Query
internalпредком всех внутренних queries:internal/search-posts-without-thumbnail,internal/search-users-by-localeи т. д.)
Этот запрос получает все записи, у которых есть миниатюра, и те, у которых её нет:
query {
postsWithThumbnail: posts(
filter: {
metaQuery: {
key: "_thumbnail_id",
compareBy: {
key: {
operator: EXISTS
}
}
}
}
) {
id
title
featuredImage {
id
src
}
}
postsWithoutThumbnail: posts(
filter: {
metaQuery: {
key: "_thumbnail_id",
compareBy: {
key: {
operator: NOT_EXISTS
}
}
}
}
) {
id
title
}
}Этот запрос получает всех пользователей, использующих локаль «Испанский (Аргентина)»:
query {
argentineSpanishLocaleUsers: users(
filter: {
metaQuery: {
key: "locale",
compareBy: {
stringValue: {
value: "es_AR"
operator: EQUALS
}
}
}
}
) {
id
name
locale: metaValue(key: "locale")
}
}Мы можем использовать отношения AND и OR для более точной фильтрации данных. Этот запрос получает записи, у которых одновременно есть миниатюра и задан пользовательский мета todo_action со значением "replace" (то есть миниатюру нужно заменить):
query {
posts(
filter: {
metaQuery: [
{
relation: AND
key: "_thumbnail_id",
compareBy: {
key: {
operator: EXISTS
}
}
},
{
key: "todo_action",
compareBy: {
stringValue: {
value: "replace"
operator: EQUALS
}
}
}
]
}
) {
id
title
}
}Фильтрация по мета также может сочетаться с любыми стандартными параметрами данных. Этот запрос получает все записи без миниатюры, созданные после определённой даты и помеченные тегом "wordpress":
query {
posts(
filter: {
metaQuery: {
key: "_thumbnail_id",
compareBy: {
key: {
operator: NOT_EXISTS
}
}
},
dateQuery: {
after: "2020-07-01"
},
tagSlugs: [
"wordpress"
]
}
) {
id
title
tagNames
}
}Мы также можем выполнять поиск по мета с помощью регулярных выражений. Этот запрос ищет всех пользователей с испанской локалью (например, es_AR для Аргентины, es_ES для Испании и т. д.):
query {
spanishLocaleUsers: users(filter: { metaQuery: {
key: "locale",
compareBy: {
stringValue: {
value: "es_[A-Z]+"
operator: REGEXP
}
}
}}) {
id
name
locale: metaValue(key: "locale")
}
}