动态添加自定义产品数据作为订单上的项目元数据
Add custom Product data dynamically as item meta data on the Order
是否可以在订单内的产品上添加元数据?
在这种情况下,将有一个元数据,但每个产品(在订单中)将具有不同的值。
示例:
Order 1:
* Product 1
Sample Meta: Meta1
* Product 2
Sample Meta: Meta2
谢谢。
更新 1 :
我现在不知道如何从 woocommerce_add_cart_item_data
过滤器中获取值。我能够从那里成功添加元数据。
我需要获取这些值以便在这个 woocommerce_add_order_item_meta
操作挂钩中使用。
这就是我将元数据成功添加到过滤器的方式:
function add_cart_item_data( $cart_item_data, $product_id ) {
$cart_item_data[ "meta1" ] = $_POST["meta1"];
$cart_item_data[ "meta2" ] = $_POST["meta2"];
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 99, 2 );
是的,这可以使用挂接到 woocommerce_add_order_item_meta
操作挂钩中的自定义函数实现。
add_action('woocommerce_add_order_item_meta','adding_custom_data_in_order_items_meta', 1, 1 );
function adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
// The corresponding Product Id for the item:
$product_id = $values[ 'product_id' ];
$custom_meta_value = $values['my_custom_field1_key'];
// or $custom_meta_value = $_POST['my_custom_field_key'];
// or $custom_meta_value = get_post_meta( $values[ 'product_id' ], '_some_meta_key', true );
if ( !empty($custom_meta_value) )
wc_add_order_item_meta($item_id, 'custom_meta_key', $custom_meta_value, true);
// And so on …
}
But as your question is not detailed and you are not showing any code related to how this custom data is set in your products or passed to the cart object, is not possible to help more that that.
与您的答案相关的更新: (请参阅链接答案中的实际示例):
Adding user custom field value to order items details
So, as in this linked answer, you will need to create first a product attribute because in your code, wc_add_order_item_meta($item_id, 'The Meta', $the_meta );
is not correct as the second argument has to be a meta_key
slug without uppercase and space characters, so 'The Meta'
is not convenient and not recommended...
此产品属性创建名称将是(关于您的答案代码):'The Meta'
和 slug 'the_meta'
.
然后您必须在每个相关产品中设置强制值(任何值,因为该值将被下面的自定义值替换)。
所以一旦完成,您的代码将是:
add_action('woocommerce_add_order_item_meta','adding_custom_data_in_order_items_meta', 10, 3 );
function adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
if ( isset($values['meta1']) && isset($values['meta2']) ) {
$custom_value = $values['meta1'] . '.' . $values['meta2'];
wc_add_order_item_meta($item_id, 'pa_the-meta', $custom_value );
}
}
然后您将在您的订单项目中获得这种显示('XXXX' 是您的自定义值):
The Meta: XXXX
创建属性 "The Meta" 并将其添加到产品后。
我用以下内容回答了我的问题:
首先:通过woocommerce_add_cart_item_data
过滤器挂钩添加元数据。这将首先将元添加到购物车中的项目。
function add_cart_item_data( $cart_item_data, $product_id ) {
$cart_item_data[ "meta1" ] = $_POST["meta1"];
$cart_item_data[ "meta2"] = $_POST["meta2"];
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 2 );
第二:将添加到购物车的元数据保存到订单中实际购买的商品中
function adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
if ( isset($values['meta1']) && isset($values['meta2']) ) {
$the_meta = $values['meta1'] . '.' . $values['meta2'];
wc_add_order_item_meta($item_id, 'pa-the-meta', $the_meta );
}
}
add_action('woocommerce_add_order_item_meta','adding_custom_data_in_order_items_meta', 10, 3 );
是否可以在订单内的产品上添加元数据?
在这种情况下,将有一个元数据,但每个产品(在订单中)将具有不同的值。 示例:
Order 1:
* Product 1
Sample Meta: Meta1
* Product 2
Sample Meta: Meta2
谢谢。
更新 1 :
我现在不知道如何从 woocommerce_add_cart_item_data
过滤器中获取值。我能够从那里成功添加元数据。
我需要获取这些值以便在这个 woocommerce_add_order_item_meta
操作挂钩中使用。
这就是我将元数据成功添加到过滤器的方式:
function add_cart_item_data( $cart_item_data, $product_id ) {
$cart_item_data[ "meta1" ] = $_POST["meta1"];
$cart_item_data[ "meta2" ] = $_POST["meta2"];
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 99, 2 );
是的,这可以使用挂接到 woocommerce_add_order_item_meta
操作挂钩中的自定义函数实现。
add_action('woocommerce_add_order_item_meta','adding_custom_data_in_order_items_meta', 1, 1 );
function adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
// The corresponding Product Id for the item:
$product_id = $values[ 'product_id' ];
$custom_meta_value = $values['my_custom_field1_key'];
// or $custom_meta_value = $_POST['my_custom_field_key'];
// or $custom_meta_value = get_post_meta( $values[ 'product_id' ], '_some_meta_key', true );
if ( !empty($custom_meta_value) )
wc_add_order_item_meta($item_id, 'custom_meta_key', $custom_meta_value, true);
// And so on …
}
But as your question is not detailed and you are not showing any code related to how this custom data is set in your products or passed to the cart object, is not possible to help more that that.
与您的答案相关的更新: (请参阅链接答案中的实际示例):
Adding user custom field value to order items details
So, as in this linked answer, you will need to create first a product attribute because in your code,
wc_add_order_item_meta($item_id, 'The Meta', $the_meta );
is not correct as the second argument has to be ameta_key
slug without uppercase and space characters, so'The Meta'
is not convenient and not recommended...
此产品属性创建名称将是(关于您的答案代码):'The Meta'
和 slug 'the_meta'
.
然后您必须在每个相关产品中设置强制值(任何值,因为该值将被下面的自定义值替换)。
所以一旦完成,您的代码将是:
add_action('woocommerce_add_order_item_meta','adding_custom_data_in_order_items_meta', 10, 3 );
function adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
if ( isset($values['meta1']) && isset($values['meta2']) ) {
$custom_value = $values['meta1'] . '.' . $values['meta2'];
wc_add_order_item_meta($item_id, 'pa_the-meta', $custom_value );
}
}
然后您将在您的订单项目中获得这种显示('XXXX' 是您的自定义值):
The Meta: XXXX
创建属性 "The Meta" 并将其添加到产品后。
我用以下内容回答了我的问题:
首先:通过woocommerce_add_cart_item_data
过滤器挂钩添加元数据。这将首先将元添加到购物车中的项目。
function add_cart_item_data( $cart_item_data, $product_id ) {
$cart_item_data[ "meta1" ] = $_POST["meta1"];
$cart_item_data[ "meta2"] = $_POST["meta2"];
return $cart_item_data;
}
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 2 );
第二:将添加到购物车的元数据保存到订单中实际购买的商品中
function adding_custom_data_in_order_items_meta( $item_id, $values, $cart_item_key ) {
if ( isset($values['meta1']) && isset($values['meta2']) ) {
$the_meta = $values['meta1'] . '.' . $values['meta2'];
wc_add_order_item_meta($item_id, 'pa-the-meta', $the_meta );
}
}
add_action('woocommerce_add_order_item_meta','adding_custom_data_in_order_items_meta', 10, 3 );