2026年9月3日

2026年9月3日

WordPressマルチサイトのエラー対処法:サブサイトの404・ログイン・プラグインの不具合

WordPressマルチサイト(ネットワーク)は、1つのWordPressで複数のサイトを動かす機能です。設定が wp-config.php、.htaccess(またはnginxの設定)、データベースの3か所にまたがるため、どれか1つが合っていないだけで、サブサイトが404になる、ログインできない、といった症状が出ます。この記事では、症状ごとに原因を絞り込み、公式ドキュメントに沿って直す手順を説明します。

作業の前に、wp-config.php・.htaccess の控えと、データベースのバックアップを取ってください。WP-CLIが使える場合は wp db export で保存できます。

症状から原因の見当をつける

症状 まず疑う場所
メインサイトは表示されるが、サブサイトのページや管理画面が404になる 書き換えルール(.htaccess・nginx)、Apacheの mod_rewrite・AllowOverride
サブドメイン型で、サブサイトにアクセスするとサーバーのエラーやブラウザのエラーになる DNS(ワイルドカードレコード)、バーチャルホスト、SSL証明書
ネットワーク作成後にログインできない、ログイン画面に戻される ブラウザのCookie、wp-config.php に残ったCookie関連の定数、URLの不一致
「データベース接続確立エラー」やテーブルが見つからない旨のエラー wp-config.php の定数、wp_site・wp_blogs テーブル
ネットワーク有効化したプラグインが、一部のサイトで正しく動かない プラグイン側のマルチサイト対応
サブサイトに、別のサイトの投稿や設定が表示される 自作コードの switch_to_blog() の戻し忘れ

現在の設定を確認する

WP-CLIで、マルチサイトとして認識されているか、サイト一覧がどうなっているかを確認します。

# マルチサイトとして動いているか
wp eval 'echo is_multisite() ? "multisite: ON" : "multisite: OFF", PHP_EOL;'

# 登録されているサイトの一覧と状態
wp site list --fields=blog_id,url,public,archived,spam,deleted

# サブドメイン型かどうか
wp eval 'var_dump( is_subdomain_install() );'

WP-CLIが使えない場合は、wp-config.php を開いて次の定数を確認します。

wp-config.php の定数を正しく書く

マルチサイトの有効化は2段階です。まず wp-config.php の「/* That's all, stop editing! Happy publishing. */」の行より上に次の1行を加えると、管理画面の「ツール」に「ネットワークの設置」が現れます。

/* Multisite */
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 );

確認するポイントは次のとおりです。

  • DOMAIN_CURRENT_SITE は https:// を付けず、ドメインだけを書く。www の有無もデータベースの登録と合わせる
  • 定数が require_once ABSPATH . 'wp-settings.php'; の行より下に書かれていると効かない。公式ドキュメントでも、その行より後にあるコードは「stop editing」の行より上へ移すよう案内されています
  • SUBDOMAIN_INSTALL は、ネットワーク作成時に選んだ型と一致させる。途中で型を変えるのは、データベースのURLも変わるため簡単ではありません

サブサイトが404になる場合:書き換えルールを確認する

サブサイトのURLをWordPressに振り分ける書き換えルールが足りないと、メインサイトだけが表示され、サブサイトが404になります。シングルサイト用の .htaccess のまま、というのがよくある原因です。

Apache(.htaccess)

「ネットワーク管理」→「設定」→「ネットワーク設定」の画面に、その環境向けのルールが表示されます。既存の WordPress 用の行を、表示されたルールに置き換えます。公式ドキュメントに載っているWordPress 3.5以降のサブディレクトリ型のルールは次のとおりです。

# BEGIN WordPress Multisite
# Using subfolder network type: https://wordpress.org/documentation/article/htaccess/#multisite

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

# add a trailing slash to /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]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

# END WordPress Multisite

サブドメイン型では、パスの先頭にサイト名が付かないため、次のように短くなります。

# BEGIN WordPress Multisite
# Using subdomain network type: https://wordpress.org/documentation/article/htaccess/#multisite

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

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

