提问人:Dave Lovely 提问时间:6/7/2019 最后编辑:LoicTheAztecDave Lovely 更新时间:6/7/2019 访问量:2492
在 woocommerce_checkout_create_order_line_item 钩子上获取产品数据
Get product data on woocommerce_checkout_create_order_line_item hook
问:
我正在尝试在wp_woocommerce_order_itemmeta表中创建自定义元数据。但是要创建要存储为元数据的数据,我需要知道在 Woocommerce 钩子woocommerce_checkout_create_order_line_item创建的订单项的product_id。
我已经成功地创建了一个带有会话变量值的元记录,但是当我尝试获取订单项的product_id时,我的代码失败了。我将不胜感激对此的解决方案。
因此,以下代码的工作原理是在表中创建一个meta_key为“_raw_location_id”wp_woocommerce_order_itemmeta记录
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是什么。
- add_action('woocommerce_checkout_create_order_line_item', 'raw_order_item_meta', 20, 2);
函数 raw_order_item_meta( $order ) {
$items = $order->get_items();
- foreach ( $items as $item_id => $item ) {
$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 );
}
- }
答:
您以错误的方式使用woocommerce_checkout_create_order_line_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 ) {
$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 文件中。它应该有效。
相关:
- 在 WooCommerce 3 中获取订单商品和WC_Order_Item_Product
- Woocommerce:替换已弃用的“woocommerce_add_order_item_meta”的钩子
评论