作者:羊角roik_789 | 来源:互联网 | 2023-08-31 20:04
我正在使用woo commerce预订插件来预订旅行,但我想根据人数动态地在结帐页面上分别获取每个人的类型名称。我发现堆栈溢出的帖子对我不起作用,它在结帐页面上始终显示未定义的偏移量0作为错误。
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 '';
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 .= "Deelnemers
";
for ( $i = 1; $i <$person; $i++) {
$counter = $i + 1;
$html .= "Deelnemer ". $counter . "
";
$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","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 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',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',2 );
这是我试图实现这一目标的网站。
Website
// 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]",'label'=>__('Child Name')." ($i)",'placeholder'=>__('Enter child name'),$checkout->get_value("Child[$index][$i]"));
}
}
}