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:

 1<?php
 2global $wpdb, $post;
 3$myposts = get_posts('numberposts=-1');
 4$i = 0;
 5$updated = 0;
 6$not_updated = 0;
 7foreach($myposts as $post) :
 8    setup_postdata($post);
 9    $i++;
10    $current_guid = get_post_field('guid', $post->ID);
11    $correct_guid = get_permalink($post->ID);
12    if ($current_guid != $correct_guid) {
13        $where = array('ID' => $post->ID);
14        $wpdb->update($wpdb->posts, array('guid' => $correct_guid), $where);
15        echo $i.'. GUID del post '.$post->ID.' aggiornato da '.$current_guid.' a '.$correct_guid.'<br />';
16        $updated++;
17    } else {
18        echo $i.'. GUID del post '.$post->ID.' OK<br />';
19        $not_updated++;
20    }
21endforeach;
22  
23echo '<p><strong>Risultato:</strong><br />';
24echo 'Righe aggiornate: <strong>'.$updated.'</strong><br />';
25echo 'Righe non aggiornate: <strong>'.$not_updated.'</strong><br />';
26echo 'Totale righe controllate: <strong>'.($updated+$not_updated).'</strong></p>';
27?>

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”.