有条理地隐藏et显示支付网关

时间:2017-02-28 16:03:48

标签: php wordpress woocommerce checkout orders

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

另一方面,在结帐/订单付款页面上,当订单状态为&#34;待定&#34; 时,隐藏&#39;预订&#39; < / strong>网关并显示&#34; paypal&#34; 。 (当我们手动将订单状态更改为&#34;待定&#34; 并使用付款链接将发票发送给客户时,就会发生这种情况。

我认为应该通过检查订单状态并使用 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并检查了它的状态,但它也没有用。

saw woocommerce_order_items_table动作挂钩,但无法获得订单。

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

1 个答案:

答案 0 :(得分:2)

如果我已正确理解,您需要设置/取消设置可用的付款网关,具体取决于实时生成的订单,哪个状态必须等待才能获得&#34; paypal&#34;网关。在所有其他情况下,可用网关仅为&#34;保留&#34; (更名为&#34; cod&#34;支付网关)。

此代码使用 $_SERVER['REQUEST_URI'] 检索此实时订单ID,方式如下:

add_filter( 'woocommerce_available_payment_gateways', 'custom_available_payment_gateways' );
function custom_available_payment_gateways( $gateways ) {

    $url_arr = explode('/', $_SERVER['REQUEST_URI']);
    if($url_arr[1] == 'checkout' && $url_arr[2] == 'order-pay' && is_user_logged_in() ){
        $order_id = intval($url_arr[3]);
        $order = wc_get_order($order_id);
        if( $order->has_status('pending') )
            unset( $gateways['cod'] );
        else
            unset( $gateways['paypal'] );
    } else
        unset( $gateways['paypal'] );

    return $gateways;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

代码经过测试并有效。