2026年5月27日

2026年5月27日

WordPressにステージング環境を作成する方法

はじめに

WordPressの更新やテーマ変更を本番環境で直接テストして問題が起きた・ステージング環境を作りたいがファイルとDBをどう複製するかわからない・ステージングで確認したコードを本番に反映する方法がわからないといった問題の解決方法を解説します。

症状・原因

  • ステージングのURLが本番URLのままになっていてリダイレクトループが起きる
  • wp-config.phpのDB設定がステージング・本番で共通化されておらず誤って本番DBを使ってしまう
  • メール送信がステージングから本番ユーザーに届いてしまう
  • ステージングのファイル変更が本番に正しく反映されない

解決手順

ステップ1:ステージング環境のディレクトリとDBを作成する

# ✅ ステージング用ディレクトリを作成
sudo mkdir -p /var/www/staging
sudo chown www-data:www-data /var/www/staging

# ✅ 本番ファイルをステージングにコピー
sudo rsync -avz --exclude='wp-content/cache/' \
    /var/www/html/ /var/www/staging/
# → sending incremental file list
# → 1,234 files transferred

# ✅ ステージング用DBを作成
wp db query "CREATE DATABASE IF NOT EXISTS wordpress_staging DEFAULT CHARACTER SET utf8mb4;" \
    --path=/var/www/html/

wp db query "CREATE USER IF NOT EXISTS 'staging_user'@'localhost' IDENTIFIED BY 'StagePass123!';" \
    --path=/var/www/html/

wp db query "GRANT ALL PRIVILEGES ON wordpress_staging.* TO 'staging_user'@'localhost';" \
    --path=/var/www/html/

# ✅ 本番DBをステージングにコピー
wp db export - --path=/var/www/html/ | \
    wp db import - --dbuser=staging_user --dbpass=StagePass123! \
    --dbname=wordpress_staging --path=/var/www/staging/

ステップ2:wp-config.phpをステージング用に設定する

# ✅ ステージング用のwp-config.phpを作成
sudo cp /var/www/staging/wp-config.php /var/www/staging/wp-config.php.bak

# ✅ ステージング設定(環境変数で切り替え)
sudo tee /var/www/staging/wp-config.php << 'EOF'
<?php
// ✅ ステージング環境フラグ
define('WP_ENVIRONMENT_TYPE', 'staging'); // 'production', 'staging', 'development'

// ✅ ステージング用DB設定
define('DB_NAME', 'wordpress_staging');
define('DB_USER', 'staging_user');
define('DB_PASSWORD', 'StagePass123!');
define('DB_HOST', 'localhost');

// ✅ ステージングのURLプレフィックス
define('WP_HOME', 'https://staging.example.com');
define('WP_SITEURL', 'https://staging.example.com');

// ✅ デバッグモード(ステージングは有効)
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

// ✅ メール送信を無効化(誤送信防止)
define('WP_MAIL_DISABLED', true); // ← 別途プラグインが必要

// ✅ 自動更新を無効化(ステージングは手動で管理)
define('AUTOMATIC_UPDATER_DISABLED', true);

// ✅ テーブルプレフィックス
$table_prefix = 'wp_';

if (!defined('ABSPATH')) {
    define('ABSPATH', __DIR__ . '/');
}
require_once ABSPATH . 'wp-settings.php';
EOF

ステップ3:ステージングのURLを更新する

# ✅ ステージング環境のURLを更新
wp option update siteurl "https://staging.example.com" --path=/var/www/staging/
wp option update home "https://staging.example.com" --path=/var/www/staging/

# ✅ コンテンツ内のURLを一括置換
wp search-replace "https://example.com" "https://staging.example.com" \
    --all-tables \
    --path=/var/www/staging/
# → Replacements: 1234

# ✅ パーマリンクを再設定
wp rewrite flush --hard --path=/var/www/staging/

