मौजूदा पोस्ट के ड्रॉपडाउन द्वारा कस्टम फ़ील्ड / मेटा पॉप्युलेट किया गया?


11

(मेरा पहला WP सवाल कभी पूछा! कोमल बनो!)

मैं एक ऐसी साइट बना रहा हूं जो ज्यादातर पृष्ठों (यानी, स्थिर) है, सीएमएस के रूप में WP का उपयोग कर रहा है। कई पृष्ठों के तल पर, 1, 2 या 3 "प्रोमो बॉक्स" दिखाई देंगे - मूल रूप से बटन-छवियां जो साइट के अन्य भागों से लिंक होती हैं। हालाँकि किसी भी पेज पर केवल 3 प्रोमो बॉक्स दिखाई देंगे, वहाँ से चुनने के लिए ~ 30 अलग-अलग होंगे।

जब मेरा ग्राहक एक नया पृष्ठ बनाता है, तो मैं चाहूंगा कि वह सभी संभावित प्रोमो बॉक्सों की ड्रॉपडाउन सूची जैसी किसी चीज़ से प्रोमो बॉक्स चुनने में सक्षम हो।

मुझे लगता है यह इस तरह काम करना चाहिए:

  • एक कस्टम पोस्ट प्रकार बनाएं, जिसे "प्रोमो-बॉक्स" कहा जाता है। (हालांकि यह आसानी से नियमित पदों के लिए एक टैग हो सकता है।)
  • पृष्ठ संपादक पर एक ड्रॉपडाउन बनाने के लिए कस्टम फ़ील्ड टेम्पलेट जैसे उपकरण का उपयोग करें , जहां ड्रॉपडाउन विकल्पों के मूल्य गतिशील रूप से सभी मौजूदा प्रोमो-बॉक्स पोस्ट की सूची से उत्पन्न होते हैं। ( यह वह हिस्सा है जिसे मैं नहीं जानता कि कैसे करना है। )
  • परिणामी मेटाडेटा तक पहुँच (पोस्ट नंबर वास्तव में मेरी ज़रूरत है, तब मुझे पेज टेम्पलेट पर सब कुछ मिल सकता है)।

यहाँ अन्य सवालों के जवाबों के आधार पर, मैंने WPAlchemy MetaBox, Posts-2-Posts और SLT कस्टम फील्ड्स पर प्रारंभिक नज़र रखी है, लेकिन मैं मानता हूँ कि उनमें से प्रत्येक के लिए प्रलेखन मैं की तुलना में थोड़ा geekier हूं, इसलिए मैंने विलंब नहीं किया है बहुत गहराई से।

सलाह? क्या उपरोक्त उपकरणों में से एक मेरे लिए सही समाधान है, और मुझे इसका पता लगाना है? क्या मुझसे कोई चूक हो रही है?


वाह, समर्थन के सभी के लिए धन्यवाद! मुझे उम्मीद है कि मैं वैसे भी माइकस्किंकेल के समय और उदारता का अवमूल्यन नहीं कर रहा हूं, लेकिन मैंने "आधिकारिक" उत्तर के रूप में WPAlchemy उत्तर को चुना। मैं अभी भी PHP / Wordpress के लिए काफी नया हूं कि मैं अभी तक कक्षाओं और हुक और स्थिर कार्यों और इस तरह के साथ सुपर आरामदायक नहीं हूं। मैं किसी दिन y'all के रूप में कुशल होने की उम्मीद है!
निक वॉर्महॉवन

जवाबों:


7

WPAlchemy के लेखक के रूप में , मैं थोड़ा पूर्वाग्रह हूं, लेकिन आपके पास अनिवार्य रूप से आपके द्वारा चुने गए मार्ग के आधार पर एक अच्छा काम करने वाला मॉडल है।

