Get custom product attributes in Woocommerce

后端 未结 9 756
失恋的感觉
失恋的感觉 2020-11-27 14:15

In Woocommerce, I am trying to get product custom attribute values but I fail miserably and I don\'t get anything.

So I tried:

global $woocommerce,          


        
相关标签:
9条回答
  • 2020-11-27 14:34

    woocommerce_get_product_terms() is now deprecated.

    Use wc_get_product_terms() instead.

    Example:

    global $product;
    $koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );
    
    0 讨论(0)
  • 2020-11-27 14:37

    Use below code to get all attributes with details

        global $wpdb;
    
        $attribute_taxonomies = $wpdb->get_results( "SELECT * FROM " . $wpdb->prefix . "woocommerce_attribute_taxonomies WHERE attribute_name != '' ORDER BY attribute_name ASC;" );
        set_transient( 'wc_attribute_taxonomies', $attribute_taxonomies );
    
        $attribute_taxonomies = array_filter( $attribute_taxonomies  ) ;
    
        prin_r($attribute_taxonomies);
    
    0 讨论(0)
  • 2020-11-27 14:39

    Although @airdrumz solutions works, you will get lots of errors about you doing it wrong by accessing ID directly, this is not good for future compatibility.

    But it lead me to inspect the object and create this OOP approach:

    function myplug_get_prod_attrs() {
        // Enqueue scripts happens very early, global $product has not been created yet, neither has the post/loop
        global $product;
        $wc_attr_objs = $product->get_attributes();
        $prod_attrs = [];
        foreach ($wc_attr_objs as $wc_attr => $wc_term_objs) {
            $prod_attrs[$wc_attr] = [];
            $wc_terms = $wc_term_objs->get_terms();
            foreach ($wc_terms as $wc_term) {
                array_push($prod_attrs[$wc_attr], $wc_term->slug);
            }
        }
        return $prod_attrs;
    }
    

    Bonus, if you are performing the above early before the global $product item is created (e.g. during enqueue scripts), you can make it yourself with:

        $product = wc_get_product(get_queried_object_id());
    
    0 讨论(0)
  • 2020-11-27 14:41

    Update for 2018. You can use:

    global $product;
    echo wc_display_product_attributes( $product );
    

    To customise the output, copy plugins/woocommerce/templates/single-product/product-attributes.php to themes/theme-child/woocommerce/single-product/product-attributes.php and modify that.

    0 讨论(0)
  • 2020-11-27 14:45

    Try this to get an array of attribute name => attribute value(s):

    global $product;
    
    $formatted_attributes = array();
    
    $attributes = $product->get_attributes();
    
    foreach($attributes as $attr=>$attr_deets){
    
        $attribute_label = wc_attribute_label($attr);
    
        if ( isset( $attributes[ $attr ] ) || isset( $attributes[ 'pa_' . $attr ] ) ) {
    
            $attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ];
    
            if ( $attribute['is_taxonomy'] ) {
    
                $formatted_attributes[$attribute_label] = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) );
    
            } else {
    
                $formatted_attributes[$attribute_label] = $attribute['value'];
            }
    
        }
    }
    
    //print_r($formatted_attributes);
    
    return $formatted_attributes;
    

    It's little inefficient but does the trick.

    0 讨论(0)
  • 2020-11-27 14:46

    You can get the single value for the attribute with below code:

    $pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true);
    
    0 讨论(0)
提交回复
热议问题