提交订单请求后为产品添加购物车元值

Add cart meta value for a product after an order request is submitted

我有一个多供应商餐厅 WooCommerce 网站。在将产品添加到购物车时,一个人最多可以从一家 restaurant.On 家餐厅订购 我添加了一个额外的元字段 restaurant_id,这是该餐厅的 ID。在购物车中,所有产品都具有相同的 restaurant_id.

即:我的购物车中有两件商品具有 product_id1213 但它们具有相同的 restaurant_id366.

我需要将此 restaurant_id 添加为 order-completeorder-process 中的元字段 action.because 我需要在客户帐户页面上显示餐厅名称。

或者有什么简单的方法吗?

我试过下面的代码作为测试

add_action( 'woocommerce_checkout_update_order_meta', 'add_field_to_order' );
function add_field_to_order( $order_id ) {
    update_post_meta( $order_id, 'new_field', 'new_value' );
}

但它不添加任何 meta-fieldmeta-value 到 order

您可以使用挂钩 woocommerce_order_status_XXX,其中 XXX 是订单状态。

例如:

add_action( 'woocommerce_order_status_completed', 'my_order_status_change_function' );
function my_order_status_change_function( $order_id ) {  
   $order = new WC_Order($order_id);  
   //your logic for updating order meta, the meta is stored in wp_postmeta.  
   update_post_meta( $order_id, 'new_field', 'new_value' );    
}

当订单状态变为处理中时触发该功能, 将操作名称更改为 woocommerce_order_status_processing.

—更新—

据我所知,这个自定义字段已经存在,您在购物车中得到了这个 restaurant_id 值。所以你想在你的查看顺序中显示它(谢谢你和我的帐户页面)并且可能在电子邮件中......

这是代码:

//
// ADD HIDDEN IMPUT FIELDS TO THE CHECKOUT
//
add_action( 'woocommerce_after_order_notes', 'checkout_custom_hidden_imput_field' );
function checkout_custom_hidden_imput_field( $checkout ) {
    foreach(WC()->cart->get_cart() as $item){
        $restaurant_id = $item['restaurant_id'];
        break;
    }
    echo '<div id="custom_checkout_fields" class="custom-hidden-checkout-field">
        <input type="hidden" id="restaurant_id" name="restaurant_id" value="'.$restaurant_id.'" />
    </div>';
}

//
// SAVE THE ORDER META WITH FIELD VALUE
//
add_action( 'woocommerce_checkout_update_order_meta', 'custom_checkout_field_update_order_meta' );

function custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['restaurant_id'] ) ) {
        add_post_meta( $order_id, '_restaurant_id', $_POST['restaurant_id'] );
    }
}

//
// DISPLAY FIELD VALUE ON THE ORDER EDIT PAGE (NOT IN CUSTOM FIELDS METABOX)
//
add_action( 'woocommerce_admin_order_data_after_billing_address', 'custom_checkout_field_display_admin_order_meta', 10, 1 );
function custom_checkout_field_display_admin_order_meta($order){
    $restaurant_id = get_post_meta( $order->id, '_restaurant_id', true );
    if ( ! empty( $restaurant_id ) ) {
        echo '<p><strong>'. __("Restaurant ID", "woocommerce").':</strong> ' . $restaurant_id . '</p>';
    }
}

//
// ADD THE INFORMATION AS META DATA SO THAT IT CAN BE SEEN AS PART OF THE ORDER
//
add_action('woocommerce_add_order_item_meta','custom_add_values_to_order_item_meta', 1, 3 );
function custom_add_values_to_order_item_meta( $item_id, $values, $cart_item_key ) {
    $restaurant_id = get_post_meta( $order->id, '_restaurant_id', true );
    // lets add the meta data to the order!
    wc_add_order_item_meta($item_id, '_restaurant_id', $restaurant_id, true);
}

代码进入您的活动子主题(或主题)的任何 php 文件或任何插件 php 文件。

代码已经过测试并且可以工作。