将新订单项添加到现有 Woocommerce 订单时出错

Error adding new order item to an existing Woocommerce order

提问人:Dave Lovely 提问时间:10/16/2019 更新时间:10/16/2019 访问量:319

问:

使用此处显示的代码时,我预计只会创建一个名为“滞纳金”的新订单项。但是,当我运行代码 2 时,新的相同订单项记录被添加到订单中。我不知道为什么会这样,也无法弄清楚为什么。你能帮忙吗?

我在代码末尾添加了一个回显,以在运行代码时显示order_item_id。由于正在创建 2 条记录,我预计回显将产生 2 行输出,并显示每条新记录 ID。但是,在运行代码时,只有一行被回显,它显示了第二条记录的 ID。第一个记录 ID 未回显。

// set variables for code simplification
$product_id = '1579';  // late fee product
$product_name = 'Late Fee';
$price = 5;
$quantity = 1;
$total = $price * $quantity;
$order_id = '1550';

// add an order item linked to a product
$order_item_id = wc_add_order_item( $order_id, array(
    'order_item_name' => $product_name,
    'order_item_type' => 'line_item', // indicates product
));
wc_add_order_item_meta( $order_item_id, '_qty', $quantity, true ); // quantity
wc_add_order_item_meta( $order_item_id, '_product_id', $product_id, true ); // ID of the product
// add "_variation_id" meta
wc_add_order_item_meta( $order_item_id, '_line_subtotal', $price, true ); // price per item
wc_add_order_item_meta( $order_item_id, '_line_total', $total, true ); // total price
// recalcuate order totals 
$order = new WC_Order( $order_id );
$order->calculate_totals();

echo 'Done: ' . $order_item_id . '<br>';  // echo order_item_id for debugging

以下是显示 2 条记录的“wp_woocommerce_order_items”表查询结果。我的“echo”命令的输出仅显示“568”。所以我不知道如何或为什么创建 2 条记录。

order_item_id order_item_name order_item_type order_id

568 滞纳金 line_item 1550 567 滞纳金 line_item 1550

PHP 的WooCommerce

评论


答:

1赞 Vignesh Pichamani 10/16/2019 #1

你的代码看起来不错,但不确定你在哪里运行了代码(它是哪个钩子?),也尝试按照 woocommerce 的最新(从 2.2 版开始)api 函数实现最小的方式将产品设置为现有订单,这是下面的代码

function so_58405406_add_product_to_existing_order($order_id) {
    $order = wc_get_order($order_id);
    $late_fee_product_id = '1579';
    $quantity = 1;
    $order->add_product(get_product($late_fee_product_id), $quantity);
    $order->calculate_totals();
    return $order_id;
}

我已经测试了上面的代码,它似乎工作正常,没有任何问题。希望对你有所帮助!!

评论

0赞 Dave Lovely 10/17/2019
谢谢你的代码。我已经尝试过并得到了相同的结果。您建议的代码确实有效,因此感谢您的建议。不幸的是,到目前为止,我找不到任何逻辑来解释为什么记录被创建两次。
0赞 Vignesh Pichamani 10/17/2019
好了,你在哪里运行了这段代码?在哪种情况下(钩子)调用函数?请用整个逻辑编辑您的问题,如果可能的话,请附上屏幕截图?
0赞 Dave Lovely 10/17/2019
我没有使用钩子。这是一个例行程序,将作为预定事件每晚运行,以向逾期订单添加滞纳金。因此,没有钩子,甚至没有屏幕截图。不好意思。该项目允许客户通过支票/现金/银行转账付款,因此付款不一定在订购时支付。谢谢。
0赞 Dave Lovely 10/18/2019
解决了我的问题。事实上,每次我在 WP 中保存代码时,都会运行代码并创建记录。然后我会运行我的代码,认为这是第一次,因此认为代码正在创建复制品。我通过检查是否已经存在“滞纳金”记录来解决,如果存在,请跳过代码。我希望这对其他人有所帮助。