【问题标题】:Woocommerce: List certain product attributes values under the products category nameWoocommerce:在产品类别名称下列出某些产品属性值
【发布时间】:2021-01-09 23:09:54
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

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

    //  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>";
            }
    
        }
    }
    }
    

    【讨论】:

    • 谢谢,这是一个好的开始。 echo "Category: " .$cat ."&lt;br&gt;"; 必须是 echo "Category: " .$cat-&gt;name."&lt;br&gt;"; 并且您最后缺少 }。如何只查询某个属性pa_ccm
    • 谢谢。编辑了代码。只有一个属性,我想你可以试试: $product->get_attributes('pa_ccm');
    • 之前已经试过了,但它仍然列出了所有带有该代码foreach( $product-&gt;get_attributes('pa_ccm') as $attr_name =&gt; $attr ){的属性
    • 好的。你可以试试:get_the_terms( $product-&gt;id, 'pa_ccm') 而不是$product-&gt;get_attributes('pa_ccm')
    • 该行应该修改foreach (get_the_terms( $product-&gt;id, 'pa_ccm') as $attr) {
    【解决方案2】:

    这就是我现在所拥有的——工作!

    //  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,并隐藏了重复的值/术语->名称。

    最后一个小问题: 由于我们在这些类别中有很多产品,具有很多属性和术语,我想问一下是否有更高效的方法来优化上面的功能/查询? 是否有人知道是否可以对其进行编程以加快加载时间?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 2021-06-13
      • 2022-01-23
      • 1970-01-01
      • 2017-03-27
      • 2020-11-02
      • 2022-01-02
      相关资源
      最近更新 更多