Sèkun blog


Changer le préfix des tables avec wordpress

2021-04-20 dev | tags : wordpress wpcli

On va manipuler les bases de données d'un site wordpress (un ou plusieurs si vous partagez la même BD entre plusieurs sites). Avant de faire quoi que ce soit, faites un backup de votre base de données, et testez-le pour être sûr de pouvoir annuler vos opérations.

L'article se base sur la méthode 1 d'un poste disponible à l'adresse suivante: wpmyweb.com/change-wordpress-database-table-prefix.html

Il faut déterminer le préfix des tables utilisées, on l'obtient via la valeur de la variable $table_prefix dans wp-config.php.

On récupère d'abord toutes les tables concernées dans une variable $tables:

tables=$(mysql -u DBUSER DBNAME -e "show tables;" -B -p | grep "DBPREFIX")

DBUSER, DBNAME et DBPREFIX sont respectivement le nom d'utilisateur qui a accès à la base de données, le nom de la BD ainsi que le préfix des tables utilisé.

On renomme ensuite toutes les tables via l'instruction sql RENAME. Notons NEWPREFIX le nouveau préfix souhaité. Pour tester notre code avant de l'exécuter, on peut vérifier ce qu'il va réaliser:

while read table;
    do newname="NEWPREFIX${table#DBPREFIX}"
    echo "rename table \`$table\` to \`$newname\`"
done <<< "$tables"

Une fois le code sql approuvé, on peut l'exécuter:

while read table;
    do newname="NEWPREFIX${table#DBPREFIX}"
    echo "rename table \`$table\` to \`$newname\`" | mysql -u DBUSER DBNAME -p
done <<< "$tables"

Ce n'est pas tout, car wordpress hardcode le préfix dans des entrées de deux de ses tables: options et usermeta.

Vous remplacez NEWPREFIX par le nouveau préfix ci-après. Par exemple, si NEWPREFIX vaut wp2_, on a: NEWPREFIXoptions doit être remplacé par wp2_options. De même pour DBPREFIX qui équivaut à l'ancien préfix. Lancez mysql via mysql -u DBUSER DBNAME -p, et exécutez:

UPDATE `NEWPREFIXoptions` SET `option_name`=REPLACE(`option_name`,'DBPREFIX','NEWPREFIX') WHERE `option_name` LIKE 'DBPREFIX%';
UPDATE `NEWPREFIXusermeta` SET `meta_key`=REPLACE(`meta_key`,'DBPREFIX','NEWPREFIX') WHERE `meta_key` LIKE 'DBPREFIX%';
Article publié le 20 avril 2021.