【WordPress】サブドメイン形式のサイトをサブディレクトリ形式に変更する

wordpressにおいて一つのドメインで複数のサイトを運用したい場合、wordpressの機能によって作成できるマルチサイトを利用するケースが多いのではないかと思います。
マルチサイトにはサブドメイン方式とサブディレクトリ方式の2種類あるのですが、SEOにおいては親サイトのドメインパワーを受けることができるサブディレクトリ型の方がメリットが大きいといわれています。

今回はこのような理由から一旦サブドメイン方式で作成したwordpressサイトを先日サブディレクトリ方式に変更する機会がありましたので、その時に実施した手順をご紹介したいと思います。

長文になりますが、最後までお読みただけますと幸いです。
また、純粋にサブディレクトリ方式の新サイトを作りたい方もご参考にしていただければと思います。


## 環境
CentOS Linux: 7.4.1708
nginx: 1.12.2
PHP: 7.0.27
WordPress: 4.9.18
MySQL: 5.6.38

## 概要
wordpressでマルチサイトを作成する場合、「親となるサイトの最初の投稿から1か月以上経過しているとサブドメイン方式しか選ぶことができない」という制約があります。
この制約により、私は子サイトを作るにあたり一旦サブドメイン方式で作成したのですが、ドメインパワーの必要性により後からサブディレクトリ方式に変更することになりました。

しかし上記の制約からwordpressのマルチサイト機能は使えないため、wordpressの機能ではなくサーバーやデータベースを直接操作することでサブディレクトリ化を実現しました。

大まかな流れとしては次の通りです。

1. 新しいディレクトリを作成
2. 設定ファイルを編集
3. DBとDBユーザーを作成
4. 1で作成したディレクトリにwordpressをインストール
5. インストールしたwordpressの「wordpress」ディレクトリの名前を「sub」に変更
6. 旧サイトのURLに対して301リダイレクトをかける
7. 新サイトのURLにアクセスしてworpressの初期設定を実施
8. 既存サイトから新サイトへデータ移行

なお、以下の説明においては変更前および変更後のサイトのURLを以下の通りとします。

変更前：https\://sub.sample.com

変更後：https\://sample.com/sub


## ディレクトリ構成
サーバー上のディレクトリ構成ですが、親サイトのルートディレクトリが```/var/www/wordpress```だった場合、```/var/www/```直下に別ディレクトリ(sub)を作成し、そこに新しくwordpressをインストールします。
さらにインストールしたwordpressディレクトリの名前を「wordpress」から「sub」に変更します。(理由は後述)
そのため、子サイトのwordpressルートディレクトリは次のようになります。

```
/var/www/sub/sub/
```

また、親サイトを含めたディレクトリ構成は以下のようになります。

```
root/
   └ var/
       └ www/
            ├ wordpress/ <-親サイトのwordpressルートディレクトリ
            │
            └ sub/
                └ sub/ <-子サイトのwordpressルートディレクトリ
```

## DB構成
wordpressにおいて複数サイトを作成する場合におけるwordpressインスタンスとDBの関係は、こちらのページで紹介されているよ3つのパターンが存在します。

[複数 WordPress サイトのインストール](https://ja.wordpress.org/support/article/installing-multiple-blogs/
)

![installing_multiple_wordpresses.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261074/997230a6-079e-a019-1827-6f43839e39e3.jpeg)


今回はwordpressのマルチサイト機能は使わないため「Single Database」「Multiple Database」のどちらかにします。
この二つの違いはDBを分けるか分けないかですが、今回は親サイトが使用中のDBとの競合を回避するためにDBを二つ作成する「Multiple Database」の構成を選びました。

## 手順
### 1. 新しいディレクトリを作成
まずはサーバーにログインして ```/var/www/``` 直下にsubディレクトリを作成します。

```
cd /var/www/
mkdir sub
```

### 2.設定ファイルを編集
次に設定ファイルを編集します。
手元の環境では「nginx.conf」で```/etc/nginx/conf.d/```以下にある.confファイルをすべて読み込むように設定しており、親サイトに関する設定は「wordpress.conf」に、子サイトに関する設定は「sub.conf」に記述しています。
今回の作業によって両サイトともにドメイン部分が「https\://sample.com/」に統一されるため新しい子サイトの設定は「wordpress.conf」に書いていきます。
そのためにまずはファイルのバックアップを取ります。

```
cp -rf wordpress.conf wordpress.conf.bak
```

次に「wordpress.conf」を開き、以下の行を追加します。

```wordpress.conf
location /sub {
    index index.html index.php;
    root /var/www/sub/;
    try_files $uri $uri/ /sub/index.php?u=$uri&$args;
      location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
      }
}
```

これで```https://sample.com/sub```でアクセスときにrootディレクトリが ```/var/www/sub/``` に上書きされます。
これにより ```/var/www/sub/sub``` にあるindex.phpが読み込まれ、子サイトのトップページが表示されます。

なお、rootではなくaliasを ```/var/www/sub/wordpress``` としてもトップページにはアクセスできるのですが、try_filesに失敗し投稿ページにアクセスできなかったため上記のようにしました。
これが子サイトのwordpressのルートディレクトリを ```/var/www/sub/wordpress/``` ではなく ```/var/www/sub/sub/``` とした理由です。

ちなみに、親サイトの設定は以下のようになっています。

```wordpress.conf
location / {
    index index.php;
    root /var/www/wordpress;
    try_files $uri $uri/ /index.php?u=$uri&$args;
}
```