# ✅ Nginx にステージング用バーチャルホストを追加
sudo tee /etc/nginx/sites-available/staging.example.com << 'EOF'
server {
    listen 443 ssl;
    server_name staging.example.com;
    root /var/www/staging;
    index index.php;

    # ✅ IPアドレス制限(開発者のみアクセス可)
    allow 203.0.113.0/24;  # 開発チームのIP
    deny all;

    ssl_certificate /etc/letsencrypt/live/staging.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/staging.example.com/privkey.pem;

    # ✅ Basic認証(二重認証)
    auth_basic "Staging Environment";
    auth_basic_user_file /etc/nginx/.htpasswd;

    include /etc/nginx/wordpress.conf;
}
EOF

sudo ln -s /etc/nginx/sites-available/staging.example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo nginx -s reload

ステップ4:ステージングのメール送信を無効化する

// ✅ ステージングでのメール送信を無効化(functions.php または mu-plugins)
if (wp_get_environment_type() === 'staging') {
    // 全メール送信をブロック
    add_filter('wp_mail', function($args) {
        // 開発者のアドレスにリダイレクト
        $args['to'] = 'developer@example.com';
        $args['subject'] = '[STAGING] ' . $args['subject'];
        return $args;
    });
    
    // または完全に無効化
    add_filter('pre_wp_mail', '__return_false');
}

// ✅ ステージング環境を示す管理バーのバッジ
add_action('admin_bar_menu', function($wp_admin_bar) {
    if (wp_get_environment_type() !== 'production') {
        $wp_admin_bar->add_node([
            'id'    => 'environment-type',
            'title' => '<span style="background:#e74c3c;color:#fff;padding:3px 8px;border-radius:3px;">'
                     . strtoupper(wp_get_environment_type()) . '</span>',
            'href'  => false,
        ]);
    }
}, 0);

ステップ5:ステージングから本番への反映手順

# ✅ ステージングから本番へのファイル反映(コードのみ)
# wp-content/uploads/ と wp-config.php は除外
sudo rsync -avz --dry-run \
    --exclude='wp-content/uploads/' \
    --exclude='wp-config.php' \
    --exclude='wp-content/cache/' \
    /var/www/staging/ /var/www/html/
# → --dry-run で確認後、問題なければ --dry-run を外して実行

# ✅ DB変更をステージングから本番に適用(差分のみ)
# ステージングでのDB変更をSQLファイルに記録しておく
cat > /tmp/staging-changes.sql << 'EOF'
-- ステージングで加えたDB変更
ALTER TABLE wp_posts ADD COLUMN custom_field VARCHAR(255);
INSERT INTO wp_options (option_name, option_value) VALUES ('new_setting', 'value');
EOF

wp db import /tmp/staging-changes.sql --path=/var/www/html/

# ✅ 本番のキャッシュをクリア
wp cache flush --path=/var/www/html/
wp rewrite flush --path=/var/www/html/

# ✅ 本番にデプロイ後の動作確認
curl -sI https://example.com/ | head -5
wp core is-installed --path=/var/www/html/
wp plugin list --status=inactive --path=/var/www/html/

注意事項

  • ステージング環境には必ずIPアドレス制限またはBasic認証を設定してください。ステージングが公開されていると検索エンジンが重複コンテンツとして認識し本番サイトのSEOに影響します
  • wp search-replaceでURLを置換した後、ステージングのDBを本番にコピーしても本番URLに再度置換してください。ステージングURLが本番DBに混入するのを防ぐため、デプロイ前に必ずURLを確認してください

まとめ

WordPressステージング環境の構築は①rsyncでファイルをコピー・ステージング用DBを作成・本番DBをwp db export | wp db importでコピー、②wp-config.phpWP_ENVIRONMENT_TYPE = staging・ステージングDB設定・WP_DEBUG = trueAUTOMATIC_UPDATER_DISABLED = trueを設定、③wp search-replaceで本番URLをステージングURLに置換・Nginxにバーチャルホスト追加・IP制限+Basic認証、④wp_get_environment_type()でステージング検出・メールを開発者アドレスにリダイレクト・管理バーにバッジ表示、⑤rsync --exclude=uploads/でコードのみ本番に反映・キャッシュフラッシュ・動作確認の手順で構築します。

お気軽にご相談ください

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