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>';
}
Любая помощь будет принята с благодарностью, даже если она просто объясняет, как сохранить метаданные в заказе.
Спасибо,