Мы добавляем некоторые сообщения из бэкэнда Wordpress, в некоторых есть изображения (в поле ACF), а в некоторых нет. Проблема в том, что Гэтсби выводит схему на основе первого полученного узла. Если он получает узел без изображения, значит, схема неверна.
Where does Gatsby’s GraphQL schema come from? With Gatsby, we use plugins which fetch data from different sources. We then use that data to automatically infer a GraphQL schema.
Как мы можем диктовать GraphQL / Gatsby схему, которая всегда включает изображение, со значением по умолчанию «null», если оно пустое?
{
allWordpressWpTestimonial {
edges {
node {
id
title
acf {
photo_fields {
photo {
id
localFile {
childImageSharp {
sizes {
src
}
}
}
}
}
}
}
}
}
}
В приведенном выше примере иногда «фото» не существует, и оно все ломает ...
Конфигурация Гэтсби:
const innertext = require('innertext')
const url = require('url')
module.exports = {
siteMetadata: {
title: 'Test',
googleMapsAPIKey: 'xxxxxx',
adminBaseUrl: '123.123.123',
adminProtocol: 'http',
},
pathPrefix: '/web/beta',
plugins: [
'gatsby-plugin-react-next',
'gatsby-plugin-react-helmet',
'gatsby-plugin-sharp',
'gatsby-plugin-svgr',
{
resolve: 'gatsby-plugin-google-analytics',
options: {
trackingId: 'GOOGLE_ANALYTICS_TRACKING_ID',
},
},
{
resolve: 'gatsby-plugin-bugherd',
options: {
key: 'xxxxxx',
showInProduction: true,
},
},
{
resolve: '@andrew-codes/gatsby-plugin-elasticlunr-search',
options: {
fields: ['title', 'url', 'textContent', 'urlSearchable'],
resolvers: {
wordpress__PAGE: {
title: node => node.title,
textContent: node => innertext(node.content),
url: node => url.parse(node.link).path,
urlSearchable: node =>
url
.parse(node.link)
.path.split('/')
.join(' '),
},
wordpress__POST: {
title: node => node.title,
textContent: node => innertext(node.content),
url: node => `/news/${node.slug}`,
urlSearchable: node =>
url
.parse(node.link)
.path.split('/')
.join(' '),
},
wordpress__wp_industry: {
title: node => node.title,
textContent: node => innertext(node.content),
url: node => `/business/industries/${node.slug}`,
urlSearchable: node =>
url
.parse(node.link)
.path.split('/')
.join(' '),
},
},
},
},
{
resolve: 'gatsby-source-wordpress',
options: {
baseUrl: 'xxxxxx',
protocol: 'http',
hostingWPCOM: false,
useACF: true,
auth: {
htaccess_user: 'admin',
htaccess_pass: 'xxxxxx',
htaccess_sendImmediately: false,
},
verboseOutput: false,
},
},
'gatsby-transformer-sharp',
],
}
gatsby-source-wordpress, обновится конфигурацией gatsby



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Во-первых, вы используете плагины Gatsby-plugin-sharp, Gatsby-transform-sharp и Gatsby-source-WordPress?
На моем сайте используется подключаемый модуль Gatsby-source-Wordpress плюс библиотека Sharp, а также Bluebird для возврата обещаний и т. д. Определите ImageURL на вашем Post.js или Page.js. Исходный URL создается при загрузке в мою библиотеку мультимедиа, но выгружается в корзину S3, потому что мой сайт WordPress построен «программно». Исходный URL-адрес обычно определяется вами и может быть выбран в типах полей ACF при создании публикации шаблона страницы.
export const pageQuery = graphql`
query homePageQuery {
site {
siteMetadata {
title
subtitle
description
}
}
allWordpressPost(sort: { fields: [date] }) {
edges {
node {
title
excerpt
slug
type
_image{
source_url
}
categories {
slug
name
}
}
}
}
}
Запрос данных в точном порядке является обязательным для каждого типа сообщения, иначе GraphQL не вернет схему правильно, что приведет к ошибке. Как бы просто это ни звучало и дублировало, временами должны быть две разные схемы GraphQL и два примера post.js, post1.js и post2.js файлов, определяющих разные категории сообщений. 1. Запрос на возврат с URL-адресом изображений. 2. Запрос на возврат без изображений. равным нулю или несуществующему Это недостаток GraphQL, он ожидает получить X, а когда происходит Y, он становится недовольным и терпит неудачу.
Вы также можете попробовать это, когда вы получаете изображение, преобразуйте его с резкостью в href = и преобразуйте его с https, чтобы изменить его размер при получении. Но в вашем случае схема должна быть нулевой. Мы сделали это для страницы с биографией сотрудника, которая была возвращена со старого сайта WordPress.
/**
* Transform internal absolute link to relative.
*
* @param {string} string The HTML to run link replacemnt on
*/
linkReplace(string) {
// console.info(string)
const formatted = string.replace(
/(href = "https?://dev-your-image-api\.pantheonsite\.io/)/g,
`href = "/`
)
return formatted
}
render() {
const post = { ...this.props.data.wordpressPost }
const headshot = { ...this.props.data.file.childImageSharp.resolutions }
const { percentScrolled } = { ...this.state }
const contentFormatted = this.linkReplace(post.content)
return (
<div ref = {el => (this.post = el)}>
<div className = {styles.progressBarWrapper}>
<div
style = {{ width: `${percentScrolled}%` }}
className = {styles.progressBar}
/>
</div>
<div className = {styles.post}>
<h1
className = {styles.title}
dangerouslySetInnerHTML = {{ __html: post.title }}
/>
<div
className = {styles.content}
dangerouslySetInnerHTML = {{ __html: contentFormatted }}
/>
<Bio headshot = {headshot} horizontal = {true} />
</div>
</div>
)
}
}
Post.propTypes = {
data: PropTypes.object.isRequired,
}
export default Post
export const postQuery = graphql`
query currentPostQuery($id: String!) {
wordpressPost(id: { eq: $id }) {
wordpress_id
title
content
slug
}
file(relativePath: { eq: "your-image-headshot.jpg" }) {
childImageSharp {
resolutions(width: 300, height: 300) {
...GatsbyImageSharpResolutions
}
}
}
}
`
Надеюсь, это поможет не стесняться написать мне.
С момента этого поста прошло некоторое время, но, начиная с версии 2.2, Гэтсби добавил новый API значительно упростит настройку схемы. Это пример не с wordpress, а с gatsby-transformer-remark от Gatsby, но я уверен, что это применимо.
У меня связка .md с лицевой панелью выглядит так:
---
title: "Screen title"
image: "./hero-image.png" <--- sometimes it's an empty string, ""
category: "Cat"
---
...content...
Если Гэтсби сначала доберется до .md с пустым образом, он неправильно выведет это поле как String, даже если это должно быть File. С новым API я могу сообщить Гэтсби о поле изображения в gatsby-node.js:
exports.sourceNodes = ({ actions, schema }) => {
const { createTypes } = actions
createTypes(`
type MarkdownRemarkFrontmatter {
image: File
}
type MarkdownRemark implements Node {
frontmatter: MarkdownRemarkFrontmatter
}
`)
}
Это гарантирует, что поле image всегда будет иметь тип файла, в противном случае это будет null.
Некоторые примечания:
MarkdownRemark, должны реализовывать NodeMarkdownRemarkFrontmatter, а затем передать его в поле frontmatter в узле MarkdownRemark.category в MarkdownRemarkFrontmatter, оно будет выведено Гэтсби, как и раньше.MarkdownRemark, MarkdownRemarkFrontmatter) - это искать их в graphiql (по умолчанию localhost:8000/___graphql)Я изо всех сил пытаюсь заставить это работать с wordpress и acf. Каждый узел имеет объект ACF внутри этого объекта-повторителя с массивом для ссылки с 3 строками (заголовок, URL-адрес, цель). Я попытался создать серию функций, как указано выше, вплоть до трех строк, у меня это не работает. {allWordpressPost {Edge {node {title acf {project_students partners {partner_link {title url target}}}}}}}
Какой плагин для извлечения исходного кода из Wordpress вы используете? Не могли бы вы поделиться своим файлом конфигурации gatsby?