Added OG support

This commit is contained in:
2026-09-28 19:44:28 +02:00
parent cf6feefebc
commit 105c454d73
5 changed files with 95 additions and 10 deletions
+16 -1
View File
@@ -17,12 +17,27 @@ export type PageMetadata = {
url: string; url: string;
}[]; }[];
locale?: string; locale?: string;
/** Site/brand name for the OG card. */
siteName?: string;
title: string; title: string;
/** 'website' | 'article' etc. Defaults to 'website'. */
type?: string;
/** Canonical URL of this page. */
url?: string;
}; };
/** robots directives — set to noindex/follow for legal/thin/search pages. */ /**
* robots directives. Indexed pages get generous snippet/preview limits by
* default (Google shows richer results); noindex pages get index:false.
*/
robots?: { robots?: {
follow: boolean; follow: boolean;
index: boolean; index: boolean;
/** 'none' | 'standard' | 'large' — image preview size in results. */
'max-image-preview'?: 'large' | 'none' | 'standard';
/** Max text snippet length; -1 = no limit. Next maps to max-snippet. */
'max-snippet'?: number;
/** Max video preview seconds; -1 = no limit. */
'max-video-preview'?: number;
}; };
title: string; title: string;
}; };
+20 -4
View File
@@ -71,16 +71,32 @@ import { buildHreflangAlternates } from './hreflang.js';
...images && { ...images && {
images images
}, },
locale type: 'website',
locale,
...siteName ? {
siteName
} : {},
...canonical ? {
url: canonical
} : {}
}, },
// noindex → tell search engines to exclude the page but still follow links // robots: noindex pages are excluded (follow keeps link authority). Indexed
// (authority flows through). For legal/thin/search-result pages. // pages get generous snippet/preview limits so Google can show rich results
// (long snippets, large image previews, full video previews).
...meta?.noindex ? { ...meta?.noindex ? {
robots: { robots: {
follow: true, follow: true,
index: false index: false
} }
} : {} } : {
robots: {
follow: true,
index: true,
'max-image-preview': 'large',
'max-snippet': -1,
'max-video-preview': -1
}
}
}; };
} }
File diff suppressed because one or more lines are too long
+25
View File
@@ -843,6 +843,31 @@ const jsonLd = buildArticleJsonLd({
Dane z dokumentu/panelu. Google wymaga headline + dat dla rich result. Dane z dokumentu/panelu. Google wymaga headline + dat dla rich result.
## Robots — rich results (max-snippet, image/video preview)
Strony indeksowane dostają automatycznie dyrektywy pozwalające Google na bogate
wyniki (buildMetadata generuje):
- `max-snippet: -1` — pełnej długości snippet (bez limitu)
- `max-image-preview: large` — duży podgląd obrazu w wynikach
- `max-video-preview: -1` — pełny podgląd wideo
Strony noindex (polityki) dostają `index: false, follow: true` — bez powyższych.
Zero konfiguracji — działa automatycznie dla każdej strony przez createPageMetadata.
## Open Graph — pełne pola (type, siteName, url, description)
buildMetadata generuje kompletny OG dla social share (Facebook, LinkedIn, Slack):
- `og:title` — tytuł strony
- `og:description` — meta.description → fallback siteDescription (dziedziczy)
- `og:image` — defaultShareImage / obraz strony
- `og:type` — 'website'
- `og:site_name` — siteName z panelu
- `og:url` — canonical strony
- `og:locale` — język strony
Wszystko z panelu, automatycznie. Opis OG dziedziczy z meta.description (albo
globalnego siteDescription gdy pusty) — patrz niżej.
## Fallback meta description (siteDescription) ## Fallback meta description (siteDescription)
Strona bez `meta.description` → plugin używa globalnego `siteDescription` z Strona bez `meta.description` → plugin używa globalnego `siteDescription` z
+33 -4
View File
@@ -20,12 +20,27 @@ export type PageMetadata = {
description?: string description?: string
images?: { url: string }[] images?: { url: string }[]
locale?: string locale?: string
/** Site/brand name for the OG card. */
siteName?: string
title: string title: string
/** 'website' | 'article' etc. Defaults to 'website'. */
type?: string
/** Canonical URL of this page. */
url?: string
} }
/** robots directives — set to noindex/follow for legal/thin/search pages. */ /**
* robots directives. Indexed pages get generous snippet/preview limits by
* default (Google shows richer results); noindex pages get index:false.
*/
robots?: { robots?: {
follow: boolean follow: boolean
index: boolean index: boolean
/** 'none' | 'standard' | 'large' — image preview size in results. */
'max-image-preview'?: 'large' | 'none' | 'standard'
/** Max text snippet length; -1 = no limit. Next maps to max-snippet. */
'max-snippet'?: number
/** Max video preview seconds; -1 = no limit. */
'max-video-preview'?: number
} }
title: string title: string
} }
@@ -140,10 +155,24 @@ export function buildMetadata({
title, title,
...(description && { description }), ...(description && { description }),
...(images && { images }), ...(images && { images }),
type: 'website',
locale, locale,
...(siteName ? { siteName } : {}),
...(canonical ? { url: canonical } : {}),
}, },
// noindex → tell search engines to exclude the page but still follow links // robots: noindex pages are excluded (follow keeps link authority). Indexed
// (authority flows through). For legal/thin/search-result pages. // pages get generous snippet/preview limits so Google can show rich results
...(meta?.noindex ? { robots: { follow: true, index: false } } : {}), // (long snippets, large image previews, full video previews).
...(meta?.noindex
? { robots: { follow: true, index: false } }
: {
robots: {
follow: true,
index: true,
'max-image-preview': 'large' as const,
'max-snippet': -1,
'max-video-preview': -1,
},
}),
} }
} }