在woocommerce_checkout_create_order_line_item挂钩上获取产品数据

时间:2019-06-07 05:17:40

标签: php wordpress woocommerce checkout hook-woocommerce

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

  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. }

1 个答案:

答案 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文件中。应该可以。

相关: