Apakah ada plugin WordPress yang mendaftarkan file plugin sebagai templat halaman khusus?

9

Saya perlu membuat plugin yang membuat templat halaman khusus tersedia di wp-admin. Saya bertanya-tanya apakah seseorang sudah menangani ini, karena sepertinya proses yang cukup khas?

jnthnclrk
sumber
Saya tidak begitu mengerti pertanyaannya. Anda ingin plugin yang menyisipkan template khusus yang didefinisikan dalam plugin?
Steven

Jawaban:

7

Seperti dijawab Rarst Anda benar-benar dapat melakukannya tanpa mengedit file inti atau menghapus metabox atribut halaman dan membuat Anda menggunakan kode yang sama dengan sedikit modifikasi. kode di bawah ini adalah kode untuk /admin/include/meta-boxes.php dan saya menambahkan komentar untuk menunjukkan ke mana pilihan templat halaman ekstra Anda akan pergi:

function page_attributes_meta_box($post) {
    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
        $pages = wp_dropdown_pages(array('post_type' => $post->post_type, 'exclude_tree' => $post->ID, 'selected' => $post->post_parent, 'name' => 'parent_id', 'show_option_none' => __('(no parent)'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
        if ( ! empty($pages) ) {
        ?>
        <p><strong><?php _e('Parent') ?></strong></p>
        <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
        <?php echo $pages; ?>
        <?php
        } // end empty pages check
    } // end hierarchical check.
    if ( 'page' == $post->post_type && 0 != count( get_page_templates() ) ) {
        $template = !empty($post->page_template) ? $post->page_template : false;
        ?>
        <p><strong><?php _e('Template') ?></strong></p>
        <label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label><select name="page_template" id="page_template">
        <option value='default'><?php _e('Default Template'); ?></option>
        <?php page_template_dropdown($template); ?>

        // add your page templates as options

        </select>
        <?php
    } ?>
    <p><strong><?php _e('Order') ?></strong></p>
    <p><label class="screen-reader-text" for="menu_order"><?php _e('Order') ?></label><input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr($post->menu_order) ?>" /></p>
    <p><?php if ( 'page' == $post->post_type ) _e( 'Need help? Use the Help tab in the upper right of your screen.' ); ?></p>
    <?php
}

Tidak tahu apakah ini adalah perbaikan dalam kasus Anda, tetapi saya memiliki kasus smiler ketika saya perlu menampilkan jenis posting dalam tema bawaan plugin dan untuk itu saya menggunakan add_filter('the_content', 'my-function'); dan fungsi saya membuat output untuk ditampilkan.

Opsi lain adalah membuat plugin Anda membuat file template di direktori tema saat ini, sesuatu seperti ini:

function create_plugins_theme_file(){
    $file_name = TEMPLATEPATH . '/' . $tamplate_name . '.php';
    $handle = fopen($file_name, 'w') or wp_die('Cannot open file for editing');
    $file_contents = <<<OUT
<?php
/*
Template Name: $tamplate_name
*/
?>

//you theme file here

OUT;

   fwrite($handle, $file_contents);
   fclose($handle);
 }

dan Anda dapat menjalankan ini setelah Anda memeriksa apakah file tersebut ada

if(!file_exists( $file_name)){create_plugins_theme_file();}

Semoga salah satu dari ini membantu.

Bainternet
sumber
Akan menguji hal-hal meta box, bus sesuai jawaban saya - itu hanya bagian dari masalah, lainnya adalah - kode yang mencoba memuat template hanya jika ada di direktori tema. Jadi menyediakan file template "eksternal" mungkin tidak cukup untuk membuatnya dimuat.
Paling lambat
itu sebabnya saya menyarankan untuk membuat plugin buat file di direktori tema.
Bainternet
2

Saya tidak sepenuhnya yakin saya mengerti apa yang ingin Anda capai, setidaknya mengapa Anda ingin plugin melakukan itu.

Prosedur normal untuk membuat templat halaman yang berbeda adalah:

  1. Buat templat-halaman baru di direktori tema AKTIF Anda (buat salinan page.php).

  2. Ubah nama templat (di dalam file).

    / * Nama Templat: Halaman Lebar Penuh * /

  3. Ubah kode halaman menjadi apa yang ingin Anda capai.

  4. Sekarang Anda dapat membuat halaman baru dan memilih "Templat" mana yang akan digunakan.

teks alternatif

...

Saya harap itu yang ingin Anda capai?

Dokumentasi resmi di sini: http://codex.wordpress.org/Pages#Creating_Your_Own_Page_Templates

Lars Koudal
sumber
Aduh. contoh kode PHP agak kacau. Kunjungi tautan untuk contoh kode yang tepat.
Lars Koudal
2
Tertarik untuk mengetahui apakah ada yang menggunakan metode Jan dalam plugin yang ada: wordpress.stackexchange.com/questions/3396/…
jnthnclrk
Saya percaya @trnsfrmr sedang mencari cara bagaimana membuat templat halaman yang telah ditentukan (langkah 1-3) di dalam plugin miliknya untuk membuat templat ini tersedia bagi pengguna setelah aktivasi plugin. Saya kira dia ingin menjaga tema solusi ini independen.
Michal Mau
Ah, oke, saya sedikit salah paham di sana, terima kasih atas klarifikasi :-)
Lars Koudal
2

Ini sepertinya cukup sulit untuk dicapai. get_page_templates()fungsi secara aktif membuang apa pun yang tidak terletak di direktori root induk dan anak. Itu juga tidak menyimpan dalam variabel global atau memungkinkan untuk menyaring daftar templat yang dihasilkan.

Saya pikir meta box atribut halaman perlu bercabang dan sepenuhnya diganti untuk ini. Dan tidak yakin itu akan mungkin bahkan saat itu.

Saya setuju bahwa ini sepertinya sesuatu yang masuk akal, tetapi kode WordPress sangat tepat karena ia menginginkan template bernama hanya berasal dari direktori theme.

Jarang
sumber
1

Bukankah melakukan ini salah satu alasan yang register_theme_directory()diperkenalkan?

http://core.trac.wordpress.org/ticket/10467

Pada saat itu ada masalah yang berkaitan dengan BuddyPress, yang ingin melemparkan template tambahan di sana-sini.

Saya kira mereka tidak terdaftar dengan benar sebagai templat halaman, meskipun:

http://core.trac.wordpress.org/ticket/15803

Denis de Bernardy
sumber
Saya akan membahas kode (mungkin besok), tetapi sejauh yang saya ingat templat dengan nama secara eksplisit dicari melalui konstanta jalur saja.
Paling lambat