在woocommerce单页产品上,我创建了一个自定义字段。我希望它的值在订单生效时存储在订单元中。经过几个小时的研究,我还没有找到任何解决办法来结束!但我相信我已经很接近了。。。
这是我的实际代码:
// create the custom field
add_action( 'woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart', 100 );
function add_fields_before_add_to_cart($post) {
?>
<select class="selectpicker" name="premiere_box_abo" id="premiere_box_abo">
<option value="Septembre 2018">Septembre 2018</option>
<option value="Octobre 2018">Octobre 2018</option>
</select>
<?php
}
// Store custom field
function save_my_custom_checkout_field( $cart_item_data, $product_id ) {
if( isset( $_POST['premiere_box_abo'] ) ) {
$cart_item_data[ 'premiere_box_abo' ] = $_POST['premiere_box_abo'];
/* below statement make sure every add to cart action as unique line item */
$cart_item_data['unique_key'] = md5( microtime().rand() );
}
return $cart_item_data;
}
add_action( 'woocommerce_add_cart_item_data', 'save_my_custom_checkout_field', 10, 2 );
// Render meta on cart and checkout
function render_meta_on_cart_and_checkout( $cart_data, $cart_item = null ) {
$custom_items = array();
/* Woo 2.4.2 updates */
if( !empty( $cart_data ) ) {
$custom_items = $cart_data;
}
if( isset( $cart_item['premiere_box_abo'] ) ) {
$custom_items[] = array( "name" => '1e box abonnement', "value" => $cart_item['premiere_box_abo'] );
}
return $custom_items;
}
add_filter( 'woocommerce_get_item_data', 'render_meta_on_cart_and_checkout', 10, 2 );
// Display as order meta
add_action( 'woocommerce_add_order_item_meta', 'my_field_order_meta_handler', 1, 3 );
function my_field_order_meta_handler( $item_id, $values ) {
if( isset( $values['premiere_box_abo'] ) ) {
wc_add_order_item_meta( $item_id, "1e box abonnement", $values['premiere_box_abo'] );
}
}
// Update the order meta with field value
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['premiere_box_abo'] ) ) {
update_post_meta( $order_id, 'premiere_box_abo', sanitize_text_field( $_POST['premiere_box_abo'] ) );
}
}
以下是我目前掌握的情况:
这就是我想要的:
如何将此自定义字段数据保存为订单元数据,以便在“自定义字段”元框中显示值。
任何帮助都很感激。
自从woocommerce 3以来,您的代码有点过时,并且有一些小错误。
同样为了回答您的主要问题,您正在尝试将一些“项目”数据保存为订单元数据,这不是最好的做法,因为您可以为订单保存许多项目。
我在下面重新查看了您的代码:
// Display a custom select field below add to cart
add_action( 'woocommerce_before_add_to_cart_button', 'add_field_before_add_to_cart', 10 );
function add_field_before_add_to_cart() {
global $product;
?>
<select class="selectpicker" name="premiere_box_abo" id="premiere_box_abo">
<option value="Septembre 2018">Septembre 2018</option>
<option value="Septembre 2018">Octobre 2018</option>
</select>
<?php
}
// Add select field value as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_custom_data', 20, 2 );
function add_cart_item_custom_data( $cart_item_data, $product_id ) {
if( isset( $_POST['premiere_box_abo'] ) ) {
$cart_item_data['custom_data'] = esc_attr($_POST['premiere_box_abo']);
$cart_item_data['unique_key'] = md5( microtime().rand() );
}
return $cart_item_data;
}
// Display custom cart item data in cart and checkout
add_filter( 'woocommerce_get_item_data', 'display_custom_cart_item_data', 20, 2 );
function display_custom_cart_item_data( $cart_item_data, $cart_item ) {
if( isset( $cart_item['custom_data'] ) ) {
$cart_item_data[] = array(
'name' => __('1e box abonnement'),
'value' => $cart_item['custom_data']
);
}
return $cart_item_data;
}
// Save / Display custom field value as custom order item meta data
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_field_update_order_item_meta', 20, 4 );
function custom_field_update_order_item_meta( $item, $cart_item_key, $values, $order ) {
if( isset($values['custom_data']) ){
$item->update_meta_data( __('1e box abonnement'), $values['custom_data'] );
}
}
// Save custom fields values as custom order meta data
add_action( 'woocommerce_checkout_create_order', 'my_custom_checkout_field_update_order_meta', 20, 2 );
function my_custom_checkout_field_update_order_meta( $order, $data ) {
$premiere_box_abo = array();
// Loop through order items
foreach( $order->get_items() as $item ){
// Set each order item '1e box abonnement' in an array
$premiere_box_abo[] = $item->get_meta( __('1e box abonnement') );
}
// Save the data as a coma separated string in order meta data
if( sizeof($premiere_box_abo) > 0 )
$order->update_meta_data( 'premiere_box_abo', implode( ',', $premiere_box_abo ) );
}
代码进入活动子主题(或活动主题)的function.php文件。测试和工作。
我在woocommerce产品中添加了一个名为“捐赠”的自定义字段,用于存储单个产品的捐赠。然后,我添加了名为“line_捐赠”的行项目元。现在,我需要更新“行_捐赠”上的产品数量变化和点击更新购物车按钮后,如产品总的变化。 欢迎任何帮助。
关于WooCommerce。我有我要添加到购物车的自定义数据。在functions.php文件中,我有以下功能。 这是可行的,自定义数据显示在购物车中。但是,定制数据不会显示在订单和订单电子邮件上。我在Stackoverflow上看到了一些解决这个问题的答案,但我无法让它们适用于我的情况。我提到的解决方案是。 在Woocommerce中保存和显示订单项自定义元数据 显示和保存添加的自定义购物车项目
但不管用。 感谢任何帮助。
我有一个定制的WooCommerce产品类型称为彩票。我需要一个自定义选择字段(因为它不是一个可变产品),所以我添加了一个。 一切都很好,我在购物车和结帐中也获得了价值,但我无法在管理员订单或订单邮件(客户和管理员)中获得价值。 下面是我在函数中添加的代码。php。我做错了什么?
我们在这里按照Remi Corson的指南为变体产品设置了一个自定义域 此时,当用户选择变体时,我们能够在单个产品页面中显示自定义文本字段,但这在购买过程中是不够的,因为我们需要: A)在购物车和结帐中显示此文本 B)保存此信息,以便在“感谢”页面、“电子邮件”和“管理订单编辑”页面中显示此信息 类似于在WooCommerce订单和电子邮件上保存和显示产品自定义元,但使用的是产品变体而不是简单的产