在Woocommerce中获取自定义产品属性


73

在Woocommerce中,我试图获取产品自定义属性值,但我惨败,我一无所获。

所以我尝试了:

global $woocommerce, $post, $product;
$res = get_post_meta($product->id);
print_r(unserialize($res['_product_attributes'][0]));

我正在获取这些原始数据:

[pa_koostis] => Array
        (
            [name] => pa_koostis
            [value] => 
            [position] => 0
            [is_visible] => 1
            [is_variation] => 0
            [is_taxonomy] => 1
        )

我知道有一个值,因为它显示在属性部分,但是我无法找到一种方法来将其与我的自定义代码一起显示。


为该问题提供的解决方案是针对2.1的,您应该更新此代码以在woocommerce 3.0中工作,否则将生成大量日志以供弃用
例如,montem

Answers:


112

编辑自Woocommerce版本3起woocommerce_get_product_terms已弃用

按照@datafeedr在他的答案中写道:

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );

甚至更紧凑:

global $product;
$koostis = $product->get_attribute( 'pa_koostis' );

原始答案:

$result = array_shift(woocommerce_get_product_terms($product->id, 'pa_koostis', 'names'));

21

2018年更新。您可以使用:

global $product;
echo wc_display_product_attributes( $product );

自定义输出,复制plugins/woocommerce/templates/single-product/product-attributes.phpthemes/theme-child/woocommerce/single-product/product-attributes.php和修改。


2
你是救星!
Coder828

17

您可以使用以下代码获取属性的单个值:

$pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true);

1
有一次获取所有属性的想法吗?
ravisoni

3
@ravisoniget_post_meta( $prodict->id , '_product_attributes' );
EHerman 2014年

17

woocommerce_get_product_terms() 现在已弃用。

使用wc_get_product_terms()代替。

例:

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );

5
这是对的。我相信2.1版中的所有内容均已弃用。
helgatheviking 2014年

1
我得到->注意:仅变量应通过引用传递。Woocommerce版本3.2.6。代码---> $ date = array_shift(wc_get_product_terms($ product-> get_id(),'pa_date',array('fields'=>'names')))); 有什么事吗 我解决不了 我得到gettype($ date)的“空”值
克里斯蒂斯

17

最新更新:

$product->get_attribute( 'your_attr' );

您将需要定义$product它是否不在页面上。


13

尝试此操作以获取属性名称=>属性值的数组:

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;

它效率不高,但是可以解决问题。



2

尽管@airdrumz解决方案可以工作,但是通过直接访问ID来执行错误操作会导致很多错误,这对将来的兼容性不利。

但这导致我检查对象并创建此OOP方法:

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

额外的好处是,如果您在创建全局$ product项之前(例如在入队脚本期间)进行上述操作,则可以自己进行以下操作:

    $product = wc_get_product(get_queried_object_id());

1

使用下面的代码获取所有带有详细信息的属性

    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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.