在 WooCommerce 中隐藏基于产品类型的付款方式

问题描述:

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

In WoCommerce, I would like to disable particular payment methods and show particular payment methods for a subscription products in WooCommerce (and vice versa).

这个是我们发现的最接近的东西,但不符合我的要求期待.

This is the closest thing we've found but doesn't do what I am expecting.

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

Yes, there are plugins that will do this but we want to achieve this without using another plugin and without making our stylesheet any more nightmarish than it already is.

有什么帮助吗?

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

Here is an example with a custom hooked function in woocommerce_available_payment_gateways filter hook, where I can disable payment gateways based on the cart items (product type):

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+ 上进行了测试并且可以正常工作.

All code is tested on Woocommerce 3+ and works.

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

This is just an example to show you how things can work. You will have to adapt it