Gatsby с wordpress не находит гибкое поле содержимого ACF, если оно не используется

У меня есть гибкий тип поля содержимого в Wordpress (с ACF), и я получаю ошибки при попытке построить gatsby.

Я использую следующие плагины:

  • API ACF для REST
  • 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
            }
          }
        }
      }
    }
  }
}

Запрос, подобный приведенному выше, работает, только если блок page_builder типа страница для какой-либо страницы использует блок герой и текст. Если я настрою эту страницу в первый раз или создам новый настраиваемый тип сообщения с тем же полем 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.

Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
3
0
1 186
1

Ответы 1

Я думаю, что проблема, с которой вы столкнулись, похожа на довольно распространенный, с которой я также столкнулся при использовании Gatsby + WordPress REST API.

Кратко можно сказать, что WordPress REST API, например, будет возвращать логическое значение, когда есть поле галереи ACF без изображений, а не null, что ожидает запрос GraphQL, когда поле пусто. Я подозреваю, что у вас происходит то же самое: вы запрашиваете незаполненные подполя и получаете ответ, который GraphQL интерпретирует как неправильный тип, а не null. (Полное раскрытие, мой единственный опыт работы с GraphQL — через Гэтсби.)

К счастью, я думаю, что у вас есть много вариантов решить эту проблему.

Новое решение Гэтсби

Команда Gatsby и участники активно работали над этим в последнее время, и в настоящее время вы можете опробовать предварительную версию нового подхода здесь: https://www.gatsbyjs.org/blog/2019-03-04-new-schema-customization/.

Если хотите, вы можете прочитать намного больше о проблеме и предыстории здесь: https://github.com/gatsbyjs/gatsby/issues/3344

Существующие, быстрые решения WordPress

Два решения, которые работают сейчас, если вы не хотите использовать что-то еще не полностью объединенное с Gatsby:

  1. Установка пустых ответов на null для этого поля ACF, как описано @pieh из команды Gatsby, и в этой проблеме GitHub есть еще примеры для других типов полей.
  2. Создание «фиктивного» контента, в котором все заполнено, а затем этот пост отфильтровывается перед отображением (например, когда слаг — placeholder). Подвох здесь в том, что у вас есть эти поддельные сообщения для каждого пользовательского типа сообщений, которые нельзя удалить из WordPress.

Я использовал оба подхода, и оба работают. Я бы сказал, что № 2, вероятно, более надежен, поскольку он работает для всех полей, которые вы используете одновременно, но потенциально более запутан в зависимости от того, кто использует CMS: «Почему эти сообщения здесь?»

Надеюсь, это полезно!

Другие вопросы по теме