I found this code that does exactly what I need it to, except it doesn't add the information to the email, or the order details.
So for context, we are selling tickets and want to collect information for each ticket holder.
//Custom WooCommerce Checkout Fields based on Quantity
add_action( 'woocommerce_before_order_notes', 'person_details' );
function person_details($checkout) {
global $woocommerce;
$count = $woocommerce->cart->cart_contents_count;
$i = 1;
for($k=2; $k<= $count; $k++) {
$i++;
print ('<h3>Please enter details of attendee '.$i.'</h3>');
woocommerce_form_field( 'cstm_full_name'.$i, array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Full name'),
'placeholder' => __('Enter full name'),
),
$checkout->get_value( 'cstm_full_name'.$i ));
echo '<div class="clear"></div>';
woocommerce_form_field( 'cstm_phone'.$i, array(
'type' => 'text',
'class' => array('my-field-class form-row-first'),
'label' => __('Phone'),
'placeholder' => __('Enter phone number'),
),
$checkout->get_value( 'cstm_phone'.$i ));
woocommerce_form_field( 'cstm_email'.$i, array(
'type' => 'email',
'class' => array('my-field-class form-row-last'),
'label' => __('Email address'),
'placeholder' => __('Enter email address'),
),
$checkout->get_value( 'cstm_email'.$i ));
echo '<div class="clear"></div>';
woocommerce_form_field( 'cstm_address'.$i, array(
'type' => 'textarea',
'class' => array('my-field-class form-row-wide'),
'label' => __('Full address'),
'placeholder' => __('Enter full address'),
),
$checkout->get_value( 'cstm_address'.$i ));
}
}
/**
* Save value of fields
*/
add_action('woocommerce_checkout_update_order_meta', 'customise_checkout_field_update_order_meta');
function customise_checkout_field_update_order_meta($order_id) {
global $woocommerce;
$count = $woocommerce->cart->cart_contents_count;
$i = 1;
for($k=2; $k<= $count; $k++) {
$i++;
if (!empty($_POST['cstm_full_name'.$i])) {
update_post_meta($order_id, 'Name of Attendee'.$i, sanitize_text_field($_POST['cstm_full_name'.$i]));
}
if (!empty($_POST['cstm_phone'.$i])) {
update_post_meta($order_id, 'Phone of Attendee'.$i, sanitize_text_field($_POST['cstm_phone'.$i]));
}
if (!empty($_POST['cstm_email'.$i])) {
update_post_meta($order_id, 'Email of Attendee'.$i, sanitize_text_field($_POST['cstm_email'.$i]));
}
if (!empty($_POST['cstm_address'.$i])) {
update_post_meta($order_id, 'Address of Attendee'.$i, sanitize_text_field($_POST['cstm_address'.$i]));
}
}
}
/**
* Add fields to order emails
**/
add_filter('woocommerce_email_order_meta_keys', 'my_custom_checkout_field_order_meta_keys');
function my_custom_checkout_field_order_meta_keys( $keys ) {
$i = 1;
for($k=2; $k<= 50; $k++) {
$i++;
$keys[] = 'Name of Attendee'.$i;
$keys[] = 'Phone of Attendee'.$i;
$keys[] = 'Email of Attendee'.$i;
$keys[] = 'Email of Participant '.$i;
$keys[] = 'Address of Attendee'.$i;
}
return $keys;
}
I think some of this might be depreciated but my attempts at bringing it up to snuff have all failed.
I have revised the code, simplifying. I have added the necessary code to display attendees on admin orders, customer orders and email notifications.
Code goes on functions.php file of your child theme (or in a plugin). Tested and works.
Customer orders:
Email notifications:
Admin Orders