Reordering allows customers to place a new order based on their previous order with the same items, details, and payment/shipping information.
This helps shoppers to avoid going through the entire order placement process from scratch.
In this blog, learn to programmatically reorder in Magento 2, especially if you offer a subscription-based pricing model.
Steps to Programmatically Reorder in Magento 2
Firstly, to get reorder details, you will need to load the information of the previous order. Then, create a new quote and quickly get the previous order value.
Create a custom script or helper class at Vendor/Module/Helper and use the below code:
<?php
namespace Vendor\Module\Helper;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Sales\Model\OrderFactory;
use Magento\Quote\Model\QuoteFactory;
use Magento\Quote\Model\QuoteManagement;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Customer\Model\CustomerFactory;
use Magento\Store\Model\StoreManagerInterface;
class Reorder extends AbstractHelper
{
protected $orderFactory;
protected $quoteFactory;
protected $quoteManagement;
protected $cartRepository;
protected $customerFactory;
protected $storeManager;
public function __construct(
OrderFactory $orderFactory,
QuoteFactory $quoteFactory,
QuoteManagement $quoteManagement,
CartRepositoryInterface $cartRepository,
CustomerFactory $customerFactory,
StoreManagerInterface $storeManager
) {
$this->orderFactory = $orderFactory;
$this->quoteFactory = $quoteFactory;
$this->quoteManagement = $quoteManagement;
$this->cartRepository = $cartRepository;
$this->customerFactory = $customerFactory;
$this->storeManager = $storeManager;
}
public function reorder($orderId)
{
// Load the original order
$order = $this->orderFactory->create()->load($orderId);
if (!$order->getId()) {
throw new \Magento\Framework\Exception\LocalizedException(__('Order not found.'));
}
// Create a new quote
$quote = $this->quoteFactory->create();
$quote->setStoreId($this->storeManager->getStore()->getId());
// Assign customer to the quote
$customer = $this->customerFactory->create()->load($order->getCustomerId());
$quote->assignCustomer($customer);
// Add order items to the new quote
foreach ($order->getAllVisibleItems() as $item) {
$quote->addProduct($item->getProduct(), (int) $item->getQtyOrdered());
}
// Set billing and shipping addresses
$quote->getBillingAddress()->addData($order->getBillingAddress()->getData());
$quote->getShippingAddress()->addData($order->getShippingAddress()->getData());
// Set shipping and payment methods
$quote->getShippingAddress()->setCollectShippingRates(true)->collectShippingRates()
->setShippingMethod($order->getShippingMethod());
$quote->setPaymentMethod($order->getPayment()->getMethod());
$quote->setInventoryProcessed(false);
// Collect totals and save quote
$quote->collectTotals();
$this->cartRepository->save($quote);
// Convert quote to order
$order = $this->quoteManagement->submit($quote);
return $order;
}
}
Then, call the reorder function with the order ID in the frontend controller as per your use case:
$order = $this->reorderHelper->reorder(100);
That’s it. You have created an order programmatically in Magento 2. Try this solution and allow your shoppers to create a new order instantly.