हे, तुम एक नौसिखिया हो! हम फिर से चीर के लिए चीर रहे हैं ...!
j / k :) हम यहाँ आपके लिए सभी खुशियों के लिए हार्दिक स्वागत करते हैं।
तो यह तीसरी बार है जब मैंने इस आवश्यकता को सुना है, ग्राहकों से दो बार और फिर से आपसे (और आपके ग्राहक।) जो मुझे बताता है कि यह एक सामान्य आवश्यकता है।
मुझे आपका विश्लेषण पसंद आया, इसलिए मैंने आपकी दूसरी बात को संबोधित करने के लिए एक वर्ग कोड करने का फैसला किया। मैंने इसे बुलाया LittlePromoBoxes
क्योंकि मैं इस गीत को अपने सिर से कभी नहीं निकाल सकता, उनके लिए धन्यवाद । मूल रूप से मैं वर्ग का उपयोग करने के लिए एनकैप्सुलेट करता हूं अन्यथा संभावित नामकरण के कार्यों से बचने के लिए जिन्हें मुझे लिखना होगा।
आप इस वर्ग को अपनी थीम की functions.php
फ़ाइल में या किसी प्लगइन के .PHP फ़ाइल में रख सकते हैं जिसे आप लिख रहे होंगे (लेकिन चिंता न करें, यह इससे कहीं अधिक जटिल है।)
पहला कार्य on_load()
एक स्थिर कार्य है, जिसे मैं कक्षा के अंत में तीन (3) हुक को आरंभ करने के लिए कहता हूं, जिसकी आपको आवश्यकता होगी (फ़ि स्टैटिक फ़ंक्शन अनिवार्य रूप से वर्ग से संबंधित कार्य हैं , उदाहरण नहीं) :
init
हुक रजिस्टर करने के लिए promo-box
पोस्ट प्रकार,
add_meta_boxes_post
हुक आप Metabox के परिभाषित करने के लिए अनुमति देने के लिए, और
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>';
?>