Benci menjadi pembawa berita buruk tetapi WordPress hardcodes fungsionalitas Templat Halaman ke tipe posting "halaman" , setidaknya dalam v3.0 (yang mungkin berubah di versi masa depan tetapi tidak ada inisiatif khusus saya sadar untuk mengubahnya Jadi, ini adalah salah satu dari beberapa kali saya berjuang untuk mencari cara untuk mengatasi sesuatu tanpa meretas inti.)
Solusi yang saya buat adalah pada dasarnya menyalin kode yang relevan dari inti WordPress dan memodifikasinya sesuai kebutuhan kita. Berikut langkah-langkahnya (nomor baris berasal dari v3.0.1):
Salin page_attributes_meta_box()
fungsi dari baris 535 /wp-admin/includes/meta-boxes.php
dan modifikasi agar sesuai.
Kode add_meta_boxes
kail untuk menambahkan metabox yang dibuat di # 1.
Salin get_page_templates()
fungsi dari baris 166 /wp-admin/includes/theme.php
dan modifikasi agar sesuai.
Salin page_template_dropdown()
fungsi dari baris 2550 /wp-admin/includes/template.php
dan modifikasi agar sesuai.
Tambahkan Template Posting ke tema Anda.
Beri kode save_post
kait untuk memungkinkan penyimpanan nama file templat pos saat disimpan.
Beri kode pada single_template
kail untuk mengaktifkan pemuatan templat kiriman untuk kiriman terkait.
Sekarang lanjutkan dengan itu!
1. Salin page_attributes_meta_box()
fungsi
Sebagai langkah pertama kami, Anda perlu menyalin page_attributes_meta_box()
fungsi dari baris 535 dari /wp-admin/includes/meta-boxes.php
dan saya telah memilih untuk mengganti namanya post_template_meta_box()
. Karena Anda hanya meminta templat halaman, saya menghapus kode untuk menentukan pos induk dan untuk menentukan urutan yang membuat kode lebih sederhana. Saya juga memilih untuk menggunakan postmeta untuk ini daripada mencoba menggunakan kembali page_template
properti objek untuk menghindari dan ketidakcocokan potensial yang disebabkan oleh kopling yang tidak disengaja. Jadi, inilah kodenya:
function post_template_meta_box($post) {
if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
$template = get_post_meta($post->ID,'_post_template',true);
?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
} ?>
<?php
}
2. Kode add_meta_boxes
kail
Langkah selanjutnya adalah menambahkan metabox menggunakan add_meta_boxes
hook:
add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}
3. Salin get_page_templates()
fungsi
Saya berasumsi hanya masuk akal untuk membedakan antara templat halaman dan templat pos sehingga diperlukan get_post_templates()
fungsi berdasarkan get_page_templates()
dari baris 166 of /wp-admin/includes/theme.php
. Namun alih-alih menggunakan Template Name:
penanda templat halaman mana yang menggunakan fungsi ini, gunakan Post Template:
penanda yang bisa Anda lihat di bawah.
Saya juga menyaring inspeksi functions.php
(tidak yakin bagaimana cara get_page_templates()
kerjanya dengan benar tanpa itu, tapi apa pun!) Dan satu-satunya yang tersisa adalah mengubah referensi kata page
ke post
untuk pembacaan pemeliharaan di jalan:
function get_post_templates() {
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];
$post_templates = array();
if ( is_array( $templates ) ) {
$base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );
foreach ( $templates as $template ) {
$basename = str_replace($base, '', $template);
if ($basename != 'functions.php') {
// don't allow template files in subdirectories
if ( false !== strpos($basename, '/') )
continue;
$template_data = implode( '', file( $template ));
$name = '';
if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
$name = _cleanup_header_comment($name[1]);
if ( !empty( $name ) ) {
$post_templates[trim( $name )] = $basename;
}
}
}
}
return $post_templates;
}
4. Salin page_template_dropdown()
fungsi
Demikian pula salin page_template_dropdown()
dari baris 2550 dari /wp-admin/includes/template.php
untuk membuat post_template_dropdown()
dan cukup mengubahnya untuk menelepon get_post_templates()
sebagai gantinya:
function post_template_dropdown( $default = '' ) {
$templates = get_post_templates();
ksort( $templates );
foreach (array_keys( $templates ) as $template )
: if ( $default == $templates[$template] )
$selected = " selected='selected'";
else
$selected = '';
echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
endforeach;
}
5. Tambahkan Template Posting
Langkah selanjutnya adalah menambahkan templat pos untuk pengujian. Dengan menggunakan Post Template:
penanda yang disebutkan dalam langkah # 3 salin single.php
dari tema Anda ke single-test.php
dan tambahkan tajuk komentar berikut ( pastikan untuk memodifikasi sesuatu single-test.php
sehingga Anda dapat mengatakan itu sedang memuat alih-alih single.php
) :
/**
* Post Template: My Test Template
*/
Setelah Anda melakukan langkah-langkah # 1 hingga # 5 Anda dapat melihat metabox "Templat Posting" Anda muncul di halaman editor posting Anda:
(sumber: mikeschinkel.com )
6. Kode save_post
kait
Sekarang setelah Anda memiliki editor yang sudah dihapus, Anda harus benar-benar menyimpan nama file templat halaman Anda ke postmeta ketika pengguna mengklik "Terbitkan". Berikut kode untuk itu:
add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
if ($post->post_type=='post' && !empty($_POST['post_template']))
update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}
7. Kode single_template
kait
Dan terakhir, Anda harus benar-benar mendapatkan WordPress untuk menggunakan templat posting baru Anda. Anda melakukannya dengan mengaitkan single_template
dan mengembalikan nama templat yang Anda inginkan untuk pos-pos yang telah ditetapkan satu:
add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
global $wp_query;
$post = $wp_query->get_queried_object();
if ($post) {
$post_template = get_post_meta($post->ID,'_post_template',true);
if (!empty($post_template) && $post_template!='default')
$template = get_stylesheet_directory() . "/{$post_template}";
}
return $template;
}
Dan itu saja!
CATATAN bahwa saya tidak mempertimbangkan Jenis Pos Kustom , hanya post_type=='post'
. Menurut pendapat saya mengatasi jenis posting kustom akan membutuhkan pembedaan antara berbagai jenis posting dan, meskipun tidak terlalu sulit, saya tidak mencoba di sini.