多个自定义帖子类型的自定义分类模板

时间:2013-10-07 作者:Sam

我已经为3种自定义帖子类型注册了自定义分类法以供共享,这一切都很好。

目前我的问题是在自定义分类法文件中定义一个条件语句。

我想要这个分类法{分类法}。php文件,根据用户查看的自定义帖子类型输出不同的html。然而,分类法{分类法}。php文件似乎只是获取了所有共享该分类法的帖子。

例如:

register_taxonomy( \'City\', array(\'Hotel\', \'Gym\', \'Supermarket\'), array(
     \'labels\' => array(
        \'name\' => __( \'Cities\' ),
        \'singular_name\' => __( \'City\'  )), 
\'hierarchical\' => true ) );
这三种自定义帖子类型(“酒店”、“健身房”、“超市”)将共享城市分类法。

当用户从酒店帖子中单击城市分类链接时,是否可以仅显示酒店帖子和酒店侧栏。

目前,似乎在不同的帖子之间共享了1个分类法,这意味着它无法检测应该显示的帖子类型,而只是输出具有匹配的城市分类法的任何帖子类型。

任何帮助都将不胜感激!

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

当您进入分类法归档页面时,例如,带有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\' 根据所需的类型,您可以完全自定义标记。

当然,如果标记从一个类型到另一个类型的变化很小,那么可以使用一些ifswitch 语句更改输出内容。

现在,您只需要做最后一件事:在正确的页面中生成正确的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 在这里没有任何语法突出显示,所以您可能会发现一些错误或输入错误。。。

SO网友:codearachnid

我相信你所想/想要的是分类学{分类学}。php模板将按CPT过滤。默认情况下,分类法中所有项目的列表是核心功能,而其他过滤器可以通过pre\\u get\\u posts挂钩或重写模板中的主查询来完成。

通过使用查询变量、pre\\u get\\u posts和term\\u link挂钩的组合,可以过滤模板上的结果。首先,使用get\\u term\\u link函数的filter term\\u link,可以过滤正在生成的链接,为您想要的CPT创建适当的过滤器。或者,您可以根据需要对链接进行硬编码,以构建适当的筛选。然后设置一个查询变量,您可以为分类法提供额外的过滤器。设置后,使用pre\\u get\\u posts钩子按指定的post类型(作为查询值的值)过滤税务查询。

结束

相关推荐