私は開発者がget_tempalate_part()を多用したテーマを持っています、そしてこれらの部分はテーマのサブディレクトリだけでなくテーマを支援するために作られたプラグインのディレクトリに散らばっています。
これは、呼び出されているプライマリテンプレートを理解するために使用しているコードです(より良い単語がないため、親テンプレート)。
add_action('wp_head', 'show_template');
function show_template() {
global $template;
print_r($template);
}
show_template();
これはうまく機能しますが、親テンプレートファイルの場所のみが表示されます。テンプレート部分から何がどこで呼び出されているのかを調べるために使用できるコードは何ですか?
Footer.phpの後半でこの行を使用してください。
echo '<ul><li>'.implode('</li><li>', str_replace(str_replace('\\', '/', ABSPATH).'wp-content/', '', array_slice(str_replace('\\', '/', get_included_files()), (array_search(str_replace('\\', '/', ABSPATH).'wp-includes/template-loader.php', str_replace('\\', '/', get_included_files())) + 1)))).'</li></ul>';
に書かれて:
どのテンプレートページが現在のページを処理しているかをどのように確認しますか。
admin-bar stuff
パスが一番上、または他のファイルに表示されている場合は、このコード行のファイル名template-loader.php
を:に変更する必要があるファイル名に変更します。
管理バーでこれが必要な場合は、 正しい優先権を使用してください (最も早い) このリストの最後にファイルが入力されていないことを確認する 。例えば:
add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);
priority -5
は最初にロードすることを保証します。重要なのは、この行を適切なタイミングでレンダリングすることです。
サーバーがスラッシュを使用している場合は、いくつか変更を加えます。
get_template_part($slug)
を使用してテンプレート部分を表示できます。これは、WordPressの内部に隠されている宝石の1つであり、注目に値するものではありません。 get_template_part
関数は基本的にステロイドのPHPincludeまたはrequireです。
それはすでにあなたのテーマがどこにあるかを知っていて、それはそのテーマのディレクトリの中で要求されたファイルを探すでしょう
要求されたファイルが存在しない場合でも警告や致命的な警告は表示されません。
要求されたファイルが見つからない場合は、他の適切なファイルを検索できます。
それは子供のテーマと親のテーマについて知っています
手短に言うと、get_template_part関数を使用すると、テーマをより小さなテンプレート(またはテンプレート部分)に分割して、他のテンプレートで再利用できます。
例えば:
get_template_part( 'navigation', get_post_type() );
get_post_type()
は現在表示されている投稿タイプの名前を返します。そのため、投稿の場合は、navigation-post.phpをロードしてnavigation.phpにフォールバックしようとします。ページにいる場合は、navigation-page.phpとnavigation.php。カスタムの投稿タイプを見ている場合、Bookと言っても、navigation-book.phpが検索され、navigation.phpに戻ります。
Get_template_partの本当の力は、locate_template
と呼ばれる関数から来ています。これは、親テーマと子テーマのフォルダ内での検索全体と、スタック内の他のテンプレートへの復帰を行います。 get_template_part
関数は、検索するlocate_template
のテンプレートの配列を単純に構築します。これが簡単な例です。
get_template_part( 'one', 'two' );
“ one-two.php”と“ one.php”の配列を(この特定の順序で)作成し、それをlocate_template
に渡します。次に、それがその配列をループ処理して、子テーマディレクトリと親テーマディレクトリのファイルを探します。ここでの順序は非常に重要です。ファイル名が場所(親テーマまたは子テーマ)よりも優先されるのはこのような理由によるもので、検索シーケンスの背後にある理由を説明しています。
get_header
、get_sidebar
、get_footer
などの関数は、ハードコードされた最初の引数を持つget_template_part
に非常に似ていることにも注目に値します。
get_template_part
はwp-includes/general-template.phpにあり、locate_template
はwp-includes/template.phpにあります。
get_tempalate_part()
関数のコードを見れば、get_template_part_{$slug}"
アクションにフックできることがわかります。変数$slug
は不明なので、テンプレートファイル自体から変数を取得する必要があります。
次の例では、現在のページに使用されているテーマテンプレートファイルを template_include フィルタで取得します。次に、 トークナイザー を使用して、ファイル内のget_template_part()
関数から$ slugを検索します。スラグがわかっているので、テンプレートパスを取得するためにget_template_part_{$slug}
アクションが使用されます。テンプレートのパスは、テーマのフッターに印刷されています。
注:テーマテンプレートファイル内のget_template_part()
で使用されるスラッグは文字列である必要があります。テーマが関数に変数を追加する別の方法(変数、定数など)を使用している場合、スラッグ(したがってパス)は見つかりません。この例を本番では使用しないでください。
Display_Get_Template_Part_Path_In_Footer::on_load();
class Display_Get_Template_Part_Path_In_Footer {
static $templates = array();
public static function on_load() {
add_filter( 'template_include', array( __CLASS__, 'read_theme_template' ), 99 );
add_action( 'wp_footer', array( __CLASS__, 'wp_footer' ), 100 );
}
public static function wp_footer() {
// print templates in footer
if ( !empty( self::$templates ) ) {
echo '<pre>';
print_r( array_unique( self::$templates ) );
echo '</pre>';
} else {
echo "<p>no get_template_part() found</p>";
}
}
public static function read_theme_template( $template ) {
$tokens = token_get_all( file_get_contents( $template ) );
foreach ( $tokens as $index => $token ) {
$name = is_array( $token ) ? token_name( $token[0] ): '';
$value = is_array( $token ) ? $token[1] : $token;
if ( !( ( 'T_STRING' === $name ) && ( 'get_template_part' === $value ) ) ) {
continue;
}
// function name 'get_template_part' found, get next tokens
$next = isset( $tokens[ $index + 1 ] ) ? $tokens[ $index + 1 ] : '';
$next_id = isset( $tokens[ $index + 1 ][0] ) ? $tokens[ $index + 1 ][0] : '';
$second_next = isset( $tokens[ $index + 2 ] ) ? $tokens[ $index + 2 ] : '';
if ( '(' === $next || ( T_WHITESPACE === $next_id ) && ( '(' === $second_next ) ) {
$slug = self::get_template_slug( $tokens, $index+1 );
if ( !empty( $slug ) ) {
add_action( "get_template_part_{$slug}", array( __CLASS__, 'get_template_part' ), 15, 2 );
}
}
}
return $template;
}
// get's first T_CONSTANT_ENCAPSED_STRING ($slug argument)
public static function get_template_slug( $tokens, $index ) {
$slug = '';
$brackets = 0;
$function_tokens = array_slice( $tokens, $index );
foreach ( $function_tokens as $key => $token ) {
$name = isset( $token[0] ) ? token_name( $token[0] ) : '';
if ( $token === '(' ) {
++$brackets;
continue;
}
if ( $brackets === 0 ) {
continue;
}
if ( ( ( $token === ')' ) && ( --$brackets === 0 ) ) || ( ',' === $token ) ) {
break;
}
if ( ( 'T_CONSTANT_ENCAPSED_STRING' === $name ) ) {
$slug = sanitize_title( $token[1] );
break;
}
}
return $slug;
}
// function copied from WP Core (returns template path)
public static function get_template_part( $slug, $name = null ) {
$templates = array();
$name = (string) $name;
if ( '' !== $name )
$templates[] = "{$slug}-{$name}.php";
$templates[] = "{$slug}.php";
// get template without loading the file
self::$templates[] = locate_template( $templates, false, false );
}
}
簡単な方法は各テンプレートファイルにエコーを追加することです。 <!--folder/filename.php-->
のように
それをifで囲むのがベストです。デバッグ中にのみ表示されます。