1      
      
        Answers
      
    What is the correct way to delete line items?
I have some line item fields on orders that reference line items that don't exist anymore. I reported this in #2124225.
rszrama pointed me in the direction of looking for instances where line items were deleted without calling commerce_line_item_delete_references(). Sure enough I found this in one of my custom modules:
<?php
// Remove the discount
$discount_amount = $line_item_wrapper->free_upgrade->commerce_price->amount->value() * $quantity * -1;
foreach($order_wrapper->commerce_line_items as $item_wrapper){
  if($item_wrapper->commerce_unit_price->amount->value() == $discount_amount){
    // Good chance this is the discount line item
    commerce_line_item_delete($item_wrapper->line_item_id->value());
    break;
  }
}
// Remove the free upgrade
foreach($order_wrapper->commerce_line_items as $item_wrapper){
  if($item_wrapper->commerce_product->product_id->value() == $line_item_wrapper->free_upgrade->product_id->value()){
    // This is the free upgrade
    commerce_line_item_delete($item_wrapper->line_item_id->value());
    break;
  }
}
?>From rszrama's comment on my previous issue, I understand that the correct way to do this would be something more like:
<?php
// Remove the discount
$discount_amount = $line_item_wrapper->free_upgrade->commerce_price->amount->value() * $quantity * -1;
foreach($order_wrapper->commerce_line_items as $item_wrapper){
  if($item_wrapper->commerce_unit_price->amount->value() == $discount_amount){
    // Good chance this is the discount line item
    commerce_line_item_delete_references($item_wrapper->value());
    commerce_line_item_delete($item_wrapper->line_item_id->value());
    break;
  }
}
// Remove the free upgrade
foreach($order_wrapper->commerce_line_items as $item_wrapper){
  if($item_wrapper->commerce_product->product_id->value() == $line_item_wrapper->free_upgrade->product_id->value()){
    // This is the free upgrade
    commerce_line_item_delete_references($item_wrapper->value());
    commerce_line_item_delete($item_wrapper->line_item_id->value());
    break;
  }
}
?>But I am unable to find documentation to confirm that.
Can anyone tell me if this is right? Would a $item_wrapper->delete(); accomplish both deleting the line item and the references to it?
Thanks!
