Search code examples
phpwordpresswoocommerceaccountwoocommerce-checkout-fields

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


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

Solution

  • 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.