从“选择订购”元数据中保存自定义结帐数据

时间:2019-01-15 17:20:15

标签: php wordpress woocommerce checkout

更新

下面的代码确实可以正常工作,我发现只能订购1个项目来停止内部错误。但是,保存并显示在管理订单页面中的元数据是抽奖ID,而不是标题(post_title)。

我的问题已更改为,我将如何更新以下内容以将抽奖ID和标题另存为单独的meta,并同时显示在订单页面上。


我目前有一个名为“ raffle”的自定义帖子类型。

我的总体目标是让客户从下拉菜单中选择一个抽奖名称,即post_title。

当前,自定义表单字段显示在结帐中,没有问题。 它从CPT抽奖中正确提取了所有名称。

但是,我需要将他们的选择保存在订单元中。我在这里看到了许多不错的回复,包括this

尽管这些建议似乎都不适合我的情况。 一旦订单获得此元数据,我就可以导出将显示此元数据选择的woocommerce订单。

这是我当前的代码。它分为6部分:

  • 从抽奖活动CPT获得帖子标题
  • 添加新的结帐字段
  • 将字段添加到页面上/在客户详细信息之后
  • 验证
  • 将元数据保存到订单中
  • 在管理面板中显示meta并确保可以导出meta

这是我上面的当前代码

    // 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>';
}

任何帮助将不胜感激,即使只是在说明如何将元数据保存到订单中。

谢谢

0 个答案:

没有答案