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

Dav*_*ave 9 php wordpress product stock woocommerce

我需要帮助.我正在尝试以编程方式更新woocommerce产品库存数量.我们通过一些JSON向我们提供了供应商.我可以从Feed中读取库存,并且可以正确地从post meta中提取数据.我正在使用WP和WOO的最新版本.PHP是7.2

以下是我如何从SKU中找到产品ID.

$product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $sku ) );
Run Code Online (Sandbox Code Playgroud)

这将返回正确的ID,我可以使用它来查看已存在的当前元数据:

$website_stock = get_post_meta($product_id, '_stock', true);
echo "Website Stock -  " . $website_stock . "</br>";
$website_stock_status = get_post_meta($product_id, '_stock_status', true);
echo "Website Stock Status -  " . $website_stock_status . "</br>";
Run Code Online (Sandbox Code Playgroud)

然后我更新了我从Feed中获得的库存.这可以是从零到x或x到零以及介于两者之间的任何地方.这是我更新缺货的方式:

$out_of_stock_staus = 'outofstock';

update_post_meta($product_id, '_stock', 0);
update_post_meta($product_id, '_stock_status', wc_clean( $out_of_stock_staus ));
wc_delete_product_transients( $product_id ); // Clear/refresh the variation cache
Run Code Online (Sandbox Code Playgroud)

这是它变得奇怪的地方.

更新了sku

数据在管理面板的产品视图中正确显示.作为旁注,这个SKU可以属于一个变体(我们有很多),或者它可能是一个简单的产品.最后,他们似乎都更新了.我没有看到错误.

我在我的functions.php中使用了一个小小的PHP片段,它在下拉列表中显示缺货项目.这里是:

    /* Grey out out of stock items in the product dropdown */
add_filter( 'woocommerce_variation_is_active', 'grey_out_variations_when_out_of_stock', 10, 2 );

function grey_out_variations_when_out_of_stock( $grey_out, $variation ) {

   if ( ! $variation->is_in_stock() )
        return false;

    return true;
}
Run Code Online (Sandbox Code Playgroud)

所以问题是:

  • 现在缺货商品不应该在下拉列表中显示为可点击,但它仍然是.
  • 前端的股票并不总是零,它让你选择一个然后说没有股票,所以添加到购物车按钮是活动的,不应该.所以前端没有看到更新.
  • 产品的Woocommerce管理面板没有将缺货卷到父母那里,我必须快速编辑和更新才能实现.
  • 基本上,后端看到了变化,但前端并没有真正正确显示.

任何人都可以提供的任何帮助将不胜感激!

谢谢

Loi*_*tec 8

更新2

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

  1. 作为_stock_status元密钥的发布元数据(就像以前一样)。
  2. 作为自定义分类法的outofstock剩余术语名称product_visibility

这意味着您只错过了一个步骤第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
Run Code Online (Sandbox Code Playgroud)

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


原始答案

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

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

wc_get_product_id_by_sku( $product_sku );
Run Code Online (Sandbox Code Playgroud)

对于父变量产品,您不需要启用库存管理,因为这是在其每个产品变体中完成的(因此在产品变体级别)。

从woocommerce 3开始,还通过自定义分类法 product_visibility(术语名称为)来管理“缺货”库存状态outofstock。因此,仅更新post meta是不够的。

也最好使用woocommerce 3引入的新的CRUD设置器和获取器方法

因此,请尝试以下代码:

// 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();
Run Code Online (Sandbox Code Playgroud)

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

  • @nadia 使用:`$product-&gt;set_manage_stock( true );` (2认同)

ole*_*lin 7

LoicTheAztecs 更新工作正常(谢谢)

但我在想:为什么没有 WC 标准的功能呢?

所以我找到了:

wc_update_product_stock 函数

 wc_update_product_stock($product, $stock_quantity=null, $operation='set', $updating = false)
Run Code Online (Sandbox Code Playgroud)
  • @param int|WC_Product | $product |产品 ID 或产品实例。
  • @param int|null | $stock_quantity 库存数量。
  • @param 字符串 | $operation 操作类型,允许“设置”、“增加”和“减少”。
  • @param bool | $更新 | 如果为 true,则产品对象将不会保存在此处,因为它将在稍后更新。
  • @return bool|int|null