ข้อมูลประเภทโพสต์ที่กำหนดเองในวิดเจ็ต Sidebar?


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 หน้าทั้งหมดแสดงข้อมูลเดียวกันในแถบด้านข้างหน้าเพจปอร์เช่ทั้งหมดเพื่อแสดงชุดข้อมูลที่แตกต่างกัน (เช่น Speed, Maker, เป็นต้น)

หน้าถนนจะมีชุดข้อมูลของตัวเองสำหรับแต่ละถนน Cars และ Roads จะมีเทมเพลตหน้าของตัวเองและวิธีที่ฉันคิดว่ามันจะได้รับแถบด้านข้างที่เหมาะสมคือสิ่งที่อยู่ภายใน sidebar.php:

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

นี่คือหน้าตัวอย่างหน้าภาพ Volvo 850 แถบด้านข้างซ้าย (เดียวกัน) ควรปรากฏในหน้าอื่น ๆ ของ Volvo 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   |                                     |
------------------                                     |

ในตัวอย่างนี้วิดเจ็ตแถบข้างสองรายการ Specs และ Rating ควรได้รับข้อมูลจากประเภทโพสต์ที่กำหนดเอง มีวิธีการใดที่ผู้ใช้ปลายทางจะสามารถแก้ไขได้ง่ายซึ่งหมายความว่าพวกเขาจะต้องป้อนข้อมูลที่กำหนดเองนี้เพียงครั้งเดียว? อาจไม่จำเป็นสำหรับแต่ละฟิลด์ที่จะแยก (เช่นสเป็คทั้งหมดสามารถป้อนภายในฟิลด์ตัวแก้ไขและการจัดเรตทั้งหมดสามารถใส่ในฟิลด์ข้อความที่ตัดตอนมา .. อาจจะ)


2
คำถามที่ดีและชื่นชมการแก้ไขชื่อและเนื้อหาคำถามของคุณเพื่อความชัดเจน; มันจะช่วยคนอื่นที่มีคำถามคล้ายกันในอนาคต
MikeSchinkel

คำตอบ:


14

UPDATE:

จากการอัปเดตคำถามฉันคิดว่าฉันต้องระบุอย่างชัดเจนว่าสิ่งที่ถามในคำถามสามารถทำได้ด้วยคำตอบด้านล่างเพียงใช้ฟิลด์ที่กำหนดเองในประเภทโพสต์ที่กำหนดเอง"รถยนต์"สำหรับรายการที่คุณต้องการแสดง หน้าทั้งหมดสำหรับรถยนต์ที่กำหนด

หากคุณต้องการที่จะทำมันเพียงแค่ hardcode แถบด้านข้างลงในsingle-car.phpไฟล์เทมเพลตที่ฉันรวมไว้ด้านล่างแล้วใช้ifคำสั่งของคุณเพื่อกำหนดเนื้อหาที่จะแสดงสำหรับ URL ที่แตกต่างกัน คุณสามารถไปที่วิดเจ็ตแถบด้านข้างของคุณและพัฒนาวิดเจ็ตที่กำหนดเองซึ่งวิดเจ็ตจะดึงข้อมูลสำหรับรหัสโพสต์ปัจจุบัน แต่ทำไมทั้งคู่เว้นเสียแต่ว่าคุณจะสร้างเป็นธีมสำหรับคนอื่น ๆ

จริงๆแล้วมีหลายวิธีที่แตกต่างกันอย่างละเอียดในการทำสิ่งนี้ แต่วิธีที่ฉันแนะนำนั้นน่าแปลกใจสำหรับความต้องการของคุณ


สวัสดี@canboyboy:

จริง ๆ แล้วฉันไม่ทราบว่าวิธีที่ดีที่สุดคือการแบ่งปันฟิลด์ที่กำหนดเองในโพสต์ แต่นั่นอาจเป็นธงสีแดงที่คุณต้องการ หากบางสิ่งดูเหมือนยากเกินไปอาจจะ ...

แนวทางอื่นหรือไม่?

