您似乎问了很长时间,但我会为将来可能需要它的人添加它。这是我们解决此问题的完整代码。
此代码假定购物车上选择的商品只是其中一个包裹,而不是它们的混合。然后客户可以选择他们想要的乘客数量。
/**
* 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;
}