以编程方式将销售价格添加到产品变体
Add sale price programmatically to product variations
我需要以编程方式更新可变产品及其所有变体的销售价格。
我需要添加什么样的元字段?
我正在尝试更新主要产品,例如:
update_post_meta($post_id, '_regular_price', '100');
update_post_meta($post_id, '_price', '50');
update_post_meta($post_id, '_sale_price', '50');
然后我更新每个变体
update_post_meta($variation_id, '_regular_price', '100');
update_post_meta($variation_id, '_price', '50');
update_post_meta($variation_id, '_sale_price', '50');
update_post_meta($variation_id, 'attribute_pa_taglia', $term_slug);
update_post_meta($variation_id, '_stock', $stock);
update_post_meta($variation_id, '_stock_status', 'instock');
update_post_meta($variation_id, '_manage_stock', 'yes');
后端:产品详情,一切正常
但是后端(产品列表)和前端给我旧价格
Update: Prices are also cached in transient wp_options
table.
Let say your product ID is 222
, you will have that transients meta_keys in wp_options
table (for this product ID):
'_transient_timeout_wc_product_children_22'
'_transient_wc_product_children_22'
'_transient_timeout_wc_var_prices_222' // <=== <=== HERE
'_transient_wc_var_prices_222' // <=== <=== <=== HERE
What you can try to do is to update expiration date meta_value
to an outdated timestamp, this way:
// Set here your product ID
$main_product_id = 222
$transcient_product_meta_key = '_transient_wc_var_prices_'. $main_product_id;
update_option( $transcient_product_meta_key, strtotime("-12 hours") );
wp_cache_delete ( 'alloptions', 'options' ); // Refresh caches
This way you will force the system to rebuild this outdated cached transient.
此外,您应该尝试 add/update 在您的父产品 ID(设置变体的主要产品)中:
// Set here your Main product ID (for example the last variation ID of your product)
$post_id = 22;
// Set here your variation ID (for example the last variation ID of your product)
$variation_id = 24;
// Here your Regular price
$reg_price = 100;
// Here your Sale price
$sale_price = 50;
update_post_meta($post_id, '_min_variation_price', $sale_price);
update_post_meta($post_id, '_max_variation_price', $sale_price);
update_post_meta($post_id, '_min_variation_regular_price', $reg_price);
update_post_meta($post_id, '_max_variation_regular_price', $reg_price);
update_post_meta($post_id, '_min_variation_sale_price', $sale_price);
update_post_meta($post_id, '_max_variation_sale_price', $sale_price);
update_post_meta($post_id, '_min_price_variation_id', $variation_id);
update_post_meta($post_id, '_max_price_variation_id', $variation_id);
update_post_meta($post_id, '_min_regular_price_variation_id', $variation_id);
update_post_meta($post_id, '_max_regular_price_variation_id', $variation_id);
update_post_meta($post_id, '_min_sale_price_variation_id', $variation_id);
update_post_meta($post_id, '_max_sale_price_variation_id', $variation_id);
// Optionally
wc_delete_product_transients($variation_id);
此外,我发现了其他同样有效的解决方案:
$product_variable = new WC_Product_Variable($post_id);
$product_variable->sync($post_id);
wc_delete_product_transients($post_id);
2021 年 4 月,代码如下:
$variation = wc_get_product_object( 'variation', $variation_id );
$variation->set_props(
array(
'regular_price' => $price,
'sale_price' => $sale_price,
)
);
$variation->save();
来源:函数save_variations($post_id,$post)
如果您查看最新版本 Woocommerce 的 Rest Api 控制器,您会发现它非常简单:
function set_price_to_variation($var_id, $price, $sale) {
if ( !empty($var_id) ) {
$variation = wc_get_product($var_id);
$variation->set_regular_price($price);
$variation->set_sale_price($sale);
$variation->save();
}
return $variation;
}
参考:\includes\rest-api\Controllers\Version3\class-wc-rest-product-variations-controller.php
我需要以编程方式更新可变产品及其所有变体的销售价格。
我需要添加什么样的元字段?
我正在尝试更新主要产品,例如:
update_post_meta($post_id, '_regular_price', '100');
update_post_meta($post_id, '_price', '50');
update_post_meta($post_id, '_sale_price', '50');
然后我更新每个变体
update_post_meta($variation_id, '_regular_price', '100');
update_post_meta($variation_id, '_price', '50');
update_post_meta($variation_id, '_sale_price', '50');
update_post_meta($variation_id, 'attribute_pa_taglia', $term_slug);
update_post_meta($variation_id, '_stock', $stock);
update_post_meta($variation_id, '_stock_status', 'instock');
update_post_meta($variation_id, '_manage_stock', 'yes');
后端:产品详情,一切正常
但是后端(产品列表)和前端给我旧价格
Update: Prices are also cached in transient
wp_options
table.Let say your product ID is
222
, you will have that transients meta_keys inwp_options
table (for this product ID):'_transient_timeout_wc_product_children_22' '_transient_wc_product_children_22' '_transient_timeout_wc_var_prices_222' // <=== <=== HERE '_transient_wc_var_prices_222' // <=== <=== <=== HERE
What you can try to do is to update expiration date
meta_value
to an outdated timestamp, this way:// Set here your product ID $main_product_id = 222 $transcient_product_meta_key = '_transient_wc_var_prices_'. $main_product_id; update_option( $transcient_product_meta_key, strtotime("-12 hours") ); wp_cache_delete ( 'alloptions', 'options' ); // Refresh caches
This way you will force the system to rebuild this outdated cached transient.
此外,您应该尝试 add/update 在您的父产品 ID(设置变体的主要产品)中:
// Set here your Main product ID (for example the last variation ID of your product)
$post_id = 22;
// Set here your variation ID (for example the last variation ID of your product)
$variation_id = 24;
// Here your Regular price
$reg_price = 100;
// Here your Sale price
$sale_price = 50;
update_post_meta($post_id, '_min_variation_price', $sale_price);
update_post_meta($post_id, '_max_variation_price', $sale_price);
update_post_meta($post_id, '_min_variation_regular_price', $reg_price);
update_post_meta($post_id, '_max_variation_regular_price', $reg_price);
update_post_meta($post_id, '_min_variation_sale_price', $sale_price);
update_post_meta($post_id, '_max_variation_sale_price', $sale_price);
update_post_meta($post_id, '_min_price_variation_id', $variation_id);
update_post_meta($post_id, '_max_price_variation_id', $variation_id);
update_post_meta($post_id, '_min_regular_price_variation_id', $variation_id);
update_post_meta($post_id, '_max_regular_price_variation_id', $variation_id);
update_post_meta($post_id, '_min_sale_price_variation_id', $variation_id);
update_post_meta($post_id, '_max_sale_price_variation_id', $variation_id);
// Optionally
wc_delete_product_transients($variation_id);
此外,我发现了其他同样有效的解决方案:
$product_variable = new WC_Product_Variable($post_id);
$product_variable->sync($post_id);
wc_delete_product_transients($post_id);
2021 年 4 月,代码如下:
$variation = wc_get_product_object( 'variation', $variation_id );
$variation->set_props(
array(
'regular_price' => $price,
'sale_price' => $sale_price,
)
);
$variation->save();
来源:函数save_variations($post_id,$post)
如果您查看最新版本 Woocommerce 的 Rest Api 控制器,您会发现它非常简单:
function set_price_to_variation($var_id, $price, $sale) {
if ( !empty($var_id) ) {
$variation = wc_get_product($var_id);
$variation->set_regular_price($price);
$variation->set_sale_price($sale);
$variation->save();
}
return $variation;
}
参考:\includes\rest-api\Controllers\Version3\class-wc-rest-product-variations-controller.php