CPT的WP_GET_POST_TERMS,但如果在循环中多次使用,则不会重复

时间:2017-03-09 作者:Christina

我有一个CPT“media\\u blog”,分类法为“media\\u blog\\u category”。我在页面上有两个循环,它们与这个CPT的分页相匹配。我有文章中使用的术语的第一个循环。每个职位分配了多个术语。我想显示帖子上使用的术语列表,但不显示具有相同术语的帖子的副本。

这就是我目前所拥有的it\'s very close, 它不显示帖子上使用的相同术语的副本,但也不显示具有多个术语的帖子上的其他术语。在这一点上,我简直疯了:

if ( is_post_type_archive( \'media_blog\' ) ) :

        global $post;
        global $wp_query;

        $args = array(
            \'post_type\'      => \'media_blog\',
            \'posts_per_page\' => 16, // same as the pre_get_posts
            \'post_status\'    => \'publish\',
            \'paged\'          => get_query_var( \'paged\' ),
        );


    $wp_query = new WP_Query( $args );

    if ( have_posts() ) : 

        echo \'<ul class="filter">\';

            echo \'<li class="current-menu-item"><a href="#" data-filter="*">\' . __( \'All\' ) . \'</a></li>\';

                $term_list = wp_get_post_terms( $post->ID, \'media_blog_category\', array( \'fields\' => \'all\' ) );

                foreach( $term_list as $term ) :

                    $dupe = 0;

                    while ( have_posts() ) : the_post(); 

                    if ( $dupe == 0 ) :

                        echo \'<li><a href="#" data-filter=".media_blog_category-\' . $term->slug . \'">\' . $term->name . \'</a></li>\';

                        $dupe++;

                    endif; //dupe

                    endwhile;

                endforeach; //term_list


        echo \'</ul>\';

    endif; //WP_Query

    wp_reset_query();       

    endif; //media_blog

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

修复重复检查逻辑:

重复检查逻辑错误。您需要将这些术语保存在一个数组中,然后检查该术语是否已经存在于数组中,以确定它是否重复。

因此if ( $dupe == 0 ) : 条件和错误的循环嵌套,如下所示:

if ( have_posts() ) : 
    echo \'<ul class="filter">\';
        echo \'<li class="current-menu-item"><a href="#" data-filter="*">\' . __( \'All\' ) . \'</a></li>\';     
        $unique_terms = array(); // instead of $dupe = 0;
        while ( have_posts() ) : the_post();
            $term_list = wp_get_post_terms( $post->ID, \'media_blog_category\', array( \'fields\' => \'all\' ) );
            foreach( $term_list as $term ) :
                if( ! in_array( $term->term_id, $unique_terms ) ):
                    array_push( $unique_terms, $term->term_id );
                    echo \'<li><a href="#" data-filter=".media_blog_category-\' . $term->slug . \'">\' . $term->name . \'</a></li>\';
                endif;
            endforeach; //term_list
        endwhile;
    echo \'</ul>\';
endif; //WP_Query
这应该是你想要的。

更好的解决方案:

在使用上述逻辑进行修复后,代码将正常工作。但是,您可以使用以下代码提高效率:

if ( is_post_type_archive( \'media_blog\' ) ) :
    $args = array(
        \'post_type\'      => \'media_blog\',
        \'posts_per_page\' => 16, // same as the pre_get_posts
        \'post_status\'    => \'publish\',
        \'paged\'          => get_query_var( \'paged\' ),
        \'fields\'         => \'ids\' // for this specific case, all you need are the IDs
    );
    $wp_query = new WP_Query( $args );
    if ( have_posts() ) :
        echo \'<ul class="filter">\';
            echo \'<li class="current-menu-item"><a href="#" data-filter="*">\' . __( \'All\' ) . \'</a></li>\';
                $term_list = wp_get_object_terms( $wp_query->get_posts(), \'media_blog_category\' );
                foreach( $term_list as $term ) :
                    echo \'<li><a href="#" data-filter=".media_blog_category-\' . $term->slug . \'">\' . $term->name . \'</a></li>\';
                endforeach; //term_list
        echo \'</ul>\';
    endif; //WP_Query
    wp_reset_query();
endif; //media_blog

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请