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フィルターで削除済みサイトをリダイレクト・新規サイト作成をネットワーク管理者にメール通知する手順で解決します。

お気軽にご相談ください

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