WordPress 3.0のTwenty Tenのループ出力, loop.phpとget_template_part

Twenty Tenのループ出力は loop.php に集約されて書かれていて、loop.php を呼び出す部分は 3.0 から登場した関数 get_template_part が使われています。

関数リファレンス/get template part
Function Reference/get template part

使い方

<?php get_template_part( $slug, $name ) ?>

[編集] パラメータ
$slug
(文字列) (必須) 一般テンプレートのスラッグ名
初期値: なし
$name
(文字列) (オプション) 特定テンプレートの名前
初期値: なし

用例

[編集] 子テーマで loop.php を使用する
テーマフォルダが wp-content/themes で、親テーマが twentyten で、子テーマが twentytenchild の場合、この例はファイルを順に PHP require() します。

  1. wp-content/themes/twentytenchild/loop-index.php
  2. wp-content/themes/twentytenchild/loop.php
  3. wp-content/themes/twentyten/loop-index.php
  4. wp-content/themes/twentyten/loop.php
<?php get_template_part( 'loop', 'index' ); ?>

用例を見ると、関数 get_template_part は今まで include, require としていた部分を置き換えてくれるようです。

index.php には以下のように書かれています。

<?php
/* Run the loop to output the posts.
 * If you want to overload this in a child theme then include a file
 * called loop-index.php and that will be used instead.
 */
 get_template_part( 'loop', 'index' );
?>

子テーマでカスタマイズしたいときは、loop-index.php を子テーマに作れば良いってことになります。
これってかなり便利そうな気がする。

これからはテーマで include, require が書いてあるとイケテないってことになりますね。

get_template_part は関数 locate_template を使い最後は関数 load_template でロードすべきファイルを require_once します。

general-template.php

// @since 3.0.0
function get_template_part( $slug, $name = null ) {
	do_action( "get_template_part_{$slug}", $slug, $name );
 
	$templates = array();
	if ( isset($name) )
		$templates[] = "{$slug}-{$name}.php";
 
	$templates[] = "{$slug}.php";
 
	locate_template($templates, true, false);
}

theme.php

// @since 2.7.0
function locate_template($template_names, $load = false, $require_once = true ) {
	if ( !is_array($template_names) )
		return '';
 
	$located = '';
	foreach ( $template_names as $template_name ) {
		if ( !$template_name )
			continue;
		if ( file_exists(STYLESHEETPATH . '/' . $template_name)) {
			$located = STYLESHEETPATH . '/' . $template_name;
			break;
		} else if ( file_exists(TEMPLATEPATH . '/' . $template_name) ) {
			$located = TEMPLATEPATH . '/' . $template_name;
			break;
		}
	}
 
	if ( $load && '' != $located )
		load_template( $located, $require_once );
 
	return $located;
}
 
// @since 1.5.0
function load_template( $_template_file, $require_once = true ) {
	global $posts, $post, $wp_did_header, $wp_did_template_redirect, $wp_query, $wp_rewrite, $wpdb, $wp_version, $wp, $id, $comment, $user_ID;
 
	if ( is_array( $wp_query->query_vars ) )
		extract( $wp_query->query_vars, EXTR_SKIP );
 
	if ( $require_once )
		require_once( $_template_file );
	else
		require( $_template_file );
}

よくわかんないのは get_template_partdo_action のとこ。
do_action( "get_template_part_{$slug}", $slug, $name ); だと引数3つだけど・・・

plugin.php

function do_action($tag, $arg = '')

だから3つ目は無視されるよね。
どういうことなんでしょう?
あと、なんのための do_action なのかなぁ。

WordPress 3.0, 子テーマのURLとパス

子テーマを使うとTEMPLATEPATH, get_bloginfo("template_url") は 親テーマのパス, URL を返します。

子テーマのURL, パスを知る方法はないものかとガサゴソしたら使えそうなのが見つかりました。

URL

get_stylesheet_directory_uri();

PATH

STYLESHEETPATH

get_stylesheet_directory_uri(); は使用しているテーマまでのURLを返してくれます。

STYLESHEETPATH は使用しているテーマまでのフルパスが設定されている定数です。

これを使うと子テーマまでのURL, パスがわかります。

update 2010-08-04
general-template.phpget_bloginfo を見ると子テーマの URL は取得できるようです。

// get_stylesheet_directory_uri(); と同じ
get_bloginfo('stylesheet_directory');

update 2010-08-11
子テーマのパスを知りたかったのは include, require したいからだったけど、get_template_part を使えば必要ないことがわかった。
WordPress 3.0のTwenty Tenのループ出力, loop.phpとget_template_part

update 2011-01-31
あれ〜。
TEMPLATEPATH が子テーマのパスを返してる。。
変わったんかなぁ?
Ver. 3.0.4 のお話。

get_bloginfo('template_url')

コアが変更になったんだ。
不便だもんね。