我在Wordpress中具有灵活的内容字段类型(使用ACF),尝试构建盖茨比时遇到错误。
我使用以下插件:
对于盖茨比,我使用gatsby-source-wordpress。
{
allWordpressPage {
edges {
node {
title
acf {
page_builder_page {
... on WordPressAcf_hero {
title
subtitle
}
... on WordpressAcf_text {
text
}
}
}
}
}
}
}
只有在某些页面的 page 类型上的块 page_builder 使用 hero 时,上述查询才能起作用 text 块。如果我是第一次设置此页面,或者使用相同的page_builder字段创建新的自定义帖子类型,则在graphql查询运行之前,我需要为每种灵活的内容块类型至少填充一个字段。
否则,对于每个未使用的块,我都会得到与此类似的错误(例如,如果英雄类型具有内容,而文本类型则没有):
GraphQL request: Fragment "TextBlockFragment" cannot be spread here as objects of
type "WordPressAcf_hero" can never be of type "WordPressAcf_text".
有解决方案吗?我想这不应该是这种方式。现在,我需要在第一次设置虚假内容时就用整个页面填充整个页面,然后才能真正使用Gatsby构建它。
答案 0 :(得分:1)
我认为您遇到的问题与使用Gatsby + WordPress REST API时遇到的a fairly common one类似。
一个简短的摘要是,例如,当存在没有图像的ACF画廊字段而不是null
时,WordPress REST API将返回一个布尔值,这是GraphQL查询在该字段时所期望的是空的。我怀疑您正在发生同样的事情:您正在查询尚未填写的子字段,并且得到的响应是GraphQL解释为错误的类型,而不是null
。 (完全公开,我对GraphQL的唯一经验是通过Gatsby。)
幸运的是,我认为有很多选择可以解决这个问题。
Gatsby团队和贡献者最近一直在积极地研究这一方法,您目前可以在这里试用新方法的预览版:https://www.gatsbyjs.org/blog/2019-03-04-new-schema-customization/
如果愿意,您可以在这里阅读有关该问题和背景的更多信息:https://github.com/gatsbyjs/gatsby/issues/3344
如果您不想使用尚未完全合并到Gatsby中的内容,则可以通过以下两种方法解决此问题:
null
for that ACF field as described by @pieh on the Gatsby team,并且在GitHub问题中还有其他示例针对其他字段类型placeholder
时)。这里的问题是,对于每种自定义帖子类型,您都有这些虚假帖子,这些帖子无法从WordPress中删除。我同时使用了两种方法,并且都有效。我想说#2可能更可靠,因为它可以一次用于您正在使用的所有字段,但是根据谁在使用CMS,它可能会更加令人困惑:“为什么在这里发布这些帖子?”
希望有帮助!