[et_pb_section fb_built="1" _builder_version="4.27.5" _module_preset="default" global_colors_info="{}"][et_pb_row _builder_version="4.27.5" _module_preset="default" column_structure="1_2,1_2"][et_pb_column _builder_version="4.27.5" _module_preset="default" type="1_2"][et_pb_button button_text="Download plugin" _builder_version="4.27.5" _module_preset="default" hover_enabled="0" sticky_enabled="0" button_url="https://freelance.digita.org/wp-content/uploads/2026/02/sg-ajax-debug-test.zip" url_new_window="on" button_alignment="center" custom_button="on" button_icon="||fa||900"][/et_pb_button][/et_pb_column][et_pb_column _builder_version="4.27.5" _module_preset="default" type="1_2"][et_pb_button button_text="Assistenza" _builder_version="4.27.5" _module_preset="default" button_url="https://freelance.digita.org/areaclienti/" hover_enabled="0" sticky_enabled="0" button_alignment="center" custom_button="on" button_icon="||divi||400"][/et_pb_button][/et_pb_column][/et_pb_row][et_pb_row _builder_version="4.27.5" _module_preset="default" global_colors_info="{}"][et_pb_column type="4_4" _builder_version="4.27.5" _module_preset="default" global_colors_info="{}"][et_pb_text _builder_version="4.27.5" _module_preset="default" global_colors_info="{}"]

Se hai mai visto un errore “critico” in WordPress, una schermata bianca, un’area admin lenta o chiamate AJAX che falliscono senza un motivo chiaro,
molto spesso il colpevole non è admin-ajax.php in sé… ma qualcosa che stampa output inatteso oppure un plugin che va in crash durante l’inizializzazione.
In questa pagina ti spiego un test semplice, replicabile e “community-friendly” per diagnosticare il problema in modo pulito.

Obiettivo: verificare che wp-admin/admin-ajax.php risponda con JSON pulito e individuare subito se qualche plugin/tema
sta “sporcando” l’output (es. Deprecated, Notice, echo accidentali) o causando errori in fase di bootstrap.

Cos’è admin-ajax.php e perché è così importante

In WordPress, admin-ajax.php è un endpoint usato per gestire richieste AJAX, cioè chiamate “in background” che aggiornano dati senza ricaricare la pagina.
Lo usano plugin, temi, page builder (come Elementor), sistemi di sicurezza (come Wordfence) e anche plugin custom.

Quando tutto funziona, admin-ajax.php restituisce risposte pulite. Ma se qualcosa va storto, può succedere che:

  • il JSON venga “rotto” da output stampato prima della risposta (Deprecated/Notice/Warning);
  • un plugin vada in fatal error durante admin_init o hook simili;
  • la chiamata AJAX torni 200 ma con contenuto non valido (e in JS sembra “misteriosamente” tutto rotto).

Il nostro “AJAX Test”: cosa fa e cosa controlla

Abbiamo creato un piccolo plugin di test, pensato per essere:
semplice, sicuro (solo admin), ripetibile e soprattutto utile per segnalazioni in community o in ticket.

Verifica 1: risposta JSON pulita

Il plugin fa una chiamata a admin-ajax.php con un’azione dedicata e controlla se la risposta è un JSON valido.
Se il JSON è valido: bene.
Se non è valido: quasi sempre c’è output “sporco” prima del JSON (es. righe “Deprecated:”).

Verifica 2: rilevamento output indesiderato

Il plugin cattura qualsiasi output involontario e mostra un’anteprima (garbage_preview),
così sai immediatamente se e cosa sta rompendo le risposte AJAX.

Verifica 3: log per assistenza

Oltre all’output in pagina, il plugin scrive log (error_log / debug.log) con:
versione PHP, versione WP, ID utente, e segnalazione “OUTPUT_GARBAGE_DETECTED” quando serve.
È materiale perfetto da allegare a un ticket o a un post in community.

Come usare il test (passi rapidi)

  1. Installa e attiva il plugin di test.
  2. Vai in Bacheca → Strumenti → AJAX Debug Test.
  3. Premi Esegui test AJAX.
  4. Se vedi success: true → la pipeline AJAX è sana.
    Se vedi success: false e un garbage_preview → c’è output indesiderato.

Consiglio pratico: in produzione evita di mostrare errori a schermo.
Anche quando non sono “fatal”, i Deprecated stampati in output possono rompere JSON e API.

define('WP_DEBUG', true);define('WP_DEBUG_LOG', true);define('WP_DEBUG_DISPLAY', false);@ini_set('display_errors', 0);

