• このエントリーをはてなブックマークに追加

【wordpress】サイトをコピーして別URLに移植させる手順

  • このエントリーをはてなブックマークに追加

Wordpress
zaco muraです

wordpressを使っていると、カスタマイズしたいと思うことがあります。でも、変に修正して壊してもやだな。。。そう思う方もいらっしゃるのではないでしょうか。僕はそうです。

じゃあバックアップしてやればいいじゃない、、という声も聞こえてきそうですが、それはそれで不安なんです。

ということで一番良いのが、wordpressのサイトごとコピーして、別URLに移植することじゃないか、という結論に至りました。

スポンサーリンク
Sponsords Link

じゃあ、どうやってやるのか?

ググると、そういうプラグインがあったり、手順がいくつか見つかったんですが、自分の環境ではうまくいきませんでした。(うまくいっているように見えるけど、記事をクリックすると元の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を移植する手順でした。
繰り返しになりますが、自己責任でお願いします!くれぐれも商用サイトをいきなり試したりしないようにしてください!

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link