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() します。
- 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' ); ?>
用例を見ると、関数 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_part
の do_action
のとこ。
do_action( "get_template_part_{$slug}", $slug, $name );
だと引数3つだけど・・・
plugin.php
function do_action($tag, $arg = '') |
だから3つ目は無視されるよね。
どういうことなんでしょう?
あと、なんのための do_action
なのかなぁ。