根據woocommerce github問題here,他們說(24小時持有股票&取消無補貨)是正確的行爲。訂單可能由於各種原因被取消 - 不正確的庫存水平,錯誤的產品,用戶選擇等等,因此庫存的重新增量應該完全是(手動的)管理決策。
所以,我嘗試重寫我的孩子主題的功能.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');
}
希望它能幫助。