Cambiare la guid dei post

Come ho provveduto a uniformare la GUID dei post di un blog al valore del suo permalink.

In uno dei siti che gestisco e realizzati con WordPress, avevo l’esigenza di cambiare la GUID di ogni post in modo che combaciasse con il suo ID o, per essere più chiari, con il permalink di default (tipo http://miosito.it/?p=123). Il motivo per cui non combaciava era dovuto all’importazione da un file XML estraneo a WordPress. L’operazione di sostituzione può essere effettuata con gli strumenti che il CMS ci fornisce e, visto che magari vi può tornare utile, questo è lo script che ho usato:

<?php
global $wpdb, $post;
$myposts = get_posts('numberposts=-1');
$i = 0;
$updated = 0;
$not_updated = 0;
foreach($myposts as $post) :
	setup_postdata($post);
	$i++;
	$current_guid = get_post_field('guid', $post->ID);
	$correct_guid = get_permalink($post->ID);
	if ($current_guid != $correct_guid) {
		$where = array('ID' => $post->ID);
		$wpdb->update($wpdb->posts, array('guid' => $correct_guid), $where);
		echo $i.'. GUID del post '.$post->ID.' aggiornato da '.$current_guid.' a '.$correct_guid.'<br />';
		$updated++;
	} else {
		echo $i.'. GUID del post '.$post->ID.' OK<br />';
		$not_updated++;
	}
endforeach;

echo '<p><strong>Risultato:</strong><br />';
echo 'Righe aggiornate: <strong>'.$updated.'</strong><br />';
echo 'Righe non aggiornate: <strong>'.$not_updated.'</strong><br />';
echo 'Totale righe controllate: <strong>'.($updated+$not_updated).'</strong></p>';
?>

In poche parole, lo script confronta il campo guid della riga del post con il permalink (che, anche temporaneamente, va impostato come Default) e, se è diverso, lo adegua. Alla fine dell’operazione, lo script stampa tutte le operazioni eseguite, sia che abbia modificato la riga del database sia che non lo abbia fatto.

Ho utilizzato lo script incollandolo nell’index.php, subito dopo la chiamata all’header. In pochi secondi tutte le migliaia di post avevano la GUID corretta. Per averne anche un riscontro visivo, si può aggiungere all’interno del loop, magari proprio prima del titolo del post, questa riga:

echo get_post_field('guid', $post->ID).'<br />'.get_permalink( $post->ID );

Nel Codex, alla pagina Interfacing With the Database ci sono tutte le informazioni necessarie, in particolare il paragrafo “UPDATE rows”.

Occhio al costrutto per i Canonical URLs

Nel precedente articolo sui Canonical URLs avevo commesso un errore di distrazione. Succede. :) Avevo inserito questa sintassi:

<link rel="canonical" content="http://www.miosito.it/2006/miopost/" />

ma è sbagliata, appunto perché <link> non è un meta-tag, ma un link-tag, proprio come i link ai file CSS. Ecco, quindi, la corretta sintassi, come anche riporta la pagina di Google che vi linkavo:

<link rel="canonical" href="http://www.miosito.it/2006/miopost/" />

Per cui il codice PHP da inserire nell’<head> è il seguente:

<?php global $wp_query;
  if (is_single() || is_page()) {
	echo '<link rel="canonical" href="' . get_permalink($wp_query->post->ID) . '" />';
  } ?>

Scusate l’errore. Me ne sono accorto grazie a un messaggio inviato su Twitter da Franz Enzenhofer.

Ottimizzare i link per Google: i Canonical URLs

Se lo stesso articolo può comparire sotto diversi indirizzi web, voi potete stabilire sotto quale indirizzo Google deve considerare quello principale. Basta l’inserimento di poche righe di codice.

Note
Dalla versione 2.9 di WordPress questa funzione è implementata nel core, per cui non è più necessario aggiungerla.

google150Cosa sono i “Canonical URLs”? Una rapida occhiata alla pagina di Wikipedia e in particolare al paragrafo Normalization_process ci dovrebbe illuminare abbastanza, tanto da farci prendere le dovute precauzioni. :) In poche parole si tratta di questo: una data pagina potrebbe essere raggiungibile attraverso distinti indirizzi, ad esempio:

  1. https://www.aldolat.it/miopost/
  2. https://www.aldolat.it/miopost/comment-page-1/
  3. https://www.aldolat.it/miopost/comment-page-2/

ecc., e tutti con o senza trailing slash (/), con tutte le lettere maiuscole e minuscole, ecc. Tutto questo comporta che lo stesso identico articolo possa comparire nei motori di ricerca sotto diversi indirizzi. Google ci dà la possibilità di definire quale sia una volta per tutte l’indirizzo che preferiamo per ogni pagina/post creato utilizzando il tag <link> all’interno del tag <head> di ogni pagina. Lo possiamo fare in modo semplice modificando il file del nostro tema.
Leggi tutto “Ottimizzare i link per Google: i Canonical URLs”

Impostare in maniera efficiente i permalink

WordPress è una piattaforma efficiente, ma può arrancare in particolari condizioni e se i permalink non sono stati scelti con una piccola attenzione. In questo post viene affrontata in dettaglio la questione.

Avvertenza
La gestione dei permalink è stata notevolmente migliorata a partire da WordPress 3.3, per cui queste informazioni risultano obsolete. In termini assoluti, avere un valore numerico in testa al permalink dà prestazioni migliori; ma in termini pratici le differenze di performance tra l’avere un valore numerico e non averlo sono irrisorie se non addirittura inesistenti. Per informazioni dettagliate su come funzionano i permalink in WordPress 3.3 e versioni successive è utile il post di Otto.

wordpress-logoCirca un mese fa è nata una interessante discussione nel forum di WordPress relativa a un elevato e insolito numero di query al database (più di 2.000) ogni volta che si apriva una pagina di un determinato sito. La discussione si è portata avanti tra segnalazione nel Trac di WordPress, discussione in mailing-list e aggiunte al Codex, nonché su blog importanti come quello di Dougal Campbell (da cui questo articolo trae spunto). Credo sia utile far conoscere quanto si è discusso per nostra informazione e annotazione.
Leggi tutto “Impostare in maniera efficiente i permalink”