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

时间:2018-08-21 01:13:55

标签: php wordpress woocommerce product stock

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

下面是我如何从SKU查找产品ID。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<img src="https://www.dignitasteam.com/wp-content/uploads/2015/09/3050613-inline-i-2-googles-new-logo-copy.png" class="button test" id="google" />
<img src="https://www.arabianbusiness.com/sites/default/files/styles/full_img/public/images/2017/01/17/apple-logo-rainbow.jpg" class="test button" id="apple" />
<div class="modal" data-id="google">
  <div class="header">Google</div>
  <ul>
    <li>
      First</li>
    <li>
      Second</li>
    <li>
      Third</li>
  </ul>
</div>
<div class="modal apple-modal" data-id="apple">
  <div class="header">Apple</div>
  <ul>
    <li>
      First</li>
    <li>
      Second</li>
    <li>
      Third</li>
  </ul>
</div>

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

然后我更新从提要中获取的库存。这可以是库存量从零到x或x到零以及介于两者之间的任何值。这就是我更新缺货的方式:

$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>";

这是奇怪的地方。

Updated sku

数据在管理面板的产品视图内正确显示。附带说明一下,该SKU可以属于一个变体(我们有成千上万个),也可以是一个简单的产品。最后,它们似乎都可以更新。我看不到任何错误。

我在我的functions.php中使用了一些PHP代码段,该代码段在下拉列表中显示了缺货商品。在这里:

$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

所以问题是:

  • 现在缺货的商品在下拉列表中不应显示为可点击,但仍然可以点击。
  • 前端的库存并不总是说零,而是让您选择一个然后说没有库存,因此“添加到购物车”按钮是活动的,不应激活。因此,前端看不到更新。
  • 产品的Woocommerce管理面板并未将缺货累积给父公司,我必须进行快速编辑和更新以使之发生。
  • 基本上,后端可以看到更改,但是前端不能真正正确显示。

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

谢谢

2 个答案:

答案 0 :(得分:7)

更新2

  

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

     
      
  1. 作为_stock_status元关键字的发布元数据(和以前一样)。
  2.   
  3. 作为outofstock自定义分类法中保留的职位名称product_visibility
  4.   

这意味着您只错过了步骤步骤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中,{strong> get the product Id from the sku有一项专用功能可供您使用:

wc_get_product_id_by_sku( $product_sku );

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

  

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

也最好使用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作业)

答案 1 :(得分:7)

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 string | $operation 操作类型,允许“设置”、“增加”和“减少”。
  • @param bool | $更新 |如果为 true,则产品对象不会保存在此处,因为稍后会更新。
  • @return bool|int|null