はじめに
WordPressのテーブルプリフィクスを変更したかったです。CI/CDで自動デプロイを行う予定です。
プラグインや手動で行う方法は合ったのですが、コマンドで変更する方法が見つからなかったために作成しました。
gistにアップして下記のように実行する想定です。引数に変更後のプリフィクスを指定することができます。
DBに対する変更のため、バックアップは必須です。
$ curl -L https://gist.githubusercontent.com/yousan/10b44cea1f3d66ee711cc7161e2d5a8a/raw/d0cd33d0e2fbfad11066628b09af3f325b8255e1/change_db_prefix.sh | bash -s newprefix_
コード
# !/usr/bin/env bash
PREFIX=`wp db prefix`
NEW_PREFIX=$1
if [[ -z "$1" ]] ; then
echo 'No prefix is specified. Please specify new table prefix.'
exit;
fi
# Get all WordPress tables
# @see https://developer.wordpress.org/cli/commands/db/tables/
TABLES=`wp db tables --all-tables-with-prefix`
# Change options and usermeta table value
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}options
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}usermeta
# Rename tables
# @see https://www.wpbeginner.com/wp-tutorials/how-to-change-the-wordpress-database-prefix-to-improve-security/
IFS=$'\n'
for TABLE in ${TABLES}
do
NEW_TABLE=`echo ${TABLE} | sed -e 's/^'${PREFIX}'/'${NEW_PREFIX}'/'`
echo 'DROP TABLE IF EXISTS ' ${NEW_TABLE} | wp db cli # Remove tables
echo 'RENAME TABLE `'${TABLE}'` TO `'${NEW_TABLE}'`;' | wp db cli # Do RENAME here
done
# Change table prefix at wp-config.php
wp config set table_prefix ${NEW_PREFIX}
変更前のプリフィクスの取得
$ wp db prefix
wp_
テーブル一覧の取得
テーブル一覧を取得します。一部のプラグインでは--all-tables-with-prefix
オプションが無いとうまく取得することができなかったためつけています。
ただこのオプションの場合、単にオプションだけで判断するため、偶然プリフィクスがかぶってしまった…、という場合にはテーブルが壊れます。
$ wp db tables --all-tables-with-prefix
optionsとusermetaの変更
wp_options
とwp_usermeta
のデータの中身を書き換えます。
主に権限周りなどでテーブル内にデータが入っているため、そちらを書き換えます。
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}options
wp search-replace ${PREFIX} ${NEW_PREFIX} ${PREFIX}usermeta
こちらも強制的に変えているため、もしプリフィクスが短い文字列だったりした場合には予期せぬ動作(他のデータを壊す可能性)があります。
テーブルの変更
テーブルのリストでループを回し、書き換えを行ないます。
IFS=$'\n'
for TABLE in ${TABLES}
do
NEW_TABLE=`echo ${TABLE} | sed -e 's/^'${PREFIX}'/'${NEW_PREFIX}'/'`
echo 'DROP TABLE IF EXISTS ' ${NEW_TABLE} | wp db cli # Remove tables
echo 'RENAME TABLE `'${TABLE}'` TO `'${NEW_TABLE}'`;' | wp db cli # Do RENAME here
done
まず変換先のテーブル名を作成します。例えば wp_posts
から new_posts
といったテーブル名にします。
$ echo ${TABLE} | sed -e 's/^'${PREFIX}'/'${NEW_PREFIX}'/'
次にwp db cli
でテーブル名変更のSQLを実行します。
echo 'DROP TABLE IF EXISTS ' ${NEW_TABLE} | wp db cli # Remove tables
echo 'RENAME TABLE `'${TABLE}'` TO `'${NEW_TABLE}'`;' | wp db cli # Do RENAME here
wp-config.php内のプリフィクスの変更
wp-config.php
の$prefix
の項目を書き換えます。
これ知らなかったんですがめちゃくちゃ便利ですね…!
$ wp config set table_prefix ${NEW_PREFIX}