Search code examples
phpwordpresswoocommercecartcheckout

Unset WooCommerce checkout fields based on cart items quantities


Based on the quantity of three different products (array), I need to unset different checkout fields.

Problem is, no matter how and what I try using the code below - I get the "critical error" on website.

I need to check:

  • If the quantity of any of the three products within the array is 8 or more, remove country and state (billing and shipping).

  • If the quantity is less than 8 for any of the three products within the array, remove all fields except for name, phone and email (billing and shipping).

This is the code:

add_filter('woocommerce_checkout_fields', 'remove_cheeckout_fields_based_on_product_qty' );
function remove_cheeckout_fields_based_on_product_qty( $fields ) {

    $targeted_ids = array( 123, 456, 789 ); // how do I add qty to these?

    $found = false;

    foreach ( WC()->cart->get_cart() as $item ) {
    
        if (array_intersect( $targeted_ids, array( $item['product_id'], $item['variation_id'] ) ) ) {

    $found = true;

    break;

        }
    }
    
    if ( $found ) {
    
    unset($fields['shipping']['shipping_country']);
    unset($fields['shipping']['shipping_state']);
    unset($fields['billing']['billing_country']);
    unset($fields['billing']['billing_state']);

    } else {

    unset($fields['shipping']['shipping_company']);
    unset($fields['shipping']['shipping_country']);
    unset($fields['shipping']['shipping_address_1']);
    unset($fields['shipping']['shipping_address_2']);
    unset($fields['shipping']['shipping_city']);
    unset($fields['shipping']['shipping_state']);
    unset($fields['shipping']['shipping_postcode']);
    unset($fields['billing']['billing_address_1']);
    unset($fields['billing']['billing_address_2']);
    unset($fields['billing']['billing_city']);
    unset($fields['billing']['billing_postcode']);
    unset($fields['billing']['billing_country']);
    unset($fields['billing']['billing_state']);
    unset($fields['billing']['billing_company']);
    return $fields;
}

Any advice?


Solution

  • The "critical error" you're getting is because your else statement was not applied correctly.

    To get cart items quantities, you could use WC()->cart->get_cart_item_quantities()

    Operates as follows:

    • If the quantity of any of the three products within the array is 8 or more, remove country and state (billing and shipping).

    • If the quantity is less than 8 for any of the three products within the array, remove all fields except for name, phone and email (billing and shipping).

    So you get:

    function filter_woocommerce_checkout_fields( $fields ) {
        // The targeted product ids, multiple product IDs can be entered, separated by a comma
        $targeted_ids = array( 123, 456, 789 );
        
        // Required minimum quantity
        $minimum_quantity = 8;
        
        // Flag, default = false
        $flag = false;
        
        // Loop trough cart items quantities
        foreach( WC()->cart->get_cart_item_quantities() as $product_id => $cart_item_quantity ) {
            // Product ID in targeted IDs?
            if ( in_array ( $product_id, $targeted_ids ) ) {
                // Greater than or equal to
                if ( $cart_item_quantity >= $minimum_quantity ) {
                    $flag = true;
                }
    
                // Break loop
                break;
            }
        }
        
        // True
        if ( $flag ) {      
            unset( $fields['shipping']['shipping_country'] );
            unset( $fields['shipping']['shipping_state'] );
            unset( $fields['billing']['billing_country'] );
            unset( $fields['billing']['billing_state'] );
        } else {        
            // Unset
            unset( $fields['shipping']['shipping_company'] );
            unset( $fields['shipping']['shipping_country'] );
            unset( $fields['shipping']['shipping_address_1'] );
            unset( $fields['shipping']['shipping_address_2'] );
            unset( $fields['shipping']['shipping_city'] );
            unset( $fields['shipping']['shipping_state'] );
            unset( $fields['shipping']['shipping_postcode'] );
            unset( $fields['billing']['billing_address_1'] );
            unset( $fields['billing']['billing_address_2'] );
            unset( $fields['billing']['billing_city'] );
            unset( $fields['billing']['billing_postcode'] );
            unset( $fields['billing']['billing_country'] );
            unset( $fields['billing']['billing_state'] );
            unset( $fields['billing']['billing_company'] );
        }    
    
        return $fields;
    }
    add_filter( 'woocommerce_checkout_fields' , 'filter_woocommerce_checkout_fields', 10, 1 );