WordPress 的 GraphQL 服务器

Gato GraphQL vs WPGraphQL

Gato GraphQL 与 WPGraphQL 的对比

Gato GraphQL vs WPGraphQL
plus image
Gato GraphQL vs WPGraphQL

如果您只是需要构建一个无头 WordPress 站点并将其部署为静态站点,且目前正在使用 WPGraphQL,那么切换到 Gato GraphQL 不会带来任何区别。

否则,切换到 Gato GraphQL 将带来许多优势。以下是 Gato GraphQL + 全部扩展所提供的功能,这些功能在 WPGraphQL 中不可用。

对比表

功能Gato GraphQLWPGraphQL
N+1 Query 问题因架构设计而不存在此问题若未妥善处理可能出现问题,开发者需注意
安全性:禁用端点可通过 persisted queries 完全禁用单一端点(PRO)未提供
访问控制通过 UI 对角色/capability/IP 进行字段级验证(PRO)非字段级,粒度较低
缓存控制自动计算 Query 的 max-age(PRO)无自动缓存控制
自定义端点支持多个可密码保护/可自定义端点及端点层级(PRO)单一端点,自定义有限
批量更新与查找/替换通过 GraphQL 进行批量删除、打标签、替换(支持 regex)(PRO)未提供
自定义/实验性 GraphQL 功能嵌套 mutation、schema 命名空间、oneOf input object基本遵循标准 GraphQL 规范
Multiple Query Execution(可组合性)在单一文档中执行多个 query,通过 @export 共享状态支持批量 query(单次请求多个),但无法共享状态
内部/私有端点仅限后端/PHP 的私有端点,不对用户暴露(PRO)不可用
丰富的数据 mutation在单一文档中完成数据的获取、修改与保存(PRO)不支持
内容同步与分发通过 GraphQL、RSS、CSV、REST API 进行导入/导出(PRO)未提供
Web 服务集成出站/入站 API 调用与 webhook(PRO)不支持
自动化(钩子/工作流)将 GraphQL 用于工作流自动化(PRO/UI 编辑器)不可用
易用性(UI 集成)提供丰富的 UI 功能用于构建和管理 GraphQL query管理 UI 较为基础
批处理/可组合性组合字段/指令,可复用的解析器逻辑(PRO)不支持
Multiple Query Execution支持,具有状态共享与依赖关系支持,无状态共享
标准无头/静态使用两者功能相当两者功能相当

标签说明:

  • (PRO):表示该功能需要 Gato GraphQL 的付费/专业版本/扩展。

关键要点概述:

  • Gato GraphQL 为高级开发、自动化和安全性提供了大量额外功能
  • 两个插件在基本的静态/无头 WordPress 安装上功能相当
  • Gato GraphQL 的高级功能专注于:
    • 精细化控制
    • 工作流自动化
    • 丰富的集成功能
    • 现代 GraphQL 实验性特性

开发便捷性

开发者无需担心「n+1」query 问题:由于 GraphQL 服务器的架构设计,此问题根本不会发生

安全性

使用 persisted queries 来暴露预定义数据时,您可以完全禁用 GraphQL 单一端点,使其即使对已认证用户也不可访问。

Persisted query 编辑器
Persisted query 编辑器

访问控制

您可以在字段级别验证只有已登录用户、具有特定角色或 capability 的用户,或来自特定 IP 范围的访客才能访问数据(PRO)。

访问控制列表编辑器
访问控制列表编辑器

缓存控制

使用标准 HTTP 缓存 对 GraphQL 响应进行缓存时,max-age 头部会根据 GraphQL query 中所有字段自动计算(PRO)。

缓存控制列表编辑器

端点自定义与管理

您可以提供多个自定义端点,每个端点针对特定客户或应用进行定制,并通过密码进行保护

您还可以为它们添加自定义分类,并设置层级结构(例如 /graphql/customers/some-customer/graphql/customers/another-customer)。

受密码保护的自定义端点
受密码保护的自定义端点

批量更新

您可以批量执行更新。例如,删除站点上的所有评论,或为所有文章分配标签或分类。

您还可以在数百篇文章中搜索和替换字符串,例如将旧域名替换为新域名,甚至支持使用 regex 进行替换(PRO)。

自定义 GraphQL 功能

您将能够访问已提案但尚未发布的新 GraphQL 功能,包括嵌套 mutationschema 命名空间 以及 'oneOf' Input Object

