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

2024-04-14

我非常需要帮助。我正在尝试以编程方式更新 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

这就是奇怪的地方。

更新的 SKU https://i.stack.imgur.com/blUiM.jpg

数据在管理面板的产品视图中正确显示。顺便说一句,这个 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;
}

所以问题是:

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

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

谢谢


Update 2

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

  1. 作为后元数据_stock_status元键(和以前一样)。
  2. 作为后术语名称outofstock剩余到product_visibility自定义分类法

这意味着你只错过了一步(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 作业配合使用。


原答案

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

woocommerce中有一个专门的功能to 从 sku 获取产品 ID https://docs.woocommerce.com/wc-apidocs/function-wc_get_product_id_by_sku.html你可以使用:

wc_get_product_id_by_sku( $product_sku );

For the 父变量产品, 你应该not need启用库存管理,因为这是在每个产品变体中完成的(因此在产品变体级别)。

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

也最好使用新的 CRUD setter 和 getter 方法 https://github.com/woocommerce/woocommerce/wiki/CRUD-Objects-in-3.0与 woocommerce 3 一起引入。

因此请尝试以下代码:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Woocommerce 3 中以编程方式更新产品库存 的相关文章

随机推荐

  • 使用 Bluebird 进行 Mongoose 承诺的正确方法是什么?

    我一直在阅读文档和文章 每个人似乎都描述了一起使用 Mongoose 和 Bluebird 的不同方式 甚至 Mongoose 官方文档说了些什么 http mongoosejs com docs promises html蓝鸟文档说另一件
  • BOOST_LIKELY 和 __builtin_expect 仍然相关吗?

    我明白所解释的内容here https stackoverflow com questions 7346929 why do we use builtin expect when a straightforward way is to us
  • ListBox MVVM 中的清除选择

    在 MVVM Silverlight 应用程序中 用户可以在 TextBox 中输入文本 并且 ListBox 内容会相应更改 例如 如果用户输入 TV 列表框将填充所有可用的电视品牌 并且用户可以从列表框和列表框条目中选择产品 接下来 如
  • 在运行 ActionEvent 之前 GUI 不会在视觉上更新

    为了详细说明一下 我有一个如下所示的 GUI 然后我在 确定 按钮上有一个动作侦听器 其开头如下 OK Button Action Listener private void okButtonActionPerformed ActionEv
  • TSQL 将结果集均分并更新

    我的数据库有 3 个表 如下所示 Orders 表的数据如下 OrderID OperatorID GroupID OrderDesc Status Cash 1 1 1 small order 1 100 2 1 1 another or
  • NodeJS 推送队列,由 Laravel Worker 消耗

    我正在尝试使用节点应用程序发送到 SQS 的消息 因此 推送 操作由服务器 A 上的 Node App 执行 监听 操作由服务器 B 上的 Laravel App 执行 我的问题 我不知道如何格式化要使用的有效负载php artisan q
  • 在托管代码中 P/Invoking SetWindowLong 和 CallWindowProc(紧凑框架)

    我正在尝试使用 SetWindowLong 覆盖 winmobile 任务栏的窗口过程 以便捕获和阻止按下的按钮 我创建了一个类 其中包含一种用于重写的方法和一种用于恢复窗口过程的方法 MessageReceived 方法是我用来替换任务栏
  • 从代码注释中引用 TFS 工作项

    在 Visual Studio 2012 中 我想要从代码注释到 TFS 工作项的可单击引用 有没有一种简单的方法可以做到这一点 这也可以通过函数体内的注释 不是函数的摘要 来实现吗 所以我想要这样的东西
  • 如何使用c#仅获取目录中的文件名?

    当我使用下面的代码行时 我得到一个包含各个文件的整个路径的字符串数组 private string pdfFiles Directory GetFiles C Documents pdf 我想知道是否有一种方法可以只检索字符串中的文件名而不
  • 使用 spring 的条件 bean

    我正在尝试写一个ValidatorFactory这将根据其类型为我提供一个验证器 public Validator getNewValidator ValidatorType type switch case a new Validator
  • 如何修复创建新页面时的此错误?

    我有一个 Xamarin Forms 项目 在这个项目中 我已经有一个空白页面 但我添加了一个新页面 此时错误开始显示 显示的错误是 Error XLS0414 The type ContentPage was not found Veri
  • jQuery:检查字符串中是否存在特殊字符

    我知道这个问题在 Stack 上被问得更频繁 但我似乎无法从已经发布的问题中得到直接的答案 我需要检查所有特殊字符 除了 是否都在字符串中 如果是 则向用户发出警报 到目前为止我所拥有的是这样的 if Search val indexOf
  • 我可以在 C# *using* 块中拥有不同类型的对象吗?

    using Font font3 new Font Arial 10 0f font4 new Font Arial 10 0f Use font3 and font4 我知道可以在一个对象内使用多个相同类型的对象using clause
  • PhoneGap Build 版本 2.7.0 忽略 Android 上 config.xml 中的全屏首选项

    我已遵循此页面上非常明确的说明 https build phonegap com docs config xml https build phonegap com docs config xml 我已在 config xml 文件中包含以下
  • 有人能够正确使用 libsensors 吗?

    长话短说 我正在尝试编写一个可以检查CPU温度的应用程序 使用 libsensors 3 手册页 我至少能够获得 libsensors version 号 截至目前 这是我的代码 include
  • 在 Slack 上发布带有附加文件的消息

    我正在用 C 编写一个简单的控制台应用程序来与 Slack com 进行通信 我通过他们的 WebApi 执行此操作 目前我知道如何发布消息 带有附件 彩色 链接 用户等 并将文件发送到服务器 如果您以正常方式发送文件 键入文本框左侧的 上
  • 目录中的文件按文件名升序排序

    我有一个目录中的文件列表 我想按文件名对其进行排序 这是主要代码 var localPath this Server MapPath Content Img type var directory new DirectoryInfo loca
  • Date.toString() 显示哪个时区?

    默认情况下 方法执行哪个时区java util Date toString http download oracle com javase 6 docs api java util Date html toString 28 29展示 自从
  • 从服务器下载图像以显示在 CollectionView 上

    我正在开发一个用户可以出售 购买的产品应用程序 该应用程序基于集合视图 集合视图具有集合单元格 其中显示产品图像缩略图 以下代码从服务器获取产品图像 并等待下载所有图像 然后将它们显示在单元格中 以下代码有效 但用户需要等待 10 20 秒
  • 在 Woocommerce 3 中以编程方式更新产品库存

    我非常需要帮助 我正在尝试以编程方式更新 woocommerce 产品库存数量 我们通过一些 JSON 向我们提供了供应商提要 我可以从提要中读取股票 并可以正确地从帖子元中提取数据 我正在使用最新版本的 WP 和 WOO PHP 是 7