Get Custom Options In Order Via Api Magento 2

Today I will show you how to get the value of product custom option from cart and order in Magento 2. You can do this through a few steps.

 

Step 1:

In my case, the option name is "Extra Fees".

Create di.xml under /app/code/Magepow/Custom/etc/

 

File: /app/code/Magepow/Custom/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Sales\Model\Order" type="Magepow\Custom\Model\Order"/> <preference for="Magento\Sales\Model\Order\Item" type="Magepow\Custom\Model\Order\Item"/>
</config>

Step 2:

Create Order.php under /app/code/Magepow/Custom/Model/

 

File: /app/code/Magepow/Custom/Model/Order.php

<?php/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */namespace Magepow\Custom\Model;class Order extends \Magento\Sales\Model\Order{ public $extrafee = 'Extra Fees'; /** * Get Items * * @return \Magento\Sales\Api\Data\OrderItemInterface[] */ public function getItems() { $data = parent::getItems(); $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $model = $objectManager->get('\Magento\Catalog\Model\Product'); $priceHelper = $objectManager->create('Magento\Framework\Pricing\Helper\Data'); foreach ($data as $item) { $options = $item->getProductOption(); if(!$options) continue; $attributes = $options->getExtensionAttributes(); $customOptions = $attributes->getCustomOptions(); if(!is_array($customOptions)) continue; $productId = $item->getProductId(); $product = $model->load($productId); if(!$product) continue; $item->setSku($product->getSku()); foreach ($customOptions as $key => $value) { $productOptions = $product->getOptions(); foreach($productOptions as $_opt) { if($_opt->getTitle() != $this->extrafee) continue; $value_str = ''; foreach ( $_opt->getValues() as $opt) { $value_str .= $opt->getData('title') . ': ' . $priceHelper->currency($opt->getData('price'), true, false) . ','; } } $value->setOptionValue(rtrim($value_str,',')); } } return $data; }}

Get it in items:

Create Item.php under /app/code/Magepow/Custom/Model/Order/

 

File: /app/code/Magepow/Custom/Model/Order/Item.php

<?php/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */namespace Magepow\Custom\Model\Order;use Magento\Framework\Api\AttributeValueFactory;use Magento\Sales\Api\Data\OrderItemInterface;use Magento\Sales\Model\AbstractModel;class Item extends \Magento\Sales\Model\Order\Item{ public $extrafee = 'Extra Fees'; public function getProductOption() { $options = parent::getProductOption(); $product = $this->getProduct(); if(!$product) return $options; $this->setSku($product->getSku()); if(!$options) return $options; $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $priceHelper = $objectManager->create('Magento\Framework\Pricing\Helper\Data'); $attributes = $options->getExtensionAttributes(); $customOptions = $attributes->getCustomOptions(); if(!is_array($customOptions)) return $options; foreach ($customOptions as $key => $value) { $productOptions = $product->getOptions(); foreach($productOptions as $_opt) { if($_opt->getTitle() != $this->extrafee) continue; $value_str = ''; foreach ( $_opt->getValues() as $opt) { $value_str .= $opt->getData('title') . ': ' . $priceHelper->currency($opt->getData('price'), true, false) . ','; } } $value->setOptionValue(rtrim($value_str,',')); } return $options; }}

Step 3:

Now refresh Magento cache

php bin/magento cache:flush

 

Done. Hope this post helps you in some way.