在 Woocommerce 3 中以编程方式更新产品库存
Updating product stock programmatically in Woocommerce 3
我需要帮助。我正在尝试以编程方式更新 woocommerce 产品库存数量。我们通过 JSON 向我们提供供应商信息。我可以从提要中读取股票,并可以正确地从 post 元数据中提取数据。我正在使用最新版本的 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 片段,它使下拉列表中的缺货商品变灰。这是:
/* 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;
}
所以问题是:
- 现在缺货的商品不应在下拉列表中显示为可点击,但它仍然是。
- 前端的库存并不总是说零,它让你 select 然后说没有库存,所以添加到购物车按钮是活动的,不应该是。所以前端看不到更新。
- 产品的 Woocommerce 管理面板没有将缺货汇总到父级,我必须进行快速编辑和更新才能做到这一点。
- 基本上,后端看到了变化,但前端并没有真正正确显示。
任何人都可以提供任何帮助,我们将不胜感激!
谢谢
更新 2
Since woocommerce 3 "outofstock" product status is saved in 2 locations:
- As post meta data for
_stock_status
meta key (just as before).
- As a post term name
outofstock
remaining to product_visibility
custom taxonomy
这意味着您只漏了一步 (第 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 以来有点过时,并且没有专门针对产品变体的库存状态设置...
There is a dedicated function in woocommerce to get the product Id from the sku that you could use:
wc_get_product_id_by_sku( $product_sku );
对于父变量产品,您应该不需要启用库存管理,因为它在每个产品变体中都已完成(所以在产品变化级别)。
Since woocommerce 3, the "outofstock" stock status is also managed thought a custom taxonomy product_visibility
which term name is outofstock
. So updating post meta is not enough.
最好使用 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 作业)
LoicTheAztecs 更新工作正常
(谢谢)
但我在想:为什么没有一个 WC 标准函数呢?
所以我找到了:
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 操作类型,允许 'set'、'increase' 和 'decrease'.
- @param 布尔 | $更新 |如果为 true,产品对象不会保存在这里,因为稍后会更新它。
- @return bool|int|null
我需要帮助。我正在尝试以编程方式更新 woocommerce 产品库存数量。我们通过 JSON 向我们提供供应商信息。我可以从提要中读取股票,并可以正确地从 post 元数据中提取数据。我正在使用最新版本的 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 片段,它使下拉列表中的缺货商品变灰。这是:
/* 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;
}
所以问题是:
- 现在缺货的商品不应在下拉列表中显示为可点击,但它仍然是。
- 前端的库存并不总是说零,它让你 select 然后说没有库存,所以添加到购物车按钮是活动的,不应该是。所以前端看不到更新。
- 产品的 Woocommerce 管理面板没有将缺货汇总到父级,我必须进行快速编辑和更新才能做到这一点。
- 基本上,后端看到了变化,但前端并没有真正正确显示。
任何人都可以提供任何帮助,我们将不胜感激!
谢谢
更新 2
Since woocommerce 3 "outofstock" product status is saved in 2 locations:
- As post meta data for
_stock_status
meta key (just as before).- As a post term name
outofstock
remaining toproduct_visibility
custom taxonomy
这意味着您只漏了一步 (第 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 以来有点过时,并且没有专门针对产品变体的库存状态设置...
There is a dedicated function in woocommerce to get the product Id from the sku that you could use:
wc_get_product_id_by_sku( $product_sku );
对于父变量产品,您应该不需要启用库存管理,因为它在每个产品变体中都已完成(所以在产品变化级别)。
Since woocommerce 3, the "outofstock" stock status is also managed thought a custom taxonomy
product_visibility
which term name isoutofstock
. So updating post meta is not enough.
最好使用 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 作业)
LoicTheAztecs 更新工作正常 (谢谢)
但我在想:为什么没有一个 WC 标准函数呢?
所以我找到了:
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 操作类型,允许 'set'、'increase' 和 'decrease'.
- @param 布尔 | $更新 |如果为 true,产品对象不会保存在这里,因为稍后会更新它。
- @return bool|int|null