WordPress

【WordPress】環境間をコマンド1つで簡単に同期する

WordPressでブログを運営していると、サイトのデザインの変更や、wp-config.phpやfunction.phpやなどのPHPファイルを編集による設定変更、WordPress・プラグインのアップデートなど様々な作業があると思います。
PHPファイルの編集やアップデートする際は慎重になる必要があると思いますが、ときにはミスをして画面が真っ白みたいなことになりますよね...(私は何度もやらかしました)

そのため動作確認用のステージング環境や開発用のローカル環境を用意している方も多いと思いますが、それぞれの環境で同じ作業をするは面倒ですし、手動だとローカルでやったときと違うオペレーションをしてしまう可能性もあります。

そんな問題を解決するためにコマンド一つでローカル環境↔ステージング環境↔本番環境で作業内容を反映できるシェルスクリプトを自作しました!
本記事では、そのシェルスクリプトのダウンロード方法・初期設定・実行方法について解説します。

あくまで自分で使うために作成したシェルスクリプトのため、不具合により予期しない動作をする可能性もございます。

その際はご自身でトラブルシューティングしていただく必要も出てくるため、ブログを始めたばかりでWordPressの知識があまりない方のご使用は非推奨とします
ご使用する際もバックアップを取るなど、元の環境を復元できる準備を必ず行って下さい

また、本記事で紹介するシェルスクリプトが原因で本番環境が壊れるなどした場合においても一切の責任は負いかねますのでご了承ください

この記事で分かること

  • コマンド一つで WordPressのローカル、ステージング、本番環境の間で同期を取る方法

手順

  1. 同期処理のシェルスクリプトをダウンロードする
  2. 作業ディレクトリに同期処理の設定ファイルをコピーする
  3. 各環境情報を環境変数として設定する
  4. Basic認証関連ファイルを設定する
  5. 各環境のwp-config.phpの内容を設定する
  6. 同期を実行する

1. 同期処理のシェルスクリプトをダウンロードする

Githubの下記URLにあるwp-syncというリポジトリに同期処理が実装されたシェルスクリプトや設定ファイル等をアップロードしてあります。

https://github.com/hiroya232/wp-sync

同期スクリプトは実際に運用しながら随時更新しているのでこのリポジトリの内容と本記事の内容が異なるタイミングがある可能性があります。
その際は記事更新までお待ちいただければと思います。

アクセスすると↓のような画面になりますので、緑色のCodeをクリックしてリポジトリのURLをコピーします。

コピーしたら、ターミナルを開いて任意のディレクトリで下記コマンドでリポジトリをローカルにクローン(ダウンロード)します。

git clone https://github.com/hiroya232/wp-sync.git

これでダウンロードは完了です。
上記コマンドを実行したディレクトリにwp-syncというディレクトリが作成されていて、その中に今回必要なファイル一式が格納されています。

.
├── Dockerfile
├── merge-local-into-prd.sh
├── merge-local-into-stg.sh
├── merge-prd-into-local.sh
├── merge-prd-into-stg.sh
├── merge-stg-into-local.sh
├── merge-stg-into-prd.sh
├── src
│   ├── .env
│   ├── .gitignore
│   ├── .htaccess-basic-auth
│   ├── .htpasswd
│   ├── .vscode
│   ├── docker-compose.yml
│   ├── php.ini
│   ├── temp
│   ├── wp-config-local.php
│   ├── wp-config-prd.php
│   └── wp-config-stg.php
├── srdb.class.php
└── srdb.cli.php

各ファイルの説明は下記の通りです。気になる方は目を通してみて下さい!

