边栏小部件中的自定义帖子类型数据?


10

(注意:这个问题最初是关于“自定义字段”的,但是@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页面在边栏中显示相同的数据,所有Porsche的页面都显示不同的数据集(例如Speed,Maker等)。

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

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

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

在此示例中,两个侧边栏小部件“规格”和“评级”应从“自定义帖子类型”中获取其信息。有没有一种方法可以使最终用户轻松编辑,这意味着他们只需要输入一次此自定义数据?每个字段可能不必分开(例如,可以在“编辑器”字段中输入所有“规格”,而所有“评分”都可以放在“摘录”字段中。)


2
很好的问题,非常感谢您编辑标题,并为清楚起见对其内容进行了提问;将来会帮助其他有类似问题的人。
MikeSchinkel 2010年

Answers:


14

更新:

基于问题的更新,我认为我需要明确声明问题的内容可以通过以下答案来解决,您只需在“汽车”自定义帖子类型中为要显示的每个项目使用自定义字段给定汽车的所有页面。

如果要这样做,只需将边栏硬编码到single-car.php下面包含的模板文件中,然后使用您的if语句来确定要显示不同URL的内容。您可以尝试对侧边栏进行微件化,并开发一个自定义的微件,该微件将为当前帖子ID提取信息,但是,除非您将其构建为供其他人使用的主题,否则为什么要选择两者?

实际上,有许多微妙的不同方法可以完成此操作,但我建议您应该很好地满足您的需求。


@cannyboy:

我实际上不知道最好的方法是在帖子之间共享自定义字段。但这可能只是您需要的危险信号。如果有些事情似乎太难了...

另一种方法?

...您可以合理地设计它吗?我想你会好得多创建自定义文章类型“汽车”,然后你可以储存一切为了每“页”到一个车厢内张贴的类型。以下是一些示例URL:

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

了解自定义帖子类型

您可以在以下问题的答案中了解有关自定义帖子类型的更多信息:

自定义帖子类型和重写规则

要实现“自定义帖子类型”和多个页面,您将使用如下代码来注册“汽车”“自定义帖子类型”,然后为汽车页面设置重写规则。将此代码放在您的主题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
}

一个汽车特异性的主题模板文件

然后,您的主题中将需要一个特定于汽车的模板文件;默认名称是single-car.php。我已经为您编写了一个入门模板,该模板通过使用if语句确定要呈现的内容来在一个模板中呈现所有三个URL((概述)“技术规范”“图片”):

<?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(); 非常简化。真正的网站在那里需要有更多的复杂性。

模板标签又称辅助功能

当然,我在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);
}

屏幕快照充满了“自定义帖子类型”爱

一旦有了所有这些代码,并添加了诸如Volvo 850之类的Car帖子,您就可以像下面的屏幕截图一样使用它:

概述页面

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

技术规格页面

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

图片页

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


1
非常好。您将如何设置它以便技术规格等信息是动态的(而不是像示例中那样是硬编码的)?
特拉维斯·诺斯卡特

1
这是一个棘手的问题,因此我需要了解您的用例,或者只是一个抽象的假设?之所以可以这样做,是因为我知道潜在匹配项的有限列表。如果“匹配任何内容”,它将覆盖WordPress的其他匹配模式。给我一个具体的例子,我将给出一个解决方案,否则它就是一罐蠕虫。
MikeSchinkel 2010年

感谢您的精彩回答。我以前从未研究过自定义帖子类型,它们似乎是理想的解决方案。我已经更新了一些更具体的问题,主要是关于侧边栏/小部件的问题
cannyboy 2010年

@mike只是一个假设。详细地说-我想知道如何设置它,以便在(例如)技术规格页面上的信息在管理仪表板中的某个地方输入(自定义帖子类型,也许使用分类法设置汽车?),而不是在模板文件中。
特拉维斯·诺斯卡特

@tnorthcutt-我假设当您说“技术规格页面上的信息”时,您的意思是“子页面列表?” 还是说自定义字段?如果是后者,我假设信息将存储在自定义字段中。我的例子没有表明这一点。也许应该有?
MikeSchinkel 2010年

1

我认为有人可能已经对您发布的其他问题(关于父页面/中间页面)做出了某种回答,但这是我认为构造数据的最佳方法是基于您所描述的内容:

 - 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请求显示各个子页面。页面模板作为决定要显示哪个模板的开关。这样,您就可以完全避免重复数据,并使以后更容易向模板添加更多信息。

更多细节...

我已经用几种不同的方式做到了。在一个我将代理人(公司代表)作为自定义帖子类型的站点中,我使用他们的帖子来存储与该人有关的所有数据,但从未实际显示该页面。取而代之的是,我有一个“代理列表”页面,一个“代理性能记录”页面和一个“联系此代理”页面,它们总是使用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

}

非常感谢!对于您的最后一条建议,您是说我要创建一个包含所有这些自定义字段的空白页面(也许称为“ Volvo 850 Widget数据”),而其他Volvo 850页面会自动获取此数据(以某种方式)?(这意味着我必须在Appearance> Menus中手动构建菜单,无论如何我都在这样做)...或者可以从“概述”页面的“自定义字段”中获取数据...
cannyboy 2010年

我已经做到了两种方式。我在上面编辑了答案以进行解释。如您所说,最终要做的工作很大程度上取决于您希望菜单创建的自动化程度。
goldenapples 2010年

哎呀 我只是进一步阅读,意识到迈克已经完全回答了我的意思。
goldenapples 2010年

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.