WordPressをマルチドメイン化する！！

# この記事は？
マルチドメイン化したWordpressのドメイン名(URL)の変更に四苦八苦した証跡ですｗ

### きっかけ
マルチドメイン化したWordpressで動いている、1つ目のブログのドメイン名がIPになっていて気に喰わない。
このままなのも癪なので変更しようとしたら、添付の画像の通りグレーアウトしていて変更できず。
![Wordpressマルチドメイン化の闇.png](https://qiita-image-store.s3.amazonaws.com/0/36284/68516fba-5b5a-9c99-9d7b-ff73fb5807c1.png)

ちょっと調べてみたら、

http://wpdocs.osdn.jp/%E3%82%B5%E3%82%A4%E3%83%88_URL_%E3%81%AE%E5%A4%89%E6%9B%B4

上記のページに

```
注: 以下の手順はシングルインストールの WordPress 向けのものです。WordPress マルチサイトをお使いの場合は、データベースを手動で編集する必要があります。
```

…まじかよ。知らなかったよ…。もっとデカデカと書いておいて欲しい(´・ω・｀)

ダメ元でマルチドメイン→シングル化し、URL変更→再度マルチドメイン化をトライしたところ、下記の表記を確認。

```
「既存のネットワークがあります、ネットワークのデータベースのテーブルを空にするか削除してください。」
```

http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?Wordpress
調べてみたら、

```
「既存のネットワークがあります、ネットワークのデータベースのテーブルを空にするか削除してください。」 となった場合は以下のレコードを削除する
*_blogs, *_registration_log, *_site, *_sitemeta, *_blogs_versions, *_signups (例: drop table wp_blogs;)
```
とある。

ああ。どうやら、上記のテーブルを削除すればいけるようだ。


### ここで折角なので、レコード削除せずにDB修正で乗り切ることにする。
その前に、関連テーブル調査。

http://www.doya-doya.com/word-press/2011/11/22/8274#c2
ふむふむ、どうやら「domain」ってカラムにサイトのドメイン名を書いてあるらしい…。

```
mysql> USE information_schema;
mysql> select table_name, column_name from information_schema.columns where column_name like '%domain';
+---------------+-------------+
| table_name    | column_name |
+---------------+-------------+
| wp_blogs      | domain      |
| wp_signups    | domain      |
| wp_site       | domain      |
+---------------+-------------+
6 rows in set (0.01 sec)

mysql> 
```

上記のテーブルの中身を見てみると、マルチドメイン化して使っている2つのURLが入っていた。

```sql

mysql>USE <wordpressで使用しているdb名> ;
mysql> SELECT * FROM wp_blogs ;
+---------+---------+------------------+------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
| blog_id | site_id | domain           | path | registered          | last_updated        | public | archived | mature | spam | deleted | lang_id |
+---------+---------+------------------+------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
|       1 |       1 | <変更前のIP>     | /     | 2015-03-23 03:24:16 | 2015-06-12 19:47:29 |      1 |        0 |      0 |    0 |       0 |       0 |
|       2 |       1 | test.example.com | /    | 2015-03-30 06:24:39 | 2015-06-12 19:46:18 |      1 |        0 |      0 |    0 |       0 |       0 |
+---------+---------+------------------+------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
```

なんか「domain」カラムにあるIPをドメイン名に置換してやれば、行けそうな気がするぞ…！！


というわけで、「wp_blogs」、「wp_signups」、「wp_site」テーブルにある「domain」カラムを書き換えることにする。

### その前にバックアップ。

切り戻しが楽なように、テーブルごとコピーしとく。

```
mysql>CREATE TABLE wp_blogs_bk LIKE wp_blogs ;
mysql>INSERT INFTO wp_blogs_bk SELECT * FROM wp_blogs;
mysql>
mysql>CREATE TABLE wp_blogs_bk LIKE wp_blogs ;
mysql>INSERT INFTO wp_blogs_bk SELECT * FROM wp_blogs;
mysql>
mysql>CREATE TABLE wp_blogs_bk LIKE wp_blogs ;
mysql>INSERT INFTO wp_blogs_bk SELECT * FROM wp_blogs;
```

念には念を入れて、dumpも取得。

```
# mysqldump --all-databases --events -u root -p > /root/all_dump.20150613
# mysqldump --databases <wordpressで使用しているdb名> -u root -p > /root/wp_dump.20150613
```


### ドメイン名修正。

1件ずつ調べながらやるのは、流石に吐きそうになるので、師匠から教えてもらった技でまとめてUPDATE文を作成。

```sql

mysql> SET sql_mode='PIPES_AS_CONCAT' ;
mysql> SELECT 'UPDATE ' || TABLE_SCHEMA ||'.' || TABLE_NAME || ' SET domain = \'<変更したいドメイン名>\'' || ' WHERE domain = \'<変更前のドメイン名>\' ;' FROM information_schema.columns WHERE column_name like '%domain' AND TABLE_NAME NOT LIKE '%_bk';
+----------------------------------------------------------------------------------------------------------------------------------+
| 'UPDATE ' || TABLE_SCHEMA ||'.' || TABLE_NAME || ' SET domain = \'<変更したいドメイン名>\'' || ' WHERE domain = \'<変更前のドメイン名>\' ;' |
+----------------------------------------------------------------------------------------------------------------------------------+
| UPDATE <wordpressで使用しているdb名>.wp_blogs SET domain = '<変更したいドメイン名>' WHERE domain = '<変更前のドメイン名>' ;             |
| UPDATE <wordpressで使用しているdb名>.wp_signups SET domain = '<変更したいドメイン名>' WHERE domain = '<変更前のドメイン名>' ;           |
| UPDATE <wordpressで使用しているdb名>.wp_site SET domain = '<変更したいドメイン名>' WHERE domain = '<変更前のドメイン名>' ;              |
+----------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.01 sec)
mysql> 
```

出来上がったUPDATE文をそのままコンソールで流す。


### wp-config.phpの修正。
あとは、下記のサイトを参考に、wp-config.phpを修正すれば無事完了。
http://www.doya-doya.com/word-press/2011/11/22/8274#c2
http://snickerjp.blogspot.jp/2014/01/WordPress-MultiSite-Migration.html
http://seihiguchi.com/2012/10/moving-wordpress-multisite/
http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?Wordpress
http://wpdocs.osdn.jp/%E3%82%B5%E3%82%A4%E3%83%88_URL_%E3%81%AE%E5%A4%89%E6%9B%B4#wp-config.php_.E3.81.AE.E7.B7.A8.E9.9B.86


お疲れ様でした。
今のところ無事動いているけど、きっとこのやり方は邪道な気がするぞいｗ