Come assimilare il layout delle pagine di categoria WordPress a quello dei post

Il plug-in Yoast SEO permette di scrivere le informazioni SEO Title e Description per le categorie di WordPress. Ecco come recuperarle da PHP.
immagine dell'autore dell'articolo

Scritto da: Alberto

Una vita nell'informatica, per lavoro e per passione.
agsdix-far fa-calendar-alt
Data pubblicazione: 25 Maggio 2025
agsdix-far fa-comments

Premessa

Le pagine di archivio di WordPress presentano tutti i post associati ad una particolare informazione (autore, data, categoria, tag, tassonomie personalizzate). L’inevitabile domanda che si pone uno sviluppatore di siti è: “Queste pagine d’archivio vanno anch’esse indicizzate sui motori di ricerca, oppure no?”.

Va detto che indicizzare le pagine di Archivio WordPress non è sempre utile.

Pagine di autore e data

Ad esempio, se i post del sito sono redatti da un unico autore, la sua pagina di archivio coinciderà con l’intero blog, risultando davvero poco utile, sia agli utenti che ai motori di ricerca. Anche gli archivi per data risultano generalmente poco utili, a meno che il sito non tratti in modo specifico di eventi raggruppabili per anno, come ad esempio i campionati di calcio.

Pagine di tag e categorie

Per tag e categorie il discorso è diverso e dipende soprattutto dalla architettura delle informazioni del sito.

La teoria dice che tag e categorie si devono incrociare come righe e colonne di una matrice, ad esempio se nel sito di un ristorante le categorie seguono la struttura del menu (antipasti, primi piatti, secondi piatti, contorni, dessert), i tag possono “attraversare” il menu raggruppando i piatti di carne, di pesce, vegetariani o vegani, oppure elencare le portate del giorno o i consigli dello chef.

Al di là della teoria, io trovo che nella normalità dei casi, un sito con una buona struttura di categorie, permette di per sé una facile navigazione tra i contenuti, rendendo i tag pressoché inutili, per questo motivo personalmente non utilizzo mai i tag.

Il discorso dell’indicizzazione rimane aperto quindi per le sole pagine di archivio riguardanti le categorie.

E’ giusto indicizzare le pagine di categoria?

Volendo seguire i criteri generali, una pagina va indicizzata se:

  • offre un valore aggiunto: ad esempio, in una pagina di archivio delle categorie WordPress, piuttosto che limitarsi ad elencare i post appartenenti a quella categoria, è meglio inserire anche la descrizione della categoria stessa, fornendo così del valore aggiunto.
  • la pagina è orientata ad una keyword specifica, in modo intercettare le richieste dei potenziali visitatori e al tempo stesso da non sottrarre traffico alle altre pagine (cannibalizzazione delle keyword).

Se le pagine di categoria seguono queste regole, è meglio indicizzarle.

Nel dubbio, un buon compromesso potrebbe essere quello di iniziare indicizzando le pagine di categoria e poi monitorare se generano traffico. In caso positivo l’indicizzazione va mantenuta, altrimenti può essere rimossa.

Assimilare il layout delle pagine di categoria a quello dei post

Equiparare i contenuti delle categorie a quelli dei post

La categoria WordPress dovrebbe quindi avere i contenuti tipici di un post e, in aggiunta, terminare con l’elenco dei post correlati.
A questo punto perché non assimilare anche il layout di categorie e post, in modo che ci sia continuità di stile per il sito?

Per quanto riguarda il layout di pagina, questa assimilazione tra categorie e post risente però di alcune limitazioni imposte da WordPress. Rispetto ai post, le categorie non hanno:

  • un editor a blocchi (bensì la sola possibilità di scrivere un testo semplice);
  • una immagine principale (featured image);
  • il riassunto della pagina (excerpt).

Il supporto del plug-in Yoast SEO

Il primo problema può essere ovviato con l’installazione e l’attivazione del plug-in Yoast SEO.
Se dalla bacheca dell’amministratore si sceglie la voce di menu Yoast SEO > Aspetto della ricerca e poi si sceglie il tab Tassonomie, è possibile impostare il parametro Vuoi mostrare le impostazioni SEO per Categorie? a ON. Con questa operazione il plug-in permette di:

  • usare un editor avanzato per la modifica della descrizione delle categorie, simile al vecchio Classic Editor di WordPress (quello basato su TinyMCE);
  • inserire le informazioni SEO Title e SEO Description anche per le categorie (vedi prossimo capitolo);
  • specificare l’elemento HTML <link rel="canonical"...> sulla pagina in modifica;
  • specificare l’elemento HTML <meta name='robots' content='noindex, nofollow' /> per le pagine di categoria che non si vogliono indicizzare.

Rimangono “scoperti” i problemi dell’excerpt e della featured image, per i quali va individuata una soluzione ad hoc.