... คุณสามารถเปลี่ยนมันให้แตกต่างได้ไหม? ฉันคิดว่าคุณจะดีกว่ามากในการสร้างประเภทโพสต์ที่กำหนดเองของ"รถยนต์"และจากนั้นคุณสามารถจัดเก็บทุกสิ่งสำหรับ"หน้า"แต่ละประเภทไว้ในประเภทโพสต์รถยนต์หนึ่งรายการ นี่คือตัวอย่าง 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
}

รถ -specific ธีมแม่แบบไฟล์

แล้วคุณจะต้องมีรถยนต์แฟ้มแม่ -specific ในธีมของคุณ ; single-car.phpชื่อเริ่มต้นสำหรับเรื่องนี้จะเป็น ฉันได้เขียนเทมเพลตเริ่มต้นสำหรับคุณที่แสดง URL ทั้งสาม ( (ภาพรวม) , 'ข้อมูลจำเพาะทางเทคนิค'และ'รูปภาพ' ) ในเทมเพลตเดียวโดยใช้คำสั่งifเพื่อพิจารณาว่าจะแสดงเนื้อหาใด:

<?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(); ไซต์จริงจะต้องมีความซับซ้อนมากกว่านั้น

แท็กเทมเพลต aka ฟังก์ชันผู้ช่วย

แน่นอนว่าฉันใช้ฟังก์ชันแท็กเทมเพลต aka helper เพื่อลดความซับซ้อนในไฟล์เทมเพลตในเงื่อนไขif statement ที่นี่พวกเขาอยู่และคุณสามารถใส่สิ่งเหล่านี้ลงใน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);
}

ภาพหน้าจอที่เต็มไปด้วยความรักประเภทโพสต์ที่กำหนดเอง

เมื่อคุณมีรหัสนั้นและคุณได้เพิ่มโพสต์รถยนต์เช่นVolvo 850คุณสามารถทำให้มันทำงานเหมือนภาพหน้าจอต่อไปนี้:

หน้าภาพรวม

http://example.com/cars/volvo850/
(ที่มา: mikeschinkel.com )

หน้าข้อมูลจำเพาะทางเทคนิค

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

หน้ารูปภาพ

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


1
ดีมาก. คุณจะตั้งค่าอย่างไรเพื่อให้รายละเอียดทางเทคนิคและข้อมูลอื่น ๆ เป็นแบบไดนามิก (แทนที่จะเขียนโค้ดแบบยาก ๆ ในตัวอย่างของคุณ)
Travis Northcutt

1
นั่นเป็นคำถามที่ยุ่งยากดังนั้นฉันต้องเข้าใจกรณีการใช้งานของคุณหรือถ้ามันเป็นเพียงข้อสรุปเชิงนามธรรม? ฉันสามารถทำสิ่งนี้เพราะฉันรู้ว่ารายการที่แน่นอนของการแข่งขันที่อาจเกิดขึ้น หากเป็น "จับคู่อะไร" มันจะแทนที่รูปแบบการจับคู่อื่น ๆ ของ WordPress ยกตัวอย่างที่เป็นรูปธรรมมาให้ฉันและฉันจะให้วิธีแก้ปัญหาไม่งั้นมันจะเป็นหนอน
MikeSchinkel

ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมของคุณ ฉันไม่เคยขุดเป็น Custom Post Types มาก่อนและพวกเขาดูเหมือนเป็นทางออกที่ดีที่สุด ฉันได้อัปเดตคำถามของฉันโดยมีข้อมูลเฉพาะเพิ่มเติมอีกสองสามข้อส่วนใหญ่เกี่ยวกับแถบด้านข้าง / วิดเจ็ต
cannyboy

@ ไมค์เพียงแค่สมมุติ หากต้องการอธิบายอย่างละเอียด - ฉันสงสัยว่าคุณสามารถตั้งค่าได้อย่างไรเพื่อให้ข้อมูลในหน้าข้อมูลจำเพาะทางเทคนิค (ตัวอย่าง) ถูกป้อนลงในแผงควบคุมของผู้ดูแลระบบบางแห่ง (ประเภทโพสต์ที่กำหนดเองอาจใช้ taxonomy เพื่อตั้งค่ารถ)? ตรงข้ามกับในไฟล์เทมเพลต
Travis Northcutt

