如果Woocommerce上已存在,则以编程方式添加产品会创建重复的变体

时间:2017-10-20 09:29:15

标签: php wordpress woocommerce

我正在开发一个API,通过Woocommerce自动导入Wordpress上的产品。所有产品都是变体产品,在第一次同步时,一切正常。但在那之后,如果我想更新产品,即使我有一个代码来避免它,它也会为该产品创建重复的变体。

以下是代码:

function insert_product_variations ($post_id, $variations) {
    foreach ($variations as $index => $variation)
    {
        $variation_id = find_matching_product_variation( $post_id, $variation['attributes'] );

        if ( $variation_id == 0 ) {
            $variation_post = array(
                            'post_title'  => 'Variation #'.$index.' of '.count($variations).' for product#'. $post_id,
                            'post_name'   => 'product-'.$post_id.'-variation-'.$index,
                            'post_status' => 'publish',
                            'post_parent' => $post_id,
                            'post_type'   => 'product_variation',
                            'guid'        => home_url() . '/?product_variation=product-' . $post_id . '-variation-' . $index
                        );
            $variation_post_id = wp_insert_post($variation_post);
        } else {
            $variation_post_id = $variation_id;
        }

        foreach ($variation['attributes'] as $attribute => $value)
        {   
            $attribute_term = get_term_by('name', $value, 'pa_'.$attribute);
            update_post_meta($variation_post_id, 'attribute_pa_'.$attribute, $attribute_term->slug);
        }
        update_post_meta($variation_post_id, '_price', $variation['price']);
        update_post_meta($variation_post_id, '_regular_price', $variation['price']);
        update_post_meta($variation_post_id, '_sku', $variation['sku']);
    }
}

function find_matching_product_variation( $product_id, $attributes ) {
    $product = wc_get_product( $product_id );   

    if( class_exists('WC_Data_Store') ) {
        $data_store = WC_Data_Store::load( 'product' );
        return $data_store->find_matching_product_variation( $product, $attributes );
    } else {
        return $product->get_matching_variation( $attributes );
    }
}

$post_id是原始产品的parent_id,$variations是一个像这样的对象数组:

{
    "attributes": {
         "size"  : "Small",
         "color" : "Red"
    },
    "price" : "8.00",
    "sku" : "TS1000"
}
  • Wordpress版本:4.8.2
  • Woocommerce版本:3.1.2

0 个答案:

没有答案