Posts tagged カスタマイズ

僕がWordPressを始めた頃に分かんなかったベーシックなところを分かりやすく説明する試み

2011年11月11日、ネスト赤羽というインキュベーション施設の一室で、WordPressについてお話させて頂きました。(勉強会サイトのレポート

試みの中身

タイトルは「テンプレートタグの使い方」的なものですが、メインにお伝えしようとしたのは、

  • WordPressって、どうやって動いてるの?
  • phpとhtmlの関係ってどうなってるの?
  • データベースの役割って?
  • サーバってそもそもなんなのさ

といった内容です。

Continue reading 僕がWordPressを始めた頃に分かんなかったベーシックなところを分かりやすく説明する試み

ネットワークで子ブログに直接会員登録するプラグイン(ウィジェット付き)

概要

WordPressのネットワーク(マルチサイト)インストール時に、子ブログから「登録ボタン」を押すと、親ブログの登録画面に飛ばされてしまい、そのまま登録処理をすると、親ブログに登録されてしまい、子ブログには登録されません。

これでは不便なので、プラグインを作りました。

プラグインをインストールすると、子ブログへの直接登録をするためのリンクを出力するウィジェットが設置できるようになります。

ニッチなので、あんまり需要があるかどうか。。。メモということで。

ご質問・ご指摘などは、@shinichiNまでお願いします。

m(_ _)m

Continue reading ネットワークで子ブログに直接会員登録するプラグイン(ウィジェット付き)

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-&gt;insert( $wpdb-&gt;terms, array('term_id' =&gt; $cat_id, 'name' =&gt; $cat_name, 'slug' =&gt; $cat_slug, 'term_group' =&gt; 0) );
	$wpdb-&gt;insert( $wpdb-&gt;term_taxonomy, array('term_id' =&gt; $cat_id, 'taxonomy' =&gt; 'category', 'description' =&gt; $cat_description, 'parent' =&gt; 0, 'count' =&gt; 2));//下の方で記事の作成をする際にこのカテゴリーにひもづけられる記事の数をcount欄で指定しとく。
	$cat_tt_id = $wpdb-&gt;insert_id;

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

	// デフォルトのタグをもうひとつ作る
	$my_tag_name_2 = 'ムーバブルタイプ';
	$my_tag_slug_2 = 'mt';
	$my_tag_id_2 = 3;//ここも上で作ったカテゴリやタグのIDと被らないようにする
	$my_tag_description_2 = 'MovableTypeに関する記事です。';
	$wpdb-&gt;insert( $wpdb-&gt;terms, array('term_id' =&gt; $my_tag_id_2, 'name' =&gt; $my_tag_name_2, 'slug' =&gt; $my_tag_slug_2, 'term_group' =&gt; 0) );
	$wpdb-&gt;insert( $wpdb-&gt;term_taxonomy, array('term_id' =&gt; $my_tag_id_2, 'taxonomy' =&gt; 'post_tag', 'description' =&gt; $my_tag_description_2, 'parent' =&gt; 0, 'count' =&gt; 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( 'これは、&lt;a href=&quot;SITE_URL&quot;&gt;SITE_NAME&lt;/a&gt;に書かれた最初の投稿です。投稿一覧から削除することができます。' );
	$first_post = str_replace( &quot;SITE_URL&quot;, esc_url( network_home_url() ), $first_post );
	$first_post = str_replace( &quot;SITE_NAME&quot;, $current_site-&gt;site_name, $first_post );

	$wpdb-&gt;insert( $wpdb-&gt;posts, array(
								'post_author' =&gt; $user_id,
								'post_date' =&gt; $now,
								'post_date_gmt' =&gt; $now_gmt,
								'post_content' =&gt; $first_post,
								'post_excerpt' =&gt; '',
								'post_title' =&gt; 'ようこそです!!',//ここにタイトル書き込む
								'post_name' =&gt; sanitize_title('hello!' ),//スラッグ指定
								'post_modified' =&gt; $now,
								'post_modified_gmt' =&gt; $now_gmt,
								'guid' =&gt; $first_post_guid,
								'comment_count' =&gt; 1,//コメントの数を入れとく
								'to_ping' =&gt; '',
								'pinged' =&gt; '',
								'post_content_filtered' =&gt; ''
								));
	$wpdb-&gt;insert( $wpdb-&gt;term_relationships, array('term_taxonomy_id' =&gt; 1, 'object_id' =&gt; 1) );//ここで、term_taxonomy_idに上で定義したカテゴリやタグのIDを入れる。
	$wpdb-&gt;insert( $wpdb-&gt;term_relationships, array('term_taxonomy_id' =&gt; 3, 'object_id' =&gt; 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( 'これは、&lt;a href=&quot;SITE_URL&quot;&gt;SITE_NAME&lt;/a&gt;に書かれた2番目の投稿です。&lt;br /&gt;投稿一覧から削除することができます。' );
	$second_post = str_replace( &quot;SITE_URL&quot;, esc_url( network_home_url() ), $second_post );
	$second_post = str_replace( &quot;SITE_NAME&quot;, $current_site-&gt;site_name, $second_post );

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

	//ページを作成する
	$first_page = &quot;&quot;;//ページの本文ここに。
	$first_page_guid = get_option('home') . '/?page_id=3';//3にしてるよ
	$wpdb-&gt;insert( $wpdb-&gt;posts, array(
								'post_author' =&gt; $user_id,
								'post_date' =&gt; $now,
								'post_date_gmt' =&gt; $now_gmt,
								'post_content' =&gt; $first_page,
								'post_excerpt' =&gt; '',
								'post_title' =&gt; 'タイトルいれとく',
								'post_name' =&gt; sanitize_title('スラッグをここに' ),
								'post_modified' =&gt; $now,
								'post_modified_gmt' =&gt; $now_gmt,
								'guid' =&gt; $first_page_guid,
								'post_type' =&gt; 'page',//ここがページになってる
								'to_ping' =&gt; '',
								'pinged' =&gt; '',
								'post_content_filtered' =&gt; ''
								));
	$wpdb-&gt;insert( $wpdb-&gt;postmeta, array( 'post_id' =&gt; 3, 'meta_key' =&gt; '_wp_page_template', 'meta_value' =&gt; 'xxx.php' ) );//meta_valueには、ページのテンプレートの名前です。
	$wpdb-&gt;insert( $wpdb-&gt;term_relationships, array('term_taxonomy_id' =&gt; 3, 'object_id' =&gt; 3) );

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

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

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

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

		// Remove all perms except for the login user.
		$wpdb-&gt;query( $wpdb-&gt;prepare(&quot;DELETE FROM $wpdb-&gt;usermeta WHERE user_id != %d AND meta_key = %s&quot;, $user_id, $table_prefix.'user_level') );
		$wpdb-&gt;query( $wpdb-&gt;prepare(&quot;DELETE FROM $wpdb-&gt;usermeta WHERE user_id != %d AND meta_key = %s&quot;, $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 ) &amp;&amp; $user_id != 1 )
			$wpdb-&gt;query( $wpdb-&gt;prepare(&quot;DELETE FROM $wpdb-&gt;usermeta WHERE user_id = %d AND meta_key = %s&quot;, $user_id, $wpdb-&gt;base_prefix.'1_capabilities') );
	}
}

プラグインの作り方資料

道具

WordPressのプラグインを作成するためのテンプレートファイル

プラグインの研究:Absolute Privacyを読んでみる4:プラグインはなぜ動くのか

前回は、フォームを見て、どんな画面に対する処理なのかを把握しましたが、次は、定義されたプラグインがどのように実行されるのかを見ます。

どのプラグインでも共通の方法があると思われます。

調べた過程を書いていきます。

プラグインを有効にする

if (isset($absolutePrivacy)) {
	register_activation_hook(__FILE__, array(&$absolutePrivacy, 'createRole')); //adds role on activation
	register_deactivation_hook(__FILE__, array(&$absolutePrivacy, 'destroyRole')); //removes role on deactivation

プラグイン有効化時に実行される関数の登録

関数リファレンス/register activation hookによれば、

関数register_activation_hook(WordPress2.0より導入)はプラグインが有効化されたときに実行される関数を登録します。

とあります。

register_activation_hookの使い方

使用方法として、

<?php register_activation_hook($file, $function); ?>

とあり、
$fileにはプラグインのフルパス、
$functionにはプラグインが有効化されたときに実行される関数、を入れます。

Absolute Privacyでは、

register_activation_hook(__FILE__, array(&$absolutePrivacy, 'createRole'));

とあるので、このファイルへのフルパス(__FILE__)にあるcreateRole関数を実行します。

createRole()の定義は後々見ていきます。

プラグインフックについて

次に、add_action()やadd_filter()、do_action()、apply_filters()って何?について理解したい。

Absolute Privacy内で使われているところ

	if( isset($_GET['action']) && ($_GET['action'] == 'register') ) add_action( 'login_head', array(&$absolutePrivacy, 'regCSS')); //adds registration form CSS
	add_action( 'register_form', array(&$absolutePrivacy, 'registrationBox'));	//adds password field to registration box
	add_filter( 'registration_errors', array(&$absolutePrivacy, 'checkRegErrors')); //adds registration form error checks
	add_action('user_register', array(&$absolutePrivacy, 'addNewUser')); //adds registration info to database

	add_action('admin_menu', array(&$absolutePrivacy, 'installOptionsMenu')); //install the options menu
	add_action('admin_menu', array(&$absolutePrivacy, 'moderateMenu'));
	add_action('template_redirect', array(&$absolutePrivacy, 'lockDown'));
	add_filter('the_content', array(&$absolutePrivacy, 'check_is_feed'));
	add_action('init', array(&$absolutePrivacy, 'adminLockDown'), 0);
	add_action('login_head', 'rsd_link');

add_action()とadd_fliterがあります。

コーデックス


CODEXのプラグインの作成> WordPress プラグイン・フック
を見ると、

多くのプラグインが、WordPress 用プラグインフックと1つ以上接続することで、目的を果たしています。プラグインフックが動く方法は、WordPress が走る間のさまざまなタイミングで、いずれかのプラグインがその時点で走る関数を登録していないかを WordPress が確認し、もしあればその関数を走らせることによります。これらの関数は、WordPress のデフォルトの振舞いを変更します。

とあります。

図表

WordPress プラグイン作成前の基礎知識のページに、こんな図がありました。

add_action()とadd_fliter()は両方ともプラグインの実行

コーデックスの該当部分を見ると、

add_action ( 'hook_name', 'your_function_name', [priority], [accepted_args] );

とあり、

hook_name
WordPress によって提供されているアクションフックの名称で、関数がどのイベントと関連するのかを示す。WP自体に埋め込まれた、ここのタイミングだよのサイン。
your_function_name
hook_name で設定されたイベントに続いて実行させたい関数の名前。標準の PHP 関数、WordPress コアに含まれる関数、プラグインファイルで定義した関数が使える。
priority
特定のアクションに関連した関数の実行時の順番を指定。数字を入れます。
accepted_args
関数が取ることのできる引数の数を定義

なので、どこで(hook_name)、何を(your_function_name)を実行するということになります。

Absolute Privacyの

add_action( 'register_form', array(&$absolutePrivacy, 'registrationBox'));

では、WPの処理中のdo_action(‘register_form’);が書きこまれた箇所で、array(&$absolutePrivacy, ‘registrationBox’)の処理を付け加える感じです。関数に配列が指定されているのが謎ですが、そういう風に定義しているのでしょう。あとで見ます。

ちなみに、do_action(‘register_form’);は、wp-login.phpの476行目にありました。
この記事の、case ‘register’ :のとき、つまりWordPressへのユーザ登録アクションの際に、実行されます。
普通だと、ユーザ登録時のパスワードは、WPが自動生成してユーザにメールをしますが、そこを書き換えるしょりです。

というわけで、次回以降、プラグインの本体である実際に実行される関数の定義を見ていきます。