向产品属性添加新术语并将其设置在 Woocommerce 中的产品中

Posted

技术标签:

【中文标题】向产品属性添加新术语并将其设置在 Woocommerce 中的产品中【英文标题】:Add a new term to a product attribute and set it in the product in Woocommerce 【发布时间】:2019-05-11 07:42:10 【问题描述】:

我的自定义分类(WooCommerce 属性)已经存在,我正在使用以下内容向分类中添加一个新术语并将其与我的 WooCommerce 产品相关联:

wp_set_object_terms($product_id, array($omega_jahr), 'pa_years-of-construction');

当我使用以下命令为我的产品调用“pa_years_of_construction”时,我可以看到新条款已保存:

$v = array_values( wc_get_product_terms( $product->id, 'pa_years-of-construction', array( 'fields' => 'names' ) ) );

但是,当我在网站的后端和前端检查产品属性时,“pa_years_of_construction”属性并未显示。

我在这里错过了什么?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

产品属性是一种复杂的自定义分类法,需要的不仅仅是一行简单的代码...

以下代码将处理预先存在的产品属性的所有情况:

$taxonomy = 'pa_years-of-construction'; // The taxonomy

$term_name = '2009'; // The term "NAME"
$term_slug = sanitize_title($term_name); // The term "slug"

// Check if the term exist and if not it create it (and get the term ID).
if( ! term_exists( $term_name, $taxonomy ) )
    $term_data = wp_insert_term( $term_name, $taxonomy );
    $term_id   = $term_data['term_id'];
 else 
    $term_id   = get_term_by( 'name', $term_name, $taxonomy )->term_id;


// get an instance of the WC_Product Object
$product = wc_get_product( $product_id );

$attributes = (array) $product->get_attributes();

// 1. If the product attribute is set for the product
if( array_key_exists( $taxonomy, $attributes ) ) 
    foreach( $attributes as $key => $attribute )
        if( $key == $taxonomy )
            $options = (array) $attribute->get_options();
            $options[] = $term_id;
            $attribute->set_options($options);
            $attributes[$key] = $attribute;
            break;
        
    
    $product->set_attributes( $attributes );

// 2. The product attribute is not set for the product
else 
    $attribute = new WC_Product_Attribute();

    $attribute->set_id( sizeof( $attributes) + 1 );
    $attribute->set_name( $taxonomy );
    $attribute->set_options( array( $term_id ) );
    $attribute->set_position( sizeof( $attributes) + 1 );
    $attribute->set_visible( true );
    $attribute->set_variation( false );
    $attributes[] = $attribute;

    $product->set_attributes( $attributes );


$product->save();

// Append the new term in the product
if( ! has_term( $term_name, $taxonomy, $product_id ))
    wp_set_object_terms($product_id, $term_slug, $taxonomy, true );

经过测试并且有效。

【讨论】:

看起来很有希望。你能解释一下为什么单独使用 wp_set_object_terms() 是不够的吗? @RichardTinkler 产品属性比其他自定义分类法复杂得多……它们有自己的 Woocommerce 附加表,它们也用于可变产品的变体,它们也添加 postmeta 数据……现在,如果你进入您的数据库并在wp_postmeta 表中搜索定义的产品ID(为其设置了产品属性)meta_key = _product_attributes 您会更好地理解。 谢谢 - 似乎工作正常,但导致大量服务器负载导致超时。有什么想法吗? @RichardTinkler 对不起,但我没有这种行为,没有任何服务器加载时间为一个产品:在运行此代码的共享服务器上是瞬时的......现在如果您在多个产品上以批量模式执行此操作(就像成千上万的人一样),是的,它可能会造成巨大的服务器负载。由于此答案代码有效,请accept the answer,谢谢。 我要试试这个。希望我正在构建的库存同步系统中的负载不会太糟糕。我会在这里更新!

以上是关于向产品属性添加新术语并将其设置在 Woocommerce 中的产品中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用事件侦听器向对象数组添加新元素并将其显示在 html 页面上

如何使用事件侦听器向对象数组添加新元素并将其显示在 html 页面上(已编辑代码)

如何通过敲除映射(ko.utils)向数组中的每个对象添加新属性(索引)?

如何向 UICollectionView 动态添加新单元格?

Woocommerce 按属性过滤产品添加复选框

从具有相同属性名称的多个 UITextField 中保存文本