2026年7月8日

2026年7月8日

WordPressのマルチサイトネットワーク管理を効率化する方法

はじめに

WordPressのマルチサイト機能を使うと、1つのWordPressインストールで複数のサイトを一元管理できます。企業グループサイトや多地域展開のウェブサービスで特に有効です。しかし、サイト数が増えるにつれてネットワーク管理が複雑になり、プラグインの有効化やユーザー権限の管理に手間がかかるようになります。本記事では、マルチサイトネットワークを効率的に管理するための設定とカスタマイズ方法を解説します。

症状・原因

  • ネットワーク全体へのプラグイン一括適用方法がわからない
  • サイトごとに異なるドメインを割り当てたい
  • Super Admin と通常管理者の権限の違いが不明確
  • wp-config.php のマルチサイト設定項目の意味がわからない
  • ネットワーク全体の設定を update_network_option() で管理したい

解決手順

ステップ1:wp-config.php でマルチサイトを有効化する

まず wp-config.php に以下の定数を追加してマルチサイトを有効化します。サブディレクトリ構成とサブドメイン構成の2種類があります。

/* wp-config.php マルチサイト設定 */

// マルチサイトを有効化
define( 'WP_ALLOW_MULTISITE', true );

// ネットワーク設定(管理画面でセットアップ後に追加)
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false ); // trueでサブドメイン構成
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( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );

ステップ2:ネットワーク管理メニューにカスタム項目を追加する

network_admin_menu フックを使ってネットワーク管理画面にカスタムメニューを追加できます。

<?php
/**
 * ネットワーク管理メニューのカスタマイズ
 * functions.php または mu-plugins に記述
 */
add_action( 'network_admin_menu', 'my_network_admin_menu' );

function my_network_admin_menu() {
    add_menu_page(
        'ネットワーク設定',           // ページタイトル
        'ネットワーク設定',           // メニューラベル
        'manage_network',             // 必要な権限(Super Adminのみ)
        'my-network-settings',        // メニュースラッグ
        'my_network_settings_page',   // コールバック関数
        'dashicons-networking',       // アイコン
        3                             // メニュー位置
    );
}

function my_network_settings_page() {
    if ( ! current_user_can( 'manage_network' ) ) {
        wp_die( 'アクセス権限がありません。' );
    }

    // フォーム送信処理
    if ( isset( $_POST['submit'] ) && check_admin_referer( 'my_network_settings' ) ) {
        update_network_option( get_current_network_id(), 'my_custom_option', sanitize_text_field( $_POST['my_option'] ) );
        echo '<div class="updated"><p>設定を保存しました。</p></div>';
    }

    $option_value = get_network_option( get_current_network_id(), 'my_custom_option', '' );
    ?>
    <div class="wrap">
        <h1>ネットワーク設定</h1>
        <form method="post">
            <?php wp_nonce_field( 'my_network_settings' ); ?>
            <table class="form-table">
                <tr>
                    <th>カスタムオプション</th>
                    <td><input type="text" name="my_option" value="<?php echo esc_attr( $option_value ); ?>"></td>
                </tr>
            </table>
            <?php submit_button( '保存' ); ?>
        </form>
    </div>
    <?php
}

ステップ3:プラグインのネットワーク有効化・無効化を管理する

ネットワーク全体でプラグインを管理するには activate_plugin()$network_wide パラメータ付きで使います。

<?php
/**
 * ネットワーク全体へのプラグイン一括有効化
 */
function network_activate_plugins( array $plugins ) {
    foreach ( $plugins as $plugin ) {
        if ( ! is_plugin_active_for_network( $plugin ) ) {
            activate_plugin( $plugin, '', true ); // 第3引数 true でネットワーク有効化
            error_log( "ネットワーク有効化: {$plugin}" );
        }
    }
}

// 使用例
$required_plugins = [
    'akismet/akismet.php',
    'jetpack/jetpack.php',
    'wordfence/wordfence.php',
];
network_activate_plugins( $required_plugins );

