2026年5月21日

2026年5月21日

WordPressマルチサイトのドメインエラーを解決する方法

はじめに

WordPressのマルチサイトネットワークでサブサイト(例:site2.example.comexample.com/site2/)にアクセスすると「このサイトは存在しません」や404エラーが表示される・独自ドメインをサブサイトにマッピングしたが正しく動作しない・SSL証明書の設定が複雑でHTTPSが機能しない・マルチサイトのネットワーク管理画面にアクセスできないといった問題は、Apacheまたはnginxのワイルドカード設定・wp-config.phpの設定ミス・DNSの設定不備が原因です。

症状・原因

  • サブサイトのURL(site2.example.com)にアクセスすると「お探しのページは見つかりませんでした」が表示される
  • マルチサイトを有効化したが「ネットワークのセットアップが完了していません」が表示される
  • 独自ドメイン(custom-domain.com)をサブサイトに割り当てたが404エラーになる
  • /wp-admin/network/にアクセスすると通常の管理画面にリダイレクトされる

解決手順

ステップ1:マルチサイト設定を診断する

# WP-CLIでマルチサイト情報を確認
wp site list --format=table
wp network meta list 1 --format=table

# マルチサイトの設定を確認
wp eval "
echo 'MULTISITE: '        . (defined('MULTISITE') && MULTISITE ? 'true' : 'false') . PHP_EOL;
echo 'SUBDOMAIN_INSTALL: ' . (defined('SUBDOMAIN_INSTALL') && SUBDOMAIN_INSTALL ? 'true' : 'false') . PHP_EOL;
echo 'DOMAIN_CURRENT_SITE: ' . (defined('DOMAIN_CURRENT_SITE') ? DOMAIN_CURRENT_SITE : 'NOT SET') . PHP_EOL;
echo 'PATH_CURRENT_SITE: '   . (defined('PATH_CURRENT_SITE') ? PATH_CURRENT_SITE : 'NOT SET') . PHP_EOL;
echo 'SITE_ID_CURRENT_SITE: ' . (defined('SITE_ID_CURRENT_SITE') ? SITE_ID_CURRENT_SITE : 'NOT SET') . PHP_EOL;
"

# サブサイトのデータベース設定を確認
wp eval "
global \$wpdb;
\$sites = \$wpdb->get_results('SELECT blog_id, domain, path, registered, last_updated FROM ' . \$wpdb->blogs . ' LIMIT 10', ARRAY_A);
foreach (\$sites as \$site) {
    echo 'ID=' . \$site['blog_id'] . ' domain=' . \$site['domain'] . \$site['path'] . PHP_EOL;
}
"

ステップ2:wp-config.phpを正しく設定する

// wp-config.php: マルチサイトの正しい設定

// ① マルチサイトを有効化(サブドメイン方式)
define('WP_ALLOW_MULTISITE', true);
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('UPLOADBLOGSDIR', 'wp-content/blogs.dir');  // 旧形式
// WordPress 3.5以降は自動的にwp-content/uploads/sites/{id}/が使われる

// ③ メモリとタイムアウトの設定
define('WP_MEMORY_LIMIT', '256M');
define('WP_MAX_MEMORY_LIMIT', '512M');

// ④ ドメインマッピング用の設定(独自ドメイン対応)
define('COOKIE_DOMAIN', '');              // クッキードメインをサブサイト対応にする
define('ADMIN_COOKIE_PATH', '/');

ステップ3:Apacheの設定を修正する

# .htaccess: マルチサイト(サブドメイン方式)
RewriteEngine On
RewriteBase /

# ワイルドカードサブドメインのリダイレクト
RewriteRule ^index\.php$ - [L]

# アップロードファイルへのアクセス(旧形式)
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# wp-adminへのリダイレクト
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

# 存在するファイル・ディレクトリはそのまま
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# WordPressにルーティング
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
# nginx: マルチサイト(サブドメイン方式)の設定確認
# /etc/nginx/sites-available/example.com
# server_name *.example.com example.com; が必要

# DNS: ワイルドカードサブドメインの設定確認
# *.example.com → サーバーのIPアドレス
# nslookup newsite.example.com で確認

ステップ4:ドメインマッピングを設定する

# WP-CLIでサブサイトのドメインを変更
wp site update 2 --domain=custom-domain.com --path=/

