在 woocommerce_checkout_create_order_line_item 钩子上获取产品数据

Get product data on woocommerce_checkout_create_order_line_item hook

提问人:Dave Lovely 提问时间:6/7/2019 最后编辑:LoicTheAztecDave Lovely 更新时间:6/7/2019 访问量:2492

问:

我正在尝试在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是什么。

  1. add_action('woocommerce_checkout_create_order_line_item', 'raw_order_item_meta', 20, 2);
  2. 函数 raw_order_item_meta( $order ) {

  3. $items = $order->get_items();

  4. foreach ( $items as $item_id => $item ) {
  5. $product_id = $item->get_variation_id() ?$item->get_variation_id() : $item->get_product_id();

  6. $order->update_meta_data( '_raw_location_id', $_SESSION['location_id'] );

  7. $order->update_meta_data( '_raw_wc_product', $product_id );

  8. }

  9. }
PHP 的WordPress 结帐 钩子-WooCommerce

评论


答:

2赞 LoicTheAztec 6/7/2019 #1

您以错误的方式使用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 文件中。它应该有效。

相关:

评论

0赞 Dave Lovely 6/8/2019
Loic非常感谢!我的后续问题是,我怎样才能学会使用这些钩子。我如何知道在任何给定点有哪些变量可用以及这些变量是什么。例如,我以前没有见过$cart_item_key,所以我怎么知道呢?我看到$order参数是WC_Order对象的实例,但是我怎么知道wc_order对象中包含哪些变量?如果我不知道,我就无法从中获取数据。我已经看了一千个帖子,但仍然找不到一个好的教程。无论如何,我非常感谢您的回复。谢谢!