応用編
🏢 マルチサイト対応
WordPressマルチサイトは1つのWordPressで複数サイトを管理できる機能です。プラグインをマルチサイトに対応させることで、企業や教育機関の複数サイトを一元管理できるようになります。
🏢 マルチサイトとは
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_'
// ...
}
✏️ 演習
📝 課題
- ネットワーク管理画面に「全サイト共通のお知らせバナーテキスト」を設定する画面を追加する
- 全サイトのフロントエンドでそのバナーテキストを wp_head フックで表示する
- 各サイトの管理者が個別にバナーを非表示にできる設定を追加する
✅ この章のチェックリスト
- is_multisite()でマルチサイドを判定できた
- network_admin_menuでネットワーク管理メニューを追加できた
- get_site_option/update_site_optionを使えた
- switch_to_blog / restore_current_blogをtry/finallyで正しく使えた
- $wpdb->base_prefixとprefixの違いを理解した
🔗 関連ページ・次のステップ
📘 前提知識
- STEP 3: 管理画面を作る(メニュー追加)
- STEP 4: 機能を実装する(フック)
🚀 あわせて学ぶ
- セキュリティ対策(ネットワーク管理者権限)
- データベース操作(サイト別テーブル管理)
- WP-CLIコマンド開発(全サイト一括処理)