पृष्ठ जोड़ना पोस्ट मेटाटॉक्स में पेज मेटॉक्स और पेज टेम्प्लेट को शामिल करता है?


14

( मॉडरेटर नोट: शीर्षक मूल रूप से "मैं" पृष्ठ विशेषताएँ "और / या" पृष्ठ गुण> टेम्पलेट "POSTS संपादक के लिए चयनकर्ता कैसे जोड़ सकता हूं")

WP वर्तमान में केवल पृष्ठों (यानी post_type=='page'।) के लिए एक "टेम्पलेट" के असाइनमेंट की अनुमति देता है, मैं इस कार्यक्षमता को पोस्ट के रूप में भी (यानी post_type=='post') तक विस्तारित करना चाहूंगा ।

मैं "पृष्ठ गुण" मेटा बॉक्स और अधिक विशेष रूप से, पोस्ट संपादक के लिए टेम्पलेट स्विचर कैसे जोड़ सकता हूं ?

मैं मान रहा हूं कि यह कोड है जो मैं functions.phpअपने विषय के लिए अपने स्थान पर रखूंगा ।

अद्यतन: मैंने अपने पोस्ट एडिटर में हार्डकोड किए गए टेम्पलेट्स पुलडाउन मेनू को जोड़ने के लिए, केवल मेरे मौजूदा कस्टम मेटा ऑप्शंस बॉक्स में सेलेक्ट बॉक्स HTML जोड़कर प्रबंधित किया है। यहाँ मैं उस कोड का उपयोग कर रहा हूँ ...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

और यहां फ़ंक्शन है जो विकल्पों और टेम्पलेट का चयन करता है बॉक्स का चयन करता है ...

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

और अंत में, सेव पर चयनित मान कैप्चर करने के लिए कोड ...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

अब, मेरा मानना ​​है कि यह सब छोड़ दिया गया है (1) चयनित टेम्पलेट को कैप्चर करना और इस पोस्ट के लिए पोस्ट मेटा में जोड़ना और (2) index.php और single.php को संशोधित करना ताकि वह चुने हुए टेम्पलेट का उपयोग करे।


@ सकोट बी : वैसे मैंने अपना पूरा उत्तर लिखने से पहले ही देखा कि आप उस पर भी काम कर रहे हैं, और ऐसा लगता है कि आपने इसे कुछ अलग दिशा में ले लिया है, जो आपके मूल प्रश्न के बिना आपके अनुसरण और कोई अनुक्रमणिका विकल्प नहीं है। उम्मीद है कि मैंने अभी भी आपके लिए क्या मूल्य रखा है। यदि नहीं, तो शायद यह दूसरों की मदद करेगा।
माइकस्किंकल

हां, आपने सवाल का जवाब दिया है। एक बार जब मैंने महसूस किया कि मुझे निर्देशिका को पार्स करने की आवश्यकता नहीं है और अपने विशिष्ट टेम्प्लेट के लिए मूल्यों को हार्डकोड कर सकता है, तो मैंने कुछ अलग सौदा किया। मुझे अभी भी पोस्ट के लिए सही असाइन किए गए टेम्पलेट का उपयोग करने के लिए WP प्राप्त करने के लिए आपके कुछ कोड को उधार लेने की संभावना होगी।
स्कॉट बी

जवाबों:


12

बुरी खबरों का वाहक बनने से नफरत है, लेकिन वर्डप्रेस पेज टेम्पलेट की कार्यक्षमता को "पेज" पोस्ट प्रकार पर कम से कम v3.0 में बदल देता है (जो कि भविष्य के संस्करणों में बदल सकता है, लेकिन कोई विशेष पहल नहीं है जो मुझे इसे बदलने के लिए पता है। अभी तक। तो यह बहुत कम बार मैं यह पता लगाने के लिए संघर्ष कर रहा हूं कि कोर को हैक किए बिना कैसे प्राप्त किया जा सकता है।)