# END WordPress Multisite

ルールが正しいのに404が続く場合は、Apache側で .htaccess が読まれていない可能性があります。自分で管理しているUbuntuのサーバーなら、mod_rewrite を有効にし、サイト設定の AllowOverride None を AllowOverride All に変えてApacheを再起動します。

sudo a2enmod rewrite
sudo systemctl restart apache2

Apacheのエラーログに FollowSymLinks や SymLinksIfOwnerMatch が無効なため RewriteRule が禁止されている、という記録がある場合は、.htaccess の先頭に Options FollowSymlinks が必要な環境です。レンタルサーバーでは、これらの設定を利用者が変えられないことがあるので、サーバー会社のマニュアルを確認してください(2026年10月時点)。

nginx

nginxは .htaccess を読まないため、同じ働きのルールをサーバー設定に書きます。公式ドキュメントのサブディレクトリ型の例では、server ブロックの中に次のルールを置きます。

if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}

サブドメイン型では、このブロックは不要で、server_name example.com *.example.com; のように、サブドメインも同じ server ブロックで受けるようにします。変更後は sudo nginx -t で構文を確かめてから再読み込みします。

サブドメイン型でサブサイトに届かない場合:DNSと証明書

サブドメイン型では、site2.example.com のようなアクセスが、WordPressの入ったサーバーまで届く必要があります。

  • DNSにワイルドカードのレコード(*.example.com)か、サブドメインごとのレコードがある
  • Webサーバーが、サブドメインへのリクエストもWordPressのディレクトリで受けている
  • SSL証明書がサブドメインにも対応している(ワイルドカード証明書や、サブドメインを含む証明書)

ここが足りないとWordPressまで届かないため、表示はWordPressの画面ではなく、サーバーやブラウザのエラーになります。WordPressの画面(「サイトが存在しません」など)が出ているなら、サーバーまでは届いています。その場合の対処は マルチサイトで「サイトが存在しません」と表示される場合の対処法 を参照してください。

なお、公式ドキュメントでは、WordPressのアドレスが localhost やIPアドレスの場合はサブドメイン型を選べないこと、:80・:443 以外のポート番号を含むアドレスではネットワークを作成できないことが案内されています。

ログインできない場合:Cookieの定数とURLを確認する

ネットワークを作成した直後は、ログインし直す必要があります。ログイン画面に戻される場合は、まずブラウザのキャッシュとCookieを削除して試します。

それでも直らない場合は、wp-config.php にCookie関連の定数を自分で書いていないか確認します。マルチサイトでは、WordPressがネットワークの設定から COOKIEPATH・SITECOOKIEPATH・ADMIN_COOKIE_PATH を自動で決め、サブドメイン型では COOKIE_DOMAIN も「. +ネットワークのドメイン」に設定します。これらは「定義されていなければ設定する」作りなので、wp-config.php で先に別の値を定義すると、自動の設定が使われません。たとえばサブドメイン型で COOKIE_DOMAIN を空文字にすると、サブドメインをまたいだログインの共有が崩れます。

// 次のような行が残っていたら、意図して書いたものでない限り削除して試す
// define( 'COOKIE_DOMAIN', '' );
// define( 'COOKIEPATH', '/' );
// define( 'SITECOOKIEPATH', '/' );
// define( 'ADMIN_COOKIE_PATH', '/' );

あわせて、「設定」→「一般」のWordPressアドレス(URL)とサイトアドレス(URL)が、http/https や www の有無まで含めて一致しているかを確認します。公式ドキュメントでも、www を使う場合は両方のアドレスを同じにするよう案内されています。移転やドメイン変更の後なら、データベースの wp_site・wp_blogs のドメインが古いまま残っていることがあります。手順は マルチサイトのドメイン変更後に起きるエラーの対処法 にまとめています。

データベースのエラーが出る場合:ネットワーク用テーブルを確認する

公式のトラブルシューティングでは、ネットワーク用のテーブルが欠けている、または wp_site・wp_blogs が空になっているとネットワークが動かない、と説明されています。次のテーブルがあるかを確認します(接頭辞が wp_ 以外なら読み替えてください)。

