当 WooCommerce 订单状态完成时更新产品库存量和库存状态
Update product stock amount and stock status when WooCommerce order status is completed
我们出售手工制品。只能购买可变产品的一种变体。
订购变体后,该变体产品的库存变为 0,并且在订单完成之前无法订购产品。我可以设置库存状态和库存数量如下:
//when order is completed the stock and stock status are reset to instock and 1
add_action( 'woocommerce_order_status_completed', 'my_function' );
function my_function($order_id) {
$order = wc_get_order( $order_id );
$items = $order->get_items();
$product_id;
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
} //end foreach
$new_stock_status = 'instock';
// 1. Updating the stock quantity
update_post_meta($product_id, '_stock', 1);
// 2. Updating the stock quantity
update_post_meta( $product_id, '_stock_status', wc_clean( $new_stock_status ) );
// 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
}
我不确定这段代码是否正确,但它似乎有效。
但是单品页面一直显示缺货信息。只有当我添加:
//reset stock in product
add_action( 'woocommerce_admin_process_product_object', 'lumi_reset_stock' );
function lumi_reset_stock( $product ) {
// Using WC setters
$product->set_manage_stock(true);
$product->set_stock_quantity(1);
$product->set_stock_status('instock');
}
并将产品保存在管理后台,然后可以再次购买该产品。
这有点复杂。我如何在订单完成后重置产品的库存和 stock_status?
查看数据库 > wp_wc_product_meta_lookup 库存状态显示缺货且数量为 0,即使在保存产品后也是如此。我必须重置这些值吗?
尽管您的代码有效,但您遗漏了一些 checks/points:
- 您的更新功能适用于每个产品,而这实际上仅适用于缺货的变体
- wc_update_product_stock() - 更新产品的库存量
- wc_update_product_stock_status() - 更新产品的库存状态
所以你得到:
function action_woocommerce_order_status_completed( $order_id ) {
// The WC_Order instance Object
$order = wc_get_order( $order_id );
// Is a order
if ( is_a( $order, 'WC_Order' ) ) {
// Loop through order items
foreach ( $order->get_items() as $key => $item ) {
// The WC_Product instance Object
$product = $item->get_product();
// Product type
if ( $product->get_type() == 'variation' ) {
// NOT in stock
if ( ! $product->is_in_stock() ) {
// Update a product's stock amount
wc_update_product_stock( $product, 1, 'set', 'false' );
// Update a product's stock status
wc_update_product_stock_status( $product->get_id(), 'instock' );
}
}
}
}
}
add_action( 'woocommerce_order_status_completed', 'action_woocommerce_order_status_completed', 10, 1 );
我们出售手工制品。只能购买可变产品的一种变体。
订购变体后,该变体产品的库存变为 0,并且在订单完成之前无法订购产品。我可以设置库存状态和库存数量如下:
//when order is completed the stock and stock status are reset to instock and 1
add_action( 'woocommerce_order_status_completed', 'my_function' );
function my_function($order_id) {
$order = wc_get_order( $order_id );
$items = $order->get_items();
$product_id;
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
} //end foreach
$new_stock_status = 'instock';
// 1. Updating the stock quantity
update_post_meta($product_id, '_stock', 1);
// 2. Updating the stock quantity
update_post_meta( $product_id, '_stock_status', wc_clean( $new_stock_status ) );
// 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
}
我不确定这段代码是否正确,但它似乎有效。
但是单品页面一直显示缺货信息。只有当我添加:
//reset stock in product
add_action( 'woocommerce_admin_process_product_object', 'lumi_reset_stock' );
function lumi_reset_stock( $product ) {
// Using WC setters
$product->set_manage_stock(true);
$product->set_stock_quantity(1);
$product->set_stock_status('instock');
}
并将产品保存在管理后台,然后可以再次购买该产品。
这有点复杂。我如何在订单完成后重置产品的库存和 stock_status?
查看数据库 > wp_wc_product_meta_lookup 库存状态显示缺货且数量为 0,即使在保存产品后也是如此。我必须重置这些值吗?
尽管您的代码有效,但您遗漏了一些 checks/points:
- 您的更新功能适用于每个产品,而这实际上仅适用于缺货的变体
- wc_update_product_stock() - 更新产品的库存量
- wc_update_product_stock_status() - 更新产品的库存状态
所以你得到:
function action_woocommerce_order_status_completed( $order_id ) {
// The WC_Order instance Object
$order = wc_get_order( $order_id );
// Is a order
if ( is_a( $order, 'WC_Order' ) ) {
// Loop through order items
foreach ( $order->get_items() as $key => $item ) {
// The WC_Product instance Object
$product = $item->get_product();
// Product type
if ( $product->get_type() == 'variation' ) {
// NOT in stock
if ( ! $product->is_in_stock() ) {
// Update a product's stock amount
wc_update_product_stock( $product, 1, 'set', 'false' );
// Update a product's stock status
wc_update_product_stock_status( $product->get_id(), 'instock' );
}
}
}
}
}
add_action( 'woocommerce_order_status_completed', 'action_woocommerce_order_status_completed', 10, 1 );