当您进入分类法归档页面时,例如,带有url的页面http://yoursite.com/city/london/
WordPresscan\'t 要知道如果你想去伦敦的酒店、健身房或超市,你必须通知它。
如何通知WordPress?By url. 因此,如果您的url显示为http://yoursite.com/city/london/show/gym
现在WordPress明白你只想看健身房。。。
如何获得这样的结果?您需要的是endpoint:
function my_city_endpoint() {
add_rewrite_endpoint( \'show\', EP_ALL );
}
add_action( \'init\', \'my_city_endpoint\' );
这样,当您访问上面发布的url时,WordPress会设置一个查询变量
\'show\'
包含您的帖子类型,您可以使用它挂钩
pre_get_posts
行动挂钩。
function my_city_mod_query( $query ) {
if ( is_main_query() && ! is_admin() && is_tax(\'city\') ) {
$post_type = $query->get(\'show\');
if ($post_type) $query->set(\'post_type\', $post_type );
}
}
add_action( \'pre_get_posts\', \'my_city_mod_query\' );
现在,分类法存档将仅显示通过端点在url中设置的帖子类型。
如果要同时更改显示的html,则必须同时更改模板文件。
关于侧边栏,您可以注册4个称为“侧边栏城市”的侧边栏,在没有通过url传递类型时使用,另外三个称为\'sidebar-city-gym\'
, \'sidebar-city-hotel\'
和\'sidebar-city-supermarket\'
.
然后在模板中,可以使用条件显示右侧边栏:
$type = get_query_var(\'show\');
$type = ( empty($type) ) ? \'\' : \'-\' . $type;
dynamic_sidebar( \'sidebar-city\' . $type );
如果您甚至想自定义循环中单个项目的显示方式(htnl标记),可以使用
get_template_part
并为单个帖子类型创建3个不同的模板文件
taxonomy-city.php
你会有
$type = get_query_var(\'show\');
while( have_posts() ) : the_post();
if ( empty( $type ) ) { // no type is passed in the url, use standard markup
?>
<h3><?php the_title(); ?></h3>
<p><?php the_content(\'continue reading...\'); ?></p>
<?php
} else {
get_template_part(\'city-item\', $type);
}
endwhile;
使用此代码,如果url中未传递任何类型,模板将使用标准标记,如果url中传递了类型,模板文件需要以下文件之一:
\'city-item-gym.php\'
,
\'city-item-hotel.php\'
和
\'city-item-supermarket.php\'
根据所需的类型,您可以完全自定义标记。
当然,如果标记从一个类型到另一个类型的变化很小,那么可以使用一些if
或switch
语句更改输出内容。
现在,您只需要做最后一件事:在正确的页面中生成正确的url。
您需要一个过滤器,该过滤器应仅在涉及cpt的post单一视图中启动。
add_action(\'template_redirect\', \'maybe_change_term_url\');
function maybe_change_term_url() {
if ( is_single() ) {
$cpts = array(\'gym\',\'hotel\',\'supermarket\');
if ( in_array(get_post_type(), $cpts) ) {
add_filter(\'term_link\', \'change_term_link\', 10, 3);
}
}
}
function change_term_link( $link, $term, $taxonomy ) {
$cpts = array(\'gym\',\'hotel\',\'supermarket\');
$type = get_post_type();
if ( in_array($type, $cpts) && $taxonomy == \'city\' ) {
return trailingslashit($link) . \'show/\' . $type;
}
return $link;
}
正如你所见,我用过
template_redirect
钩子运行一个检查当前页面的函数,如果在涉及的CPT的单个post中,则使用
\'term_link\'
过滤,这样零件
\'/show/gym\'
,
\'/show/hotel\'
或\'
/show/supermarket\'
自动添加到链接中,所有内容都处于正确的位置。
请注意,这里的所有代码都是untested 在这里没有任何语法突出显示,所以您可能会发现一些错误或输入错误。。。