बुरी खबरों का वाहक बनने से नफरत है, लेकिन वर्डप्रेस पेज टेम्पलेट की कार्यक्षमता को "पेज" पोस्ट प्रकार पर कम से कम v3.0 में बदल देता है (जो कि भविष्य के संस्करणों में बदल सकता है, लेकिन कोई विशेष पहल नहीं है जो मुझे इसे बदलने के लिए पता है। अभी तक। तो यह बहुत कम बार मैं यह पता लगाने के लिए संघर्ष कर रहा हूं कि कोर को हैक किए बिना कैसे प्राप्त किया जा सकता है।)
इसका समाधान मैं मूल रूप से वर्डप्रेस कोर से संबंधित कोड की प्रतिलिपि बनाना और इसे हमारी आवश्यकताओं के लिए संशोधित करना है। यहाँ चरण दिए गए हैं (पंक्ति संख्याएँ v3.0.1 से हैं):
page_attributes_meta_box()
फ़ंक्शन को पंक्ति 535 से कॉपी करें/wp-admin/includes/meta-boxes.php
और सूट में बदलें।
add_meta_boxes
# 1 में बनाए गए मेटाबोक्स को जोड़ने के लिए एक हुक को कोड करें ।
get_page_templates()
फ़ंक्शन को पंक्ति 166 से कॉपी करें/wp-admin/includes/theme.php
और सूट में बदलें।
page_template_dropdown()
फ़ंक्शन को पंक्ति 2550 से कॉपी करें/wp-admin/includes/template.php
और सूट में बदलें।
अपने विषय में एक पोस्ट टेम्पलेट जोड़ें ।
save_post
सहेजें पर पोस्ट टेम्पलेट फ़ाइल नाम के भंडारण को सक्षम करने के लिए एक हुक कोड ।
single_template
संबंधित पोस्ट के लिए पोस्ट टेम्पलेट को लोड करने में सक्षम करने के लिए एक हुक कोड ।
अब इसके साथ!
1. page_attributes_meta_box()
फ़ंक्शन की प्रतिलिपि बनाएँ
हमारे पहले चरण के रूप में, आपको page_attributes_meta_box()
फ़ंक्शन को पंक्ति 535 से कॉपी करने की आवश्यकता है /wp-admin/includes/meta-boxes.php
और मैंने इसे नाम बदलने के लिए चुना है post_template_meta_box()
। चूंकि आपने केवल पेज टेम्प्लेट के लिए पूछा था इसलिए मैंने एक मूल पोस्ट को निर्दिष्ट करने के लिए और ऑर्डर को निर्दिष्ट करने के लिए कोड को छोड़ दिया था जो कोड को बहुत सरल बनाता है। मैंने इसके लिए पोस्टमेटा का उपयोग करने के बजाय वस्तुगत page_template
संपत्ति का पुन: उपयोग करने का प्रयास किया ताकि अनजाने में युग्मन के कारण होने वाली संभावित असंगतताओं से बचा जा सके। तो यहाँ कोड है:
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
हुक कोड
अगला कदम add_meta_boxes
हुक का उपयोग करके मेटाबेस को जोड़ना है :
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()
फ़ंक्शन की प्रतिलिपि बनाएँ
मैंने मान लिया कि यह केवल पेज टेम्प्लेट और पोस्ट टेम्प्लेट के बीच अंतर करने के लिए समझ में आएगा, इस प्रकार एक get_post_templates()
फ़ंक्शन की आवश्यकता get_page_templates()
रेखा 166 के आधार पर होगी /wp-admin/includes/theme.php
। लेकिन Template Name:
मार्कर के बजाय जो पेज टेम्पलेट इस फ़ंक्शन का उपयोग करते हैं, Post Template:
इसके बजाय एक मार्कर का उपयोग करता है जिसे आप नीचे देख सकते हैं।
मैं भी के निरीक्षण फिल्टर करके निकाल functions.php
(यकीन नहीं कैसे get_page_templates()
कभी सही ढंग से है कि बिना काम किया है, लेकिन जो कुछ भी!) और केवल एक चीज बाईं शब्द को परिवर्तन के संदर्भ के लिए है page
करने के लिए post
सड़क के नीचे रखरखाव पठनीयता के लिए:
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()
फ़ंक्शन की प्रतिलिपि बनाएँ
इसी तरह page_template_dropdown()
लाइन 2550 से कॉपी /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. एक पोस्ट टेम्पलेट जोड़ें
अगला कदम परीक्षण के लिए पोस्ट टेम्पलेट जोड़ना है। अपने विषय से Post Template:
चरण # 3 कॉपी में उल्लिखित मार्कर का उपयोग करना और निम्नलिखित टिप्पणी शीर्षलेख जोड़ना ( कुछ को संशोधित करना सुनिश्चित करें ताकि आप बता सकें कि यह इसके बजाय लोड हो रहा है ) :single.php
single-test.php
single-test.php
single.php
/**
* Post Template: My Test Template
*/
एक बार # 1 चरण # 5 करने के बाद आप अपने "पोस्ट टेम्प्लेट" मेटाबेस को अपने पोस्ट संपादक पृष्ठ पर प्रदर्शित कर सकते हैं :
(स्रोत: mikeschinkel.com )
6. एक save_post
हुक कोड
अब जब आपके पास संपादक है, तो आपको उपयोगकर्ता को "प्रकाशित करें" पर क्लिक करने पर अपने पेज टेम्प्लेट फ़ाइल नाम को पोस्टमेट में सहेजने की आवश्यकता है। यहाँ उस के लिए कोड है:
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
हुक
और अंत में आपको अपने नए पोस्ट टेम्प्लेट का उपयोग करने के लिए वास्तव में वर्डप्रेस प्राप्त करना होगा। आप single_template
उन पोस्ट के लिए अपना इच्छित टेम्पलेट नाम हुक करके और वापस करके ऐसा करते हैं , जिन्हें एक असाइन किया गया है:
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;
}
और इसके बारे में है!
ध्यान दें कि मैंने कस्टम पोस्ट प्रकारों पर ध्यान नहीं दिया , केवल । मेरी राय में, कस्टम पोस्ट प्रकारों को संबोधित करने के लिए विभिन्न पोस्ट प्रकारों के बीच अंतर करने की आवश्यकता होगी और, अत्यधिक कठिन नहीं होने के बावजूद, मैंने यहां प्रयास नहीं किया।post_type=='post'