Quando un “Deprecated” diventa un problema reale

Un messaggio Deprecated non è un errore fatale: indica che una funzione o un comportamento verrà rimosso in futuro.
Il problema nasce quando viene stampato a schermo durante una risposta JSON o REST:
la risposta non è più “pulita”, quindi il frontend non riesce a parsare correttamente i dati.

In questi casi la soluzione migliore è:

  • non mostrare errori a schermo (log sì, display no);
  • mantenere versioni PHP stabili e compatibili (es. 8.2/8.3);
  • aggiornare plugin/tema che non sono ancora “puliti” sulle versioni più nuove di PHP.

Segnalazioni e miglioramenti: rendiamolo perfetto insieme

Questo test nasce per essere utile anche ad altri: più feedback riceviamo, più lo rendiamo preciso.
Se vuoi aiutarci a migliorarlo, puoi inviare una segnalazione con:

  • risultato del test (JSON completo);
  • versione PHP, WordPress e tema attivo;
  • lista dei plugin principali (Elementor/Yoast/Wordfence ecc.);
  • estratto di log con “OUTPUT_GARBAGE_DETECTED” se presente.

Obiettivo community: arrivare a una versione del test che, oltre a rilevare “garbage”, aiuti anche a capire chi lo produce:
ad esempio indicando se il problema appare solo con un certo plugin attivo o in una certa versione di PHP.

Apri un ticket in assistenza (sezione Plugin WordPress)

Se vuoi che analizziamo il tuo caso in modo ordinato, apri un ticket in assistenza nella sezione Plugin WordPress.
Nel messaggio, incolla questi dati:

  • URL del sito (o ambiente staging)
  • Risultato del test (output JSON)
  • PHP / WP / Tema
  • Plugin coinvolti (es. Elementor, Wordfence, Yoast, Premium Addons…)
  • Log (debug.log o error_log) con data/ora

Nota: se il sito è in “recovery mode”, indicacelo nel ticket: in quei casi la priorità è ripristinare accesso e stabilità prima di ottimizzare.

FAQ: domande frequenti sul test admin-ajax

Se il test è OK, posso escludere admin-ajax come causa?

Sì: se il test restituisce JSON pulito e non rileva output spazzatura, la pipeline AJAX è sana.
In caso di problemi reali, la causa è più spesso un plugin specifico, un hook, o un fatal in fase di bootstrap.

Perché in alcuni casi vedo errori in admin-ajax e in altri no?

Perché può dipendere da versione PHP, plugin aggiornati/non aggiornati, cache, oppure impostazioni server (display_errors).
Per questo il test include versioni e log: così si ragiona su dati oggettivi.

Meglio admin-ajax o REST API?

Per progetti moderni, spesso la REST API è più pulita e scalabile.
Ma admin-ajax resta usato da tantissimi plugin: l’importante è che sia stabile e non “sporco”.

Cosa devo allegare in un ticket se il test fallisce?

Incolla l’output JSON del test, indica PHP/WP/tema e i plugin principali, e aggiungi un estratto di log con data/ora.
Se c’è garbage_preview, incollalo: spesso basta quello per capire subito la causa.

Conclusione

Questo test nasce da un caso reale: errori critici, plugin che interagiscono tra loro e differenze tra versioni PHP.
L’idea è semplice: prima rendiamo misurabile il problema, poi lo risolviamo con sicurezza.
Se vuoi contribuire, invia una segnalazione o apri un ticket: miglioriamo il tool insieme.

 



[/et_pb_text][/et_pb_column][/et_pb_row][et_pb_row _builder_version="4.27.5" _module_preset="default" column_structure="1_2,1_2"][et_pb_column _builder_version="4.27.5" _module_preset="default" type="1_2"][et_pb_button button_text="Download plugin" _builder_version="4.27.5" _module_preset="default" hover_enabled="0" sticky_enabled="0" button_url="https://freelance.digita.org/wp-content/uploads/2026/02/sg-ajax-debug-test.zip" url_new_window="on" button_alignment="center" custom_button="on" button_icon="||fa||900"][/et_pb_button][/et_pb_column][et_pb_column _builder_version="4.27.5" _module_preset="default" type="1_2"][et_pb_button button_text="Assistenza" _builder_version="4.27.5" _module_preset="default" button_url="https://freelance.digita.org/areaclienti/" hover_enabled="0" sticky_enabled="0" button_alignment="center" custom_button="on" button_icon="||divi||400"][/et_pb_button][/et_pb_column][/et_pb_row][/et_pb_section]

