mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-14 07:26:52 +00:00
121 lines
3.1 KiB
JavaScript
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 () => {}
|