हालाँकि, यदि WPAlchemy का उपयोग कर रहे हैं, तो आप मूल रूप से निम्नलिखित जैसा कुछ करेंगे (चरण # 2):

//  functions.php

include_once 'WPAlchemy/MetaBox.php';

if (is_admin()) 
{
    // a custom style sheet if you want to do some fancy styling for your form
    wp_enqueue_style('custom_meta_css', TEMPLATEPATH . '/custom/meta.css');
}

// define the meta box
$custom_metabox = new WPAlchemy_MetaBox(array
(
    'id' => '_custom_meta',
    'title' => 'My Custom Meta',
    'template' => TEMPLATEPATH . '/custom/meta.php'
));

custom/meta.cssऐसी शैलियाँ हो सकती हैं, जिनके साथ आप अपने फ़ॉर्म को स्टाइल कर सकते हैं और custom/meta.phpअनिवार्य रूप से मेटा बॉक्स की FORM सामग्री के साथ एक HTML फ़ाइल है, इस मामले में आपकी ड्रॉप डाउन, आपकी ड्रॉप डाउन उत्पन्न करने के लिए आप अपने सभी कस्टम पोस्ट प्राप्त करने के लिए एक कस्टम wp क्वेरी करेंगे। प्रकार के। WPAlchemy में आपके विशेष तत्वों को बनाने में सहायता करने के लिए कुछ विशेष सहायक कार्य हैं।

टेम्प्लेट में काम करते समय आपकी सहायता करने के लिए अतिरिक्त प्रलेखन है।

WPAlchemy का मुख्य लक्ष्य डेवलपर के हाथों में स्टाइल (लुक + फील) से लेकर मेटा बॉक्स कंटेंट डेफिनेशन तक का नियंत्रण रखना था।

और खुद और अन्य हमेशा उन लोगों की मदद करने के लिए तैयार रहते हैं जो टिप्पणी करते हैं और सवाल पूछते हैं।


1
अच्छा जवाब, लेकिन क्या मैं सुझाव दे सकता हूं कि अतिरिक्त स्टाइलशीट विशेष रूप से पोस्ट एडिटिंग स्क्रीन पर अनुरोध करें। मेटाबॉक्स निर्माण के लिए भी कहा जा सकता है, कि आदर्श रूप do_meta_boxesसे कुछ सशर्त तर्क के साथ या वैकल्पिक रूप से हुक किया जाना चाहिए add_meta_boxes_{%TYPE%}..
t31os

14

हे, तुम एक नौसिखिया हो! हम फिर से चीर के लिए चीर रहे हैं ...!

j / k :) हम यहाँ आपके लिए सभी खुशियों के लिए हार्दिक स्वागत करते हैं।

तो यह तीसरी बार है जब मैंने इस आवश्यकता को सुना है, ग्राहकों से दो बार और फिर से आपसे (और आपके ग्राहक।) जो मुझे बताता है कि यह एक सामान्य आवश्यकता है।

वर्डप्रेस कस्टम मेटाबॉक्स तीन (3) ड्रॉपडाउन दिखा रहा है

मुझे आपका विश्लेषण पसंद आया, इसलिए मैंने आपकी दूसरी बात को संबोधित करने के लिए एक वर्ग कोड करने का फैसला किया। मैंने इसे बुलाया LittlePromoBoxesक्योंकि मैं इस गीत को अपने सिर से कभी नहीं निकाल सकता, उनके लिए धन्यवाद । मूल रूप से मैं वर्ग का उपयोग करने के लिए एनकैप्सुलेट करता हूं अन्यथा संभावित नामकरण के कार्यों से बचने के लिए जिन्हें मुझे लिखना होगा।

आप इस वर्ग को अपनी थीम की functions.phpफ़ाइल में या किसी प्लगइन के .PHP फ़ाइल में रख सकते हैं जिसे आप लिख रहे होंगे (लेकिन चिंता न करें, यह इससे कहीं अधिक जटिल है।)

