साइडबार विजेट में कस्टम पोस्ट टाइप डेटा?


10

(ध्यान दें: यह प्रश्न मूल रूप से कस्टम फ़ील्ड के बारे में था, लेकिन @MikeSchinkel के पास कस्टम पोस्ट प्रकारों से बेहतर समाधान था)

मेरी साइट पर मेरे पास कई पृष्ठ हैं जो मैं उसी डेटा को साइडबार में दिखाना चाहता हूं। उदाहरण के लिए, इस तरह की संरचना में:

-Home
-Cars 
 -Volvo 850 overview 
 -Volvo 850 tech spec 
 -Volvo 850 pictures
 -Porsche 911 overview
 -Porsche 911 tech spec
 -Porsche 911 pictures
-Roads 
 -Route 66 overview 
 -Route 66 history 
 -Route 66 pictures
 -Pan-American Highway overview
 -Pan-American Highway history
 -Pan-American Highway pictures

मैं सभी वोल्वो 850 पेजों को साइडबार में समान डेटा दिखाने के लिए चाहूंगा, सभी पोर्श पेज डेटा का एक अलग सेट (उदाहरण के लिए स्पीड, मेकर, आदि) दिखाने के लिए।

रोड पेज में प्रत्येक सड़क के लिए डेटा का अपना सेट होगा। कारों और सड़कों का अपना पेज टेम्प्लेट भी होता है, और जिस तरह से मुझे लगता है कि इसे सही साइडबार मिलेगा वह साइडबार के भीतर कुछ इस तरह है।

if ( is_page_template('car-profile-template.php') ) :
// show car widgets

यहाँ एक उदाहरण पृष्ठ, वोल्वो 850 चित्र पृष्ठ है। वही (बाएं) साइडबार अन्य वोल्वो 850 पृष्ठों पर दिखाई देना चाहिए, जबकि दाईं ओर सामान सिर्फ पृष्ठ सामग्री है।

|  Home   Cars   Roads                                |
--------------------------------------------------------
|   Overview     |     Volvo 840 Pictures              |
|   Tech Spec    |    (some pics)                      |
|  Pictures     |                                     |
------------------                                     |
| -Specs-        |                                     |
| Volvo 850      |                                     |
| Speed:150mph   |                                     |
| Maker:Volvo    |                                     |  
| Download PDF   |                                     |
------------------                                     |
| -Rating-       |                                     |
| Style:3        |                                     |
| Safety:5       |                                     |
| Reliablity:4   |                                     |
------------------                                     |

इस उदाहरण में, दो साइडबार विजेट, चश्मा और रेटिंग को कस्टम पोस्ट प्रकार से अपनी जानकारी प्राप्त करनी चाहिए। क्या कोई विधि है, जो अंत-उपयोगकर्ता को संपादित करने के लिए आसान होगी, जिसका अर्थ है कि उन्हें केवल एक बार इस कस्टम डेटा को दर्ज करना होगा? यह आवश्यक नहीं है कि प्रत्येक क्षेत्र अलग-अलग हो (अर्थात सभी एडिटर को एक एडिटर फ़ील्ड में दर्ज किया जा सकता है, और सभी रेटिंग को एक्सर्ट फ़ील्ड में रखा जा सकता है .. शायद)


2
अच्छा सवाल और वास्तव में आपके संपादन शीर्षक की सराहना की और स्पष्टता के लिए यह सवाल किया; यह उन लोगों की मदद करेगा जिनके पास भविष्य में इसी तरह का प्रश्न है।
माइकशिन्कल

जवाबों:


14

अपडेट करें:

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

यदि आप इसे बस करना चाहते हैं तो single-car.phpनीचे दिए गए टेम्प्लेट फ़ाइल में साइडबार को केवल हार्डकोड करें और फिर ifअलग URL के लिए कौन सी सामग्री प्रदर्शित करें यह निर्धारित करने के लिए अपने कथन का उपयोग करें । आप अपने साइडबार को विजेट करने और एक कस्टम विजेट विकसित करने के प्रयास में जा सकते हैं, जहां विजेट वर्तमान पोस्ट आईडी के लिए जानकारी खींचेगा, लेकिन जब तक आप इसे अन्य लोगों के उपयोग के लिए एक विषय के रूप में नहीं बना रहे हैं?

वास्तव में इसे पूरा करने के लिए अलग-अलग तरीकों का एक गुच्छा है, लेकिन मैं जो सुझाव दे रहा हूं वह आपकी आवश्यकताओं के लिए आश्चर्यजनक रूप से होना चाहिए।