带命名空间的交互式 schema
带命名空间的交互式 schema

Multiple Query Execution

WPGraphQL 支持批量 query,即在单个 HTTP 请求中解析多个 GraphQL query。

Gato GraphQL 提供 Multiple Query Execution,允许单个 GraphQL 文档执行多个操作。

Multiple Query Execution 是对 query 批处理 的改进,因为操作之间可以通过 @export 指令共享状态。

例如,要复制一篇文章,我们使用 query 操作获取文章数据,然后将数据传递给 mutation 操作以创建新文章:

query GetPostAndExportData($postId: ID!)
{
  post(by: { id: $postId }, status: any) {
    author {
      id @export(as: "authorID")
    }
    categories {
      id @export(as: "categoryIDs", type: LIST)
    }
    rawContent @export(as: "rawContent")
    rawExcerpt @export(as: "excerpt")
    featuredImage {
      id @export(as: "featuredImageID")
    }
    tags {
      id @export(as: "tagIDs", type: LIST)
    }
    rawTitle @export(as: "title")
  }
}
 
mutation DuplicatePost
  @depends(on: "GetPostAndExportData")
{
  createPost(input: {
    status: draft,
    authorBy: {
      id: $authorID
    },
    categoriesBy: {
      ids: $categoryIDs
    },
    contentAs: {
      html: $rawContent
    },
    excerpt: $excerpt
    featuredImageBy: {
      id: $featuredImageID
    },
    tagsBy: {
      ids: $tagIDs
    },
    title: $title
  }) {
    postID
  }
}

可组合性

您可以使用字段组合功能,将某个字段的值作为同一 query 中另一个字段的输入,使基础字段解析器能够覆盖无限的使用场景(PRO)。

例如,无需创建 Post.hasExcerpt 字段,我们可以对 Post.excerpt 应用 _notEmpty 字段来生成相同的值:

query {
  post(by: { id: 1 }) {
    excerpt 
    hasExcerpt: _notEmpty(value: $__excerpt)
  }
}

类似地,您可以组合指令,从而将指令应用于字段值的内部属性。

例如,以下 query 将文章的分类名称翻译成另一种语言:

query {
  post(by: { id: 1 }) {
    title
    categoryNames
    frenchCategoryNames: categoryNames
      @underEachArrayItem
        @strTranslate(
          from: "en",
          to: "fr"
        )
  }
}

GraphQL 服务器可用性

您可以暴露私有端点来驱动您的 Gutenberg 区块。您还可以访问私有 GraphQL 服务器,使用 PHP 代码为应用获取数据,而无需暴露任何面向公众的端点(PRO)。

数据 mutation 的多样性

您可以使用 GraphQL 在单个 GraphQL 文档中完成站点内容的获取、修改和重新存储(PRO)。

例如,您可以获取文章中的所有 Gutenberg 区块,提取其属性,通过 Google Translate API 翻译这些字符串,将字符串插回区块,然后重新保存文章。

内容同步与分发

您可以使用 GraphQL 从其他 WordPress 站点导入文章从 RSS 订阅导入从 CSV 导入,或从任何 REST 或 GraphQL API 导入(PRO)。

您可以将内容导出到其他 WordPress 站点,并以 JSON 和 CSV 格式保存(PRO)。

Web 服务交互

您可以通过 HTTP 客户端调用任何外部服务的 API(PRO)。例如,您可以将 WordPress 用户订阅到您的 Mailchimp 邮件列表

您还可以通过专用 webhook 接收并处理来自任何服务的入站数据(PRO)。例如,您可以捕获在 InstaWP 沙盒站点中注册的新闻通讯邮箱并自动发送到 Mailchimp。

自动化

您可以使用 GraphQL 自动化任务和内容工作流(PRO)。

例如,当新文章被创建时(通过钩子 draft_post 的事件),您可以执行一个 persisted query,检查文章是否没有缩略图,若没有则调用 Stable Diffusion API 生成图片,通过 TinyPng 压缩,最终将图片设置为文章的特色图片。

自动化规则编辑器
自动化规则编辑器

易用性

所有这些额外的使用场景都可以直接在 wp-admin 中实现,通过用户界面输入 GraphQL query,无需部署任何 PHP 代码。

订阅我们的新闻通讯

及时了解 Gato GraphQL 的所有更新。