With conditional variations
Source1: https://wedevs.com/105722/add-extra-field-to-woocommerce-checkout/
Source2: https://businessbloomer.com/woocommerce-add-custom-checkout-field-php/
Source3: https://docs.woocommerce.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/
Source4: https://www.cloudways.com/blog/how-to-edit-delete-fields-and-email-in-woocommerce-custom-checkout-fields/
Source5: https://rudrastyh.com/woocommerce/order-meta-in-emails.html
//Create Custom Checkout Field Section w/ conditional options
//Part1: Create Field - Conditional Optional
\!h add_action('__woocommerce_after_checkout_shipping_form__', 'conditional_custom_checkout_field'); //change the hook to the area you want it to appear
function conditional_custom_checkout_field( $checkout ) {
// see if user has previously saved info for the field (optional)
$current_user = wp_get_current_user();
\!h __$saved_custom_field__ = $current_user->__student_acu_no__; //change this to match user info
// echo field only if check_product_category() is true
if(check_product_category() ){ //remove this line if you don't want the conditional catagory function to be called
//Create Field, Label, & Heading
\!h echo '<div id="custom_checkout_field"><h2>' . __('__New Heading__') . '</h2>';
//Alt: use if you dont want a heading
//echo '<div id="__custom_checkout_field__">';
\!h woocommerce_form_field('__custom_field_name__', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
\!h 'label' => __('__Custom Field Label__'),
\!h 'placeholder' => __('__Field Placeholder__'),
// 'required' => true, uncomment this line to require this field to be filled out
\!h 'default' => __$saved_custom_field__, ),
\!h $checkout->get_value( '__custom_field_name__' ));
echo '</div>';
}
}
//Part2: Conditional Function to display field only if category is in the Cart
// Is called by function conditional_custom_checkout_field()
function check_product_category(){
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product_id = apply_filters( 'woocommerce_cart_item_product_id', $cart_item['product_id'], $cart_item, $cart_item_key );
if( product_category_is( $product_id ) ){
return true;
}
}
return false;
}
// Function that specifies category ID for check_product_category()
function product_category_is( $product_id ){
\!h return has_term( __catagoyID__, 'product_cat', get_post( $product_id ) ); //indicate catagory ID number
}
//Part3: Validate New Checkout Field
add_action('woocommerce_checkout_process', 'validate_new_checkout_field');
// Show an error message if the field is not set.
function validate_new_checkout_field() {
\!h if ( ! $_POST['__customised_field_name__'] )
\!h wc_add_notice( __( '__Error Message:Please enter...__' ), 'error' );
}
/*
//Part4: Save New Checkout Field Into User Meta, if validation is successful (optional if applicable)
add_action( 'woocommerce_checkout_update_user_meta', 'custom_checkout_field_update_user_meta' );
function custom_checkout_field_update_user_meta( $user_id ) {
\!h if ( $user_id && $_POST['__customised_field_name__'] )
\!h update_user_meta($user_id, '__customised_field_name__', sanitize_text_field($_POST['__customised_field_name__']) );
}
//Part5: Display New Field In The Admin User Profile Page
add_action( 'show_user_profile', 'show_user_extra_field' );
add_action( 'edit_user_profile', 'show_user_extra_field' );
function show_user_extra_field( $user ){ ?>
\!h <h3>__Additional Fields Header__</h3>
<table class="form-table">
<tr>
\!h <th><label for="__customised_field_name__">__Label for field__</label></th>
\!h <td><input type="text" name="__customised_field_name__" value="<?php echo esc_attr(get_the_author_meta( '__customised_field_name__', $user->ID )); ?>" class="regular-text" /></td>
</tr>
</table><?php
}
//Save User Field When Updated from the Admin User Page
add_action( 'personal_options_update', 'save_extra_fields' );
add_action( 'edit_user_profile_update', 'save_extra_fields' );
function save_extra_fields( $user_id ){
\!h update_user_meta( $user_id,'__customised_field_name__', sanitize_text_field( $_POST['__customised_field_name__'] ) );
}
*/
//Part6: Save & Show New Field In The WooCommerce Order Details
// Update order meta with field value
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta' );
function custom_checkout_field_update_order_meta( $order_id ) {
\!h if ( $_POST['__customised_field_name__'] ){
\!h update_post_meta( $order_id, '___customised_field_name__', sanitize_text_field($_POST['__customised_field_name__']) );
}
}
// Display User Field @ Order Meta
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'checkout_field_display_admin_order_meta', 10, 1 );
function checkout_field_display_admin_order_meta( $order ) {
\!h echo '<p><strong>'.__('__Field Label__').':</strong> ' . get_post_meta( $order->id, '___customised_field_name__', true ) . '</p>'; //possibly $order->get_id(),
}
//Part7: Add custom field value to WooCommerce emails
add_filter('woocommerce_email_order_meta_keys', 'custom_field_order_email');
function custom_field_order_email( $keys ) {
\!h $keys[] = '__Customised Field Name__'; // This will look for a custom field called 'Customised Field Name' and add it to emails
return $keys;
}