我在WooCommerce中创建订单后尝试保存自定义元数据。我用woocommerce_new_order_item
钩子尝试了一下,总的来说可以用。但是我需要存储订购产品中的自定义属性。.但是我无法获得它。
我尝试过的事情:
add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas
function add_basic_meta_for_new_quote($item_id, $values, $cart_item_key)
{
$angebotstext = get_post_meta($item_id, 'angebotstext', false);
wc_add_order_item_meta($item_id, 'angebotstext', $angebotstext);
}
或
add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas
function add_basic_meta_for_new_quote($item_id, $values, $cart_item_key)
{
global $product;
$angebotstext = $product->get_attribute( 'pa_angebotstext' );
wc_add_order_item_meta($item_id, 'angebotstext', $angebotstext);
}
该属性保存在此处:
...,并且meta_value
的结果始终为空,NULL或a:0:{}
你有什么主意吗?
-----编辑----
它以这种方式工作:
add_action('woocommerce_new_order_item','add_basic_meta_for_new_quote',10,3); // add extra order metas
function add_basic_meta_for_new_quote($item_id, $item, $order_id )
{
if ($order_id) {
$order = wc_get_order( $order_id );
}
# Iterating through each order items (WC_Order_Item_Product objects in WC 3+)
if ($order) {
foreach ( $order->get_items() as $item_id => $item_values ) {
// Product_id
$product_id = $item_values->get_product_id();
$product = wc_get_product($product_id);
$angebotstext = $product->get_attribute('Angebotstext');
if ( !empty($angebotstext) && $angebotstext != NULL ) {
wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext);
}
}
}
}
但是:这段代码两次将我的自定义属性添加为meta...。为什么呢? ?
答案 0 :(得分:1)
这里的主要问题是订单中是否包含多个产品,因此您将面对同一订单的多个更新的问题。
为避免这种情况或选择以正确的方式进行处理,以下是一些建议:
要使其适用于多种产品:
更改了此部分:
wc_add_order_item_meta($item_id, 'Angebotstext _'.$product_id , $angebotstext);
这将通过在每个meta_key的末尾添加产品ID来为每个产品添加一个新的自定义元,并且meta_value将是该属性的产品唯一值。 因此您将在订单页面上找到此自定义字段:
为防止其多次更新:
if ($order) {
$angebotstext ='';
foreach ( $order->get_items() as $item_id => $item_values ) {
// Product_id
$product_id = $item_values->get_product_id();
$product = wc_get_product($product_id);
$angebotstext = $product->get_attribute('Angebotstext');
$prev_angebotstext = $angebotstext;
if ( !empty($angebotstext) && $angebotstext != NULL && $angebotstext != $prev_angebotstext ) {
wc_add_order_item_meta($item_id, 'Angebotstext' , $angebotstext);
}
}
}
“ $ prev_angebotstext”是上一个项目属性。
if ( !empty($angebotstext) && $angebotstext != NULL && $angebotstext != $prev_angebotstext )
此条件将检查当前产品属性是否等于先前的产品属性,如果是,它将不会再次更新订单。
谢谢!