Учебник по схеме
Учебник по схемеУрок 1: Поиск данных в WordPress

Урок 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")
  }
}