🏢 マルチサイトとは

WordPressマルチサイトを有効にすると、1つのWordPressインストールで複数のサイトを管理できます。企業の部門サイト群、学校の各クラスサイト、SaaSのテナント分離などに使われます。

マルチサイトの特徴

  • 1つのコードで複数サイトを管理
  • プラグイン・テーマを一括管理
  • ネットワーク管理者が全サイトを統括
  • サイトごとに独立したDB設定

プラグインの有効化方法

  • サイト単位:各サイトの管理者が個別に有効化
  • ネットワーク有効化:管理者が全サイトで一括有効化
  • is_plugin_active_for_network() で判定可能

💡 マルチサイト環境の判定

if ( is_multisite() ) { // マルチサイト環境でのみ実行する処理 } // ネットワーク有効化かどうか確認 if ( is_plugin_active_for_network( plugin_basename( __FILE__ ) ) ) { // ネットワーク全体で有効化されている }

🔧 ネットワーク管理画面へのメニュー追加

// ネットワーク管理画面にメニューを追加 add_action( 'network_admin_menu', 'mfp_network_admin_menu' ); function mfp_network_admin_menu() { add_menu_page( 'MFP ネットワーク設定', 'MFP ネットワーク', 'manage_network_options', // ネットワーク管理者権限 'mfp-network-settings', 'mfp_network_settings_page', 'dashicons-networking' ); } function mfp_network_settings_page() { if ( ! current_user_can( 'manage_network_options' ) ) return; // フォームの保存処理 if ( isset( $_POST['mfp_network_nonce'] ) && wp_verify_nonce( $_POST['mfp_network_nonce'], 'mfp_network_save' ) ) { $footer_text = sanitize_textarea_field( $_POST['mfp_footer_text'] ?? '' ); update_site_option( 'mfp_footer_text', $footer_text ); echo '<div class="updated"><p>保存しました。</p></div>'; } $footer_text = get_site_option( 'mfp_footer_text', '' ); ?> <div class="wrap"> <h1>MFP ネットワーク設定</h1> <form method="post"> <?php wp_nonce_field( 'mfp_network_save', 'mfp_network_nonce' ); ?> <table class="form-table"> <tr> <th>全サイト共通フッターテキスト</th> <td><textarea name="mfp_footer_text" rows="3" cols="60"><?php echo esc_textarea( $footer_text ); ?></textarea></td> </tr> </table> <?php submit_button(); ?> </form> </div> <?php }

⚙️ 設定値の保存と取得

// ─ ネットワーク全体の設定(全サイト共通)──────────────── update_site_option( 'mfp_network_setting', 'value' ); $setting = get_site_option( 'mfp_network_setting', 'default' ); delete_site_option( 'mfp_network_setting' ); // ─ 特定サイトの設定 ────────────────────────────────────── update_blog_option( $blog_id, 'mfp_site_setting', 'value' ); $setting = get_blog_option( $blog_id, 'mfp_site_setting', 'default' ); // ─ 全サイトを対象に処理 ────────────────────────────────── $sites = get_sites( array( 'number' => 0 ) ); // 0=全件取得 foreach ( $sites as $site ) { switch_to_blog( $site->blog_id ); // このサイトのコンテキストで処理 $posts = get_posts( array( 'numberposts' => 5 ) ); restore_current_blog(); // 必ず元に戻す! }

⚠️ switch_to_blog() の後は必ず restore_current_blog()

switch_to_blog() でサイトを切り替えた後は、例外が発生した場合でも restore_current_blog() が呼ばれるよう try/finally を使うと安全です。忘れると後続の処理が意図しないサイトで実行されます。

switch_to_blog( $site->blog_id ); try { // 処理 } finally { restore_current_blog(); // 常に実行される }

🗄️ マルチサイトでのDB操作

// マルチサイトでは各サイトにプレフィックス付きのテーブルがある // 例: wp_posts(サイト1)/ wp_2_posts(サイト2)/ wp_3_posts(サイト3) // switch_to_blog()後は $wpdb->prefix が自動的に切り替わる switch_to_blog( 2 ); global $wpdb; echo $wpdb->prefix; // 'wp_2_' になる $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} LIMIT 5" ); restore_current_blog(); // ネットワーク全体の共通テーブルを作成する場合 // プレフィックスを wp_(サイト番号なし)にする function mfp_create_network_table() { global $wpdb; $table = $wpdb->base_prefix . 'mfp_network_data'; // base_prefix = 'wp_' // ... }

✏️ 演習

📝 課題

  1. ネットワーク管理画面に「全サイト共通のお知らせバナーテキスト」を設定する画面を追加する
  2. 全サイトのフロントエンドでそのバナーテキストを wp_head フックで表示する
  3. 各サイトの管理者が個別にバナーを非表示にできる設定を追加する

✅ この章のチェックリスト

  • is_multisite()でマルチサイドを判定できた
  • network_admin_menuでネットワーク管理メニューを追加できた
  • get_site_option/update_site_optionを使えた
  • switch_to_blog / restore_current_blogをtry/finallyで正しく使えた
  • $wpdb->base_prefixとprefixの違いを理解した

🔗 関連ページ・次のステップ

📘 前提知識

🚀 あわせて学ぶ