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マイグレーション、⑤動作確認とロールバック手順の確保の流れで実行します。デプロイスクリプト化することで再現性が高まります。

お気軽にご相談ください

お見積りへ お問い合わせへ