import { siteConfig } from '@/lib/config' import { useGlobal } from '@/lib/global' import Head from 'next/head' import { useRouter } from 'next/router' /** * 页面的Head头,通常有用于SEO * @param {*} param0 * @returns */ const GlobalHead = (props) => { const { children } = props let url = siteConfig('PATH')?.length ? `${siteConfig('LINK')}/${siteConfig('SUB_PATH', '')}` : siteConfig('LINK') let image const meta = getSEOMeta(props, useRouter(), useGlobal()) if (meta) { url = `${url}/${meta.slug}` image = meta.image || '/bg_image.jpg' } const title = meta?.title || siteConfig('TITLE') const description = meta?.description || siteConfig('DESCRIPTION') const type = meta?.type || 'website' const keywords = meta?.tags || siteConfig('KEYWORDS') const lang = siteConfig('LANG').replace('-', '_') // Facebook OpenGraph 要 zh_CN 這樣的格式才抓得到語言 const category = meta?.category || siteConfig('KEYWORDS') // section 主要是像是 category 這樣的分類,Facebook 用這個來抓連結的分類 return ( {title} {siteConfig('SEO_GOOGLE_SITE_VERIFICATION') && ( )} {siteConfig('SEO_BAIDU_SITE_VERIFICATION') && ()} {siteConfig('COMMENT_WEBMENTION_ENABLE') && ( <> )} {siteConfig('COMMENT_WEBMENTION_ENABLE') && siteConfig('COMMENT_WEBMENTION_AUTH') !== '' && ( )} {JSON.parse(siteConfig('ANALYTICS_BUSUANZI_ENABLE')) && } {meta?.type === 'Post' && ( <> )} {children} ) } /** * 获取SEO信息 * @param {*} props * @param {*} router */ const getSEOMeta = (props, router, global) => { const { locale } = global const { post, tag, category, page } = props const keyword = router?.query?.s switch (router.route) { case '/': return { title: `${siteConfig('TITLE')} | ${siteConfig('DESCRIPTION')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: '', type: 'website' } case '/archive': return { title: `${locale.NAV.ARCHIVE} | ${siteConfig('TITLE')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'archive', type: 'website' } case '/page/[page]': return { title: `${page} | Page | ${siteConfig('TITLE')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'page/' + page, type: 'website' } case '/category/[category]': return { title: `${category} | ${locale.COMMON.CATEGORY} | ${ siteConfig('TITLE') || '' }`, description: siteConfig('DESCRIPTION'), slug: 'category/' + category, image: siteConfig('HOME_BANNER_IMAGE'), type: 'website' } case '/category/[category]/page/[page]': return { title: `${category} | ${locale.COMMON.CATEGORY} | ${ siteConfig('TITLE') || '' }`, description: siteConfig('DESCRIPTION'), slug: 'category/' + category, image: siteConfig('HOME_BANNER_IMAGE'), type: 'website' } case '/tag/[tag]': case '/tag/[tag]/page/[page]': return { title: `${tag} | ${locale.COMMON.TAGS} | ${siteConfig('TITLE')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'tag/' + tag, type: 'website' } case '/search': return { title: `${keyword || ''}${keyword ? ' | ' : ''}${locale.NAV.SEARCH} | ${siteConfig('TITLE')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'search', type: 'website' } case '/search/[keyword]': case '/search/[keyword]/page/[page]': return { title: `${keyword || ''}${keyword ? ' | ' : ''}${locale.NAV.SEARCH} | ${siteConfig('TITLE')}`, description: siteConfig('TITLE'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'search/' + (keyword || ''), type: 'website' } case '/404': return { title: `${siteConfig('TITLE')} | 页面找不到啦`, image: siteConfig('HOME_BANNER_IMAGE') } case '/tag': return { title: `${locale.COMMON.TAGS} | ${siteConfig('TITLE')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'tag', type: 'website' } case '/category': return { title: `${locale.COMMON.CATEGORY} | ${siteConfig('TITLE')}`, description: siteConfig('DESCRIPTION'), image: siteConfig('HOME_BANNER_IMAGE'), slug: 'category', type: 'website' } default: return { title: post ? `${post?.title} | ${siteConfig('TITLE')}` : `${siteConfig('TITLE')} | loading`, description: post?.summary, type: post?.type, slug: post?.slug, image: post?.pageCoverThumbnail || siteConfig('HOME_BANNER_IMAGE'), category: post?.category?.[0], tags: post?.tags } } } export default GlobalHead