如何以编程方式为Woocommerce产品变体设置术语?

时间:2019-03-23 10:25:02

标签: php wordpress woocommerce product variations

我想使用已定义的属性(“ bidragsstorlek”)为所有变量产品(在创建时)设置相同的六个不同变体。六个版本的价格应不同。

使用当前的代码,我成功执行了除最后一个步骤以外的所有步骤。我成功地添加了一个属性,六个不同的术语和六个不同的变体。当我在后端面板上查看产品变型具有所需的价格时,唯一缺少的是为每个变型设置正确的术语。

我知道之前也曾提出过类似的问题,并一直在尝试实现这些答案,但并不能正确解决。

$taxonomy = 'pa_bidragsstorlek';    
$arrtermnames = array('50 kronor', '100 kronor', '250 kronor', '500 kronor', '1000 kronor', '5000 kronor');

        $attr_data = Array(
            $taxonomy=>Array(
                'name' => $taxonomy,
                'value' => '',
                'is_visible' => '1',
                'is_variation' => '1',
                'is_taxonomy' => '1'
            )
        );

        $newproduct = new WC_Product($product_id);

        update_post_meta( $product_id, '_product_attributes', array_merge($newproduct->get_attributes(), $attr_data) );




foreach ($arrtermnames as &$value) {

$term_name = $value; // 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 );

}

unset($value);




$parent_id = $product_id;

$arrprice = array(50, 100, 250, 500, 1000, 5000);



for ($x = 0; $x <= 5; $x++) {

$variation = array(
    'post_title'   => 'Product #' . $parent_id. $arrprice[$x],
    'post_content' => '',
    'post_status'  => 'publish',
    'post_parent'  => $parent_id,
    'post_type'    => 'product_variation'
);
// The variation id
$variation_id = wp_insert_post( $variation );

update_post_meta( $variation_id, '_regular_price', $arrprice[$x] );
update_post_meta( $variation_id, '_price', $arrtermnames[$x] );
update_post_meta( $variation_id, '_virtual', '1' );
// Assign the size and color of this variation
update_post_meta( $variation_id, 'attribute_'.$taxonomy, $arrtermnames[$x] );

WC_Product_Variable::sync( $parent_id );

} 

现在使用此代码,在面板中进行检查时,我会在带有所有术语的每个变体中都有一个下拉菜单-但未选择任何一个。知道将每个变体设置为正确术语会缺少什么吗?

0 个答案:

没有答案