【发布时间】:2015-10-04 17:40:09
【问题描述】:
我创建了一个名为“课程”的自定义帖子类型。
Wordpress 会自动为“课程”添加以下网址:
- http://example.com/course/: 存档页面(即archive-course.php)
- http://example.com/course/course-name/: 课程页面(即single-course.php)
不过,我想再添加几页:
- http://example.com/course/course-name/enquiry/:每门课程的查询页面
- http://example.com/course/course-name/demo/: 一些课程的演示页面,如果它们满足某个条件
问题是我不确定添加这些页面的“正确”方式。我现在的做法是这样的:
function create_post_types() {
// ...add custom post types ...
add_rewrite_rule("course/([^/]+)/enquiry/?$",
'index.php?post_type=course&course=$matches[1]&enquiry=true', 'top');
add_rewrite_rule("course/([^/]+)/demo/?$",
'index.php?post_type=course&course=$matches[1]&demo=true', 'top');
}
add_action( 'init', 'create_post_types' );
function add_query_vars_filter( $vars ){
$vars[] = "enquiry";
$vars[] = "demo";
return $vars;
}
add_filter( 'query_vars', 'add_query_vars_filter' );
然后在“single-course.php”中添加了以下 if 语句:
if (get_query_var('enquiry')) {
// enquiry page code
} else if (get_query_var('demo')) {
// Demo Page code
} else {
// Single course page code
}
但是,我做这件事的方式感觉更像是一种 hack,感觉不像是 Wordpress 的正确做法。因此,它不适用于其他插件,例如“Yoast SEO 插件”,它无法识别我在其 XML 站点地图中的附加页面。我认为面包屑也会出现类似的问题。
为自定义帖子类型添加额外页面的最佳做法或更好的方法是什么?
可选问题:还有什么是实现演示页面的合适方法(因为这需要通过get_field('online_course') == True检查课程是否满足特定条件。
【问题讨论】:
-
我认为您的方法 是 最正确的方法......但是,如果 yoast 的 wordpress SEO,包含在自动站点地图等中是优先事项,那么我认为最兼容的解决方案是将额外的页面实际创建为子页面(当然是自动创建的)。如果该特定课程没有演示,则有条件的演示页面应该只返回 404 - 如果您创建“物理”子页面,那么您如何做到这一点很容易:不要创建该子页面。如果您坚持使用当前方法,请检查页面本身并返回 404。
-
注意:您需要相当多的操作挂钩来确保子页面始终反映父页面的状态,并且不会被意外手动删除(如果这可能是一个问题)...换句话说,它会比您当前的解决方案方式更“hackish” - 但我仍然认为它会更兼容。
-
为什么不将页面添加为 CPT 的子页面?
-
我同意@Mikk3lRo,使用重写来创建这些类型的页面。你真的要索引联系表格吗?
-
这不是一个很好的解决方案,而且它会非常复杂(为了它是可靠的),所以我不会花时间整理一个完整的例子。但是您可以以编程方式创建、删除、更新帖子(谷歌它,我在我的 iphone 上写这个),并且您可以将几乎任何更改挂钩到您的自定义帖子类型帖子,以在需要时更新孩子的状态等。所以理论上这绝对是可能的......但我想得越多,我认为它在现实中的想法就越糟糕......
标签: php wordpress custom-post-type