पहला कार्य on_load()एक स्थिर कार्य है, जिसे मैं कक्षा के अंत में तीन (3) हुक को आरंभ करने के लिए कहता हूं, जिसकी आपको आवश्यकता होगी (फ़ि स्टैटिक फ़ंक्शन अनिवार्य रूप से वर्ग से संबंधित कार्य हैं , उदाहरण नहीं) :

  1. initहुक रजिस्टर करने के लिए promo-boxपोस्ट प्रकार,

  2. add_meta_boxes_postहुक आप Metabox के परिभाषित करने के लिए अनुमति देने के लिए, और

  3. wp_insert_post_dataहुक आपके द्वारा चयनित प्रोमो बक्से को पकड़ने और डेटाबेस के लिए बचाने के लिए अनुमति देने के लिए।

उन हुक में से प्रत्येक कक्षा में एक और स्थैतिक कार्य को संदर्भित करता है (ये वे कार्य थे जिन्हें मैं कक्षा बनाकर इनकैप्सुलेट कर रहा था।)

मैं action_init()फ़ंक्शन और मेरे make_labels()सहायक फ़ंक्शन का वर्णन करना छोड़ दूंगा, ताकि आप यह जान सकें कि आपके प्रश्न के आधार पर पोस्ट प्रकार कैसे पंजीकृत किया जाए।

action_add_meta_boxes_post()समारोह Metabox के वर्डप्रेस मुख्य कार्य का उपयोग कर पंजीकृत करता है add_meta_box()और मैं इसे के मानकों टिप्पणी की है समझाने के लिए कारण है कि मैं पारित कर दिया है कि मैं क्या प्रत्येक के लिए पारित कर दिया। कॉलबैक फ़ंक्शन the_little_promo_boxes_metabox()निश्चित रूप से कक्षा का एक और स्थिर कार्य है और यह वही है जो वास्तव में मेटाबॉक्स में सामग्री को प्रदर्शित करता है। यह मुख्य रूप wp_dropdown_pages()से प्रोमो कोर बॉक्स की एक सूची प्रदर्शित करने के लिए वर्डप्रेस कोर फ़ंक्शन का उपयोग करता है (ध्यान दें कि यह 'पेज' के अलावा अन्य पोस्ट प्रकारों को प्रदर्शित करेगा लेकिन केवल अगर उन्हें 'hierarchical'=>trueउनके पोस्ट प्रकार के पंजीकरण में चिह्नित किया जा रहा है। केवल पदानुक्रमित क्यों? क्योंकि यही तरीका है इसे लिखा, इसीलिए !!! :)

चूंकि हम तीन (3) ड्रॉपडाउन दिखा रहे हैं, हमें HTML ( "promo_box_{$i}") में प्रत्येक को एक अद्वितीय आईडी देने की आवश्यकता है, लेकिन वर्ग कोष्ठक ( 'promo_boxes[]') के साथ एक ही नाम है ताकि PHP उन्हें $_POSTचर के अंदर एक सरणी में इकट्ठा कर लेगा (जो वर्डप्रेस हमारे लिए उपयोग करता है; आप देखेंगे कि एक मिनट में कैसे) । और निश्चित रूप से हमें चयनित मूल्य ( (empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])) निर्धारित करने की आवश्यकता है यदि वास्तव में मूल्यों में से एक को पहले चुना गया था।

मैंने यह भी get_post_type_object()दिखाने के लिए वर्डप्रेस कोर फ़ंक्शन का उपयोग किया कि पोस्ट प्रकार से लेबल कैसे प्राप्त करें, और get_post_meta()कस्टम फ़ील्ड कुंजी '_promo_boxes' का उपयोग करने से प्रोमो बॉक्स आईडी की एक सरणी को पुनः प्राप्त करने के लिए वर्डप्रेस कोर फ़ंक्शन का उपयोग करके भी जो मैं आपको दिखाऊंगा। अगले को बचाने के लिए (ध्यान दें मैं नाम पर एक पूर्ववर्ती अंडरस्कोर इस्तेमाल किया '_promo_boxes'है जो उपयोगकर्ता पोस्ट संपादित कर रहा है जब मानक कस्टम फ़ील्ड यूआई से छिपाने के लिए वर्डप्रेस का कारण बनता है।)

