官网开发中 0803
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import type { PageSeo } from '~/types/site';
|
||||
|
||||
/**
|
||||
* 页面 SEO 适配
|
||||
*
|
||||
* 从 dashboard 的 page-seo 配置读取 meta_title / meta_description / meta_keywords / og_image_url,
|
||||
* 应用到当前页面的 useHead;未配置时回退到全局 SEO 默认值或页面默认标题。
|
||||
*/
|
||||
export async function usePageSeo(pageType: string, entityId?: number, fallbackTitle?: string) {
|
||||
const { getPageSeo } = useSiteApi();
|
||||
const siteStore = useSiteStore();
|
||||
// 注意:本函数可能在 onMounted 等异步上下文中被调用,useI18n 要求 setup 顶层,
|
||||
// 这里改用全局 i18n 实例($i18n.t 跟随当前 locale,任意上下文安全)
|
||||
const i18n = (useNuxtApp() as unknown as { $i18n?: { t(key: string): string } }).$i18n;
|
||||
const t = (key: string) => i18n?.t(key) || key;
|
||||
|
||||
let seo: PageSeo | null = null;
|
||||
try {
|
||||
seo = await getPageSeo(pageType, entityId);
|
||||
} catch {
|
||||
seo = null;
|
||||
}
|
||||
|
||||
const title = seo?.meta_title || fallbackTitle || t('app.name');
|
||||
const description = seo?.meta_description || siteStore.seo?.meta_description || '';
|
||||
const keywords = seo?.meta_keywords || siteStore.seo?.meta_keywords || '';
|
||||
|
||||
useHead({
|
||||
title,
|
||||
meta: [
|
||||
...(description ? [{ name: 'description', content: description }] : []),
|
||||
...(keywords ? [{ name: 'keywords', content: keywords }] : []),
|
||||
...(seo?.og_image_url ? [{ property: 'og:image', content: seo.og_image_url }] : [])
|
||||
]
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user