{"id":458,"date":"2019-06-11T11:57:15","date_gmt":"2019-06-11T11:57:15","guid":{"rendered":"https:\/\/meetanshi.com\/blog\/2019\/06\/11\/add-additional-options-in-magento-2\/"},"modified":"2025-05-22T16:35:25","modified_gmt":"2025-05-22T11:05:25","slug":"add-additional-options-in-magento-2","status":"publish","type":"post","link":"https:\/\/meetanshi.com\/blog\/add-additional-options-in-magento-2\/","title":{"rendered":"How to Add Additional Options in Magento 2"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Magento 2 is a feature-rich platform that helps improve the shopping experience. However, many times it lacks in fulfilling the business requirements now that various types of business have its online presence. Luckily, the developers can offer customization to implement out of box functionalities.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As a part of such customization, you may want to&nbsp;<em><strong>add additional options in Magento 2<\/strong><\/em>&nbsp;product page, cart page, etc. For example, you want to display a text box to allow customers to add comment box in the product page or to show installments selected by the customers on the cart page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, it is important that you implement the customizations without affecting the core functionalities as it is not a good practice. The below method allows to&nbsp;<em><strong>add additional options in Magento 2<\/strong><\/em>&nbsp;considering it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Steps to Add Additional Options in Magento 2:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">1. Create&nbsp;<strong>events.xml<\/strong>&nbsp;at&nbsp;<em><strong><em><strong>app\\code\\Vendor\\Extension\\etc\\<\/strong><\/em><\/strong><\/em><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\"?>\n&lt;config xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n        xsi:noNamespaceSchemaLocation=\"urn:magento:framework:Event\/etc\/events.xsd\">\n    &lt;event name=\"checkout_cart_product_add_after\">\n        &lt;observer name=\"extension_checkout_cart_product_add_after\" instance=\"Vendor\\Extension\\Observer\\CheckoutCartAddObserver\" \/>\n    &lt;\/event>\n     &lt;event name=\"sales_model_service_quote_submit_before\">\n        &lt;observer name=\"extesnionadd\" instance=\"Vendor\\Extension\\Observer\\AddOptionToOrderObserver\" \/>\n    &lt;\/event>\n&lt;\/config><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">2. Create&nbsp;<strong>CheckoutCartAddObserver.php<\/strong>&nbsp; at&nbsp;<em><strong><em><strong>app\\code\\Vendor\\Extension\\Observer\\<\/strong><\/em><\/strong><\/em><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">namespace Vendor\\Extension\\Observer;\n\nuse Magento\\Framework\\Event\\Observer as EventObserver;\nuse Magento\\Framework\\Event\\ObserverInterface;\nuse Magento\\Store\\Model\\StoreManagerInterface;\nuse Magento\\Framework\\View\\LayoutInterface;\nuse Magento\\Framework\\App\\RequestInterface;\nuse Magento\\Framework\\Serialize\\SerializerInterface;\n\nclass CheckoutCartAddObserver implements ObserverInterface\n{\n    protected $layout;\n    protected $storeManager;\n    protected $request;\n    private $serializer;\n\n    public function __construct(\n        StoreManagerInterface $storeManager,\n        LayoutInterface $layout,\n        RequestInterface $request,\n        SerializerInterface $serializer\n    )\n    {\n        $this->layout = $layout;\n        $this->storeManager = $storeManager;\n        $this->request = $request;\n        $this->serializer = $serializer;\n    }\n\n    public function execute(EventObserver $observer)\n    {\n\n        $item = $observer->getQuoteItem();\n        $post = $this->request->getPost();\n\n\n        $additionalOptions = array();\n        if ($additionalOption = $item->getOptionByCode('additional_options')) {\n            $additionalOptions = $this->serializer->unserialize($additionalOption->getValue());\n        }\n\n        $additionalOptions[] = [\n            'label' => 'Size',\n            'value' => 'XL'\n        ];\n\n        if (count($additionalOptions) > 0) {\n            $item->addOption(array(\n                'product_id' => $item->getProductId(),\n                'code' => 'additional_options',\n                'value' => $this->serializer->serialize($additionalOptions)\n            ));\n        }\n\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3. Create&nbsp;<strong>AddOptionToOrderObserver.php<\/strong>&nbsp; at&nbsp;<em><strong><em><strong>app\\code\\Vendor\\Extension\\Observer\\<\/strong><\/em><\/strong><\/em><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace Vendor\\Extension\\Observer;\n\nuse Magento\\Framework\\Event\\ObserverInterface;\nuse Magento\\Framework\\Serialize\\SerializerInterface;\n\nclass AddOptionToOrderObserver implements ObserverInterface\n{\n    private $serializer;\n\n    public function __construct(\n        SerializerInterface $serializer\n    )\n    {\n        $this->serializer = $serializer;\n    }\n\n    public function execute(\\Magento\\Framework\\Event\\Observer $observer)\n    {\n            $quote = $observer->getQuote();\n            $order = $observer->getOrder();\n            foreach ($quote->getAllVisibleItems() as $quoteItem) {\n                $quoteItems[$quoteItem->getId()] = $quoteItem;\n            }\n\n            foreach ($order->getAllVisibleItems() as $orderItem) {\n                $quoteItemId = $orderItem->getQuoteItemId();\n                $quoteItem = $quoteItems[$quoteItemId];\n                $additionalOptions = $quoteItem->getOptionByCode('additional_options');\n                if (count($additionalOptions) > 0) {\n                    $options = $orderItem->getProductOptions();\n                    $options['additional_options'] = $this->serializer->unserialize($additionalOptions->getValue());\n                    $orderItem->setProductOptions($options);\n                }\n\n            return $this;\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s it. Adding options in Magento 2 was never this easy, isn\u2019t it? Likewise you can also improve the user experience by adding <a href=\"https:\/\/meetanshi.com\/blog\/how-to-add-sticky-add-to-cart-to-magento-2\/\">sticky add to cart button<\/a> in your Magento store.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The below image shows how I implemented this method to show the number of installments:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/meetanshi.com\/blog\/wp-content\/uploads\/2019\/06\/Implementation-1024x576.png\" alt=\"Example of additional options added in the cart\" class=\"wp-image-5735\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For a similar solution in Magento, check <a href=\"https:\/\/meetanshi.com\/blog\/add-additional-options-in-magento\/\" target=\"_blank\" rel=\"noreferrer noopener\">add additonal options in Magento<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank You.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Magento 2 is a feature-rich platform that helps improve the shopping experience. However, many times it lacks in fulfilling the business requirements now that various&#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[34],"tags":[],"class_list":["post-458","post","type-post","status-publish","format-standard","hentry","category-magento"],"acf":[],"_links":{"self":[{"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/posts\/458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/comments?post=458"}],"version-history":[{"count":4,"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions"}],"predecessor-version":[{"id":15386,"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions\/15386"}],"wp:attachment":[{"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/media?parent=458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/categories?post=458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/meetanshi.com\/blog\/wp-json\/wp\/v2\/tags?post=458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}