2026年11月13日
2026年11月13日
WordPressマルチサイトのエラーを解決する方法
はじめに
WordPressマルチサイトを有効化してサブサイトを追加したが「申し訳ございませんが、お探しのサイトは見つかりません」と表示される・ネットワーク管理画面(/wp-admin/network/)にアクセスすると真っ白になる・サブドメイン型マルチサイトで新しく作ったサイトのURLにアクセスするとメインサイトにリダイレクトされる・.htaccessのマルチサイト用ルールが書き込まれていないといった問題は、wp-config.phpの設定不備・.htaccessのルール欠落・サーバーのワイルドカードDNS設定が原因です。
症状・原因
- 新規サブサイト追加後に「このサイトへのアクセス方法に問題があります」が表示される
- ネットワーク管理画面で「ネットワーク有効化」後にwp-config.phpと.htaccessの変更が完了していない
- サブドメイン型でワイルドカードDNS(
*.example.com)が設定されていない - サブサイトのパーマリンクが個別にリセットされていない
解決手順
ステップ1:マルチサイトの状態を確認する
# マルチサイトの設定を確認
wp eval "
echo 'Multisite: ' . (is_multisite() ? 'yes' : 'no') . PHP_EOL;
echo 'Network admin: ' . (is_network_admin() ? 'yes' : 'no') . PHP_EOL;
echo 'Main site ID: ' . get_main_site_id() . PHP_EOL;
echo 'Current site: ' . get_current_blog_id() . PHP_EOL;
echo 'Subdomain: ' . (defined('SUBDOMAIN_INSTALL') ? (SUBDOMAIN_INSTALL ? 'yes' : 'no') : 'not defined') . PHP_EOL;
echo 'Domain current: ' . get_current_site()->domain . PHP_EOL;
"
# 全サイトの一覧を確認
wp site list --format=table
# データベースのマルチサイトテーブルを確認
wp eval "
global \$wpdb;
\$blogs = \$wpdb->get_results('SELECT blog_id, domain, path, archived, deleted FROM ' . \$wpdb->blogs . ' ORDER BY blog_id');
foreach (\$blogs as \$blog) {
printf('ID:%d %s%s archived:%s deleted:%s' . PHP_EOL,
\$blog->blog_id, \$blog->domain, \$blog->path,
\$blog->archived, \$blog->deleted);
}
"
ステップ2:wp-config.phpのマルチサイト設定を修正する
// wp-config.php: マルチサイト必須設定(順序が重要)
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false); // サブディレクトリ型: false、サブドメイン型: true
// ネットワーク有効化後にWordPressが生成するコード
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');
// クッキードメインの設定(サブドメイン型の場合)
define('COOKIE_DOMAIN', ''); // サブドメイン型では空にする
define('COOKIEPATH', '/');
define('SITECOOKIEPATH', '/');
ステップ3:.htaccessのマルチサイトルールを修正する
# .htaccess: サブディレクトリ型マルチサイト
# BEGIN WordPress Multisite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# ネットワーク上の各サイトにアクセスするためのルール
RewriteRule ^index\.php$ - [L]
# アップロードファイルへのリダイレクト
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
# ファイルが存在しない場合のみWPへ転送
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress Multisite
# パーマリンクを全サイト一括でリセット
wp site list --field=url | while read url; do
wp --url="$url" rewrite flush --hard
echo "Flushed: $url"
done
ステップ4:サブサイトのデータを修復する
# 特定のサブサイトに問題がある場合の診断
wp --url="https://sub.example.com" eval "
echo 'Blog ID: ' . get_current_blog_id() . PHP_EOL;
echo 'Siteurl: ' . get_option('siteurl') . PHP_EOL;
echo 'Home: ' . get_option('home') . PHP_EOL;
echo 'Blogname: ' . get_option('blogname') . PHP_EOL;
"
# サブサイトのURLを修正
wp --url="https://old-url.example.com" site url https://new-url.example.com
// functions.php: マルチサイト管理のカスタマイズ
// ① 新規サイト作成時の初期設定を自動化
add_action('wp_initialize_site', function(WP_Site $new_site): void {
switch_to_blog($new_site->id);
// デフォルト設定を適用
update_option('timezone_string', 'Asia/Tokyo');
update_option('date_format', 'Y年n月j日');
update_option('time_format', 'H:i');
update_option('blog_public', 0); // 初期は検索エンジン非公開
// 必須プラグインを有効化
activate_plugin('akismet/akismet.php');
restore_current_blog();
error_log(sprintf('[Multisite] New site %d initialized: %s', $new_site->id, $new_site->domain));
});
ステップ5:マルチサイトのパフォーマンスと監視を設定する
// functions.php: マルチサイト最適化
// ① 全サイトのオプションをキャッシュ
add_action('init', function(): void {
if (!is_multisite()) return;
// 現在のサイトのオプションをプリロード
wp_cache_add_global_groups(['site-transient', 'site-options', 'blog-lookup']);
});
// ② 削除済みサブサイトへのアクセスをリダイレクト
add_filter('ms_site_not_found', function(object $current_site, string $domain, string $path): void {
// アーカイブまたは削除済みの場合はメインサイトへ
wp_redirect(home_url());
exit;
}, 10, 3);
// ③ ネットワーク管理者への通知
add_action('wp_initialize_site', function(WP_Site $new_site): void {
$network_admin = get_site_option('admin_email');
wp_mail(
$network_admin,
'新規サブサイトが作成されました',
sprintf(
"新規サブサイト情報:\nID: %d\nURL: %s\n管理者: %s",
$new_site->id,
$new_site->siteurl,
get_blog_option($new_site->id, 'admin_email')
)
);
});
注意事項
- マルチサイトを有効化した後にwp-config.phpと.htaccessを手動で編集する必要があります。WordPressがネットワーク有効化画面で表示するコードを正確にコピーして貼り付けてください。コードの順序や位置(
/ That's all, stop editing! /の前など)を間違えると動作しません - サブドメイン型マルチサイトを使用する場合、ドメインのDNS設定にワイルドカードレコード(
*.example.com → サーバーIP)が必要です。共有ホスティングでは一般的にワイルドカードDNSの設定が制限されているため、サブディレクトリ型の使用を推奨します - マルチサイトのデータベーステーブルはサイト数×テーブル数で増加します。サイト数が多い場合はデータベースの最適化と定期的なバックアップが特に重要です。
wp site listでアーカイブ済み・削除済みサイトを確認し、不要なサイトを定期的に削除してください
まとめ
WordPressマルチサイト修復は①is_multisite()・wp site list・$wpdb->blogsテーブルで全サイト状態確認、②wp-config.phpにMULTISITE・SUBDOMAIN_INSTALL・DOMAIN_CURRENT_SITEなどの必須定数を正しい順序で設定、③.htaccessにサブディレクトリ/サブドメイン型それぞれのマルチサイト用RewriteRuleを設定・全サイト一括wp rewrite flush、④wp_initialize_siteフックで新規サイトにタイムゾーン・言語・プラグイン自動設定、⑤ms_site_not_foundフィルターで削除済みサイトをリダイレクト・新規サイト作成をネットワーク管理者にメール通知する手順で解決します。