問題描述

(注意:這個問題最初是關於自定義欄位,但是 @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 等) 。

道路頁面將為每條道路擁有自己的資料集。汽車和道路也會有自己的頁面模板,而我的方式,我會得到右側邊欄是這樣的 sidebar.php:

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   |                                     |
------------------                                     |

在這個例子中,兩個側邊小工具 Specs 和 Rating 應該從 Custom Post Type 獲取它們的資訊。有沒有一種方法,這對 end-user 來說很容易編輯,這意味著他們只需要輸入一次這樣的自定義資料:每個欄位可能不是必需的 (即所有的 Spec 都可以在 「編輯器」 欄位中輸入,並且所有的 「評級」 都可以放在 「摘錄」 欄位中。也許)

最佳解決方案

更新:

根據問題的更新,我想我需要明確指出,問題的問題可以透過下面的答案來完成,只是在”Car” 自定義帖子型別中使用自定義欄位,以便您希望在所有頁面上顯示的每個專案給一輛汽車

如果你想這樣做,只需將邊欄硬編碼到 single-car.php 模板檔案中,我包含在下面,然後使用您的 if 語句來確定哪些內容顯示不同的 URL 。您可以嘗試將邊欄放大,並開發自定義視窗小工具,其中視窗小工具將拉取當前帖子 ID 的資訊,但為什麼除非將其作為主題供其他人使用?

實際上有一些微妙的不同的方式來完成這個,但我建議的應該奇妙地想知道你的需要。


嗨 @cannyboy:

實際上我不知道最好的方式是跨職位分享自定義欄位。但這可能只是你需要的紅旗。如果有東西似乎太難了…

替代方法?

你可以改變建築風格嗎?我想你會建立”Car” 的自定義帖子型別,然後您可以將每個”page” 的所有內容儲存到一個汽車帖子型別。以下是一些示例網址:

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

瞭解自定義帖子型別

您可以在以下問題的答案中瞭解有關自定義帖子型別的更多資訊:

自定義帖子型別和重寫規則

要實現自定義帖子型別和多個頁面,您將使用以下程式碼註冊您的”Car” 自定義帖子型別,然後為您的車頁設定重寫規則。將此程式碼放在主題的 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
}

一個 Car-specific 主題模板檔案

那麼你將需要一個 Car-specific 模板檔案在你的主題; 其預設名稱為 single-car.php 。我已經編寫了一個啟動器模板,透過使用 if 語句來確定要呈現的內容,在一個模板中呈現所有三個 URL((概述),’tech-specs’ 和’pictures’)

<?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(); 真正的網站將需要更多的複雜性。

模板標籤 a.k.a. 幫助功能

當然,我使用一些模板標籤 a.k.a. 幫助函式來最小化 if 語句條件中模板檔案的複雜性。在這裡,您可以將它們放在主題的 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,你可以得到它像以下截圖:

概述頁

技術規格頁

圖片頁面

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。