2026年5月20日
2026年5月20日
WordPressマルチサイトで管理画面に入れないときの原因と直し方
WordPress マルチサイトで管理画面に入れない原因は、権限、wp-config.php の設定、Web サーバーのリライト、DNS、データベースに保存されたドメインの不一致など、いくつかに分かれます。まず症状から原因の見当をつけ、確認しながら直していきます。
この記事のコマンドは WP-CLI を使います。手順は WordPress の公式ハンドブック(Advanced Administration)と WP-CLI の公式ドキュメントで2026年11月時点に確認しました。作業の前に、データベースとファイルのバックアップを取ってください。
wp db export before-fix.sql
症状から原因の見当をつける
| 症状 | 考えられる原因 | 見る節 |
|---|---|---|
/wp-admin/network/ で権限がないと表示される |
特権管理者(Super Admin)になっていない | 特権管理者の権限を確認する |
| サブサイトの管理画面で権限がないと表示される | そのサイトのユーザーとして追加されていない | サブサイトにユーザーを追加する |
メインサイトは開くが、サブサイトや /サイト名/wp-admin/ が 404 になる、画面が崩れる |
マルチサイト用のリライトが入っていない | リライトの設定を確認する |
| サブドメインのサイトがつながらない | DNS や Web サーバーがそのホスト名を受け付けていない | サブドメイン型の DNS と Web サーバー |
サブドメインのサイトを開くと wp-signup.php に転送される |
そのホスト名のサイトがデータベースに無い | サイトの登録内容を確認する |
| サイトがアーカイブ・停止された旨のメッセージ(英語表示では This site has been archived or suspended.)が出る | サイトがアーカイブ・停止・スパムの状態 | サイトの状態を確認する |
| 「データベース接続確立エラー」が出る | wp-config.php のドメインとデータベースの登録が合っていない |
wp-config.php の定数を確認する |
現在の設定を確認する
# マルチサイトの定数
wp config get MULTISITE
wp config get SUBDOMAIN_INSTALL
wp config get DOMAIN_CURRENT_SITE
wp config get PATH_CURRENT_SITE
# ネットワーク内のサイトの一覧(ドメインとパスも表示)
wp site list --fields=blog_id,domain,path,url
# 特権管理者の一覧
wp super-admin list
wp site list の domain と path は、データベースの wp_blogs テーブルの値です(接頭辞が wp_ の場合)。ブラウザーで開いている URL と一致しているかを確認します。
wp-config.php の定数を確認する
ネットワークを作成したときに、次のような定数を wp-config.php に追加しています。値はサイトごとに違うので、ネットワーク管理画面の Network Setup 画面(/wp-admin/network/setup.php)に表示される内容と照らし合わせてください。
<?php
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とPATH_CURRENT_SITEが、wp_siteテーブルとwp_blogsテーブルのメインサイト(blog_idが 1)のdomain・pathと一致していること。一致しないと、WordPress がネットワークを見つけられず、「データベース接続確立エラー」の画面になることがあります。wwwの有無、httpとhttpsの違いも含めて揃っていること。- これらの定数が、
/* That's all, stop editing! Happy publishing. */の行より上にあること。require_once ABSPATH . 'wp-settings.php';より後ろに書いた設定は効きません。 SUBDOMAIN_INSTALLは、ネットワーク作成後に変えると .htaccess やサイトの URL もすべて合わせる必要があります。設定ミスを直す目的以外では変えないでください。
特権管理者の権限を確認する
ネットワーク管理画面(/wp-admin/network/)に入れるのは特権管理者だけです。サブサイトの「管理者」ではネットワーク管理画面に入れません。
# 特権管理者にする(ユーザー名、メールアドレス、ID のどれでも指定できる)
wp super-admin add username
# 特権管理者の一覧で確認
wp super-admin list
特権管理者の一覧は、ネットワークの設定(wp_sitemeta テーブルの site_admins)に保存されています。管理画面からは、ほかの特権管理者がネットワーク管理画面の「ユーザー」で対象ユーザーを編集し、特権管理者の権限を与える項目にチェックを入れて変更します。
サブサイトにユーザーを追加する
マルチサイトでは、ユーザーはネットワーク全体で共通ですが、どのサイトでどの権限を持つかはサイトごとに決まります。サブサイトの管理画面に入れない場合は、そのサイトのユーザーとして追加されているかを確認します。
# サブサイトでのユーザーと権限を確認(--url はそのサイトの URL)
wp user list --url=https://example.com/site1/ --fields=ID,user_login,roles
# サブサイトの管理者として追加する
wp user set-role username administrator --url=https://example.com/site1/
wp user set-role は、マルチサイトでは対象のサイトにユーザーを追加したうえで権限を設定します。管理画面からは、ネットワーク管理画面の「サイト」で対象サイトの「編集」を開き、「ユーザー」タブから既存のユーザーを追加できます。
リライトの設定を確認する
Apache(.htaccess)
マルチサイトの .htaccess は、シングルサイトのものとは違います。サブディレクトリー型とサブドメイン型でも違うので、自分のネットワークの型に合ったものを使います。
サブディレクトリー型(example.com/site1/)の場合です。
# BEGIN WordPress 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
サブドメイン型(site1.example.com)の場合です。
# BEGIN WordPress 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
WordPress を / 以外のディレクトリーに置いている場合は、RewriteBase をそのパスに合わせます。Network Setup 画面には、そのサイトに合わせた内容が表示されます。
注意点です。
- マルチサイトでは、
wp rewrite flush --hardやパーマリンク設定の保存で .htaccess は書き換わりません(WordPress 本体がマルチサイトでは .htaccess を書き出さないため)。手で書き換えます。 wp rewrite flushには--networkオプションはありません。サイトごとのリライトルールを作り直したいときは、--urlを付けてサイトごとに実行します。- Apache で
mod_rewriteが有効で、そのディレクトリーでAllowOverride All(少なくともFileInfo)が許可されている必要があります。
Nginx
Nginx は .htaccess を読みません。サブディレクトリー型では、サイト名の部分を取り除いて wp-admin などに渡す書き換えが必要です。公式ハンドブックの例をもとにした設定です(PHP の渡し方は、お使いの環境の location ~ \.php$ に合わせてください)。
server {
server_name example.com;
root /var/www/example.com/htdocs;
index index.php;
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
サブドメイン型では、server_name example.com *.example.com; のようにサブドメインも受け付け、location / の try_files があれば足ります。変更後は sudo nginx -t で確認してから sudo systemctl reload nginx で反映します。
サブドメイン型の DNS と Web サーバー
サブドメイン型では、サブサイトのホスト名(site1.example.com)が、WordPress のサーバーにつながる必要があります。
# DNS がサーバーの IP を返すか確認
dig +short site1.example.com
- サブドメインごとに DNS レコード(A レコードや CNAME)を作るか、ワイルドカードレコード(
*.example.com)を作ります。公式ハンドブックでは、ワイルドカード DNS が必要なのは、利用者が自分でサイトを作れるようにする(サブドメインがその場で増える)場合だけとされています。 - Web サーバー側でも、そのホスト名を受け付ける設定が必要です(Apache の
ServerAlias、Nginx のserver_name)。 - HTTPS の場合は、SSL 証明書がサブドメインを含んでいる必要があります(ワイルドカード証明書、またはサブドメインごとの証明書)。
サイトの登録内容を確認する
サブドメイン型で、開いたホスト名のサイトがデータベースに無いと、WordPress は wp-signup.php(新しいサイトの登録画面)へ転送します。wp site list --fields=blog_id,domain,path で、開こうとしているホスト名とパスが登録されているかを確認します。
特定のサイトだけ URL がずれている場合は、そのサイトの home と siteurl を確認します。
# サイトの URL を確認(--url は wp_blogs に登録されているアドレス)
wp option get home --url=https://site1.example.com/
wp option get siteurl --url=https://site1.example.com/
# 正しい値に直す
wp option update home 'https://site1.example.com' --url=https://site1.example.com/
wp option update siteurl 'https://site1.example.com' --url=https://site1.example.com/
wp_blogs 側のドメインやパスを直す場合は、ネットワーク管理画面の「サイト」で対象サイトの「編集」を開き、サイトのアドレスを変更します。
サイトの状態を確認する
サイトがアーカイブ・停止(削除扱い)・スパムの状態になっていると、特権管理者以外のユーザーには、サイトや管理画面の代わりに停止中のメッセージが表示されます(特権管理者には通常どおり表示されます)。
wp site list --fields=blog_id,url,archived,deleted,spam
# 状態を戻す(2 はサイトの blog_id)
wp site unarchive 2
wp site activate 2
wp site unspam 2
ドメインを変えたあとに入れなくなった場合
マルチサイトのドメイン変更は、シングルサイトより手順が多くなります。公式ハンドブックでは、ファイルを移したあと、必要に応じて .htaccess と wp-config.php を直し、データベースにある旧ドメインをすべて新ドメインに変え、最後に wp_site・wp_blogs と各サイトの home・siteurl を目で確認するよう案内しています。
WP-CLI の search-replace は、シリアライズされたデータも壊さずに置き換えられます。--network を付けると、ネットワークに属するすべてのテーブルが対象になります。
# 1. まず --dry-run で置き換え件数を確認する(wp-config.php はまだ旧ドメインのまま)
wp search-replace 'old.example.com' 'new.example.com' --network --skip-columns=guid --dry-run
# 2. 問題がなければ実行する
wp search-replace 'old.example.com' 'new.example.com' --network --skip-columns=guid
# 3. wp-config.php の DOMAIN_CURRENT_SITE を新しいドメインに変える
# 4. 結果を確認する
wp site list --fields=blog_id,domain,path,url
wp-config.php を先に新しいドメインに変えると、データベースはまだ旧ドメインのままなので、WP-CLI もネットワークを見つけられずに止まります。その場合は wp-config.php を一度旧ドメインに戻してから置き換えを実行し、そのあとで変更します。ドメインの置き換えでは、ドメインを含むメールアドレスやほかの文字列も変わるので、--dry-run の結果を見てから実行してください。
それでも入れない場合
- ブラウザーの Cookie を削除する、またはシークレットウィンドウで試す(ドメインやプロトコルを変えた直後は、古い Cookie が残っていることがあります)。
wp-config.phpにCOOKIE_DOMAINなどの Cookie 関連の定数を独自に追加している場合は、一時的に外して確かめる。- プラグインが原因かを切り分けるため、
wp plugin deactivate --all --networkとwp plugin deactivate --all --url=<サイトのURL>で一時的に止めて確認する(あとで元に戻す)。
関連する記事として、WordPressマルチサイトのセットアップ方法とWordPressマルチサイトのエラー対処法もあります。
まとめ
- ネットワーク管理画面に入れないときは、まず
wp super-admin listで特権管理者かどうかを確認します。 - サブサイトに入れないときは、そのサイトのユーザーかどうかを
wp user list --url=で確認し、wp user set-roleで追加します。 - 404 や画面崩れは、ネットワークの型に合った .htaccess(または Nginx の書き換え)を手で入れます。マルチサイトでは WordPress が .htaccess を書き出しません。
- ドメインまわりは、
wp-config.phpの定数、wp_site・wp_blogs、各サイトのhome・siteurlが一致しているかを確認します。