ローカル環境の WordPress をリモートと同期させる

# 概要

[コマンド一発で WordPress のデプロイ・同期ができるツールをつくりました - モンキーレンチ](https://2inc.org/blog/2017/01/22/5594/)

[キタジマタカシさん](https://twitter.com/inc2734)の記事を読んで、そういえば自分も Wordmove の代わりに書いたシェルスクリプトがあるので、一応公開してみることにしました。

多分、実用にはキタジマさんの [bash-wp-deploy](https://github.com/inc2734/bash-wp-deploy) の方がよいと思います。

私のスクリプトはごく簡易なものなので、[WP-CLI](http://wp-cli.org/ja/) の実行サンプルとして参照いただければと思います。見どころとしては、WP-CLI で SSH 越しにリモートの WP-CLI を実行しているところでしょうか。

元々は WordPress のサーバ移転のために書いたシェルスクリプトを応用したもので、引越し先のサーバで実行すると便利かもしれません。

## 要件

1. WordPress がインストールされた環境が、リモート・ローカル両方にあること
1. シェルが実行可能であること（Bash on Windows は未確認）
1. SSH と rsync が実行可能であること
1. [WP-CLI](http://wp-cli.org/ja/) のインストールが済んでいること

シェルと WP-CLI の両方が、リモート側にもローカル側にも必要です。 ローカルは macOS の Bash、リモートは Debian 8 の Dash で確認しています。

## 設置

1. 下記のスクリプトを、同期させたいローカルの WordPress が設置されているディレクトリ（フォルダ）に`wppull.sh`という名前で保存します。
2. 3行目の`user@example.com`の部分を、リモート側のホスト名（または、IP アドレス）、ログインユーザー名に変更します。
3. 4行目の`/var/www/html`の部分をリモート側の WordPress が設置されているディレクトリに変更します。絶対パスで書いてください。
4. 5行名の`http://example.com`をリモートの WordPress の URL に変更します。
5. 6行名の`http://local.test`をローカル環境の WordPress の URL に変更します。
6. ターミナルを起動し、同期させたいローカルの WordPress が設置されているディレクトリへ移動します。
6. `wp cli info`と入力し、WP-CLI がローカルで動作し、パスが通っていることを確認します。
6. `chmod +x wppull.sh`と入力し、スクリプトに実行権を与えます。
7. `./wppull.sh`で実行します。

**実行結果など、いかなる保証もいたしません。必ず最初に安全な状況で、バックアップを取ってお試しください。**

## コード

```sh
#!/bin/sh
# settings
REMOTE_HOST='user@example.com'
REMOTE_PATH='/var/www/html'
REMOTE_URI='http://example.com'
LOCAL_URI='http://local.test'

# set date stamp
STAMP_DATE=`date +%y%m%d`

# export dump file
wp db export ./wp-content/db_backup_$STAMP_DATE.sql

# export MySQL dump in remote server
wp db export $REMOTE_PATH/wp-content/_dbdump.sql --ssh=$REMOTE_HOST --path=$REMOTE_PATH

# pull remote server files
rsync -auvz $REMOTE_HOST:$REMOTE_PATH/ ./ --exclude="wp-config.php" --exclude="wp-content/upgrade/" --exclude="wp-content/cache/"
# import dump file
wp db import ./wp-content/_dbdump.sql

# for local
wp search-replace $REMOTE_URI $LOCAL_URI --skip-columns=guid

# post-process
ssh $REMOTE_HOST rm $REMOTE_PATH/wp-content/_dbdump.sql
rm ./wp-content/_dbdump.sql
#wp plugin deactivate jetpack backwpup
```
https://gist.github.com/takeshi81/5f5bb19656c09d6c8590f696498f1fac

## 解説

3〜6行目は WP-CLI と rsync などに渡すホスト名やパスの情報です。

8行目は現在の日付を YYMMDD 形式で代入しています。ローカル環境のデータベースのバックアップファイルの名前に使っています。

12行目からが実際に動く部分です。手順は以下のようになります。

1. ローカルの WordPress のデータベースをファイルに書き出して保存（`wp db export ./wp-content/db_backup_$STAMP_DATE.sql`）
2. リモートの WordPress のデータベースをファイルに書き出して、`wp-content`ディレクトリに保存（`wp db export $REMOTE_PATH/wp-content/_dbdump.sql --ssh=$REMOTE_HOST --path=$REMOTE_PATH`）
3. `rsync`でリモートの WordPress の設置ディレクトリと、ローカルのディレクトリ（フォルダ）の内容を同期。`wp-config.php`などは除外（`rsync -auvz $REMOTE_HOST:$REMOTE_PATH/ ./ --exclude="wp-config.php" --exclude="wp-content/upgrade/" --exclude="wp-content/cache/"`）
4. リモートから転送したSQLファイルを、ローカルのデータベースにインポート（`wp db import ./wp-content/_dbdump.sql`）
5. データベースにある URL の情報を、ローカル環境の情報に置換。GUIDは除外（`wp search-replace $REMOTE_URI $LOCAL_URI --skip-columns=guid`）
6. データベースの同期に使ったSQLファイルを削除（`ssh $REMOTE_HOST rm $REMOTE_PATH/wp-content/_dbdump.sql && rm ./wp-content/_dbdump.sql`）

## 最後に

今回記事を書くにあたって、多少変数を使って設定をまとめた部分もありますが、実際には変数も使わずベタッとホスト名やパスを書いて使っていました。少しだけ汎用性が高まったので、個人的にはよかったです。

WP-CLI の設定ファイル（`wp-cli.yml`）を読み込めるような設計にすると、もっといいのですが、それは今後の課題とします。

## 参考

- [WP-CLI 0.24 でリモートサーバーに対してコマンドを実行できるようになりましたよ！ - Firegoby](https://firegoby.jp/archives/6689)

## 改版履歴

2017/01/27: 初稿