[osm_map height=”460px” markers=”41.9028,12.4964|45.4642,9.1900|40.8518,14.2681″ titles=”Roma|Milano|Napoli” cluster=”1″]

Vuoi inserire mappe OpenStreetMap in WordPress con più pin, clustering numerico, popup HTML e asset locali (no CDN)? OSM Multi Pin Shortcode è un plugin leggero basato su Leaflet e MarkerCluster, pensato per performance, compatibilità e conformità alle regole della WordPress.org Plugin Directory. Indice

  1. Perché scegliere OSM Multi Pin Shortcode
  2. Installazione e requisiti
  3. Shortcode e attributi (tabella completa)
  4. Esempi pronti
  5. Best practice performance e SEO
  6. Troubleshooting: mappa grigia, JSON non valido & co.
  7. Conformità WordPress.org e licenze
  8. Scarica e inizia

Perché scegliere OSM Multi Pin Shortcode

  • Multi-pin e cluster numerici: gestisci centinaia di marker con raggruppamenti chiari quando l’utente è zoom-out.
  • Popup HTML sanificati: formattazione ricca in sicurezza (wp_kses_post).
  • Asset locali: niente CDN esterni negli enqueue → review-friendly per WordPress.org e meno dipendenze di rete.
  • Compatibilità: funziona con editor a blocchi; in admin non carica script inutili per evitare conflitti di salvataggio.
  • API semplice: un unico shortcode con attributi chiari; supporto a markers_json per integrare dati da codice o ACF.

Installazione e requisiti

  1. Carica la cartella del plugin in /wp-content/plugins/ e attivalo da Plugin → Installati.
  2. Nel plugin sono previsti gli asset locali: Leaflet 1.9.4 e MarkerCluster 1.5.3. Assicurati che i file siano presenti in assets/leaflet/ e assets/cluster/ (con la cartella images di Leaflet).
  3. Verifica che il tema includa <?php wp_head(); ?> e <?php wp_footer(); ?>.

Suggerimento: se usi tab/accordion, la mappa fa già invalidateSize() all’init, ma dai comunque un’altezza esplicita al contenitore.

Shortcode e attributi

Shortcode base: [osm_map ...]

AttributoTipo / DefaultDescrizione
widthstring, 100%Larghezza contenitore (es. 100%, 800px).
heightstring, 400pxAltezza mappa: deve essere esplicita.
zoomint, 12Livello di zoom iniziale (se è impostato anche center).
centerstring, vuotoCentro mappa lat,lng. Se omesso, fit automatico sui marker.
tilesstring, https://tile.openstreetmap.org/{z}/{x}/{y}.pngTemplate del provider. Evita di sanificarlo con funzioni che rompono le {graffe}.
attribstring, © OpenStreetMap contributorsAttribution mostrata sulla mappa.
cluster1 | 0Abilita raggruppamento marker (numeri).
cluster_disable_at_zoomint, 12Livello di zoom a cui i cluster si sciolgono (i numeri lasciano posto ai singoli pin).
icon_urlstring, vuotoURL di un’icona personalizzata (altrimenti pin di default di Leaflet).
icon_sizestring, 32,32Dimensione icona personalizzata.
icon_anchorstring, 16,32Punto di ancoraggio sull’icona (x,y).
popup_anchorstring, 0,-28Offset dell’ancoraggio popup.
markersstring, vuotoLista pipe-separata lat,lng|lat,lng|....
titlesstring, vuotoTitoli (tooltip) pipe-separati per i marker.
popupsstring, vuotoPopup HTML (sanificati) pipe-separati.
markers_jsonJSON, vuotoArray di oggetti {lat,lng,title,popup}. Consigliato per integrazioni programmatiche.

Esempi pronti

1) Mappa base con tre città e cluster

[osm_map height="460px"
         markers="41.9028,12.4964|45.4642,9.1900|40.8518,14.2681"
         titles="Roma|Milano|Napoli"
         popups="<b>Roma</b>|<b>Milano</b>|<b>Napoli</b>"
         cluster="1"
         cluster_disable_at_zoom="12"]

2) Versione JSON (più comoda da generare a codice)

[osm_map height="500px" markers_json='[
  {"lat":41.9028,"lng":12.4964,"title":"Roma","popup":"<b>Roma</b>"},
  {"lat":45.4642,"lng":9.1900,"title":"Milano","popup":"<b>Milano</b>"},
  {"lat":40.8518,"lng":14.2681,"title":"Napoli","popup":"<b>Napoli</b>"}
]' cluster="1"]

3) Centro e zoom fissi

