I have a Gatsby app setup.
src/
—images/foo.jpg // <— the img i want on my facebook shareable URL (og:image).
—images/ // <– note, there are loads of PNG files i’m using that seem to trip/default onto the FB image/share.
—assets/ // <— loads of SVGs i’m using that
—components/seo.js // component embedded at top of each page
—pages/index.js // page that uses <SEO />
Inside index.js:
function Home() {
return (
<React.Fragment>
<SEO />
Inside SEO:
const SEO = ({ title, description, image, article }) => {
const { pathname } = useLocation()
const { site } = useStaticQuery(query)
const {
defaultTitle,
titleTemplate,
defaultDescription,
siteUrl,
defaultImage, // <-- defaultImage is destructured from GQL result
twitterUsername,
} = site.siteMetadata
const seo = {
title: title || defaultTitle,
description: description || defaultDescription,
image: `${siteUrl}${image || defaultImage}`, // <--placed into object with path to it
url: `${siteUrl}${pathname}`,
}
return (
<Helmet title={seo.title} titleTemplate={titleTemplate}>
...
...
...
{seo.image && <meta property="og:image" content={seo.image} />}
{seo.image && <meta property="og:image:type" content="image/jpeg" />}
{seo.image && <meta property="og:image:alt" content="amazing cat" />}
...
</Helmet>
)
}
const query = graphql`
query SEO {
site {
siteMetadata {
defaultTitle: title
titleTemplate
defaultDescription: description
siteUrl: url
defaultImage: image // <-- default image
twitterUsername
}
}
}
`
in my config:
module.exports = {
siteMetadata: {
title: `Title Fine`,
description: `This is fine and coming through okay`,
url: `https://my-url.com`,
image: `/images/foo.jpeg`,
titleTemplate: `This is also fine`
},
Facebook debugger just keeps saying "https://my-url.com/images/foo.jpeg" could not be processed as an image because it has an invalid content type. But it is a JPEG. I’m citing it as a JPEG in my meta tags.
I’ve added in
{
resolve: `gatsby-source-filesystem`,
options: {
name: `images`,
path: `${__dirname}/src/images/`,
},
},
thinking maybe it just couldn’t find the file, but nothing’s changed.
If i do hit https://my-url.com/images/foo.jpeg – it doesnt load anything in the browser.
If i look in Dev Tools “sources” tab, i see /static/ folder and it’s not in there. But the other files from /images/ are.
I’m puzzled!
Does anyone know what i’m doing wrong? Or is there a tutorial / blog for Gatsby setup, that makes it clear how to get og:image and twitter cards working nicely?
Advertisement
Answer
Gatsby doesn’t know about this file, so it hasn’t been included in your build. If you want to include a file in your build that you haven’t explicitly imported or queried, you should add it to the ./static folder.
Adding assets outside of the module system
You can create a folder named static at the root of your project. Every file you put into that folder will be copied into the public folder. E.g. if you add a file named sun.jpg to the static folder, it’ll be copied to public/sun.jpg