Magento 2 – Delete Order Item After Successfully Saving Order

itemsmagento2onepage-checkoutordersquoteitem

I want to delete the order item from observer I created like this:

namespace Namespace\Module\Observer;

use Magento\Framework\Event\ObserverInterface;

class AfterOrder implements ObserverInterface
{

    protected $_objectManager;

    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager
    ) {
        $this->_objectManager = $objectManager;
    }


    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        //not sure if it's correct
        $order = $observer->getEvent()->getOrder();  
        foreach($order->getAllItems() as $item){ 
          if(condition){
             //delete order item, how?
          }
        }
    }
}

events.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
   <event name="checkout_onepage_controller_success_action">
       <observer name="module_controller_success_action" instance="Namespace\Module\Observer\AfterOrder"  />
   </event>
</config>

Best Answer

Please try the below code and keep in the observer

<?php
       namespace Namespace\Module\Observer;
       use Magento\Framework\Event\ObserverInterface;
       use Magento\Framework\App\RequestInterface;
       use Magento\Sales\Api\OrderRepositoryInterface;
       use Magento\Customer\Model\Session;
class AfterOrder implements ObserverInterface
{ 

    protected $orderRepository;
    protected $datetime;
    protected $_session;

    public function __construct(  
    OrderRepositoryInterface $OrderRepositoryInterface,
    \Magento\Framework\Stdlib\DateTime\DateTime $datetime,
    \Magento\Customer\Model\Session $session
    ) {
        $this->orderRepository = $OrderRepositoryInterface;
        $this->datetime = $datetime;
        $this->_session = $session;

    }

    public function execute(\Magento\Framework\Event\Observer $observer) 
    {

           //Custom log:
           $writer = new \Zend\Log\Writer\Stream(BP.'/var/log/TradeorderSuccess.log');
           $logger = new \Zend\Log\Logger();
           $logger->addWriter($writer);            

           $order_ids = $observer->getEvent()->getOrderIds()[0];
           $order = $this->orderRepository->get($order_ids);           
           $order_id = $order->getIncrementId();               

          foreach ($order->getAllVisibleItems() as $item)
          {
                //Here keep ur condition.
                $logger->info("xxxxxxxxxxxxxxxxxx===>".$item->getName());
                $item->isDeleted(true);
                $logger->info("deleted");
          } 

          $order->save();
          $logger->info("saved");
    }


}