WordPressのネットワークで、子ブログに複数の投稿やページを設定、作っておいたカテゴリやタグを紐付けておくためのプラグイン

概要

ネットワークのカスタマイズをしている中で、

  • 新しく登録される子ブログで、デフォルトで作成される記事やページをこちら側で決めておきたい(しかも複数)、
  • カテゴリやタグも作っておいて作成された記事やページと紐付けておきたい、

という方(いるのかな。。)のためのプラグインです。

管理画面は提供していないので、記事のタイトルやURL、カテゴリなどの名前はソースに書き込む必要があります。

作り

@jim0912さんによるWordPressのマルチサイト利用時に新規サイト作成時の設定・初期データを変更するを参考にして(ありがとうございます!)、ちょこちょこいじってみて出来上がっています。

wp_install_defaults($user_id)

という関数を定義しているだけなのですが、子ブログ生成時にwp-admin/includes/upgrade.phpの中で、wp_install_defaults関数が書かれてまして、if ( !function_exists(‘wp_install_defaults’) ) :と書かれていて、プラグインやfunctions.phpにこの関数がなければ、このファイル内に定義されたwp_install_defaultsが動きますということです。

なので、関数の名前を変えてはいけないです。
あと、できるだけコピペでやった方がいいとのことです。

僕がカスタマイズしたものは、リンクカテゴリー生成部分はどうせ使わないので消してしまいました。また、if ( is_multisite() )とかも消してます。

カスタマイズ

コメントで色々書かれているので、IDやURLやページテンプレート、紐付け関係を指定します。

ダウンロードとインストール

ちょっとテストしているのでお待ちください。

こちらからダウンロードして解凍して、プラグインフォルダに入れて、ネットワークで有効化です。

ソース

素人臭くて恥ずかしいですが、下記がプラグインのソースです。
もっと短くなると思うんですが、これで動いているので。。間違ってたら誰か教えて。。

教える人→@ShinichiNのツイッター。


/*
Plugin Name: Default Blog Posts and Taxonomies in WP Network Site
Plugin URI: http:nskw-style.com/
Description: マルチサイト、ネットワークの子ブログで、子ブログ生成時に作られる記事、ページ、カテゴリ、タグのデフォルト設定をする。
Version: 1.0
Author: Shinichi Nishikawa
Author URI:  <a href="http://nskw-style.com/" target="_blank" class="advmk">http://nskw-style.com/</a>
*/

function wp_install_defaults($user_id) {
	global $wpdb, $wp_rewrite, $current_site, $table_prefix;

	// デフォルトのカテゴリーを作る
	$cat_name = '日記';//カテゴリーの名前
	$cat_slug = 'diary';//カテゴリーのスラッグ
	$cat_id = 1;//設定したいカテゴリーのIDをここに数字で書く。
	$cat_description = '日記カテゴリーです。カテゴリーを指定しないで保存すると、このカテゴリになります。';
	$wpdb->insert( $wpdb->terms, array('term_id' => $cat_id, 'name' => $cat_name, 'slug' => $cat_slug, 'term_group' => 0) );
	$wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $cat_id, 'taxonomy' => 'category', 'description' => $cat_description, 'parent' => 0, 'count' => 2));//下の方で記事の作成をする際にこのカテゴリーにひもづけられる記事の数をcount欄で指定しとく。
	$cat_tt_id = $wpdb->insert_id;

	// デフォルトのタグを作る
	$my_tag_name = 'ワードプレス';//タグの名前
	$my_tag_slug = 'wordpress';//タグのスラッグ
	$my_tag_id = 2;//タグのID(1は上で使っているので、2にする)
	$my_tag_description = 'WordPressに関する記事です。';
	$wpdb->insert( $wpdb->terms, array('term_id' => $my_tag_id, 'name' => $my_tag_name, 'slug' => $my_tag_slug, 'term_group' => 0) );
	$wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $my_tag_id, 'taxonomy' => 'post_tag', 'description' => $my_tag_description, 'parent' => 0, 'count' => 1));

	// デフォルトのタグをもうひとつ作る
	$my_tag_name_2 = 'ムーバブルタイプ';
	$my_tag_slug_2 = 'mt';
	$my_tag_id_2 = 3;//ここも上で作ったカテゴリやタグのIDと被らないようにする
	$my_tag_description_2 = 'MovableTypeに関する記事です。';
	$wpdb->insert( $wpdb->terms, array('term_id' => $my_tag_id_2, 'name' => $my_tag_name_2, 'slug' => $my_tag_slug_2, 'term_group' => 0) );
	$wpdb->insert( $wpdb->term_taxonomy, array('term_id' => $my_tag_id_2, 'taxonomy' => 'post_tag', 'description' => $my_tag_description_2, 'parent' => 0, 'count' => 3));

	// 最初の投稿
	$now = date('Y-m-d H:i:s');
	$now_gmt = gmdate('Y-m-d H:i:s');
	$first_post_guid = get_option('home') . '/?p=1';//ここはp=1にしとく。

	$first_post = stripslashes( 'これは、<a href="SITE_URL">SITE_NAME</a>に書かれた最初の投稿です。投稿一覧から削除することができます。' );
	$first_post = str_replace( "SITE_URL", esc_url( network_home_url() ), $first_post );
	$first_post = str_replace( "SITE_NAME", $current_site->site_name, $first_post );

	$wpdb->insert( $wpdb->posts, array(
								'post_author' => $user_id,
								'post_date' => $now,
								'post_date_gmt' => $now_gmt,
								'post_content' => $first_post,
								'post_excerpt' => '',
								'post_title' => 'ようこそです!!',//ここにタイトル書き込む
								'post_name' => sanitize_title('hello!' ),//スラッグ指定
								'post_modified' => $now,
								'post_modified_gmt' => $now_gmt,
								'guid' => $first_post_guid,
								'comment_count' => 1,//コメントの数を入れとく
								'to_ping' => '',
								'pinged' => '',
								'post_content_filtered' => ''
								));
	$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => 1, 'object_id' => 1) );//ここで、term_taxonomy_idに上で定義したカテゴリやタグのIDを入れる。
	$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => 3, 'object_id' => 1) );//複数のカテゴリやタグに紐付け長ければ2行書く。ホントはもっといい書き方がある?

	// 2番目の投稿
	$now = date('Y-m-d H:i:s');
	$now_gmt = gmdate('Y-m-d H:i:s');
	$second_post_guid = get_option('home') . '/?p=2';//2にしてます。

	$second_post = stripslashes( 'これは、<a href="SITE_URL">SITE_NAME</a>に書かれた2番目の投稿です。<br />投稿一覧から削除することができます。' );
	$second_post = str_replace( "SITE_URL", esc_url( network_home_url() ), $second_post );
	$second_post = str_replace( "SITE_NAME", $current_site->site_name, $second_post );

	$wpdb->insert( $wpdb->posts, array(
								'post_author' => $user_id,
								'post_date' => $now,
								'post_date_gmt' => $now_gmt,
								'post_content' => $second_post,
								'post_excerpt' => '',
								'post_title' => '2番目の記事だよ。',
								'post_name' => sanitize_title('hello-again!' ),
								'post_modified' => $now,
								'post_modified_gmt' => $now_gmt,
								'guid' => $first_post_guid,
								'comment_count' => 0,
								'to_ping' => '',
								'pinged' => '',
								'post_content_filtered' => ''
								));
	$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => 1, 'object_id' => 2) );
	$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => 2, 'object_id' => 2) );

	//ページを作成する
	$first_page = "";//ページの本文ここに。
	$first_page_guid = get_option('home') . '/?page_id=3';//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' => sanitize_title('スラッグをここに' ),
								'post_modified' => $now,
								'post_modified_gmt' => $now_gmt,
								'guid' => $first_page_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' => 'xxx.php' ) );//meta_valueには、ページのテンプレートの名前です。
	$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => 3, 'object_id' => 3) );

	// たとえば掲示板ページ
	$board_page = "掲示板";
	$board_post_guid = get_option('home') . '/?page_id=4';
	$wpdb->insert( $wpdb->posts, array(
								'post_author' => $user_id,
								'post_date' => $now,
								'post_date_gmt' => $now_gmt,
								'post_content' => $board_page,
								'post_excerpt' => '',
								'post_title' => __( '掲示板' ),
								'post_name' => sanitize_title('スラッグをここに入れる' ),
								'post_modified' => $now,
								'post_modified_gmt' => $now_gmt,
								'guid' => $board_post_guid,
								'post_type' => 'page',
								'to_ping' => '',
								'pinged' => '',
								'post_content_filtered' => ''
								));
	$wpdb->insert( $wpdb->postmeta, array( 'post_id' => 4, 'meta_key' => '_wp_page_template', 'meta_value' => 'board.php' ) );//テンプレートを掲示板用に作ったり。。
	$wpdb->insert( $wpdb->term_relationships, array('term_taxonomy_id' => 3, 'object_id' => 4) );

	// この辺は、デフォルトのウィジェットを設定しているところです。まだ研究中なので、そのままになっています。
	update_option( 'widget_search', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );
	update_option( 'widget_recent-posts', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );
	update_option( 'widget_recent-comments', array ( 2 => array ( 'title' => '', 'number' => 5 ), '_multiwidget' => 1 ) );
	update_option( 'widget_archives', array ( 2 => array ( 'title' => '', 'count' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );
	update_option( 'widget_categories', array ( 2 => array ( 'title' => '', 'count' => 0, 'hierarchical' => 0, 'dropdown' => 0 ), '_multiwidget' => 1 ) );
	update_option( 'widget_meta', array ( 2 => array ( 'title' => '' ), '_multiwidget' => 1 ) );
	update_option( 'sidebars_widgets', array ( 'wp_inactive_widgets' => array ( ), 'primary-widget-area' => array ( 0 => 'search-2', 1 => 'recent-posts-2', 2 => 'recent-comments-2', 3 => 'archives-2', 4 => 'categories-2', 5 => 'meta-2', ), 'secondary-widget-area' => array ( ), 'first-footer-widget-area' => array ( ), 'second-footer-widget-area' => array ( ), 'third-footer-widget-area' => array ( ), 'fourth-footer-widget-area' => array ( ), 'array_version' => 3 ) );

	if ( is_multisite() ) {
		// Flush rules to pick up the new page.
		$wp_rewrite->init();
		$wp_rewrite->flush_rules();

		$user = new WP_User($user_id);
		$wpdb->update( $wpdb->options, array('option_value' => $user->user_email), array('option_name' => 'admin_email') );

		// Remove all perms except for the login user.
		$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'user_level') );
		$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id != %d AND meta_key = %s", $user_id, $table_prefix.'capabilities') );

		// Delete any caps that snuck into the previously active blog. (Hardcoded to blog 1 for now.) TODO: Get previous_blog_id.
		if ( !is_super_admin( $user_id ) && $user_id != 1 )
			$wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $wpdb->base_prefix.'1_capabilities') );
	}
}

↓ プラグインを作る方々への本、書きました。 ↓

“WordPressのネットワークで、子ブログに複数の投稿やページを設定、作っておいたカテゴリやタグを紐付けておくためのプラグイン” への 1 件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です