WordPressのtracにチケットを切ったら、速攻修正されておののいた話

WordPressの3.4も今月中にはリリースされそうな感じですね。
表だっての変化は、テーマのプレビューあたりが大きく変わるくらいですが、内部的には、管理画面と表示時の翻訳ファイルの分化や、インストール前段階での翻訳ファイルの読み込みやら、テーマ部分のclass化やら、クエリーの改善やらいろいろと変わっています。
ここらへんの細かい点については、おでこんが、「新作スクープ!! WordPress 3.4 Extended Version」で紹介してもらっているので、そちらをご覧ください。(Twenty Twelveは3.5?へ先延ばしになっちゃいました。。)

今回は何かというと、WordPressのtracに修正要望のチケットを切った際のお話。tracとは、バグや開発管理をするためのプロジェクト管理ツールの名称で、WordPressのバグ報告や機能の要望受付と管理は全てtrac上で行われています。日本では、Backlogと同じものと言った方がわかりやすいかもしれませんね。

で、3.4からは、テーマのカスタムヘッダーを有効にする add_custom_image_header とカスタム背景を有効にする add_custom_background が非推奨になる予定(テーマ開発者のみなさん、ここ重要よ)で、双方とも add_theme_support を使用するようになっています。(使用法については、3.4同梱のTwenty Ten, Twenty Elevenを参考に。)
これは、機能ごとにあれこれ関数を用意するより、テーマ関連のものであれば、add_theme_support にまとめてしまった方が、覚える方も楽だし、開発する方もメンテナンスが楽ということでうなずける話ですね。

そして、add_theme_support を用いてカスタムヘッダーを有効にする際、admin-head-callback パラメーターの初期値だとWarningエラーが発生しちゃうので、初期値を変更した方がいいと思うっていうのが、今回のチケットの趣旨。

tracのチケット作成は上記のようなフォームになっていて、概要(タイトル)、詳細、タイプ(バグ、強化、機能要望、タスクからの選択)、発生バージョン、キーワード、コンポーネントなどを入力するようになっています。また、修正例としてパッチファイルを添付することもできるようになっています。パッチは、WinMergeなどのコード比較ツールで作成するのが便利ですね。
毎度の事ながら、英語はダメダメなので、日本語でチケットの内容を作成し、英訳はお寿s快く引き受けてくれたおでこんにお願い。昼にお願いしたら、早速、その日の夜にはスマートな英訳を返してくれました。カコイイ!

そして、早速チケット作成したのですが、作成して5分も経たないうちに、コア開発メンバーのnacinさんがマイルストーンを3.4に変更してくれ、ロシアでプラグイン開発をされている Sergey Biryukov さんが、wiki記法で間違っていた箇所を訂正してもらい。さらに、自分が考えた方法とは全く異なる方法にて nacin があっという間に対策を盛り込んでもらいめでたく完了となったのでした。(どれだけコード把握してるのやら・・・)
この間、チケット切ってから15分以内。

WordPressのコミュニティーの活発さと開発の早さ・有能さを身にしみて感じたのでした。すげー。

「こんな機能があったらいいのに」「ここにフック作ってほしいんだけど」「ここの挙動おかしくない?」などがあったら、チケット作成してみましょう。自分のお願いしたものが取り込まれるのは、それなりに気持ちいいですよ。

[2012.05.18 追記]
すぐさま解決。かと思いきや、一旦コミットしたコードだとTwenty Tenや、旧来のテーマでプレビューが出来ず、利用できなくなってしまう状況になってしまい、nacin自身がBad logicとして取り消し、再度神速で修正するという顛末がありました。ちなみに現時点の3.4がベータ4が最新ですが、この途中段階での修正が含まれていてテーマによってはプレビューと切り替えができなくなります。

WordPressのbody_classに固定ページのルートのスラッグを追加する

body_classで出力されるclassに最上位のルートのページのスラッグを含むclass名が追加されるようになります。子ページ全部で同じcssを利用できるので、特定のツリーだけ配色を変更したいときなど便利にですよね。さらに、汎用化しているので固定ページだけじゃなくて、階層サポートしたのカスタム投稿タイプでも利用できます。

