doushi9474 2018-11-22 10:22
浏览 52
已采纳

Wordpress,foreach on taxonomy显示重复

I have the below code, it works initially with regards to the fact that it displays the products for all taxonomies. However if a product is set to 2 taxonomies then it will display twice on the page as opposed to showing the first instance of the product.

<?php if ( $terms && !is_wp_error( $terms ) ) {
    foreach ( $terms as $term ) {

        $args = array(
            'post_type'  => 'products',
            'posts_per_page' => -1,
            'orderby' => 'menu_order',
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_cat',
                    'field'    => 'slug',
                    'terms'    => $term->slug,
                ),
            ),
            'order' => 'asc',
        );

        runQuery($args);
    }
} ?>

Here is the runQuery function:

<?php $x = 0;
function runQuery($args) {
    global $x;
    $query = new WP_Query( $args );

    if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
        $cat_terms = get_the_terms($post->id, 'product_cat');
        $datagroups = '';

        foreach ($cat_terms as $key => $cat) {
            if (count($cat_terms) == ($key + 1)) {
                $datagroups .= '"' . $cat->name . '"';
            } else {
                $datagroups .= '"' . $cat->name . '", ';
            }
        }
    ?>      

    HTML Here that is displayed;

    <?php $x ++;
    endwhile;
    endif;
    wp_reset_postdata();
}?>
  • 写回答

1条回答 默认 最新

  • doqau82086 2018-11-22 10:45
    关注

    I have figured this out, I essentially just had to check the current post in the loop to see if it had already been displayed:

    <?php $x = 0;
    $displayed = [];
    
    function runQuery($args) {
        global $displayed;
        global $x;
        $query = new WP_Query( $args );
    
        if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
            $cat_terms = get_the_terms($post->id, 'product_cat');
            $datagroups = '';
    
            if ( in_array( get_the_ID(), $displayed ) ){
                continue;
            }
            // update array with currently displayed post ID
            $displayed[] = get_the_ID();
    
            foreach ($cat_terms as $key => $cat) {
                if (count($cat_terms) == ($key + 1)) {
                    $datagroups .= '"' . $cat->name . '"';
                } else {
                    $datagroups .= '"' . $cat->name . '", ';
                }
            }
        ?>  
    

    Source that may help others: https://wordpress.stackexchange.com/questions/285091/avoid-duplicate-post-from-same-taxonomy

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。