wordpressを使っていると、カスタマイズしたいと思うことがあります。でも、変に修正して壊してもやだな。。。そう思う方もいらっしゃるのではないでしょうか。僕はそうです。
じゃあバックアップしてやればいいじゃない、、という声も聞こえてきそうですが、それはそれで不安なんです。
ということで一番良いのが、wordpressのサイトごとコピーして、別URLに移植することじゃないか、という結論に至りました。
Contents
じゃあ、どうやってやるのか?
ググると、そういうプラグインがあったり、手順がいくつか見つかったんですが、自分の環境ではうまくいきませんでした。(うまくいっているように見えるけど、記事をクリックすると元のURLに飛んだり、など)
で、最終的には「結局wordpressもファイルとDBなんだから、その辺を修正すればうまくいくんじゃね?」的発想でやったところ、多分うまくいきました。
※今の所この手順で不具合は出ていませんし、コピー元/先両方とも正しく使えていますが、強引な力技です。あくまで自己責任でお願いします!
やりたいこと
・wordpressのサイトを設定・記事をそのままの状態で、同じサーバ上の別URLで再構築したい。
・その際、元のサイトも生かしたい。(つまり、同じサイトを2つ構築し、共存させる)
前提条件
・wordpress4.5
・nginx
・mysql
手順概要
1.wordpressディレクトリのコピー
2.設定の編集
3.DBのコピー
4.DBの書き換え
手順の見方
・”server1″ “server1.test.com” がwordpressが動作しているホスト名
・「source_site」がコピー元のURL
・「dest_site」がコピー先のURL
となっています。
つまり、
移植元のURL = http://server1.test.com/source_site
コピー先のURL = http://server1.test.com/dest_site
もし別サーバで動かすのであれば
http://betsu_server.com/dest_site
となります。
1.wordpressディレクトリのコピー
まずwordpressの実体であるディレクトリをコピーしておきます。
(標準の手順でインストールすれば以下ディレクトリにあるはず)
[root@server1 ~]# cd /usr/share/nginx/html/ [root@server1 html]# cp -pr source_site dest_site
2.設定の編集
次に、configで指定するDBの名前を変更します。
[root@server1 html]# cd dest_site [root@server1 dest_site]# vim /usr/share/nginx/html/dest_site/wp-config.php #---------- 以下の"DB_NAME"を編集 ------------ define('DB_NAME', 'dest_site_db'); #--------------------------------------------
3.DBのコピー
次にDBをコピーします。
なお、”wpdb1″というのが既存サイトのDB名です。標準手順であればこの名前だと思いますが、各々の名前に合わせて手順を変えてください。
[root@server1 ~]# cd /tmp/ [root@server1 tmp]# mysqldump --single-transaction -u root -p wpdb1 > db_backup.sql [root@server1 tmp]# mysql -u root -p ## 以下mysqlシェルで実行 # DBを作成 mysql> create database dest_site_db mysql> use dest_site_db # 先程作った空のDBにバックアップした情報(=wpdb1のコピー)を入れる mysql> source db_backup.sql # 権限を付与(wp-config.phpに書いてあるユーザ名とパスワード) mysql> grant all privileges on dest_site_db.* to 'test'@'localhost' identified by 'test123'; Query OK, 0 rows affected (0.00 sec)
4.DBの書き換え
ここまでで見た目としては完成で、dest_siteのURLを叩けばページが表示されるはずです。
しかしこれだけだと記事をクリックしたりすると元のページに飛ばされてしまいます。
というのも、記事自体のURLはDB上に存在するため、ただコピーするだけだと元のURLのままになっているためです。
ですので次にDBの情報を書き換えます。
### 何を変更すれば良いのかわからないので、 ### 元のURLが書かれてある項目を片っ端からアップデート ### とりあえず、全テーブルの全カラムを総当り的に検索し、 ### URLが書かれている項目を探す。 [root@server1 ~]# export DB_PASS="dest_site_dbで設定したパスワード" #<=上の例では"test123" [root@server1 ~]# mysql -u root -p${DB_PASS} dest_site_db -Nse 'show tables;' | while read TABLE;do mysql -u root -p${DB_PASS} dest_site_db -Nse "select * from ${TABLE}" | grep "server1.test.com/source_site" ;done # => 数が多いので実行結果は割愛しますが、ヒットする項目があります。 # そこを一つずつ新しいURLにアップデートしていきます # 以下は私が実行した時の例です mysql> update wp_posts set guid=REPLACE(guid, "server1.test.com/source_site","server1.test.com/dest_site"); Query OK, 198 rows affected (0.01 sec) Rows matched: 214 Changed: 198 Warnings: 0 mysql> update wp_options set option_value='http://server1.test.com/dest_site' where option_id = 2; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update wp_options set option_value='http://server1.test.com/dest_site' where option_id = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> select * from wp_postmeta where meta_id = 12; +---------+---------+----------------+---------------------------------------------------+ | meta_id | post_id | meta_key | meta_value | +---------+---------+----------------+---------------------------------------------------+ | 12 | 6 | _menu_item_url | http://server1.test.com/source_site/ | +---------+---------+----------------+---------------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from wp_postmeta where meta_id = 142; +---------+---------+----------------+---------------------------------------------------------------+ | meta_id | post_id | meta_key | meta_value | +---------+---------+----------------+---------------------------------------------------------------+ | 142 | 55 | _menu_item_url | http://server1.test.com/source_site/wp-login.php | +---------+---------+----------------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from wp_postmeta where meta_id = 317; +---------+---------+----------------+--------------------------------------------------------+ | meta_id | post_id | meta_key | meta_value | +---------+---------+----------------+--------------------------------------------------------+ | 317 | 216 | _menu_item_url | http://server1.test.com/source_site/?p=86 | +---------+---------+----------------+--------------------------------------------------------+ 1 row in set (0.00 sec) mysql> update wp_postmeta set meta_value=REPLACE(meta_value, "server1.test.com/source_site","server1.test.com/dest_site") where meta_id = 12; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from wp_postmeta where meta_id = 12; +---------+---------+----------------+--------------------------------------------------+ | meta_id | post_id | meta_key | meta_value | +---------+---------+----------------+--------------------------------------------------+ | 12 | 6 | _menu_item_url | http://server1.test.com/dest_site/ | +---------+---------+----------------+--------------------------------------------------+ 1 row in set (0.00 sec) mysql> update wp_postmeta set meta_value=REPLACE(meta_value, "server1.test.com/source_site","server1.test.com/dest_site") where meta_id = 142; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> update wp_postmeta set meta_value=REPLACE(meta_value, "server1.test.com/source_site","server1.test.com/dest_site") where meta_id = 317; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
これで完了です。記事をクリックしてもバッチリ新ページが表示されます。
以上、wordpressを移植する手順でした。
繰り返しになりますが、自己責任でお願いします!くれぐれも商用サイトをいきなり試したりしないようにしてください!