@tnorthcutt - ฉันถือว่าเมื่อคุณพูดว่า "ข้อมูลในหน้าข้อมูลจำเพาะทางเทคนิค" คุณหมายถึง "รายการหน้าย่อย" หรือคุณหมายถึงฟิลด์ที่กำหนดเอง หากหลังฉันสันนิษฐานว่าข้อมูลจะถูกเก็บไว้ในฟิลด์ที่กำหนดเอง ตัวอย่างของฉันไม่ได้แสดงว่า; บางทีมันควรจะมี?
MikeSchinkel

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 ที่ส่งผ่านไปยังหน้าเว็บและใช้ใน เทมเพลตหน้าเป็นสวิตช์เพื่อกำหนดเทมเพลตที่จะแสดง ด้วยวิธีนี้คุณสามารถหลีกเลี่ยงการทำซ้ำข้อมูลได้อย่างสมบูรณ์และทำให้ง่ายขึ้นในการเพิ่มข้อมูลเพิ่มเติมลงในเทมเพลตในภายหลัง ...

รายละเอียดเพิ่มเติม...

ฉันทำไปหลายวิธีแล้ว ในเว็บไซต์เดียวที่ฉันมีตัวแทน (บริษัท ตัวแทน) เป็นประเภทโพสต์ที่กำหนดเองฉันใช้โพสต์ของพวกเขาเพื่อเก็บข้อมูลทั้งหมดที่เกี่ยวข้องกับบุคคลนั้น แต่ไม่เคยแสดงหน้านั้นจริง ๆ แต่ฉันมีหน้า "รายชื่อตัวแทน" หน้า "บันทึกประสิทธิภาพตัวแทน" และหน้า "ติดต่อตัวแทนนี้" ซึ่งมักจะถูกเรียกพร้อมกับตัวแปร GET และแสดงข้อมูลจากโพสต์ที่เหมาะสม ดังนั้นความคิดเห็นจะมีลักษณะบางอย่างเช่นsite.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

}

ขอบคุณมาก! สำหรับคำแนะนำสุดท้ายของคุณคุณหมายถึงฉันสร้างหน้าว่าง (เรียกว่า 'ข้อมูลเครื่องมือของ Volvo 850') ซึ่งมีฟิลด์ที่กำหนดเองทั้งหมดและหน้าอื่น ๆ ของ Volvo 850 จะดึงข้อมูลนี้โดยอัตโนมัติ (อย่างใด) (ที่นี้หมายถึงฉันต้องสร้างเมนูด้วยตนเองในลักษณะ> เมนูที่ฉันทำอยู่แล้ว) ... หรือบางทีอาจจะเป็นข้อมูลที่สามารถคว้าจากหน้าภาพรวมของฟิลด์ที่กำหนดเอง ...
cannyboy

ฉันทำได้ทั้งสองวิธี ฉันแก้ไขคำตอบของฉันด้านบนเพื่ออธิบาย สิ่งที่คุณทำขึ้นอยู่กับว่าคุณต้องการให้การสร้างเมนูเป็นไปโดยอัตโนมัติอย่างไรอย่างที่คุณพูด
goldenapples

อุ่ย ฉันเพิ่งอ่านต่อไปและตระหนักว่าไมค์ตอบว่าฉันกำลังพูดอะไรอยู่
goldenapples

0

หากคุณไม่ต้องการสร้างประเภทโพสต์ที่กำหนดเองและคุณต้องการรวมแถบด้านข้างที่กำหนดเองสำหรับแต่ละหน้าหรือโพสต์คุณสามารถใช้ปลั๊กอิน Sidebar ที่สง่างาม ซึ่งช่วยให้สร้างเนื้อหาในแถบด้านข้างที่กำหนดเองได้จากภายในหน้าจอแก้ไขโพสต์หรือหน้าโดยใช้ฟิลด์เพิ่มเติมที่เรียกว่าชื่อที่สง่างามและเนื้อหาที่สง่างาม สิ่งเหล่านี้จะปรากฏในพื้นที่แถบด้านข้างเป็นวิดเจ็ตเมื่อโพสต์หรือหน้านี้แสดงในบล็อกของคุณ ข้อมูลเพิ่มเติมเกี่ยวกับปลั๊กอินนี้มีอยู่ที่http://www.mlynn.org/graceful-sidebar-plugin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.