ファイル名内容
Dockerfileローカル環境のWordPressのコンテナに関する設定。(※同期処理には使用しません)
merge-local-into-prd.shローカル環境→本番環境に同期する処理。
merge-local-into-stg.shローカル環境→ステージング環境に同期する処理。
merge-prd-into-local.sh本番環境→ローカル環境に同期する処理。
merge-prd-into-stg.sh本番環境→ステージング環境に同期する処理。
merge-stg-into-local.shステージング環境→ローカル環境に同期する処理。
merge-stg-into-prd.shステージング環境→本番環境に同期する処理。
src/各WordPressの作業ディレクトリにコピーする必要のあるファイルをまとめたディレクトリ。
src/.envローカル環境構築・同期処理の実行をする際に必要になる設定値(環境変数)。
src/.gitignore作業ディレクトリ配下をソース管理する際に追跡対象から除外すべきファイルを指定するファイル。不要であれば削除してもOK。(※同期処理には使用しません)
src/.htaccess-basic-authステージング環境で設定するBasic認証の設定内容。
src/.htpasswdBasic認証のユーザ名・パスワード。
src/.vscodeローカル環境でデバッグ実行する際の設定ファイル。(※同期処理には使用しません)
src/docker-compose.ymlローカル環境の全てのコンテナに関する設定。(※同期処理には使用しません)
src/php.iniWordPressを動作させているPHPの設定ファイル。メディアのファイルアップロードサイズ上限など様々な内容を設定できる。
src/temp/同期処理中でダンプしたDBを格納するためのディレクトリ
wp-config-local.php
wp-config-prd.php
wp-config-prd.php
各環境のwp-config.phpの内容。
srdb.class.php
srdb.cli.php
DBのドメインに関するデータを書き換えるために使用する Search-Replace-DB というツールの実行ファイル。
ダウンロードした各ファイルの内容

2. 作業ディレクトリに同期処理の設定ファイルをコピーする

ダウンロードしたファイルのうちsrcディレクトリ配下にあるファイルは基本的にWordPressごとに設定が必要なものなので、ローカル環境のpublic_htmlと同じディレクトリにsrcディレクトの中身のみをコピーして下さい。

以下のような状態になっていればOKです。

.
├── .env
├── .gitignore
├── .htaccess-basic-auth
├── .htpasswd
├── .vscode
├── docker-compose.yml
├── php.ini
├── temp
├── wp-config-local.php
├── wp-config-prd.php
└── wp-config-stg.php

3. 各環境情報を環境変数として設定する

各環境のサーバの情報やドメイン名など、同期処理を実行するにあたって必要な情報を.env に環境変数として設定していきます。
各環境変数の設定値は下記の通りです。

環境変数名設定内容設定例
LOCAL_DOMAIN
STG_DOMAIN
PRD_DOMAIN
各環境のドメイン名。localhost:8000
stg.example.com
example.com
STG_SSH_DESTINATION
PRD_SSH_DESTINATION
ステージング/本番環境を構築しているサーバのホスト名・ユーザ名。
同期処理中でSSH接続する際の宛先。
xs◯◯◯◯◯◯@xs◯◯◯◯◯◯.xsrv.jp
STG_SSH_PORT
PRD_SSH_PORT
ステージング/本番環境を構築しているサーバのポート番号。
同期処理中でSSH接続する際の宛先。
10022
LOCAL_PUBLIC_DIR_PATH
STG_PUBLIC_DIR_PATH
PRD_PUBLIC_DIR_PATH
ローカル/ステージング/本番環境の公開ディレクトリパスpublic_html
/home/xs◯◯◯◯◯◯/example.com/public_html/stg.example.com
/home/xs◯◯◯◯◯◯/example.com/public_html
STG_PUBLIC_DIR_PATH_WITH_DESTINATION
PRD_PUBLIC_DIR_PATH_WITH_DESTINATION
ステージング/本番環境の公開ディレクトリのパス。ホスト名・ユーザ名付き。${STG_SERVER_HOST}:/home/xs◯◯◯◯◯◯/example.com/public_html/stg.example.com
${PRD_SERVER_HOST}:/home/xs◯◯◯◯◯◯/example.com/public_html
LOCAL_DB_HOST
STG_DB_HOST
PRD_DB_HOST
ローカル/ステージング/本番環境のそれぞれのDBホスト名。127.0.0.1
mysql12016.xserver.jp
LOCAL_DB_PORTローカル環境のDBポート番号。3307
LOCAL_DB_NAME
STG_DB_NAME
PRD_DB_NAME
ローカル/ステージング/本番環境のそれぞれのDB名。wordpress
xs◯◯◯◯◯◯_wp◯
LOCAL_DB_USER
STG_DB_USER
PRD_DB_USER
ローカル/ステージング/本番環境のそれぞれのDBユーザ名。wordpress
xs◯◯◯◯◯◯_wp◯
LOCAL_DB_PASSWORD
STG_DB_PASSWORD
PRD_DB_PASSWORD
ローカル/ステージング/本番環境のそれぞれのDBパスワード。-
HTPASSWD_PATH_WITH_DESTINATIONBasic認証に用いる.htpasswdファイルが有るディレクトリのパス。${STG_SERVER_HOST}:/home/xs◯◯◯◯◯◯/example.com/htpasswd/stg.example.com
WP_SYNC_REPOSITORY_PATH一つ前の手順「シェルスクリプトをダウンロードする」でダウンロードしたwp-syncディレクトリのパス~/workspace/wp-sync
WORDPRESS_CACHE_DIR_PATHWordPressのキャッシュディレクトリのパス。wp-content/cache
WORDPRESS_IMAGE_BUILD_CONTEXTローカル環境構築時に起点となるディレクトリ。
基本的に一つ前の手順「シェルスクリプトをダウンロードする」でダウンロードしたwp-syncディレクトリのパスを設定すればOK。
~/workspace/wp-sync
DB_CONTAINER_NAMEローカル環境のDBコンテナの名前。
任意の名前を入力する。
db_{ドメイン名}
DB_CONTAINER_PORTローカル環境のDBコンテナのポート番号。
LOCAL_DB_PORTと一致させる。
$LOCAL_DB_PORT
WORDPRESS_CONTAINER_NAMEローカル環境のWordPressコンテナの名前。
任意の名前を入力する。
wordpress_{ドメイン名}
WORDPRESS_CONTAINER_PORTローカル環境のDBコンテナのポート番号。
空いている任意のポート番号を入力する。
8000
REDIS_CONTAINER_NAMEローカル環境のRedisコンテナの名前。
任意の名前を入力する。
redis_{ドメイン名}
REDIS_CONTAINER_PORTローカル環境のRedisコンテナのポート番号。
空いている任意のポート番号を入力する
6379
環境変数の設定する内容と例

