我正在尝试在wp_woocommerce_order_itemmeta表中创建自定义元数据。但是,要创建要存储为元数据的数据,需要知道在Woocommerce钩子woocommerce_checkout_create_order_line_item上创建的订单商品的product_id。
我已经成功地创建了带有会话变量值的元记录,但是当我尝试获取订单商品的product_id时,我的代码失败了。我将非常感谢对此的解决方案。
因此,以下代码通过在wp_woocommerce_order_itemmeta表中创建带有meta_key为“ _raw_location_id”的记录来工作
add_action('woocommerce_checkout_create_order_line_item', 'raw_order_item_meta', 20, 2);
function raw_order_item_meta( $order ) {
$order->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
}
因此,我随后“增强”了代码以创建另一个记录,但meta_key值为$ product_id。在添加代码时,我认为必要的结帐未完成,因此我永远也不会进入“谢谢”页面。重新显示结帐页面,数据库中没有任何更改。我通过一次添加一行代码来进行了细致的测试。我在下面的代码行中编号,以方便参考。
我发现添加“ 3”行会导致错误。因此,我无法验证第4行和第5行是否正常工作,因此我从另一篇文章中获取了代码,所以我什至不能说我了解第5行的语法,我只是希望它能像宣传的那样工作。我认为我的第一个障碍是第3行。为什么这行不通?我只想知道正在处理的订单商品的product_id。
函数raw_order_item_meta($ order){
$ items = $ order-> get_items();
$ product_id = $ item-> get_variation_id()吗? $ item-> get_variation_id():$ item-> get_product_id();
$ order-> update_meta_data('_raw_location_id',$ _SESSION ['location_id']);
$ order-> update_meta_data('_raw_wc_product',$ product_id);
}
答案 0 :(得分:1)
您使用错误的方式使用woocommerce_checkout_create_order_line_item
,因为代码中的hook arguments错误。正确的代码是:
add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
$item->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
}
如您所见,您不需要遍历订单项(因为$item
是当前订单项),您的第二个代码将是:
add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
$product_id = $item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id();
$item->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
$item->update_meta_data( '_raw_product_id', $product_id );
}
或以另一种方式出现的同一件事:
add_action('woocommerce_checkout_create_order_line_item', 'add_order_item_custom_meta', 10, 4 );
function add_order_item_custom_meta( $item, $cart_item_key, $cart_item, $order ) {
$product = $item->get_product(); // The WC_Product instance Object
$item->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );
$item->update_meta_data( '_raw_product_id', $product->get_id() ); // Set the product ID
}
代码进入活动子主题(或活动主题)的functions.php文件中。应该可以。
相关: