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

Nic*_*ick 60 php wordpress product custom-taxonomy woocommerce

我试图获得产品自定义属性值,但我很难做到这一点.

我试着这样做:

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

而且我得到了这些原始数据:

[pa_koostis] => Array
        (
            [name] => pa_koostis
            [value] => 
            [position] => 0
            [is_visible] => 1
            [is_variation] => 0
            [is_taxonomy] => 1
        )
Run Code Online (Sandbox Code Playgroud)

我知道有一个值,因为它在属性部分显示它,但我无法找到一种方法让它在我的自定义代码中显示.

Nic*_*ick 90

编辑:自Woocommerce版本3以来已woocommerce_get_product_terms被弃用

按照以下内容进行操作,@ datafeedr 在他的回答中写道:

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );
Run Code Online (Sandbox Code Playgroud)

甚至更紧凑:

global $product;
$koostis = $product->get_attribute( 'pa_koostis' );
Run Code Online (Sandbox Code Playgroud)

原始答案:

$result = array_shift(woocommerce_get_product_terms($product->id, 'pa_koostis', 'names'));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答,这真的很有帮助. (2认同)

dav*_*ash 16

更新2018.您可以使用:

global $product;
echo wc_display_product_attributes( $product );
Run Code Online (Sandbox Code Playgroud)

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


小智 15

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

$pa_koostis_value = get_post_meta($product->id, 'pa_koostis', true);
Run Code Online (Sandbox Code Playgroud)

  • @ravisoni`get_post_meta($ prodict-> id,'_ product_attributes');` (3认同)

小智 15

woocommerce_get_product_terms() 现已弃用.

wc_get_product_terms()改用.

例:

global $product;
$koostis = array_shift( wc_get_product_terms( $product->id, 'pa_koostis', array( 'fields' => 'names' ) ) );
Run Code Online (Sandbox Code Playgroud)

  • 这是对的.我相信2.1版本中所有内容都是软弃用的. (5认同)

Art*_*xel 13

最新更新:

$product->get_attribute( 'your_attr' );
Run Code Online (Sandbox Code Playgroud)

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


小智 9

尝试这样来获取属性名称=>属性值的数组:

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;
Run Code Online (Sandbox Code Playgroud)

它效率不高但可以解决问题.


run*_*ace 5

虽然@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;
}
Run Code Online (Sandbox Code Playgroud)

另外,如果您在创建全局 $product 项之前(例如在排队脚本期间)尽早执行上述操作,您可以自己制作:

    $product = wc_get_product(get_queried_object_id());
Run Code Online (Sandbox Code Playgroud)