Сохраните данные пользовательского оформления заказа из метки «Выбрать для заказа» - PullRequest
0 голосов
/ 15 января 2019

UPDATE

Приведенный ниже код работает должным образом, я обнаружил, что только 1 элемент может быть заказан, чтобы остановить внутреннюю ошибку. Однако метаданные, сохраненные и показанные на странице заказа администратора, представляют собой идентификатор лотереи, а не заголовок (post_title).

Мой вопрос изменился на: как мне обновить нижеприведенное, чтобы сохранить идентификатор и заголовок лотереи в виде отдельной мета, и оба они были бы показаны на странице заказа.


В настоящее время у меня есть пользовательский тип поста с именем 'raffle'.

Моя общая цель - чтобы клиент выбрал из выпадающего списка одно из названий лотереи, то есть post_title.

В настоящее время настраиваемое поле формы отображается на кассе без проблем. Он правильно вытягивает все имена из розыгрыша CPT.

Однако мне нужно, чтобы их выбор был сохранен в метаданных порядка. Я видел хорошие отзывы здесь, включая this

Хотя ни один из предложенных вариантов не подходит для моей ситуации. Как только заказ получит эту мета, я могу экспортировать заказы woocommerce, которые будут отображать этот выбор мета.

Вот мой текущий код. оно разбито на 6 частей:

  • Получить заголовки постов из розыгрыша CPT
  • Добавить новое поле оформления заказа
  • Добавить поле на страницу / после информации о клиенте
  • Подтвердите его
  • Сохранение мета в заказе
  • Отображение мета в административной панели & Убедитесь, что мета может быть экспортирована

Вот мой текущий код для вышеупомянутого

    // Get custon post data from 'raffle' cpt
function prize_checkout_options(){

    $args = array(
        'author'           => get_current_user_id(),
        'posts_per_page'   => -1,
        'orderby'          => 'post_title',
        'order'            => 'ASC',
        'post_type'        => 'raffle',
        'post_status'      => 'publish' );

    $posts = get_posts( $args );

    $prizes= wp_list_pluck( $posts, 'post_title', 'ID' ); 

    return $prizes;
}


// Add a new checkout field
add_filter( 'woocommerce_checkout_fields', 'prize_choice_checkout_fields' );

function prize_choice_checkout_fields($fields){
    $fields['extra_fields'] = array(
            'prize_choice' => array(
                'type' => 'select',
                'options' => prize_checkout_options(),
                'required'      => true,
                'label' => __( 'Confirm your prize choice' )
                )
            );

    return $fields;
}


// display the extra field on the checkout form
add_action( 'woocommerce_checkout_after_customer_details' ,'extra_checkout_fields' );

function extra_checkout_fields(){

    $checkout = WC()->checkout(); ?>

    <div class="extra-fields">
    <?php 
    // because of this foreach, everything added to the array in the previous function will display automagically
    foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) : ?>

            <?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>

        <?php endforeach; ?>
    </div>

    <?php 
}



// Validate the entry
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['prize_choice'] )
        wc_add_notice( __( 'Confirming a prize is compulsory. Please select a prize' ), 'error' );
}


// Save custom checkout fields the data to the order
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['prize_choice'] ) ) {
        update_post_meta( $order_id, 'prize_choice', sanitize_text_field( $_POST['prize_choice'] ) );
        $order->save();
    }
}


// Display their chosen option the admin order screen
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );

function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Chosen Prize').':</strong> <br/>' . get_post_meta( $order->get_id(), 'prize_choice', true ) . '</p>';
}

Любая помощь будет принята с благодарностью, даже если она просто объясняет, как сохранить метаданные в заказе.

Спасибо,

...