2026年9月15日

2026年9月15日

WordPressマルチサイトネットワークの構築と管理方法

はじめに

WordPressのマルチサイト機能を使えば、1つのWordPressインストールで複数のサイトを運営できます。企業の部門ごとのサイトや多言語サイトの運営に最適です。この記事では、マルチサイトネットワークの構築から管理まで5ステップで解説します。

症状・原因

  • 複数のWordPressサイトを個別にインストール・管理しており、プラグインやテーマの更新が煩雑になっている
  • マルチサイトを有効化したいが、wp-config.php と .htaccess の設定方法がわからない
  • ネットワーク管理画面からサイトを追加・管理する方法がわからない
  • WP-CLIを使ってマルチサイトを効率的に管理したい

解決手順

ステップ1:wp-config.php と .htaccess でマルチサイトを有効化する

まず、wp-config.php にマルチサイト定数を追加し、.htaccess のリライトルールを設定します。

// wp-config.php に追加("That's all, stop editing!" の前に記述)

// マルチサイトを有効化
define('WP_ALLOW_MULTISITE', true);

// ネットワーク設定後に自動追加される定数(setup.phpを実行後)
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);   // サブドメイン方式の場合
// define('SUBDOMAIN_INSTALL', false); // サブディレクトリ方式の場合

