Aggiornare Post Slug Con Query e Script PHP
Come ricostruire i permalink se lo slug dei singoli post se questo non esiste?
Iniziando a fare un po di luce vado a spiegare una situazione in cui mi sono ritrovato.
Tempo fa ho dovuto passare 4 anni di contenuti e news da un database creato su misura importandoli attraverso varie query nella struttura del database di WordPress, visto che nella nuova versione del sito avevo concordato con il Cliente di utilizzare WordPress per vari motivi.
Dopo aver messo online il sito ed attivato i permalink su WordPress, ecco che qualche tempo dopo i tool per webmaster di Google mi segnalavano che c’era un buon 80% di link che indirizzavano sulla pagina 404 ovvero risorsa non trovata.
Dopo una rapida occhiata al database di WP, precisamente alla tabella wp_posts, mi sono accorto che proprio quel’ 80% dei post avevano il campo post_name vuoto.
NOTA: il post_name è il campo che permette la creazione del link per raggiungere un certo post e se questo campo è vuoto il permalink a quel dato post risulterà errato e redirezionerà appunto a una pagina 404.
Mi sono accorto che c’ erano più di 2 migliaia di articoli e news con il campo nullo e iniziare a manina a passarmi uno per uno a personalizzare lo slug sarebbe stato una cosa da pazzi ed ecco che mi viene in soccorso uno script php che si interfaccia al database, va in cerca di tutti i post con il campo post_name nullo, cioè vuoto, e lo riempie automaticamente… in meno di 1 secondo ho ripristinato la situazione e l’ indicizzazione su Google è tornata alla normalità.
Prima di utilizzare lo script seguente accertati di avere il BACKUP del database per evitare spiacevoli inconvenienti.
Ecco lo script php da richiamare attraverso il browser:
<?php
$dbhost = 'localhost';
$dbuser = 'utente';
$dbpass = 'password';
$dbname = 'nome_database';
$sql = 'SELECT ID, post_title
FROM wp_posts
WHERE post_status = "publish"
and post_name = " "
order by ID asc';
$db = mysql_connect($dbhost, $dbuser, $dbpass) or die('Could not connect: ' . mysql_error());
mysql_select_db($dbname);
$result = mysql_query($sql) or die('Query failed: ' . mysql_error());
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$id = $row['ID'];
$title = $row['post_title'];
$title = trim($title);
$title = strtolower($title);
$title = str_replace(" ", "-", $title);
$title = ereg_replace("[^a-z0-9-]", "", $title);
$title = ereg_replace("[-]+", "-", $title);
echo "ID :{$row['ID']} <br>" .
"post_title : {$row['post_title']} <br>" .
"post_title : {$title} <br>";
$sql_u = 'UPDATE `wp_posts` SET post_name = "' . $title .'"'
.'WHERE ID = ' . $id;
echo '<br>'.$sql_u;
mysql_query($sql_u) or die('Query failed: ' . mysql_error());
}
mysql_close($db);
?>