Alessandro Aili - WordPress Developer
Alessandro Aili - WordPress DeveloperPlay Alessandro Aili - WordPress DeveloperDrag Alessandro Aili - WordPress DeveloperView
Alessandro Aili - WordPress Developer
  • Homepage
  • Chi sono
  • Portfolio
  • Aree di Attività
    • Sviluppo di Siti Web Personalizzati
    • Ottimizzazione delle Prestazioni
    • Sicurezza del Sito Web
    • Aggiornamenti e Manutenzione
    • Sviluppo di Temi e Plugin Personalizzati
    • Migrazione e Trasferimento del Sito
  • Blog
  • Contatti
Alessandro Aili - WordPress Developer
Alessandro Aili - WordPress Developer Alessandro Aili - WordPress Developer
  • Homepage
  • Chi sono
  • Portfolio
  • Aree di Attività
    • Sviluppo di Siti Web Personalizzati
    • Ottimizzazione delle Prestazioni
    • Sicurezza del Sito Web
    • Aggiornamenti e Manutenzione
    • Sviluppo di Temi e Plugin Personalizzati
    • Migrazione e Trasferimento del Sito
  • Blog
  • Contatti
MENU Alessandro Aili - WordPress Developer
  • Home
  • SEO
  • Blog
  • Sitemap HTML in WordPress: come crearla e a cosa serve davvero

Sitemap HTML in WordPress: come crearla e a cosa serve davvero

Alessandro Aili - WordPress Developer
Alessandro Aili WordPress Developer

Data di pubblicazione

11 Settembre 2026

Tempo di lettura

23 minuti

Categoria

SEO

Commenti

0

Schema di una pagina mappa del sito: elenco di link raggruppati per sezione, con il link alla mappa evidenziato nel footer

Una sitemap HTML è una pagina del sito, scritta per chi legge, con l’elenco ordinato di tutto quello che il sito contiene: le pagine, gli articoli divisi per sezione, gli archivi. Su WordPress si costruisce in tre modi — con i blocchi dell’editor, con uno shortcode in un piccolo plugin, o con un’opzione del plugin SEO — e nessuno dei tre richiede più di mezz’ora. Il problema non è farla. Il problema è che quasi tutte le guide le attribuiscono effetti che nella documentazione di Google non esistono, e tacciono l’unica fonte che la richiede per nome — che non è Google, è il W3C.

Questa guida fa le due cose nell’ordine giusto: prima dice cosa una sitemap HTML fa davvero, con le fonti accanto a ogni affermazione, e quando conviene averla; poi mostra i tre metodi per costruirla, il posto dove va linkata — che è la parte che tutti saltano — e come si verifica che funzioni.

Una nota sulle fonti. Tutto quello che segue l’ho verificato l’11 settembre 2026 sulla documentazione di Google Search, sulle tecniche WCAG del W3C, sulla documentazione per sviluppatori di WordPress e — dove la documentazione non bastava — sul codice sorgente del core e del plugin. Lo shortcode del secondo metodo è stato eseguito in un’installazione WordPress vera, non solo riletto: i risultati dei test sono nella sua sezione.

Cos’è una sitemap HTML, e in cosa è diversa da quella XML

Il nome crea confusione perché due cose diverse lo condividono. La definizione più precisa di sitemap HTML non sta in una guida SEO ma nella tecnica G63 delle WCAG: «a web page that provides links to different sections of the site», una pagina web che fornisce link alle diverse sezioni del sito. È una pagina normale, con un indirizzo suo — in italiano la chiamerei mappa del sito, ed è il nome che userò per la pagina — che chiunque può aprire e leggere.

La sitemap XML è un’altra cosa: un file per i motori di ricerca, in uno dei tre formati che Google accetta — XML, RSS/Atom o testo semplice — con il solo elenco degli indirizzi e, al più, la data di modifica. Su WordPress la genera il core dalla 5.5 o, più spesso, il plugin SEO; è la cosa che si invia a Search Console. Ne ho scritto nella guida alla struttura del sito, dove spiego a cosa serve e quando non serve la sitemap XML, e qui non lo ripeto. (C’è anche un terzo elenco che le somiglia senza essere una sitemap, il file llms.txt per i modelli linguistici: ho raccontato cosa c’era nel llms.txt del mio sito quando l’ho aperto per la prima volta.)

Che le due non siano intercambiabili lo dice Google stessa, nell’unico testo ufficiale che le mette a confronto — una FAQ sul blog di Search Central del 15 gennaio 2008: «There’s a difference between a (usually HTML) site map built to help humans navigate around your site, and an XML Sitemap built for search engines. Both of them are useful, and it’s great to have both». E subito dopo: se invii una pagina HTML al posto di una sitemap, lo strumento «will report an error because an HTML page isn’t one of our recognized Sitemap formats». La data conta, e ci torno fra poco: quel testo ha diciotto anni, e nella documentazione attuale la sitemap HTML non è più nominata.

