为了账号安全,请及时绑定邮箱和手机立即绑定

允许在 WooCommerce 订单处于待处理状态时减少库存

允许在 WooCommerce 订单处于待处理状态时减少库存

PHP
交互式爱情 2024-01-19 15:55:33
如果客户在线付款(例如使用 PayPal),WooCommerce 将创建订单,然后等待付款。这个“等待”就是订单状态pending。在此期间没有库存减少,这是非常糟糕的。支付成功后,订单状态改为 ,库存减少on-hold。但有时付款可能需要30分钟,而在这30分钟内订单保持pending状态并且库存没有减少,因此如果是库存中的最后一件产品,在此期间仍然有货。因此,如果我每种产品只有1-3件库存,那么很有可能,如果我只有最后一件产品库存,那么在这30分钟内就会有其他人来购买它,这导致到最后一块可以卖两次的情况,这是不可接受的。因此,我需要在使用任何类型的付款和任何类型的运输创建任何订单后立即减少库存。因此,我尝试创建一个片段,它将使用一个钩子woocommerce_order_status_changed,并且当订单状态更改为 时,它应该始终减少库存pending,因为pending状态不会减少库存。我不知道这样的态度是否正确,该如何解决。有人可以帮忙吗?我尝试了这两个片段,但没有任何行为变化:add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {    if ( $order->has_status( 'pending' )) {        $reduce_stock = true;    }    return $reduce_stock;}add_action( 'woocommerce_order_status_pending', 'wc_maybe_reduce_stock_levels' );add_action( 'woocommerce_order_status_changed', 'order_stock_reduction_based_on_status', 20, 4 );function order_stock_reduction_based_on_status( $order_id, $old_status, $new_status, $order ){    if ( $new_status == 'pending'){    $stock_reduced = get_post_meta( $order_id, '_order_stock_reduced', true );        if( empty($stock_reduced) && $order->get_payment_method() == 'barion' ){            wc_reduce_stock_levels($order_id);        }    }}
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

您可以简单地添加以下代码行,以允许在挂单状态下减少库存(WooCommerce 将执行在挂单上触发该功能的wc_maybe_reduce_stock_levels()工作):

add_action( 'woocommerce_order_status_pending', 'wc_maybe_reduce_stock_levels' );

代码位于活动子主题(或活动主题)的functions.php 文件中。它应该有效。


查看完整回答
反对 回复 2024-01-19
?
慕慕森

TA贡献1856条经验 获得超17个赞

嗯,这是我现在找到的唯一可行的解决方案:


add_action( 'woocommerce_checkout_create_order', 'force_new_order_status', 20, 1 );

function force_new_order_status( $order )

if( ! $order->has_status('on-hold') ) 

        $order->set_status( 'on-hold', 'Forced status by a custom script (this note is not neccessary and can be deleted)' ); 

}

只有一个问题:如果付款失败,库存将无法退回。因此,必须采取其他措施,例如在(例如)60 分钟后自动取消未付款订单,或使用支付网关的特定挂钩。set_status不管怎样,我今天学到的,和 之间存在巨大的差异update_status。像我这样的新手请注意!:-) 因此,通过这种方式,我会自动将 WooCommerce 发出的每个新订单的pending状态(不会减少订购的库存)切换为on-hold状态(会减少订购的库存),这是解决我的问题的有效方法。对于高级程序员来说可能太容易了,但是因为我在两天的搜索中没有找到问题的正确工作解决方案,所以我将其发布,即使它是如此微不足道,以节省另一个初学者的时间,因为正如我在搜索过程中发现的那样:我不是只有下订单后需要立即减少库存的人。所以这就是方法!:-)


查看完整回答
反对 回复 2024-01-19
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您需要添加库存减少钩子(正如 LoicTheAztec 已经回答的那样),但您还需要删除相反的 wc_maybe_increase_stock_levels 钩子。要正确删除它,您需要在它已经挂钩时运行它,因此您需要将其包装到 init 挂钩中。


以下对我有用(Woocommerce 5.4.1) - 确保待定状态减少库存水平:


add_action( 'init', function() {

    add_action('woocommerce_order_status_pending', 'wc_maybe_reduce_stock_levels');

    remove_action('woocommerce_order_status_pending', 'wc_maybe_increase_stock_levels');

});


查看完整回答
反对 回复 2024-01-19
  • 3 回答
  • 0 关注
  • 45 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信