Vous venez de finir de réaliser votre site WordPress et là c’est le drame ! Vous avez oublié de modifier le préfix de base de données. Innocemment, vous modifiez la variable $table_prefix du fichier wp-config.php en pensant que ce sera suffisant mais malheureusement la réponse est non !
Vous devez modifier plusieurs éléments :
- le prefix du fichier wp-config.php
- le prefix des tables de la base de données
- certains champs dans différentes tables
Faire une simple liste des éléments à corriger pourrait être suffisant mais beaucoup moins pratique à l’usage.
Nous allons voir comment mettre un petit script qui va nous permettre d’identifier les éléments à modifier et nous afficher uniquement les requêtes SQL a exécuter.
Configurations
Dans un premier temps, on va simplement mettre en place les éléments de connexion à la base de données, ainsi que l’ancien et le nouveau préfix.
define('DB_NAME', 'name'); define('DB_USER', 'root'); define('DB_PASSWORD', 'root'); define('DB_HOST', 'localhost'); define('DB_CHARSET', 'utf8'); $table_prefix = 'ANCIEN_PREFIX_'; $new_prefix = 'NEW_PREFIX_';
Une fois le script fini, il faudra uniquement changer cette partie pour faire fonctionner le script avec une autre base de données.
Connexion à la base de données
On fait une simple connexion via PDO, en précisant l’encodage.
$bdd = new PDO("mysql:dbname=" . DB_NAME . ";" . DB_HOST, DB_USER, DB_PASSWORD); $bdd->exec("SET NAMES '" . DB_CHARSET . "'");
Changement du préfix des tables
Maintenant, l’objectif est de générer une requête SQL pour modifier le préfix de chaque table
$requete = "SHOW TABLES"; $query = $bdd->prepare($requete); $query->execute(); $all_tables = $query->fetchAll(PDO::FETCH_COLUMN); echo '<ul>'; foreach ($all_tables as $table) { $new_table = str_replace($table_prefix, $new_prefix, $table); // Rename table ANCIEN_PREFIX_commentmeta to NEW_PREFIX_commentmeta; echo "<li>Rename table $table to $new_table;</li>"; } echo '</ul>';
Pour chaque ligne, on va afficher la requête SQL a exécuter. On n’exécute pas encore les requêtes SQL, on va les garder pour la fin 🙂
Maintenant, il faut modifier le préfix dans certains champs.
Préfix et champs
Il faut passer sur chaque colonne de chaque table et vérifier si le préfix est utilisé ou non.
$result = []; foreach ($all_tables as $key => $table) { $requete = "DESCRIBE $table"; $columns = $bdd->prepare($requete); $columns->execute(); $columns = $columns->fetchAll(PDO::FETCH_COLUMN); foreach ($columns as $column) { $r = "SELECT * FROM `$table` WHERE `$column` LIKE '%$table_prefix%'"; $p = $bdd->prepare($r); $p->execute(); $p = $p->fetchAll(PDO::FETCH_ASSOC); if (count($p) > 0) { $result[$table][$column] = $p; } } }
Ligne 8, on va simplement récupérer chaque colonne de la table en cours.
Ligne 14, pour chaque colonne, on va regarder si l’ancien préfix est utilisé, si oui, on récupère la ligne ou les lignes.
On termine ligne 21 en regroupant les éléments sous la même table et même colonne.
Et on termine avec l’affichage des requêtes
echo "<ul class='search'>"; foreach ($result as $table => $items) { echo "<li><h2>Table : $table</h2><ul class='submenu'>"; foreach ($items as $column => $item) { echo "<h3>Colonne : $column " . count($item) . " ligne(s)</h3>"; foreach ($item as $structures) { $new_table = str_replace($table_prefix, $new_prefix, $table); $new_structure = str_replace($table_prefix, $new_prefix, $structures[$column]); // UPDATE NEW_PREFIX_options SET option_name = replace(option_name, 'ANCIEN_PREFIX_user_roles', 'NEW_PREFIX_user_roles'); echo "<li>UPDATE $new_table SET $column = replace($column, '$structures[$column]', '$new_structure');</li>"; } } echo "</ul></li>"; } echo "</ul>";
On va passer sur notre tableau et remplacer l’ancien préfix par le nouveau, quelle que soit la colonne.
Une fois ici, il reste uniquement à exécuter les requêtes SQL dans l’ordre (via phpMyAdmin par exemple) :
- les tables
- et ensuite les champs
Évidemment, le script peut être amélioré, par exemple en réalisant directement les modifications grâce au script mais personnellement je préfère le faire manuellement afin de garder un contrôle sur ce que je fais.