WooCommerce авто восстановление запасов при отмене заказа

Я ищу решение для автоматического восстановления запасов при отмене заказа. Я использую шлюз PayU на сайте моего клиента, и он работает, переводя все заказы в режим ожидания при ожидании платежа, и отменяет их через 24 часа, если действительный платеж не сделан. Однако это означает, что встроенный механизм WooCommerce для замораживания запасов и последующего пополнения запасов по истечении заданного времени не работает (так как платежный шлюз устанавливает состояние на удержание).

Был плагин под названием WooCommerce Auto Restore Stock от Герхарда Потгитера, но он старый, и мне не удалось найти аналогичное решение в хранилище плагинов WordPress или в Codecanyon.

Возможно, кто-то наткнулся на решение для автоматического восстановления запаса для отмененных заказов, которое работает с WC 3.0+?

1 ответ

В соответствии с проблемой gooub от woocommerce, они говорят, что (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' );
}

Надеюсь, поможет.

Другие вопросы по тегам