phphtmlwordpresswoocommercewoocommerce-bookings

Dynamically ask person name using woocommerce bookings.?


I am using woo commerce bookings plugin to book tours but i want to get each person type name individually on checkout page depending on number of persons dynamically. I have found post on stack overflow which did not worked for me it keep says undefined offset 0 as error on checkout page.

I tried this function already.

//* 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' => array(
    'type' => 'participant_details',
    'required'      => false,
    'label' => __( 'Participant Details' )
    ),
);

// Add a "persons" hidden input field
foreach( WC()->cart->get_cart() as $cart_item ) {
    $persons = $cart_item['booking']['_persons'][0];
}
echo '<input type="hidden" name="persons" value="' . $persons . '">';

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()->cart->get_cart_contents_count();

$items = WC()->cart->get_cart();

foreach($items as $item) {
    $person = $item['booking']['_persons'][0];
}

if ($person > 1) {

    $html = '';

    $html .= "<h3>Deelnemers</h3>";

    for ( $i = 1; $i < $person; $i++) {
        $counter = $i + 1;

        $html .= "Deelnemer ". $counter . "<br>";

        $html .= woocommerce_form_field( "participant_details[$i][full_name]", array(
            "type" => "text",
            "return" => true,
            "value" => "",
            "required"      => true,
            "label" => __( "Naam" )
            )
        );
        $html .= woocommerce_form_field( "participant_details[$i][email_address]", array(
            "type" => "email",
            "return" => true,
            "value" => "",
            "required"      => true,
            "label" => __( "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()->checkout();

foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) :

    woocommerce_form_field( $key, $field, $checkout->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'] ) && $_POST['persons'] > 1 ){

    for ( $i = 1, $j = 2; $i < esc_attr( $_POST['persons'] ); $i++, $j++ ) {
        if ( empty( $_POST['participant_details'][$i]['full_name'] ) )
            $errors->add( 'participant_'.$i.'_full_name',  __( "Please fill in the participant $j full name" ), 'error' );

        if ( empty( $_POST['participant_details'][$i]['email_address'] ) )
            $errors->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 );

here is website where i am tryingto achieve this. Website


Solution

  •   // Add checkout custom text fields
         add_action( 'woocommerce_before_order_notes', 'add_checkout_custom_text_fields', 20, 1 );
       function add_checkout_custom_text_fields( $checkout) {
    $index = 0;
    
    // 1st Loop through cart items
    foreach(WC()->cart->get_cart() as $cart_item){
        $index++;
        // 2nd Loop through each unit related to item quantity
        for($i = 1; $i <= $cart_item['booking']['Adults']; $i++){
    
            woocommerce_form_field("Adult[$index][$i]", array(
                'type' =>'text',
                'class'=>array('my-field-class form-row-wide'),
                'label'=>__('Adult Name')." ($i)",
                'placeholder'=>__('Enter adult name'),
            ), $checkout->get_value("Adult[$index][$i]"));
        }
    
        for($i = 1; $i <= $cart_item['booking']['Childs']; $i++){
    
            woocommerce_form_field("Child[$index][$i]", array(
                'type' =>'text',
                'class'=>array('my-field-class form-row-wide'),
                'label'=>__('Child Name')." ($i)",
                'placeholder'=>__('Enter child name'),
            ), $checkout->get_value("Child[$index][$i]"));
        }
    }
     }