WooCommerce 产品属性在保存时会覆盖旧属性

问题描述 投票:0回答:1

我正在尝试根据用户输入创建产品属性,但每当我发送请求时,都会创建该属性,但它会覆盖链接到产品的先前属性。

public static function create_variable_product(){
        $variant_data = wp_clean(isset($_POST['data']) ? wp_unslash($_POST['data']) : '');
        $product_id = wp_clean(isset($_POST['product_id']) ? wp_unslash($_POST['product_id']) : '');
        $variant_data = json_decode($variant_data);
        $product = wc_get_product($product_id);
        if($product->has_child() == false){
            $product = new WC_Product_Variable($product_id);
        }
        $attribute = self::create_product_attribute($product,$variant_data);
        
        wp_send_json($attribute);
    }
    
public static function create_product_attribute($product,$variant_data){
        
        $id = [];
        for($i=0; $i<count($variant_data); $i++){
            $attribute = new WC_Product_Attribute();
            $attribute->set_id(0);
            foreach($variant_data[$i] as $key => $value){
                
                if($key == 'attribute_name'){
                    $attribute->set_name($value);
                }
                if($key == 'options'){
                    $attribute->set_options($value);
                }
    
            }   
                $attribute->set_position( 1 );

                $attribute->set_visible( 1 );

                $attribute->set_variation( 1 );
                $attribute->is_taxonomy(0);

                $product->set_attributes(array($attribute));
                array_push($id,$product->save());
            
        }
        return $id;
}

传递给

$_POST['data']
的数据是:

[{
  attribute_name: 'Color',
  options: ['red','yellow','blue']
}]
php wordpress woocommerce crud hook-woocommerce
1个回答
1
投票

您的代码中有一些错误。请尝试以下方法(未经测试):

public static function create_variable_product(){
    $data       = wp_clean(isset($_POST['data'] ? wp_unslash($_POST['data']) : '');
    $product_id = wp_clean(isset($_POST['product_id']) ? wp_clean( wp_unslash($_POST['product_id']) ) : '');
    $product    = wc_get_product($product_id);
    
    if( is_a($product, 'WC_Product') && ! $product->is_type('variable') && isset($_POST['data']) ){
        $product = new WC_Product_Variable($product_id);
    }
    
    $attribute = self::create_product_attribute($product, $data);
    $product->save()
    
    wp_send_json($attribute);
}

public static function create_product_attribute( $product, $data ) {
    $attributes = $product->get_attributes();
    $attribute  = new WC_Product_Attribute();

    foreach($data as $key => $values){
        if( $key === 'attribute_name'){
            $attribute->set_name($values);
        } elseif( $key === 'options' ){
            $attribute->set_options($values);
        }
    }
    $attribute->set_position( 1 );
    $attribute->set_visible( 1 );
    $attribute->set_variation( 1 );
    $attribute->is_taxonomy(0);
    
    $attributes[$attribute->get_name()] = $attribute;

    $product->set_attributes($attributes);
}

应该会更好。

© www.soinside.com 2019 - 2024. All rights reserved.