マルチサイトで新しくサイトを追加する際に、作成時のデータをWordPressデフォルトのものではなく、オリジナルのものに変更したい場合があります。
これは、独自のプラグインを作っておくことで簡単に実現することが可能です。(独自プラグインの作り方は、初心者でも10秒でできる WordPress プラグインの作り方やWordPress でスニペットを簡単に管理する方法あたりを参考に)
設定情報を変更する
設定メニューの初期設定を変更するには、populate_options にフックして、update_optionsを実行します。
これは、初期データを保存する populate_options が項目の存在確認を行った上で、保存を行っているため、その直前に実行される populate_options で予めデータを格納してしまうことで実現できる仕組みになっています。
CODE 1は、サイト作成時の利用テーマをTwenty Tenではなく、オリジナルのテーマするサンプルコード。CODE 2は、アップロード時に作成される画像のサイズを変更するサンプルコードです。
どのような項目が設定可能かについては、 wp-admin/includes/schema.phpの populate_options 関数内の $options という配列を確認してください。
※ siteurl, home, fileupload_url, upload_path, blogname, admin_email の6項目は、opulate_options実行後に再度アップデート処理がなされるため、populate_options フックでの変更はできません。(そもそも変更する必要ない項目だとは思いますが)
CODE 1
function my_default_theme_setting() { update_option( 'template', 'custom_theme' ); update_option( 'stylesheet', 'custom_theme' ); } add_action( 'populate_options', 'my_default_theme_setting' );
CODE 2
function my_default_image_sizes() { $sizes = array( 'thumbnail_size_w' => 120, 'thumbnail_size_h' => 120, 'medium_size_w' => 240, 'medium_size_h' => 240, 'large_size_w' => 640, 'large_size_h' => 640, ); foreach ( $sizes as $key => $val ) { update_option( $key, $val ); } } add_action( 'populate_options', 'my_default_image_sizes' );
※ wpmu_new_blogにフックし、初期データの保存後に update_blog_option でアップデートをかける方法もあります。
カテゴリー、リンク、記事、ウィジェットの初期データを変更する
これは、プラグイン内でwp_install_defaults関数を定義することで変更可能になります。
これは、初期データを保存する関数 wp_install_defaults が、function_existsによる分岐内部で定義されているため、先に関数定義を行うことで、デフォルト関数の読み込みを止めてしまえることによるものです。
とは言え、不用意な記述を行うと設定情報との不整合を起こしかねませんので、実装には十分注意してください。
一番安全なのは、まず wp-admin/includes/upgrade.phpに記述されているwp_install_defaults関数をまるごとコピーして、変更したい部分だけを書き換える方法です。
この方法で修正可能な初期データは
- カテゴリー
- リンクカテゴリー
- リンク
- 投稿
- コメント
- 固定ページ
- ウィジェット
になります。
ありがとうございました。大変参考になりました!
こちらのWPのフォーラム記事で、僕のやったことを書きましたです!
非常に助かりました。
もう少し進展させて、デフォルトで表示されるサンプルページに加えて、もう1ページ別に作るときの方法になります。
//ページをもう一つ作る
if ( is_multisite() )
$first_page = "";
$first_post_guid = get_option('home') . '/?page_id=3';
$wpdb->insert( $wpdb->posts, array(
'post_author' => $user_id,
'post_date' => $now,
'post_date_gmt' => $now_gmt,
'post_content' => $first_page,
'post_excerpt' => '',
'post_title' => __( 'ページのタイトル' ),
'post_name' => __( 'ページのスラッグ' ),
'post_modified' => $now,
'post_modified_gmt' => $now_gmt,
'guid' => $first_post_guid,
'post_type' => 'page',
'to_ping' => '',
'pinged' => '',
'post_content_filtered' => ''
));
$wpdb->insert( $wpdb->postmeta, array( 'post_id' => 3, 'meta_key' => '_wp_page_template', 'meta_value' => 'ページのテンプレート.php' ) );
すいません。上記の1行目、
if ( is_multisite() )
はいらなかったですね。