【问题标题】:Reduce stock only for specific order statuses and payment method in Woocommerce仅针对 Woocommerce 中的特定订单状态和付款方式减少库存
【发布时间】:2023-03-09 23:13:02
【问题描述】:

我正在为客户开发一些自定义 Woocommerce 功能。他们使用 BACS 支付网关来处理人工支付。

但是,网关目前太早地减少库存以满足我们的需要,即当订单处于“暂停”状态时。我只想在订单标记为“处理中”或“完成”时减少库存(避免重复减少)。

我已经设法通过以下 sn-p 防止库存在“搁置”时自行减少:

function wcs_do_not_reduce_onhold_stock( $reduce_stock, $order ) {
if ( $order->has_status( 'on-hold' ) ) {
$reduce_stock = false;
}
return $reduce_stock;
}
add_filter( 'woocommerce_can_reduce_order_stock', 'wcs_do_not_reduce_onhold_stock', 10, 2 );

我不太确定如何进行。虽然上面的代码有效,但添加以下条件不起作用:

else if ( $order->has_status( 'processing' ) || $order->has_status( 'completed' ) ) {
$reduce_stock = true;
}

简而言之,我希望根据以下库存状态更改库存:

  • 暂停 - 什么都不做
  • 已完成或正在处理 - 减少库存(仅一次)
  • 已取消 - 增加库存(仅在最初减少时)

非常感谢任何帮助!

【问题讨论】:

    标签: php wordpress woocommerce stock orders


    【解决方案1】:

    使用 woocommerce_order_status_changed 中的自定义函数,您将能够针对“处理中”和“已完成”订单状态更改减少订单商品库存。

    我在您的函数中添加了一个条件,以仅针对订单上的“BACS”支付网关。

    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( 'on-hold' ) && $order->get_payment_method() == 'bacs' ) {
            $reduce_stock = false;
        }
        return $reduce_stock;
    }
    
    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 ){
        // Only for 'processing' and 'completed' order statuses change
        if ( $new_status == 'processing' || $new_status == 'completed' ){
        $stock_reduced = get_post_meta( $order_id, '_order_stock_reduced', true );
            if( empty($stock_reduced) && $order->get_payment_method() == 'bacs' ){
                wc_reduce_stock_levels($order_id);
            }
        }
    }
    

    代码进入活动子主题(或活动主题)的 function.php 文件中。

    经过测试并且可以工作

    【讨论】:

    • 欣赏!我添加了此处共享代码的略微修改版本:github.com/kloon/woocommerce-auto-restore-stock/blob/master/… 为了实现库存恢复功能,如果订单在标记为 Complete 或 Processing 后被取消。
    • @ConorCampbell 库存恢复功能将与任何其他订单类型一样工作。在 woocommerce 中,当订单被取消时,通常会检查标志“_order_stock_reduced”并减少库存……
    • @LoicTheAztec 我认为代码存在问题,因为当订单被搁置或处理更改订单元数据 _order_stock_reduced 到 yes 时,将不会通过条件 empty($stock_reduced)
    • 哦,好吧,我可能错过了理解第一条消息。您认为仅针对特定状态减少库存的好方法是什么? (如发货状态)
    • @Guido 最好提出一个新问题,向其中添加自定义状态的代码以及指向该线程的链接,详细说明您要实现的目标。还要添加您的代码尝试解释什么不起作用……
    猜你喜欢
    • 2017-11-27
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2013-12-29
    • 2020-11-03
    • 2018-01-10
    相关资源
    最近更新 更多