content

Blog/news con tag e categorie

Modulo blog/news Laravel base: CRUD articoli con editor WYSIWYG, slug auto SEO-friendly, categorie gerarchiche + tag many-to-many, scheduling pubblicazione, draft/review/published workflow, hero image (gallery #8309), commenti opz. con moderazione, RSS/Atom feed, sitemap XML, archivio per anno/mese/categoria/tag/autore, ricerca full-text, paginazione, related posts, multilingua opz. (#8312), SEO meta (#8311), audit (#8330).

Hero Blog/news con tag e categorie

Cosa fa questo modulo

Modulo «Blog/news con tag e categorie»: scheda inventario del layer content/editoriale per pubblicare articoli, news aziendali, case study, comunicati, post di settore su qualunque sito o webapp del workspace. Architettura standard Laravel: tabelle `posts` (id, uuid, slug unique, locale, title, excerpt, body HTML/markdown, body_blocks JSON opz. per editor a blocchi tipo Gutenberg/EditorJS, hero_media_id FK gallery #8309, author_id FK users, status enum draft/in_review/scheduled/published/archived, published_at, scheduled_at, reading_time_min calc auto da word-count/200, view_count int counter, like_count opz., comments_count denorm, og_image_id opz. override SEO, canonical_url opt., featured_bool, sticky_bool pin in cima, allow_comments_bool, seo_meta JSON delegato a #8311, created_at/updated_at/deleted_at SoftDeletes), `categories` (id, slug unique per locale, name, description, parent_id self-FK gerarchia N-livelli con `kalnoy/nestedset` o adjacency-list, order_column, color hex opt., icon opt., cover_media_id opt., posts_count denorm), `tags` (id, slug, name, color, posts_count denorm), pivot `post_category` (post_id, category_id, is_primary_bool per categoria principale URL canonical), pivot `post_tag` (post_id, tag_id), `post_revisions` (post_id, body snapshot, author_id, created_at) per cronologia modifiche con diff e rollback, `post_translations` opz. (#8312) per locale alternativi (it/en/de/fr/es) con fallback. Editor admin: WYSIWYG Trix/TinyMCE/CKEditor/TipTap o block-based EditorJS/Gutenberg-clone con blocchi (heading/paragraph/list/quote/code/image-gallery via #8309/embed YouTube-Vimeo-Twitter/CTA button/separator/HTML raw/markdown), upload immagini inline drag&drop via #8309 (lazy-load + responsive srcset auto), counter parole/caratteri/reading-time live, slug auto da title con check uniqueness + edit manuale, breadcrumb categoria, picker tag con autocomplete + create-on-the-fly, preview live mobile/tablet/desktop side-by-side, save draft auto ogni 30s con WebSocket/SSE feedback, lock pessimistic (un editor alla volta su stesso post → notice «in modifica da Mario, riprova tra 5min»), revisione cronologia con diff side-by-side e rollback. Workflow editoriale: stato `draft` editore scrive, `in_review` invio a editor-in-chief per approvazione con notifica (#8312/#8313 mail), `scheduled` con `scheduled_at` futuro + job `PublishScheduledPost` cron */5min, `published` visibile pubblico, `archived` non in index ma URL ancora valido (no 404 SEO). Permessi via spatie/laravel-permission: ruoli `author` (CRUD propri post draft+in_review), `editor` (CRUD tutti post + publish + manage categories/tags), `admin` (full + delete + restore + manage authors). Frontend pubblico: URL canonical `/blog/{categoria-principale}/{slug}` configurabile (alternativi `/blog/{slug}` flat, `/{anno}/{mese}/{slug}` WordPress-style, `/news/{slug}`), redirect 301 da URL legacy via `post_redirects` table (slug change → preserva SEO ranking), homepage blog `/blog` con hero featured + grid sticky + grid recent paginato, archivio per categoria `/blog/categoria/{slug}` con sotto-categorie inline, per tag `/blog/tag/{slug}`, per autore `/blog/autore/{slug}` (profilo bio + foto + social), per anno/mese `/blog/2026/05`, ricerca `/blog/cerca?q=...` (Laravel Scout + Meilisearch/Algolia/TNTSearch per full-text it_IT con stemming, fallback `LIKE %q%` per setup minimal), filtri combinati categoria+tag+autore+periodo, paginazione 12 per pagina configurabile + infinite scroll opz., RSS feed `/blog/feed.xml` (formato RSS 2.0) e Atom `/blog/atom.xml` per aggregatori/Feedly, JSON feed `/blog/feed.json` per moderni, sitemap-news.xml dedicata per Google News opz., sitemap-posts.xml dentro sitemap index (#8311). Pagina singolo post: meta SEO (#8311) title/description/og:image (da hero o override) + Article schema.org JSON-LD (headline/author/datePublished/dateModified/image/articleBody/wordCount/keywords) + breadcrumb schema, hero immagine con LQIP responsive (#8309), TOC auto-generata da h2/h3 con anchor link + scrollspy highlight active, body con typography prose (Tailwind Typography o custom), code highlighting (Prism.js/highlight.js/Shiki) per blocchi `<pre><code>`, copy-to-clipboard button su code blocks, lightbox immagini inline (#8309), embed responsive iframe YouTube/Vimeo lazy via lite-youtube-embed (no autoplay tracker preload), share buttons (WhatsApp/Telegram/X/LinkedIn/Facebook/Email/copy-link con notifica) senza tracker (no widget esterni), related posts (3-6 articoli stessa categoria o tag overlap o ML similarity opz.), prev/next post navigation cronologica o stessa categoria, author bio card a fine post (foto/nome/ruolo/social/altri post), CTA newsletter (#8314 inline form), commenti opz. (vedi sotto), reading progress bar top sticky, estimated reading time mostrato. Commenti opz.: sistema integrato (`comments` table: post_id, parent_id self-FK threading, author_name/email/website ospiti o user_id, body, status enum pending/approved/spam/trash, ip_hash GDPR, user_agent, akismet_score opt. via API, created_at) con moderazione admin coda «in attesa» + bulk approve/spam, anti-spam honeypot + rate-limit IP + Akismet integration opt. + #8313 anti-spam reCAPTCHA/Cloudflare Turnstile riuso, notify autore su nuovo commento (mail), reply threading 1 livello configurabile, markdown safe (CommonMark + filtro HTML pulito via HTMLPurifier/ezyang), avatar Gravatar opt. con consenso utente GDPR (no hash MD5 email senza consenso post-2026 → identicon UI-Avatars fallback default), retention configurabile per cancellazione GDPR, export commenti utente DSAR. Alternative providers (no own table): Disqus/Commento.io/Remark42 embed opz. via config. SEO avanzato (delega #8311): canonical URL, og:image priority (override post → hero → first inline image → site default), Twitter Card summary_large_image, Article schema.org, sitemap entries con lastmod priority, hreflang multilingua (#8312), robots noindex per draft/scheduled/archived, Google News sitemap-news.xml con pubDate per articoli <48h. Performance: query con eager-load `categories`/`tags`/`author`/`heroMedia` per evitare N+1, cache Redis/Memcached per homepage/archivi/sidebar widgets (TTL 5-15min con tag-based invalidation on post update), ESI/fragment cache per «recent posts» widget riusato, full-page cache HTML statico per post pubblicati immutabili (TTL 1h, purge on edit), CDN edge cache (Cloudflare/BunnyCDN headers `Cache-Control: public, s-maxage=3600, stale-while-revalidate=86400`), lazy-load immagini #8309 native + iframe lite-embed, prefetch `<link rel="prefetch">` su hover next-post nav, critical CSS inline per ATF, deferred JS comments/share, AMP opz. roadmap (declinato no per default — Google deprecato 2024). Casi d'uso workspace: **Footility marketing** (blog tecnico architettura AI agentic, case study clienti, release notes prodotto, tutorial integrazione API, /blog/categoria/tutorial /blog/categoria/case-study /blog/categoria/release-notes — è proprio il blog di footility.com), **Klabhouse** (news scuola: nuovi corsi, eventi, recital fine anno, interviste insegnanti, calendario aperto pubblico, multilingua IT/EN per stranieri), **Holiday Self Drive** (blog viaggi: itinerari camper Italia/Europa, guide destinazioni, recensioni clienti, news fiere settore, SEO local per «noleggio camper {città}»), **Gestionale Casarile** (news B&B: eventi locali Casarile/Milano, ricette stagionali, news struttura aggiornamenti, lingua IT/EN ospiti stranieri), **Gestionale Altramusica** (news scuola musica: saggi, concorsi, masterclass docenti ospiti, recensioni allievi), **mscarichi** (news azienda: nuovi servizi spurgo, interventi rilevanti zone servite Milano/Monza/Brianza, certificazioni acquisite, tariffe stagionali, SEO local), **prontointervento** (news 24/7: aggiornamenti tariffe pronto intervento, copertura nuove zone, partnership condomini/amministratori), **the-body-code/realpilates** (blog wellness: esercizi pilates, articoli salute schiena, testimonial pazienti consenso GDPR, news studio, formazione trainer), **TMK/LB advisory** (news studio: aggiornamenti normativi fiscali, scadenze, articoli divulgativi clienti, area riservata #8326 newsletter pro), **Footility chat agentic** (knowledge base interna articoli «how-to operatori», release notes funzionalità, post-mortem incidenti — privata #8326). Compliance e privacy: GDPR commenti (consenso esplicito storage email, retention configurabile, DSAR export/delete), cookie banner (#8310) per Disqus/Akismet/CDN se esterni, anonymize IP hash, copyright notice footer, license articoli configurabile (all rights reserved / CC BY / CC BY-SA), credit autore obbligatorio per repubblicazione, no tracking lettori senza consenso (analytics #8004 GA4 consent mode), retention articoli archiviati permanente con redirect 301 se URL cambia. Editoria avanzata opz.: bozze condivise URL token (preview pre-pubblicazione per cliente/editor-in-chief senza login), embed code generato per altri siti (riuso post via iframe widget con back-link), API REST headless (`GET /api/posts`, `/api/posts/{slug}`, `/api/categories`, `/api/tags`, `/api/feed.json`) per consumo da app mobile/SPA/Jamstack, webhooks on-publish/update (#8324 trigger sync sistemi terzi: Slack notifica team, Mailchimp/Brevo campagna auto, social-media auto-post via Buffer/Hootsuite API), import/export WordPress WXR XML (migrazione blog legacy), import RSS bulk (curation feed terzi → draft auto), markdown export per backup git-friendly. Estensioni roadmap: AI assist scrittura (#8261 «riscrivi paragrafo», «genera excerpt», «suggerisci titolo SEO», «trova categoria», «traduci IT→EN»), AI SEO score (#8311 + AI «keyword density», «leggibilità Flesch», «meta description suggerita»), AI immagine generata DALL-E/Stable Diffusion per hero auto-generato da titolo, AI auto-tagging (vision su immagini + NLP su body → tags+categoria suggeriti), commenti AI moderazione (sentiment + toxic content detection auto-spam), trending posts (`view_count` + tempo decay → widget «più letti settimana»), reading progress salvato per utente loggato (#8326 «riprendi lettura»), bookmark/favorites utente, like/applause anonymous, mailing list auto-digest settimanale (#8314 condensa post settimana → newsletter automatica), serializzazione (post in serie multi-part «Parte 1 di 5» con next/prev link forte), podcast/audio narration TTS auto (ElevenLabs/OpenAI TTS → mp3 inline player), versioning post pubblici (changelog visibile «aggiornato il...» con elenco modifiche), A/B testing titoli/hero per CTR, paywall opz. (#8320 abbonamento per accedere a post premium), comments threading multi-livello con voto upvote/downvote, glossario auto-link (parole tecniche → tooltip definizione). Differenze e relazioni: **#8053 cms-lite** è il CMS generico pagine statiche; questo modulo è specificamente blog/news editoriale con flusso editoriale strutturato, categorie/tag, archivi temporali, RSS — cms-lite gestisce «pagine» (chi-siamo/servizi/contatti), blog-news gestisce «contenuti datati» (articoli/news); possono coesistere stesso sito; **#8311 seo-meta-dinamici-open-graph** è dipendenza per meta tag e schema.org; **#8309 gallery-immagini-upload-s3-locale** è dipendenza per hero + immagini inline; **#8310 cookie-banner-consent-log-gdpr** per consenso analytics/commenti esterni; **#8312 multilingua-base-it-en** per traduzioni post/categorie/tag; **#8314 newsletter-signup-brevo-mailchimp** per CTA inline + digest automatico post settimana; **#8313 form-contatti-antispam** condivide engine anti-spam per commenti; **#8330 audit-log-azioni-utente** logga publish/unpublish/edit/delete con diff body; **#8327 crud-generico-anagrafiche-livewire** admin posts/categories/tags potrebbe usare datatable generica; **#8328 export-excel-pdf** export elenco articoli/commenti CSV/PDF per report editoriali; **#8261 chatbot-rag** può ingestare blog come knowledge source per Q&A clienti; **#8326 area-cliente-riservata** per blog «membri-only» con paywall; **#8324 webhooks** trigger on-publish per integrazioni esterne; **#8329 importer-csv-preview-mapping** import bulk articoli legacy da WordPress export/CSV; **#8323 calendario-disponibilita** non rilevante; **#8316 booking-call** non rilevante. Casi limite/edge: slug duplicato → append `-2`/`-3` auto o forza univocità con uuid suffisso, slug change su post pubblicato → registra redirect 301 in `post_redirects`, locale change su categoria → mantieni mapping vecchio slug → nuovo, post pubblicato con data futura → forza scheduled (mai retroattivo «publish past» senza override admin), cancellazione categoria con posts associati → blocca o move-to-default con conferma, cancellazione tag → cleanup pivot, body HTML XSS → sanitize HTMLPurifier whitelist tag/attr permessi (no `<script>`/`<iframe>` salvo embed whitelist YouTube/Vimeo via shortcode), markdown injection HTML raw → opzione editor «raw HTML permesso solo per admin», immagine inline broken → fallback placeholder + warning admin edit, commento spam massivo → rate-limit IP + Cloudflare Turnstile + Akismet, post lunghissimo (50k parole) → editor performance lag → switch automatico textarea raw, revisione storica 500+ versioni → garbage collection auto (mantieni ultime 20 + 1 al giorno + 1 al mese), feed RSS con N>100 post → limita ultimi 50 con `<link rel="next">` paginazione, ricerca query SQL injection → sanitize + Scout binding, race su `view_count` → atomic increment, hreflang errato multilingua → validation cross-link, immagine hero mancante → fallback site default cover (#8309), URL canonical loop → check redirect chain max 3, embed YouTube privato → fallback poster, sitemap >50k entries → split in shards sitemap-posts-1.xml/sitemap-posts-2.xml. Costo nuovo modulo (greenfield): 0.25g install + migrazioni (`posts`/`categories`/`tags`/pivot/`post_revisions`/`post_redirects`/`comments`) + factory/seeder demo, 0.5g model+relations Eloquent (HasMany/BelongsToMany/MorphTo author polimorfico opz.) + scopes (`published`/`draft`/`scheduled`/`featured`) + observers (slug auto, reading_time calc, scheduled job), 0.75g admin CRUD posts (Livewire/Filament/Nova-like) + editor WYSIWYG/blocks + save-draft auto + revision diff + slug check + tag picker autocomplete + scheduling picker + permissions spatie, 0.5g admin CRUD categories gerarchiche tree drag&drop nestedset + bulk + reorder, 0.5g admin CRUD tags + merge tag (consolida tag simili) + bulk delete orphan, 0.5g workflow stati editoriali (draft→review→scheduled→published→archived) + notifiche mail/in-app, 0.5g job `PublishScheduledPost` cron + `PostUpdated` event + cache invalidation tag-based, 0.5g frontend index `/blog` + archivi categoria/tag/autore/anno-mese + paginazione + filtri combinati, 0.75g frontend single post + TOC + code highlight + share buttons + related posts + breadcrumb + schema.org JSON-LD + author card + CTA newsletter, 0.5g ricerca full-text (Scout + Meilisearch o TNTSearch) + UI ricerca + risultati paginati, 0.5g feed RSS/Atom/JSON + sitemap-posts + sitemap-news + robots.txt entry, 0.5g commenti integrati (model + moderazione + threading + anti-spam + Akismet opz. + mail notify autore), 0.5g componenti blade riusabili (`<x-blog-card>`, `<x-blog-grid>`, `<x-blog-sidebar>`, `<x-post-share>`, `<x-post-toc>`, `<x-author-bio>`), 0.5g performance cache fragment/page + CDN headers + lazy-load image #8309 + critical CSS, 0.5g integrazione #8311 SEO meta dinamici per ogni post/categoria/tag, 0.5g integrazione #8309 gallery hero+inline, 0.5g API REST headless + webhooks on-publish, 0.5g testing E2E (CRUD post, scheduling, slug change redirect, ricerca, paginazione, feed RSS valido, commenti moderazione, multi-locale fallback). Costo riuso nuovo cliente (modulo pronto): 0.25g seed categorie iniziali + tag baseline cliente, 0.25g brand styling componenti blog (colori, typography, hero layout), 0.25g import bulk legacy (WordPress WXR/CSV via #8329 o `posts:import-wordpress`), 0.25g configurazione URL pattern (flat vs categoria-prefix vs anno-mese), 0.25g integrazione newsletter cliente specifico (#8314 form CTA), 0.25g test happy path (crea post → pubblica → SEO check → commenta → ricerca → feed RSS validator). Dipendenze: Laravel 10/11, `spatie/laravel-permission` ^6 (ruoli editoriali), `kalnoy/nestedset` ^6 o `staudenmeir/laravel-adjacency-list` per categorie gerarchiche, `cviebrock/eloquent-sluggable` ^11 (slug auto unique-aware locale-aware), editor WYSIWYG (Trix nativo Laravel o TinyMCE/CKEditor/TipTap/EditorJS opz.), `laravel/scout` ^10 + Meilisearch/Algolia/TNTSearch driver (ricerca full-text), `league/commonmark` ^2 (markdown parsing) o HTMLPurifier (sanitize body), `spatie/laravel-sitemap` ^7 (sitemap-posts/sitemap-news), `spatie/laravel-feed` ^4 (RSS/Atom feed), `spatie/laravel-tags` ^4 (tag polimorfico opz. alternativa a tabella custom), `prismjs` o `shiki` per code highlight client, `lite-youtube-embed`/`lite-vimeo` per embed performance, opz. `akismet/akismet` o wrapper PHP per anti-spam commenti, opz. integration #8309 gallery, #8310 cookie banner, #8311 SEO meta, #8312 multilingua, #8313 anti-spam, #8314 newsletter, #8330 audit log, #8329 importer CSV, #8261 chatbot RAG/AI assist, Livewire 3 o Vue 3 + Alpine.js per admin UI editor + autosave WebSocket/SSE.

Esempi d'uso

  • content