在 WooCommerce 订单详细信息中保存自定义结帐交货时间字段值

Save custom checkout delivery time field value in WooCommerce order details

在结帐页面上,有送货方式,如果选择了特定的送货方式(只有一种),则应出现带有送货时间的下拉列表。该字段是使用带 Repeater 的 ACF 插件实现的,字段类型为 Text。用户选择的时间应显示在 WooCommerce 管理面板的订单详细信息中。

根据我得到的主题代码,我写了下一个代码:

  1. 在 woocommerce/checkout/form-shipping.php 文件中输入以下代码:
<div id="delivery_times" class="form-group d-none">
   <label class="text-bold" for="select_time">Delivery time: </label>
      <select id="select_time" class="form-control mb-1">
         <option value="" selected>Select time</option>
         <?php
            $delivery_times = get_field('delivery_times', 'options');
            $count = 0;
            foreach ($delivery_times as $delivery_time):
              echo '<option value="'.$delivery_time['range_time'].'" data-pickup="'.$count.'">'.$delivery_time['range_time'].'</option>';
              $count++;
            endforeach;
          ?>
       </select>
</div>
  1. 有一个共同的主题-checkout.js文件,我在里面添加了代码:
$("#shipping_speed").change(function(){
    var delivery_time = $(this).children("option:selected").data("type");

    if(delivery_time == "tomorrow"){
       $("#delivery_times").removeClass("d-none");
    }else{
       $("#delivery_times").addClass("d-none");
       $("#select_time option[value='']").prop('selected',true);
    }
});

现在我需要保存选定的数据并以某种方式在管理员的订单详细信息中显示它,但我没有在我的主题中找到类似的实现。请告诉我如何将 ACF 字段中的数据保存到订单详细信息中?

数据可能保存在另一个 php 文件中,它使用的是 MVC 模型。

我要告诉你的一件事是它是一个表单,所以它确实已经处理了其他数据,我建议你找到它处理其他数据的位置并在那里添加一些属性...

有道理吗?

更新:

首先在你的 html <select> 上缺少属性 name="select_time",所以替换行:

<select id="select_time" class="form-control mb-1">

通过这条线:

<select id="select_time" name="select_time" class="form-control mb-1">

现在您可以使用以下代码片段将所选值保存为订单元数据:

// Save the custom checkout field as the order meta
add_action( 'woocommerce_checkout_create_order', 'custom_checkout_field_update_order_meta', 10, 2 );
function custom_checkout_field_update_order_meta( $order, $data ) {
    if ( isset($_POST['select_time']) ) {
        $order->update_meta_data( 'delivery_time', esc_attr($_POST['select_time']) );
    }
}

然后在送货地址下的管理单个订单页面中显示它:

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'display_admin_order_select_time_custom_field' );
function display_admin_order_select_time_custom_field( $order ){
    $delivery_time = $order->get_meta('delivery_time');

    if( ! empty($delivery_time) ) {
        echo '<p class="delivery_time"><strong>'. __("Delivery time", "woocommerce").'</strong>: '.$delivery_time.'</p>';
    }
}

然后您可以在客户订单和电子邮件通知中显示此交货时间:

add_filter( 'woocommerce_get_order_item_totals', 'delivery_time_as_order_item_total_row', 10, 3 );
function delivery_time_as_order_item_total_row( $total_rows, $order, $tax_display ){
    $delivery_time  = $order->get_meta( 'delivery_time' ); // Get delivery time
    $new_total_rows = array(); // Initializing

    if( empty($delivery_time) ) {
        return $total_rows; // Exit
    }

    // Loop through total rows
    foreach( $total_rows as $key => $value ){
        if( 'payment_method' == $key ) {
            $new_total_rows['delivery_time'] = array(
                'label' => __("Delivery time", "woocommerce"),
                'value' => $delivery_time,
            );
        }
        $new_total_rows[$key] = $total_rows[$key];
    }
    return $new_total_rows;
}

代码进入活动子主题(或活动主题)的 functions.php 文件。应该可以。