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

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

  1. 当用户(用户A)购买物品并使用Crypto支付时,物品库存被保留(从1到0).由于区块链速度较慢,完成支付需要2个小时.由于它是如此缓慢,物品库存从0回到1.
  2. 在区块链支付仍悬而未决的时候,另一位用户(用户B)来购买相同的产品.此时,该物品不再被持有.因此,该用户可以获得产品.物料库存从1变为0.
  3. 区块链支付终于得到确认.WooCommerce也将产品提供给该用户.物料库存从0降至-1.

因此,两个用户可以得到相同的产品.

如何防止这一问题?

我还没有找到任何解决方案.

推荐答案

下面的代码应该更改通过特定支付方法(untested)传递的订单的持有股票(60 minutes by default)的时间.

请参见How to get the ID of a payment method in WooCommerce?.

下面,在函数内部,您将定义所需的支付方式(S)ID(S)(for your cryptocurrency payment option(s))和所需的持有股票的时间(分钟):

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 );
        }
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).应该能行得通.

Php相关问答推荐

用户信息更新期间Laravel邮箱验证问题

PHP邮件表单无法识别重音/特殊字符

LaravelEloquent 地根据表中的值提取记录

在WooCommerce产品变体SKU字段旁边添加自定义输入字段

WooCommerce中基于用户角色的不同产品差价

如何从WooCommerce checkout 帐单邮箱字段中删除星号?

ANTLR4-lexer如何消耗更多的 token 并停止现有规则?

无法允许元素(img:'src')与symfony html-sanitizer(symfony6.3 php 8.2)

如何将不同的 Woocommerce 费用合并为一个名称?

PHP 解析 XML 以获取多个深度的所有字符串值

将图像作为 PHP post 响应发送到浏览器

在 vue 自定义渲染器中访问变量

我的功能以舒适的方式显示数组 struct

我试图在我的视图上显示从数据库中获取的数据,但我无法显示它.拉维尔 10.x /

Symfony 6 中的入口点 (public/index.php) - 它是如何工作的?

Laravel 从嵌套数组的第二级获取最后一项

Symfony 在将它传递给 Twig 时是否从数据库中获取整个对象?

复杂的mysql查询问题

如何将文件直接上传到 Cloudinary 而不先保存在 public 文件夹中

如何简化 php API 中的格式化数组列表数据以提供 React Native 部分列表