Я работаю над сайтом gatsby , использующим gatsby-source-wordpress
для публикации постов в блоге. Тем не менее, если какие-либо сообщения WordPress не включают избранные изображения, это приводит к сбою сборки. Я понимаю, что это ожидаемое поведение.
Вот ошибка сборки, которую я вижу:
29 | {posts.map(({ node: post }, index) => (
30 | <li key={post.id} {...post}>
> 31 | <Img fixed={post.featured_media.localFile.childImageSharp.fixed} />
| ^
32 | <p>
33 | <Link to={`/insights/${post.slug}`}>
34 | {post.title}
WebpackError: TypeError: Cannot read property 'localFile' of null
Это вызвано результирующим запросом, который возвращает нулевой результат во втором узле потому что на посту нет показанного изображения:
{
"data": {
"allWordpressPost": {
"edges": [
{
"node": {
"id": "28ec9054-5b05-5f94-adcb-dcbfc14659b1",
"featured_media": {
"id": "f12d613b-e544-560b-a86f-cd0a7f87801e",
"localFile": {
"id": "7fca2893-ff80-5270-9765-d17d3dc21ac2",
"url": "https://www.mycustomdomain.com/wp-content/uploads/2020/01/some-featured-image.jpg"
}
}
}
},
{
"node": {
"id": "91a236ed-39d5-5efc-8bed-290d8344b660",
"featured_media": null
}
}
]
}
}
}
Как я хотел бы исправить:
В качестве идеального решения я хотел бы использовать настройку схемы для установки изображения по умолчанию, если В WordPress нет рекомендуемого изображения. Но я в полной растерянности, как правильно это сделать. Я работаю с этой документацией , чтобы направлять меня, но мне просто не удается правильно обернуть вокруг нее голову.
Аналогичный рабочий пример:
Данные тега похожи на избранные изображения в том смысле, что запрос возвращает ноль, если запись не имеет тегов. Однако я могу установить тег undefined
по умолчанию, используя createResolvers
следующим образом:
exports.createResolvers = ({ createResolvers }) => {
const resolvers = {
wordpress__POST: {
tags: {
resolve(source, args, context, info) {
const { tags } = source
if (tags === null || (Array.isArray(tags) && !tags.length)) {
return [
{
id: 'undefined',
name: 'undefined',
slug: 'undefined',
}
]
} else {
return info.originalResolver(source, args, context, info)
}
},
},
},
}
createResolvers(resolvers)
}
И это работает, как показано в следующих результатах запроса:
{
"data": {
"allWordpressPost": {
"edges": [
{
"node": {
"id": "28ec9054-5b05-5f94-adcb-dcbfc14659b1",
"tags": [
{
"id": "undefined"
}
]
}
},
{
"node": {
"id": "91a236ed-39d5-5efc-8bed-290d8344b660",
"tags": [
{
"id": "50449e18-bef7-566a-a3eb-9f7990084afb"
},
{
"id": "8635ff58-2997-510a-9eea-fe2b88f30781"
},
{
"id": "97029bee-4dec-5198-95af-8464393f71e3"
}
]
}
}
]
}
}
}
Что я попробовал для изображений (не работает ...)
Когда дело доходит до вложенных узлов и файлов изображений, я в полной растерянности. Я направляюсь в следующем направлении на основе этой статьи и этого примера кода , но пока он не работает:
exports.createResolvers = ({
actions,
cache,
createNodeId,
createResolvers,
store,
reporter,
}) => {
const { createNode } = actions
const resolvers = {
wordpress__POST: {
featured_media: {
type: `File`,
resolve(source, args, context, info) {
return createRemoteFileNode({
url: 'https://www.mycustomdomain.com/wp-content/uploads/2017/05/placeholder.png',
store,
cache,
createNode,
createNodeId,
reporter,
})
},
},
},
}
createResolvers(resolvers)
}
Я понимаю, что выше В коде нет оператора if else
, поэтому ожидается, что все избранные изображения будут заменены на изображения-заполнители. Однако на полученный запрос GraphQL это не влияет (как показано вверху).
Может кто-нибудь указать мне правильное направление здесь? Кажется, я не могу понять, какую информацию я могу там найти.