问题描述

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