@php /** * Bloc SEO / GEO réutilisable (à inclure dans le ). * Paramètres optionnels : * $title, $description, $robots, $ogType, $image, $schemaType, * $published, $modified, $breadcrumb (array name/url), $faq (array q/a) */ $cfg = config('site'); $seoTitle = $title ?? $cfg['name'].' - '.$cfg['tagline']; $seoDesc = $description ?? $cfg['description']; $seoRobots= $robots ?? 'index, follow'; $ogType = $ogType ?? 'website'; // PNG et non WebP : tous les reseaux sociaux ne previsualisent pas encore // le WebP, et le logo JSON-LD doit rester lisible par tous les moteurs. $ogImage = isset($image) ? $image : asset('scrapbook/og-famille.jpg'); $type = $schemaType ?? 'WebPage'; $pub = $published ?? $cfg['published']; $mod = $modified ?? $pub; $url = url()->current(); $home = url('/'); // ── JSON-LD @graph (≥ 3 types : Organization + WebSite + WebPage/Article + BreadcrumbList) ── $org = [ '@type' => 'Organization', '@id' => $home.'/#org', 'name' => $cfg['publisher'], 'url' => $home, 'description' => $cfg['description'], 'logo' => asset('scrapbook/blason.png'), 'address' => [ '@type' => 'PostalAddress', 'addressLocality' => $cfg['locality'], 'addressRegion' => $cfg['region'], 'postalCode' => $cfg['postal'], 'addressCountry' => $cfg['country'], ], 'sameAs' => array_map(fn ($l) => $l['url'], $cfg['group_links']), ]; $website = [ '@type' => 'WebSite', '@id' => $home.'/#website', 'name' => $cfg['name'], 'url' => $home, 'description' => $cfg['description'], 'inLanguage' => 'fr-FR', 'publisher' => ['@id' => $home.'/#org'], ]; $webpage = [ '@type' => $type, '@id' => $url.'/#page', 'url' => $url, 'name' => $seoTitle, 'description' => $seoDesc, 'inLanguage' => 'fr-FR', 'isPartOf' => ['@id' => $home.'/#website'], 'datePublished' => $pub, 'dateModified' => $mod, 'author' => ['@type' => 'Person', 'name' => $cfg['author']], 'publisher' => ['@id' => $home.'/#org'], 'primaryImageOfPage' => $ogImage, ]; $graph = [$org, $website, $webpage]; // Fil d'ariane if (!empty($breadcrumb)) { $items = []; foreach ($breadcrumb as $i => $b) { $items[] = ['@type' => 'ListItem', 'position' => $i + 1, 'name' => $b['name'], 'item' => $b['url']]; } $graph[] = ['@type' => 'BreadcrumbList', '@id' => $url.'/#breadcrumb', 'itemListElement' => $items]; } // FAQPage (citabilité IA) if (!empty($faq)) { $qa = []; foreach ($faq as $item) { $qa[] = [ '@type' => 'Question', 'name' => $item['q'], 'acceptedAnswer' => ['@type' => 'Answer', 'text' => $item['a']], ]; } $graph[] = ['@type' => 'FAQPage', '@id' => $url.'/#faq', 'mainEntity' => $qa]; } $jsonld = ['@context' => 'https://schema.org', '@graph' => $graph]; @endphp {{ $seoTitle }} @if ($cfg['google_site_verification'])@endif @if ($cfg['bing_site_verification'])@endif {{-- Open Graph --}} {{-- Dimensions annoncées : les réseaux affichent la grande vignette sans attendre d'avoir téléchargé l'image pour en connaître le format. --}}