Tutorial do schema
Tutorial do schemaLição 1: Pesquisando dados no WordPress

Lição 1: Pesquisando dados no WordPress

A pesquisa de dados no WordPress é limitada em vários casos, e o Gato GraphQL pode ajudar a ampliar essas capacidades.

Um exemplo envolve campos personalizados (ou seja, valores meta): podemos usar campos personalizados para adicionar informações extras aos posts (e também a usuários, comentários e taxonomias), porém ao pesquisar posts com alguma palavra-chave, o WordPress não busca dentro dos valores meta.

Podemos então usar o Gato GraphQL para pesquisar posts (e também usuários, comentários e taxonomias) por chave e valor meta.

Exemplos

  • Crie as queries abaixo como Queries persistidas, para mantê-las armazenadas no site e executá-las repetidamente
  • Publique-as como private, para que estejam disponíveis apenas no wp-admin e somente para o administrador
  • Use uma hierarquia de API para gerenciá-las (ex: ter uma Persisted Query internal como ancestral de todas as queries internas: internal/search-posts-without-thumbnail, internal/search-users-by-locale, etc.)

Esta query recupera todos os posts que têm uma miniatura, e os que não têm:

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
  }
}

Esta query recupera todos os usuários que utilizam o locale "Espanhol da Argentina":

query {
  argentineSpanishLocaleUsers: users(
    filter: {
      metaQuery: {
        key: "locale",
        compareBy: {
          stringValue: {
            value: "es_AR"
            operator: EQUALS
          }
        }
      }
    }
  ) {
    id
    name
    locale: metaValue(key: "locale")
  }
}

Podemos usar as relações AND e OR para filtrar os dados com maior precisão. Esta query recupera posts que têm tanto uma miniatura quanto um meta personalizado todo_action com valor "replace" (o que significa que a miniatura precisa ser substituída):

query {
  posts(
    filter: {
      metaQuery: [
        {
          relation: AND
          key: "_thumbnail_id",
          compareBy: {
            key: {
              operator: EXISTS
            }
          }
        },
        {
          key: "todo_action",
          compareBy: {
            stringValue: {
              value: "replace"
              operator: EQUALS
            }
          }
        }
      ]
    }
  ) {
    id
    title
  }
}

A filtragem por meta também pode ser combinada com qualquer um dos itens de dados padrão. Esta query recupera todos os posts sem miniatura criados após uma determinada data e que tenham a tag "wordpress":

query {
  posts(
    filter: {
      metaQuery: {
        key: "_thumbnail_id",
        compareBy: {
          key: {
            operator: NOT_EXISTS
          }
        }
      },
      dateQuery: {
        after: "2020-07-01"
      },
      tagSlugs: [
        "wordpress"
      ]
    }
  ) {
    id
    title
    tagNames
  }
}

Também podemos pesquisar meta usando expressões regex. Esta query busca todos os usuários com um locale em espanhol (por exemplo, es_AR para a Argentina, es_ES para a Espanha, e assim por diante):

query {
  spanishLocaleUsers: users(filter: { metaQuery: {
    key: "locale",
    compareBy: {
      stringValue: {
        value: "es_[A-Z]+"
        operator: REGEXP
      }
    }
  }}) {
    id
    name
    locale: metaValue(key: "locale")
  }
}