Buat templat halaman khusus dengan plugin?


Jawaban:


73

get_page_template()dapat diganti melalui page_templatefilter. Jika plugin Anda adalah direktori dengan templat sebagai file di dalamnya, itu hanya masalah meneruskan nama-nama file ini. Jika Anda ingin membuatnya "on the fly" (sunting di area admin dan simpan di database?), Anda mungkin ingin menulisnya ke direktori cache dan merujuknya, atau menghubungkannya template_redirectdan melakukan beberapa eval()hal gila .

Contoh sederhana untuk plugin yang "mengarahkan" ke file di direktori plugin yang sama jika kriteria tertentu benar:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}

Hai Jan, apakah Anda memiliki beberapa kode contoh tentang cara meneruskan file plugin sebagai templat halaman khusus?
jnthnclrk

@trnsfrmr: Ini sangat mudah, saya menambahkan contoh sederhana untuk jawaban saya.
Jan Fabry

10
Perhatikan bahwa ini lebih atau kurang digantikan oleh filter "template_include" di versi yang lebih baru (3.1+).
Inigoesdr

Sempurna !!!, Anda telah menghemat waktu saya @JanFabry
Kishan Chauhan

Seperti yang dinyatakan oleh @fireydude, ini bukan solusi umum. Ini adalah solusi yang mengkodekan halaman slug.
Mauro Colella

22

Overriding get_page_template()hanyalah peretasan cepat. Itu tidak memungkinkan templat untuk dipilih dari layar Admin dan halaman siput-kode ke dalam plugin sehingga pengguna tidak memiliki cara untuk mengetahui dari mana templat berasal.

Solusi yang disukai adalah dengan mengikuti tutorial ini yang memungkinkan Anda untuk mendaftarkan templat halaman di back-end dari plug-in. Kemudian berfungsi seperti template lainnya.

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}

Akan lebih baik ( dan lebih disukai ) jika Anda dapat memposting kode yang relevan dari tautan dalam jawaban Anda, jika tidak, ini tidak lebih dari komentar yang membengkak :-)
Pieter Goosen

Tutorial sebenarnya memuji contoh Tom McFarlin sebagai pencetus pendekatan ini.
fireydude

7

Ya itu mungkin. Saya menemukan contoh plugin ini sangat membantu.

Pendekatan lain yang muncul di kepala saya adalah menggunakan WP Filesystem API untuk membuat file templat dengan tema. Saya tidak yakin itu adalah pendekatan terbaik untuk dilakukan, tetapi saya yakin itu berhasil!


Plugin contoh terkait bahkan didokumentasikan dengan cukup baik. Aku suka itu. :)
Arvid

0

Tidak ada jawaban sebelumnya yang berfungsi untuk saya. Di sini satu tempat Anda dapat memilih templat di admin Wordpress. Masukkan saja ke dalam file plugin php utama Anda dan ubah template-configurator.phpdengan nama templat Anda

//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){

    if ( get_page_template_slug() == 'template-configurator.php' ) {
        $page_template = dirname( __FILE__ ) . '/template-configurator.php';
    }
    return $page_template;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-configurator.php'] = __('Configurator');

    return $post_templates;
}
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.