Plugin Jenis Posting Kustom: Di mana Saya Menempatkan Template?

11

Saya sedang menulis plugin jenis posting khusus. Sebagian dari itu saya keluaran ke template melalui shortcode. Tetapi bagian lain membutuhkan templat pos kustom, dan saya menemukan cara menggunakan hierarki templat untuk CPT. Tapi template khusus ada di tema, dan saya pikir plugin harus mandiri, setidaknya untuk memulainya.

Jadi apa praktik terbaik di sini? Bagaimana cara kami memasukkan file template dalam plugin CPT? Dapatkah Anda menunjukkan kepada saya contoh yang sangat baik tentang bagaimana hal ini dilakukan?

Terima kasih atas bantuan Anda.

NotoriousWebmaster
sumber
1
kemungkinan duplikat Templat Jenis Pos Khusus dari Folder Plugin?
Johannes Pille
1
Tidak yakin itu duplikat, tapi ini pertanyaan subjektif. Praktik terbaik bagi saya adalah membiarkan tema menanganinya. Praktik terbaik untuk orang lain adalah membuat plugin sepenuhnya mandiri.
chrisguitarguy
@JohannesPille saya melakukan pencarian sebelum bertanya. Tapi terima kasih untuk tautannya. Saya akan mencari ke dalamnya.
NotoriousWebmaster
1
@chrisguitarguy Setuju. Masalah saya dengan membiarkan tema menangani itu adalah jika kita beralih tema, kita harus melakukan beberapa penyesuaian untuk mengakomodasi plugin. Kalau tidak, kita kehilangan barang yang dibawa CPT ke pesta.
NotoriousWebmaster

Jawaban:

8

Jadi apa praktik terbaik di sini?

Saya akan mengatakan kombinasi membiarkan tema menanganinya dan menyediakan default dengan plugin Anda.

Anda dapat menggunakan single_templatefilter untuk mengganti templat. Dalam panggilan balik Anda, lihat apakah tema menyediakan templat untuk jenis posting, jika berhasil, jangan lakukan apa pun.

<?php
add_filter('single_template', 'wpse96660_single_template');
function wpse96660_single_template($template)
{
    if ('your_post_type' == get_post_type(get_queried_object_id()) && !$template) {
        // if you're here, you're on a singlar page for your costum post 
        // type and WP did NOT locate a template, use your own.
        $template = dirname(__FILE__) . '/path/to/fallback/template.php';
    }
    return $template;
}

Saya suka metode ini yang terbaik. Gabungkan dengan menyediakan seperangkat "tag templat" suara (mis. the_content, the_title) Yang mendukung data khusus apa pun yang sesuai dengan jenis posting Anda dan Anda memberi pengguna akhir banyak daya penyesuaian bersama dengan beberapa suara standar. Bbpress melakukan hal semacam ini dengan sangat baik: termasuk template pengguna jika menemukannya dan memberikan banyak tag template.

Atau, Anda dapat menggunakan panggilan balik dengan the_contentfilter, dan hanya mengubah hal-hal di konten itu sendiri.

<?php
add_filter('the_content', 'wpse96660_the_content');

function wpse96660_the_content($content)
{
    if (is_singular('your_post_type') && in_the_loop()) {
        // change stuff
        $content .= '<p>here we are on my custom post type</p>';
    }

    return $content;
}
chrisguitarguy
sumber
Saya setuju dengan @toscho bahwa tidak ada solusi bersih. Tapi saya suka konsep menawarkan satu set tag kategori. Saya curiga akhirnya saya akan memiliki folder tema di plugin saya, dengan contoh template CPT, dan merekomendasikan pengguna untuk menyesuaikannya dengan keadaan mereka. Saya juga suka filter the_content, karena itu menyumbat konten saya di dalam tata letak pengguna. Saya dapat mengimplementasikan keduanya, dan memungkinkan pengguna untuk memilih cara mana yang akan digunakan dengan opsi toggle.
NotoriousWebmaster
3

Anda dapat menghubungkan template_includedan mengembalikan file plugin Anda jika permintaannya adalah untuk jenis posting Anda:

add_filter( 'template_include', 'insert_my_template' );

function insert_my_template( $template )
{
    if ( 'my_post_type' === get_post_type() )
        return dirname( __FILE__ ) . '/template.php';

    return $template;
}

Tapi ini akan mengubah tampilan secara drastis. Masih belum ada solusi bersih.

fuxia
sumber
Ya, Anda benar, itu akan mengubah tampilan, termasuk tata letak, widget, dan semacamnya. Terlalu radikal untuk seleraku. Tapi terima kasih.
NotoriousWebmaster