WordPress

【WordPress】ローカルと本番の内容をコマンド一つで同期する方法

WordPress でブログを運営していると、サイトのデザインだったり、直接 PHP ファイルをいじって設定を変更することもありますよね。
特に PHP ファイルを直接いじるときは慎重になる必要がありますがいくら気をつけても時にミスしてしまうのが人間です。
なのでステージング環境だったりローカル環境を用意している方も多いと思いますが、それぞれの環境で同じ作業をするは面倒ですよね。
今回はその環境間での同期をコマンド一つで完了させる方法を Xserver を例にとって紹介します。

この記事で分かること

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

手順

  1. 同期に使用するリポジトリを Github からクローンする
  2. 各環境に合わせて設定値を書き換える
  3. 同期を実行する

同期に使用するリポジトリを Github からクローンする

下記リポジトリに同期用の処理をまとめたシェルスクリプトとローカル環境をDockerで構築するための Compose ファイルがあります。

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

まずはこちらにアクセスして、
URL をコピーします(SSH の設定をしていない方は HTTP の方でも問題ないと思います)

コピーしたら、好きなディレクトリに移動して以下コマンドでリポジトリをローカルにクローンします

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

クローンしたディレクトリの中身は以下のようになっています。

.
├── docker-compose.yml
├── merge-local-into-prd.sh
├── merge-prd-into-local.sh
├── srdb.class.php
├── srdb.cli.php
├── wp-config-local.php
└── wp-config-prd.php

各ファイルが何なのかを簡単に表にまとめたので、気になる方は御覧ください。

ファイル名役割
docker-compose.ymlローカル環境を Docker で構築するための設定ファイルです。(別で環境を構築済みの場合は不要です)
merge-local-into-prd.shローカル環境をそのまま本番環境に反映するためのシェルスクリプトファイルです。
merge-prd-into-local.sh上記とは逆に本番環境をローカル環境に反映するためのシェルスクリプトファイルです。
srdb.class.php, srdb.cli.phpDB を環境ごとに作成している場合、一部データをその環境のドメインで書き換える必要があります。
それをよしなにやってくれるSearch-Replace-DBというものをコマンドで実行するのに必要なファイルです。
wp-config-local.php, wp-config-prd.phpwp-config.phpを各環境に合わせて書き換える必要があるので、その元になるローカル環境、本番環境それぞれのwp-config.phpの内容を置いておくファイルです。
各ファイルの役割

各環境に合わせて設定値を書き換える

環境を同期するために書き換える必要があるのはmerge-prd-into-local.shmerge-local-into-prd.shになります。
まずは本番 → ローカルで試すのが無難だと思うので、merge-prd-into-local.shのファイル上部にずらっと並んでいる定数部分を自分の環境に合わせて書き換えてください。

↓ この辺のこと

#!/bin/sh
NOW=`date +"%Y%m%d_%H%M"`
SEARCH="https://ドメイン名"
REPLACE="http://localhost:ポート番号"

#dumpファイルの保存先
BAK_REMOTE="/tmp/prd.bk.$NOW.sql"
BAK_LOCAL="/tmp/local.bk.$NOW.sql"

PRD_SERVER_HOST="リモートサーバーホスト"
PRD_SERVER_PORT="リモートサーバーポート"

SSH_KEY_FILE="sshキーファイルのパス"

LOCAL_PUBLIC_DIR="public_html"
PRD_PUBLIC_DIR="${PRD_SERVER_HOST}:public_htmlの絶対パス"

LOCAL_DB_HOST="127.0.0.1"
LOCAL_DB_PORT="DBのホスト側ポート"
LOCAL_DB_NAME="ローカルのDB名"
LOCAL_DB_USER="ローカルのユーザ名"
LOCAL_DB_PASSWORD="ローカルのパスワード"

PRD_DB_HOST="リモートのDBホスト名"
PRD_DB_NAME="リモートのDB名"
PRD_DB_USER="リモートのユーザ名"
PRD_DB_PASSWORD="リモートのパスワード"

各定数の役割と設定する内容について説明していきます。

NOW=`date +"%Y%m%d_%H%M"`

これは同期処理の前にローカル、本番ともに DB のバックアップを取るようにしているので、そのファイル名に日付を入れるためにあります。
特に変更する必要はないです。

SEARCH="https://ドメイン名"
REPLACE="http://localhost:ポート番号"

