是否在边栏小工具中自定义发布类型数据?

时间:2010-08-24 作者:cannyboy

(注意:这个问题最初是关于自定义字段的,但@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页面在侧栏中显示相同的数据,所有保时捷页面显示不同的数据集(例如速度、制造商等)。

道路页面将为每条道路提供自己的数据集。汽车和道路也会有自己的页面模板,我想它获得右侧边栏的方式与边栏中的类似。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应该从自定义帖子类型中获取信息。是否有一种方法可以方便最终用户编辑,这意味着他们只需输入此自定义数据一次?可能没有必要将每个字段分开(即所有规范都可以在编辑器字段中输入,所有评级都可以放在摘录字段中..可能)

3 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

更新:

根据问题的更新,我想我需要明确指出,问题中的问题可以通过下面的答案来完成,只需使用“汽车”自定义贴子类型中的自定义字段,就可以在给定汽车的所有页面上显示每个项目。

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

实际上有很多微妙不同的方法来实现这一点,但我建议的方法应该非常适合您的需要。


@cannyboy:

实际上,我不知道在帖子中共享自定义字段的最佳方式是什么。但这可能正是你需要的危险信号。如果事情看起来太难,也许。。。

另一种方法

。。。你可以穿上鞋子architecting it differently? 我想你最好创建一个Custom Post Type 然后,您可以将每个“页面”的所有内容存储到一个汽车贴子类型中。以下是一些示例URL:

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

了解自定义帖子类型

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

  • Tips for using WordPress as a CMS?
  • Can a CrunchBase.com clone be implemented using WordPress?
    • 自定义帖子类型和重写规则,以实现自定义帖子类型和多个页面,您可以使用如下代码registers your "Car" Custom Post Type 然后sets a rewrite rule for your car pages. 将此代码放入主题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
      }
      
      一个特定于汽车的主题模板文件need a Car-specific template file in your theme; 默认名称为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(); 真正的网站需要有更多的复杂性。

      模板标记a.k.a.Helper函数当然,我使用了一些模板标记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);
      }
      
      充满自定义贴子类型Love的屏幕截图一旦你有了所有的代码,并且你添加了一辆类似沃尔沃850的贴子,你就可以让它像下面的屏幕截图一样工作:

      概述页面

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

      技术规格页

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

      图片页面

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

SO网友:goldenapples

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

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

More details...

我用了几种不同的方法。在一个我有代理(公司代表)作为自定义帖子类型的站点中,我使用他们的帖子来存储与此人相关的所有数据,但从未实际显示该页面。相反,我有一个“代理列表”页面、“代理性能记录”页面和一个“联系此代理”页面,这些页面总是用GET变量调用,并显示相应帖子中的信息。所以permalink看起来像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

}

SO网友:Michael Lynn

如果您不想创建自定义帖子类型,只想为每个页面或帖子包含一个自定义侧栏,那么可以使用优雅的侧栏插件。这允许使用称为“优雅标题”和“优雅内容”的其他字段,从帖子或页面编辑屏幕中创建自定义侧栏内容。当这篇文章或页面显示在您的博客上时,它们将作为小部件显示在侧栏区域中。有关此插件的更多信息,请访问http://www.mlynn.org/graceful-sidebar-plugin

结束

相关推荐