【发布时间】:2016-12-13 11:24:53
【问题描述】:
我想在特殊情况下禁用所有支付网关:
我有 2 种特殊产品,我不想在结帐时与任何其他产品组合。
假设我的 “特殊” 产品 ID 是 496 和 484。所有其他都是“正常”产品。
如果这些“特殊”产品之一在购物车中,例如,我想禁用“paypal”。
如果客户的购物车中同时包含 “特殊” 产品和 “普通” 产品,我想禁用 所有支付网关,所以他无法结帐。
这是我的代码:
//disable add to cart if
add_filter( 'woocommerce_available_payment_gateways', 'filter_gateways', 1);
function filter_gateways( $gateways )
{
global $woocommerce;
foreach ($woocommerce->cart->cart_contents as $key => $values ) {
// store product IDs in array
$nonPPproducts = array(496,484);
if (in_array( $values['product_id'], $nonPPproducts ) ) {
unset($gateways['cod'], $gateways['bacs'], $gateways['cheque'], $gateways['stripe']);
} elseif ( in_array( $values['product_id'], $nonPPproducts ) && in_array( $values['product_id'] ) ) {
unset($gateways['under-review'], $gateways['cod'], $gateways['bacs'], $gateways['cheque'], $gateways['stripe']);
}
}
return $gateways;
}
但我不知道为什么唯一的第一个 if 语句有效……换句话说,无论在什么情况下,除了 under-review 支付网关之外,所有支付网关都被禁用。
我做错了什么?
我怎样才能做到这一点?
谢谢
【问题讨论】:
-
1) 使用全局变量; 2) 不推荐使用硬编码值。您还可以在最后一个
if中为unset创建 2 个 wrapper 函数,并使用有意义的名称.. -
只是好奇,您是否考虑过不允许将其添加到购物车或尝试将其添加到购物车时发出警告?这样做的目的是让客户尽快知道他们不能将订单放在一个购物车中,而不是花时间购物然后被告知他们必须再做一次。
-
@RyanVincent,如果我能做到这一点会更酷
-
@LoicTheAztec 对不同时区的迟到投票感到抱歉:),您的回答完美无缺,没有更改一个字母,非常感谢
-
@AhmedNabil 是的,这也是可能的(如 RyanVincent 所说),例如自动从购物车中删除具有类似条件的产品并向客户发出错误通知。但这不是这个问题的一部分,你可以问另一个问题,包括你的实际工作代码。
标签: php wordpress woocommerce payment-gateway cart