web-dev-qa-db-ja.com

表示可能ページをレンダリングするためにどのテンプレートパーツが呼び出されているのかを確認するにはどうすればよいですか。

私は開発者がget_tempalate_part()を多用したテーマを持っています、そしてこれらの部分はテーマのサブディレクトリだけでなくテーマを支援するために作られたプラグインのディレクトリに散らばっています。

これは、呼び出されているプラ​​イマリテンプレートを理解するために使用しているコードです(より良い単語がないため、親テンプレート)。

add_action('wp_head', 'show_template');
function show_template() {
    global $template;
    print_r($template);
}

show_template();

これはうまく機能しますが、親テンプレートファイルの場所のみが表示されます。テンプレート部分から何がどこで呼び出されているのかを調べるために使用できるコードは何ですか?

1
user658182

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は最初にロードすることを保証します。重要なのは、この行を適切なタイミングでレンダリングすることです。

サーバーがスラッシュを使用している場合は、いくつか変更を加えます。

さらに詳しく: どのテンプレートページが現在のページを処理しているかをどのように確認できますか。

1
Jonas Lundman

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_headerget_sidebarget_footerなどの関数は、ハードコードされた最初の引数を持つget_template_partに非常に似ていることにも注目に値します。

get_template_partはwp-includes/general-template.phpにあり、locate_templateはwp-includes/template.phpにあります。

1
TBI Infotech

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 );
    }

}
0
keesiemeijer

簡単な方法は各テンプレートファイルにエコーを追加することです。 <!--folder/filename.php-->のように

それをifで囲むのがベストです。デバッグ中にのみ表示されます。

0
Christoph Daum