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

Php 将新订单项目添加到现有订单时出错,php,woocommerce,Php,Woocommerce,使用此处显示的代码时,我只希望创建一个名为“滞纳金”的新订单项目。然而,当我运行代码时,2个新的相同订单项目记录被添加到订单中。我不知道为什么会发生这种情况,也不知道为什么。你能帮忙吗 我在代码末尾添加了一个echo,以便在代码运行时显示order\u item\u id。由于创建了2条记录,我希望echo生成2行输出,每个新记录ID都显示出来。然而,在运行代码时,只回显了一行,它显示了第二条记录的id。没有回显第一个记录id // set variables for code simplifi

使用此处显示的代码时,我只希望创建一个名为“滞纳金”的新订单项目。然而,当我运行代码时,2个新的相同订单项目记录被添加到订单中。我不知道为什么会发生这种情况,也不知道为什么。你能帮忙吗

我在代码末尾添加了一个echo,以便在代码运行时显示order\u item\u id。由于创建了2条记录,我希望echo生成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
//设置用于代码简化的变量
$product_id='1579';//滞纳金产品
$product_name='滞纳金';
$price=5;
$quantity=1;
$total=$price*$quantity;
$order_id='1550';
//添加链接到产品的订单项
$order\u item\u id=wc\u add\u order\u item($order\u id,数组)(
“订单\项目\名称”=>$product\名称,
'订单项目类型'=>'行项目',//表示产品
));
wc_添加订单项目元($order_item_id,''u qty',$quantity,true);//量
wc_add_order_item_meta($order_item_id,''u product_id',$product_id,true);//产品的ID
//添加“\u变体\u id”元
wc_添加_订单_项目_元($order_item_id,''u line_subtotal',$price,true);//每件商品的价格
wc_add_order_item_meta($order_item_id,''u line_total',$total,true);//总价
//重新计算订单总数
$order=新WC\U订单($order\U id);
$order->计算_总计();
回显“完成:”$订单\项目\标识。'
';//用于调试的回显订单\u项目\u id
以下是显示2条记录的“wp_商业_订单_项目”表查询结果。“echo”命令的输出仅显示“568”。所以我不知道这两条记录是如何或为什么被创建的

订单\项目\标识订单\项目\名称订单\项目\类型订单\标识

568滞纳金第1550项
567滞纳金行_item1550

您的代码看起来不错,但不确定您在哪里运行了代码(它是哪个钩子?),还尝试根据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;
}

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

谢谢你的密码。我试过了,也得到了同样的结果。您建议的代码确实有效,因此我们非常感谢您的建议。不幸的是,到目前为止,我找不到任何逻辑来解释为什么要创建两次记录。好的,您在哪里运行了这段代码?在哪种情况下(hook)调用函数?请用完整的逻辑编辑你的问题,如果可能的话附上截图?我没有使用钩子。这是一个例行程序,将作为预定事件每晚运行,为过期订单增加滞纳金。因此没有钩子,甚至没有截图。很抱歉该项目允许客户通过支票/现金/银行转账付款,因此付款不一定在订购时支付。谢谢。解决了我的问题。事实上,每次我在WP中保存代码时,代码都会运行并创建记录。然后我会运行我的代码,认为这是第一次,因此认为代码正在创建DUP。我通过检查是否已经存在“滞纳金”记录来解决问题,如果已经存在,则跳过代码。我希望这对其他人有帮助。