कोड को देखने से पहले वर्णन करने के लिए अंतिम फ़ंक्शन filter_wp_insert_post_data()जो पहले पैरामीटर में मौजूदा पोस्ट डेटा ( $data) और $_POSTदूसरे पैरामीटर के रूप में वर्डप्रेस के लिए धन्यवाद धन्यवाद की सामग्री प्राप्त करता है $postarr। इस फ़ंक्शन के अंदर हम वर्डप्रेस कोर फ़ंक्शन को कॉल करते हैं update_post_meta()और सरणी (यानी ) द्वारा निर्दिष्ट पद के $postarr['promo_boxes']लिए कस्टम फ़ील्ड मान को बचाने के लिए प्रोमो बॉक्स सरणी ( ) को निकालते हैं ।'_promo_boxes'$_POST$postarr['ID']

उस ने कहा, यहाँ LittlePromoBoxesवर्ग के लिए कोड है :

class LittlePromoBoxes {
  static function on_load() {
    add_action('init',array(__CLASS__,'action_init'));
    add_action('add_meta_boxes_post',array(__CLASS__,'action_add_meta_boxes_post'));
    add_filter('wp_insert_post_data',array(__CLASS__,'filter_wp_insert_post_data'),10,2);
  }
  static function action_init() {
    register_post_type('promo-box',array(
      'labels'          => self::make_labels('Promo Box','Promo Boxes'),
      'public_queryable'=> false,
      'hierarchical'    => true,  // IMPORTANT!!! wp_dropdown_pages() requires 'hierarchical'=>true
      'show_ui'         => true,
      'query_var'       => false,
      'supports'        => array('title','editor','thumbnail','custom-fields'),
      'show_in_nav_menus'=>true,
      'exclude_from_search'=>true,
    ));
  }
  static function make_labels($singular,$plural=false,$args=array()) {
    if ($plural===false)
      $plural = $singular . 's';
    elseif ($plural===true)
      $plural = $singular;
    $defaults = array(
      'name'              =>_x($plural,'post type general name'),
      'singular_name'      =>_x($singular,'post type singular name'),
      'add_new'            =>_x('Add New',$singular),
      'add_new_item'      =>__("Add New $singular"),
      'edit_item'          =>__("Edit $singular"),
      'new_item'          =>__("New $singular"),
      'view_item'          =>__("View $singular"),
      'search_items'      =>__("Search $plural"),
      'not_found'          =>__("No $plural Found"),
      'not_found_in_trash'=>__("No $plural Found in Trash"),
      'parent_item_colon' =>'',
    );
    return wp_parse_args($args,$defaults);
  }
  static function action_add_meta_boxes_post($post) {
    add_meta_box(
      'little-promo-boxes',   // Metabox Name, used as the "id" for a wrapping div
      'Little Promo Boxes',   // Metabox Title, visible to the user
      array(__CLASS__,'the_little_promo_boxes_metabox'), // Callback function
      'post',                 // Add to the Edit screen for Post Types of 'post'  
      'side',                 // Show it in the sidebar (if center then it would be 'normal'
      'low'                   // Show it below metaboxes that specify 'high'
    );
  }
  static function the_little_promo_boxes_metabox($post) {
    $pto = get_post_type_object('promo-box');
    $default_options = array(
      'post_type' => 'promo-box',
      'show_option_none' => "Select a {$pto->labels->singular_name}",
    );
    $promo_boxes = get_post_meta($post->ID,'_promo_boxes',true);
    for($i=0; $i<=2; $i++) {
      wp_dropdown_pages(array_merge($default_options,array(
        'id'       => "promo_box_{$i}",
        'name'     => 'promo_boxes[]',
        'selected' => (empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i]),
      )));
    }
  }
  static function filter_wp_insert_post_data($data, $postarr) {
    update_post_meta($postarr['ID'],'_promo_boxes',$postarr['promo_boxes']);
    return $data;
  }
  static function get_promo_boxes($post=false) {
    static $promo_boxes=array();
    if (!$post)
      $post = $GLOBALS['post'];
    if (!isset($promo_boxes[$post->ID])) {
      $promo_boxes[$post->ID] = get_post_meta($post->ID,'_promo_boxes',true);
      $index = 0;
      foreach($promo_boxes[$post->ID] as $promo_box_id) {
        $promo_boxes[$post->ID][$index++] = (is_numeric($promo_box_id) ? get_post($promo_box_id) : false);
      }
    }
    return $promo_boxes[$post->ID];
  }
  static function get_promo_box($number,$post=false) {
    $promo_boxes = self::get_promo_boxes($post);
    return $promo_boxes[$number-1];
  }
}
LittlePromoBoxes::on_load();

