Bagian template di dalam shortcode, hasil tak terduga

Aug 16 2020

Saya mencoba memanggil bagian template melalui shortcode. Saya telah membaca semua tentang bagaimana melakukan ini berulang-ulang di situs ini, namun setelah mencoba beberapa hal masih tidak dapat memanggil string waktu gema php sederhana. Nama file adalah test-one.php. Inilah yang saya coba:

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test', 'one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'test-one' );
    return ob_get_clean();
}
add_shortcode('test2', 'test_2');

function test_2( $attr ) {
    ob_start();
    get_template_part( 'wp-content/themes/theme-name/template-parts/test-one' );
    return ob_get_clean();
}

add_shortcode('test2', 'test_2');

Kode bagian template adalah

<?php

echo "Current as of <br>  ".date("m-d-Y h:i:sa");

Sepertinya itu harus berhasil, bukan? Dimana saya salah?

Jawaban

2 Howdy_McGee Aug 17 2020 at 00:25

The get_template_part()Fungsi tidak bertanggung nama direktori, Anda harus secara eksplisit menyediakan itu. Ini juga relatif terhadap direktori tema aktif. Jadi dalam banyak contoh Anda mencari template di root tema aktif Anda. Format yang benar adalah:

get_template_part( 'template-parts/test-one' );

Jika Anda mau, Anda dapat mengganti nama folder menjadi incatau includes- itu sewenang-wenang. Anda hanya perlu mencerminkan perubahan ini dalam pemanggilan fungsi.


Di samping catatan, WordPress memungkinkan Anda untuk memberikan parameter kedua dan akan mencari file yang digabungkan dengan tanda hubung. Misalnya, ini juga akan berfungsi:

get_template_part( 'template-parts/test', 'one' );

Manfaat dari ini adalah memungkinkan Anda untuk memiliki beberapa "jenis" dari bagian tertentu. Anda mungkin memiliki content-post.phpfile untuk menampilkan konten posting Anda dan content-page.phpuntuk menampilkan konten halaman Anda. Kemudian di tema Anda, Anda dapat memanggil template Anda dengan:

get_template_part( 'template-parts/content', $post->post_type );

Biarkan saja menjadi sedikit lebih dinamis.


Catatan samping lainnya. Kapan pun Anda mengalami masalah dengan jenis fungsi ini, Anda selalu dapat menggunakan:

add_action( 'init', function() {
    $template = locate_template( $template_string_here ); printf( '<pre>%s</pre>', print_r( $template, 1 ) );
    die( 'end' );
} );

Ini akan menampilkan jalur templat yang coba diakses oleh WordPress.