当前位置: 首页 > 知识库问答 >
问题:

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

冷越泽
2023-03-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

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

我在函数中使用了一些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管理面板没有将缺货卷到父服务器,我必须进行快速编辑和更新。
  • 基本上,后端看到了变化,但是前端并没有真正正确地显示出来。

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

非常感谢。

共有2个答案

爱繁
2023-03-14

LoicTheAztecs更新工作正常(谢谢)

但是我在想:为什么没有一个WC标准函数来实现这个呢?

因此,我发现:

wc_更新_产品_库存功能

 wc_update_product_stock($product, $stock_quantity=null, $operation='set', $updating = false)
  • @参数int|WC_Product|$产品|产品ID或产品实例。
  • @参数int|null|$stock_quantity库存数量。
  • @参数字符串|$操作操作类型,允许设置,增加和减少。
  • @参数bool|$更新|如果为true,产品对象将不会保存在这里,因为它将稍后更新。
  • @返回bool|int|null
陆子航
2023-03-14

更新2

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

  1. 作为\u stock\u status元键的后期元数据(与之前一样)

这意味着您只错过了一个步骤(步骤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中有一个专门的函数,可以从sku中获取您可以使用的产品ID:

wc_get_product_id_by_sku( $product_sku );

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

自woocommerce 3以来,“缺货”库存状态也通过自定义分类法产品可见性进行管理,其术语名称为缺货。所以仅仅更新post-meta是不够的。

使用woocommerce 3中引入的新CRUD setter和getter方法也更好。

所以请尝试以下代码:

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

 类似资料:
  • 每次根据其他几个字段的内容保存产品时,我都希望更新产品在我的商店中的属性。 然而,我正在努力让我的属性正确出现。 最初,我试图使用以下功能根据这个问题的公认答案更新产品: 这将添加到了分类法的可用术语列表中,但在我检查产品属性时,它们不可见。 接下来,我尝试了上述问题中第二个答案的变体: 这也无法更新产品的属性。 在这一点上,我不知道下一步该尝试什么。使用操作似乎是有效的,因为这个术语确实被添加到

  • 如何从插件为WooCommerce创建属性?我只发现: 从这个问题 但这种方法需要某些产品的id。我需要生成一些未附加到任何产品的属性。

  • 我有一个WS,它返回非常基本的产品数据:代码、价格和图像。我需要用这些基本数据以编程方式创建Hybris产品,然后进行同步,以便在店面上看到这些产品。 创建具有这些基本信息的产品的步骤是什么?有OOTB服务吗?

  • 我想创建一个产品从前端直接到一个分组的产品在WooCommerce。现在它正在“简单产品”中创建一个产品。 截图: 当前代码:

  • 我试图以编程方式批量添加WooCommerce中的产品,但出于某种原因,它只是添加了第一个产品。我正在向一个应用程序发出请求,该应用程序返回带有产品名称和描述的JSON响应。到目前为止,我的代码看起来像下面的代码:

  • 我在任何地方都没看到有人问过这个问题,所以下面是: 我在我的Magento商店里有几个属性,但是为了让用户从过于杂乱的页面中解脱出来,我用标签把产品页面上不同类型的信息分开。第一个选项卡显示产品描述,它目前是一组HTML,基本上是通过显示易于理解的图标来镜像属性,图标下有属性值,第二个选项卡显示更深入的信息,属性是从DB调用的。 现在,当编辑或添加产品时,我基本上必须添加两次属性:一次作为实际的产