Я создал настраиваемые поля ввода на странице оформления заказа для сайта бронирования.Количество полей ввода зависит от количества человек.Мне удалось отобразить их в форме оформления заказа, очистить их и отобразить в административной панели.Поля ввода обязательны, поэтому должна появиться ошибка (wc_add_notice), если одно из нескольких полей пустое.Как я могу добиться, чтобы получить wc_add_notice?Вот мой код:
//* Add a new checkout field
function ppp_filter_checkout_fields($fields){
$fields['extra_fields'] = array(
'participant_details' => array(
'type' => 'participant_details',
'required' => true,
'label' => __( 'Participant Details' )
),
);
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'ppp_filter_checkout_fields' );
//* Add the field to the checkout
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" => "text",
"return" => true,
"value" => "",
"required" => true,
"label" => __( "Emailadres" )
)
);
}
return $html;
}
}
add_filter( 'woocommerce_form_field_participant_details', 'ppp_filter_checkout_field_group', 10, 4 );
//* display the extra field on the checkout form
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;
}
add_action( 'woocommerce_checkout_after_customer_details' ,'ppp_extra_checkout_fields' );
//* 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
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 );
//* Display the extra data in the order admin panel
function ppp_display_order_data_in_admin( $order ){
$participant_details = get_post_meta( $order->id, "_participant_details", true );
if( ! empty( $participant_details ) ) {
$participant_defaults = array(
"full_name" => "",
"email_address" => ""
);
?>
<div class="participant_data">
<h4><?php _e( "Deelnemers Lijst", "prespersadprodukties" ); ?></h4>
<?php
$i = 1;
foreach( $participant_details as $participant ){
$participant = wp_parse_args( $participant, $participant_defaults );
echo "<p><strong>" . sprintf( __( "Deelnemer %s", "prespersadprodukties" ), $i+1 ) . "</strong>" . "<br/>";
echo __( "Naam", "prespersadprodukties" ) . ' : ' . $participant["full_name"] . "<br/>";
echo __( "Emailadres", "prespersadprodukties" ) . ' : ' . $participant["email_address"] . "<br/>";
echo "</p>";
$i++;
}
?>
</div>
<?php }
}
add_action( 'woocommerce_admin_order_data_after_order_details', 'ppp_display_order_data_in_admin' );