इसका समाधान मैं मूल रूप से वर्डप्रेस कोर से संबंधित कोड की प्रतिलिपि बनाना और इसे हमारी आवश्यकताओं के लिए संशोधित करना है। यहाँ चरण दिए गए हैं (पंक्ति संख्याएँ v3.0.1 से हैं):

  1. page_attributes_meta_box()फ़ंक्शन को पंक्ति 535 से कॉपी करें/wp-admin/includes/meta-boxes.php और सूट में बदलें।

  2. add_meta_boxes# 1 में बनाए गए मेटाबोक्स को जोड़ने के लिए एक हुक को कोड करें

  3. get_page_templates()फ़ंक्शन को पंक्ति 166 से कॉपी करें/wp-admin/includes/theme.php और सूट में बदलें।

  4. page_template_dropdown()फ़ंक्शन को पंक्ति 2550 से कॉपी करें/wp-admin/includes/template.php और सूट में बदलें।

  5. अपने विषय में एक पोस्ट टेम्पलेट जोड़ें

  6. save_postसहेजें पर पोस्ट टेम्पलेट फ़ाइल नाम के भंडारण को सक्षम करने के लिए एक हुक कोड

  7. 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.phpsingle-test.phpsingle-test.phpsingle.php

/**
 * Post Template: My Test Template
 */

एक बार # 1 चरण # 5 करने के बाद आप अपने "पोस्ट टेम्प्लेट" मेटाबेस को अपने पोस्ट संपादक पृष्ठ पर प्रदर्शित कर सकते हैं :

वर्डप्रेस 3.0 में जोड़े जाने पर पोस्ट टेम्प्लेट मेटाटॉक्स कैसा दिखता था
(स्रोत: 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'


महान! मैं अपने संपादक में डिफ़ॉल्ट वर्डप्रेस फ़ंक्शंस की प्रतिलिपि बनाने के एक ही दृष्टिकोण के साथ लगभग पूर्ण कोड के साथ सो गया था (यह पूरा हो गया था, लेकिन मैं इसे तब तक पोस्ट नहीं करूंगा क्योंकि मैंने परीक्षण नहीं किया था)। :)
सोरिख87

@ sorich87 - आप पुरानी कहावत जानते हैं, "आप झपकी लेते हैं, आप ढीले हैं!" गंभीरता से हालांकि, केवल मजाक कर रहे हैं। वहाँ वास्तव में यह काम करने के लिए केवल एक ही उचित तरीका है तो यह आश्चर्य नहीं है कि आपका कोड समान होगा!
माइकस्किंकल

माइक, आप विस्मित करना जारी रखें। इस हथौड़े को निकालने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद।
स्कॉट बी

@ sorich87 - इस पर काम करने के लिए धन्यवाद। मैं वास्तव में प्रयास की सराहना करता हूं।
स्कॉट बी

1
@ स्कॉट बी : कोई बात नहीं, खुशी है कि मैं मदद कर सकता था। मैं यथोचित सामान्य प्रश्नों की तलाश करता हूं, जो संभावित रूप से बहुत से लोगों की मदद कर सकते हैं और न केवल सवाल पूछने वाले व्यक्ति के लिए बल्कि बाद में आने वाले लोगों के लिए उन्हें जवाब देने की कोशिश कर सकते हैं।
माइकस्किंकल

0

Wordpress आपको प्लगइन का उपयोग करके श्रेणियाँ में मेटा जोड़ने की अनुमति देता है:

ऐसा करने के लिए आपको विभिन्न एक्सटेंशनों में से एक को जोड़ना होगा जो मेटा को श्रेणियों में जोड़ता है (नकल क्या पेज बॉक्स से बाहर निकलता है), सिंपल टर्म मेटा काम अच्छी तरह से करता है।

श्रेणियाँ बढ़ाने के लिए NB WordPress 3.x की आवश्यकता है।

उसके बाद आप उपयोग कर सकते हैं:

  • add_term_meta
  • update_term_meta
  • get_term_meta

कार्यविधियों का उपयोग करें

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

विषयों में नए क्षेत्रों को कॉल करना आसान है:

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

अधिक जानकारी और उदाहरण: http://www.wphub.com/adding-metadata-taxonomy-terms/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.