title: Dynamic checkout custom fields per persons and items in Woocommerce bookings
body: <p>For a bookings website I'm trying to create a function which makes it possible to add an attendee list, based on the amount of persons. I've already got the code for a single booking, thanks to LoicTheAztec. That part is working fine.</p>
  
  <p>I also need the same functionality for multiple bookings. How can I achieve this? </p>
  
  <p>Here is the code:</p>
  
  <pre><code>//* Add a new checkout field
  add_filter( 'woocommerce_checkout_fields', 'ppp_filter_checkout_fields' );
  function ppp_filter_checkout_fields($fields){
      $fields['extra_fields'] = array(
      'participant_details' =&gt; array(
          'type' =&gt; 'participant_details',
          'required'      =&gt; false,
          'label' =&gt; __( 'Participant Details' )
          ),
      );
  
      // Add a "persons" hidden input field
      foreach( WC()-&gt;cart-&gt;get_cart() as $cart_item ) {
          $persons = $cart_item['booking']['_persons'][0];
      }
      echo '&lt;input type="hidden" name="persons" value="' . $persons . '"&gt;';
  
      return $fields;
  }
  
  //* Add the field to the checkout
  add_filter( 'woocommerce_form_field_participant_details', 'ppp_filter_checkout_field_group', 10, 4 );
  function ppp_filter_checkout_field_group( $field, $key, $args, $value ){
      $op_cart_count = WC()-&gt;cart-&gt;get_cart_contents_count();
  
      $items = WC()-&gt;cart-&gt;get_cart();
  
      foreach($items as $item) {
          $person = $item['booking']['_persons'][0];
      }
  
      if ($person &gt; 1) {
  
          $html = '';
  
          $html .= "&lt;h3&gt;Deelnemers&lt;/h3&gt;";
  
          for ( $i = 1; $i &lt; $person; $i++) {
              $counter = $i + 1;
  
              $html .= "Deelnemer ". $counter . "&lt;br&gt;";
  
              $html .= woocommerce_form_field( "participant_details[$i][full_name]", array(
                  "type" =&gt; "text",
                  "return" =&gt; true,
                  "value" =&gt; "",
                  "required"      =&gt; true,
                  "label" =&gt; __( "Naam" )
                  )
              );
              $html .= woocommerce_form_field( "participant_details[$i][email_address]", array(
                  "type" =&gt; "email",
                  "return" =&gt; true,
                  "value" =&gt; "",
                  "required"      =&gt; true,
                  "label" =&gt; __( "Emailadres" )
                  )
              );
  
          }
          return $html;
      }
  }
  
  //* display the extra field on the checkout form
  add_action( 'woocommerce_checkout_after_customer_details' ,'ppp_extra_checkout_fields' );
  function ppp_extra_checkout_fields(){
  
      $checkout = WC()-&gt;checkout();
  
      foreach ( $checkout-&gt;checkout_fields['extra_fields'] as $key =&gt; $field ) :
  
          woocommerce_form_field( $key, $field, $checkout-&gt;get_value( $key ) );
  
      endforeach;
  }
  
  //* Validate custom checkout fields
  add_action( 'woocommerce_after_checkout_validation', 'ppp_checkout_field_participant_details_validation', 20, 2 );
  function ppp_checkout_field_participant_details_validation( $data, $errors ){
      if ( isset( $_POST['persons'] ) &amp;&amp; $_POST['persons'] &gt; 1 ){
  
          for ( $i = 1, $j = 2; $i &lt; esc_attr( $_POST['persons'] ); $i++, $j++ ) {
              if ( empty( $_POST['participant_details'][$i]['full_name'] ) )
                  $errors-&gt;add( 'participant_'.$i.'_full_name',  __( "Please fill in the participant $j full name" ), 'error' );
  
              if ( empty( $_POST['participant_details'][$i]['email_address'] ) )
                  $errors-&gt;add( 'participant_'.$i.'_email_address',  __( "Please fill in the participant $j email address" ), 'error' );
          }
      }
  }
  
  
  //* Sanitize our custom field
  function ppp_custom_process_checkout_field_participant_details( $posted ){
  
      $clean = array();
  
      foreach( $posted as $participant ){
          $details = ppp_custom_checkout_clean_participant_details( $participant );
  
          if( ! empty( $details ) ){
              $clean[] = $details;
          }
      }
  
      return $clean;
  }
  add_filter( 'woocommerce_process_checkout_participant_details_field', 'ppp_custom_process_checkout_field_participant_details' );
  
  //*
  function ppp_custom_checkout_clean_participant_details( $participant = array() ){
      $details = array();
      if( isset( $participant["full_name"] ) ){
          $details['full_name'] = sanitize_text_field( $participant["full_name"] );
      }
      if( isset( $participant["email_address"] ) ){
          $details['email_address'] = sanitize_text_field( $participant["email_address"] );
      }
      return $details;
  }
  
  
  //* Update_post_meta
  add_action( 'woocommerce_checkout_update_order_meta', 'ppp_custom_checkout_field_update_order_meta', 10, 2 );
  function ppp_custom_checkout_field_update_order_meta( $order_id, $posted ){
  
      if( ! empty( $posted["participant_details"] ) ){
          update_post_meta( $order_id, "_participant_details", $posted["participant_details"] );
      } else {
          delete_post_meta( $order_id, "_participant_details" );
      }
  
  }
  add_action( 'woocommerce_checkout_update_order_meta', 'ppp_custom_checkout_field_update_order_meta', 10, 2 );
  </code></pre>