对与循环中的术语匹配的帖子进行分组

时间:2016-05-30 作者:Germán Gallo

我正在制作一个展示许多产品的网站,这是我的结构:

产品(自定义贴子类型)

  • 品牌(自定义分类法)
  • -->品牌A(自定义术语)
  • -->品牌B(自定义术语)
  • -->部门(自定义分类法)
  • -->部门A(自定义术语)
  • -->部门B(自定义术语)
  • 我需要显示每个部门中有哪些品牌,链接它们的唯一方法是使用我的产品(因为每个自定义分类法彼此独立)。我可以通过查询特定部门的所有产品,并检索每个产品的品牌(而不是其名称)来做到这一点。这是我用来执行此任务的代码:

    <?php
        $args = array(
         \'tax_query\' => array(
             array(
                 \'taxonomy\' => \'department\',
                 \'field\' => \'slug\',
                 \'terms\' => array( \'department-a\' )
             ),
         ),
         \'orderby\' => \'title\',
         \'order\' => \'ASC\',
         \'post_type\' => \'prod\'
        );
        $query = new WP_Query( $args );
    
        if ( $query->have_posts() ) {
    
         $term = $query->queried_object;
    
         while ( $query->have_posts() ) : $query->the_post(); ?>
    
             <li>
                      <?php
             // Get brand for post
             $terms = get_the_terms( $post->ID , \'brand\' );    
    
             foreach( $terms as $term ) {
                print $term->name . \' <br />\';
                unset($term);
             }
             ?>
    
           </li>
        <?php
        endwhile;
    
        wp_reset_query();
        } ?>
    
    然而,由于我的一些产品具有相同的品牌,如果发生这种情况,我需要对它们进行分组。所以我的输出应该是这样的:A部门:A品牌有3种产品,B品牌有1种产品,C品牌有2种产品,等等。

    你知道我怎样才能做到这一点吗?谢谢

    EDIT

    Capiadge的回答让我知道一个品牌有多少种产品,但我无法获得这些产品。我做了一个下拉列表,将我的所有需求与品牌相匹配(它会检查我的品牌是否有一个或多个产品,如果是一个,它会设置一个通过ajax和jquery获得的href属性,这样用户就可以进入产品页面;如果是更多,它会设置一个值,这样,如果用户点击它,就可以看到该品牌中的产品)。我唯一需要但无法实现的就是做同样的事情,但不是获得所有的品牌,而是只在一个特定部门拥有产品的品牌。(即:这样的下拉列表,但仅适用于部门a)。

    <input type="hidden" id="filtro_tipo" value="productos">
                <select name="filtro_marca" onchange="update_productos();" id="filtro_marca">
                    <option value="0"><?php echo pll_current_language()==\'es\'?\'Seleccione una marca\':\'Select a brand\'; ?></option>
                    <?php
                        $args = array(
                                \'order\'             => \'ASC\',
                                \'hide_empty\'        => true,
                                \'cache_domain\'      => \'core\'
                        );
                        $terms = get_terms(\'brand\', $args);
                        foreach ($terms as $item) {
                            if ($item->count == 1) {
                                $tax_query = \'\';
                                $tax_query[] = array(\'taxonomy\' => \'brand\',\'field\' => \'term_id\',\'terms\' => $item->term_id);
                                $term_post = get_posts(array(\'post_type\' => \'prod\',\'tax_query\' => $tax_query));
                                if (!empty($term_post)) {
                                    $term_post_link = get_permalink($term_post[0]->ID);
                                    $id_prod = url_to_postid($term_post_link);
                                    $nombre_prod = get_the_title($term_post[0]->ID);
                                    echo \'<option value="\'.$nombre_prod.\'" href="\'.$id_prod.\'">\'.$item->name.\'</option>\';
                                }
                            } else {
                                echo \'<option value="\'.$item->term_id.\'" label="\'.$item->name.\'">\'.$item->name.\'</option>\';
                            }
                        }
                    ?>
                </select>
    

    1 个回复
    SO网友:Capiedge

    这是我最好的方法:在while循环期间将值存储在数组中,然后使用array_count_values php函数,获得所需的输出。

    这是未经测试的,但我认为它应该有效:

    if ( $query->have_posts() ) {
    
        //in this variable, declared as an array, we will store the values
        $products_array = array();
    
        while ( $query->have_posts() ) : $query->the_post();
    
            $terms = get_the_terms( $post->ID , \'brand\' );
            if ( $terms && ! is_wp_error( $terms ) ) {
                $brand_name = $terms[0]->name;
            }
            $products_array[] = $brand_name;
    
        endwhile;
    
        wp_reset_query();
    
    }
    
    //At this point, the $products_array, should be more or less:
    //array(brandA, brandB, brandC, brandB, brandB, brandB, brandA);
    
    //array_count_values does the magic
    $result = array_count_values($products_array);
    
    foreach ($result as $key => $value) {
    
        echo $key . \' has \' . $value . \' products.<br/>\';
    
    }
    
    希望有帮助!