diff --git a/blog.config.js b/blog.config.js index 79c15edb..f3ed4d7c 100644 --- a/blog.config.js +++ b/blog.config.js @@ -67,8 +67,11 @@ const BLOG = { BACKGROUND_DARK: '#000000', // use hex value, don't forget '#' SUB_PATH: '', // leave this empty unless you want to deploy in a folder - POST_URL_PREFIX: process.env.NEXT_PUBLIC_POST_URL_PREFIX || 'article', // POST类型文章的默认路径前缀,例如默认POST类型的路径是 /article/[slug] + POST_URL_PREFIX: process.env.NEXT_PUBLIC_POST_URL_PREFIX || 'article', + // POST类型文章的默认路径前缀,例如默认POST类型的路径是 /article/[slug] // 如果此项配置为 '' 空, 则文章将没有前缀路径,使用场景: 希望文章前缀路径为 /post 的情况 支持多级 + // 支援類似 WP 可自訂文章連結格式的功能:https://wordpress.org/documentation/article/customize-permalinks/,目前只先實作 %year%/%month%/%day% + // 例:如想連結改成前綴 article + 時間戳記,可變更為: 'article/%year%/%month%/%day%' POST_LIST_STYLE: process.env.NEXT_PUBLIC_PPOST_LIST_STYLE || 'page', // ['page','scroll] 文章列表样式:页码分页、单页滚动加载 POST_LIST_PREVIEW: process.env.NEXT_PUBLIC_POST_PREVIEW || 'false', // 是否在列表加载文章预览 diff --git a/lib/notion/getPageProperties.js b/lib/notion/getPageProperties.js index 0a328868..0ba6a3bd 100644 --- a/lib/notion/getPageProperties.js +++ b/lib/notion/getPageProperties.js @@ -77,7 +77,7 @@ export default async function getPageProperties(id, block, schema, authToken, ta mapProperties(properties) if (properties.type === BLOG.NOTION_PROPERTY_NAME.type_post) { - properties.slug = BLOG.POST_URL_PREFIX ? (BLOG.POST_URL_PREFIX + '/' + (properties.slug ?? properties.id)) : (properties.slug ?? properties.id) + properties.slug = (BLOG.POST_URL_PREFIX) ? generateCustomizeUrl(properties) : (properties.slug ?? properties.id) } else if (properties.type === BLOG.NOTION_PROPERTY_NAME.type_page) { properties.slug = properties.slug ?? properties.id } else if (properties.type === BLOG.NOTION_PROPERTY_NAME.type_menu || properties.type === BLOG.NOTION_PROPERTY_NAME.type_sub_menu) { @@ -147,3 +147,30 @@ function mapProperties(properties) { properties.status = 'Invisible' } } + +function generateCustomizeUrl(postProperties) { + let fullSlug = '' + const allSlugPatterns = BLOG.POST_URL_PREFIX.split('/') + allSlugPatterns.forEach((pattern, idx) => { + if (pattern === '%year%' && postProperties?.date?.start_date) { + const formatPostCreatedDate = new Date(postProperties?.date?.start_date) + fullSlug += formatPostCreatedDate.getUTCFullYear() + } else if (pattern === '%month%' && postProperties?.date?.start_date) { + const formatPostCreatedDate = new Date(postProperties?.date?.start_date) + fullSlug += String(formatPostCreatedDate.getUTCMonth() + 1).padStart(2, 0) + } else if (pattern === '%day%' && postProperties?.date?.start_date) { + const formatPostCreatedDate = new Date(postProperties?.date?.start_date) + fullSlug += String(formatPostCreatedDate.getUTCDate()).padStart(2, 0) + } else if (pattern === '%slug%') { + fullSlug += (postProperties.slug ?? postProperties.id) + } else if (!pattern.includes('%')) { + fullSlug += pattern + } else { + return + } + if (idx !== allSlugPatterns.length - 1) { + fullSlug += '/' + } + }) + return `${fullSlug}/${(postProperties.slug ?? postProperties.id)}` +}