【问题标题】:Conditionally hiding et showing payment gateways有条件地隐藏 et 显示支付网关
【发布时间】:2017-07-19 16:54:18
【问题描述】:

在 Woocommerce 中,我想在第一次创建订单之前在 "checkout" 页面上隐藏 "paypal" 网关,只显示 “货到付款” 网关(标记为预留)。

另一方面,当订单状态为“待处理”时,在结账/订单支付页面,隐藏'Reserve'网关并显示”贝宝”。 (当我们手动将订单状态更改为“待处理”并通过付款链接将发票发送给客户时,就会发生这种情况。

我认为应该通过检查订单状态并使用 woocommerce_available_payment_gateways 过滤钩子来完成。但是我在获取当前订单状态时遇到了问题。

此外,我不确定用户在结帐页面上新创建的订单的状态是什么,但该订单仍未显示在管理后端。

这是我不完整的代码:

function myFunction( $available_gateways ) {

    // How to check if the order's status is not pending payment?
    // How to pass the id of the current order to wc_get_order()?
     $order = wc_get_order($order_id); 

    if ( isset($available_gateways['cod']) && /* pending order status?? */ ) { 
        // hide "cod" gateway
    } else {
        // hide "paypal" gateway
    }
    return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'myFunction' );

我也尝试了WC()->query_vars['order'] 而不是wc_get_order();get the current order 并检查了它的状态,但它也没有用。

sawwoocommerce_order_items_table动作钩子,但也拿不到订单。

如何在结帐/订单支付页面上检索订单 ID 和状态?

【问题讨论】:

    标签: php wordpress woocommerce checkout orders


    【解决方案1】:

    2021 年更新

    如果我的理解正确,您想设置/取消设置可用的支付网关,具体取决于实时生成的订单,该订单的状态必须等待“paypal”网关。在所有其他情况下,可用网关只是“保留”(重命名为“cod”支付网关)。

    此代码使用 get_query_var() 检索实时订单 ID,这样:

    add_filter( 'woocommerce_available_payment_gateways', 'custom_available_payment_gateways' );
    function custom_available_payment_gateways( $available_gateways ) {
        // Not in backend (admin)
        if( is_admin() ) 
            return $available_gateways;
    
        if ( is_wc_endpoint_url( 'order-pay' ) ) {
            $order = wc_get_order( absint( get_query_var('order-pay') ) );
    
            if ( is_a( $order, 'WC_Order' ) && $order->has_status('pending') ) {
                unset( $available_gateways['cod'] );
            } else {
                unset( $available_gateways['paypal'] );
            }
        } else {
            unset( $gateways['paypal'] );
        }
        return $available_gateways;
    }
    

    代码进入您的活动子主题(或主题)的 functions.php 文件或任何插件文件中。

    代码已经过测试并且可以工作。

    【讨论】:

    • 如果网关通过 Ajax 加载,$_SERVER 不再是一个好的参考。条件标签似乎可以工作。非常感谢 sn-p!
    • @brasofilo 我刚刚以更好的方式更新了这个旧答案……
    猜你喜欢
    • 2017-07-09
    • 2016-02-09
    • 1970-01-01
    • 2022-08-11
    • 2021-01-26
    • 2019-05-03
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多