我正在制作一个展示许多产品的网站,这是我的结构:
产品(自定义贴子类型)
品牌(自定义分类法)-->品牌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>
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/>\';
}
希望有帮助!