Usare la Description SEO come excerpt

L’excerpt di un post compare negli elenchi di post, assieme a titolo, featured image e altri meta dati del post. Di per sé non sarebbe necessario inserirlo anche nella pagina che contiene il post, Alcuni sviluppatori, e io tra questi, lo inseriscono però proprio all’inizio del post, per indicare al visitatore che accede alla pagina di cosa tratta l’articolo.

Una regola della SEO on-page suggerisce di inserire la keyword della pagina nell’elemento HTML <meta name="description" content="..."> (che chiamiamo “SEO Description”, la stessa che Yoast SEO permette di inserire per la pagina in modifica).

Una seconda regola suggerisce che, all’interno dell’articolo, la keyword compaia (tra le altre cose) anche “above the fold”, ovvero nella prima videata su cui si apre la pagina. E dato che generalmente la featured image arriva fino in fondo allo schermo, il posto migliore dove inserire questo testo è tra titolo e featured image. Esattamente dove io posiziono l’excerpt.

La cosa migliore, quindi è quella far coincidere SEO Description ed excerpt. Tra i due testi c’è una differenza: se si introducono dei tag HTML nella SEO Description, Yoast li rimuoverà prima di salvare il testo. Nell’excerpt invece i tag HTML cono ammessi. Dato che un’altra regola della SEO on-page dice di evidenziare in grassetto le keyword, ecco che preferisco mettere “above the fold” l’excerpt invece che la SEO Description, con l’accortezza, però, di far coincidere i due testi (a meno appunto del grassetto per la keyword).

Accorgimento

Sulle pagine di categoria, non avendo modo di inserire l’excerpt, si può mettere above the fold la SEO Description resa disponibile da Yoast SEO, rinunciando al grassetto per le keyword.

Associare un’immagine alla categoria

Le categorie non hanno featured image, ma nulla vieta di inserire una immagine nei media del sito e attribuirle una correlazione con la categoria. Io utilizzo gli slug: se lo slug della categoria è netbeans, lo slug dell’immagine correlata sarà categoria-netbeans, in questo modo sarà semplice, conoscendo la categoria, prelevare l’immagine correlata.

Implementare SEO Description e featured image nelle pagine di categoria.

Il modo più semplice per introdurre nella pagina di categoria la SEO Description e l’immagine correlata è quello di usare uno shortcode: tutti i site-builder e lo stesso WorPress dispongono di un modulo <codice> che può appunto essere utilizzato per inserire gli shortcode.

Diamo il nome [header_categoria] allo shortcode e andiamo a inserire nel file functions.php del tema child la funzione che verrà da questi richiamata:

/* ------------------------------------------------------------------------
 *  introduco lo shortcode custom [header_categoria] che visualizza
 *  SEO Description e featured image, unitamente ai suoi meta dati,
 *  nelle pagine archivio di categoria [28.5.2025] */

function mostra_header_categoria($atts, $content = null) {
    /* leggo i dati della categoria corrente*/
	$category = get_queried_object();
    
	/* 1. leggo la yoast meta description della categoria corrente 
	 *    dalla tabella wp_option */
	if ($category && isset($category->slug)) {
		$category_id   = $category->term_id;
		$category_slug = 'categoria-'.$category->slug;
		$category_name = 'categoria-'.$category->name;
		$taxonomy_meta = get_option( 'wpseo_taxonomy_meta' );
		if ( isset( $taxonomy_meta['category'][ $category_id ]['wpseo_desc'] ) ) {
			$seo_description = $taxonomy_meta['category'][ $category_id ]['wpseo_desc'];
		} else {
			$seo_description = 'SEO Description non disponibile';
		}	
    	} else {
		$category_slug = 'categoria-non-trovata';
		$category_name = 'categoria-non-trovata';
		$seo_description = 'SEO Description non disponibile';
	}
	
	
	/* 2a. acquisisco i metadati dell'immagine associata alla categoria
	 * corrente, se esiste */	
	$args = array(
		'post_type'  => 'attachment',
		'name'       => $category_name .'/', 
		'posts_per_page' => 1
	);
	$images = get_posts($args);
	$image = $images[0];
	$image_id = $image ? $image->ID : null;
	if ($image_id) {
		$caption = wp_get_attachment_caption($image_id);
		$title = $image->post_title;
		$alt_text = get_post_meta( $image_id, '_wp_attachment_image_alt', true );
	} else {
		/* 2b. se non esiste una immagina associata alla categoria corrente, 
		 *     acquisisco i metadati dell'immagine associata 
		 *     alla categoria-non-trovata */
		$category_slug = 'categoria-non-trovata';
		$category_name = 'categoria-non-trovata';
		$args = array(
			'post_type'  => 'attachment',
			'name'       => $category_name .'/',
			'posts_per_page' => 1
		);
		$images = get_posts($args);
		$image = $images[0];
		$image_id = $image ? $image->ID : null;
		$caption = wp_get_attachment_caption($image_id);
		$title = $image->post_title;
		$alt_text = get_post_meta( $image_id, '_wp_attachment_image_alt', true );
	}

	/* 3. Acquisisco l'immagine  */
	$immagine = '/wp-content/uploads/categorie/' . $category_slug . '.jpg';
	
	/* 4. Preparo e restituisco il codice HTML */
	$html_seo_description = 
	'<div style="font-size:20px; border-left: 4px solid #a12000; padding:10px">' .
		'<div class="et_pb_text_inner">'.$seo_description.'</div>' .
	'</div>';

	$html_immagine = 
	'<img decoding="async" loading="lazy" width="795" height="530" src="' . 
	$immagine . '" alt="' . $alt_text . '" title="' . $title . '">';		

	$html_caption = '<p style="text-align:right; font-style: italic; font-size:small; margin-top:0" >' . $caption . '</p>';
	
    return $html_seo_description.'<br>'. $html_immagine . $html_caption;
}

