Magento 2: Get Product’s Custom Option Value from Cart & Order

This article shows how to get custom option values of products/items added to cart or products of any order in Magento 2.

I will simply be using ObjectManager for this example.

Get custom options of products present in shopping cart


$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$cart = $objectManager->get('\Magento\Checkout\Model\Cart'); 

// get cart items
$items = $cart->getItems();

// get custom options value of cart items
foreach ($items as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());
    $customOptions = $options['options'];
    if (!empty($customOptions)) {
        foreach ($customOptions as $option) {
            $optionTitle = $option['label'];
            $optionId = $option['option_id'];
            $optionType = $option['type'];
            $optionValue = $option['value'];
        }
    }
}

Get custom options of products present any order


$orderObject = $objectManager->get('\Magento\Sales\Model\Order'); 

// load by order id
$orderId = 1; // YOUR ORDER ID
$order = $orderObject->load($orderId);

// load by order increment id
// $incrementId = '000000001'; // YOUR ORDER INCREMENT ID
// $order = $orderObject->loadByIncrementId($incrementId);

$items = $order->getAllVisibleItems(); // get all items aren't marked as deleted and that do not have parent item; for e.g. here associated simple products of a configurable products are not fetched

// Order items can also be fetched with the following functions
// $items = $order->getAllItems(); // get all items that are not marked as deleted
// $items = $order->getItems(); // get all items

foreach ($items as $item) {
    $options = $item->getProductOptions();		
    if (isset($options['options']) && !empty($options['options'])) {		
        foreach ($options['options'] as $option) {
            echo 'Title: ' . $option['label'] . '<br />';
            echo 'ID: ' . $option['option_id'] . '<br />';
            echo 'Type: ' . $option['option_type'] . '<br />';
            echo 'Value: ' . $option['option_value'] . '<br />' . '<br />';
        }
    }
}

It is always recommended to use the above code with dependency injection in your custom module instead of directly using Object Manager. Here is how you can do it:

Below is a block class of my custom module (Chapagain_HelloWorld). I have injected object of \Magento\Sales\Model\Order in the constructor of my module’s block class.

app/code/Chapagain/HelloWorld/Block/HelloWorld.php


<?php
namespace Chapagain\HelloWorld\Block;
class HelloWorld extends \Magento\Framework\View\Element\Template
{
    protected $_orderModel;	
	
    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Sales\Model\Order $orderModel,
        array $data = []
        )
        {		
            $this->_orderModel = $orderModel;
            parent::__construct($context, $data);
        }
	
        public function getOrderItems($orderId) 
        {
            $order = $this->_orderModel->load($orderId);
            return $order->getAllVisibleItems();		
        }
}
?>

Now, we use can the function in our template (.phtml) file.


$orderId = 1; // YOUR ORDER ID
$items = $block->getOrderItems($orderId);

foreach ($items as $item) {
    $options = $item->getProductOptions();		
    if (isset($options['options']) && !empty($options['options'])) {		
        foreach ($options['options'] as $option) {
            echo 'Title: ' . $option['label'] . '<br />';
            echo 'ID: ' . $option['option_id'] . '<br />';
            echo 'Type: ' . $option['option_type'] . '<br />';
            echo 'Value: ' . $option['option_value'] . '<br />' . '<br />';
        }
    }
}

Hope this helps. Thanks.