Gatsby Image Путь к og:image для SEO
Я использую страницы уценки для создания своих страниц на Gastby. Я определяю путь к изображению внутри файла .md.
---
slug: "/blog/my-blog-post"
date: "2022-01-11"
title: "My title"
image: /images/blog/my-image-1.png
---
![image-alt](/images/blog/my-image-1.png)
# My content header
My content
{MarkdownRemark.frontmatter__slug}.js
import React from "react"
import { Helmet } from "react-helmet"
import BaseController from "../base-controller"
import { graphql } from "gatsby"
import { getSrc } from "gatsby-plugin-image"
const baseUrl = 'https://popupfox.com';
export default function Template({
data, // this prop will be injected by the GraphQL query below.
}) {
const { markdownRemark } = data // data.markdownRemark holds your post data
const { frontmatter, html } = markdownRemark
const image = getSrc(frontmatter.image); // image returns as undefined.
console.log("image",image);
return (
<BaseController>
<Helmet>
<title>{frontmatter.title}</title>
<meta name="title" content={frontmatter.title} />
<!-- this line doesn'g work as expected --!>
<meta property="og:image" content={frontmatter.image} />
</Helmet>
<section>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12 col-lg-12" dangerouslySetInnerHTML={{ __html: html }}>
</div>
</div>
</div>
</section>
</BaseController>
)
}
export const pageQuery = graphql`
query og($id: String!) {
markdownRemark(id: { eq: $id }) {
html
frontmatter {
slug
title
image
}
}
}
`
Здесь мне нужно og:image в качестве URL-адреса, сгенерированного gastby. Но я не мог этого сделать. Кстати,
const image = getSrc(frontmatter.image); // image returns as undefined.
console.log("image",image);
возвращает неопределенное значение. так что getSrc мне не помогает.
Есть ли способ заставить работать og:image?
1 ответ
Ваш возвращается
undefined
потому что ваш запрос GraphQL не возвращает все данные, которые должны возвращаться.
Тем не менее, это вспомогательная функция, которая помогает вам писать более чистый код, и это вовсе не обязательно. Использование документов в качестве запасного варианта:
Получить изображение по умолчанию
src
как строка. Это будет запасной вариант, поэтому обычноjpg
или жеpng
. Принимает те же типы, что и .
И если вы посмотрите на
getImage
пример:
const image = getImage(data.avatar) // This is the same as: const image = data?.avatar?.childImageSharp?.gatsbyImageData
Проблема здесь в том, что вы запрашиваете, не запрашивая
childImageSharp
ни
gatsbyImageData
. Ваш запрос должен выглядеть так:
export const pageQuery = graphql`
query og($id: String!) {
markdownRemark(id: { eq: $id }) {
html
frontmatter {
slug
title
image {
childImageSharp {
gatsbyImageData(
width: 200
placeholder: BLURRED
formats: [AUTO, WEBP, AVIF]
)
}
}
}
}
}
`
Тот факт, что позволяет вам запрашивать
image
без предупреждений или взлома кода, потому что он должен беспокоиться о внутренних узлах, заставляет меня думать, что ваша файловая система, возможно, не была правильно настроена, поэтому Гэтсби не может создавать узлы данных для изображений. Поэтому перед этим вы должны протестировать свой запрос на игровой площадке GraphiQL (
localhost:8000/___graphql
), чтобы убедиться, что вы запрашиваете обязательные узлы данных, в противном случае ваш
getSrc
никогда не будет работать, потому что он не содержит необходимых данных. Используйте что-то вроде:
{
resolve: `gatsby-source-filesystem`,
options: {
name: `blogImaghes`,
path: `${__dirname}/src/images/blog/`,
},
},