add_shortcode( 'header_categoria', 'mostra_header_categoria' );

Ho introdotto nei commenti nel codice (se servono ulteriori spiegazioni sono a disposizione ai recapiti indicati nella pagina Contatti), ma c’è un aspetto che va spiegato meglio: dove Yoast registra la SEO Description e come andare a recuperare tale descrizione.

Come Yoast SEO registra la SEO Description

A partire dalle versioni più recenti di Yoast SEO, la gestione delle informazioni SEO per le tassonomie (come le categorie) è cambiata rispetto ai sistemi precedenti. Invece di memorizzare la SEO Description nelle righe della tabella wp_termmeta, Yoast ora utilizza due meccanismi:

1. Opzione wpseo_taxonomy_meta in wp_options

Yoast SEO salva le impostazioni SEO per le tassonomie in un’unica opzione chiamata wpseo_taxonomy_meta (memorizzata nella tabella wp_options). Questa opzione contiene un array serializzato strutturato in modo da avere, per ogni tipo di tassonomia (ad esempio, "category"), i dati relativi a tutte le relative voci (ad esempio i campi title, description, ecc.).

Per recuperare la SEO Description di una categoria a partire dall’ID, puoi fare così:

$taxonomy_meta = get_option( 'wpseo_taxonomy_meta' );
$category_id   = 123; // Sostituisci con l'ID della categoria
if ( isset( $taxonomy_meta['category'][ $category_id ]['wpseo_desc'] ) ) {
    $meta_description = $taxonomy_meta['category'][ $category_id ]['wpseo_desc'];
    echo $meta_description;
} else {
    echo 'Meta description non trovata per questa categoria.';
}

In questo modo accedi direttamente all’array serializzato e puoi estrarre il valore della SEO Description salvato per quella specifica categoria.

2. Tabella wp_yoast_indexable

A partire da Yoast SEO 14 (e versioni successive), il plugin ha introdotto la tabella wp_yoast_indexable per gestire i dati “indexable” (ossia, quelli necessari per il rendering e la visualizzazione nei risultati di ricerca). In questa tabella sono presenti colonne come title, description, keywords e altre informazioni SEO correlate al contenuto. Per le tassonomie, questa tabella memorizza il meta description (nella colonna description) associato all’object_id (l’ID della categoria) e alle tipologie relative (object_type e object_sub_type).

Per leggerla direttamente dal database, puoi sfruttare l’oggetto globale $wpdb in questo modo:

global $wpdb;
$category_id      = 123; // Sostituisci con l'ID della categoria
$indexable_table  = $wpdb->prefix . 'yoast_indexable';
$query            = $wpdb->prepare(
    "SELECT description FROM $indexable_table 
     WHERE object_id = %d AND object_type = 'term' AND object_sub_type = 'category'",
    $category_id
);
$meta_description = $wpdb->get_var( $query );
echo $meta_description;

Questa query recupera la meta description associata alla categoria dal nuovo sistema indexable.

Note Finali

  • Versione e Indice: La presenza e l’aggiornamento dei dati nel sistema wp_yoast_indexable dipende dal processo di indicizzazione interno di Yoast SEO. Se hai apportato modifiche manuali o modelli personalizzati, è possibile che l’indice debba essere rigenerato per riflettere i nuovi valori.
  • Differenze di Implementazione: In ambienti dove sono state aggiornate versioni più recenti, potresti trovare che entrambi i sistemi (l’opzione in wp_options e la tabella wp_yoast_indexable) contengono informazioni, per ragioni di retrocompatibilità o per motivi di performance. È importante verificare la documentazione ufficiale della versione di Yoast SEO che stai utilizzando per capire esattamente quale meccanismo viene considerato “master”.

0 commenti