it-swarm.cn

补充工具栏小部件中的自定义帖子类型数据?

(注意:这个问题最初是关于自定义字段的,但是@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

我希望所有Volvo 850页面在侧边栏中显示相同的数据,所有保时捷页面都显示不同的数据集(例如Speed,Maker等)。

道路页面将为每条道路拥有自己的一组数据。汽车和道路也有自己的页面模板,我认为它会得到右侧边栏的方式就像在sidebar.php中这样:

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

这是一个示例页面,Volvo 850 Pictures页面。相同(左)侧边栏应出现在其他沃尔沃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   |                                     |
------------------                                     |

在此示例中,两个侧边栏小部件,规格和评级应该从自定义帖子类型获取其信息。是否有一种方法,最终用户可以轻松编辑,这意味着他们只需要输入一次这个自定义数据?可能没有必要将每个字段分开(即,可以在Editor字段中输入所有Spec,并且可以将所有Rating放入摘录字段中......也许)

10
cannyboy

更新:

根据问题的更新,我认为我需要明确说明问题中的问题可以通过以下答案完成,只需在“Car”自定义帖子类型中使用自定义字段您希望在给定汽车的所有页面上显示的项目。

如果你想这样做,只需将侧边栏硬编码到我下面包含的single-car.php模板文件中,然后使用if语句确定要为不同的URL显示哪些内容。您可以努力将侧边栏小工具化并开发一个自定义窗口小部件,其中窗口小部件将提取当前帖子ID的信息,但除非您将其构建为其他人使用的主题,否则为什么要这样做?

实际上有一些微妙的不同方法来完成这个,但我建议的那个方法应该奇妙地满足你的需求。


@cannyboy:

我实际上不知道在帖子之间共享自定义字段的最佳方式是什么。但那可能只是你需要的红旗。如果事情看起来太难了也许......

一种替代方法?

...你可以发声以不同的方式构建它?我认为你创建一个自定义帖子类型“Car”会好得多,然后你可以为每个人存储一切“page”进入一个Car post类型。以下是一些示例网址:

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特定的主题模板文件

然后你将在你的主题中需要一个Car特定的模板文件;这个的默认名称是single-car.php。我为你编写了一个初学者模板,它渲染了所有三个URL ((概述)'tech-specs''pictures')在一个模板中使用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()非常简单;真实网站需要有更多的复杂性。

模板标签a.k.a.帮手功能

当然,我使用了一些模板标签a.k.a. helper函数来最小化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);
}

截图充满自定义帖子类型爱

一旦你拥有了所有代码并且你添加了一个Car post,如Volvo 850你就可以像下面的截图一样工作:

概述页面

http://example.com/cars/volvo850/ 
(来源: mikeschinkel.com

技术规格

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

图片页面

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

14
MikeSchinkel

我想有人可能已经在你发布的另一个问题(关于父页面/中间页面)上回答了这个问题,但是根据你所描述的内容,我认为构建数据的最佳方法是:

 - 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

}
1
goldenapples

如果您不想创建自定义帖子类型,并且只想为每个页面或帖子添加自定义侧边栏,则可以使用Graceful Sidebar插件。这样就可以使用称为优雅标题和优雅内容的其他字段直接在帖子或页面编辑屏幕中创建自定义侧边栏内容。然后,当您在博客上显示此帖子或页面时,这些内容将作为窗口小部件显示在侧边栏区域中。有关此插件的更多信息,请访问 http://www.mlynn.org/graceful-sidebar-plugin

0
Michael Lynn