且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在Woocommerce 3中以编程方式更新产品库存

更新时间:2023-11-30 12:59:34

更新2

由于woocommerce 3的缺货"产品状态保存在2个位置:

Since woocommerce 3 "outofstock" product status is saved in 2 locations:

  1. 作为_stock_status元键的发布元数据(就像以前一样).
  2. 保留为product_visibility自定义分类法的后一个术语名称outofstock
  1. As post meta data for _stock_status meta key (just as before).
  2. As a post term name outofstock remaining to product_visibility custom taxonomy

这意味着您只错过了一个步骤(第3步):

That means that you missed just a step (the step 3):

$out_of_stock_staus = 'outofstock';

// 1. Updating the stock quantity
update_post_meta($product_id, '_stock', 0);

// 2. Updating the stock quantity
update_post_meta( $product_id, '_stock_status', wc_clean( $out_of_stock_staus ) );

// 3. Updating post term relationship
wp_set_post_terms( $product_id, 'outofstock', 'product_visibility', true );

// And finally (optionally if needed)
wc_delete_product_transients( $product_id ); // Clear/refresh the variation cache

希望它能与您的cron工作一起使用.

It hope that it will work with your cron job.

原始答案

自woocommerce 3以来,您的代码有些过时,并且没有专门针对产品变化的库存状态设置...

Your code is a bit outdated since woocommerce 3 and there is no specifically a stock status setting for product variations...

woocommerce中有一个专用功能,用于从中获取产品ID您可以使用的sku :

There is a dedicated function in woocommerce to get the product Id from the sku that you could use:

wc_get_product_id_by_sku( $product_sku );

对于父级可变产品,您应该不需要启用库存管理,因为这是在每个产品变体中进行的(因此在产品变体级别上).

For the parent variable product, you should not need to enabled stock management as this is done in each of its product variations (so at the product variation level).

自woocommerce 3起,缺货"的库存状态也得到管理.自定义分类法 product_visibility,其术语名称为outofstock.因此,仅更新post meta是不够的.

Since woocommerce 3, the "outofstock" stock status is also managed thought a custom taxonomy product_visibility which term name is outofstock. So updating post meta is not enough.

也***使用新的CRUD设置器和getters方法在woocommerce 3中引入.

Also is better to use the new CRUD setters and getters methods introduced with woocommerce 3.

因此,请尝试以下代码:

So try the following code instead:

// get the product ID from the SKU
$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );

// Get an instance of the WC_Product object
$product = new WC_Product( $product_id );

// Get product stock quantity and stock status
$stock_quantity = $product->get_stock_quantity();
$stock_status   = $product->get_stock_status();

// Display stock quantity and status
echo '<p>Product Stock quantity: ' . $stock_quantity . '</br>
    Product Stock status: ' . $stock_status . '</p></br>';

// Set product stock quantity (zero) and stock status (out of stock)
$product->set_stock_quantity();
$product->set_stock_status('outofstock');

// Save the data and refresh caches
$product->save();

经过测试并可以在正常情况下运行((但显然不支持cron作业)

Tested and works in a normal context (but apparently not with a cron job)