Sitemap XMLSitemap HTML (mappa del sito)
Per chi èMotori di ricercaPersone; i motori la leggono come qualunque pagina
Cos’èUn file, in un formato definitoUna pagina del sito, con un indirizzo suo
Cosa contieneIndirizzi, al più con la data di modificaLink con un titolo leggibile, organizzati per sezione
Chi la generaIl core dalla 5.5, o il plugin SEOI blocchi dell’editor, uno shortcode, o il plugin SEO se ha la funzione
Si invia a Search Console?SìNo: non è un formato accettato
Da dove si raggiungeDa robots.txt e da Search ConsoleDa un link nel footer, su ogni pagina

Cosa fa davvero una sitemap HTML, con le fonti

Tre cose, e per ciascuna c’è un documento ufficiale da cui discende. Poi una lista di cose che invece non fa, che è la parte che le guide in giro si saltano.

Un percorso di link in più, da una pagina linkata ovunque

La guida introduttiva alla SEO di Google lo scrive senza giri di parole: «Google primarily finds pages through links from other pages it already crawled». E la documentazione sulle sitemap definisce un sito «ben collegato al suo interno» come un sito in cui «Googlebot can find all the important pages on your site by following links starting from the home page». Una mappa del sito linkata dal footer fa esattamente questo, nel modo più economico che esista: dalla home si arriva alla mappa con un clic, e dalla mappa a qualunque contenuto con un altro. Ogni pagina del sito riceve almeno un link, da una pagina che a sua volta è linkata da tutte le altre.

Il limite è nella stessa frase: un link, con il titolo come anchor, da una pagina che ne contiene centinaia. È il pavimento, non il soffitto. La checklist SEO on-page chiede a ogni pagina due o tre link in ingresso dal corpo di altre pagine, messi dove nasce la domanda, e quelli nessuna mappa li sostituisce. La mappa risolve il caso opposto — la pagina che nessuno linka — e lo risolve in modo stabile: la home che mostra gli ultimi articoli si svuota man mano che pubblichi, la mappa no.

Un requisito di accessibilità, non solo un’idea SEO

Le WCAG 2.2 hanno un criterio di successo che le guide SEO non citano mai: il 2.4.5, Multiple Ways, livello AA. Il testo: «More than one way is available to locate a web page within a set of web pages» — deve esserci più di un modo per trovare una pagina dentro il sito. Il W3C elenca sei tecniche sufficienti e chiede di usarne «two or more»: fra queste ci sono il menu con i link alle pagine correlate, la funzione di ricerca, i link dalla home a tutte le pagine — e la mappa del sito, che è la tecnica G63.

Un sito WordPress con un menu e un modulo di ricerca funzionante di regola soddisfa già il criterio; la mappa è la terza via, quella che continua a valere quando il menu è troppo stretto per contenere tutto o la ricerca del tema non trova quello che dovrebbe. E la tecnica G63 dice tre cose sulla mappa che valgono anche come requisiti tecnici: che ogni pagina elencata nella mappa contenga un link alla mappa, che la mappa venga aggiornata ogni volta che il sito cambia, e che presenti la stessa organizzazione del sito, senza link non più validi. Se il sito rientra fra quelli con obblighi di accessibilità, è uno dei controlli che entrano nell’audit di accessibilità di un sito WordPress.

Quello che le guide promettono, e la documentazione non dice

«Indicizzazione più veloce», «migliore crawlability», «distribuisce il valore dei link in modo uniforme», «riduce la frequenza di rimbalzo e questo aiuta la SEO». Sono le quattro promesse che ricorrono in quasi tutte le guide sull’argomento, e nessuna delle quattro ha un riscontro in un documento di Google. Ho cercato la sitemap HTML in tutta la documentazione attuale di Search Central: non compare. L’unica frase ufficiale è quella del 2008 citata sopra, e dice una cosa sola e modesta: che i crawler «can follow the links on the page», cioè che una mappa è una pagina di link come le altre.

Della sitemap XML, che è lo strumento fatto apposta per i motori, Google scrive: «it doesn’t guarantee that all the items in your sitemap will be crawled and indexed». Se non lo garantisce quella, non lo garantisce una pagina di link. E lo stato Discovered – currently not indexed di Search Console è definito nella documentazione del rapporto sull’indicizzazione come una pagina trovata e non ancora scansionata, di solito perché Google ha rimandato la scansione per non sovraccaricare il sito: un problema di priorità, che una mappa non risolve da sola. La cosa onesta da dire è questa: è un percorso di link, e i link contano. Tutto il resto è un’estrapolazione.

Quando serve, e quando è solo una pagina in più

Serve quando esiste contenuto che il menu non raggiunge e che nessun altro percorso stabile copre. Nella pratica:

  • Blog con un archivio lungo. Gli articoli vecchi escono dalla home, dalle pagine di categoria finiscono in terza o quarta pagina di paginazione, e restano linkati solo se qualcuno li ha collegati dal corpo di un altro articolo. La mappa dà a tutti un percorso, a prescindere dall’età.
  • Contenuti fuori dal blog. Portfolio, schede prodotto, documentazione, tipi di contenuto personalizzati: spesso hanno un archivio ma nessun link dal resto del sito.
  • Siti con obblighi di accessibilità, per il criterio 2.4.5: è il caso in cui la mappa non è un’opzione ma una delle tecniche riconosciute.
  • Siti con molte pagine e un menu corto — la situazione più comune sui siti aziendali: dieci voci di menu, sessanta pagine, cinquanta delle quali raggiungibili solo se conosci l’indirizzo.

Non serve, per la scansione, su un sito piccolo e ben collegato. Questo blog è un esempio: al momento in cui scrivo ha 37 articoli in nove categorie, e ognuno riceve almeno quattro link dal corpo di altri articoli — l’ho misurato ricostruendo il grafo dei link, non a occhio. Una mappa del sito ce l’ha da oggi — è la voce «Mappa del sito» nel footer, generata con il terzo metodo di questa guida — ed esiste per il criterio 2.4.5 e per chi legge, non perché Google ne abbia bisogno. Il criterio è questo: se ogni contenuto ha già almeno un link stabile dal corpo di un’altra pagina, la mappa è ridondante; se non ce l’ha, la mappa è il modo più rapido di darglielo — e il segnale che poi va comunque messo mano ai link nel testo.

C’è un uso sbagliato, ed è il più diffuso: costruire la mappa per non dover linkare dal corpo. Una pagina che riceve un link solo dalla mappa è, per Google come per un lettore, una pagina che il sito stesso non ritiene importante — l’ho scritto parlando di cosa Google valuta davvero in un contenuto, e vale il doppio qui. La mappa toglie una pagina dall’orfanità; non la rende rilevante.

Tre decisioni prima di costruirla

1. Cosa elencare. Solo contenuti pubblicati e indicizzabili: pagine, articoli, i tipi di contenuto che hanno un senso per chi legge. Non le pagine che hai messo in noindex (grazie, privacy, conferma d’ordine), non gli archivi dei tag se il tuo plugin SEO li serve in noindex, non gli autori se sei uno solo. La tecnica G63 lo dice a modo suo: una mappa che presenta un’organizzazione diversa da quella del sito non è valida — deve rispecchiare il sito, non tutto quello che il database contiene.

2. Come ordinare. Per sezione, e dentro ogni sezione in ordine alfabetico: le pagine nella loro gerarchia, gli articoli raggruppati per categoria. È l’organizzazione del sito, ed è quella che la mappa deve riflettere. L’ordine cronologico lascialo agli archivi per data, che esistono già e fanno quel lavoro meglio.

3. Dove metterla. Una pagina, con uno slug parlante (/mappa-del-sito/), indicizzabile come tutte le altre, linkata dal footer di ogni pagina. Quest’ultimo punto è il requisito di G63 e la parte che decide se la mappa fa il suo lavoro: una mappa che non è linkata da nessuna parte è una pagina orfana che elenca le altre.

Metodo 1 — Con i blocchi, senza plugin e senza codice

È il metodo che consiglio a chi non vuole toccare codice, e funziona con qualunque tema, classico o a blocchi, perché usa solo blocchi del core. Crea una pagina nuova — titolo «Mappa del sito», slug mappa-del-sito — e costruiscila per sezioni: per ciascuna un blocco Titolo e, sotto, il blocco che genera l’elenco.

Le pagine: il blocco «Elenco delle pagine»

Il blocco Elenco delle pagine fa una cosa sola, ed è quella giusta: «Visualizza un elenco di tutte le pagine», pubblicate, con le figlie annidate sotto le madri. L’ordine è quello del campo Ordine negli Attributi della pagina, e a parità di valore quello alfabetico — quindi puoi decidere cosa viene prima senza rinominare niente. Due limiti da sapere: le pagine private non compaiono (giusto), ma non c’è un’opzione per escludere una pagina pubblicata — se vuoi tenere fuori la pagina di ringraziamento del modulo, questo blocco non te lo permette. È il primo motivo per cui esiste il secondo metodo.

Gli articoli: «Ultimi articoli» in ordine alfabetico, uno per categoria

Il nome inganna, ma il blocco Ultimi articoli è il migliore del core per questo lavoro. Nel pannello Ordinamento e filtro, sotto Ordina per, scegli A ⟶ Z; in Numero di elementi il massimo consentito è 100; e nel campo Categorie puoi limitarlo a una categoria sola. La struttura che consiglio è un blocco Titolo con il nome della categoria seguito da un blocco Ultimi articoli filtrato su quella categoria, ripetuti per ogni categoria: è l’organizzazione per sezioni che la mappa deve avere.

Impostazioni del blocco Ultimi articoli nell'editor: ordine A-Z, numero di elementi e filtro per categoria

Tre cose che questo blocco fa bene, verificate nel codice che lo genera: produce un elenco vero (<ul> con un link per voce, senza titoli intermedi), interroga solo i contenuti pubblicati — un articolo privato non compare nemmeno se stai guardando la pagina da amministratore — e ignora gli articoli in evidenza, che quindi restano al loro posto nell’ordine alfabetico invece di saltare in cima.

Se una categoria ha più di cento articoli, il blocco non basta e serve il Query loop. Inserito in una pagina, nelle impostazioni va messo su Tipo di query: Personalizzato (altrimenti eredita la query del template, cosa che in una pagina non ha senso e che l’editor stesso segnala); poi Ordina per A ⟶ Z, Elementi per pagina fino a 100, e il blocco Paginazione dentro al loop per raggiungere gli altri. Dentro al Template articolo lascia solo il blocco Titolo dell’articolo con «Rendi il titolo un link» attivo, e abbassane il livello di intestazione: di default è un H2, e cento H2 in una pagina non sono una mappa, sono un sommario. Due dettagli che ho verificato provandolo: il Query loop, a differenza di Ultimi articoli, mette gli articoli in evidenza in cima anche quando ordini per titolo — l’opzione Articoli in evidenza va impostata su Ignora — e mostra i contenuti privati a chi ha il permesso di vederli, quindi da amministratore vedrai una mappa diversa da quella dei visitatori.

Categorie e archivi, se servono

Il blocco Elenco dei termini elenca le categorie, con le opzioni Visualizza la gerarchia e Mostra conteggio articoli; il blocco Archivi elenca gli archivi mensili. Sono utili come sezione di chiusura, ma non sostituiscono l’elenco degli articoli: un link all’archivio di categoria è un link alla prima pagina di quell’archivio, non agli articoli che stanno in fondo.

Il metodo ha un pregio che vale più dei suoi limiti: si aggiorna da solo. Ogni blocco interroga il database quando la pagina viene servita, quindi un articolo pubblicato compare nella mappa senza che nessuno la tocchi. Il costo è che la struttura è manuale — una categoria nuova va aggiunta a mano come blocco — e che con più di cento articoli per sezione servono le pagine del Query loop.

Metodo 2 — Uno shortcode in un plugin, con la cache

Se vuoi decidere tu la struttura — pagine in gerarchia, articoli per categoria, altri tipi di contenuto in coda, esclusioni puntuali — e vuoi che si costruisca da sola anche quando aggiungi una categoria, il posto giusto è un piccolo plugin che registra uno shortcode. Non un file nel tema, e nemmeno nel child theme: una funzione che genera la mappa deve sopravvivere al cambio di tema, e il tema è la cosa che si cambia.

Il codice

Crea la cartella wp-content/plugins/mappa-del-sito/, mettici dentro questo file come mappa-del-sito.php e attivalo dalla bacheca. Poi inserisci lo shortcode [mappa_del_sito] in una pagina, con un blocco Shortcode.

<?php
/**
 * Plugin Name: Mappa del sito
 * Description: Shortcode [mappa_del_sito] che elenca pagine, articoli per categoria e altri tipi di contenuto pubblicati. Con cache.
 * Version:     1.0
 * Author:      Alessandro Aili
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'init', 'aa_mappa_registra_shortcode' );
function aa_mappa_registra_shortcode() {
	add_shortcode( 'mappa_del_sito', 'aa_mappa_del_sito' );
}

/**
 * [mappa_del_sito tipi="page,post" escludi="12,34"]
 * tipi:    tipi di contenuto da elencare, nell'ordine in cui compaiono.
 * escludi: ID dei contenuti da non elencare.
 */
function aa_mappa_del_sito( $atts ) {
	$atts = shortcode_atts(
		array(
			'tipi'    => 'page,post',
			'escludi' => '',
		),
		$atts,
		'mappa_del_sito'
	);

	$escludi = wp_parse_id_list( $atts['escludi'] );
	$chiave  = 'aa_mappa_' . aa_mappa_versione() . '_' . md5( $atts['tipi'] . '|' . implode( ',', $escludi ) );

	$html = get_transient( $chiave );
	if ( false !== $html ) {
		return $html;
	}

	$html = '';
	foreach ( array_filter( array_map( 'trim', explode( ',', $atts['tipi'] ) ) ) as $tipo ) {
		$oggetto = get_post_type_object( $tipo );
		if ( ! $oggetto || ! $oggetto->public ) {
			continue;
		}

		$html .= '<h2>' . esc_html( $oggetto->labels->name ) . '</h2>';

		if ( is_post_type_hierarchical( $tipo ) ) {
			// Pagine: elenco annidato, le figlie sotto le madri, ordinate come in Attributi della pagina.
			$html .= '<ul>' . wp_list_pages(
				array(
					'post_type' => $tipo,
					'title_li'  => '',
					'exclude'   => implode( ',', $escludi ), // wp_list_pages vuole una stringa, non un array.
					'echo'      => false,
				)
			) . '</ul>';
		} elseif ( 'post' === $tipo ) {
			$html .= aa_mappa_articoli_per_categoria( $escludi );
		} else {
			$html .= aa_mappa_elenco( $tipo, $escludi );
		}
	}

	set_transient( $chiave, $html, DAY_IN_SECONDS );
	return $html;
}

