marketing

SEO meta dinamici + Open Graph

Gestione meta tag SEO per pagina (title, description, canonical, robots, hreflang) + Open Graph/Twitter Card + JSON-LD schema.org base (Organization, WebSite, BreadcrumbList, Article/Product/LocalBusiness/Event) con override per entità CMS, fallback intelligenti, preview SERP/social e sitemap.xml + robots.txt automatici.

Cosa fa questo modulo

Modulo «SEO meta dinamici + Open Graph»: layer trasversale che centralizza la generazione di tutti i meta tag SEO per pagina (`<title>`, `<meta name="description">`, `<link rel="canonical">`, `<meta name="robots">`, `<link rel="alternate" hreflang>`, `<link rel="prev|next">` paginazione), dei tag Open Graph Facebook/LinkedIn (`og:title`, `og:description`, `og:image`, `og:url`, `og:type`, `og:site_name`, `og:locale`, `article:published_time/author/section/tag`, `product:price:amount/currency` per ecommerce, `business:contact_data:*` per LocalBusiness), Twitter Card (`twitter:card=summary_large_image`, `twitter:site`, `twitter:creator`, `twitter:title/description/image`), e dei blocchi JSON-LD schema.org base (`Organization` con logo+sameAs social+contactPoint, `WebSite` con SearchAction sitelinks searchbox, `BreadcrumbList` auto-generato da route, `Article`/`NewsArticle`/`BlogPosting` per blog, `Product` + `Offer` + `AggregateRating` per ecommerce, `LocalBusiness`/`Restaurant`/`AutoRental`/`HealthAndBeautyBusiness`/`MedicalBusiness` per vetrine con address+geo+openingHoursSpecification+priceRange, `Event` per booking, `FAQPage` per pagine FAQ, `Service` per pagine servizio, `Person` per chi-siamo team, `Review` user-generated). Architettura: tabella `seo_meta` (id, model_type morph, model_id morph nullable, route_pattern string nullable per fallback per-route, locale, title, description, keywords nullable, canonical_override nullable, robots_index bool, robots_follow bool, robots_extras string es `max-snippet:-1,max-image-preview:large`, og_title nullable override, og_description nullable, og_image_path nullable upload custom, og_type enum `website`/`article`/`product`/`profile`/`book`/`video.movie`, twitter_card enum `summary`/`summary_large_image`/`player`/`app`, schema_type enum `Article`/`Product`/`LocalBusiness`/`Event`/`FAQPage`/`Service`/`auto`, schema_data_override JSON per merge custom, updated_by FK user, updated_at), tabella `seo_global_settings` (singleton per cliente/progetto: site_name, default_locale, default_og_image_path, organization_name+logo+sameAs JSON social URLs, contact_phone+email+address per Organization+LocalBusiness, default_twitter_handle, google_site_verification, bing_site_verification, facebook_app_id, default_robots_index bool, default_robots_follow bool, sitemap_changefreq enum, sitemap_priority float, hreflang_locales JSON `["it","en","fr"]` con URL prefix per locale), tabella `seo_redirects` (vecchio_url, nuovo_url, status_code 301/302/307/308, hit_count, created_at — utile per migrazioni o ristrutturazioni URL evitando 404 indicizzati). Pipeline rendering meta (middleware `InjectSeoMeta` + view composer `seo::partials.head` incluso in `layouts/app.blade.php` head): per ogni request 1) resolve modello bound alla route (es. `Post`, `Product`, `Page`, `Service`) via route model binding o esplicito `SeoMeta::for($model)`, 2) lookup `seo_meta` morph per `model_type`+`model_id`+`locale` corrente, 3) se assente lookup per `route_pattern` (es. `blog.index`, `shop.category.*`), 4) se assente fallback a `seo_global_settings` con template auto (`{model_title} | {site_name}` per title, primi 160 char di `model_excerpt` o stripped body per description, primo `og_image` da feature_image del modello, canonical = `url()->current()` normalizzato strip query params non-canonical, breadcrumb auto da route stack), 5) sanitize (title max 60 char raccomandato + truncate intelligente a parola intera, description max 160 char, escape HTML, normalize whitespace), 6) render via blade `<x-seo::head :meta="$seoMeta" :schema="$schema" />` che emette tutti i tag in ordine standard. Helper API fluente per controller: `SeoMeta::for($post)->title($post->seo_title)->description($post->excerpt)->ogImage($post->cover)->schema(Article::class, fn($s) => $s->author($post->author)->datePublished($post->published_at))->render()`. JSON-LD schema generator (classi `App\Seo\Schemas\OrganizationSchema`, `WebsiteSchema`, `BreadcrumbListSchema`, `ArticleSchema`, `ProductSchema`, `LocalBusinessSchema`, `EventSchema`, `FaqPageSchema`, `ServiceSchema`, `ReviewSchema`, `AggregateRatingSchema` — interfaccia `Schemable` con `toArray(): array` che ritorna struttura schema.org valida — wrapper `<script type="application/ld+json">` con JSON_UNESCAPED_SLASHES+JSON_UNESCAPED_UNICODE+JSON_PRETTY_PRINT in dev, minified in prod) con auto-detection contesto: route blog.* → Article auto da Post model, route shop.product.* → Product auto da Product model + Offer da price + AggregateRating da reviews, route page «contatti»/«dove siamo» → LocalBusiness auto da seo_global_settings address+geo+openingHours. Open Graph image: 1) lookup `og_image_path` esplicito su seo_meta, 2) fallback `feature_image` modello, 3) fallback `default_og_image_path` globale, 4) fallback auto-generated OG image via Browsershot/Spatie + template blade dedicato (`<x-seo::og-image-template :title="..." :subtitle="..." :brand-logo="..." />` rendering 1200×630 PNG con title+sottotitle+logo+gradient brand cliente, salvato in cache S3/local 30gg per URL canonical → endpoint `GET /og/{hash}.png` signed). Sitemap.xml automatica: comando `php artisan seo:generate-sitemap` con discovery automatica modelli (config `seo.sitemap.models = [Post::class, Product::class, Page::class, Service::class]` ognuno con `lastmod` da `updated_at`, `changefreq` da config per tipo, `priority` da config), generazione sitemap index + sitemap per tipo (`/sitemap.xml` index + `/sitemap-posts.xml`/`/sitemap-products.xml`/etc max 50.000 URL ciascuno per spec Google), inclusione `<image:image>` per og_image, `<xhtml:link rel="alternate" hreflang>` per multi-locale, esclusione URL con `robots_index=false` o noindex via canonical mismatch, esclusione paginazione duplicata (`?page=2`), gzip output `/sitemap.xml.gz`, ping automatico post-deploy Google/Bing (deprecato ufficialmente 2023 ma utile per IndexNow API Bing/Yandex), cron `schedule->daily()` rigenerazione + `schedule->hourly()` solo `lastmod` update se contenuto dinamico (news/blog). Robots.txt dinamico: route `/robots.txt` controller che emette righe da config + DB (`User-agent: *`, `Disallow: /admin`, `Disallow: /api`, `Disallow: /*?utm_*`, `Allow: /` , `Sitemap: {baseUrl}/sitemap.xml`, `Crawl-delay: 1` opt., per-bot rules es. blocco `GPTBot`/`CCBot`/`anthropic-ai`/`Claude-Web`/`Google-Extended` opt-in via flag config per clienti che non vogliono training LLM su contenuti), staging/dev environment auto-disallow tutto (`Disallow: /` se `APP_ENV != production`) per evitare indicizzazione preview. Admin UI: pagina `/admin/seo` con dashboard (audit punteggio SEO globale: % pagine con title custom, % con description, % con og_image, % con schema.org, pagine duplicate title, pagine title troppo lungo/corto, missing canonical, hreflang mismatch), editor inline per ogni entità CMS (tab «SEO» in form Post/Product/Page con campi title+description+og_image_upload+robots_toggle+schema_type_select + **preview live SERP Google desktop+mobile** con anteprima reale come appare in risultati + **preview Open Graph Facebook/LinkedIn/Twitter/WhatsApp/Telegram** con render card sociale + warning length counter (title 50-60 char ok / 30-49 warning / >60 truncate / <30 short, description 150-160 ok / >160 truncate / <100 short) + warning duplicati («questa description è già usata da altre 3 pagine»), gestione redirect (importer CSV `vecchio_url,nuovo_url,301` per migrazioni bulk + UI per add singolo), gestione hreflang per pagina (mapping URL EN/FR/DE), audit broken canonical (cron settimanale crawl interno + report 404/301 chain >2 hop), Schema.org JSON-LD validator preview (test contro Google Rich Results Test API + Schema.org validator structuredschema.org). Comandi artisan: `php artisan seo:generate-sitemap` (cron daily), `php artisan seo:audit` (report problemi: title duplicati, description mancanti, canonical broken, schema invalid, og_image mancante o <1200×630, hreflang inconsistente), `php artisan seo:warm-og-images` (pre-genera OG image auto per tutte le pagine senza upload custom), `php artisan seo:crawl-internal` (spider interno per detect 404+chain redirect+orphan pages senza link interni), `php artisan seo:check-rich-results {url}` (chiama Google Rich Results Test API per URL specifica), `php artisan seo:export-redirects` (export CSV per import in altri tool come Screaming Frog o per CDN edge redirects). Performance e Core Web Vitals: meta tag emessi inline in `<head>` no async, JSON-LD inline `<script>` no fetch esterno (peso medio 1-3KB per pagina), OG image lazy-cache 30gg con CDN, hreflang+canonical link nel head primi tag per crawler efficiency, prefetch DNS social CDN `<link rel="dns-prefetch" href="//connect.facebook.net">` opt., resource hints `<link rel="preconnect">` per Google Fonts se usati. Compliance e best practice: rispetto direttiva `noindex` su pagine duplicate/thin (es. risultati ricerca, tag pages, paginazione profonda >page 5), `nofollow` su link affiliati/UGC, `rel="sponsored"`/`rel="ugc"` per backlink commerciali/commenti, canonical self-referential default + override per pagine duplicate (es. desktop vs mobile-AMP, http vs https, www vs non-www), no canonical chain >1 hop, hreflang reciproco (se IT punta a EN, EN deve puntare a IT). Casi d'uso workspace: **Footility** (footility.com pagine `/`/`/agentic`/`/preventivi`/`/contatti` con LocalBusiness schema agenzia software + Service per ogni servizio + Organization per `footility` brand, OG image custom per ogni pagina con logo+claim+gradient brand), **Klabhouse** (klabhouse.com pagine `/`/`/corsi/{slug}`/`/insegnanti/{slug}` con Article auto per post blog + Course schema per corsi formazione con provider+educationalLevel+timeRequired+coursePrerequisites+offers, Person schema per insegnanti, LocalBusiness EducationalOrganization per scuola, OG image per corso con foto+titolo+prezzo), **Holiday Self Drive** (holidayselfdrive.com pagine veicoli con AutoRental + Vehicle schema per ogni mezzo `Product` + brand+model+vehicleEngine+seatingCapacity+vehicleTransmission+offers per prezzo giornaliero, LocalBusiness AutoRental, Service per noleggio breve/lungo, hreflang IT/EN per mercato turistico estero), **gestionali B2B** (Casarile/Altramusica/LB advisory: pagine prodotto `/funzionalita/{slug}` con Service + Product schema software, pagine `/case-study/{slug}` con Article + caso applicativo, OG image custom case study con screenshot dashboard), **the-body-code/realpilates** (HealthAndBeautyBusiness+Service per ogni corso pilates/yoga + Event schema per workshop/eventi + Person trainer + Review aggregate da clienti, OG image corso con foto sala), **mscarichi** (LocalBusiness MovingCompany+Service per `/scarichi-edili`/`/sgomberi-cantine`/`/trasporti-mobili` + AggregateRating recensioni Google + geo coordinate area servita, OG image con camion+claim+CTA), **prontointervento** (LocalBusiness Plumber/Electrician 24/7 + Service emergenza + areaServed cities + openingHoursSpecification 24/7 + telephone click-to-call, OG image emergency-ready). Multi-lingua hreflang: per Holiday Self Drive con prefix `/en/...` URL EN, autogenerazione `<link rel="alternate" hreflang="it" href="https://hsd.it/{path}">` + `hreflang="en" href="https://hsd.it/en/{path}">` + `hreflang="x-default" href="https://hsd.it/{path}">` reciproco bidirezionale, gestione fallback se traduzione mancante → noindex variante mancante invece di servire IT come EN. Estensioni roadmap: AI auto-generation meta (LLM legge contenuto pagina → genera title+description SEO-optimized rispettando length+keyword principale; modulo dedicato `/admin/seo/{model}/{id}/ai-suggest` con preview e accept admin), AI schema.org auto-detection (LLM legge pagina → detecta tipo entità → suggerisce schema appropriato), keyword research integrato (Google Search Console API import top query + CTR + position per pagina → suggerimento ottimizzazione title/H1), competitor analysis (input URL competitor → fetch meta+schema+OG → confronto vs nostre pagine), A/B test meta title/description (alterna varianti via cookie/IP-hash per 50/50 split → confronto CTR da GSC API → vincitore auto-promosso dopo significance statistica), AMP HTML generation auto per blog (`<link rel="amphtml">` + versione AMP-valid), monitoraggio GSC API (pull ogni 24h posizioni keyword + CTR + impressions per pagina + alert su drop >20%), integrazione Ahrefs/SEMrush API per backlink+keyword authority, generazione OG video MP4 per piattaforme che supportano (Twitter/Discord/Slack unfurl), Schema.org `Speakable` per voice search Google Assistant/Alexa, breadcrumb visual rendering automatico in template blade `<x-seo::breadcrumb>` allineato a schema BreadcrumbList. Differenze e relazioni con altri moduli: **#8053 cms-lite** include già «SEO base» (title+description+og_image per Page) — questo modulo formalizza lo strato come prodotto completo trasversale a tutti i modelli (non solo Page) con schema.org strutturato, sitemap auto, redirect, audit, preview, multi-locale, OG image generator; **#8183 meta-pixel-capi** è tracking eventi Facebook (Pixel+CAPI) — qui invece Open Graph per condivisioni sociali (no overlap, complementare); **#8196 google-analytics-4-consent-mode** è tracking analytics — qui SEO indicizzazione (no overlap); **#8104 form-contatti-lead** + **#8313 form-contatti-antispam** lead capture — pagine form beneficiano di schema ContactPage; **#8261 chatbot-assistant-faq-rag** può alimentare FAQPage schema con Q&A indicizzabili; **#8053 cms-lite** modello Page è target primario meta; **#8469 catalogo-prodotti** target Product schema; **#8534 booking-call-videocall** target Event schema slot prenotazione; **#8534/#8404** booking → Reservation/Event; **#8326 area-cliente-riservata** rotte private → `noindex` di default. Compliance GDPR: nessun dato personale in meta pubblici, OG image auto-generata non contiene dati sensibili (solo title+brand), schema Person solo per team pubblico con consenso, schema Review aggrega solo recensioni pubblicate dal cliente. Costo nuovo modulo (greenfield strato SEO strutturato): 0.5g migrazioni `seo_meta` morph + `seo_global_settings` + `seo_redirects` + indexes, 1g pipeline middleware `InjectSeoMeta` + view composer + helper fluente `SeoMeta::for()` con resolver morph+route+fallback + sanitize, 0.5g componente blade `<x-seo::head>` rendering tutti i tag in ordine standard + escape, 1g classi Schema.org generator (10+ tipi base Organization/WebSite/BreadcrumbList/Article/Product/LocalBusiness/Event/FAQPage/Service/Person/Review) + interfaccia Schemable + JSON-LD wrapper, 0.5g comando sitemap generator + index multi-file + hreflang + gzip + cron, 0.5g robots.txt dinamico controller + per-env logic + per-bot rules + LLM-crawler block opt-in, 1g admin UI editor SEO inline per entità CMS + preview SERP desktop+mobile + preview OG social (FB/LinkedIn/Twitter/WhatsApp) + warning length + duplicate detection, 0.5g dashboard audit SEO globale + report problemi, 0.5g OG image auto-generator Browsershot template blade + cache + endpoint signed, 0.5g comando seo:audit + seo:crawl-internal + seo:check-rich-results (Google API), 0.5g multi-locale hreflang management UI + reciprocità validation, 0.5g redirect manager UI + CSV import + chain detection, 0.5g testing E2E (render meta corretti per Post/Product/Page, schema.org valid via validator, sitemap valid XML, robots.txt corretto per env, redirect funzionanti, OG image generata correttamente, preview SERP allineata, hreflang reciproco). Costo riuso nuovo cliente (modulo pronto): 0.25g config seo_global_settings (site_name, logo, social, address, default og_image, hreflang locales), 0.25g audit iniziale pagine esistenti + bulk fill title/description mancanti via AI suggest, 0.25g custom OG image template brand cliente (colori+font+layout), 0.25g sitemap+robots verify in console Google Search + Bing Webmaster, 0.25g test schema.org via Rich Results Test su 5-10 pagine chiave, 0.25g redirect import se migrazione da vecchio sito. Dipendenze: Laravel 10/11, Spatie Browsershot opz. per OG image auto-generation (Puppeteer+Chrome headless), Spatie Sitemap opz. come base sitemap builder (o implementazione custom), Spatie Robots-Txt opz., Spatie Schema-Org opz. come base classi schema, intervention/image per ridimensionamento+ottimizzazione OG image, opz. Google Search Console API client per pull keyword/CTR, opz. Google Rich Results Test API, opz. Bing IndexNow API, opz. lib per AMP HTML validation, opz. lib per text length+keyword density analysis, opz. LLM API (#8261/#8222) per AI auto-suggest meta+schema, integrazione modelli CMS workspace (Post, Product, Page, Service, Event, Course, Vehicle, Activity) tramite interfaccia `HasSeoMeta` con metodi `seoTitle()`, `seoDescription()`, `seoImage()`, `seoSchemaType()`, `seoSchemaData()` da implementare opt. per override default.

Esempi d'uso

  • seo

Disponibile nei pacchetti