wordpress - 如果未使用,带有 wordpress 的 Gatsby 找不到 ACF 灵活内容字段
问题描述
我在 Wordpress 中有一个灵活的内容字段类型(使用 ACF),并且在尝试构建 gatsby 时出现错误。
我使用以下插件:
- ACF 到 REST api
- ACF 到 REST api 递归
- 高级自定义字段 PRO
对于 gatsby,我使用 gatsby-source-wordpress。
{
allWordpressPage {
edges {
node {
title
acf {
page_builder_page {
... on WordPressAcf_hero {
title
subtitle
}
... on WordpressAcf_text {
text
}
}
}
}
}
}
}
仅当某些页面的页面类型上的 block page_builder使用hero和text块时,上述查询才有效。如果我是第一次设置此页面,或者创建具有相同 page_builder 字段的新自定义帖子类型,我需要为每个灵活的内容块类型填充至少一个字段,然后 graphql-query 才能工作。
否则,对于每个未使用的块,我都会收到与此类似的错误(例如,如果 hero-type 有内容但没有 text-type):
GraphQL request: Fragment "TextBlockFragment" cannot be spread here as objects of
type "WordPressAcf_hero" can never be of type "WordPressAcf_text".
有针对这个的解决方法吗?我想它不应该是这样的。就像现在一样,我需要在第一次设置页面时用虚拟内容填充整个页面,然后才能使用 Gatsby 实际构建它。
解决方案
我认为您遇到的问题类似于我在使用 Gatsby + WordPress REST API 时也遇到的一个相当常见的问题。
一个简短的总结是,例如,当有一个没有图像的 ACF 库字段时,WordPress REST API 将返回一个布尔值,而不是null
GraphQL 查询在该字段为空时所期望的。我怀疑同样的事情正在发生在您身上:您正在查询尚未填写的子字段,并且您收到 GraphQL 解释为错误类型的响应,而不是null
. (完全披露,我对 GraphQL 的唯一经验是通过 Gatsby。)
幸运的是,我认为您有很多选择可以解决这个问题。
新盖茨比解决方案
Gatsby 团队和贡献者最近一直在非常积极地开展这项工作,您目前可以在此处试用新方法的预览版:https ://www.gatsbyjs.org/blog/2019-03-04-new-模式定制/
如果需要,您可以在此处阅读有关问题和背景的更多信息:https ://github.com/gatsbyjs/gatsby/issues/3344
现有的快速 WordPress 解决方案
如果您不想使用尚未完全合并到 Gatsby 中的东西,现在可以使用两种解决方案:
null
为该 ACF 字段设置空响应,如 Gatsby 团队中的 @pieh 所述,该 GitHub 问题中有更多示例用于其他字段类型- 创建“虚拟”内容,填写所有内容,然后在显示之前过滤掉该帖子(例如,当 slug 为 时
placeholder
)。这里的问题是,对于每个自定义帖子类型,您都有这些无法从 WordPress 中删除的虚假帖子。
我已经使用了这两种方法,并且都有效。我想说#2 可能更可靠,因为它同时适用于您正在使用的所有字段,但可能更令人困惑,具体取决于谁在使用 CMS:“为什么这些帖子在这里?”</p>
希望这会有所帮助!
推荐阅读
- android - 如何将 RxJava 代码改进为 API 和本地缓存?
- python - 训练使用 tensorflow.keras.Model 和 keras 功能 API 设计的网络会导致 Python 崩溃
- ios - 过滤器不适用于tableView Swift中的搜索栏UITextField
- java - Aerospike - 如何使用 Java 在给定列表中插入唯一项?
- python - 实现python的测试功能时出错
- python - 子图上的 x 轴标题 Plotly Python
- eyeshot - 如何将第二个 CoordinateSystemIcon 添加到 Eyeshot 的视口
- javascript - 获取嵌套对象的总大小
- r - 如何更改 R 中系数图中的系数顺序(包 dotwhisker)
- c# - 我们如何根据 wpf (c#) 中的点高度为 3d 网格着色?