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の子テーマを正しく作成する方法