SHOW TABLES LIKE 'wp\_blog%';
SHOW TABLES LIKE 'wp\_site%';
SHOW TABLES LIKE 'wp\_signups';
SHOW TABLES LIKE 'wp\_registration\_log';

SELECT * FROM wp_site;
SELECT blog_id, site_id, domain, path FROM wp_blogs;

必要なテーブルは wp_blogs・wp_blogmeta・wp_site・wp_sitemeta・wp_signups・wp_registration_log などです。データベースのユーザーに十分な権限がない、データベースのホスト名が移転で変わった、といった原因もあり得るので、wp-config.php の接続情報も確認します。

ネットワーク有効化したプラグインが一部のサイトで動かない場合

「ネットワーク管理」→「プラグイン」で「ネットワークで有効化」したプラグインは、全サイトで読み込まれます。サイトごとの状態はWP-CLIで確認できます。

# サブサイトから見たプラグインの状態(active-network ならネットワーク有効化)
wp plugin list --url=https://example.com/site2/

# ネットワーク全体で有効化されているプラグインの一覧
wp plugin list --status=active-network

ネットワーク有効化しても、プラグインの初期設定(独自テーブルの作成や初期値の保存など)がメインサイトでしか行われず、ほかのサイトで動かないことがあります。これはプラグイン側のマルチサイト対応の問題なので、プラグインの説明やサポートで、マルチサイトでの使い方(ネットワーク有効化と、サイトごとの有効化のどちらを想定しているか)を確認してください。ネットワーク有効化をやめて、必要なサイトだけで有効化すると動く場合もあります。

別のサイトのデータが表示される場合:switch_to_blog() の戻し忘れ

テーマや自作プラグインで、ほかのサイトのデータを読むために switch_to_blog() を使っている場合、restore_current_blog() で元に戻さないと、以降の処理が切り替え先のサイトのまま実行されます。切り替えるたびに、対になる restore_current_blog() を呼びます。

<?php
/**
 * 指定したサイトの最新投稿を取得する。
 */
function my_get_posts_from_site( int $blog_id, int $count = 5 ): array {
	if ( ! is_multisite() ) {
		return array();
	}

	switch_to_blog( $blog_id );
	$posts = get_posts(
		array(
			'posts_per_page' => $count,
			'post_status'    => 'publish',
		)
	);
	restore_current_blog(); // 切り替えたら元に戻す

	return $posts;
}

途中で return する分岐があると戻し忘れが起きやすいので、上の例のように、切り替えから戻すまでの間で関数を抜けない書き方にします。ネットワーク全体で共有する設定値は、switch_to_blog() を使わず get_site_option()・update_site_option() で読み書きできます。

修正後の確認

  1. メインサイトとサブサイトのトップページ、記事ページ、管理画面をそれぞれ開く
  2. ログアウトしてからログインし直し、サブサイトの管理画面へ移動できるかを確かめる
  3. wp site list で、すべてのサイトのURLが想定どおりになっているかを確認する
  4. 修正前に控えた wp-config.php・.htaccess との差分を見て、意図しない変更が残っていないかを確かめる

マルチサイトを新しく作る場合の手順は WordPressマルチサイトの設定方法 で説明しています。

まとめ

  • マルチサイトの設定は wp-config.php・書き換えルール・データベースの3か所にまたがる。症状から、どこが合っていないかを先に見当づける
  • サブサイトの404は、マルチサイト用の書き換えルールの不足が多い。「ネットワーク設定」画面に表示されるルールに置き換え、Apacheでは mod_rewrite と AllowOverride も確認する
  • サブドメイン型では、ワイルドカードDNS、バーチャルホスト、証明書がそろっている必要がある
  • ログインの不具合は、Cookieの削除、自分で書いたCookie定数の削除、アドレスの一致を順に確認する
  • プラグインの不具合はマルチサイト対応を確認し、自作コードでは switch_to_blog() と restore_current_blog() を対にする

お気軽にご相談ください

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