有条件隐藏的ET显示付款网关



在wooCommerce中,我想隐藏" paypal" " checkout" 页面上的订单之前,第一次,只显示"现金交货" 网关(标记为储备)。

另一方面,在订单状态为"待处理" 时,在结帐/订单付款页面上,隐藏'储备>'储备'网关并显示>"贝宝" 。(当我们将订单状态更改为"待处理" 时,就会发生这种情况。

我认为应该通过检查订单状态并使用 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();获取当前订单并检查其状态,但它也无法正常工作。

我看到了woocommerce_order_items_table动作钩,但也无法获得订单。

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

更新2021

如果我正确理解,您要设置/解开可用的付款网关,具体取决于生成的订单,哪个状态必须待定才能拥有" PayPal"网关。Ian所有其他情况下,可用网关仅是"储备"。(重命名的" 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文件中或任何插件文件中。

代码经过测试并有效。

最新更新