2026年9月3日

2026年9月3日

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

はじめに

WordPressマルチサイト(ネットワーク)は複数のサイトを1つのWordPressで管理できる機能ですが、設定の複雑さゆえにサブサイトの404・ログイン問題・プラグイン適用ミスが発生しやすいです。

症状・原因

  • マルチサイト有効化後にサブサイトが404になる
  • ネットワーク管理画面にログインできない
  • プラグインをネットワーク有効化したのに特定サイトで動かない
  • サブドメイン型でワイルドカードDNSが設定されていない

解決手順

ステップ1:マルチサイトの設定状態を確認する

# マルチサイトが有効か確認
wp eval "echo is_multisite() ? 'multisite: ON' : 'multisite: OFF';"

# 全サイト一覧を確認
wp site list --fields=blog_id,url,registered,public,archived

# ネットワーク設定を確認
wp eval "
print_r([
    'MULTISITE'        => defined('MULTISITE') ? MULTISITE : 'undefined',
    'SUBDOMAIN_INSTALL'=> defined('SUBDOMAIN_INSTALL') ? SUBDOMAIN_INSTALL : 'undefined',
    'DOMAIN_CURRENT_SITE' => defined('DOMAIN_CURRENT_SITE') ? DOMAIN_CURRENT_SITE : 'undefined',
    'PATH_CURRENT_SITE'   => defined('PATH_CURRENT_SITE') ? PATH_CURRENT_SITE : 'undefined',
]);
"

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

// wp-config.php: マルチサイトに必要な設定
// ※ wp-admin → ツール → ネットワーク設定 の指示通りに追加

define('WP_ALLOW_MULTISITE', true);  // マルチサイットを許可(設定画面表示用)

// ネットワーク設定後に以下を追加
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);  // サブディレクトリ型: false / サブドメイン型: true
define('DOMAIN_CURRENT_SITE', 'example.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

// マルチサイトでの Cookie 設定
define('COOKIEPATH', '/');
define('SITECOOKIEPATH', '/');
define('ADMIN_COOKIE_PATH', '/');
define('COOKIE_DOMAIN', '');  // サブドメイン型では '' に設定

// アップロードディレクトリを統一(任意)
define('UPLOADS', 'wp-content/uploads');

ステップ3:.htaccess を正しく設定する

# .htaccess: サブディレクトリ型マルチサイト用
# ネットワーク設定画面でコピーできるが、手動設定の場合は以下

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# ファイルやディレクトリが存在しない場合は index.php へ
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# マルチサイト用追加ルール
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
# Nginx: サブディレクトリ型マルチサイト用
server {
    # ...
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # マルチサイト用
    if (!-e $request_filename) {
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;
        rewrite ^(/[^/]+)?(/wp-.*) $2 last;
        rewrite ^(/[^/]+)?(/.*\.php) $2 last;
    }
}

ステップ4:サブサイト間でデータを操作する

// functions.php / プラグイン: switch_to_blog でサブサイトのデータを取得

// ① 特定サブサイトの投稿を取得
function get_subsite_posts(int $blog_id, int $count = 5): array {
    if (!is_multisite()) {
        return [];
    }

    switch_to_blog($blog_id);
    $posts = get_posts([
        'posts_per_page' => $count,
        'post_status'    => 'publish',
        'orderby'        => 'date',
        'order'          => 'DESC',
    ]);
    restore_current_blog(); // 必ず元に戻す

    return $posts;
}

// ② 全サブサイトを横断してデータを集計
function get_network_post_count(): array {
    $sites = get_sites(['number' => 100]);
    $counts = [];

    foreach ($sites as $site) {
        switch_to_blog($site->blog_id);
        $counts[$site->blog_id] = [
            'url'   => get_bloginfo('url'),
            'posts' => wp_count_posts()->publish,
        ];
        restore_current_blog();
    }

    return $counts;
}

// ③ ネットワーク全体のオプションを取得・更新
$network_option = get_site_option('my_network_option', 'default');
update_site_option('my_network_option', 'new_value');

ステップ5:マルチサイト特有の問題を解決する

# サブサイトのアップロードディレクトリを確認
wp eval "echo wp_upload_dir()['basedir'];" --url=https://example.com/site2/

# ネットワーク有効化プラグインを確認
wp network meta get 1 active_sitewide_plugins

# 特定サブサイトのテーブルプレフィックスを確認
wp eval "global \$wpdb; echo \$wpdb->prefix;" --url=https://example.com/site2/
# サブサイトは wp_2_, wp_3_ のようにblog_id付きになる

# サブサイトのユーザーをネットワーク管理者に追加
wp super-admin add username

# サブサイトの管理画面URLを確認
wp eval "echo admin_url();" --url=https://example.com/site2/
// functions.php: マルチサイトでのプラグイン条件分岐
add_action('init', function(): void {
    if (!is_multisite()) {
        return;
    }

    $blog_id = get_current_blog_id();

    // サイト2のみで処理を実行
    if ($blog_id === 2) {
        // サイト2専用の処理
    }

    // ネットワーク管理画面のみで処理
    if (is_network_admin()) {
        // ネットワーク管理専用処理
    }
});

// サブドメイン型でワイルドカードDNSが必要な場合のチェック
add_action('admin_notices', function(): void {
    if (!is_network_admin() || !is_subdomain_install()) {
        return;
    }
    echo '<div class="notice notice-info"><p>サブドメイン型マルチサイトにはワイルドカードDNS(*.example.com)の設定が必要です。</p></div>';
});

注意事項

  • マルチサイスの有効化後はwp-config.php.htaccessの両方を正しく更新しないと全サイトにアクセスできなくなります。変更前に必ずバックアップを取ってください
  • switch_to_blog()を使った後は必ずrestore_current_blog()を呼んでください。呼ばないと以降の処理が別のサイトのコンテキストで実行されます
  • サブドメイン型マルチサイト(SUBDOMAIN_INSTALL=true)はホスティング環境でワイルドカードDNS(*.example.com)のサポートが必要です。共有ホスティングでは対応していない場合があります

まとめ

マルチサイトエラーの解決は①wp site listwp eval "is_multisite()"で設定状態を確認、②wp-config.phpMULTISITESUBDOMAIN_INSTALLDOMAIN_CURRENT_SITEを正しく定義、③.htaccess(Apache)またはNginx設定にマルチサイト用リライトルールを追加、④switch_to_blog()restore_current_blog()のペアでサブサイトのデータを安全に操作、⑤wp super-admin addでユーザーをネットワーク管理者に追加し権限問題を解消します。

お気軽にご相談ください

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