
目次
wp-env
はWordPressのローカル環境を簡単にセットアップできるツールです。複雑な構成が不要で、ローカルでWordPressサイトを素早く立ち上げられます。
ローカルのwp-env
環境で開発していると、本番環境のデータやコンテンツを同期したいことがよくあります。これまでは手動でデータを反映したりサイト移行プラグインを使って移行したりしていましたが、これらの作業は時間がかかり煩雑でした。
そこで今回、この同期を自動化するスクリプトを作成しました。この記事では、そのスクリプトと使用方法を紹介します。
なお、本記事での説明はmacOSおよびLinux環境を前提としています。
前提条件
このスクリプトの動作にはwp-env
が必要です。wp-env
のセットアップの方法は公式のリファレンスガイドを参照してください。
このスクリプトではローカルにインストールされたwp-env
を使用します。まだプロジェクトにインストールされていない場合は、以下のコマンドでインストールしてください。
npm install --save-dev @wordpress/env
グローバルにインストールしたwp-env
を使用する場合は、スクリプトの該当箇所を適宜修正してください。
また、このスクリプトの動作には本番サーバーにSSH接続できる環境も必要です。
SSH接続の設定
本スクリプトはエックスサーバーからのデータ同期を前提として作成されています。エックスサーバーにSSH接続する方法については、以下の記事で詳しく解説しています。
エックスサーバーにSSH接続する|greencider(グリーンサイダー)
エックスサーバーにSSHで接続する手順を図解付きでわかりやすく解説。公開鍵の生成や登録方法、接続コマンド、エイリアス設定まで実用的な内容をまとめています。
greencd.jp