# wp_blogsテーブルを直接確認・更新
wp eval "
global \$wpdb;

// ドメインマッピングテーブルの確認
\$table = \$wpdb->base_prefix . 'domain_mapping';
if (\$wpdb->get_var(\"SHOW TABLES LIKE '{\$table}'\") === \$table) {
    \$mappings = \$wpdb->get_results('SELECT * FROM ' . \$table, ARRAY_A);
    foreach (\$mappings as \$m) {
        echo 'blog_id=' . \$m['blog_id'] . ' domain=' . \$m['domain'] . PHP_EOL;
    }
} else {
    echo 'Domain mapping table not found. Using wp_blogs table.' . PHP_EOL;
    \$sites = \$wpdb->get_results('SELECT blog_id, domain, path FROM ' . \$wpdb->blogs, ARRAY_A);
    foreach (\$sites as \$s) {
        echo 'blog_id=' . \$s['blog_id'] . ' ' . \$s['domain'] . \$s['path'] . PHP_EOL;
    }
}
"
// functions.php (ネットワーク管理者向け): ドメインマッピング制御

// ① 独自ドメインを持つサブサイトのURLを変換
add_filter('network_site_url', function(string $url, string $path, string $scheme): string {
    return $url;
}, 10, 3);

// ② マルチサイトでサンライズ(sunrise.php)を活用
// wp-content/sunrise.php を作成し wp-config.php に define('SUNRISE', true); を追加

ステップ5:マルチサイトのセキュリティと管理を強化する

// functions.php (mu-plugins): マルチサイト管理強化

// ① 新規サイト作成時の初期設定
add_action('wp_initialize_site', function(WP_Site $new_site): void {
    switch_to_blog($new_site->blog_id);

    // デフォルト設定を適用
    update_option('blogdescription', '');
    update_option('default_comment_status', 'closed');
    update_option('comments_notify', 0);

    // デフォルトカテゴリーの名前を変更
    wp_update_term(1, 'category', ['name' => '未分類', 'slug' => 'uncategorized']);

    restore_current_blog();
    error_log(sprintf('[Multisite] New site initialized: blog_id=%d', $new_site->blog_id));
});

// ② ネットワーク全体に通知を送信
add_action('network_admin_notices', function(): void {
    if (!current_user_can('manage_network')) {
        return;
    }
    $site_count = get_blog_count();
    printf('<div class="notice notice-info"><p>ネットワーク内のサイト数: %d</p></div>', $site_count);
});

// ③ サブサイトでのプラグインインストールを制限
add_filter('user_has_cap', function(array $caps, array $cap): array {
    if (in_array('install_plugins', $cap, true) && !is_super_admin()) {
        $caps['install_plugins'] = false;
    }
    return $caps;
}, 10, 2);

注意事項

  • マルチサイトのサブドメイン方式を使用する場合、DNSでワイルドカードサブドメイン(.example.com)の設定が必要です。共有ホスティングでは対応していない場合があります。また、ワイルドカードSSL証明書(.example.com対応)も必要です
  • SUBDOMAIN_INSTALLの設定はマルチサイット有効化後に変更することが困難です。サブドメイン方式とサブディレクトリ方式は有効化前に慎重に選択してください
  • sunrise.phpを使ったドメインマッピングは高度な機能です。wp-config.phpdefine('SUNRISE', true)を追加し、wp-content/sunrise.phpで独自のドメインルーティングを実装できます

まとめ

WordPressマルチサイトドメインエラーの解決は①wp site listでサイト一覧確認・MULTISITE/SUBDOMAIN_INSTALL/DOMAIN_CURRENT_SITEの設定確認・wp_blogsテーブルのドメイン確認、②wp-config.phpMULTISITE=trueSUBDOMAIN_INSTALL=trueDOMAIN_CURRENT_SITEPATH_CURRENT_SITEを正しく設定、③.htaccessにワイルドカードサブドメイン用のRewriteRuleを設定・files/へのアクセスをms-files.phpにルーティング、④wp site update 2 --domain=custom-domain.comでドメイン変更・wp_blogsテーブルで確認・ドメインマッピングテーブルの状態確認、⑤wp_initialize_siteフックで新規サイト初期設定・ネットワーク管理画面への通知・user_has_capでプラグインインストール制限の手順で解決します。

お気軽にご相談ください

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