How to make a form field required in WooCommerce checkout

五迷三道 提交于 2020-12-04 10:21:09

问题


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>

回答1:


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.


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




回答2:


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>



回答3:


**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.' ) );
    } 
} 



回答4:


**

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.' ) );
    } 
} 


来源:https://stackoverflow.com/questions/55713581/how-to-make-a-form-field-required-in-woocommerce-checkout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!