4. Basic認証関連ファイルを設定する

本番→ステージング、ステージング→本番のように同期処理を行った際にBasic認証の設定・解除を行う処理が実行されるため、
その際必要になる設定を行います。
設定が必要なのは下記2ファイルです。

  • .htaccess-basic-auth
  • .htpasswd

.htaccess-basic-auth

「2. 各環境情報を環境変数として設定する」で設定したHTPASSWD_PATH から${STG_SERVER_HOST}:を除いた文字列をAuthUserFileに設定します。

AuthUserFile "/home/xs◯◯◯◯◯◯/example.com/htpasswd/stg.example.com"
AuthName "Member Site"
AuthType BASIC
require valid-user

.htpasswd

「2. 各環境情報を環境変数として設定する」で設定したHTPASSWD_PATH にある.htpasswdのファイルの内容をそのままコピペします。

{ユーザ名}:{パスワード}

5. 各環境のwp-config.phpの内容を設定する

各環境のwp-config.phpの内容をそれぞれ下記3つのファイルにコピペします。

  • wp-config-local.php
  • wp-config-stg.php
  • wp-config-prd.php

これで同期処理実行の準備は整いました!
次の手順で動作確認をしていきます。

6. 同期を実行する

まずは試しに本番→ローカルの同期処理を実行してみます。

何かあってもすぐ復元できるように、実行する前に必ず本番環境の(必要であればローカル環境も)バックアップを取って下さい

ステージング環境があるならステージング→ローカルで試した方が無難です。

ターミナルで作業ディレクトリへ移動して、下記コマンドでシェルスクリプトを実行します。

sh {wp-syncのパス}/merge-prd-into-local.sh

すると、更新されたファイルの数にもよりますが、大体数秒〜10数秒くらいで同期が完了します。

$ sh {wp-syncのパス}/merge-prd-into-local.sh .
【ローカルのDBをバックアップ】
mysqldump: [Warning] Using a password on the command line interface can be insecure.
【完了】

【本番のDBをダンプ】
【完了】


 ・
 ・
 ・


64 updates were actually made
It took 0.36004281 seconds

Check the output for errors. You may need to ensure verbose output is on by using -v or --verbose.
【完了】

同期処理自体は問題なく終了しているのにうまく反映されていない場合はキャッシュが関係している可能性があるので、
ブラウザキャッシュ・サーバキャッシュ・Redisキャッシュの削除をしてみて下さい。

同期実行時にPHP のエラーでarray_column()が使用できませんといったようなものが出た場合は Xserver の CLI 用の PHP のバージョンが古いことが原因である可能性があるので、下記サイトを参考にバージョンアップしてみてください。Xserver の管理画面から確認できるものとは別のものになります。
https://pgmemo.tokyo/data/archives/1350.html

参考

-WordPress