自动化
自动化自动化配置工具

自动化配置工具

当网站发生某个事件时,自动执行 GraphQL Persisted Query。

自动化配置工具模块提供了一个「自动化器」用户界面,可通过 WordPress 编辑器创建自动化规则。

自动化触发器是任意 WordPress 动作钩子,而动作则是执行一个 GraphQL persisted query。

系统提供了自定义文章类型「自动化规则」用于创建自动化。新建条目时,需要配置以下内容:

  • 自动化触发器
  • 自动化动作
自动化规则编辑器
自动化规则编辑器

自动化动作

自动化动作指明将执行哪个 GraphQL persisted query。

请使用以下元素配置此项目:

Persisted Query:选择要执行的 GraphQL persisted query(从所有状态为 publishprivate 的 query 中选择)。

静态 GraphQL 变量:以 JSON 字符串形式为 persisted query 中的 GraphQL 变量提供值。这些是静态值。

例如:

{
  "emailSubject": "New post on the site"
}

这些值会被「动态」GraphQL 变量覆盖(参见下方自动化触发器)。

操作名称(可选):如果 persisted query 包含多个操作,可以指定要执行的操作(默认为最后一个)。

以用户身份执行(可选):以特定用户的登录状态执行 GraphQL persisted query,需提供该用户的 slug。

自动化规则 - Persisted Query 执行
自动化规则 - Persisted Query 执行

自动化触发器

自动化触发器指明哪个 WordPress 动作钩子将触发 Persisted Query 的执行。可以提供多个触发器(例如:如果只想响应文章或页面的编辑操作,可以提供 edit_post_postedit_post_page 两个钩子)。

请使用以下元素配置此项目:

钩子名称:WordPress 动作钩子的名称。

动态 GraphQL 变量:提供一个 JSON 字符串,将 GraphQL 变量映射到传递给钩子函数的参数。这些动态值将在运行时传递给 query。

JSON 字典必须以 GraphQL 变量名作为键,以动作钩子中参数的位置作为值。

例如,钩子 draft_post(来自文章状态转换)将 $post_id 作为第一个参数传入。下面的 JSON 表示 GraphQL 变量 $postID 将接收传递给钩子的 $post_id 的值:

{
  "postID": 1
}

(在此示例中,1 表示「draft_post 的第 1 个参数的值」。)

如果「动态」和「静态」GraphQL 变量(参见上方自动化动作)使用了相同的键,则动态值优先。

自动化规则 - 动作钩子
自动化规则 - 动作钩子

WordPress 钩子映射

有些 WordPress 钩子无法直接在自动化配置工具中使用,因为它们通过钩子传递了 PHP 对象,而该对象无法作为 GraphQL 变量输入。

Gato GraphQL 已对其中若干钩子进行了映射:通过触发一个以 gatographql: 为前缀、名称相同的新钩子,并将对应的对象 ID 作为变量传递,从而可以作为 GraphQL 变量输入。

例如,WordPress 钩子 draft_to_publish 传递的是 $post 变量(类型为 WP_Post)。Gato GraphQL 将此钩子映射为 gatographql:draft_to_publish,并传递 $postId(类型为 int)作为变量。

下表列出了已映射的 WordPress 钩子:

WordPress 钩子Gato GraphQL 映射钩子
{$old_status}_to_{$new_status} (传递 WP_Post $post)gatographql:{$old_status}_to_{$new_status} (传递 int $postId, string $postType)

此外,Gato GraphQL 还会在钩子名称中附加额外信息来重新触发若干 WordPress 钩子,以便更方便地捕获特定事件并实现自动化。

例如,创建、更新和删除 meta 值的钩子在触发时会将 meta 键包含在钩子名称中。这样,当为文章设置特色图片时,就可以通过钩子 gatographql:added_post_meta:_thumbnail_id 触发自动化。

以下是 Gato GraphQL 的附加钩子:

源 WordPress 钩子触发的 Gato GraphQL 钩子
{$old_status}_to_{$new_status}
(传递 WP_Post $post)
gatographql:any_to_{$new_status}
gatographql:{$old_status}_to_any
gatographql:{$old_status}_to_{$new_status}:{$post_type}
gatographql:any_to_{$new_status}:{$post_type}
gatographql:{$old_status}_to_any:{$post_type}
(均传递 int $postId, string $postType)
created_termgatographql:created_term:{$taxonomy}
set_object_termsgatographql:set_object_terms:{$taxonomy}
gatographql:updated_object_terms:{$taxonomy} (当新旧分类项之间存在差异时)
added_post_metagatographql:added_post_meta:{$meta_key}
gatographql:added_post_meta:{$post_type}:{$meta_key} (第 5 个参数还传递 string $post_type)
updated_post_metagatographql:updated_post_meta:{$meta_key}
gatographql:updated_post_meta:{$post_type}:{$meta_key} (第 5 个参数还传递 string $post_type)
deleted_post_metagatographql:deleted_post_meta:{$meta_key}
gatographql:deleted_post_meta:{$post_type}:{$meta_key} (第 5 个参数还传递 string $post_type)
added_term_metagatographql:added_term_meta:{$meta_key}
gatographql:added_term_meta:{$taxonomy}:{$meta_key} (第 5 个参数还传递 string $taxonomy)
updated_term_metagatographql:updated_term_meta:{$meta_key}
gatographql:updated_term_meta:{$taxonomy}:{$meta_key} (第 5 个参数还传递 string $taxonomy)
deleted_term_metagatographql:deleted_term_meta:{$meta_key}
gatographql:deleted_term_meta:{$taxonomy}:{$meta_key} (第 5 个参数还传递 string $taxonomy)

调试问题

如果自动化未被执行,可能是自动化配置或 persisted query 执行存在错误。

执行日志

详情请参阅问题排查

错误日志

所有配置问题(例如 GraphQL 变量的 JSON 字符串格式错误,或引用了已被删除的 persisted query)和执行错误(例如抛出异常,或 GraphQL query 中的 errors 条目)都会发送至 PHP 函数的 error_log,因此会输出到 WordPress 错误日志中。

这些错误日志均以字符串 [Gato GraphQL] 作为前缀。

使用示例

以下是一些使用场景:

  • 使用 AI 为新文章创建特色图片
  • 文章发布时自动添加必要的区块
  • 文章更新时将所有图片来源和链接中的 http 替换为 https
  • 有新文章时向管理员发送邮件
  • 评论收到回复时向该用户发送邮件
  • 【多站点】将新文章翻译成不同语言,并将译文添加到各个站点
  • 在外部服务上执行操作(例如:自动将新文章分享到 Facebook)

例如,当以 draft 状态创建新文章时,预定义自动化规则**「为新文章添加评论区块」**会检查 core/comments 区块是否存在,若不存在则将其添加到文章末尾:

自动将评论区块插入新的「draft」文章
自动将评论区块插入新的「draft」文章