DB Collegamenti Utili releasesself-updates
Gestisce bandi/PON e collegamenti utili (logo, descrittivo, allegati) e li mostra in home tramite un carosello accessibile che riusa il componente Bootstrap Italia del tema Design Scuola Italia. Shortcode: [db_collegamenti_utili].
by Davide Bertolino · github.com/dadebertolino/db-collegamenti-utili · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/dadebertolino/db-collegamenti-utili/releases/download/v1.2.0/db-collegamenti-utili-v1.2.0.zipShips its own WordPress updater (built-in updater), so new versions show up under Dashboard → Updates.
Readme
DB Collegamenti Utili
Plugin WordPress per gestire bandi/PON e collegamenti utili e mostrarli in home tramite un carosello accessibile. Pensato per siti scolastici che usano il tema Design Scuola Italia (Bootstrap Italia / linee guida AGID).
- Autore: Davide Bertolino — davidebertolino.it
- Licenza: GPL v2 o successiva
- Requisiti: WordPress 5.8+, PHP 7.4+
- Niente registrazioni, niente nag, niente trucchi.
Cosa fa
- Aggiunge un tipo di contenuto "Collegamenti utili" dove per ogni voce puoi inserire:
- Logo principale (immagine in evidenza) → mostrato nella pagina di dettaglio;
- Logo per il carosello (secondo logo) → mostrato in home;
- Testo alternativo (alt) obbligatorio per l'accessibilità;
- Descrittivo (editor: che cos'è il bando/PON);
- Link esterno opzionale (es. Comune, Scuola in Chiaro);
- Documenti allegati ripetibili con titolo, descrizione e data (lettera di candidatura, avviso, autorizzazione…);
- flag "Mostra nel carosello" e ordine.
- Genera una pagina di dettaglio in stile card Bootstrap Italia con la lista allegati scaricabili.
- Fornisce lo shortcode
[db_collegamenti_utili]per il carosello in home.
Shortcode
[db_collegamenti_utili]
Attributi opzionali:
| Attributo | Default | Descrizione |
|---|---|---|
titolo |
Collegamenti utili |
Titolo sopra il carosello (vuoto per nasconderlo). |
per_view |
3 |
Loghi visibili contemporaneamente su desktop (1–4). Scende a 2 sotto i 992px e a 1 sotto i 768px. |
autoplay |
true |
Scorrimento automatico. Attivo di default: per spegnerlo serve dirlo esplicitamente. |
intervallo |
5 |
Secondi fra uno scorrimento e l'altro quando autoplay è attivo (minimo 3). |
Per disattivare lo scorrimento automatico vanno bene autoplay="false", "no", "off", "0", "spento" o "falso": qualsiasi altro valore lo lascia acceso.
Esempi:
[db_collegamenti_utili titolo="COLLEGAMENTI UTILI"]
[db_collegamenti_utili titolo="COLLEGAMENTI UTILI" per_view="2" intervallo="8"]
[db_collegamenti_utili titolo="COLLEGAMENTI UTILI" autoplay="no"]
Nel carosello compaiono solo le voci con il flag "Mostra nel carosello" attivo, ordinate per il campo ordine.
Quando il carosello non scorre
Il carosello scorre se le voci pubblicate e spuntate sono più di quelle visibili insieme — e quante ne stanno insieme dipende dalla larghezza dello schermo: per_view su desktop, 2 sotto i 992px, 1 sotto i 768px.
Ne segue che lo stesso carosello può comportarsi diversamente a seconda del dispositivo. Con per_view="3" e 2 voci, per esempio, su desktop non c'è nulla da scorrere, mentre su telefono le pagine sono due. Quando alla larghezza corrente esiste una sola pagina il plugin nasconde frecce e pulsante di pausa e centra i loghi, invece di mostrare comandi che non rispondono; appena la finestra si stringe abbastanza, i comandi ricompaiono da soli.
Se vuoi lo scorrimento anche su desktop con poche voci, abbassa per_view.
Scorrimento automatico e accessibilità
Quando l'autoplay è attivo compare accanto alle frecce un pulsante pausa/riprendi, raggiungibile da tastiera. Non è un vezzo: il criterio WCAG 2.2.2 "Pause, Stop, Hide" è di livello A, il minimo richiesto ai siti della PA, e impone un comando esplicito per fermare qualsiasi contenuto che si muove da solo per più di cinque secondi. La pausa al passaggio del mouse da sola non basta.
È quel pulsante a rendere difendibile l'autoplay acceso di default: il criterio chiede che lo scorrimento si possa fermare, non che non ci sia. Se la pausa venisse rimossa, il default andrebbe riportato a spento.
Lo scorrimento si ferma inoltre da sé al passaggio del mouse e all'arrivo del focus da tastiera, non parte affatto per chi ha attivato la riduzione delle animazioni nel sistema operativo (prefers-reduced-motion), e resta fermo quando alla larghezza corrente c'è una sola pagina — così non gira un ciclo di animazione che non muove nulla.
Conformità (siti scolastici / PA)
- WCAG 2.1 AA: alt obbligatorio sui loghi, focus visibile da tastiera,
aria-labelsui link, autoplay disattivato di default, link esterni segnalati agli screen reader. - Riuso di Bootstrap Italia del tema Design Scuola Italia: nessuna libreria JS/CSS duplicata, aspetto coerente col resto del sito.
- Tracciabilità amministrativa: ogni allegato ha titolo, descrizione e data.
- Sicurezza: nonce, sanitizzazione, controllo capability su ogni salvataggio.
Installazione
- Carica lo ZIP da Plugin → Aggiungi nuovo → Carica plugin.
- Attiva.
- Crea le voci in Collegamenti utili.
- Inserisci
[db_collegamenti_utili]nella home.
Gli aggiornamenti arrivano automaticamente dalle Release GitHub (dadebertolino/db-collegamenti-utili).
Changelog
1.2.0
- Lo scorrimento automatico è ora attivo di default: si spegne solo dichiarandolo, con
autoplay="false"(oppureno,off,0,spento,falso). Prima andava acceso a mano ogni volta. Il default era conservativo per l'accessibilità, ma dalla 1.1.0 il carosello ha il pulsante di pausa richiesto dal criterio WCAG 2.2.2, che chiede di poter fermare lo scorrimento, non di non averlo. - L'interpretazione dell'attributo non usa
wp_validate_boolean(), che considera vero qualsiasi valore diverso dafalsee avrebbe quindi acceso lo scorrimento suautoplay="no"— un tranello per chi scrive lo shortcode a mano. - Lo scorrimento automatico resta fermo quando alla larghezza corrente esiste una sola pagina, invece di tenere vivo un ciclo su
requestAnimationFrameche non muove niente. Riparte da solo se la finestra si stringe abbastanza da rendere il carosello scorrevole. - Una pausa scelta dall'utente non viene più annullata quando il carosello passa allo stato senza scorrimento e vi ritorna.
1.1.1
- Correzione al comportamento introdotto nella 1.1.0 su schermi stretti. Se il carosello avesse o no qualcosa da scorrere veniva deciso in PHP confrontando le voci con
per_view, cioè con il valore desktop. Ma i breakpoint abbassano le colonne a 2 sotto i 992px e a 1 sotto i 768px: con 2 voci eper_view="3"il carosello è effettivamente fermo su desktop, mentre su telefono ha due pagine. Disattivando frecce e trascinamento a monte, su mobile le due voci restavano irraggiungibili e — per via del centraggio applicato al caso "statico" — venivano mostrate entrambe a metà, tagliate su tutti e due i lati. - Frecce e trascinamento sono ora sempre attivi e li governa Splide, che conosce il breakpoint corrente.
frontend.jsnasconde i comandi e centra i loghi solo quandoController.getEnd()dice che alla larghezza attuale esiste una sola pagina, ricalcolandolo a ogni ridimensionamento. - I comandi restano nascosti anche finché Splide non è stato montato, così su un tema senza Splide non compaiono frecce inerti.
- Aggiunta l'opzione
rewind, perché lo scorrimento automatico riparta dall'inizio anche quando il carosello non è in modalità ciclo.
1.1.0
- Il carosello ora funziona davvero. Nella 1.0.x non scorreva e le frecce erano inerti: il markup delegava l'inizializzazione al tema, ma l'inizializzatore di
bootstrap-italia.jslegge le classiit-carousel-*sull'elemento Splide, mentre il plugin le metteva sul wrapper padre. Non riconoscendo nulla, il tema montava Splide con tutte le opzioni aundefined(type,perPage,gap,arrows), da cui una sola slide a piena larghezza e i comandi bloccati. Il plugin monta ora Splide per conto proprio, con opzioni esplicite. - Rimosso l'attributo
data-bs-ride: apparteneva al carousel di Bootstrap 5, mentre il tema usa Bootstrap Italia 1.x (Bootstrap 4) e affida i caroselli a Splide. Era una leva scollegata da qualsiasi meccanismo. - L'elemento interno usa la classe
dbcu-splideinvece displide, cosìbootstrap-italia.jsnon vi monta sopra una seconda istanza. La libreria resta quella del tema: nessuna duplicazione. per_viewha finalmente effetto, con adattamento a 2 colonne sotto i 992px e a 1 sotto i 768px.- Nuovo attributo
intervalloper la cadenza dello scorrimento automatico. - Con
autoplay="true"compare un pulsante pausa/riprendi raggiungibile da tastiera, necessario per il criterio WCAG 2.2.2 (livello A). Aggiunto anche il rispetto diprefers-reduced-motion. - Quando le voci non superano quelle visibili insieme, il carosello diventa una riga statica centrata senza comandi, invece di mostrare frecce che non rispondono.
- Il titolo è collegato alla sezione con
aria-labelledbyinvece di essere ripetuto in unaria-label.
1.0.1
- Correzione importante all'aggiornatore.
after_install()non verificava che l'aggiornamento in corso riguardasse questo plugin: essendoupgrader_post_installun filtro globale, il codice interveniva sui file di qualsiasi plugin o tema aggiornato sul sito. Il file è ora allineato al componente condivisoDB_GitHub_Updater, che include il controllo su$hook_extra['plugin'], l'headerUser-Agentrichiesto dall'API GitHub, la cache dei fallimenti e la riattivazione del plugin dopo l'aggiornamento. - Pagina di dettaglio: i metadati degli allegati non generano più warning PHP né mostrano "0 B" quando il file non è più sul disco (spostato, rimosso o servito da CDN). L'estensione si ricava dall'URL, la dimensione viene omessa se non calcolabile.
- Carosello: rimosso l'
INNER JOINsulla postmeta introdotto dameta_key+meta_value_num, che escludeva le voci prive del campo ordine anche con il flag attivo. L'ordinamento avviene ora in PHP e le voci senza ordine valgono 0. - Testo alternativo del logo: la validazione non usa più l'attributo HTML5
required, che dentro Gutenberg poteva bloccare il salvataggio senza mostrare l'errore. Al suo posto un avviso in bacheca dopo il salvataggio. - Allegati: l'indice delle nuove righe usa un contatore progressivo invece di
Date.now(), che poteva collidere per righe aggiunte nello stesso millisecondo. - Allineato
db-admin-ui.cssal design system condiviso e corretti i riferimenti inadmin.css(--db-mutednon esiste nel design system, il token corretto è--db-text-muted).
1.0.0
- Prima versione pubblica.
Note sul tema
Il carosello riusa la libreria Splide che il tema Design Scuole Italia carica già (assets/js/splide.min.js), ma la inizializza per conto proprio con opzioni esplicite. Non ci si appoggia all'inizializzatore del tema, per tre motivi emersi leggendone il codice:
bootstrap-italia.jscerca le classiit-carousel-*sull'elemento Splide, non sul wrapper, e se non le trova monta comunque con ogni opzione aundefined;- per i caroselli a tre colonne passa
arrows: false, quindi le frecce del plugin non verrebbero mai collegate; - non prevede alcuna opzione di autoplay.
Nessuna libreria viene duplicata: se window.Splide non esiste — su un tema diverso, o se il tema cambia — il markup degrada a una lista statica di loghi, che resta perfettamente navigabile e accessibile.
Il tema espone anche un inizializzatore Owl Carousel per .it-carousel-wrapper, che si aspetta però un elemento .owl-carousel.it-carousel-all: è una strada diversa, non usata da questo plugin.
Read the full README on GitHub →