提交订单请求后为产品添加购物车元值
Add cart meta value for a product after an order request is submitted
我有一个多供应商餐厅 WooCommerce 网站。在将产品添加到购物车时,一个人最多可以从一家 restaurant.On 家餐厅订购 我添加了一个额外的元字段 restaurant_id
,这是该餐厅的 ID。在购物车中,所有产品都具有相同的 restaurant_id
.
即:我的购物车中有两件商品具有 product_id:12 和 13 但它们具有相同的 restaurant_id :366.
我需要将此 restaurant_id
添加为 order-complete
或 order-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-field
和 meta-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 文件。
代码已经过测试并且可以工作。
我有一个多供应商餐厅 WooCommerce 网站。在将产品添加到购物车时,一个人最多可以从一家 restaurant.On 家餐厅订购 我添加了一个额外的元字段 restaurant_id
,这是该餐厅的 ID。在购物车中,所有产品都具有相同的 restaurant_id
.
即:我的购物车中有两件商品具有 product_id:12 和 13 但它们具有相同的 restaurant_id :366.
我需要将此 restaurant_id
添加为 order-complete
或 order-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-field
和 meta-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 文件。
代码已经过测试并且可以工作。