WordPress マルチサイトの新規サイト作成時にカスタム初期設定とカスタム初期データを設定しておく

WordPressでマルチサイトを構築する場合、連なる複数のサイト同士はなんらかの関連性を持っているはずです。よって、マルチサイトにおいては、初期設定と初期データをカスタム設定した状態で新規サイトを作成できると良いです。
例えば、ディフォルトテーマを設定しておいたり、共通カテゴリーを初期データとして登録しておく、などです。

一般的にマルチサイトでは、プラグインとテーマは一括で有効化できます。
カスタム投稿タイプやカスタムタクソノミーはテーマフォルダ内のfunctions.phpで定義しておけます。
しかし、テーマの選択や、パーマリンク設定、カテゴリーの入力などは、サイトを追加する毎に設定しなくてはなりません。
この最後の作業を、初期設定と初期データとしてあらかじめ設定しておこう、という話です。

新規サイト作成時の初期設定と初期データ

初期設定と初期データとは?

マルチサイトで新規サイトを追加した直後、もしくは、WordPressをインストールした直後に設定されている項目です。
WordPressを使ったことがある人ならすでに知っているはずです。

初期設定とは…

・「Twenty Eleven」というテーマが設定されている。
・サムネイルのサイズが150×150に設定されている。
・パーマリンクが「日付と投稿名」に設定されている。
・週のはじまりが「月曜日」に設定されている。など

初期データとは…

・「Hello world!」という投稿記事が登録されている。
・「サンプルページ」という固定ページが登録されている。
・「未分類」という初期カテゴリーが登録されている。
・「ブログロール」というリンクカテゴリーが登録されている。
・WordPress関連の7つのリンクが登録されている。
・サイドバーに6つのウィジェットが登録されている。など

これらが初期設定であり初期データです。

これらはすべてWordPress内で定義されています。

初期設定を行っているファイルは /wp-admin/includes/schema.php、初期データを登録しているファイルは /wp-admin/includes/upgrade.php です。

まずは、どのように初期設定と初期データが登録されているのかを見てみましょう。

初期設定と初期データの登録ロジックとカスタマイズ方法

初期設定

> /wp-admin/includes/schema.php

populate_options関数で初期設定を行っています。
初期設定とはデータベーステーブルのwp_optionsに格納されているサイト全体のオプション項目です。

populate_optionsはアクションフックとして登録されているので、カスタマイズするには…

初期設定をカスタマイズするには、プラグインを作成して、populate_optionsアクションにフックする。

初期データ

> /wp-admin/includes/upgrade.php

wp_install_defaults関数で初期データを登録しています。

wp_install_defaults関数は if ( !function_exists(‘wp_install_defaults’) ) : の後に記述されており、同じ名前の関数があれば読み込まれないことを意味しています。

よって、カスタマイズするには、

初期データをカスタマイズするには、プラグインを作成して、wp_install_defauls関数を定義する。

プラグインの作成

「multisite-default-setting」というプラグインを作成することにします。

> multisite-default-setting/multisite-default-setting.php

// カスタム初期設定
function custom_default_setting() {
	$options = array(
		// default theme
		'template' => 'custom_default_theme',
		'stylesheet' => 'custom_default_theme',
		// default permalink
		'permalink_structure' => '/%postname%/',
	);
	foreach ( $options as $key => $value ) {
		update_option( $key, $value );
	}
}
add_action( 'populate_options', 'custom_default_setting' );

// カスタム初期データ
function wp_install_defaults($user_id) {
	...
}

上記の例では、初期設定の「ディフォルトテーマ」と「パーマリンク」をカスタムしています。
設定できる全項目は、/wp-admin/includes/schema.phpのpopulate_options関数を参照してください。

また、初期データのカスタムについては、例えば空のwp_install_defaults関数を定義した場合、投稿記事、コメント、固定ページ、リンクカテゴリー、リンク、すべてが空のサイトが作成されます。
初期データを設定したい場合は、/wp-admin/includes/upgrade.php内のwp_install_defaults関数を参照してください。(以下ケーススタディーも参照

このプラグインを作成してマルチサイト全体で有効化しておくことで、以後、新規サイト作成時には、カスタムした初期設定と初期データが反映されます。

ケーススタディ

・「Custom Default Theme」というテーマを作成し、初期設定テーマとする。
・「photo」というカスタム投稿タイプと「photo_category」というカスタムタクソノミーを設定しておく。
・カスタムタクソノミーにいくつかの初期データを設定しておく。

テーマの作成と有効化

テーマを作成してマルチサイト全体で有効化しておきます。

カスタム投稿タイプとカスタムタクソノミーはfunctions.phpで定義しておきます。

> custom_default_theme/functions.php

// custom post type
function custom_post_types() {
	$labels = array(
		'name' => _x('フォト', 'post type general name'),
		// 省略
	);
	$args = array(
		'labels' => $labels,
		// 省略
	);
	register_post_type( 'photo', $args );
}
add_action( 'init', 'custom_post_types' );

// custom taxonomies
function custom_taxonomies() {
	$labels = array(
		'name' => _x('フォトカテゴリー', 'taxonomy general name' ),
		// 省略
	);
	register_taxonomy( 'photo_category', array('photo'), array(
		'labels' => $labels,
		// 省略
	) );
}
add_action( 'init', 'custom_taxonomies', 0 );

プラグインの作成と有効化

カスタム初期設定とカスタム初期データを設定するプラグインを作成して、マルチサイト全体で有効化しておきます。

> nultisite-default-setting/multisite-default-setting.php

function custom_default_setting() {
	$options = array(
		// default theme
		'template' => 'custom_default_theme',
		'stylesheet' => 'custom_default_theme',
		// default permalink
		'permalink_structure' => '/%postname%/',
	);
	foreach ( $options as $key => $value ) {
		update_option( $key, $value );
	}
}
add_action( 'populate_options', 'custom_default_setting' );

function wp_install_defaults($user_id) {
	global $wpdb, $wp_rewrite, $current_site, $table_prefix;
	
	$photo_terms = array(
		array('name' => '風景', 'slug' => 'photo_scene'),
		array('name' => '人物', 'slug' => 'photo_person'),
		array('name' => '静物', 'slug' => 'photo_object'),
	);
	$photo_term_id = 1;
	foreach ( $photo_terms as $photo_term ) {
		$wpdb->insert( $wpdb->terms, array('term_id' => $photo_term_id, 'name' => $photo_term['name'], 'slug' => $photo_term['slug'], 'term_group' => 0) );
		$wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $photo_term_id, 'taxonomy' => 'photo_category', 'description' => '', 'parent' => 0, 'count' => 0));
		$photo_term_id++;
	}
}

これで準備OK!

新規サイト追加

新規サイトを追加してみます。

すると…

指定したテーマが設定済み

パーマリンクも設定済み!

投稿データも固定ページもリンクも、すべて空!!

そしてそして、フォトカテゴリーも登録済みッ!!!

これですぐに運用をはじめられます^^