/**
 * Articoli raggruppati per categoria, in ordine alfabetico dentro ogni gruppo.
 */
function aa_mappa_articoli_per_categoria( $escludi ) {
	$html = '';
	foreach ( get_categories( array( 'orderby' => 'name' ) ) as $categoria ) {
		$elenco = aa_mappa_elenco(
			'post',
			$escludi,
			array(
				'tax_query' => array(
					array(
						'taxonomy'         => 'category',
						'field'            => 'term_id',
						'terms'            => $categoria->term_id,
						'include_children' => false,
					),
				),
			)
		);
		if ( '' !== $elenco ) {
			$html .= '<h3><a href="' . esc_url( get_category_link( $categoria ) ) . '">' . esc_html( $categoria->name ) . '</a></h3>' . $elenco;
		}
	}
	return $html;
}

/**
 * Elenco piatto, in ordine alfabetico, dei contenuti pubblicati di un tipo.
 */
function aa_mappa_elenco( $tipo, $escludi, $extra = array() ) {
	$query = new WP_Query(
		array_merge(
			array(
				'post_type'              => $tipo,
				'post_status'            => 'publish', // esplicito: la cache non sa chi sta guardando.
				'posts_per_page'         => -1,
				'orderby'                => 'title',
				'order'                  => 'ASC',
				'post__not_in'           => $escludi,
				'ignore_sticky_posts'    => true, // altrimenti gli articoli in evidenza saltano in cima.
				'no_found_rows'          => true,
				'update_post_meta_cache' => false,
			),
			$extra
		)
	);

	if ( ! $query->have_posts() ) {
		return '';
	}

	$html = '<ul>';
	foreach ( $query->posts as $post ) {
		$html .= '<li><a href="' . esc_url( get_permalink( $post ) ) . '">' . esc_html( get_the_title( $post ) ) . '</a></li>';
	}
	return $html . '</ul>';
}

/**
 * Cache: un numero di versione nella chiave. A ogni modifica dei contenuti la versione sale
 * e la mappa si rigenera alla prima visita; le copie vecchie scadono da sole.
 */
function aa_mappa_versione() {
	return (int) get_option( 'aa_mappa_versione', 1 );
}

function aa_mappa_svuota_cache() {
	update_option( 'aa_mappa_versione', aa_mappa_versione() + 1 );
}
add_action( 'save_post', 'aa_mappa_svuota_cache' );
add_action( 'deleted_post', 'aa_mappa_svuota_cache' );
add_action( 'transition_post_status', 'aa_mappa_svuota_cache' );
add_action( 'edited_term', 'aa_mappa_svuota_cache' );
add_action( 'delete_term', 'aa_mappa_svuota_cache' );

Senza attributi elenca pagine e articoli. Con gli attributi decidi l’ordine delle sezioni, aggiungi altri tipi di contenuto ed escludi singoli contenuti per ID:

[mappa_del_sito tipi="page,post,portfolio" escludi="12,34"]

Le scelte che contano, riga per riga:

  • Le pagine le elenca wp_list_pages(), la funzione del core che produce l’elenco annidato delle pagine pubblicate, ordinate come nel blocco Elenco delle pagine. Con title_li vuoto non aggiunge la voce «Pagine» e non avvolge l’elenco in un <ul>, che infatti apriamo noi. Attenzione a exclude: vuole una stringa di ID separati da virgola, non un array — con un array, su PHP 8 la funzione va in errore. L’avevo scritto con un array e me ne sono accorto rileggendo il codice del core, prima di eseguirlo.
  • Gli articoli vengono raggruppati per categoria, in ordine alfabetico di categoria e di titolo, con una WP_Query per ciascuna. include_children a false fa comparire un articolo solo sotto le categorie in cui sta davvero, non anche sotto la categoria madre — senza, su un sito con una categoria «Blog» che contiene tutte le altre, ogni articolo comparirebbe due volte.
  • post_status è dichiarato esplicitamente, anche se «pubblicato» è il default: WP_Query, per chi ha i permessi, include anche i contenuti privati. Senza quella riga un amministratore che apre la mappa per primo metterebbe in cache un elenco con dentro i suoi contenuti privati, e la cache non sa chi sta guardando.
  • ignore_sticky_posts, perché WordPress mette in cima gli articoli in evidenza anche in una query secondaria, e in una mappa alfabetica non devono. no_found_rows evita di contare i risultati totali, che qui non servono; update_post_meta_cache a false evita di caricare i metadati di ogni articolo, che non usiamo.
  • Perché WP_Query e non get_posts(), che è più corta: get_posts() ha suppress_filters attivo per impostazione predefinita, il che salta i filtri che altri plugin applicano alle query — su un sito multilingua, per esempio, elencherebbe gli articoli di tutte le lingue insieme.
  • La cache. Il risultato viene salvato in un transient per un giorno, con un numero di versione nella chiave. Ogni volta che un contenuto viene salvato, cambia stato o viene cancellato, o una categoria viene modificata, la versione sale: alla visita successiva la mappa si rigenera, e le copie vecchie scadono da sole. È il modo di rispettare il requisito di G63 — aggiornata a ogni modifica del sito — senza rifare tutte le query a ogni visita. Se hai già una cache di pagina, questa cache è ridondante ma innocua.
  • Lo shortcode restituisce, non stampa. È la regola della Shortcode API: la funzione deve «always return», mai produrre output direttamente. E il nome ha un prefisso, perché in caso di omonimia vince l’ultimo registrato.

