如何按子类别而不是父类别显示相关帖子

时间:2013-11-18 作者:Sean Henderson

我试图找到一种方法,根据当前帖子的子类别,显示特定父类别子类别中的相关帖子。当前帖子可能分配给多个父类别,但我只想显示父类别子类别之一的相关帖子。

例如,一篇文章可能被分配到类别a、B和C,但我想根据当前文章的B子类别显示相关的文章,而不是显示all A、B或C的帖子。对不起,这个问题很难解释。

我使用此代码显示类别名称和帖子,但我不确定如何从中排除父类别,以便只显示子类别帖子。

More in 
    <?php $category = get_the_category(); 
        if ( in_category(52) || in_category(56) || in_category(57) || in_category(99) || in_category(28) ) {
            echo $category[1]->cat_name; 
        } else {echo $category[0]->cat_name;}
    ?>

<?php if (have_posts() && !(in_category(\'32\'))) : ?>    
    <?php $i = 1; while (have_posts() && $i <= 1) : the_post(); ?>
        <?php $related = get_posts(array(\'category__in\' => wp_get_post_categories($post->ID), \'numberposts\' => 1, \'post__not_in\' => array($post->ID)));
if($related) foreach( $related as $post) {
        setup_postdata($post); ?>
        <?php the_post_thumbnail(\'medium\'); ?>
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                <a href="<?php the_permalink(); ?>"><?php the_excerpt(\'\'); ?></a>
                <?php the_author(); ?></div>    
            <?php } wp_reset_postdata(); ?>
    <?php $i++; endwhile; ?>
<?php endif; ?>
谢谢!

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

确实有一种更简单的方法可以做到这一点。

首先,要获取子类别,只需检查每个类别的父类别的值。如果是顶级类别,则父类别将为0。因此子类别将通过测试if( 0 != $category->parent ):

$categories = get_the_category();
foreach( $categories as $category ){
    if( 0 != $category->parent )
        $child_cat = $category;
}
然后使用该类别ID作为cat 论点要仅输出第一篇文章的缩略图,只需检查current_post 查询对象的值为0。对于循环中的每个帖子,该数字会自动递增,从0开始:

if( isset( $child_cat ) ){  
    echo \'More in \' . $child_cat->name;
    $args = array(
        \'cat\' => $child_cat->term_id,
        \'post__not_in\' => array( get_the_ID() )
    );
    $related = new WP_Query( $args );
    if( $related->have_posts() ){
        while( $related->have_posts() ){
            $related->the_post();
            if( 0 == $related->current_post ){
                the_post_thumbnail(\'medium\');
            }
            // your template tags, etc..
            the_title();
        }
        wp_reset_postdata();
    }
}
另外请注意,您永远不需要使用wp_reset_query() 除非覆盖全局$wp_query, 这在这里是不会发生的。

SO网友:Sean Henderson

这就是我想到的。我不认为这是编写代码的理想方式,但它正是我所需要的。

通过排除父类别,我获得了侧栏中“相关项目”子类别部分的标签:

More in 
    <?php 
        $category = get_the_category();
        $catname = $category[0]->cat_name;
        if ($catname == \'News\' || $catname == \'Featured\' || $catname == \'Nav Bar News\') {
            $catname = $category[1]->cat_name;
                if ($catname == \'News\' || $catname == \'Featured\' || $catname == \'Nav Bar News\') {
                    $catname = $category[2]->cat_name;
                    if ($catname == \'News\' || $catname == \'Featured\' || $catname == \'Nav Bar News\') {
                        $catname = $category[3]->cat_name;
                    }
                }
            } else {
                $catname = $category[0]->cat_name;
            }
            echo $catname;
        ?>
这就是它变得有点凌乱的地方,但代码适用于我需要实现的目标。我排除了父类别,然后使用循环显示相关子类别中的帖子:

        wp_reset_query();
        $this_post = $post->ID;
        $category = get_the_category($post->ID);
        $category = $category[0]->cat_ID;
        if ($category == \'30\' || $category == \'28\' || $category == \'99\') {
            $category = $category[1]->cat_ID;
            if ($category == \'30\' || $category == \'28\' || $category == \'99\') {
                $category = $category[2]->cat_ID;
                if ($category == \'30\' || $category == \'28\' || $category == \'99\') {
                    $category = $category[3]->cat_ID;
                } 
            }
        } 
        $args = array(
            \'category__in\' => array($category),
            \'post__not_in\' => array($this_post)
        );
        $the_query = new WP_Query($args);

        if ( $the_query->have_posts() && !(in_category(\'32\'))) {
            $i = 0; while ( $the_query->have_posts() && $i < 1) {
                $the_query->the_post(); ?>
                        <?php the_post_thumbnail(\'medium\'); ?>
                        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                            <a href="<?php the_permalink(); ?>"><?php echo excerpt(30); ?></a>
                            <?php the_author(); ?>
            <?php $i++; } 
        } else {
            //echo \'no posts\';
        }
        wp_reset_postdata();

        wp_reset_query();
        $this_post = $post->ID;
        $category = get_the_category($post->ID);
        $category = $category[0]->cat_ID;
        if ($category == \'30\' || $category == \'28\' || $category == \'99\') {
            $category = $category[1]->cat_ID;
            if ($category == \'30\' || $category == \'28\' || $category == \'99\') {
                $category = $category[2]->cat_ID;
                if ($category == \'30\' || $category == \'28\' || $category == \'99\') {
                    $category = $category[3]->cat_ID;
                } 
            }
        } 
        $args = array(
            \'category__in\' => array($category),
            \'post__not_in\' => array($this_post),
            \'offset\' => 1
        );
        $the_query = new WP_Query($args);

        if ( $the_query->have_posts() && !(in_category(\'32\'))) {
            $i = 0; while ( $the_query->have_posts() && $i < 3) {
                $the_query->the_post(); ?>
                        <a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a>
                    <?php if ($i < 2) { ?>
                        <hr style="width: 92%;">
                    <?php } ?>
            <?php $i++; } 
        } else {
            //echo \'no posts\';
        }
        wp_reset_postdata();
我试图在一个循环中完成这一切,但我想不出一种方法来仅显示第一篇文章的特色图像,然后将该文章从再次显示中排除。如果有人有更干净的方式写这篇文章,请让我知道。

结束

相关推荐

具有自定义分类的自定义帖子类型中的WP_DROPDOWN_CATEGORIES

我有一个自定义的帖子类型,它有自己的分类法,基本上“show Vinces”是帖子类型,Vincement regions是分类法。看到一个场馆无法在多个地区存在,我删除了默认的metta框,并使用wp_dropdown_categories(). 分类法项目正在输出并按我所希望的方式显示,但它们不会被提交,并且下拉列表在提交后不会保留所选内容。我已经尽我所能地查看原始metabox的各种属性,并尝试将这些属性应用到下拉列表中,但到目前为止,我没有任何乐趣。我看过一些various WPSE上的帖子和ha