Oculte múltiples métodos de envío basados ​​en ID de productos en WooCommerce

1 minuto de lectura

Oculte multiples metodos de envio basados ​​en ID de productos
Impacto Digital

Quiero ocultar un conjunto de métodos de envío si se selecciona un conjunto de productos en WooCommerce

Creo que ya casi llego, pero recibo un error en el unset( $rates[$method_ids] ) línea.

Esto es lo que tengo hasta ahora:

add_filter( 'woocommerce_package_rates', 'specific_products_shipping_methods_hide_many', 10, 2 );
function specific_products_shipping_methods_hide_many( $rates, $package ) {

    $product_ids = array( 240555 ); // HERE set the product IDs in the array
    $method_ids = array( 'flat_rate:7', 'flat_rate:13', 'flat_rate:26', 'flat_rate:27', 'local_pickup:24' ) ; // HERE set the shipping method IDs
    $found = false;

    // Loop through cart items Checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
        if ( in_array( $cart_item['product_id'], $product_ids ) ){
            $found = true;
            break;
        }
    }
    if ( $found )
        unset( $rates[$method_ids] );

    return $rates;
}

¿Algún consejo?

Estás cerca, pero necesitas recorrerlo $rates y si ocurre $rate_idpuedes desactivarlo

Entonces obtienes:

function filter_woocommerce_package_rates( $rates, $package ) {
    // Set the product IDs in the array
    $product_ids = array( 240555, 30 );
    
    // Set the rate IDs in the array
    $rate_ids = array( 'flat_rate:7', 'flat_rate:13', 'flat_rate:26', 'flat_rate:27', 'local_pickup:24', 'local_pickup:1', 'free_shipping:2' );
    
    // Initialize
    $found = false;

    // Loop through cart items checking for defined product IDs
    foreach( $package['contents'] as $cart_item ) {
        // Checks if a value exists in an array
        if ( in_array( $cart_item['product_id'], $product_ids ) ) {
            $found = true;
            break;
        }
    }
    
    // True
    if ( $found ) {
        // Loop trough
        foreach ( $rates as $rate_id => $rate ) {
            // Checks if a value exists in an array
            if ( in_array( $rate_id, $rate_ids ) ) {
                unset( $rates[$rate_id] );
            }
        }
    }
    
    return $rates;
}
add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 10, 2 );

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad