【问题标题】:Hide payment method based on product type in WooCommerce在 WooCommerce 中根据产品类型隐藏付款方式
【发布时间】:2018-03-01 21:17:44
【问题描述】:

在 WoCommerce 中,我想禁用特定付款方式并显示 WooCommerce 中订阅产品的特定付款方式(反之亦然)。

This 是我们发现的最接近的东西,但没有达到我的预期。

是的,有一些插件可以做到这一点,但我们希望在不使用其他插件的情况下实现这一点,也不会让我们的样式表变得比现在更可怕。

请问有什么帮助吗?

【问题讨论】:

    标签: php wordpress woocommerce payment-gateway product


    【解决方案1】:

    这段代码对我非常有用,但其中有一个错误我必须修复:行

     $prod_variable = $prod_simple = $prod_subscription = false;
    

    必须放在 FOREACH 之外(之前),否则每次执行新项目时都会重置标志。我的情况是,只要订阅产品在购物车上,我就需要取消设置特定的付款方式。实际上,此代码仅在只有一个订阅产品时才有效。如果我将另一个不同的物品放在购物车上,该标志将再次变为 false,并且将加载付款方式。将这条线放在 FOREACH 之外可以解决这个问题。

    【讨论】:

    • 如果我们在购物车中添加多个产品怎么办?
    • @Mujtaba 它对它们进行迭代,因此它也适用于多种产品
    【解决方案2】:

    这是一个在 woocommerce_available_payment_gateways 过滤器挂钩中使用自定义挂钩函数的示例,我可以在其中根据购物车项目(产品类型)禁用支付网关:

    add_filter('woocommerce_available_payment_gateways', 'conditional_payment_gateways', 10, 1);
    function conditional_payment_gateways( $available_gateways ) {
        // Not in backend (admin)
        if( is_admin() ) 
            return $available_gateways;
    
        foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
            $prod_variable = $prod_simple = $prod_subscription = false;
            // Get the WC_Product object
            $product = wc_get_product($cart_item['product_id']);
            // Get the product types in cart (example)
            if($product->is_type('simple')) $prod_simple = true;
            if($product->is_type('variable')) $prod_variable = true;
            if($product->is_type('subscription')) $prod_subscription = true;
        }
        // Remove Cash on delivery (cod) payment gateway for simple products
        if($prod_simple)
            unset($available_gateways['cod']); // unset 'cod'
        // Remove Paypal (paypal) payment gateway for variable products
        if($prod_variable)
            unset($available_gateways['paypal']); // unset 'paypal'
        // Remove Bank wire (Bacs) payment gateway for subscription products
        if($prod_subscription)
            unset($available_gateways['bacs']); // unset 'bacs'
    
        return $available_gateways;
    }
    

    代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

    所有代码都在 Woocommerce 3+ 上进行了测试并且可以运行。

    这只是向您展示事情如何运作的示例。你必须适应它

    【讨论】:

    • 干杯,洛伊克!我们会试一试,如果我弄坏了任何东西,我会通知你 - 非常感谢!
    • @LoicTheAztec 如果卡中有 2 个产品并且它们没有匹配的付款方式会发生什么?
    • @Tobias 你无法继续下单……
    • 代码在 woocommerce 网关设置的后端产生了一些错误......只需在函数中添加一个 if( !is_admin ) 并返回原始网关即可
    • @Tobias 是的,您当然是对的,因为后端不喜欢购物车对象。我已经更新了答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 2020-08-25
    • 2014-08-06
    • 2016-04-13
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多