अभी भी दो (2) स्थिर कार्यों का उल्लेख नहीं किया गया है: get_promo_boxes()और get_promo_box(); ये सहायक कार्य हैं जिनकी मदद से आप post_type='promo-box'उनके क्रम संख्या 1..3 के पदों को पुनः प्राप्त कर सकते हैं । लेकिन उन्हें और अधिक वर्डप्रेस बनाने के लिए जैसे कि आपके विषय की functions.phpफ़ाइल में जोड़ने के लिए दो आवरण कार्य हैं (ध्यान दें कि आप एक पोस्ट को एक पैरामीटर के रूप में पारित कर सकते हैं लेकिन आपको तब तक नहीं है जब तक आप एक अलग पोस्ट का उपयोग नहीं कर रहे हैं जो कि लूप में है ) :

function get_little_promo_boxes($post=false) {
  return LittlePromoBoxes::get_promo_boxes($post);
}
function get_little_promo_box($number,$post=false) {
  return LittlePromoBoxes::get_promo_box($number,$post);
}

अब आप single.phpकोड के साथ अपनी थीम फ़ाइल में इन दोनों कार्यों में से एक या दोनों को कॉल कर सकते हैं जो इस तरह दिख सकता है (यह कोड लूप में लिखा जा सकता था लेकिन ज्यादातर वर्डप्रेस थीम्स को कोड की नकल करना पसंद करते हैं ताकि वे अतिरेक को खत्म करने के बजाय इसे पढ़ सकें। तो, जब रोम में ...):

<?php
  $promo_boxes = get_little_promo_boxes();
  if (isset($promo_boxes[1]))
    echo '<div id="promo-box1" class="promo-box">' . get_the_title($promo_boxes[1]->ID) . '</div>';
  if (isset($promo_boxes[2]))
    echo '<div id="promo-box2" class="promo-box">' . get_the_title($promo_boxes[2]->ID) . '</div>';
  if (isset($promo_boxes[3]))
    echo '<div id="promo-box3" class="promo-box">' . get_the_title($promo_boxes[3]->ID) . '</div>';
?>

1
आप कभी भी मुझे अपने जवाबों से चकित करने की कोशिश नहीं करते, आप जिस प्रयास से कोड बनाने के लिए जाते हैं, और प्रत्येक चरण को समझाते हैं .. भयानक! (आपके छोटे डब्बों का उल्लेख भी मुझे मेरी पसंदीदा टीवी श्रृंखला में से एक के बारे में सोच रहा है) ..
t31os

1
@ t31os - धन्यवाद! जब मैं जवाब देना शुरू करता हूं तो मैं खुद को रोक नहीं पाता हूं। जुनूनी / मजबूर मुझे लगता है। लेकिन कम से कम मैं अच्छा उपयोग करने के लिए डाल रहा हूँ!
माइकस्किंकल

@toscho - धन्यवाद। हां, मैं शायद ही कभी हास्य में जोड़ता हूं कि जब यह मेरे पास आता है तो मैं विरोध नहीं कर सकता। :-)
माइकस्किंकेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.