Search-Replace-DB でデータを書き換える際に書き換え対象の文字列と書き換えたい内容を設定するものです。
今は本番環境 → ローカルに同期しようとしているので、SEARCH の方には本番環境のトップページの URL を書きます。(末尾に「/」は不要です)
REPLACE の方にはローカル環境のトップページの URL を書きます。

BAK_REMOTE="/tmp/prd.bk.$NOW.sql"
BAK_LOCAL="/tmp/local.bk.$NOW.sql"

DB のバックアップファイルの保存先を指定しています。
変えなくても問題ないですが、お好みのパス、ファイル名に書きかえてもいいと思います。

PRD_SERVER_HOST="リモートサーバーホスト"
PRD_SERVER_PORT="リモートサーバーポート"

ここは WordPress をインストールしているサーバのホスト名とポート番号を記載します。
Xserver の場合、ホスト名は、サーバーパネルにログイン後、アカウント>サーバー情報にある内容を、ポート番号は 10022 です。

SSH_KEY_FILE="sshキーファイルのパス"

サーバーと SSH 接続するためのキーファイルのパスです。
自分の SSH キーファイルがあるパスを設定してください。

LOCAL_PUBLIC_DIR="public_html"
PRD_PUBLIC_DIR="${PRD_SERVER_HOST}:public_htmlの絶対パス"

LOCAL_PUBLIC_DIR はこのmerge-prd-into-local.shがあるディレクトリからの相対パスで public_html を配置したい場所を設定します。
PRD_PUBLIC_DIR は本番環境の public_html の絶対パス(相対パスでもできるとは思いますが一旦)を指定してやります。
基本は/home/サーバーID/ドメイン名/public_htmlになると思います。(サーバー ID はログイン時のユーザ名です)

LOCAL_DB_HOST="127.0.0.1"
LOCAL_DB_PORT="DBのホスト側ポート"
LOCAL_DB_NAME="ローカルのDB名"
LOCAL_DB_USER="ローカルのユーザ名"
LOCAL_DB_PASSWORD="ローカルのパスワード"

ローカル環境の DB の設定内容をそのまま書きます。
先程のdocker-compose.ymlでローカル環境を構築している場合、その設定値を書いてください。

↓ の部分

environment:
  MYSQL_ROOT_PASSWORD: password
  MYSQL_DATABASE: wordpress
  MYSQL_USER: wordpress
  MYSQL_PASSWORD: password
PRD_DB_HOST="リモートのDBホスト名"
PRD_DB_NAME="リモートのDB名"
PRD_DB_USER="リモートのユーザ名"
PRD_DB_PASSWORD="リモートのパスワード"

リモートの DB の情報を書きます。
DB の情報は Xserver の場合、サーバーパネルにログイン後、データベース>MySQL 設定から確認できます。

ここまでできたら、最後にwp-config-local.phpにローカル環境のwp-config.phpの内容をまるっとコピペして、下記コマンドを実行すると本番 → ローカルに環境を同期できます。

同期を実行する

以下コマンドでシェルスクリプトを実行します。

sh merge-prd-into-local.sh

ファイルの更新がどれだけあるかによりますが、二回目以降は数秒〜10数秒くらいで同期が完了します。

$ sh merge-prd-into-local.sh                              
【ローカルのDBをバックアップ】
mysqldump: [Warning] Using a password on the command line interface can be insecure.
【完了】
【本番のDBをダンプ】
【完了】
【本番のpublic_htmlをローカルにコピー】
receiving file list ... done
wp-config.php
wp-content/cache/autoptimize/js/autoptimize_81e01897542a5921841e9c632f6326a9.js

.
.
.

sent 2265 bytes  received 1841431 bytes  245826.13 bytes/sec
total size is 181387014  speedup is 98.38
.htaccess                                                                                                        100% 6360    64.5KB/s   00:00    
.user.ini                                                                                                        100% 3965    23.0KB/s   00:00    
【完了】
【wp-config.phpの内容をローカル環境のものに書き換え】
【完了】
【ローカルのDBを本番のDBで上書き】
mysql: [Warning] Using a password on the command line interface can be insecure.
【完了】
【ローカルのDB内のドメイン部分を書き換え】
wp_cocoon_accesses: replacing https://hiro8blog.com with https://hiro8blog.com

.
.
.

Replacing https://hiro8blog.com with https://hiro8blog.com on 27 tables with 3731 rows
1641 changes were made
965 updates were actually made
It took 1.99436688 seconds

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

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

参考

-WordPress