[osm_map height="420px" center="41.9028,12.4964" zoom="10"
         markers="41.9028,12.4964|42.0,12.6" titles="Centro|Punto 2" cluster="0"]

4) Pin personalizzato (via URL)

[osm_map height="420px"
         markers="41.9,12.49|45.46,9.19"
         titles="Roma|Milano"
         icon_url="https://tuo-sito.it/path/pin.png"
         icon_size="32,32" icon_anchor="16,32" popup_anchor="0,-28"]

5) Cambiare provider delle tessere (tiles)

[osm_map height="460px"
         tiles="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
         markers="40.85,14.26" titles="Napoli"]

Attenzione: il template dei tiles deve mantenere le {graffe} ({z}, {x}, {y}).

Best practice performance e SEO

  • Asset locali: caricando Leaflet/MarkerCluster dal plugin eviti latency esterne e sei conforme alle policy della directory.
  • Height esplicita: imposta sempre height nello shortcode o via CSS, altrimenti la mappa potrebbe apparire “grigia”.
  • Cluster: usa cluster=1 e cluster_disable_at_zoom per mantenere l’interfaccia pulita in zoom-out.
  • Popup leggeri: evita HTML pesante o script inline nei popup; restano sanificati, ma è meglio tenerli snelli.
  • Tiles: il server OSM pubblico è perfetto per demo e siti piccoli; per carichi elevati valuta un provider dedicato/caching.

Troubleshooting

Mappa grigia (pin visibili ma sfondo assente)
Quasi sempre l’URL dei tiles è stato “rotto” (le {graffe} sono state encodate). Usa il default del plugin o passa un template con {z}/{x}/{y} intatte.

“Aggiornamento fallito. La risposta non è una risposta JSON valida.”
Evita qualunque output HTML in admin o durante richieste REST/AJAX. Il plugin carica gli script solo nel front-end e mostra eventuali notice solo nella schermata Plugin.

Non vedo il pin di default
Assicurati che in assets/leaflet/ ci sia la cartella images con marker-icon.png, marker-icon-2x.png, marker-shadow.png.

Consiglio
Se usi tab/accordion, la mappa viene inizializzata con invalidateSize() per forzare il ricalcolo quando diventa visibile.

Conformità WordPress.org e licenze

  • Nessun CDN negli enqueue: gli asset sono serviti dal plugin → niente “OffloadedContent”.
  • Licenze: includi i file LICENSE di Leaflet (BSD-2-Clause) e MarkerCluster (MIT) dentro la cartella assets.
  • Sicurezza: popup sanificati con wp_kses_post, nessuna telemetria.

Roadmap, changelog e supporto

Roadmap

  • Blocco Gutenberg “OSM Map” con UI per aggiungere marker.
  • Supporto GeoJSON e import CSV.
  • Temi di marker predefiniti.

Changelog (estratto)

  • 1.3.x – Asset locali, handle univoci, cluster configurabile, fix admin/REST.
  • 1.2.x – Traduzioni e controlli in editor per evitare JSON non valido.
  • 1.0.x – Prima release con multi-pin, cluster e popup.

Hai bisogno di aiuto o vuoi proporre una funzione? Lascia un commento o contattaci: felici di migliorare il plugin insieme.

Scarica e inizia

Pronto a inserire la tua prima mappa OSM su WordPress? Installa il plugin, crea la pagina e incolla lo shortcode di esempio:

[osm_map height="460px"
         markers="41.9028,12.4964|45.4642,9.1900|40.8518,14.2681"
         titles="Roma|Milano|Napoli"
         cluster="1"
         cluster_disable_at_zoom="12"]

In meno di un minuto hai una mappa pulita, veloce e con pin raggruppati quando serve. 🚀

What Time Is It: il plugin WordPress che ti mostra sempre l’ora giusta (e nel fuso orario che vuoi)

Chi lavora con WordPress – che sia uno sviluppatore, un copywriter, un editor o un semplice appassionato – sa quanto può essere importante avere il tempo sotto controllo. Quando si lavora a progetti per clienti internazionali, oppure si pubblicano articoli su base programmata, o ancora si fa parte di un team distribuito in più parti del mondo, il riferimento temporale diventa fondamentale.

Ed è proprio da questa esigenza che nasce What Time Is It, un plugin WordPress semplice ma geniale, progettato per portare un orologio digitale preciso e personalizzabile direttamente nella tua area di lavoro. In questo articolo ti racconterò cosa fa, come funziona e perché dovresti installarlo subito.

Un orologio nel posto giusto: l’editor WordPress

