問題描述
(注意:這個問題最初是關於自定義字段,但是 @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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。


