WpDoe
WpDoe

Reputation: 474

WooCommerce add conditional checkout fields

We have a WooCommerce running for selling travel tours. The problem is that one visitor can buy a tour for four people and or every person on the trip we need get their passport_number and expiration_date.

Now we can easily get the needed fields to be displayed in checkout page, however there has to be a condition on a quantity of product (travel tour) bought.

I did a lot of research and I could only find conditional fields based on product_id, but nothing based on the quantity of a product, so I hope this question will be helpful for others.

Any help or guindace is much appreciated.

Upvotes: 0

Views: 1465

Answers (1)

Ecomerciar
Ecomerciar

Reputation: 11

it seems that you asked this a long time a go, but i'll be adding it for someone who may need it in the future. This is our full code to resolve this issue.

This code assumes that the items chosen on the cart are only one of the packages and not a mix of them. The client can then choose the quantity of passengers they would like.

/**
 * Add the fields to the checkout
 **/
add_action( 'woocommerce_before_order_notes', 'product_quantities_custom_checkout_fields' );

function product_quantities_custom_checkout_fields( $checkout ) {

 //Check for product quantities
 $quantity_of_products_in_cart = product_quantities_in_cart();

 if($quantity_of_products_in_cart != 0) {
    echo '<div id="quantity_checkout_field"><h3>' . __( 'Passengers Information' ) . '</h3>';

    $i = 0;
    while ($i < $quantity_of_products_in_cart) {
        $j = $i + 1;

        $passenger_name = 'passenger_name_'. $j;
        $passenger_birth_date = 'passenger_birth_date_'. $j;
        $passenger_dni = 'passenger_dni_'. $j;
        $passenger_passport = 'passenger_passport_'. $j;
        $passenger_phone = 'passenger_phone_'. $j;
        $passenger_address = 'passenger_address_'. $j;
        $passenger_city = 'passenger_city_'. $j;

        echo '<p style="margin: 24px 0 0px; color: #222; display: table-cell; font-weight: bold;">Passenger ' . $j . '</p>';

         woocommerce_form_field( $passenger_name, array(
         'type'  => 'text',
         'class' => array( 'passenger_name form-row-first' ),
         'required'  => true,
         'label' => __('Name and Surname', 'woocommerce'),
         ), $checkout->get_value( $passenger_name ) );

         woocommerce_form_field( $passenger_birth_date, array(
         'type'  => 'text',
         'class' =>array('passenger_birth_date form-row-last'),
         'input_class' => array('hasDatepicker'),
         'required'  => true,
         'label' => __('Birth Date', 'woocommerce'),
         'placeholder'      => __('day/month/year (example: 21/11/1994)'),
         ), $checkout->get_value( $passenger_birth_date ) );

         woocommerce_form_field( $passenger_dni, array(
         'type'  => 'text',
         'class' => array( 'passenger_dni form-row-first' ),
         'required'  => true,
         'label' => __('DNI Number', 'woocommerce'),
         ), $checkout->get_value( $passenger_dni ) );

         woocommerce_form_field( $passenger_passport, array(
         'type'  => 'text',
         'class' => array( 'passenger_passport form-row-last' ),
         'required'  => true,
         'label' => __('Pasaport Number', 'woocommerce'),
         ), $checkout->get_value( $passenger_passport ) );

         woocommerce_form_field( $passenger_phone, array(
         'type'  => 'text',
         'class' => array( 'passenger_phone form-row-first' ),
         'required'  => true,
         'label' => __('Phone', 'woocommerce'),
         ), $checkout->get_value( $passenger_phone ) );

         woocommerce_form_field( $passenger_address, array(
         'type'  => 'text',
         'class' => array( 'passenger_address form-row-last' ),
         'required'  => true,
         'label' => __('Address', 'woocommerce'),
         ), $checkout->get_value( $passenger_address ) );

         woocommerce_form_field( $passenger_city, array(
         'type'  => 'text',
         'class' => array( 'passenger_city form-row-wide' ),
         'required'  => true,
         'label' => __('City', 'woocommerce'),
         ), $checkout->get_value( $passenger_city ) );

         $i++;
    }

         echo '</div>';
 }

}

/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'quantity_checkout_field_process');