define('DOMAIN_CURRENT_SITE', 'example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

// ネットワーク管理者のメモリ制限を増やす
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');

// アップロードディレクトリをサイトごとに分ける(デフォルト設定)
// /wp-content/uploads/sites/{blog_id}/ に保存される

.htaccess の設定(Apacheの場合):

# サブドメイン方式のリライトルール
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# アップロードされたファイルを処理
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# 管理者関連ファイルの処理
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

ステップ2:ネットワークセットアップ画面で初期設定を行う

WP_ALLOW_MULTISITE を true に設定した後、WordPress管理画面の「ツール」→「ネットワークの設置」からセットアップを実行します。

// ネットワーク設置後のネットワーク管理者専用の設定
// wp-content/mu-plugins/network-settings.php

// ネットワーク全体のデフォルト設定
function mytheme_network_default_settings( $meta, $domain, $path, $site_id ) {
    // 新規サイト作成時のデフォルトオプション
    $meta['blogname']     = '新しいサイト';
    $meta['admin_email']  = get_site_option('admin_email');
    $meta['public']       = 1;

    // デフォルトテーマを設定
    $meta['template']   = 'twentytwentyfour';
    $meta['stylesheet'] = 'twentytwentyfour';

    return $meta;
}
add_filter('wpmu_new_site_meta', 'mytheme_network_default_settings', 10, 4);

// 新規サイト作成時に実行する処理
function mytheme_after_create_site( $blog_id ) {
    switch_to_blog($blog_id);

    // デフォルトの投稿・コメントを削除
    $default_post = get_post(1);
    if ( $default_post ) {
        wp_delete_post(1, true);
    }

    // 基本設定を行う
    update_option('permalink_structure', '/%postname%/');
    update_option('timezone_string', 'Asia/Tokyo');
    update_option('date_format', 'Y年n月j日');
    update_option('blogdescription', '');

    restore_current_blog();
}
add_action('wpmu_new_blog', 'mytheme_after_create_site');

ステップ3:wp_insert_site() と switch_to_blog() でサイトを操作する

プログラムからサイトを追加・操作する方法を解説します。

// 新規サイトをプログラムから作成
function mytheme_create_new_site( $domain, $path, $title, $admin_user_id ) {
    $site_id = wp_insert_site([
        'domain'     => $domain,           // example.com
        'path'       => $path,             // / またはサブディレクトリのパス
        'title'      => $title,            // サイトタイトル
        'user_id'    => $admin_user_id,    // 管理者ユーザーID
        'meta'       => [
            'public'   => 1,
            'lang_id'  => 1,
        ],
    ]);

    if ( is_wp_error($site_id) ) {
        return $site_id;
    }

    return $site_id;
}

// switch_to_blog でサイトを切り替えて操作
function mytheme_update_all_sites( $option_key, $option_value ) {
    $sites = get_sites([
        'number'   => 0,    // 全サイト取得
        'public'   => 1,
        'archived' => 0,
        'deleted'  => 0,
    ]);

    foreach ( $sites as $site ) {
        switch_to_blog($site->blog_id);

        // 各サイトでオプションを更新
        update_option($option_key, $option_value);

        // 各サイトのURLを取得
        $site_url = get_bloginfo('url');
        error_log("Updated {$option_key} on {$site_url}");

        restore_current_blog();  // 必ず元のブログに戻す
    }
}

// 使用例:全サイトのコメント設定をオフにする
// mytheme_update_all_sites('default_comment_status', 'closed');

ステップ4:ネットワーク全体でプラグインを有効化する

ネットワーク管理者はプラグインをネットワーク全体で有効化できます。コードから一括有効化する方法を解説します。

// 特定のプラグインを全サイトで有効化する
function mytheme_activate_plugin_on_all_sites( $plugin_path ) {
    $sites = get_sites(['number' => 0]);

    foreach ( $sites as $site ) {
        switch_to_blog($site->blog_id);

        if ( ! is_plugin_active($plugin_path) ) {
            // プラグインを有効化(サイレントモード:リダイレクトなし)
            $result = activate_plugin($plugin_path, '', false, true);

            if ( is_wp_error($result) ) {
                error_log("Failed to activate {$plugin_path} on site {$site->blog_id}: " . $result->get_error_message());
            }
        }

        restore_current_blog();
    }
}

// ネットワーク全体での有効化(network-activate)
function mytheme_network_activate_plugin( $plugin_path ) {
    // ネットワーク有効化済みプラグインのリストを取得
    $active_plugins = get_site_option('active_sitewide_plugins', []);

    if ( ! isset($active_plugins[$plugin_path]) ) {
        $active_plugins[$plugin_path] = time();
        update_site_option('active_sitewide_plugins', $active_plugins);
    }
}

// 新しいサイトが作成された時に自動でプラグインを有効化
function mytheme_activate_plugins_for_new_site( $blog_id ) {
    $plugins_to_activate = [
        'woocommerce/woocommerce.php',
        'contact-form-7/wp-contact-form-7.php',
    ];

    switch_to_blog($blog_id);
    foreach ( $plugins_to_activate as $plugin ) {
        if ( file_exists(WP_PLUGIN_DIR . '/' . $plugin) ) {
            activate_plugin($plugin, '', false, true);
        }
    }
    restore_current_blog();
}
add_action('wpmu_new_blog', 'mytheme_activate_plugins_for_new_site');

ステップ5:WP-CLI でマルチサイトを効率的に管理する

WP-CLIを使えば、マルチサイトの操作をコマンドラインで素早く実行できます。

# サイト一覧を表示
wp site list

# サイト一覧をJSON形式で表示
wp site list --format=json

# 新規サイトを作成
wp site create \
  --slug="shop" \
  --title="オンラインショップ" \
  --email="admin@example.com"

# サブドメイン方式でサイト作成
wp site create \
  --url="shop.example.com" \
  --title="オンラインショップ" \
  --email="admin@example.com"

# 特定のサイトにコマンドを実行(--url または --blog-id で指定)
wp --url="shop.example.com" option get blogname
wp --blog-id=2 plugin activate woocommerce

# 全サイトで同じコマンドを実行
wp site list --field=url | while read url; do
  wp --url="$url" plugin update --all
done

# ネットワークメタを取得・更新
wp network-meta get 1 active_sitewide_plugins
wp network-meta update 1 registration "all"

# サイトを削除(投稿・ファイルも含めて削除)
wp site delete 3 --yes

# マルチサイトのDBテーブルを確認
wp db tables --all-tables | grep "_2_"    # サイトID=2のテーブル

注意事項

  • サブドメイン方式のマルチサイトでは、サーバー側でワイルドカードサブドメイン(*.example.com)のDNS設定とApache/Nginxの設定が必要です。ホスティング環境がワイルドカードサブドメインに対応しているか事前に確認してください。
  • switch_to_blog() を使用した後は、必ず restore_current_blog() を呼び出してください。呼び忘れると、その後のコードが別サイトのコンテキストで実行されます。
  • マルチサイトでは、プラグインのwp_*データベーステーブルがサイトごとに作成されます(例:wp_2_posts、wp_3_options)。データベースのサイズが大きくなることを考慮してください。

まとめ

WordPressマルチサイトは wp-config.php への定数追加から始まり、ネットワーク設置画面での設定、switch_to_blog() での操作、WP-CLIでの管理まで、体系的に理解することが重要です。複数サイトの一元管理が実現し、プラグインやテーマの管理コストを大幅に削減できます。関連記事:WordPressの子テーマを正しく作成する方法

お気軽にご相談ください

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