有条理地隐藏可用的支付网关

时间:2017-02-20 08:00:29

标签: php wordpress woocommerce payment-gateway checkout

在WooCommerce中,我有一个特定产品,由于法律原因无法在线支付,但可以通过COD订购。

我已经编写了一个自定义附加功能,以便在特定产品在购物车中时隐藏付款表单(Inspire Commerce信用卡付款)。

当我回显$available_gateways时,我在数组中看到两个选项,'cod'和'inspire' - 但是当我用我的代码隐藏Inspire时,两个网关都会消失,我得到了这个错误讯息:

  

很抱歉,似乎没有可用的付款方式   州。如果您需要帮助或希望制作,请与我们联系   替代安排。

为什么我不能只拥有COD?

这是我的功能代码:

function dfg_hide_payment_form($available_gateways) {
    if ($_customer['dfg-pay-later-enabled'] == 1) {
        if( is_checkout() ) {  
            global $woocommerce, $_customer;
            $packages = $_customer['dfg-package-ids'];

            foreach ($packages as $package) {
                if (gs_woo_in_cart($package)) {
                    unset($available_gateways['inspire']);
                }
            }
        }
    } else {
        unset($available_gateways['cod']);
    }
}

add_filter('woocommerce_available_payment_gateways', 'dfg_hide_payment_form', 1);

由于

2 个答案:

答案 0 :(得分:2)

我在本回答中使用了购物车迭代方式,以检查您的特定产品是否在购物车中。如果产品在购物车中,我就会设置好“激发灵感”。支付网关 (替换错误的变量名称)

以下是此代码:

add_filter('woocommerce_available_payment_gateways', 'conditional_hiding_payment_gateway', 1, 1);
function conditional_hiding_payment_gateway($available_gateways) {
    global $_customer;
    if ($_customer['dfg-pay-later-enabled'] == 1) {
        // HERE set your specific product ID
        $specific_product = 295;

        $is_in_cart = false;

        // Iterating through each items in cart
        foreach(WC()->cart->get_cart() as $cart_item){
            if($cart_item['product_id'] == $specific_product){
                $is_in_cart = true;
                break;
            }
        }
        if($is_in_cart)
            unset($available_gateways['inspire']);
    } else {
        unset($available_gateways['cod']);
    }
    return $available_gateways;
}

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

此代码未经测试,但应该有效...

答案 1 :(得分:0)

我在函数结束时错过了一个return语句。

return $available_gateways;