feat: favicon, webmanifest, og-default, improved SEO metadata + twitter cards + canonical
This commit is contained in:
+12
-1
@@ -19,16 +19,27 @@ export async function generateMetadata({ params }) {
|
||||
const { slug } = await params;
|
||||
const article = await getArticle(slug);
|
||||
if (!article) return { title: 'Статья не найдена' };
|
||||
const ogImages = article.cover_url
|
||||
? [{ url: article.cover_url.startsWith('http') ? article.cover_url : `https://zeropost.ru${article.cover_url}`, width: 1600, height: 900, alt: article.title }]
|
||||
: [{ url: 'https://zeropost.ru/og-default.png', width: 1200, height: 630 }];
|
||||
return {
|
||||
title: article.seo_title || article.title,
|
||||
description: article.seo_descr || article.excerpt,
|
||||
alternates: { canonical: `https://zeropost.ru/blog/${slug}` },
|
||||
openGraph: {
|
||||
title: article.title,
|
||||
description: article.excerpt,
|
||||
type: 'article',
|
||||
url: `https://zeropost.ru/blog/${slug}`,
|
||||
publishedTime: article.published_at,
|
||||
tags: article.tags || [],
|
||||
images: article.cover_url ? [{ url: article.cover_url }] : undefined,
|
||||
images: ogImages,
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: article.seo_title || article.title,
|
||||
description: article.seo_descr || article.excerpt,
|
||||
images: ogImages.map(i => i.url),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -7,12 +7,50 @@ export const metadata = {
|
||||
},
|
||||
description: 'Блог про практическое применение искусственного интеллекта. Промпты, инструменты, кейсы — без воды.',
|
||||
metadataBase: new URL('https://zeropost.ru'),
|
||||
keywords: ['искусственный интеллект', 'промпт-инжиниринг', 'ChatGPT', 'Claude', 'ИИ инструменты', 'автоматизация'],
|
||||
authors: [{ name: 'ZeroPost', url: 'https://zeropost.ru' }],
|
||||
creator: 'ZeroPost',
|
||||
publisher: 'ZeroPost',
|
||||
robots: {
|
||||
index: true,
|
||||
follow: true,
|
||||
googleBot: { index: true, follow: true },
|
||||
},
|
||||
openGraph: {
|
||||
type: 'website',
|
||||
locale: 'ru_RU',
|
||||
url: 'https://zeropost.ru',
|
||||
siteName: 'ZeroPost',
|
||||
title: 'ZeroPost — практические материалы про ИИ',
|
||||
description: 'Блог про практическое применение искусственного интеллекта. Промпты, инструменты, кейсы — без воды.',
|
||||
images: [
|
||||
{
|
||||
url: '/og-default.png',
|
||||
width: 1200,
|
||||
height: 630,
|
||||
alt: 'ZeroPost — практические материалы про ИИ',
|
||||
},
|
||||
],
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
title: 'ZeroPost — практические материалы про ИИ',
|
||||
description: 'Блог про практическое применение искусственного интеллекта. Промпты, инструменты, кейсы — без воды.',
|
||||
images: ['/og-default.png'],
|
||||
},
|
||||
icons: {
|
||||
icon: [
|
||||
{ url: '/favicon.svg', type: 'image/svg+xml' },
|
||||
{ url: '/favicon-16x16.png', sizes: '16x16', type: 'image/png' },
|
||||
{ url: '/favicon-32x32.png', sizes: '32x32', type: 'image/png' },
|
||||
],
|
||||
apple: [{ url: '/apple-touch-icon.png', sizes: '180x180' }],
|
||||
other: [
|
||||
{ rel: 'manifest', url: '/site.webmanifest' },
|
||||
],
|
||||
},
|
||||
alternates: {
|
||||
canonical: 'https://zeropost.ru',
|
||||
types: { 'application/rss+xml': '/rss.xml' },
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user