我正在寻找解决方案,以便在订单取消时自动恢复库存。我在客户的网站上使用PayU网关,它可以在等待付款时设置所有待机订单,并在24小时后取消订单,如果没有有效付款的话。但是,这意味着WooCommerce内置机制用于冻结库存,然后在给定时间后重新进货并不起作用(因为支付网关将状态设置为保持)。
Gerhard Potgieter有一个名为WooCommerce Auto Restore Stock的插件,但它是一个老人,我无法在WordPress插件库或Codecanyon上找到类似的解决方案。
也许有人偶然发现了一个解决方案,可以自动恢复与WC 3.0 +一起使用的取消订单的库存?
答案 0 :(得分:1)
根据woocommerce github问题here,他们说(24小时持有股票和取消没有补货)是正确的行为。订单可以由于各种原因而被取消 - 不正确的库存水平,错误的产品,用户选择等等,因此库存的重新增加应该是完全(手动)管理决策。
所以,我尝试覆盖我的孩子主题的functions.php中的函数,它可以工作!
以下是代码:
remove_filter( 'woocommerce_cancel_unpaid_orders', 'wc_cancel_unpaid_orders' );
add_filter( 'woocommerce_cancel_unpaid_orders', 'override_cancel_unpaid_orders' );
function override_cancel_unpaid_orders() {
$held_duration = get_option( 'woocommerce_hold_stock_minutes' );
if ( $held_duration < 1 || 'yes' !== get_option( 'woocommerce_manage_stock' ) ) {
return;
}
$data_store = WC_Data_Store::load( 'order' );
$unpaid_orders = $data_store->get_unpaid_orders( strtotime( '-' . absint( $held_duration ) . ' MINUTES', current_time( 'timestamp' ) ) );
if ( $unpaid_orders ) {
foreach ( $unpaid_orders as $unpaid_order ) {
$order = wc_get_order( $unpaid_order );
if ( apply_filters( 'woocommerce_cancel_unpaid_order', 'checkout' === $order->get_created_via(), $order ) ) {
//Cancel Order
$order->update_status( 'cancelled', __( 'Unpaid order cancelled - time limit reached.', 'woocommerce' ) );
//Restock
foreach ($order->get_items() as $item_id => $item) {
// Get an instance of corresponding the WC_Product object
$product = $item->get_product();
$qty = $item->get_quantity(); // Get the item quantity
wc_update_product_stock($product, $qty, 'increase');
}
}
}
}
wp_clear_scheduled_hook( 'woocommerce_cancel_unpaid_orders' );
wp_schedule_single_event( time() + ( absint( $held_duration ) * 60 ), 'woocommerce_cancel_unpaid_orders' );
}
希望它有所帮助。