Files
NotionNext/pages/sitemap.xml.js

121 lines
3.1 KiB
JavaScript

// pages/sitemap.xml.js
import BLOG from '@/blog.config'
import { siteConfig } from '@/lib/config'
import { getGlobalData } from '@/lib/db/getSiteData'
import { extractLangId, extractLangPrefix } from '@/lib/utils/pageId'
import { getServerSideSitemap } from 'next-sitemap'
export const getServerSideProps = async ctx => {
let fields = []
const siteIds = BLOG.NOTION_PAGE_ID.split(',')
for (let index = 0; index < siteIds.length; index++) {
const siteId = siteIds[index]
const id = extractLangId(siteId)
const locale = extractLangPrefix(siteId)
// 第一个id站点默认语言
const siteData = await getGlobalData({
pageId: id,
from: 'sitemap.xml'
})
const link = siteConfig(
'LINK',
siteData?.siteInfo?.link,
siteData.NOTION_CONFIG
)
const localeFields = generateLocalesSitemap(link, siteData.allPages, locale)
fields = fields.concat(localeFields)
}
fields = getUniqueFields(fields);
// 缓存
ctx.res.setHeader(
'Cache-Control',
'public, max-age=3600, stale-while-revalidate=59'
)
return getServerSideSitemap(ctx, fields)
}
function generateLocalesSitemap(link, allPages, locale) {
// 确保链接不以斜杠结尾
if (link && link.endsWith('/')) {
link = link.slice(0, -1)
}
if (locale && locale.length > 0 && locale.indexOf('/') !== 0) {
locale = '/' + locale
}
const dateNow = new Date().toISOString().split('T')[0]
const defaultFields = [
{
loc: `${link}${locale}`,
lastmod: dateNow,
changefreq: 'daily',
priority: '0.7'
},
{
loc: `${link}${locale}/archive`,
lastmod: dateNow,
changefreq: 'daily',
priority: '0.7'
},
{
loc: `${link}${locale}/category`,
lastmod: dateNow,
changefreq: 'daily',
priority: '0.7'
},
{
loc: `${link}${locale}/rss/feed.xml`,
lastmod: dateNow,
changefreq: 'daily',
priority: '0.7'
},
{
loc: `${link}${locale}/search`,
lastmod: dateNow,
changefreq: 'daily',
priority: '0.7'
},
{
loc: `${link}${locale}/tag`,
lastmod: dateNow,
changefreq: 'daily',
priority: '0.7'
}
]
const postFields =
allPages
?.filter(p => p.status === BLOG.NOTION_PROPERTY_NAME.status_publish)
?.map(post => {
const slugWithoutLeadingSlash = post?.slug.startsWith('/')
? post?.slug?.slice(1)
: post.slug
return {
loc: `${link}${locale}/${slugWithoutLeadingSlash}`,
lastmod: new Date(post?.publishDay).toISOString().split('T')[0],
changefreq: 'daily',
priority: '0.7'
}
}) ?? []
return defaultFields.concat(postFields)
}
function getUniqueFields(fields) {
const uniqueFieldsMap = new Map();
fields.forEach(field => {
const existingField = uniqueFieldsMap.get(field.loc);
if (!existingField || new Date(field.lastmod) > new Date(existingField.lastmod)) {
uniqueFieldsMap.set(field.loc, field);
}
});
return Array.from(uniqueFieldsMap.values());
}
export default () => {}