Cambiare la guid dei post

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

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. http://www.aldolat.it/miopost/
  2. http://www.aldolat.it/miopost/comment-page-1/
  3. http://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.
Continua a leggere

Impostare in maniera efficiente i permalink

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.
Continua a leggere