function quantity_checkout_field_process() {
    // Check if set, if its not set add an error.

    //Check for product quantities
    $quantity_of_products_in_cart = product_quantities_in_cart();

    if($quantity_of_products_in_cart != 0) {
        $i = 0;
        while ($i < $quantity_of_products_in_cart) {
            $j = $i + 1;

            $passenger_name = 'passenger_name_'. $j;
            $passenger_birth_date = 'passenger_birth_date_'. $j;
            $passenger_dni = 'passenger_dni_'. $j;
            $passenger_passport = 'passenger_passport_'. $j;
            $passenger_phone = 'passenger_phone_'. $j;
            $passenger_address = 'passenger_address_'. $j;
            $passenger_city = 'passenger_city_'. $j;

            if ( ! $_POST[$passenger_name] )
                wc_add_notice( __( 'Please check on filling the Name and Surname for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_birth_date] )
                wc_add_notice( __( 'Please check on filling the Birth Date for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_dni] )
                wc_add_notice( __( 'Please check on filling the DNI for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_passport] )
                wc_add_notice( __( 'Please check on filling the Pasaport for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_phone] )
                wc_add_notice( __( 'Please check on filling the Phone for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_address] )
                wc_add_notice( __( 'Please check on filling the Address for passenger '. $j .'.' ), 'error' );

            if ( ! $_POST[$passenger_city] )
                wc_add_notice( __( 'Please check on filling the City for passenger '. $j .'.' ), 'error' );

            $i++;

        }

    }

}

/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'quantity_checkout_field_update_order_meta' );

function quantity_checkout_field_update_order_meta( $order_id ) {

    $quantity_of_products_in_cart = product_quantities_in_cart();

    if($quantity_of_products_in_cart != 0) {
        $i = 0;
        while ($i < $quantity_of_products_in_cart) {
            $j = $i + 1;

            $passenger_name = 'passenger_name_'. $j;
            $passenger_birth_date = 'passenger_birth_date_'. $j;
            $passenger_dni = 'passenger_dni_'. $j;
            $passenger_passport = 'passenger_passport_'. $j;
            $passenger_phone = 'passenger_phone_'. $j;
            $passenger_address = 'passenger_domicilio_'. $j;
            $passenger_city = 'passenger_city_'. $j;

            $passenger_name_display = 'Name of Passenger '. $j;
            $passenger_birth_date_display = 'Birth Date of Passenger '. $j;
            $passenger_dni_display = 'DNI of Passenger '. $j;
            $passenger_passport_display = 'Pasaport of Passenger '. $j;
            $passenger_phone_display = 'Phone of Passenger '. $j;
            $passenger_address_display = 'Address of Passenger '. $j;
            $passenger_city_display = 'City of Passenger '. $j;

            if ( ! empty( $_POST[$passenger_name] ) ) {
                update_post_meta( $order_id, $passenger_name_display, sanitize_text_field( $_POST[$passenger_name] ) );
            }

            if ( ! empty( $_POST[$passenger_birth_date] ) ) {
                update_post_meta( $order_id, $passenger_birth_date_display, sanitize_text_field( $_POST[$passenger_birth_date] ) );
            }

            if ( ! empty( $_POST[$passenger_dni] ) ) {
                update_post_meta( $order_id, $passenger_dni_display, sanitize_text_field( $_POST[$passenger_dni] ) );
            }

            if ( ! empty( $_POST[$passenger_passport] ) ) {
                update_post_meta( $order_id, $passenger_passport_display, sanitize_text_field( $_POST[$passenger_passport] ) );
            }

            if ( ! empty( $_POST[$passenger_phone] ) ) {
                update_post_meta( $order_id, $passenger_phone_display, sanitize_text_field( $_POST[$passenger_phone] ) );
            }

            if ( ! empty( $_POST[$passenger_addresso] ) ) {
                update_post_meta( $order_id, $passenger_address_display, sanitize_text_field( $_POST[$passenger_address] ) );
            }

            if ( ! empty( $_POST[$passenger_city] ) ) {
                update_post_meta( $order_id, $passenger_city_display, sanitize_text_field( $_POST[$passenger_city] ) );
            }
            $i++;
        }
    }
}


/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'quantity_checkout_field_display_admin_order_meta', 10, 1 );

function quantity_checkout_field_display_admin_order_meta($order){

    $order_quantities = (int) $order->get_item_count();

    $i = 0;
    while ($i < $order_quantities) {
        $j = $i + 1;

            $passenger_name_display = 'Name of Passenger '. $j;
            $passenger_birth_date_display = 'Birth Date of Passenger '. $j;
            $passenger_dni_display = 'DNI of Passenger '. $j;
            $passenger_passport_display = 'Pasaport of Passenger '. $j;
            $passenger_phone_display = 'Phone of Passenger '. $j;
            $passenger_address_display = 'Address of Passenger '. $j;
            $passenger_city_display = 'City of Passenger '. $j;

        echo '<p><strong>'.__($passenger_name_display).':</strong> ' . get_post_meta( $order->id, $passenger_name_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_birth_date_display).':</strong> ' . get_post_meta( $order->id, $passenger_birth_date_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_dni_display).':</strong> ' . get_post_meta( $order->id, $passenger_dni_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_passport_display).':</strong> ' . get_post_meta( $order->id, $passenger_passport_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_phone_display).':</strong> ' . get_post_meta( $order->id, $passenger_phone_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_address_display).':</strong> ' . get_post_meta( $order->id, $passenger_address_display, true ) . '</p>';
        echo '<p><strong>'.__($passenger_city_display).':</strong> ' . get_post_meta( $order->id, $passenger_city_display, true ) . '</p>';
        $i++;
    }

}


/**
 * Check for product quantities in cart
 *
 * @return int
 */
function product_quantities_in_cart( ) {
 //Check to see if user has product in cart
 global $woocommerce;

 $quantity_of_products_in_cart = $woocommerce->cart->get_cart_contents_count();

 return $quantity_of_products_in_cart;

}

/**
 * Add the field to order emails
 **/
add_filter('woocommerce_email_order_meta_keys', 'quantity_field_order_meta_keys');
function quantity_field_order_meta_keys( $keys ) {

    $quantity_of_products_in_cart = product_quantities_in_cart();

    if($quantity_of_products_in_cart != 0) {
        $i = 0;
        while ($i < $quantity_of_products_in_cart) {
            $j = $i + 1;

            $passenger_name_display = 'Name of Passenger '. $j;
            $passenger_birth_date_display = 'Birth Date of Passenger '. $j;
            $passenger_dni_display = 'DNI of Passenger '. $j;
            $passenger_passport_display = 'Pasaport of Passenger '. $j;
            $passenger_phone_display = 'Phone of Passenger '. $j;
            $passenger_address_display = 'Address of Passenger '. $j;
            $passenger_city_display = 'City of Passenger '. $j;

            $keys[] = $passenger_name_display;
            $keys[] = $passenger_birth_date_display;
            $keys[] = $passenger_dni_display;
            $keys[] = $passenger_passport_display;
            $keys[] = $passenger_phone_display;
            $keys[] = $passenger_address_display;
            $keys[] = $passenger_city_display;

            $i++;
        }
    }



    return $keys;
}

Upvotes: 1

Related Questions