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 );