I’m using the function below to show / hide the shipping address section of the checkout based on if a customer chooses local pickup or not.
It works fine, however some of the fields in the shipping section are required and so the checkout won’t work if local shipping is selected.
Is there a way to make these fields not required if local pickup is selected?
add_action( 'woocommerce_after_checkout_form', 'bbloomer_disable_shipping_local_pickup' ); function bbloomer_disable_shipping_local_pickup( $available_gateways ) { // Part 1: Hide shipping based on the static choice @ Cart // Note: "#customer_details .col-1" strictly depends on your theme $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); $chosen_shipping = $chosen_methods[0]; if ( 0 === strpos( $chosen_shipping, 'local_pickup' ) ) { ?> <script type="text/javascript"> jQuery('#customer_details .col-1').fadeOut(); </script> <?php } // Part 2: Hide shipping based on the dynamic choice @ Checkout // Note: "#customer_details .col-1" strictly depends on your theme ?> <script type="text/javascript"> jQuery('form.checkout').on('change','input[name^="shipping_method"]',function() { var val = jQuery( this ).val(); if (val.match("^local_pickup")) { jQuery('#customer_details .col-1').fadeOut(); } else { jQuery('#customer_details .col-1').fadeIn(); } }); </script> <?php }
Advertisement
Answer
/* only hide shipping section using css/jquery is not the solution. you must need to remove fields as per your requirement */ /* please Add the following code to your child theme functions.php file */ add_filter( 'woocommerce_checkout_fields', 'change_shipping_field_optional'); function change_shipping_field_optional( $fields ) { $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); $shipping_pickup = $chosen_methods[0]; if ($shipping_pickup == 'local_pickup:4') // here your shipping rate ID { /* add fields here as per your requirement */ $fields['shipping_first_name']['required'] = false; $fields['shipping_last_name']['required'] = false; $fields['shipping_company']['required'] = false; $fields['shipping_country']['required'] = false; $fields['shipping_address_1']['required'] = false; $fields['shipping_address_2']['required'] = false; $fields['shipping_city']['required'] = false; $fields['shipping_state']['required'] = false; $fields['shipping_postcode']['required'] = false; unset($fields['shipping']['shipping_first_name']); unset($fields['shipping']['shipping_last_name']); 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']); } return $fields; }