हाय @cannyboy:

मुझे वास्तव में पता नहीं है कि पोस्टों में कस्टम फ़ील्ड साझा करने का सबसे अच्छा तरीका क्या होगा। लेकिन यह सिर्फ लाल झंडा हो सकता है जिसकी आपको जरूरत है। अगर कुछ बहुत मुश्किल लगता है ...

एक वैकल्पिक दृष्टिकोण?

... आप इसे अलग तरह से वास्तुशिल्प कर सकते हैं ? मुझे लगता है कि आप ज्यादा बेहतर बनाने के लिए एक बंद हो जाएगा कस्टम पोस्ट प्रकार की "कार" और फिर आप प्रत्येक के लिए सब कुछ स्टोर कर सकते हैं "पृष्ठ" एक कार पोस्ट प्रकार में। यहां कुछ सैंपल URL दिए गए हैं:

http://example.com/cars/volvo850/  <-- overview
http://example.com/cars/volvo850/tech-specs/
http://example.com/cars/volvo850/pictures/

कस्टम पोस्ट प्रकारों के बारे में सीखना

आप इन सवालों के जवाब में कस्टम पोस्ट प्रकारों के बारे में अधिक जान सकते हैं:

एक कस्टम पोस्ट प्रकार और एक पुनर्व्यवस्थित नियम

कस्टम पोस्ट प्रकार और कई पृष्ठों को लागू करने के लिए आप निम्नलिखित कोड की तरह कोड का उपयोग करेंगे जो आपके "कार" कस्टम पोस्ट प्रकार को पंजीकृत करता है और फिर आपके कार पृष्ठों के लिए एक पुनर्लेखन नियम निर्धारित करता है । इस कोड को अपनी थीम की functions.phpफ़ाइल में या एक प्लगइन में रखें, जो भी आप चाहें:

<?php
add_action('init','car_init');
function car_init() {
  register_post_type('car',
    array(
      'label'           => 'Cars',
      'public'          => true,
      'show_ui'         => true,
      'query_var'       => 'car',
      'rewrite'         => array('slug' => 'cars'),
      'hierarchical'    => true,
      //'supports'        => array('title','editor','custom-fields'),
    )
  );
  global $wp,$wp_rewrite;
  $wp->add_query_var('car-page');
  $wp_rewrite->add_rule('cars/([^/]+)/(tech-specs|pictures)','index.php?car=$matches[1]&car-page=$matches[2]', 'top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

एक कार- विशिष्ट थीम टेम्पलेट फ़ाइल

फिर आपको अपने विषय में कार- विशिष्ट टेम्पलेट फ़ाइल की आवश्यकता होगी ; इसके लिए डिफ़ॉल्ट नाम होगा single-car.php। मुझे लगता है कि यूआरएल (तीनों renders आप के लिए एक स्टार्टर टेम्प्लेट कोड जोड़ने के बाद (अवलोकन) , 'तकनीक चश्मा' और 'चित्र' एक का उपयोग करके) एक टेम्पलेट में अगर निर्धारित करने के लिए जो सामग्री रेंडर करने के बयान:

<?php get_header(); ?>
<div id="container">
  <div id="content">
  <?php if ( have_posts() ): the_post(); ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <h1 class="entry-title"><?php the_title(); ?></h1>
    <div class="entry-content">
<?php if(is_car_techspecs()): ?>
  <a href="..">Back</a>
  <h1>Tech Specs</h1>
  The tech specs go here!
  <?php get_post_meta($post->ID,'_car_tech_specs'); ?>
<?php elseif (is_car_pictures()): ?>
  <a href="..">Back</a>
  <h1>Pictures</h1>
  Car Pictures go here!
  <?php get_post_meta($post->ID,'_car_pictures'); ?>
<?php else: ?>
  <ul>
    <h1>Overview</h1>
    <li><a href="tech-specs/">Tech Specs</a></li>
    <li><a href="pictures/">Pictures</a></li>
  </ul>
  <?php the_content(); ?>
<?php endif; ?>
      <?php the_content(); ?>
    </div>
  <?php endif; ?>
  </div>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

ऊपर दिए गए उदाहरण में ध्यान दें कि मैं के उपयोग के साथ बहुत सरल हो रहा हूं get_post_meta(); वास्तविक साइट को वहां बहुत अधिक जटिलता की आवश्यकता होगी।

टेम्प्लेट टैग उर्फ ​​हेल्पर फ़ंक्शंस

बेशक, मैंने कुछ टेम्पलेट टैग्स का उपयोग किया है उर्फ ​​हेल्पर फ़ंक्शन यदि कथन की शर्तों में टेम्पलेट फ़ाइल में जटिलता को कम करने के लिए । यहां वे हैं और आप इन्हें अपनी थीम की functions.phpफ़ाइल में भी डाल सकते हैं:

function is_car_techspecs() {
  global $wp_query;
  return is_car_page('tech-specs');
}
function is_car_pictures() {
  global $wp_query;
  return is_car_page('pictures');
}

function is_car_page($page) {
  global $wp_query;
  return (isset($wp_query->query['car-page']) && $wp_query->query['car-page']==$page);
}

स्क्रीनशॉट कस्टम पोस्ट प्रकार के प्यार से भरा है

एक बार जब आपके पास वह सब कोड हो जाता है और आपने वोल्वो 850 जैसी कार पोस्ट जोड़ ली है , तो आप इसे निम्न स्क्रीनशॉट की तरह काम कर सकते हैं:

अवलोकन पृष्ठ

http://example.com/cars/volvo850/
(स्रोत: mikeschinkel.com )

टेक चश्मा पृष्ठ

http://example.com/cars/volvo850/tech-specs/

चित्र पेज

http://example.com/cars/volvo850/pictures/


1
बहुत अच्छा। आप इसे कैसे सेट करेंगे ताकि तकनीकी ऐनक आदि की जानकारी गतिशील हो (बजाय आपके उदाहरण के, हार्ड कोडित)?
ट्रैविस नॉर्थकट

1
यह एक मुश्किल सवाल है, इसलिए मुझे आपके उपयोग-मामले को समझने की आवश्यकता है या यदि यह सिर्फ एक काल्पनिक काल्पनिक है? मैं ऐसा कर सकता हूं क्योंकि मैं संभावित मैचों की सीमित सूची जानता हूं। यदि यह "कुछ भी मैच" होता तो यह वर्डप्रेस के अन्य मैच पैटर्न को ओवरराइड करता। मुझे एक ठोस उदाहरण दें और मैं एक समाधान दूंगा अन्यथा यह कीड़े का एक कैन है।
माइकस्किंकल

आपके अद्भुत जवाब के लिए धन्यवाद। मैंने पहले कस्टम पोस्ट प्रकारों में कभी नहीं खोदा था, और वे एक आदर्श समाधान की तरह लगते हैं। मैंने कुछ और बारीकियों के साथ अपना प्रश्न अपडेट किया है, मुख्यतः साइडबार / विजेट्स के साथ करने के लिए
cannyboy

@ माइक बस एक काल्पनिक है। विस्तृत करने के लिए - मैं सोच रहा हूं कि आप इसे कैसे सेट कर सकते हैं (उदाहरण के लिए) तकनीकी चश्मा पृष्ठ पर जानकारी को व्यवस्थापक डैशबोर्ड में कहीं दर्ज किया गया है (एक कस्टम पोस्ट प्रकार, शायद, कार सेट करने के लिए एक वर्गीकरण का उपयोग करके?)। टेम्प्लेट फ़ाइल में विरोध किया गया है।
ट्रैविस नॉर्थकट

@tnorthcutt - मेरा मानना ​​है कि जब आप "तकनीकी ऐनक पृष्ठ पर जानकारी" कहते हैं, तो आपका मतलब "उप-पृष्ठों की सूची है?" या क्या आपका मतलब है कस्टम फील्ड्स? यदि बाद वाले ने मुझे मान लिया कि सूचना कस्टम क्षेत्रों में संग्रहीत की जाएगी। मेरा उदाहरण यह नहीं दिखा; शायद यह होना चाहिए?
माइकस्किंकेल 20

1

मुझे लगता है कि किसी ने आपके द्वारा पोस्ट किए गए दूसरे प्रश्न (मूल पृष्ठ / मध्यवर्ती पृष्ठों के बारे में) पर पहले ही इस तरह का उत्तर दिया हो सकता है, लेकिन यहां मैंने जो आपके डेटा को बनाने का सबसे अच्छा तरीका सोचा है, वह आपके द्वारा वर्णित के आधार पर है:

 - Home
 - Volvo 850 (overview)
   - Volvo 850 tech spec
   - Volvo 850 pictures
 - Porsche 911 (overview)
   - Porsche 911 tech spec
   - Porsche 911 pictures

इस तरह से आपको केवल एक बार मेटा फ़ील्ड में प्रवेश करना होगा - मूल पृष्ठ पर - और बच्चों के पृष्ठों पर आप माता-पिता से उस मेटा डेटा को खींच सकते हैं:

<?php echo 'Top speed: '.get_post_meta($post->post_parent,'Top Speed',true); ?>

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

अधिक जानकारी...

मैंने इसे कुछ अलग तरीके से किया है। एक साइट में जहां मेरे पास एक कस्टम पोस्ट प्रकार के रूप में एजेंट (कंपनी प्रतिनिधि) थे, मैंने उनके पोस्ट का उपयोग उस व्यक्ति से संबंधित सभी डेटा को संग्रहीत करने के लिए किया था, लेकिन वास्तव में उस पृष्ठ को प्रदर्शित नहीं किया। इसके बजाय, मेरे पास एक "एजेंट लिस्टिंग" पृष्ठ, एक "एजेंट प्रदर्शन रिकॉर्ड" पृष्ठ, और एक "संपर्क इस एजेंट" पृष्ठ था, जिसे हमेशा GET चर के साथ बुलाया जाता था और उपयुक्त पोस्ट से बाहर की जानकारी प्रदर्शित की जाती थी। तो पर्मलिंक साइट . com/agent-listing/ ? agent=john-smith जैसा कुछ दिखाई देगा ।

किसी अन्य साइट में, मैंने एक पृष्ठ पर सभी जानकारी सेट की और उस पृष्ठ के सभी तीन दृश्य पृष्ठ टेम्पलेट में बनाए। आपके मामले में, यह site.com/cars/volvo-850/?pictures जैसा कुछ दिखाई देगा ।

और पेज टेम्प्लेट में आप सामग्री के शीर्ष के पास उस चर के लिए एक चेक शामिल करेंगे:

if ($_GET['pictures']) {

 // template for pictures page

} else if ($_GET['tech-spec']) {

 // template for tech specs page 

} else {

 // overview template

}

आपका बहुत बहुत धन्यवाद! अपने अंतिम सुझाव के लिए, क्या मेरा मतलब है कि मैं एक रिक्त पृष्ठ बनाता हूं (जिसे शायद 'वोल्वो 850 विजेट डेटा' कहा जाता है) जिसमें ये सभी कस्टम फ़ील्ड हैं, और अन्य वोल्वो 850 पृष्ठ स्वचालित रूप से इस डेटा (एर, किसी तरह) को हड़प लेते हैं? (इसका मतलब है कि मुझे मैन्युअल रूप से मेनू> मेनू में निर्माण करना होगा, जो मैं वैसे भी कर रहा हूं) ... या शायद डेटा को अवलोकन पृष्ठ के कस्टम फील्ड्स से पकड़ा जा सकता है ...
cannyboy

मैंने इसे दोनों तरह से किया है। मैंने समझाने के लिए ऊपर अपना उत्तर संपादित किया। आप जो कर रहे हैं वह बहुत कुछ इस बात पर निर्भर करता है कि आप अपने मेनू निर्माण को कितना स्वचालित चाहते हैं, जैसा आपने कहा।
गोल्डनएपल्स

उफ़। मैंने अभी आगे पढ़ा और महसूस किया कि माइक ने पहले ही जवाब दे दिया था कि मैं क्या कह रहा हूं।
गोल्डनएपल्स

0

यदि आप कस्टम पोस्ट प्रकार नहीं बनाना चाहते हैं, और आप बस प्रत्येक पेज या पोस्ट के लिए एक कस्टम साइडबार शामिल करना चाहते हैं, तो आप ग्रेसफुल साइडबार प्लगइन का उपयोग कर सकते हैं। यह कस्टम साइडबार कंटेंट को पोस्ट या पेज एडिट स्क्रीन के भीतर से अतिरिक्त फ़ील्ड बनाते हुए सही बनाता है जिसे ग्रेसफुल शीर्षक और ग्रेसफुल कंटेंट कहा जाता है। ये तब साइडबार क्षेत्र में एक विजेट के रूप में प्रदर्शित होते हैं जब यह पोस्ट या पेज आपके ब्लॉग पर प्रदर्शित किया जा रहा होता है। इस प्लगइन के बारे में अधिक जानकारी http://www.mlynn.org/graceful-sidebar-plugin पर उपलब्ध है

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