更新
下面的代码确实可以正常工作,我发现只能订购1个项目来停止内部错误。但是,保存并显示在管理订单页面中的元数据是抽奖ID,而不是标题(post_title)。
我的问题已更改为,我将如何更新以下内容以将抽奖ID和标题另存为单独的meta,并同时显示在订单页面上。
我目前有一个名为“ raffle”的自定义帖子类型。
我的总体目标是让客户从下拉菜单中选择一个抽奖名称,即post_title。
当前,自定义表单字段显示在结帐中,没有问题。 它从CPT抽奖中正确提取了所有名称。
但是,我需要将他们的选择保存在订单元中。我在这里看到了许多不错的回复,包括this
尽管这些建议似乎都不适合我的情况。 一旦订单获得此元数据,我就可以导出将显示此元数据选择的woocommerce订单。
这是我当前的代码。它分为6部分:
这是我上面的当前代码
// 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>';
}
任何帮助将不胜感激,即使只是在说明如何将元数据保存到订单中。
谢谢