web-dev-qa-db-ja.com

Get_template_part()の結果を上書きすることは可能ですか?

私は子のテーマに取り組んでいます、子のテーマの単純さを維持し、時間の経過とともにコードとメンテナンスの量を最小限にするためにメインテンプレートファイルを上書きしないことを強く望みます。

ループ内で、親テーマのindex.phpテンプレートは次のものを使用します。get_template_part( 'content' );

これは content.php をもたらすでしょう、 content-aside.php などの異なるテンプレートを取り込むために、get_template_part( 'content', get_post_format() );のような振る舞いをするようにしています。単一行の変更で親を上書きするために、子テーマに index.php を作成しないでください。

get_template_part()は以下で構成されています。

function get_template_part( $slug, $name = null ) {

    do_action( "get_template_part_{$slug}", $slug, $name );
    $templates = array();
    $name = (string) $name;
    if ( '' !== $name )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";
    locate_template($templates, true, false);
}

私の場合はget_template_part_contentというアクションがあります。

次のようにしてアクションにフックできます。

add_action( 'get_template_part_content', 'child_post_styles', 10, 2 );

function child_post_styles ( $slug, $name ) {
    if( false == $name ){
        $name = get_post_format();
        $templates = array();
        if ( '' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";
        locate_template($templates, true, false);
    }
}

これは明らかにポスト複製になります。1つは希望のテンプレートを表示できるフック関数からのもので、もう1つはget_template_part()内の通常のlocate_template呼び出しからのものです。

私は、breakexitのようなバカなことをすることによって、複製せずに、または私のテンプレート部分を提供した直後にページのレンダリングを終了せずにこれを達成する方法を見つけるのに苦労しています。

12
TomHarrigan

これを行うためのフックはありません。 index.phpを子テーマにコピーして、単一行を変更します。また、親のテーマの作者に、柔軟性のために、テーマの中で同じ変更を加えるべきであると伝えます。

3
Otto

私はあなたが達成したいやり方を正確に可能ではないと思います。テンプレートファイル名を変更するためにそこにフィルタをかけないのは本当に面倒です:(

私はそれに対する回避策があります。比較にcontent.phpを使用しましょう。

// content.php file 
$format = get_post_format();
if( '' != $format ){
    get_template_part( 'content-'. $format );
}
else{
    get_template_part( 'content-default' );
}

私はget_template_part関数の2番目の引数を使用していません。content.phpファイルがない場合は'content-'. $formatファイルへの不定期な呼び出しを避けるために最初の引数に接尾辞を渡しました。

6
Shazzad

さて、 _ solution _ :があります。

add_action('init', function(){ remove_all_actions('get_template_part_content'); });
add_action('get_template_part_content', 'yourFunc', 99, 2 );
function yourFunc ( $slug, $name ) {

    .........any codes here.............
    if ($name == 'header'){
       //but this will be executed before loading template... At this moment, Wordpress doesnt support any hooks for before/after LOAD_TEMPLATE...
    }
}

しかし、慎重に考えて、どのフックにそのアクションを挿入すべきか...手動で場所を取得するためには、つまりlocate_template('content-header.php', false);を使います。

3
T.Todua

Content-aside.phpというファイルを取り込む場合は、次のように関数を呼び出します。

get_template_part( 'content', 'aside' );

2番目のパラメーターは、ハイフンの後のファイラーの名前です。ファイルがサブディレクトリ(templates/content-aside.php)にある場合:

get_template_part( 'templates/content', 'aside' );

あなたが探しているのはそれですか?

0
Justin R