WooCommerce: Add a birthdate billing field in checkout, My account, admin orders and WordPress user

2.4k Views Asked by At

I try to add a birthdate field in the Woocommerce Checkout form, then save it as a user meta. I can display it with the code below but i can't save it in order to see it in the user profile page.

 add_filter( 'woocommerce_billing_fields', 'add_birth_date_billing_field', 20, 1 );
    function add_birth_date_billing_field($billing_fields) {
    
        $billing_fields['billing_birth_date'] = array(
            'type'        => 'date',
            'label'       => __('Birth date'),
            'class'       => array('form-row-wide'),
            'priority'    => 25,
            'required'    => true,
            'clear'       => true,
        );
        return $billing_fields;
    }
       
    
         add_action( 'woocommerce_checkout_update_customer', 'save_checkout_account_birthday_field', 10, 2 );
            function save_checkout_account_birthday_field( $customer, $data ){
                if ( isset($_POST['billing_birth_date']) && ! empty($_POST['billing_birth_date']) ) {
                     $customer->update_meta_data( 'billing_birth_date', sanitize_text_field($_POST['billing_birth_date']) );
                }
            }
1

There are 1 best solutions below

10
On BEST ANSWER

Here is the complete code that will display billing birthdate in checkout, in My account Addresses, In admin Orders pages and in WordPress user dashboard:

// Display Billing birthdate field to checkout and My account addresses
add_filter( 'woocommerce_billing_fields', 'display_birthdate_billing_field', 20, 1 );
function display_birthdate_billing_field($billing_fields) {

    $billing_fields['billing_birthdate'] = array(
        'type'        => 'date',
        'label'       => __('Birthdate'),
        'class'       => array('form-row-wide'),
        'priority'    => 25,
        'required'    => true,
        'clear'       => true,
    );
    return $billing_fields;
}

// Save Billing birthdate field value as user meta data
add_action( 'woocommerce_checkout_update_customer', 'save_account_billing_birthdate_field', 10, 2 );
function save_account_billing_birthdate_field( $customer, $data ){
    if ( isset($_POST['billing_birthdate']) && ! empty($_POST['billing_birthdate']) ) {
         $customer->update_meta_data( 'billing_birthdate', sanitize_text_field($_POST['billing_birthdate']) );
    }
}

// Admin orders Billing birthdate editable field and display
add_filter('woocommerce_admin_billing_fields', 'admin_order_billing_birthdate_editable_field');
function admin_order_billing_birthdate_editable_field( $fields ) {
    $fields['birthdate'] = array( 'label' => __('Birthdate', 'woocommerce') );

    return $fields;
}

// WordPress User: Add Billing birthdate editable field
add_filter('woocommerce_customer_meta_fields', 'wordpress_user_account_billing_birthdate_field');
function wordpress_user_account_billing_birthdate_field( $fields ) {
    $fields['billing']['fields']['billing_birthdate'] = array(
        'label'       => __('Birthdate', 'woocommerce'),
        'description' => __('', 'woocommerce')
    );
    return $fields;
}

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