/**
 * 新規サイト作成時に特定プラグインを自動有効化
 */
add_action( 'wp_initialize_site', 'auto_activate_plugins_on_new_site', 10, 2 );

function auto_activate_plugins_on_new_site( WP_Site $new_site, array $args ) {
    switch_to_blog( $new_site->blog_id );

    $site_plugins = [
        'contact-form-7/wp-contact-form-7.php',
        'wordpress-seo/wp-seo.php',
    ];

    foreach ( $site_plugins as $plugin ) {
        activate_plugin( $plugin );
    }

    restore_current_blog();
}

ステップ4:Super Admin 権限の管理とカスタマイズ

Super Admin はネットワーク全体の管理者です。プログラムから Super Admin を付与・剥奪できます。

<?php
/**
 * Super Admin 権限の管理
 */

// Super Admin を付与
function grant_super_admin_by_email( string $email ): bool {
    $user = get_user_by( 'email', $email );
    if ( ! $user ) {
        return false;
    }
    grant_super_admin( $user->ID );
    return true;
}

// Super Admin を剥奪
function revoke_super_admin_by_email( string $email ): bool {
    $user = get_user_by( 'email', $email );
    if ( ! $user || ! is_super_admin( $user->ID ) ) {
        return false;
    }
    revoke_super_admin( $user->ID );
    return true;
}

/**
 * ネットワーク全体のユーザー一覧を取得
 */
function get_all_network_super_admins(): array {
    $super_admins = get_super_admins();
    $users = [];
    foreach ( $super_admins as $login ) {
        $user = get_user_by( 'login', $login );
        if ( $user ) {
            $users[] = [
                'id'    => $user->ID,
                'login' => $user->user_login,
                'email' => $user->user_email,
            ];
        }
    }
    return $users;
}

ステップ5:ドメインマッピングとネットワーク設定の一括更新

update_network_option() を活用してネットワーク全体の設定を効率的に管理します。

<?php
/**
 * ネットワーク全体の設定を一括更新
 */
function bulk_update_network_settings( array $settings ): void {
    $network_id = get_current_network_id();

    foreach ( $settings as $key => $value ) {
        update_network_option( $network_id, $key, $value );
    }
}

// 使用例
bulk_update_network_settings([
    'registration'         => 'none',      // 新規登録を無効化
    'add_new_users'        => '0',
    'upload_space_check_disabled' => '1',
    'fileupload_maxk'      => 51200,        // 50MB
    'upload_filetypes'     => 'jpg jpeg png gif pdf mp4 mov',
    'blogdescription'      => 'ネットワークサイト',
]);

/**
 * 全サイトにカスタムオプションを設定
 */
function set_option_for_all_sites( string $option_name, $option_value ): void {
    $sites = get_sites([ 'number' => 0 ]); // 全サイト取得

    foreach ( $sites as $site ) {
        switch_to_blog( $site->blog_id );
        update_option( $option_name, $option_value );
        restore_current_blog();
    }
}

注意事項

  • switch_to_blog() を使った後は必ず restore_current_blog() を呼び出してください。呼び忘れるとグローバル状態が汚染されます
  • ネットワーク有効化したプラグインは全サイトで強制的に有効になります。サイト管理者は無効化できません
  • Super Admin 権限を持つユーザーはネットワーク全体のデータにアクセスできるため、付与は慎重に行ってください
  • get_sites() で全サイトを取得する際は number パラメータに 0 を指定しないと最大100件に制限されます
  • ドメインマッピングを使う場合はサーバー側の DNS・バーチャルホスト設定も必要です

まとめ

WordPressマルチサイトは wp-config.php の設定から始まり、network_admin_menu フックによるUI拡張、activate_plugin() のネットワーク有効化、Super Admin 権限管理、update_network_option() による一括設定まで、体系的に管理する仕組みが揃っています。サイト数が増えても switch_to_blog() を活用した自動化スクリプトで効率的な運用が可能です。

お気軽にご相談ください

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