SEO: favicon metadata, Organization JSON-LD, favicon validation; R2 media (preconnect, generateFileURL per-collection), filename normalization
This commit is contained in:
+80
-1
@@ -247,4 +247,83 @@ const entries = await buildSitemapEntries({
|
||||
```
|
||||
|
||||
Przy dziesiątkach tysięcy URL-i Next ma `generateSitemaps` do dzielenia na
|
||||
części — dodasz, gdyby realnie było ich tyle. Jedna sitemapa wystarcza do ~50k.
|
||||
części — dodasz, gdyby realnie było ich tyle. Jedna sitemapa wystarcza do ~50k.
|
||||
|
||||
## Favicon w Google + Organization (branding w wyszukiwarce)
|
||||
|
||||
Favicon i structured data wpływają na to, jak strona wygląda w wynikach Google.
|
||||
Plugin generuje jedno i drugie z panelu — projekt tylko wpina w root layout.
|
||||
|
||||
### Favicon — dlaczego się nie pokazywał
|
||||
|
||||
Google ma twarde wymogi: `<link rel="icon">` w `<head>`, kwadratowy, **≥48×48px**,
|
||||
stały URL. Gdy projekt renderował favicon „po swojemu", często był za mały, źle
|
||||
otagowany albo nieobecny w head → Google go nie pokazywał. Plugin robi to teraz
|
||||
poprawnie.
|
||||
|
||||
### Wpięcie favicon (root layout)
|
||||
|
||||
Favicon jest GLOBALNY (ten sam wszędzie) — wpina się RAZ w root layout, nie per strona:
|
||||
|
||||
```tsx
|
||||
// app/(frontend)/[locale]/layout.tsx
|
||||
import type { Metadata } from 'next'
|
||||
import { buildIconsMetadata } from '@intecion/ipal-kit'
|
||||
import { getSettings } from '@/lib/payload'
|
||||
|
||||
export async function generateMetadata({ params }): Promise<Metadata> {
|
||||
const { locale } = await params
|
||||
const settings = await getSettings(locale)
|
||||
return buildIconsMetadata(settings.favicon) // z pola favicon (panel)
|
||||
}
|
||||
```
|
||||
|
||||
`buildIconsMetadata` generuje poprawne `icons` (favicon + apple-touch) z pola
|
||||
favicon. SVG → skaluje się; PNG → powinien być ≥48×48 (walidacja ostrzega, patrz niżej).
|
||||
|
||||
### Wymuszenie rozmiaru (walidacja)
|
||||
|
||||
Pole favicon w SiteSettings ma walidację `validateFaviconField` — ostrzega
|
||||
redaktora przy zapisie, jeśli favicon jest <48×48 albo nie kwadratowy. Redaktor
|
||||
widzi ostrzeżenie, zamiast po cichu wgrać favicon, którego Google nie pokaże.
|
||||
|
||||
### Organization JSON-LD (branding)
|
||||
|
||||
Pomaga Google powiązać stronę z marką (nazwa, logo) — lepsze wyświetlanie w
|
||||
wynikach, logo w knowledge panel.
|
||||
|
||||
```tsx
|
||||
// root layout — RAZ (Organization jest globalny)
|
||||
import { buildOrganizationJsonLd } from '@intecion/ipal-kit'
|
||||
|
||||
const jsonLd = buildOrganizationJsonLd({
|
||||
name: settings.siteName,
|
||||
url: process.env.NEXT_PUBLIC_SERVER_URL!,
|
||||
logo: settings.logo,
|
||||
sameAs: settings.socialLinks, // opcjonalne: profile społecznościowe
|
||||
})
|
||||
|
||||
// w JSX layoutu:
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
|
||||
/>
|
||||
```
|
||||
|
||||
Dane z panelu (siteName, logo) — nic na sztywno.
|
||||
|
||||
### Po wdrożeniu — cierpliwość z Google
|
||||
|
||||
Google **cache'uje favicon osobno i wolno** (dni, czasem tygodnie). Po poprawnym
|
||||
wpięciu favicon nie pojawi się natychmiast — Googlebot musi ponownie odwiedzić
|
||||
stronę główną. Przyspieszenie: Search Console → prośba o ponowne indeksowanie
|
||||
strony głównej. Sprawdź też, czy `/` nie blokuje Googlebota (robots) i czy
|
||||
favicon URL jest publiczny (nie za auth).
|
||||
|
||||
### Weryfikacja
|
||||
|
||||
1. Otwórz stronę → DevTools → Elements → `<head>` → sprawdź `<link rel="icon">`
|
||||
z poprawnym URL.
|
||||
2. Otwórz sam URL favicon w przeglądarce — obraz się pokazuje, ≥48×48.
|
||||
3. Rich Results Test (Google) — wklej URL strony, sprawdź Organization.
|
||||
4. Search Console → poproś o ponowne indeksowanie strony głównej.
|
||||
Reference in New Issue
Block a user