Woocommerce:在产品类别名称下列出某些产品属性值

时间:2020-09-23 17:23:18

标签: wordpress woocommerce

我们有一家woocommerce商店,出售自行车零件。 我们的父类别名称是“摩托车零件”。子类别是摩托车品牌,例如:

Motorcycle-Parts
      => Suzuki
      => Honda
      => Yamaha
      ...

在子类别中,我们有产品。这些产品具有称为“ ccm”的属性(其立方容量,带有数值)。

现在,我们尝试在类别名称下方列出每个类别产品的所有现有“ ccm”值,例如:

Motorcycle-Parts
      => Suzuki 
          - 300
          - 380  
          - 550   
          - ...   
      => Honda
          - 600
          - 650  
          - 700   
          - ...  
      => Yamaha
          - 420
          - 650  
          - 860   
          - ...  

因此,例如,如果某个产品在具有属性pa_ccm的“ Suzuki”类别中(例如500),我们想自动在类别名称下方列出该值(500),以便人们看到,在Suzuki类别中存在一个(或多个)产品的pa_ccm值为500。

我尝试了_get_term_hierarchy的一些操作,但是我的技能在这里是有限的。所以没有结果。 感谢您的帮助和想法。

2 个答案:

答案 0 :(得分:3)

您可能必须循环每个类别,每个产品,每个属性,然后是每个术语,以获得所需的结构。为了清楚起见,我将保留父子类别部分,并提供其余代码,如下所示:

//  Get all categories

  $args = array(
         'taxonomy'     => 'product_cat',
         'orderby'      => 'name'
  );
 $all_categories = get_categories($args); //all categories are stored here.
 
 foreach ($all_categories as $cat) {
 
 echo "Category: " .$cat->name ."<br>";
 
     $product_args = array(
        'category'  => $cat->slug;
    );
    
    //get products for each category
    
    foreach( wc_get_products($product_args) as $product ) {
    
    //get attributes for each product
    
        foreach( $product->get_attributes('pa_ccm') as $attr_name => $attr ){
        
        //get terms for each attribute

            foreach( $attr->get_terms() as $term ){

            echo "CCM: " .$term->name ."<br>";
        }

    }
}
}

答案 1 :(得分:1)

这就是我现在拥有的-工作中!

//  Get all categories
$args = array(
     'taxonomy'     => 'product_cat',
     'orderby'      => 'name',
     'parent' => 8543
);
$all_categories = get_categories($args); //all categories are stored here.

foreach ($all_categories as $cat) {

  echo "<br><br>Category: " .$cat->name ."<br>";

  $product_args = array(
      'category'  => $cat->slug,
      'limit' => -1
  );

  //get products for each category and hide duplicate term->names
  $unique_term_names = array();
  foreach( wc_get_products($product_args) as $product ) {

  // The attribute slug
  $attribute = 'pa_hubraum';

  // Get attribute term names in a coma separated string
  $term_names = $product->get_attribute( $attribute );

  if( ! in_array( $term_names, $unique_term_names ) ) :
     // add to array so it doesn't repeat
     $unique_term_names[] = $term_names;
    
  echo '<p>' . $term_names . '</p>';
  endif;
  }
}

此代码确实在类别下方列出了属性“ ccm”中的$ term_names,并隐藏了重复的值/ term->名称。

最后一个小问题: 由于我们在这些类别中有许多产品,并且具有许多属性和术语,因此我想问一问,是否有更多的性能和方法可以优化上面的功能/查询? 有人知道是否可以通过编程来加快加载时间吗?