Cosa ho verificato eseguendolo

Il plugin è stato attivato in un’installazione WordPress pulita (PHP 8.5, ultima versione del core) con contenuti costruiti apposta per metterlo in difficoltà: articoli inseriti in ordine non alfabetico, uno in evidenza, uno privato, una bozza, uno in due categorie, uno in una sottocategoria, una pagina figlia, un tipo di contenuto personalizzato e un tipo inesistente nell’attributo tipi. Risultato: l’ordine alfabetico è rispettato anche con l’articolo in evidenza; il privato e la bozza non compaiono nemmeno guardando la pagina da amministratore; l’articolo in due categorie compare in entrambe, quello nella sottocategoria solo lì; le esclusioni per ID funzionano su pagine e articoli; il tipo inesistente viene ignorato senza errori. Poi ho pubblicato un articolo nuovo e la mappa lo mostrava alla visita successiva; l’ho cancellato ed è sparito. Nessun avviso PHP.

Se preferisci non avere un plugin in più, lo stesso codice può stare in un template di pagina personalizzato del tema: funziona, ma la mappa smette di esistere il giorno in cui cambi tema, che è esattamente il motivo per cui l’ho messa in un plugin.

Metodo 3 — Con Rank Math, se il tuo plugin SEO ha la funzione

Rank Math genera una sitemap HTML dalla versione 1.0.103 del 30 novembre 2022 (è nel changelog ufficiale: «HTML Sitemaps are here for everyone!»), nella versione gratuita. Si attiva da Rank Math SEO → Impostazione della sitemap, scheda Sitemap HTML, interruttore «Abilita la sitemap HTML»; il modulo Sitemap deve essere acceso. Le opzioni, come le descrive la documentazione di Rank Math:

  • Formato di visualizzazione: Shortcode, e allora inserisci [rank_math_html_sitemap] dove vuoi con un blocco Shortcode; oppure Pagina, e scegli dal menu una pagina esistente — la mappa viene accodata dopo il contenuto della pagina, quindi puoi scriverci sopra un’introduzione.
  • Ordina per: data di pubblicazione, data di modifica, alfabetico, ID. Per una mappa: alfabetico.
  • Mostra le date e la scelta fra titoli dell’elemento e titoli SEO. I titoli SEO sono scritti per la pagina dei risultati, non per un elenco: lascia i titoli normali.
  • Per ogni tipo di contenuto e tassonomia, nelle rispettive schede, l’interruttore Includi nella sitemap HTML.
Impostazioni della sitemap HTML in Rank Math: formato di visualizzazione, ordinamento, date e titoli

Due cose che la documentazione non dice e che ho letto nel codice del plugin (versione 1.0.278): la mappa esclude da sola i contenuti che hai messo in noindex e quelli nel campo «Escludi gli articoli» delle impostazioni della sitemap XML, quindi le due sitemap restano coerenti senza che tu le allinei a mano; e l’elenco viene messo in cache e rigenerato quando i contenuti cambiano. È la stessa logica dello shortcode qui sopra, già scritta e già mantenuta: se usi Rank Math, non c’è motivo di scriverne una tua.

Se usi un altro plugin SEO, guarda nelle sue impostazioni della sitemap prima di installare qualcosa: la funzione c’è o non c’è, e se non c’è i due metodi precedenti non richiedono nessun plugin in più. Un plugin dedicato solo alla mappa del sito ha senso solo se ti dà qualcosa che i blocchi e uno shortcode di un centinaio di righe non danno — ed è raro.

Il link nel footer, su ogni pagina

È la parte che quasi tutte le guide dimenticano, ed è quella che fa la differenza fra una mappa e una pagina in più. La tecnica G63 lo mette come requisito: ogni pagina elencata nella mappa contiene un link alla mappa. Il posto naturale è il footer, che compare su tutte le pagine e che quasi nessuno usa per navigare: una voce «Mappa del sito» accanto a privacy e contatti. Non nel menu principale, che deve contenere le sezioni e non la lista delle pagine — è una delle regole della struttura del sito, e la mappa esiste proprio per non doverle violare.