エックスサーバー以外のサーバーを利用している場合は、スクリプト内のSSH接続設定を環境に合わせて調整してください。
スクリプト
今回作成したスクリプトは以下のGitHubリポジトリで公開しています。
GitHub - foolish-pine/wordpress-sync-production-to-local
Contribute to foolish-pine/wordpress-sync-production-to-local development by creating an account on GitHub.
github.com
このスクリプトは以下の処理を実行します。
- 本番環境のデータベースをローカルの
wp-env
環境に同期 - 本番環境の
wp-content
ディレクトリをローカルのwp-env
環境に同期 - ローカル環境に合わせてデータを調整
使用方法
このスクリプトは、既存のwp-env
を使用しているWordPressプロジェクトで利用できます。
スクリプトを実行すると、ローカルwp-envのデータベースは上書きされます。必要であればスクリプト実行前にバックアップを取得してください。
- スクリプト(
sync-from-production.sh
)をプロジェクトのルートディレクトリに配置 .wp-env.json
を設定(後述)- リポジトリの
.env.example
を.env
にリネームしてプロジェクトルートに設置し、接続情報を設定する(後述) bash sync-from-production.sh
でスクリプト実行
.wp-env.json
の設定
スクリプトが正しく動作するよう、プロジェクトルートの.wp-env.json
に以下の設定を追加します。
{ "mappings": { "wp-content": "./wp-content", "tmp": "./tmp" }}
wp-content
とtmp
はそれぞれ本番環境からダウンロードしたwp-content
のコンテンツとデータベースのデータを格納するディレクトリです。
ディレクトリ自体はスクリプトの処理中で作成されるので、未作成のままでも問題ありません。既に同名のディレクトリがある場合は、予期せぬファイルの上書きを防ぐため事前にバックアップまたはリネームしてください。
.envファイルの設定
.env
ファイルでは以下の項目を設定します。
# 本番サーバーの接続情報PRODUCTION_USER=sv12345PRODUCTION_HOST=sv12345.xsrv.jpPRODUCTION_SSH_PORT=10022PRODUCTION_SSH_KEY=~/.ssh/xserverPRODUCTION_DIR=/home/sv12345/example.com/public_htmlPRODUCTION_URL=https://example.com
# ローカル環境のURL(省略可)LOCAL_URL=http://localhost:8888
各パラメータの説明は以下の通りです。
PRODUCTION_USER
:サーバーのユーザー名PRODUCTION_HOST
:サーバーのホスト名PRODUCTION_SSH_PORT
:SSHポート番号(エックスサーバーは10022)PRODUCTION_SSH_KEY
:SSH秘密鍵のパスPRODUCTION_DIR
:WordPressがインストールされているディレクトリPRODUCTION_URL
:本番サイトのURLLOCAL_URL
:ローカル環境のURL。省略可能で、省略した場合はhttp://localhost:8888
が設定される
プロジェクトをGitで管理している場合は、必ず.gitignore
に.env
を追記して.env
をGit管理から除外してください。
スクリプト実行後、http://localhost:8888
でローカル環境にアクセスできます。
スクリプトの解説
以下、主要な処理について詳しく解説します。
本番環境のデータベースをローカルのwp-env
環境に同期
# 本番サーバーからデータベースをエクスポートするdump_production_database() { log "Connecting to the production server and exporting database..." ssh $SSH_OPTIONS "$PRODUCTION_USER@$PRODUCTION_HOST" "cd $PRODUCTION_DIR && wp db export --exclude_tables=wp_users dump.sql" log_success "Database exported on production server"}
# ローカル環境にデータベースをインポートするimport_database() { log "Importing database into wp-env..." run_wp_cli db import /var/www/html/tmp/dump.sql log_success "Database import completed"}
データベースのエクスポート時に--exclude_tables=wp_users
オプションを使用することで、本番環境のユーザー情報でローカルのユーザー情報を上書きしないようにしています。
本番環境のwp-content
ディレクトリをローカルのwp-env
環境に同期
# 本番サーバーからwp-contentをrsyncで同期するsync_wp_content() { log "Syncing wp-content from production server..."
# 除外パターン local excludes=( "uploads/backwpup" )
# 除外オプションを構築 local exclude_opts=() for pattern in "${excludes[@]}"; do exclude_opts+=("--exclude=$pattern") done
rsync -av --delete -e "ssh $SSH_OPTIONS" "${exclude_opts[@]}" \ "$PRODUCTION_USER@$PRODUCTION_HOST:$PRODUCTION_DIR/wp-content/" \ "./wp-content" log_success "wp-content sync completed"}
rsync
を使用して本番環境のwp-content
ディレクトリをローカルに同期します。
初回実行時、wp-content
のサイズが大きいと同期が完了するまで時間がかかります。2回目以降は差分の同期のみなので、実行時間は短くなります。
--delete
オプションにより、本番環境に存在しないファイルはローカルからも削除されます。
不要なファイルは除外パターンで除外します。ここではバックアッププラグイン「BackWPup」が作成するバックアップファイルを除外しています。除外パターンはプロジェクトに合わせて適宜変更してください。
ローカル環境に合わせてデータを調整
# データベース内のURLを置換するreplace_urls() { log "Replacing URLs in the database..." run_wp_cli search-replace "$PRODUCTION_URL" "$LOCAL_URL" --precise --recurse-objects --all-tables-with-prefix log_success "URL replacement completed"}
# インポートした投稿や固定ページの著者をadminに設定するreassign_post_authors() { log "Reassigning authors for posts and pages to admin..." run_wp_cli db query "UPDATE wp_posts SET post_author = (SELECT ID FROM wp_users WHERE user_login = 'admin' LIMIT 1) WHERE post_type IN ('post', 'page');" log_success "Author reassignment completed"}
# 本番環境専用プラグインを無効化disable_production_plugins() { log "Disabling production-only plugins for local environment..."
local plugins_to_disable=( "cloudsecure-wp-security" )
for plugin in "${plugins_to_disable[@]}"; do if run_wp_cli plugin is-active "$plugin" 2>/dev/null; then run_wp_cli plugin deactivate "$plugin" log_success "$plugin plugin deactivated" fi done}
ローカル環境で正しく動作するよう、以下の調整をします。
- URL置換:本番環境のURLをローカル環境のURLに置換
- 著者の再設定:投稿の著者をローカル環境の
admin
ユーザーに設定 - プラグインの無効化:セキュリティプラグインなど本番環境専用のプラグインを無効化
無効化するプラグインはplugins_to_disable
で設定しています。プロジェクトに合わせて適宜変更してください。
まとめ
このスクリプトにより、本番環境からローカル環境への同期作業を自動化できました。手動でのデータ移行作業が不要になり、開発効率が大幅に向上します。
必要に応じてスクリプト内の設定を調整して、プロジェクトに合わせてご活用ください。