class名は、{投稿タイプスラッグ}-category-{ページのスラッグ}という命名規則にしてますが、このあたりはお好みで。

 $post_type . '-category-' . $post->post_name

の部分を変えてくださいな。

function add_page_root_body_class( $classes ) {
	if ( is_singular() ) {
		$post_type = get_query_var( 'post_type' );
		if ( is_page() ) {
			$post_type = 'page';
		}
		if ( $post_type && is_post_type_hierarchical( $post_type ) ) {
			global $post;
			if ( $post->ancestors ) {
				$root = $post->ancestors[count($post->ancestors) - 1];
				$root_post = get_post( $root );
				$classes[] = esc_attr( $post_type . '-category-' . $root_post->post_name );
			} else {
				$classes[] = esc_attr( $post_type . '-category-' . $post->post_name );
			}
		}
	}
	return $classes;
}
add_filter( 'body_class', 'add_page_root_body_class' );

CSS Nite in Seoul, Vol.3にて登壇してきます

ご存じの方も多いかとは思いますが、2012年3月24日に行われるCSS Nite in Seoul, Vol.3にて、WordPressについてのスピーチをしてきます。

韓国でのWordPressの状況について詳しいところまでは分かりませんが、WordPress Koreanフォーラムの状況のサイトなどを見る限り、日本ほどの普及には至っていないように思われます。このあたりは、ローカライズの状況にも左右されるので、改めて日本語化チームのみなさんに感謝しなければいけませんね。ただ、韓国でも2010年に最初のWordCampが行われ、今年の5月を目標に第2回を計画しているようなので、是非がんばってほしいところです。

今回、韓国で話してくる内容ですが、上記のような普及状況が予想されること、CSS NiteというWeb制作者の集う場所でもあることから、WordPress の概要から、カスタム投稿タイプの利用シーンまで幅広く紹介してくることにしました。

韓国でのWordPressの普及に少しでも貢献できればいいと思います。

ちなみに韓国は、初めてでよく分からないのですが、とりあえずおいしいものが食べてこられれば満足です。

WordPressでユーザーを投稿の新しい順に並べ、○件ずつ投稿を表示する

functions.php

function sorted_author_posts( $authors, $posts_num ) {
	$all_posts = array();
	$sort_date = array();
	$posts_num = (int)$posts_num;
	foreach ( (array)$authors as $author ) {
		$author = (int)$author;
		$author_data = get_userdata( $author );
		$author_posts = get_posts( "posts_per_page=$posts_num&author=$author" );
		if ( $author_posts ) {
			$all_posts[$author_data->display_name] = $author_posts;
			$sort_date[$author_data->display_name] = $author_posts[0]->post_date;
		}
	}

	array_multisort( $sort_date, $all_posts );
	$all_posts = array_reverse( $all_posts );
	return $all_posts;
}

テンプレートの記述例

<?php $users = array( 1, 2 );
$users_posts = sorted_author_posts( $users, 2 );
foreach ( $users_posts as $user_name => $user_posts ) : ?>
	<h2><?php echo $user_name ?></h2>
	<ul>
<?php foreach ( $user_posts as $post ) : setup_postdata( $post ); ?>
		<li><?php the_title(); ?></li>
<?php endforeach; ?>
	</ul>
<?php endforeach; wp_reset_postdata(); ?>

WordPressでユーザーの最新投稿日を取得する

functions.php

function get_author_latest_update( $author_id, $date_format = null ) {
	$latest_post = get_posts( 'posts_per_page=1&author=' . (int)$author_id );
	$update_date = '';
	if ( $latest_post ) {
		$format = is_null( $date_format ) ? get_option( 'date_format' ) : $date_format;
		$update_date = mysql2date( $format, $latest_post[0]->post_date );
	}
	return $update_date;
}

テンプレートファイル

<?php echo get_author_latest_update( 1 ); ?>

表示はこうなる

2012年2月28日