根据 Woocommerce 中的购物车总金额添加或删除支付网关

Posted

技术标签:

【中文标题】根据 Woocommerce 中的购物车总金额添加或删除支付网关【英文标题】:add or remove payment gateways based on cart total amount in Woocommerce 【发布时间】:2018-07-25 19:01:45 【问题描述】:

我有一个插件,当 authorize.net 用作支付网关时会增加费用。

但是,当我使用涵盖整个购买的礼品卡并将购物车总额降至 0 美元时,订单仍设置为 authorize.net,并且当客户在技术上没有支付任何费用时会产生费用。

当购物车总额小于 0 美元时,我正在使用以下代码禁用 authorize.net 支付网关:

function authorize_less($available_gateways) 
    $maximum = 0;
    if ( WC()->cart->total < $maximum ) 
    unset( $available_gateways['authorizenet'] );
    
    return $available_gateways;

add_filter( 'woocommerce_available_payment_gateways', 'authorize_less' );



function authorize_more($available_gateways) 
    $maximum = 0;
    if ( WC()->cart->total > $maximum ) 
    unset( $available_gateways['cod'] );
    
    return $available_gateways;

add_filter( 'woocommerce_available_payment_gateways', 'authorize_more' );

该功能无法可靠运行。根据我在购物车中的操作,信用卡费用根本不显示,或者需要第二次刷新才能出现或消失。

问题可能不仅仅是自动计算和函数本身。可能有一种方法可以将它放入一个函数而不是我上面的两个函数中,但我没有成功

【问题讨论】:

【参考方案1】:

您的两个功能可以按如下方式合并,并且您的目标不是零购物车总金额。

所以你应该试试这个:

add_filter( 'woocommerce_available_payment_gateways', 'conditional_available_payment_gateways' 20, 1 );
function conditional_available_payment_gateways( $available_gateways ) 
if( is_admin() ) return $available_gateways; // Only for frontend

    if ( WC()->cart->total <= 0 ) 
        unset( $available_gateways['authorizenet'] );
     else 
        unset( $available_gateways['cod'] );
    
    return $available_gateways;

代码在您的活动子主题(活动主题)的functions.php 文件中。

未经测试,但它可以工作。

【讨论】:

谢谢,这段代码肯定更紧凑。我仍然遇到需要完全刷新页面才能在计算中显示条件的问题,这现在是 AJAX 问题吗? @mnguyen 我可以用另一个网关替换“authorizenet”,但在我这边进行测试时,问题是“使用礼品卡”:该礼品卡是优惠券之类的还是什么?女佣怎么打折的?我认为问题就在那里。您最好在时间线中逐步解释该过程...您也可以尝试使用WC()-&gt;cart-&gt;get_cart_contents_total( ) 看看会发生什么... 我使用的是固定购物车金额,例如礼品卡,该金额可能超过购物车总数。但由于问题在于前端显示基于此规则的新计算,如果不是摆脱支付网关,而是根据条件简单地更改它怎么办?我注意到选择单选按钮确实会更新计算。试过了,但没用:***.com/questions/37814998/… 也看到了更改 js 文件的建议,但感觉最好通过 php 完成 @mnguyen 是的,因为它是 ajax 驱动的……当你选择一个复选框时,它会执行这个 JS $('body').trigger('update_checkout');,因为很多 JS 事件都委托给了 body……我不明白的是你是如何设置的这个固定的购物车数量,例如前端的时间和地点(哪个挂钩以及该礼物的相关代码在哪里)......没有这些细节和代码,我只会比你更卡。【参考方案2】:

不确定这是否对任何人有帮助,但我需要为 eWay 进行信用卡授权,以便您获得定期付款令牌。 但是,如果您的购物车余额为零,Woocommmerce 不会显示信用卡表格。

查看includes/wc-template-functions.php的来源,我发现woocommerce_checkout_payment函数应用了一个过滤器来查看是否需要付款。 由于这个过滤器从未添加,只是应用了,我想我们可以添加它,它将获得优先权。

add_filter( 'woocommerce_cart_needs_payment', function()
    return true;
  , 99 );

有了这个,它总是显示信用卡表格,即使是零余额。你当然可以在过滤器中加入更多的逻辑来决定返回真还是假。

希望这对某人有帮助,对我来说。

【讨论】:

以上是关于根据 Woocommerce 中的购物车总金额添加或删除支付网关的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce:如果购物车总金额 = 0,则更改支付网关

WooCommerce存款和购物车总计算

在 WooCommerce 购物车中设置全球最低金额,类别餐饮 + 子类别除外

使用 woocommerce 在 wordpress 中获取购物车中的商品数量

根据 WooCommerce 中的购物车数量添加一定的免费礼物

WooCommerce Checkout 中的自定义总储蓄金额显示问题