Carlos Cespedes
Carlos Cespedes

Reputation: 133

How to make a form field required in WooCommerce checkout

In the Checkout form I created a select field. My question is how in Wordpress or Woocmmerce this camp can be left as required.

<p class="form-row form-row-wide validate-required validate-region" id="shipping_region_field" data-priority="6">

  <select name="shipping_region" id="shipping_region" class="state_select select2-selection--single" autocomplete="address-level1" data-placeholder="" tabindex="-1" aria-hidden="true">
        <option>Opción 01</option>
        <option>Opción 02</option>
  </select>
</p>

Upvotes: 0

Views: 7368

Answers (4)

YASHPAL KUMAR
YASHPAL KUMAR

Reputation: 31

**

If You Have Created Your Custom Field at the checkout page

**

add_action( 'woocommerce_after_checkout_validation', 'shipping_time_optionss', 9999, 2);
function shipping_time_optionss( $fields, $errors ){
    // if any validation errors
    if ( empty( $_POST['woo_shipping_time'] ) ) {
        $errors->add( 'woocommerce_password_error', __( 'Please Select Shipping Time Option.' ) );
    } 
} 

Upvotes: 0

YASHPAL KUMAR
YASHPAL KUMAR

Reputation: 31

**If You Have Created Your Custom Field at the checkout page** 

add_action( 'woocommerce_after_checkout_validation', 'shipping_time_optionss', 9999, 2);
function shipping_time_optionss( $fields, $errors ){
    // if any validation errors
    if ( empty( $_POST['woo_shipping_time'] ) ) {
        $errors->add( 'woocommerce_password_error', __( 'Please Select Shipping Time Option.' ) );
    } 
} 

Upvotes: 0

LoicTheAztec
LoicTheAztec

Reputation: 253867

1) For normal or custom billing and shipping fields you can use woocommerce_billing_fields or woocommerce_shipping_fields action hooks on checkout page as follow.

It will make a custom checkout field required without any need to add a validation script and to save it in the order. The field will also appear in My account edit adresses field section.

Some argument explanations:

  • The class 'update_totals_on_change' allow to trigger "update checkout" on change.
  • The 'required' attribute make the field required or not
  • The 'priority' attribute allow you to change the location of the field.

The code:

add_filter( 'woocommerce_shipping_fields', 'display_shipping_region_checkout_field', 20, 1 );
function display_shipping_region_checkout_field( $fields ) {
    $fields['shipping_region'] = array(
        'type'        => 'select',
        'label'       => __("Region", "woocommerce") ,
        'class'       => array('form-row-wide', 'update_totals_on_change'),
        'required'    => true,
        'options'       => array(
            ''         => __("Choose a region please"),
            'option-1' => __("Option 01"),
            'option-2' => __("Option 02"),
            'option-3' => __("Option 03"),
        ),
        'priority' => 100, 
        'clear' => true,
    );
    return $fields;
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

enter image description here

enter image description here


2) In specific cases you need to use the woocommerce_default_address_fields filter. This filter is applied to all billing and shipping default fields *(see the documentation). It's used only some default checkout fields.

3) You can also use woocommerce_checkout_fieldsthat has $fields as function argument (see documentation).

4) For other custom checkout fields you can use one of the following hooks with the woocommerce_form_field() function:

  • woocommerce_before_checkout_billing_form has $checkout as function argument
  • woocommerce_before_checkout_billing_form has $checkout as function argument
  • woocommerce_before_checkout_shipping_form has $checkout as function argument
  • woocommerce_before_checkout_shipping_form has $checkout as function argument
  • woocommerce_before_order_notes has $checkout as function argument
  • woocommerce_after_order_notes has $checkout as function argument

The code that display the field, validate the field and save the field in the order:

// Display field
add_action( 'woocommerce_after_checkout_shipping_form', 'display_shipping_region_after_checkout_shipping_form', 10, 1 );
function display_shipping_region_after_checkout_shipping_form ( $checkout ) {

    woocommerce_form_field( 'shipping_region', array(
        'type'        => 'select',
        'label'       => __("Region", "woocommerce") ,
        'class'       => array('form-row-wide','update_totals_on_change'),
        'required'    => true,
        'options'       => array(
            ''         => __("Choose a region please"),
            'option-1' => __("Option 01"),
            'option-2' => __("Option 02"),
            'option-3' => __("Option 03"),
        ),
        'priority' => 100,
        'clear' => true,
    ), $checkout->get_value( 'shipping_region' ) );
}

// Field Validation
add_action('woocommerce_checkout_process', 'shipping_region_custom_checkout_field_validation');
function shipping_region_custom_checkout_field_validation() {
    if ( isset($_POST['shipping_region']) && empty($_POST['shipping_region']) )
        wc_add_notice( __( 'Please select something into Region field.' ), 'error' );
}

// Save Field value 
add_action( 'woocommerce_checkout_create_order', 'action_checkout_create_order_callback', 10, 2 );
function action_checkout_create_order_callback( $order, $data ) {
    if ( isset($_POST['shipping_region']) && empty($_POST['shipping_region']) ) {
        $order->update_meta_data( '_shipping_region', esc_attr($_POST['shipping_region']) );
        if( $order->get_user_id() > 0 )
            update_user_met( $order->get_user_id(), 'shipping_region', esc_attr($_POST['shipping_region']) );
    }
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.


WooCommerce Documentation: Customizing checkout fields using actions and filters

Upvotes: 1

jtylerm
jtylerm

Reputation: 472

you can add an attribute to the select tag

<select required name="shipping_region" id="shipping_region" class="state_select select2-selection--single" autocomplete="address-level1" data-placeholder="" tabindex="-1" aria-hidden="true">
    <option>Opción 01</option>
    <option>Opción 02</option>
</select>

Upvotes: 0

Related Questions