Gato GraphQL vs WPGraphQL
Gato GraphQL 与 WPGraphQL 的对比


如果您只是需要构建一个无头 WordPress 站点并将其部署为静态站点,且目前正在使用 WPGraphQL,那么切换到 Gato GraphQL 不会带来任何区别。
否则,切换到 Gato GraphQL 将带来许多优势。以下是 Gato GraphQL + 全部扩展所提供的功能,这些功能在 WPGraphQL 中不可用。
对比表
| 功能 | Gato GraphQL | WPGraphQL |
|---|---|---|
| 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 单一端点,使其即使对已认证用户也不可访问。

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

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

端点自定义与管理
您可以提供多个自定义端点,每个端点针对特定客户或应用进行定制,并通过密码进行保护。
您还可以为它们添加自定义分类,并设置层级结构(例如 /graphql/customers/some-customer 和 /graphql/customers/another-customer)。

批量更新
您可以批量执行更新。例如,删除站点上的所有评论,或为所有文章分配标签或分类。
您还可以在数百篇文章中搜索和替换字符串,例如将旧域名替换为新域名,甚至支持使用 regex 进行替换(PRO)。
自定义 GraphQL 功能
您将能够访问已提案但尚未发布的新 GraphQL 功能,包括嵌套 mutation、schema 命名空间 以及 'oneOf' Input Object。

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 代码。
