Ad

Display Custom DOB Fields In WooCommerce Admin Order Edit Pages

I've added this code to functions.php

// Hook in
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );
add_action( 'woocommerce_before_order_notes', 'competitor_details' );
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

// Our hooked in function - $fields is passed via the filter!
function custom_override_checkout_fields( $fields ) {
     unset($fields['order']['order_comments']);

     return $fields;
}

function competitor_details( $checkout ) {

    echo '<div id="competitor_details"><h3>' . __('Competitor\'s Details') . '</h3>';

    woocommerce_form_field( 'competitor_first_name',array('label' => 'First name', 'type' => 'text', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    woocommerce_form_field( 'competitor_last_name',array('label' => 'Last name', 'type' => 'text', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    echo '<div id="competitor_details"><h4>' . __('Date of birth') . '</h4>';
    woocommerce_form_field( 'competitor_dob_day',array('label' => 'Day', 'type' => 'select', 'required' => 'true', 'options' => array(''=>'','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','10'=>'10','11'=>'11','12'=>'12','13'=>'13','14'=>'14','15'=>'15','16'=>'16','17'=>'17','18'=>'18','19'=>'19','20'=>'20','21'=>'21','22'=>'22','23'=>'23','24'=>'24','25'=>'25','26'=>'26','27'=>'27','28'=>'28','29'=>'29','30'=>'30','31'=>'31'))
        , $checkout->get_value( 'my_field_name' ));
    woocommerce_form_field( 'competitor_dob_month',array('label' => 'Month', 'type' => 'select', 'required' => 'true', 'options' => array(''=>'','Jan'=>'Jan','Feb'=>'Feb','Mar'=>'Mar','Apr'=>'Apr','May'=>'May','Jun'=>'Jun','Jul'=>'Jul','Aug'=>'Aug','Sep'=>'Sep','Oct'=>'Oct','Nov'=>'Nov','Dec'=>'Dec'))
        , $checkout->get_value( 'my_field_name' ));
    woocommerce_form_field( 'competitor_dob_year',array('label' => 'Year', 'type' => 'text', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    echo '<div id="consent_to_rules"><h4>' . __('I have read the Rules and agree to abide by them') . '</h4>';
    
    woocommerce_form_field( 'consent_to_rules',array('label' => 'YES, I agree', 'type' => 'checkbox', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    echo '</div>';


}


function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['competitor_first_name'] )
        wc_add_notice( __( 'Please enter Competitors First Name' ), 'error' );
    if ( ! $_POST['competitor_last_name'] )
        wc_add_notice( __( 'Please enter Competitors Last Name' ), 'error' );
    if ( ! $_POST['competitor_dob_day'] )
        wc_add_notice( __( 'Please enter Competitors date of birth' ), 'error' );
    if ( ! $_POST['competitor_dob_month'] )
        wc_add_notice( __( 'Please enter Competitors date of birth' ), 'error' );
    if ( ! $_POST['competitor_dob_year'] )
        wc_add_notice( __( 'Please enter Competitors date of birth' ), 'error' );
    if ( ! $_POST['consent_to_rules'] )
        wc_add_notice( __( 'Please agree that you have read the Rules' ), 'error' );
}

That adds the required fields to the checkout page. I don't want a date picker, because the DOB can be anything really - it just has to be easy to enter.

The checkout works fine, but I don't see the field values when I'm checking the order details in the admin area.

Any help with that?

Ad

Answer

First of all, I've rewritten your current code, as it had some minor bugs

// Unset order comments field
function filter_woocommerce_checkout_fields( $fields ) {
     unset( $fields['order']['order_comments'] );

     return $fields;
}
add_filter( 'woocommerce_checkout_fields' , 'filter_woocommerce_checkout_fields', 10, 1 );

// NOT checked by default
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );

// Add custom fields
function action_woocommerce_before_order_notes( $checkout ) {
    echo '<h3>' . __( 'Competitor\'s Details', 'woocommerce' ) . '</h3>';
    
    // First name
    woocommerce_form_field( 'competitor_first_name', array(
        'label'       => __( 'First name', 'woocommerce' ), 
        'type'        => 'text', 
        'required'    => 'true'
    ), $checkout->get_value( 'competitor_first_name' ) );

    // Last name
    woocommerce_form_field( 'competitor_last_name', array(
        'label'       => __( 'Last name', 'woocommerce' ), 
        'type'        => 'text',
        'required'    => 'true'
    ), $checkout->get_value( 'competitor_last_name' ) );

    echo '<h4>' . __( 'Date of birth', 'woocommerce' ) . '</h4>';
    
    // Options day
    $options_day = array( '' => __( 'Please select a day', 'woocommerce' ) );
    $from = 1;
    $to = 31;
    $options_day_combine = $options_day + array_combine( range( $from, $to ), range( $from, $to ) ); 
    
    // Dob day
    woocommerce_form_field( 'competitor_dob_day', array(
        'label'       => __( 'Day', 'woocommerce' ), 
        'type'        => 'select', 
        'required'    => 'true',
        'options'     => $options_day_combine
    ), $checkout->get_value( 'competitor_dob_day' ) );
    
    // Dob month
    woocommerce_form_field( 'competitor_dob_month', array(
        'label'       => __( 'Month', 'woocommerce' ),  
        'type'        => 'select', 
        'required'    => 'true',
        'options'     => array(
            ''    => __( 'Please select a month', 'woocommerce' ),
            'Jan' => __( 'Jan', 'woocommerce' ),
            'Feb' => __( 'Feb', 'woocommerce' ),
            'Mar' => __( 'Mar', 'woocommerce' ),
            'Apr' => __( 'Apr', 'woocommerce' ),
            'May' => __( 'May', 'woocommerce' ),
            'Jun' => __( 'Jun', 'woocommerce' ),
            'Jul' => __( 'Jul', 'woocommerce' ),
            'Aug' => __( 'Aug', 'woocommerce' ),
            'Sep' => __( 'Sep', 'woocommerce' ),
            'Oct' => __( 'Oct', 'woocommerce' ),
            'Nov' => __( 'Nov', 'woocommerce' ),
            'Dec' => __( 'Dec', 'woocommerce' ),
        )
    ), $checkout->get_value( 'competitor_dob_month' ) );
    
    // Options year
    $options_year = array( '' => __( 'Please select a year', 'woocommerce' ) );
    $from = 2021;
    $to = 1910;
    $options_year_combine = $options_year + array_combine( range( $from, $to ), range( $from, $to ) );
    
    // Dob year
    woocommerce_form_field( 'competitor_dob_year', array(
        'label'       => __( 'Year', 'woocommerce' ),  
        'type'        => 'select',
        'required'    => 'true',
        'options'     => $options_year_combine
    ), $checkout->get_value( 'competitor_dob_year' ) );

    echo '<h4>' . __( 'I have read the Rules and agree to abide by them', 'woocommerce' ) . '</h4>';
    
    // Rules
    woocommerce_form_field( 'consent_to_rules', array(
        'label'       => __( 'Yes, I agree', 'woocommerce' ),  
        'type'        => 'checkbox', 
        'required'    => 'true'
    ), $checkout->get_value( 'consent_to_rules' ) );
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );

// Validate custom fields
function action_woocommerce_checkout_process() {
    // Isset and empty, add an error
    if ( isset( $_POST['competitor_first_name'] ) && empty( $_POST['competitor_first_name'] ) ) {
        wc_add_notice( __( 'Please enter Competitors First Name', 'woocommerce' ), 'error' );
    }
    
    if ( isset( $_POST['competitor_last_name'] ) && empty( $_POST['competitor_last_name'] ) ) {
        wc_add_notice( __( 'Please enter Competitors Last Name', 'woocommerce' ), 'error' );
    }
    
    if ( isset( $_POST['competitor_dob_day'] ) && empty( $_POST['competitor_dob_day'] ) ) {
        wc_add_notice( __( 'Please enter Competitors date of birth - day', 'woocommerce' ), 'error' );
    }
    
    if ( isset( $_POST['competitor_dob_month'] ) && empty( $_POST['competitor_dob_month'] ) ) {
        wc_add_notice( __( 'Please enter Competitors date of birth - month', 'woocommerce' ), 'error' );
    }

    if ( isset( $_POST['competitor_dob_year'] ) && empty( $_POST['competitor_dob_year'] ) ) {
        wc_add_notice( __( 'Please enter Competitors date of birth - year', 'woocommerce' ), 'error' );
    }
    
    if ( ! isset( $_POST['consent_to_rules'] ) ) {
        wc_add_notice( __( 'Please agree that you have read the Rules', 'woocommerce' ), 'error' );
    }
}
add_action( 'woocommerce_checkout_process', 'action_woocommerce_checkout_process', 10, 0 );

To answer your question, save and display

Use the woocommerce_checkout_create_order and woocommerce_admin_order_data_after_billing_address actions hooks.

This parts can be optimized with a foreach loop as opposed to adding an if condition every time, but I have not applied this so that everything stays clear.

So you get:

// Save fields
function action_woocommerce_checkout_create_order( $order, $data ) {
    // Isset and NOT empty, save
    if ( isset( $_POST['competitor_first_name'] ) && ! empty( $_POST['competitor_first_name'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_first_name', sanitize_text_field( $_POST['competitor_first_name'] ) );
    }
    
    if ( isset( $_POST['competitor_last_name'] ) && ! empty( $_POST['competitor_last_name'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_last_name', sanitize_text_field( $_POST['competitor_last_name'] ) );
    }
    
    if ( isset( $_POST['competitor_dob_day'] ) && ! empty( $_POST['competitor_dob_day'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_dob_day', sanitize_text_field( $_POST['competitor_dob_day'] ) );
    }
    
    if ( isset( $_POST['competitor_dob_month'] ) && ! empty( $_POST['competitor_dob_month'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_dob_month', sanitize_text_field( $_POST['competitor_dob_month'] ) );
    }

    if ( isset( $_POST['competitor_dob_year'] ) && ! empty( $_POST['competitor_dob_year'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_dob_year', sanitize_text_field( $_POST['competitor_dob_year'] ) );
    }
    
    if ( isset( $_POST['consent_to_rules'] ) ) {
        // Update meta data
        $order->update_meta_data( 'consent_to_rules', sanitize_text_field( $_POST['consent_to_rules'] ) );
    }
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );

// Display the custom 'select' field value on admin order pages after billing adress
function action_woocommerce_admin_order_data_after_billing_address( $order ) {  
    // Get meta
    $competitor_first_name = $order->get_meta( 'competitor_first_name' );
    
    // NOT empty
    if ( ! empty ( $competitor_first_name ) ) {
        echo '<p><strong>' . __( 'Competitor first name', 'woocommerce' ) . ':</strong> ' . $competitor_first_name . '</p>';
    }
    
    // Get meta
    $competitor_last_name = $order->get_meta( 'competitor_last_name' );
    
    // NOT empty
    if ( ! empty ( $competitor_last_name ) ) {
        echo '<p><strong>' . __( 'Competitor last name', 'woocommerce' ) . ':</strong> ' . $competitor_last_name . '</p>';
    }
    
    // Get meta
    $competitor_dob_day = $order->get_meta( 'competitor_dob_day' );
    
    // NOT empty
    if ( ! empty ( $competitor_dob_day ) ) {
        echo '<p><strong>' . __( 'Competitor dob day', 'woocommerce' ) . ':</strong> ' . $competitor_dob_day . '</p>';
    }
    
    // Get meta
    $competitor_dob_month = $order->get_meta( 'competitor_dob_month' );
    
    // NOT empty
    if ( ! empty ( $competitor_dob_month ) ) {
        echo '<p><strong>' . __( 'Competitor dob month', 'woocommerce' ) . ':</strong> ' . $competitor_dob_month . '</p>';
    }
    
    // Get meta
    $competitor_dob_year = $order->get_meta( 'competitor_dob_year' );
    
    // NOT empty
    if ( ! empty ( $competitor_dob_year ) ) {
        echo '<p><strong>' . __( 'Competitor dob year', 'woocommerce' ) . ':</strong> ' . $competitor_dob_year . '</p>';
    }
    
    // Get meta
    $consent_to_rules = $order->get_meta( 'consent_to_rules' );
    
    // NOT empty
    if ( ! empty ( $consent_to_rules ) ) {
        echo '<p><strong>' . __( 'Yes, I agree', 'woocommerce' ) . '</strong></p>';
    }
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );
Ad
source: stackoverflow.com
Ad