2026年9月7日
2026年9月7日
WordPressのステージングから本番へデプロイする方法【安全な手順】
はじめに
ステージング環境でテストしたWordPressの変更を本番環境に安全にデプロイすることは、サイト運営の品質を保つために重要です。ファイルの差分同期、データベースのマージ、ロールバック手順を整備することで、デプロイのリスクを最小化できます。
症状・原因
ステージングから本番へのデプロイで困るケース:
- ステージングで動いていたのに本番では動かない
- DBの変更(新テーブル・カラム追加)を本番に反映したい
- デプロイ後に問題が発生してロールバックしたい
- 複数人での開発で変更を安全に統合したい
解決手順
ステップ1:デプロイ前チェックリストを確認する
# ステージング環境での最終確認
wp core verify-checksums
wp plugin list --update=available
wp theme list --update=available
# 変更ファイルのリスト作成
rsync -n -avz --delete \
--exclude='.git/' \
--exclude='wp-content/cache/' \
--exclude='wp-content/uploads/' \
/var/www/staging/ \
/var/www/production/ \
2>&1 | grep -v "/$" | grep -v "^sending"
# ステージングのDB変更をエクスポート
wp db export /tmp/staging-export.sql --path=/var/www/staging
ステップ2:本番環境のバックアップを取る
# 本番環境を必ずバックアップ
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/var/backups/pre-deploy/${TIMESTAMP}"
mkdir -p "${BACKUP_DIR}"
# 本番DBバックアップ
mysqldump --single-transaction prod_db | gzip > "${BACKUP_DIR}/prod-db.sql.gz"
# 本番ファイルバックアップ(wp-contentのみ)
tar -czf "${BACKUP_DIR}/prod-wp-content.tar.gz" \
/var/www/production/wp-content/
echo "バックアップ完了: ${BACKUP_DIR}"
echo "合計: $(du -sh "${BACKUP_DIR}" | cut -f1)"
ステップ3:ファイルをrsyncで同期する
#!/bin/bash
# deploy.sh - ステージングから本番へのデプロイスクリプト
set -euo pipefail
STAGING="/var/www/staging"
PRODUCTION="/var/www/production"
echo "=== ステージング → 本番 デプロイ開始 ==="
# ファイル同期(uploadsとcacheは除外)
rsync -avz --delete \
--exclude='.git/' \
--exclude='wp-content/cache/' \
--exclude='wp-content/uploads/' \
--exclude='wp-content/upgrade/' \
--exclude='wp-config.php' \
"${STAGING}/" \
"${PRODUCTION}/"
echo "→ ファイル同期完了"
# パーミッション修正
chown -R www-data:www-data "${PRODUCTION}"
find "${PRODUCTION}" -type f -exec chmod 644 {} \;
find "${PRODUCTION}" -type d -exec chmod 755 {} \;
chmod 600 "${PRODUCTION}/wp-config.php"
echo "→ パーミッション設定完了"
# キャッシュクリア
wp --path="${PRODUCTION}" cache flush
wp --path="${PRODUCTION}" rewrite flush --hard
echo "→ キャッシュクリア完了"
ステップ4:データベースの変更をマージする
カスタムテーブルや設定変更を本番に反映します:
// ステージングで追加したDBスキーマを本番に適用
// migration-001.php として管理
function apply_migration_001(): bool {
global $wpdb;
// 既に適用済みか確認
$applied = get_option('db_migration_001_applied');
if ($applied) {
WP_CLI::log('Migration 001 は適用済みです');
return false;
}
// マイグレーション実行
$sql = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}custom_data (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
user_id bigint(20) unsigned NOT NULL,
data_key varchar(255) NOT NULL,
data_value longtext,
created_at datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY data_key (data_key)
) {$wpdb->get_charset_collate()};";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($sql);
// 適用済みフラグを保存
update_option('db_migration_001_applied', true);
WP_CLI::success('Migration 001 適用完了');
return true;
}
# WP-CLIでマイグレーション実行
wp eval 'apply_migration_001();' --path=/var/www/production
# プラグインのDBアップグレードが必要な場合
wp plugin activate woocommerce --path=/var/www/production
ステップ5:デプロイ後の確認とロールバック手順
# デプロイ後の動作確認
wp core verify-checksums --path=/var/www/production
wp plugin list --path=/var/www/production
# Webサーバーを再起動
systemctl reload nginx
php-fpm8.2 -t && systemctl reload php8.2-fpm
# ヘルスチェック
curl -s -o /dev/null -w "%{http_code}" https://example.com/
curl -s "https://example.com/wp-json/myplugin/v1/health"
# 問題が発生した場合のロールバック
rollback() {
local BACKUP_DIR="$1"
echo "=== ロールバック開始: ${BACKUP_DIR} ==="
# ファイルをロールバック
tar -xzf "${BACKUP_DIR}/prod-wp-content.tar.gz" -C /
# DBをロールバック
gunzip -c "${BACKUP_DIR}/prod-db.sql.gz" | \
mysql -u prod_user -p prod_db
# キャッシュクリア
wp --path=/var/www/production cache flush
echo "=== ロールバック完了 ==="
}
# ロールバック実行例
# rollback "/var/backups/pre-deploy/20240101_020000"
注意事項
wp-config.phpはrsync対象から除外してください(本番のDB設定が上書きされます)wp-content/uploads/はrsync対象から除外してください(本番のメディアが削除されます)- デプロイ前には必ず本番のバックアップを取ってください
- 大規模な変更は、メンテナンスモードを有効にしてから行ってください
まとめ
ステージングから本番へのデプロイは、①デプロイ前チェック、②本番バックアップ、③rsyncでファイル同期、④DBマイグレーション、⑤動作確認とロールバック手順の確保の流れで実行します。デプロイスクリプト化することで再現性が高まります。