Kyl*_*awa 7 javascript facebook-opengraph reactjs gatsby react-helmet
我已经使用以下代码在 React Helmet 中为我的根路由设置了社交共享图像:
<meta property="og:url" content="https://foo.com" />
<meta property="og:image" content="https://myhostedimg.png" />
Run Code Online (Sandbox Code Playgroud)
我有一个单独的路由,或 Gatsby 中的“页面”,我想为其设置另一个og:image值。由于没有任何链接og:image到og:url,我如何在我的页面上指定自定义og:url和og:image链接?
选项 1:您可以在主layout文件中进行路由嗅探,然后将两个道具(一个用于图像,一个用于路由)传递到控制元数据的任何组件中。
在此示例中,我的元数据组件已命名,metadata但无论您的组件结构是什么,它都应该有意义:
// Setup react stuff
import React from 'react'
import PropTypes from 'prop-types'
// Get your custom gatsby components - assuming a pretty basic layout here
import Metadata from '../components/Metadata'
import Header from '../components/Header'
import Footer from '../components/Footer'
// Get images you want, also assuming you have these in a static folder and you don't need to use `gatsby-image` to get them
import ogImgOne from './og-img-one.png'
import ogImgTwo from './og-img-two.png'
// Setup template wrapper
export default class TemplateWrapper extends React.Component {
// We want to render different base templates depending on the path the user hits
render() {
// Page 1
if (this.props.location.pathname === "/") {
return (
<div className="page1">
<Header />
<Metadata ogImgSrc={ ogImgOne }
ogUrl={ this.props.location.pathname } />
<div>
{ this.props.children() }
</div>
<Footer />
</div>
)
}
// Page 2
if (this.props.location.pathname === "/page-2/") {
return (
<div className="page2">
<Metadata ogImgSrc={ ogImgTwo }
ogUrl={ this.props.location.pathname } />
<Header />
<div>
{ this.props.children() }
</div>
<Footer />
</div>
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
选项 2 只是使用React Helmet,它包含在 Gatsby 开箱即用中(至少从 v2.x 开始)。在此设置中,您可以设置使用 Helmet 的元数据组件,然后在 Gatsby 页面中轻松覆盖这些预设。Helmet 只会覆盖您指定的元数据项,如果其他不需要调整,则保留其他项。只需Helmet在您的页面/组件中导入/调用即可轻松覆盖:
元数据.js:
import React from 'react'
import Helmet from 'react-helmet'
import icon from '../../images/logo.png'
import socialBanner from '../../images/PFB_2018_social.jpg'
const Metadata = () => (
<div>
<Helmet>
<title>Whatever</title>
<meta property='og:image' content={ socialBanner } />
<meta property='og:locale' content='en_US' />
<meta property='og:type' content='website' />
<meta property='og:title' content='Whatever' />
<meta property='og:description' content="Description" />
<meta property='og:url' content='https://example.org' />
<meta property='og:updated_time' content='2019-01-31' />
</Helmet>
</div>
)
export default Metadata
Run Code Online (Sandbox Code Playgroud)
页面example.js:
import React from 'react'
import Helmet from 'react-helmet'
export default class Example extends React.Component {
render() {
return (
<div>
{/* Custom metadata - assuming something coming from Node.js in pageContext prop */}
<Helmet>
<title>Override here</title>
{ /* Example from pageContext prop, gatsby-node.js */}
<meta property='og:title' content={ `${this.props.pageContext.title} | Your brand` } />
{ /* Image from gatsby-node.js example, using gatsby-image for override */}
<meta property='og:image' content={ this.props.pageContext.images[0].localFile.childImageSharp.fluid.src } />
{ /* Get path from location string */}
<meta property='og:url' content={ this.props.location.href } />
</Helmet>
</div>
)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4523 次 |
| 最近记录: |