What Time Is It aggiunge un orologio digitale direttamente nella sidebar laterale dell’editor Gutenberg. Mentre stai scrivendo un articolo o lavorando su una pagina, il plugin mostra in tempo reale l’ora del fuso orario che hai scelto. Non solo: puoi cambiarlo in qualsiasi momento usando il campo di selezione rapido integrato.

Questo approccio è perfetto per:

  • Chi pubblica contenuti in orari strategici.

  • Chi lavora con collaboratori o clienti all’estero.

  • Chi desidera un riferimento orario chiaro e sempre visibile, senza dover aprire una nuova scheda del browser.

Fluido, locale, senza API esterne

Uno dei punti di forza di questo plugin è che non usa alcuna API esterna. Non ci sono dipendenze da servizi come worldtimeapi.org o simili, che spesso causano problemi di CORS o malfunzionamenti offline. What Time Is It si basa esclusivamente su JavaScript nativo e sfrutta la potenza di toLocaleTimeString() con supporto per i fusi orari, quindi:

  • Funziona offline
  • È istantaneo e fluido
  • È leggero (zero chiamate di rete)
  • È affidabile nel tempo

Il tutto aggiornato in tempo reale, ogni secondo.

Scegli il fuso orario che ti serve

L’interfaccia del plugin include un campo input con datalist che permette di cercare e selezionare tra centinaia di fusi orari supportati dal browser. Basta iniziare a scrivere (es. “New York”, “Tokyo”, “Europe/Rome”) e l’opzione corretta sarà suggerita automaticamente.

Il plugin si occupa di:

  • Normalizzare la scrittura (maiuscole, spazi, slash).

  • Verificare la validità del fuso orario.

  • Salvare la scelta nel profilo utente, così che venga mantenuta anche nelle sessioni future.

Design semplice, efficace, integrato

Il box visualizzato nella sidebar è essenziale e chiaro. Mostra:

  •  Il nome del fuso orario selezionato.

  •  L’orologio digitale ben visibile, in stile “Courier” per un tocco retro-digitale.

  •  Il campo per cambiare fuso orario.

Il plugin eredita lo stile grafico del backoffice WordPress e si adatta perfettamente al flusso di lavoro. Niente popup invasivi, niente pagine di configurazione: è tutto lì, dove serve, quando serve.

Installazione: due click e via

Il plugin è distribuito in formato .zip pronto all’uso. L’installazione è semplice:

  1. Vai in Plugin > Aggiungi nuovo > Carica plugin.

  2. Carica il file what-time-is-it.zip.

  3. Attiva il plugin.

  4. Apri qualsiasi post o pagina nell’editor WordPress per vederlo in azione nella sidebar.

Non c’è bisogno di configurazioni aggiuntive. Funziona subito.

Perfetto per team remoti, agenzie e blogger internazionali

“What Time Is It” è ideale per tutte quelle situazioni in cui il tempo (e il fuso) conta:

  • Redazioni con redattori in paesi diversi.

  • Team che lavorano su Slack, GitHub o Google Meet e vogliono un orario di riferimento direttamente in WordPress.

  • Siti con contenuti programmati per la pubblicazione automatica.

  • Agenzie che gestiscono siti di clienti internazionali.

E perché no, è utile anche per chi vuole semplicemente un orologio sempre sott’occhio mentre lavora!

Leggero e sicuro

Il plugin è compatibile con:

  • WordPress 6.6 o superiore

  • PHP 7.4 o superiore

Ogni output HTML è gestito in modo sicuro con funzioni come esc_html() e esc_attr(). Gli input dell’utente sono normalizzati e sanitizzati. Il codice è interamente caricato in ambienti admin, quindi non impatta sul frontend.

Open source e migliorabile

What Time Is It è pensato per essere semplice, ma può essere esteso facilmente. Alcune possibili feature future:

  • Supporto a più fusi orari contemporanei (es. confronto NYC vs Tokyo).

  • Tema chiaro/scuro dell’orologio.

  • Integrazione con il pannello utente per impostare un fuso orario globale.

È perfetto anche come base per chi vuole sviluppare plugin admin più complessi o introdurre elementi di UX nel backend.

Conclusione

Semplice, leggero, utile: What Time Is It è uno di quei plugin che potresti non pensare di installare subito… ma una volta provato, diventa parte naturale del tuo flusso di lavoro.

Ti aiuta a mantenere il tempo sotto controllo, senza fronzoli, senza rischi, e soprattutto senza dipendere da servizi esterni.

Scaricalo, installalo e… guarda che ore sono 🕒