问题描述
(注意:这个问题最初是关于自定义字段,但是 @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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。