首页 > 解决方案 > 当 WooCommerce 购物车中的特定产品时禁用支付网关

问题描述

我想为产品 ID 6197 取消设置付款方式“bacs”。

我已经尝试了下面的代码,但这并没有达到预期的结果。

add_filter( 'woocommerce_available_payment_gateways', 'wp_unset_gateway_by_id', 10, 2 );` 
function wp_unset_gateway_by_id( $available_gateways, $products) {
    global $woocommerce;
    $unset = false;
    $product_ids = array('6197');

    if( in_array( $product->get_id(), $product_ids ) || ( $product->is_type('variation') && in_array( $product->get_parent_id(), $product_ids ) ) ){
        unset( $available_gateways['bacs'] ); 
        return $available_gateways;
    }
}

我相信我做错了什么,但我对此比较陌生。任何意见,将不胜感激。

标签: wordpresswoocommerceproductpayment-gatewaycart

解决方案


$products不作为参数传递给woocommerce_available_payment_gateways过滤器挂钩

通过以下方式应用它:

function filter_woocommerce_available_payment_gateways( $payment_gateways ) {
    // Not on admin
    if ( is_admin() ) return $payment_gateways;
    
    // The targeted product ids (several can be added, separated by a comma)
    $targeted_ids = array( 6197 );

    // Flag
    $found = false;

    // WC Cart
    if ( WC()->cart ) {
        // Loop through cart items
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            if ( array_intersect( $targeted_ids, array( $cart_item['product_id'], $cart_item['variation_id'] ) ) ) {
                $found = true;
                break;
            }
        }
    }
    
    // True
    if ( $found ) {       
        // Bacs
        if ( isset( $payment_gateways['bacs'] ) ) {
            unset( $payment_gateways['bacs'] );
        }       
    }
    
    return $payment_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'filter_woocommerce_available_payment_gateways', 10, 1 );

推荐阅读