Kötü haberlerin taşıyıcısı olmaktan nefret ediyorum, ancak WordPress, Sayfa Şablonu işlevini en azından v3.0'da (gelecekteki sürümlerde değişebilecek ancak değiştirmeyi bildiğim belirli bir girişim yok) "sayfa" yayın türüne zorlar Yine de bu, çekirdeği hacklemeden bir şeyin etrafından nasıl dolaşacağımı anlamaya çalıştığım birkaç zamandan biri.)
Geldiğim çözüm temel olarak ilgili kodu WordPress çekirdeğinden kopyalayıp ihtiyaçlarımıza göre değiştirmektir. Adımlar (satır numaraları v3.0.1'den alınmıştır):
page_attributes_meta_box()
İşlevi 535 satırından kopyalayın/wp-admin/includes/meta-boxes.php
ve uygun şekilde değiştirin.
add_meta_boxes
# 1'de oluşturulan meta kutuyu eklemek için bir kanca kodlayın.
get_page_templates()
İşlevi 166. satırdan kopyalayın/wp-admin/includes/theme.php
ve uygun şekilde değiştirin.
page_template_dropdown()
İşlevi 2550 satırından kopyalayın/wp-admin/includes/template.php
ve uygun şekilde değiştirin.
Temanıza bir Yazı Şablonu ekleyin.
save_post
Kaydettikten sonra yazı şablonu dosya adının saklanmasını sağlamak için bir kanca kodlayın .
single_template
İlişkili gönderiler için gönderi şablonunun yüklenmesini etkinleştirmek üzere bir kanca kodlayın .
Şimdi onunla!
1. page_attributes_meta_box()
İşlevi kopyalayın
İlk adım olarak, page_attributes_meta_box()
işlevi 535 satırından kopyalamanız gerekiyor /wp-admin/includes/meta-boxes.php
ve yeniden adlandırmayı seçtim post_template_meta_box()
. Siz sadece sayfa şablonlarını sorduğunuzdan, bir üst postayı belirtmek ve kodu daha basit hale getiren siparişi belirtmek için kodu atladım. Ayrıca page_template
istemeden kuplajın neden olduğu olası uyumsuzluklardan kaçınmak için nesne özelliğini yeniden kullanmaya çalışmak yerine postmeta kullanmayı seçtim . İşte kod:
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. add_meta_boxes
Kancayı kodlayın
Sonraki adım, add_meta_boxes
çengel kullanarak meta kutuyu eklemektir :
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. get_page_templates()
İşlevi kopyalayın
Ben sadece sayfa şablonları ve yazı şablonu arasında ayrım yapmak mantıklı olacağını düşündüm, böylece satır 166 get_post_templates()
dayalı bir fonksiyon ihtiyacı . Ancak hangi sayfa şablonlarının kullandığı işaretçiyi kullanmak yerine, bu işlevi aşağıda görebileceğiniz bir işaretçi kullanır .get_page_templates()
/wp-admin/includes/theme.php
Template Name:
Post Template:
Ben de denetlenmesine filtrelenen functions.php
(değil emin nasıl get_page_templates()
! O olmadan düzgün çalıştığı bir zamanda, ama neyse) Ve tek şey sol kelime değişikliği başvuruları etmektir page
için post
yolda bakım okunabilmesi için:
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. page_template_dropdown()
İşlevi kopyalayın
Benzer şekilde oluşturmak için page_template_dropdown()
2550 satırından kopyalayın ve bunun yerine çağrı yapmak üzere değiştirin :/wp-admin/includes/template.php
post_template_dropdown()
get_post_templates()
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. Yazı Şablonu Ekle
Sonraki adım, test için bir yazı şablonu eklemektir. Kullanılması Post Template:
adım 3. kopya belirtilen işaretleyici single.php
için temasından single-test.php
ve aşağıdaki açıklama başlığını ekleyin ( bir şey değiştirmeye özen single-test.php
bunu söyleyebilir böylece yerine yükleniyor single.php
) :
/**
* Post Template: My Test Template
*/
1 ile 5 arasındaki adımları tamamladıktan sonra "Yazı Şablonları" meta kutunuzun yazı düzenleyici sayfanızda göründüğünü görebilirsiniz :
(kaynak: mikeschinkel.com )
6. save_post
Kancayı kodlayın
Artık düzenleyicinin karesini aldığınızdan, kullanıcı "Yayınla" yı tıkladığında postmeta yapmak için sayfa şablonu dosya adınızı kaydetmeniz gerekir. İşte bunun kodu:
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. single_template
Kancayı kodlayın
Son olarak, yeni yazı şablonlarınızı kullanmak için WordPress almanız gerekir. Bunu, single_template
atanmış bir gönderi için istediğiniz şablon adını bağlayarak ve döndürerek yapabilirsiniz :
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;
}
Ve hepsi bu kadar!
NOT Bunu vermedi dikkate alınması Özel Mesaj Türleri sadece post_type=='post'
. Benim düşünceme göre özel yazı türlerini ele almak, farklı yazı türleri arasında ayrım yapılmasını gerektirecek ve aşırı zor olmasa da, burada denemedim.