Schema 教程
Schema 教程第1课:搜索 WordPress 数据

第1课:搜索 WordPress 数据

在 WordPress 中搜索数据在某些情况下存在限制,Gato GraphQL 可以帮助扩展这些功能。

其中一个典型示例涉及自定义字段(即元值):我们可以使用自定义字段为文章(以及用户、评论和分类法)添加额外信息,但在使用关键词搜索文章时,WordPress 不会在元值中进行搜索。

因此,我们可以使用 Gato GraphQL 通过元键和值来搜索文章(以及用户、评论和分类法)。

示例

  • 将以下 queries 创建为持久化 Query,以便将其存储在网站中并反复执行
  • 将其发布为 private,使其仅在 wp-admin 内对管理员可用
  • 使用 API 层级来管理它们(例如:将持久化 Query internal 作为所有内部 queries 的祖先:internal/search-posts-without-thumbnailinternal/search-users-by-locale 等)

以下 query 获取所有有缩略图的文章以及没有缩略图的文章:

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 获取所有使用"阿根廷西班牙语"语言区域的用户:

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

我们可以使用 ANDOR 关系来更精确地过滤数据。以下 query 获取既有缩略图、又有自定义元 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
  }
}

按元过滤也可以与任何标准数据项结合使用。以下 query 获取所有在某一日期之后创建、且标记了 "wordpress" 标签的无缩略图文章:

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

我们还可以使用正则表达式搜索元值。以下 query 搜索所有使用西班牙语语言区域的用户(例如,阿根廷的 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")
  }
}