Buat templat halaman khusus dengan plugin?

61

Apakah mungkin membuat templat halaman khusus tersedia dari sebuah plugin?

jnthnclrk
sumber

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;
}
Jan Fabry
sumber
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',
        );
}
fireydude
sumber
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!

Ari
sumber
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;
}
Dessauges Antoine
sumber