Jenis Posting Khusus dan template_redirect


9

Saya memiliki dua jenis pos khusus (mis. Post_type_1 dan post_type_2) yang ingin saya alihkan ke template independen (single-post_type_1.php dan single-post_type_2.php) untuk menangani tampilan mereka. Saya tidak ingin meletakkan templat tampilan di folder tema karena saya ingin mereka mandiri dalam folder plugin masing-masing.

Bagaimana saya dapat meminta masing-masing dari mereka mendaftarkan hook template_redirect tanpa mempengaruhi yang lain? Atau haruskah saya menggunakan teknik yang berbeda?

Saat ini, saya melakukan ini di Plugin 1:

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Dan ini di Plugin 2:

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Setelah saya mendaftarkan pengait template_redirect plugin 2, plugin 1 tidak lagi berfungsi.

Apakah saya melewatkan sesuatu?

Apa cara terbaik untuk melakukan ini?

Jawaban:


13

Anda harus menggunakan filter template_include untuk ini:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectadalah tindakan yang dipanggil langsung sebelum header dikirim untuk output dari template yang diberikan. Ini adalah pengait yang nyaman untuk melakukan pengalihan 404, dll ... tetapi tidak boleh digunakan untuk memasukkan jalur templat lain karena WordPress melakukan ini secara bawaan dengan filter 'template_include'.

template_includedan single_templatekait HANYA berurusan dengan jalur templat yang digunakan untuk merender konten. Ini adalah tempat yang tepat untuk menyesuaikan jalur templat.

Pembaruan dari komentar oleh @ChipBennett:

single_templatetelah dihapus pada 3.4. Gunakan {posttype} _template sebagai gantinya.


Jadi, ini berfungsi, tetapi ternyata template_redirect dan single_template berfungsi juga. Masalah sebenarnya yang saya tentukan adalah bahwa saya memiliki fungsi penyortiran kolom admin kustom yang menghubungkan ke filter 'permintaan' dan saya tidak membatasi modifikasi variabel $ vars hanya ketika jenis posting dari jenis tertentu. Tapi, saya senang mengetahui tentang kait template_include. Masih tidak yakin apa perbedaannya antara template_redirect, template_include dan single_template.
anderly

@tapi saya memperbarui jawaban saya. Semoga ini membantu.
Brian Fegter

Jadi, bagaimana dengan single_template? Tautan ini ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) mengatakan itu dapat digunakan untuk menyesuaikan template untuk posting atau halaman ketika template tunggal dipanggil. Inilah yang saya coba lakukan. Bagaimanapun, menggunakan salah satu template_include atau filter single_template berfungsi dan muncul untuk mencapai hal yang sama.
anderly

1
single_template bekerja dengan cara yang sama kecuali itu disebut kondisional. Ini membantu untuk mengisolasi perubahan jalur alih-alih menggunakan filter palu di seluruh situs.
Brian Fegter

1
sangat keren ... saya tidak tahu tentang template_include
helgatheviking
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.