Apakah mungkin untuk menimpa hasil get_template_part ()?

11

Saya sedang mengerjakan tema anak, saya sangat memilih untuk tidak menimpa file templat utama untuk menjaga kesederhanaan tema anak serta meminimalkan jumlah kode dan pemeliharaan dari waktu ke waktu.

Dalam loop, templat index.php dalam tema induk menggunakan: get_template_part( 'content' );

yang akan membawa content.php , saya ingin membuatnya berperilaku lebih mirip get_template_part( 'content', get_post_format() );atau serupa untuk membawa berbagai templat seperti content-samping.php , dll, tanpa membuat index.php pada tema anak untuk menimpa induk untuk perubahan satu baris.

get_template_part() terdiri dari:

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

Jadi ada tindakan yang tersedia, dalam kasus saya dipanggil get_template_part_content

Saya dapat menghubungkan ke tindakan dengan sesuatu seperti:

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

Ini jelas menghasilkan duplikasi pos, satu dari fungsi doyan saya, yang dapat menampilkan template yang diinginkan, dan yang lainnya dari locate_templatepanggilan normal diget_template_part()

Saya mengalami kesulitan menemukan cara untuk melakukan ini tanpa duplikasi, atau tanpa mengakhiri render halaman tepat setelah melayani bagian templat saya dengan melakukan sesuatu yang bodoh seperti breakatauexit

Tomarrigan
sumber
Periksa pos ini
Pieter Goosen
3
Selamat datang di kehidupan yang menyedihkan tanpa warisan templat. :)
Rarst

Jawaban:

3

Tidak ada kait untuk melakukan ini. Salin index.php ke tema anak dan buat perubahan satu baris. Juga, beri tahu penulis tema orang tua bahwa mereka harus membuat perubahan yang sama dalam tema mereka, untuk fleksibilitas.

Otto
sumber
Ini salah sekarang, lihat @ t-toudua jawab di sini
Ivan Castellanos
Jawabannya bukan solusi, karena bagian template masih memuat dan memasukkan. Kait tindakan tidak bisa mengesampingkan itu.
Otto
Benar, tetapi Anda bisa menggunakannya ob_startdi dalamnya dan ob_enddi beberapa kait kemudian dieksekusi tetapi tidak pernah bergema, yang biasanya cukup baik. Atau Anda dapat menggunakan exit () untuk memaksa menghentikan PHP (setelah Anda menambahkan secara manual semua yang masih hilang: footer, dll)
Ivan Castellanos
Dan itu masih bukan solusi. Menekan output tidak sama dengan mengesampingkan hal-hal.
Otto
Keluar tidak menekan output; itu secara efektif menghentikan eksekusi pada saat itu.
Ivan Castellanos
6

Saya pikir itu tidak mungkin persis cara yang ingin Anda capai. Ini sangat menjengkelkan karena tidak mendapatkan filter di sana untuk mengubah nama file templat :(

Saya punya solusinya. Biarkan digunakan content.phpuntuk perbandingan.

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

Saya belum menggunakan argumen get_template_partfungsi kedua , melainkan saya memberikan sufiks pada argumen pertama untuk menghindari panggilan infinitif pada content.phpfile jika tidak ada 'content-'. $formatfile.

Shazzad
sumber
Saya pikir ini adalah cara yang baik untuk melakukan itu. Tidak yakin mengapa itu tidak diterima :)
Anh Tran
Masalah reputasi, mungkin :)
Shazzad
Maaf @Shazzad, saya memberi jawaban Anda jawaban positif karena sangat pintar :) Jika saya bisa menerima dua, saya akan menjawab.
TomHarrigan
3

Nah, ada SOLUSI :

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...
    }
}

tapi pikirkan baik-baik, di mana kait Anda harus memasukkan tindakan itu ... untuk mendapatkan lokasi secara manual, gunakan, yaitu locate_template('content-header.php', false);

T.Todua
sumber
0

Jika Anda ingin menarik file bernama content-samping.php Anda memanggil fungsi seperti ini:

get_template_part( 'content', 'aside' );

Parameter kedua adalah nama filer setelah tanda hubung. Jika file Anda berada di sub-direktori (templat / content-samping.php):

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

Itukah yang ingin Anda lakukan?

Justin R
sumber
Terima kasih, saya mengerti itu. Saya ingin tidak perlu membuat index.php di child theme untuk menimpa parent theme index.php untuk perubahan satu baris. Ini menambahkan lebih banyak pemeliharaan untuk tema anak. Berharap dapat dicapai melalui kail jika memungkinkan.
TomHarrigan