get_template_part()の結果をオーバーライドすることは可能ですか?


11

私は子テーマに取り組んでいます。子テーマのシンプルさを維持し、長期にわたるコードとメンテナンスの量を最小限に抑えるために、メインテンプレートファイルをオーバーライドしないことを強くお勧めします。

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

これにもたらすcontent.php、私はそれがより多くのように振る舞う持っているよget_template_part( 'content', get_post_format() );ような異なるテンプレートにもたらすためにまたは類似のコンテンツaside.php作成せずに、など、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);
    }
}

これにより、目的のテンプレートを表示できるフック関数からの複製と、通常のlocate_template呼び出しからの複製が明らかになりますget_template_part()

私は右のような愚かな何かをすることによって、私のテンプレートの一部を務めた後、レンダリング、またはページを終了せずに重複することなく、これを実現するための方法見つけるのトラブルを抱えているbreakかをexit



3
テンプレートを継承しない悲惨な生活へようこそ。:)
Rarst 14

回答:


3

これを行うためのフックはありません。index.phpを子テーマにコピーし、1行変更します。また、柔軟性を高めるために、親テーマの作成者に、テーマに同じ変更を加える必要があることを伝えます。


これは今は間違っています。@ t-touduaの回答をご覧ください
イヴァンカステラーノス

彼の答えは解決策ではありません。テンプレートパーツがまだ読み込まれて含まれているからです。アクションフックはそれをオーバーライドできません。
オットー

確かに、ob_start内部で使用することもできますob_endし、後のフックで実行することもできますが、通常は十分です。または、exit()を使用してPHPを強制終了することもできます(まだ足りないものすべてを手動で追加した後:フッターなど)
Ivan Castellanos

そして、それはまだ解決策ではありません。出力を抑制することは、オーバーライドすることとは異なります。
オットー

終了しても出力は抑制されません。その時点で実行を効果的に停止します。
イヴァンカステラーノス

6

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

ただし、回避策があります。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


これは良い方法だと思います。なぜ受け入れられないのかわからない:)
アントラン

評判が重要かもしれません、多分:)
Shazzad 14

@Shazzadに申し訳ありませんが、非常に賢いので、私はあなたの回答に賛成票を投じました。
トムハリガン

3

さて、解決があります:

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


0

content-aside.phpというファイルを取得したい場合は、次のような関数を呼び出します。

get_template_part( 'content', 'aside' );

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

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

それはあなたがやろうとしていることですか?


ありがとう、私はそれを理解しています。私は、1行の変更で親テーマindex.phpを上書きするために、子テーマにindex.phpを作成する必要がないようにしています。子テーマにさらにメンテナンスを追加します。可能であれば、フックを介して達成したいと考えています。
トムハリガン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.