Как сохранить и отобразить пользовательские поля WooCommerce Booking (не Order) - PullRequest
0 голосов
/ 30 сентября 2018

Status quo

Я использую WooCommerce Bookings для регистрации на курс.Клиенты должны добавить имена всех людей, для которых они бронируют места.Мне удалось сохранить имена в виде строки в порядке мета.

Это мой код до сих пор:

// Check cart for courses with attendees
function foobar_check_courses_in_cart ($checkout) {

    global $woocommerce;

    $courses_in_cart = array();

    foreach ( $woocommerce->cart->get_cart() as $cart_item => $values ) {
        $_courseid = $values['data']->get_id();
        $_product = wc_get_product( $values['data']->get_id());
        $_persons = array_sum($values['booking']['_persons']);
        $_date = $values['booking']['date'];

        if ($_persons > 0) {
            $courses_in_cart[$_product->get_title()] = [$_persons, $_date, $_courseid];
        } else {
            $courses_in_cart[$_product->get_title()] = false;
        }
    }
    return $courses_in_cart;
}

// Create name fields for every course and every attendee
function foobar_add_attendees_fields ($checkout) {

    $courses_in_cart = foobar_check_courses_in_cart ($checkout);

    foreach ($courses_in_cart as $course_name => $course_details) {
        if ( $course_details ) {

            // (...)

            for ($i=1; $i <= $course_details[0]; $i++) {    
                echo '<div class="col-md-12"><b>Attendee '. $i .'</b></div><div class="col-md-4">';
                woocommerce_form_field( 'foobar_attendees['. $course_details[2] .']['. $i .'][firstname]', array(
                    'type'  => 'text',
                    'required'  => 'true',
                    'input_class' => array( 'form-control' ),
                    'placeholder' => __( 'Vorname' ),
                ), $checkout->get_value( 'foobar_attendees['. $course_details[2] .']['. $i .'][firstname]' ) );
                echo '</div>';
                echo '<div class="col-md-4">';
                woocommerce_form_field( 'foobar_attendees['. $course_details[2] .']['. $i .'][name]', array(
                    'type'  => 'text',
                    'required'  => 'true',
                    'input_class' => array( 'form-control' ),
                    'placeholder' => __( 'Nachname' ),
                ), $checkout->get_value( 'foobar_attendees['. $course_details[2] .']['. $i .'][name]' ) );
                echo '</div>';
                echo '<div class="col-md-4">';
                woocommerce_form_field( 'foobar_attendees['. $course_details[2] .']['. $i .'][age]', array(
                    'type'  => 'text',
                    'required'  => 'true',
                    'input_class' => array( 'form-control' ),
                    'placeholder' => __( 'Alter' ),
                ), $checkout->get_value( 'foobar_attendees['. $course_details[2] .']['. $i .'][age]' ) );
                echo '</div>';
            }
            echo '</div>';
        }
    }
    echo '</div>';
}
add_action( 'woocommerce_after_order_notes', 'foobar_add_attendees_fields');

// Validate attendee fields
function foobar_validate_attendees_fields() {
// (...)
}
add_action('woocommerce_checkout_process', 'foobar_validate_attendees_fields');

// Save everything as a string in order meta (this is bad!) 
function foobar_save_attendees_fields( $order_id ) {

    if ( $_POST['foobar_attendees'] ) {
        $foobar_attendees_text = '';
        foreach ($_POST['foobar_attendees'] as $course => $attendees) {

            $foobar_course_name = wc_get_product(sanitize_text_field($course))->get_name();
            $foobar_attendees_text .= '<br>'. $foobar_course_name .':';

            foreach ($attendees as $key => $value) {
                $foobar_attendees_text .= '<br>'.$value['firstname'].' '.$value['name'].' ('.$value['age'].')';
            }

            $foobar_attendees_text .= '<br>';
        }
        update_post_meta( $order_id, 'Attendees', $foobar_attendees_text );
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'foobar_save_attendees_fields' );

// Display attendees in wp-admin/orders/123
function foobar_display_attendees_fields_admin($order){
    echo '<p><strong>'.__('Attendees').':</strong> ' . get_post_meta( $order->id, 'Attendees', true ) . '</p>';
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'foobar_display_attendees_fields_admin', 10, 1 );

// Display attendees in mails
function foobar_display_attendees_fields_email( $keys ) {
    $keys[] = 'Attendees';
    return $keys;
}
add_filter('woocommerce_email_order_meta_keys', 'foobar_display_attendees_fields_email');

Это результат:

Снимок экранастраницы оформления заказа

Снимок экрана страницы заказа на редактирование


Задача

Одна строка на заказ, содержащая участников различныхкурсы / заказы - это боль и ужасная вещь для экспорта и т. д. Поэтому я хочу сохранять участников отдельно для каждого бронирования.

На странице Бронирование 1 Подробная информация

посетители: 1Имя Фамилия (Возраст)

участник_2: Имя Фамилия (Возраст) ...

.

На странице Бронирование 2 Подробно

...


Как добавить каждого участника в отдельное бронирование?Могу ли я как-то update_post_meta, но с идентификатором бронирования?

Любая помощь высоко ценится!

...