侧栏小部件中的自定义邮政类型数据?
-
16-10-2019 - |
题
(注意:这个问题最初是关于自定义字段的,但是@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页在侧边栏中显示相同的数据,所有保时捷页面以显示不同的数据集(例如,速度,制造商等)。
道路页面将为每条道路都有自己的数据集。汽车和道路也将拥有自己的页面模板,而我认为它将获得正确的侧边栏是sidebar.php中的类似的方式:
if ( is_page_template('car-profile-template.php') ) :
// show car widgets
这是一个示例页面,即Volvo 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 | |
------------------ |
在此示例中,两个侧栏小部件,规格和评级应从自定义帖子类型中获取其信息。是否有一种方法,最终用户可以轻松编辑,这意味着他们只能输入一次自定义数据?每个字段都不需要分开(即所有规格都可以在编辑器字段中输入,并且所有评分都可以放在摘录字段中。也许)
解决方案
更新:
根据问题的更新,我认为我需要明确指出,以下答案可以完成问题中所要求的问题,只有在该问题中使用的自定义字段 “车” 您想要在所有页面上显示给定汽车上所有页面上显示的每个项目的自定义帖子类型。
如果您想这样做,只是只需将侧边栏编码到 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
. 。我已经为您编码了一个启动模板,该模板呈现所有三个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()
;真正的网站需要在那里更加复杂。
模板标签又称助手功能
当然,我使用了一些模板标签也就是助手函数来最大程度地减少模板文件中的复杂性 如果 声明条件。它们在这里,您可以将它们放在主题中 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 您可以像以下屏幕截图一样使其工作:
概述页面
(资源: mikeschinkel.com)
技术规格页面
图片页
其他提示
我认为某人可能已经在您发布的另一个问题(关于父母页面 /中间页面)上回答了这一点,但这是根据您所描述的内容,我认为构造数据的最佳方法是:
- 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
}
如果您不想创建自定义帖子类型,并且只想为每个页面或帖子包含一个自定义侧边栏,则可以使用优美的侧边栏插件。这允许在帖子或页面编辑屏幕中使用名为“优雅标题和优美内容”的其他字段创建自定义侧边栏内容。然后将这些帖子或页面显示在您的博客上时,将它们显示在侧边栏区域中。有关此插件的更多信息可在 http://www.mlynn.org/graceful-sidebar-plugin