1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

WordPressのデータベースプリフィクスを変更するスクリプト

Last updated at Posted at 2020-05-06

はじめに

WordPressのテーブルプリフィクスを変更したかったです。CI/CDで自動デプロイを行う予定です。
プラグインや手動で行う方法は合ったのですが、コマンドで変更する方法が見つからなかったために作成しました。

gistにアップして下記のように実行する想定です。引数に変更後のプリフィクスを指定することができます。

DBに対する変更のため、バックアップは必須です。

$ curl -L https://gist.githubusercontent.com/yousan/10b44cea1f3d66ee711cc7161e2d5a8a/raw/d0cd33d0e2fbfad11066628b09af3f325b8255e1/change_db_prefix.sh | bash -s  newprefix_

コード

change_db_prefix.sh
# !/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_optionswp_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}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?