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

Posted

技术标签:

【中文标题】在 Woocommerce 3 中以编程方式更新产品库存【英文标题】:Updating product stock programmatically in Woocommerce 3 【发布时间】:2019-01-27 03:35:32 【问题描述】:

我需要帮助。我正在尝试以编程方式更新 woocommerce 产品库存数量。我们通过一些 JSON 向我们提供供应商信息。我可以从提要中读取股票,并且可以正确地从帖子元数据中提取数据。我正在使用最新版本的 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 ) );

这将返回正确的 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>";

然后我会更新我从提要中获得的库存。这可以是从零到 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

这就是奇怪的地方。

Updated sku

数据在管理面板的产品视图中正确显示。附带说明一下,这个 SKU 可以属于一个变体(我们有很多),也可以是一个简单的产品。最后,他们似乎都更新了。没有产生我看不到的错误。

我在我的functions.php 中使用了一个小的PHP sn-p,它使下拉列表中的缺货项目变灰。这里是:

    /* 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;

所以问题是:

现在缺货的商品在下拉菜单中不应显示为可点击,但它仍然是。 前端的库存并不总是说零,它让您选择一个然后说没有库存,因此添加到购物车按钮处于活动状态并且不应该。所以前端看不到更新。 Woocommerce 产品管理面板没有将缺货汇总到父级,我必须进行快速编辑和更新才能做到这一点。 基本上,后端会看到更改,但前端并没有真正正确显示。

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

谢谢

【问题讨论】:

我要感谢@LoicTheAztec 提供的帮助!另外作为旁注,我确实发现此功能也有效 - $new_quantity=wc_update_product_stock($product_id, 0)。再次感谢! 【参考方案1】:

更新 2

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

    作为_stock_status 元键的发布元数据(和以前一样)。 作为后期名称 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

希望它适用于您的 cron 作业。


原答案

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

woocommerce 中有一个专用功能到get the product Id from the sku 可以使用:

wc_get_product_id_by_sku( $product_sku );

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

从 woocommerce 3 开始,“缺货”库存状态也被管理考虑自定义分类product_visibility,术语名称为outofstock。所以更新帖子元是不够的。

最好使用 woocommerce 3 引入的new CRUD setters and getters methods。

所以试试下面的代码:

// 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 作业)

【讨论】:

谢谢@LoicTheAztec!当我使用 $product_id = wc_get_product_id_by_sku( $sku ); 时出现错误$product = get_wc_product($product_id); PHP 致命错误:未捕获错误:调用未定义函数 get_wc_product() 我认为这是因为它是从 CRON 作业调用的独立 PHP 文件。我的加载文件如下所示:define('WP_USE_THEMES', false); /** 加载 WordPress 环境和模板 */ require(dirname( FILE ) . '/wp-blog-header.php' );要求(目录名(文件)。'/wp-load.php'); @DavidPitzer 是的,当然,你应该在你的问题中提到这一点。稍后我将重新审视我的代码,尝试为该特定情况添加一个工作代码版本。 很抱歉给您带来了困惑。我并没有考虑太多,因为所有其他 WC 调用都返回数据和有效的产品 ID。 @DavidPitzer 所以问题可能只是与函数 wc_get_product_id_by_sku() 相关……如果你使用你的 sql 查询和我的其余代码会发生什么。有用吗? @nadia 使用:$product-&gt;set_manage_stock( true );【参考方案2】:

LoicTheAztecs 更新工作正常 (谢谢)

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

所以我找到了:

wc_update_product_stock函数

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

【讨论】:

以上是关于在 Woocommerce 3 中以编程方式更新产品库存的主要内容,如果未能解决你的问题,请参考以下文章

在 Woocommerce 中以编程方式添加新产品类别

在 WooCommerce 中以编程方式收取保存的 Stripe 卡

在 Woocommerce 管理订单编辑页面中以编程方式添加自定义订单备注

以编程方式更新 WooCommerce 订阅订单行项目

在 bigquery 中以编程方式更新/插入数据

以编程方式更新 WooCommerce 产品中设置的自定义属性值