また、以下の行をserverディレクティブに追加することでデータ移行時にインポートが途中で止まるのを防ぐことができます。
このコードでは1024MBまでのデータを一度にアップロードすることが可能になります。

```wordpress.conf
client_max_body_size 1024M;
```

### 3. DBとDBユーザー作成
nginxの設定が終わったらMySQLにログインして新規のDBとDBユーザーを作ります。

```
create database wordpress_sub;
create user 'dbuser_sub'@'localhost' identified by '********';
grant all on wordpress_sub.* to 'dbuser_sub'@'localhost';
```

「wordpress_sub」は新規のDB名、「dbuser_sub」は新規のDBユーザー名です。
また、ホスト名はnginxのため「localhost」を使用しています。

そして作成したユーザーに対してのデータベースレベルの権限を付与します。

DBの設定は以上です。

### 4. wordpressをインストール
新規に作成したsubディレクトリに移動し、wordpressをインストールします。

```
cd  /var/www/sub/
wget http://ja.wordpress.org/wordpress-4.9.18-ja.tar.gz
```
今回はバージョン4.9.18をインストールしました。
インストールしたらlsコマンドで「wordpress-4.9.18-ja.tar.gz」ファイルがインストールされていることを確認し、tarコマンドで展開します。

```
tar zxvf wordpress-4.9.18-ja.tar.gz
```
これでwordpressディレクトリ以下、wordpressに必要なファイルやフォルダが展開されました。
lsコマンドでwordpressディレクトリが作成されていることを確認してください。

### 5. wordpressディレクトリの名前を変更
nginx.confの記載内容に従い、wordpressディレクトリの名前を「sub」に変更します。
これでwordpressのルートディレクトリが ```/var/www/sub/sub/``` なります。
その後wordpress以下のファイルとディレクトリをnginxが読み込めるよう再帰的に所有者と所有グループを変更します。

```
mv wordpress sub
chown -R nginx.nginx sub
```

### 6. 旧サイトのURLに対して301リダイレクトをかける
「sub.conf」(旧サイトの設定ファイル)のserverディレクティブに以下の行を追加します。

```sub.conf
return 301 https://sample.com/sub/$request_uri;
```
$request_uriをつけることで旧サイトのページと同じ新サイトのページにリダイレクトさせることができます。

```
例.
https://sub.sample.com/post01
|
| 301リダイレクト
↓
https://sample.com/sub/post01
```

ここまでで問題なければnginxをリロードします。

```
service nginx reload
```

### 7. 新サイトのURLにアクセスしてworpressの初期設定を実施
ここまでの設定に問題がなければ、新サイトのURL「 https\://sample.com/sub 」にアクセスするとwordpressの初期設定の画面が表示されます。

![スクリーンショット 2021-07-28 185728-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261074/d7a92433-1e07-bfb7-84e9-e96641e72592.png)


「さあ、始めましょう」をクリックし、次の画面へ移動します。

![スクリーンショット 2021-08-02 174534-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261074/95d7f173-9784-1e4b-6edc-b06b316a6af7.png)

手順3で設定したDBの情報を入力します。
接頭辞は「wp_」で構いません。
「送信」をクリックし、次に現れる画面で「インストール実行」をクリックします。

![スクリーンショット 2021-08-02 175103-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261074/751fcffd-c435-a641-d147-93eb701a2eec.png)

サイトのタイトル、ユーザー名などの情報を入力します。
必要項目を入力し終えたら「wordpressをインストール」を選択します。

インストールに成功したら表示される画面で「ログイン」を選択し、ログイン画面に遷移します。
上で設定したユーザー名とパスワードでログイン出来れば完了です。


### 8. 旧サイトから新サイトへデータ移行
ここから先は旧サイトからデータを移行する手順になります。

旧サイトはマルチサイト化してたため有料のプラグインである「All-in-One WP Migration Multisite Extension」を使いました。
このプラグインではサイトネットワーク全体だけでなく、個別サイトをエクスポートすることも可能です。
エクスポートタブから今回移行したいサイトにチェックを入れてください。
また、エクスポートの際はできる限り容量を低く抑えるように高度なオプションでメディアライブラリやプラグインは除外しました。
これらはデータ移行後に手動で入れます。

新サイト側では「All-in-One WP Migration」(無料)をインストールし、旧サイトからエクスポートしたデータをインポートします。
インポートが上手くいったら必要なプラグインを手動でインストールし、サイトのトップページを表示してください。
画像以外の部分が正常に表示されていればOKです。

最後に画像を移行します。
メディアライブラリにアップされた画像は、```/var/www/wordpress/wp-content/uploads/2021/01/sub1.png```のように画像をアップロードした月毎に保存されているケースが多いと思われますので、cpコマンドで月フォルダもしくは年フォルダ単位で移行するのが手っ取り早いと思われます。
なお自分はあらかじめデモ環境(別のサーバー)で確認するためにuploads以下のフォルダをzipにしてダウンロードして再度デモ環境と本番環境にアップロードするという少し面倒な手順を踏んだのですが、本題には直接関係ないためここでは手順の説明は省略させていただきます。

画像の移行が終わり、ブラウザをリロードして画像が表示されたらOKです。

以上で旧サイトからの移行作業は終了です。
大変長い文章になりましたが、最後までお読みいただきましてありがとうございました。

## 参考
- wordpreess用のDB作成
https://www.javadrive.jp/wordpress/install/index1.html

- nginxのaliasについて
https://qiita.com/oogaki_newmedia/items/749c855ad985c8258e66

- wordpressインストール
https://webkaru.net/linux/wordpress-install-centos/