公開日:
カテゴリー:

wp-envのローカル環境に本番環境のデータを同期するスクリプト

目次

wp-envはWordPressのローカル環境を簡単にセットアップできるツールです。複雑な構成が不要で、ローカルでWordPressサイトを素早く立ち上げられます。

ローカルのwp-env環境で開発していると、本番環境のデータやコンテンツを同期したいことがよくあります。これまでは手動でデータを反映したりサイト移行プラグインを使って移行したりしていましたが、これらの作業は時間がかかり煩雑でした。

そこで今回、この同期を自動化するスクリプトを作成しました。この記事では、そのスクリプトと使用方法を紹介します。

なお、本記事での説明はmacOSおよびLinux環境を前提としています。

前提条件

このスクリプトの動作にはwp-envが必要です。wp-envのセットアップの方法は公式のリファレンスガイドを参照してください。

このスクリプトではローカルにインストールされたwp-envを使用します。まだプロジェクトにインストールされていない場合は、以下のコマンドでインストールしてください。

Terminal window
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

このスクリプトは以下の処理を実行します。

  1. 本番環境のデータベースをローカルのwp-env環境に同期
  2. 本番環境のwp-contentディレクトリをローカルのwp-env環境に同期
  3. ローカル環境に合わせてデータを調整

使用方法

このスクリプトは、既存のwp-envを使用しているWordPressプロジェクトで利用できます。

スクリプトを実行すると、ローカルwp-envのデータベースは上書きされます。必要であればスクリプト実行前にバックアップを取得してください。

  1. スクリプト(sync-from-production.sh)をプロジェクトのルートディレクトリに配置
  2. .wp-env.jsonを設定(後述)
  3. リポジトリの.env.example.envにリネームしてプロジェクトルートに設置し、接続情報を設定する(後述)
  4. bash sync-from-production.shでスクリプト実行

.wp-env.jsonの設定

スクリプトが正しく動作するよう、プロジェクトルートの.wp-env.jsonに以下の設定を追加します。

.wp-env.json
{
"mappings": {
"wp-content": "./wp-content",
"tmp": "./tmp"
}
}

wp-contenttmpはそれぞれ本番環境からダウンロードしたwp-contentのコンテンツとデータベースのデータを格納するディレクトリです。

ディレクトリ自体はスクリプトの処理中で作成されるので、未作成のままでも問題ありません。既に同名のディレクトリがある場合は、予期せぬファイルの上書きを防ぐため事前にバックアップまたはリネームしてください。

.envファイルの設定

.envファイルでは以下の項目を設定します。

.env
# 本番サーバーの接続情報
PRODUCTION_USER=sv12345
PRODUCTION_HOST=sv12345.xsrv.jp
PRODUCTION_SSH_PORT=10022
PRODUCTION_SSH_KEY=~/.ssh/xserver
PRODUCTION_DIR=/home/sv12345/example.com/public_html
PRODUCTION_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:本番サイトのURL
  • LOCAL_URL:ローカル環境のURL。省略可能で、省略した場合はhttp://localhost:8888が設定される

プロジェクトをGitで管理している場合は、必ず.gitignore.envを追記して.envをGit管理から除外してください。

スクリプト実行後、http://localhost:8888でローカル環境にアクセスできます。

スクリプトの解説

以下、主要な処理について詳しく解説します。

本番環境のデータベースをローカルのwp-env環境に同期

sync-from-production.sh
# 本番サーバーからデータベースをエクスポートする
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"
}
sync-from-production.sh
# ローカル環境にデータベースをインポートする
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環境に同期

sync-from-production.sh
# 本番サーバーから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」が作成するバックアップファイルを除外しています。除外パターンはプロジェクトに合わせて適宜変更してください。

ローカル環境に合わせてデータを調整

sync-from-production.sh
# データベース内の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"
}
sync-from-production.sh
# 本番環境専用プラグインを無効化
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で設定しています。プロジェクトに合わせて適宜変更してください。

まとめ

このスクリプトにより、本番環境からローカル環境への同期作業を自動化できました。手動でのデータ移行作業が不要になり、開発効率が大幅に向上します。

必要に応じてスクリプト内の設定を調整して、プロジェクトに合わせてご活用ください。

記事をシェアする
記事がお役に立てたらシェアしていただけると嬉しいです!