Tema a blocchi: Aspetto → Editor → Pattern → Parti del template → Footer; dentro il blocco Navigazione del footer, aggiungi una voce e scegli la pagina della mappa. Tema classico con un menu nel footer: Aspetto → Menu, aggiungi la pagina al menu assegnato alla posizione del footer. Tema classico con il footer scritto nel template — come quello di questo sito — una riga in footer.php, nel punto in cui stanno gli altri link:

<li><a href="<?php echo esc_url( home_url( '/mappa-del-sito/' ) ); ?>">Mappa del sito</a></li>

Se il tema è tuo, la riga va nel tema; se il tema è di terzi, va nel child theme, altrimenti il prossimo aggiornamento la cancella.

Come si verifica che funzioni

La tecnica G63 ha una procedura di verifica in quattro passi, e vale la pena usarla così com’è perché è l’unica lista di controllo ufficiale che esista per una mappa del sito: 1) la mappa c’è; 2) ogni suo link porta davvero alla sezione che dichiara; 3) ogni pagina elencata contiene a sua volta un link alla mappa; 4) da ogni pagina del sito si arriva alla mappa seguendo i link. Il terzo è quello che salta più spesso, e si controlla in dieci secondi aprendo tre pagine a caso e cercando «Mappa del sito» nel footer.

Poi tre controlli che G63 non fa, perché riguardano i motori. I link devono essere link: Google segue soltanto gli elementi <a> con un attributo href che contiene un indirizzo — non i <span> cliccabili, non i link generati al clic da JavaScript. Tutti e tre i metodi di questa guida producono link veri; se la mappa la fa un plugin o un page builder, apri il sorgente della pagina e guarda. La pagina deve rispondere 200 ed essere indicizzabile come le altre — nessun noindex, nessuna esclusione dalla sitemap XML: è una pagina di navigazione legittima e va trattata come tale. E la mappa deve aggiornarsi da sola: pubblica un articolo di prova e ricaricala; se lo vedi, il requisito «aggiornata a ogni modifica» è soddisfatto senza che tu debba ricordartene.

L’effetto sul sito si misura dopo, in Search Console. Nel rapporto Link → Link interni, dopo qualche settimana, nessuna pagina dovrebbe più segnare zero — tenendo presente che il rapporto, per dichiarazione di Google, «isn’t a comprehensive list of every link on your site» ma un campione, e che le pagine non indicizzate possono mancare. E nel rapporto sull’indicizzazione, il numero di pagine «rilevate ma non indicizzate» è quello da guardare nel tempo: è il controllo trimestrale che sta nel piano di manutenzione del sito, e la mappa è una delle poche cose che possono spostarlo senza scrivere una riga di contenuto nuovo.

Cinque errori da evitare

  1. Scriverla a mano. Una pagina con l’elenco dei link incollato è aggiornata il giorno in cui la pubblichi e sbagliata da quello dopo. G63 è esplicita — la mappa va aggiornata a ogni modifica del sito e non deve contenere link non più validi — e su un sito in cui si eliminano e si accorpano contenuti una mappa manuale è il primo posto in cui i link morti si accumulano. Tutti e tre i metodi qui sopra si generano dal database: usane uno.
  2. Costruirla con link che non sono link. Menu a fisarmonica che caricano le voci al clic, pulsanti, elementi con un evento JavaScript al posto dell’href: per chi legge funzionano, per Google non esistono. E niente nofollow sui link interni: sarebbe dire al motore di non seguire proprio i percorsi per cui la mappa esiste.
  3. Usarla come scusa per non linkare dal corpo. Un link dalla mappa toglie una pagina dall’orfanità; non le dà un contesto, non le dà un’anchor descrittiva, non dice a nessuno perché è importante. I link dal testo di altre pagine restano il lavoro vero, e la mappa è quello che copre nel frattempo.
  4. Metterla nel menu principale, o non linkarla affatto. Nel primo caso occupa il posto di una sezione; nel secondo è una pagina orfana che elenca le altre. Il footer, su ogni pagina, è la risposta a entrambi.
  5. Inviarla a Search Console come sitemap. Non è un formato accettato e lo strumento risponde con un errore; e non sostituisce quella XML, che serve ad altro e che il plugin SEO genera già. Le due convivono, come Google scriveva già nel 2008.

Domande frequenti

La sitemap HTML serve ancora, o è una cosa di quindici anni fa?

Serve, per due ragioni che non invecchiano: è una pagina di link, e Google trova le pagine soprattutto seguendo link; ed è una delle tecniche riconosciute dalle WCAG per il criterio 2.4.5. Quello che è invecchiato è il modo in cui viene raccontata, come fattore di posizionamento o acceleratore di indicizzazione: cose che nella documentazione di Google non ci sono. Su un sito piccolo e ben collegato puoi farne a meno; su un sito con contenuti che il menu non raggiunge, o con obblighi di accessibilità, costa mezz’ora e dà un risultato misurabile.

Sitemap HTML o XML: quale mi serve?

