更新的方法实际上,正如你所说的,我提出的第一个想法/建议并不符合我的理解。至少我试过了,但没能弄明白。也就是说,您想要的仍然是可以实现的,但不是通过使用端点,或者至少不是通过使用add_rewrite_endpoint()
.
然而,我认为通过“普通”重写设置应该是可能的。下面的代码显示了如何设置帖子类型、查询变量和重写规则,以实现帖子类型存档的自定义视图。最后但并非最不重要的一点是,我们需要确保加载正确的模板。这可以模拟端点。示例性代码应该让您朝着正确的方向前进,这样您就可以根据需要对其进行调整。
Code:
// minimal setup to register the new post type
add_action( \'init\', \'wpse130664_pt_rw_ep_cpt\');
function wpse130664_pt_rw_ep_cpt() {
register_post_type( \'rw_ep_cpt\',
array(
\'label\' => __( \'rw_ep_cpt\', \'rw_ep_cpt_textdomain\' ),
\'public\' => true,
// the archive slug defaults to the post type name »rw_ep_cpt«
\'has_archive\' => true
)
);
}
// add a new query variable
add_filter(\'init\', \'wpse130664_pt_archive_qv\');
function wpse130664_pt_archive_qv() {
global $wp;
$wp->add_query_var(\'aview\');
}
// add a new rewrite rule
add_filter(\'init\', \'wpse130664_pt_archive_rw_rule\');
function wpse130664_pt_archive_rw_rule() {
// we\'re adding »aview« as a possibility to the slug
// of the custom post type archive we registered above
// no need to match anything, e.g. with »$matches[1]«
// so we\'re defaulting the aview query variable to 1
// this kind of emulates a endpoint
add_rewrite_rule( "rw_ep_cpt/aview$", "index.php?post_type=rw_ep_cpt" . \'&aview=1\', \'top\' );
}
// load the »aview« template
add_filter( \'template_include\', \'wpse130664_aview_tmpl_red\' );
function wpse130664_aview_tmpl_red( $original_template ) {
// we\'re loading the template conditionally,
// but only if we\'re actually at the »aview« "endpoint"
if ( 1 == intval(get_query_var(\'aview\')) ) {
// you\'ve to create the template you want to use here
return get_template_directory().\'/archive-aview.php\';
} else {
return $original_template;
}
}
同时,我很好奇你为什么选择在$wp
全局而非功能get_query_var()
和add_query_var()
?
老实说,我重用了我不久前写的一些代码,我只是对其进行了一些修改,使其适合您的需要。在那里,我使用了上述方法$wp
全球的但这当然不能解释为什么,所以我也试图解决这个问题。
如果我没有完全错的话add_query_var()
仅作为的函数/方法可用WP
班因此,上述方法就是这样做的。
关于get_query_var()
, 这个你可以用,但它全球化了$wp_query
并使用get()
功能/方法WP_Query
班因此,在某种程度上,差异不是或不应该很大。
除此之外,还有一个想法WP_Query
对象可能比WP
对象,如果不总是。因此,通过全球$wp
可能真的是件好事
但实际上我没有想过并测试这个槽,我已经这样使用了它,并且它在我的设置中工作,所以当我编写代码时我很满意。因此,在另一个设置/用例中可能存在缺陷。或者换一种方式在其他情况下可能更有价值/更有益。但正如我上面所说,这是为了让你开始,你必须自己调整它以适应你的需要。
评论后更新Awell-timed blog post 从@MarkJaquith开始,我开始template_include
更适合包含新模板文件的过滤器。我已经更新了代码以使用该过滤器,我建议也更新示例代码。
正如@mrwweb指出的和上面链接的文章所解释的那样template_redirect
对于选择其他模板,筛选器不是最佳的。或者正如@MarkJaquith简单总结的那样:
→ 模板_redirect 用于redirects.
→ 模板_include 用于includes.
他说服了我,所以我改变了»aview«模板加载的方式template_include
过滤上述代码。
<小时>
第一个想法/方法Disclaimer:
我保留了这个,因为它有信息价值,但这个对自定义帖子类型存档不起作用。但是使用ep_mask
可以方便地为单个自定义帖子类型的帖子创建端点。
据我所知,在这种情况下可以完成端点。我最近读到了这篇文章,但实际上我从来没有想过要这么做。因此,据我所知,可能会有更多的人来解决问题删除>
你说得对:
我的理解是,端点不适用于post类型归档。它们适用于该帖子类型中的帖子,但不适用于存档本身。
所以利用ep_mask
如下所述的参数可用于自定义帖子类型的帖子,但not 用于存档除此之外,玩这个让我意识到定制是多么方便ep_mask
可以用于创建单个自定义post类型端点。
基本上,我所读到的内容是利用ep_mask
使用时可用的参数
和
rewrite
论点
看看相关的trac ticket 19275. 您可以在register_post_type()
codex页面位于permalink_epmask
描述,尤其是trac ticket 12605.
关于端点的概述: