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 ) ?> |
<?php get_template_part( $slug, $name ) ?>
[編集] パラメータ
$slug
(文字列) (必須) 一般テンプレートのスラッグ名
初期値: なし
$name
(文字列) (オプション) 特定テンプレートの名前
初期値: なし
用例
[編集] 子テーマで loop.php を使用する
テーマフォルダが wp-content/themes で、親テーマが twentyten で、子テーマが twentytenchild の場合、この例はファイルを順に PHP require() します。
- wp-content/themes/twentytenchild/loop-index.php
- wp-content/themes/twentytenchild/loop.php
- wp-content/themes/twentyten/loop-index.php
- wp-content/themes/twentyten/loop.php
<?php get_template_part( 'loop', 'index' ); ?> |
<?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' );
?> |
<?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);
} |
// @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 );
} |
// @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_part
の do_action
のとこ。
do_action( "get_template_part_{$slug}", $slug, $name );
だと引数3つだけど・・・
plugin.php
function do_action($tag, $arg = '') |
function do_action($tag, $arg = '')
だから3つ目は無視されるよね。
どういうことなんでしょう?
あと、なんのための do_action
なのかなぁ。