更改 WooCommerce 中特定付款方式的订单保留库存时间

问题描述 投票:0回答:1

我正在使用 WooCommerce 销售一些数字产品。由于我们业务的性质,我们不希望商品库存低于 0(-1、-2 等)

我们目前接受不同的付款方式,包括加密货币和 Stripe。由于加密货币的交易速度较低,有时需要长达1小时,所以我们面临这样的问题:

  1. 当用户(用户 A)购买商品并使用加密货币付款时,商品库存将被保留(从 1 变为 0)。由于区块链速度较慢,需要2个小时才能完成支付。由于速度太慢,商品库存从 0 回到 1。
  2. 当区块链支付尚未完成时,另一个用户(用户B)来购买相同的产品。此时,该物品不再被持有。因此,该用户获得了该产品。商品库存从 1 变为 0。
  3. 区块链支付终于确认。 Woocommerce 还将产品提供给该用户。商品库存从 0 变为 -1。

因此 2 个用户获得相同的产品。

如何预防这个问题?

我还没找到解决办法。

php woocommerce product stock orders
1个回答
0
投票

对于使用特定付款方式通过的订单(未经测试),以下应更改持货时间(默认60分钟)

请参阅如何在 WooCommerce 中获取付款方式的 ID?

在下面的函数中,您将定义所需的付款方式 ID (针对您的加密货币付款选项) 以及所需的持有股票时间(以分钟为单位):

add_action( 'woocommerce_checkout_order_created', 'wc_reserve_stock_for_crypto', 5 );
function wc_reserve_stock_for_crypto( $order ) {
    // HERE below define the desired payment ID(s)
    $targeted_payment_ids = array('coinbase', 'coinpayments'); 
    // HERE below define the time in minutes to hold stock
    $hold_stock_minutes   = 150; 

    if ( in_array( $order->get_payment_method(), $targeted_payment_ids ) ) {
        // Remove the default functionality to hold stock for 60 minutes
        remove_action( 'woocommerce_checkout_order_created', 'wc_reserve_stock_for_order' );

        if ( ! apply_filters( 'woocommerce_hold_stock_for_checkout', wc_string_to_bool( get_option( 'woocommerce_manage_stock', 'yes' ) ) ) ) {
            return;
        }

        $order = $order instanceof WC_Order ? $order : wc_get_order( $order );

        if ( $order ) {
            // Add back the functionality with a custom delay to hold the stock
            ( new \Automattic\WooCommerce\Checkout\Helpers\ReserveStock() )->reserve_stock_for_order( $order, $hold_stock_minutes );
        }
    }
}

代码位于子主题的functions.php 文件中(或插件中)。应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.