如果Gatsby和WordPress未被使用,它们将找不到ACF灵活内容字段

时间:2019-03-18 09:45:30

标签: wordpress graphql gatsby

我在Wordpress中具有灵活的内容字段类型(使用ACF),尝试构建盖茨比时遇到错误。

我使用以下插件:

  • 从ACF到REST api
  • ACF到REST api递归
  • 高级自定义字段PRO

对于盖茨比,我使用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构建它。

1 个答案:

答案 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

现有的快速WordPress解决方案

如果您不想使用尚未完全合并到Gatsby中的内容,则可以通过以下两种方法解决此问题:

  1. Setting empty responses to null for that ACF field as described by @pieh on the Gatsby team,并且在GitHub问题中还有其他示例针对其他字段类型
  2. 创建“虚拟”内容,其中所有内容均已填写完毕,然后在显示该帖子之前将其过滤掉(例如,当子句为placeholder时)。这里的问题是,对于每种自定义帖子类型,您都有这些虚假帖子,这些帖子无法从WordPress中删除。

我同时使用了两种方法,并且都有效。我想说#2可能更可靠,因为它可以一次用于您正在使用的所有字段,但是根据谁在使用CMS,它可能会更加令人困惑:“为什么在这里发布这些帖子?”

希望有帮助!