Entrambe, perché fanno cose diverse. La XML è un file per i motori, in un formato definito, che dichiara gli indirizzi del sito e si invia a Search Console: su WordPress ce l’hai già, la genera il core o il plugin SEO. La HTML è una pagina per le persone, con link leggibili organizzati per sezione, che i motori attraversano come qualunque altra pagina. Non sono alternative e non si sostituiscono: una pagina HTML inviata come sitemap produce un errore, e una sitemap XML non aiuta nessun lettore a orientarsi.

La pagina della mappa va messa in noindex?

No. Nessun documento di Google lo chiede, ed è una pagina di navigazione legittima come un archivio di categoria: si lascia indicizzabile, con il canonical su sé stessa, senza trattamenti speciali. Difficilmente si posizionerà per qualcosa, e non è il suo compito. L’errore da evitare è il contrario: escluderla per sbaglio dalla sitemap XML o dal footer, e ritrovarsi con una mappa che nessun percorso raggiunge.

Quante voci può contenere una sitemap HTML?

Non esiste un limite dichiarato da Google; il numero giusto lo decide chi legge, e una pagina con duemila link in fila non aiuta nessuno. G63 descrive, per i siti grandi, mappe divise per sezione: sopra qualche centinaio di voci per gruppo, una pagina di mappa per sezione linkata da una mappa principale. Sul lato tecnico, con i blocchi il limite è di cento voci per blocco (oltre serve il Query loop con la paginazione); lo shortcode elenca tutto, ed è il caso in cui la cache smette di essere un dettaglio.

Il mio plugin SEO la genera da solo?

Rank Math sì, dal 30 novembre 2022, nella versione gratuita: si attiva dalle impostazioni della sitemap e si mostra con uno shortcode o su una pagina a scelta, escludendo da sola i contenuti in noindex. Per gli altri plugin la risposta sta nelle loro impostazioni della sitemap: se la voce non c’è, la funzione non c’è, e i due metodi senza plugin di questa guida — i blocchi dell’editor o lo shortcode — coprono il caso senza aggiungere niente all’installazione.

Posso mettere la mappa nel menu principale invece che nel footer?

Puoi, ma è il posto sbagliato. Il menu principale dichiara le sezioni del sito, e ogni voce che non è una sezione toglie chiarezza alle altre; la mappa serve proprio a non infilare nel menu quello che non sai dove mettere. Il footer compare su ogni pagina, che è il requisito, e chi cerca la mappa la cerca lì, accanto a privacy e contatti.

Da qui in avanti

Se devi tenere una cosa sola di questa guida: la mappa del sito è una pagina di link, e va linkata da ogni pagina. Fatta con uno dei tre metodi si aggiorna da sola e costa mezz’ora una volta; linkata dal footer dà a ogni contenuto un percorso stabile e soddisfa una tecnica riconosciuta delle WCAG. Quello che non fa — posizionare, accelerare, sostituire i link nel testo — non lo fa nessuna mappa, e saperlo prima evita di aspettarsi da una pagina quello che deve venire dalla struttura del sito.

Se preferisci che l’audit lo faccia io

Se non sai quante pagine del tuo sito nessuno linka, o se la mappa c’è già ma non sei sicuro che faccia quello che dovrebbe, è il tipo di verifica che faccio in un audit SEO tecnico: il grafo dei link interni, le pagine orfane, cosa ne fa Search Console e cosa vale la pena sistemare per primo. Trovi il resto nelle mie aree di attività, oppure scrivimi e ne parliamo sul tuo sito.

Indice dei contenuti

  • Cos’è una sitemap HTML, e in cosa è diversa da quella XML
  • Cosa fa davvero una sitemap HTML, con le fonti
  • Quando serve, e quando è solo una pagina in più
  • Tre decisioni prima di costruirla
  • Metodo 1 — Con i blocchi, senza plugin e senza codice
  • Metodo 2 — Uno shortcode in un plugin, con la cache
  • Metodo 3 — Con Rank Math, se il tuo plugin SEO ha la funzione
  • Il link nel footer, su ogni pagina
  • Come si verifica che funzioni
  • Cinque errori da evitare
  • Domande frequenti
  • Da qui in avanti
  • Se preferisci che l’audit lo faccia io

Tag in Evidenza

SEO tecnicaSitemapWordPress

Condividi


Lascia un commento Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Alessandro Aili - WordPress Developer Alessandro Aili - WordPress Developer
Sono un WordPress developer che affronta tutte le tue sfide online.
Skills
  • Sviluppo di Siti Web Personalizzati
  • Ottimizzazione delle Prestazioni
  • Sicurezza del Sito Web
  • Aggiornamenti e Manutenzione
  • Sviluppo di Temi e Plugin Personalizzati
  • Migrazione e Trasferimento del Sito
© Copyright 2026 Alessandro Aili
  • Mappa del sito
  • Privacy Policy
  • Cookie Policy
  • Preferenze cookie
Alessandro Aili - WordPress Developer