How To

How to switch Product SKU according to the selection of child products in Magento 2

While buying a pair of shoes, you have to select several options before making a purchase like a shoe size, color or some other options too. It’s not a typical shoppable thing where you just add the product to cart and make payment because of its configurable product. Over time, these configurable products are becoming popular because it allows customers to select the variant they love to buy.

Magento allows the store owner to create and sell such type of products using backend options. But creating such configurable product required setting up several options such as size, color, model, make, etc. Because Magento treats this configurable product as a set of simple products. Each variation of the product has its own SKU and inventory system.

On the frontend, whenever a user picks a convenient option from the configurable product, product options and price will be changed accordingly but not product SKU in default Magento store environment. To get the child product SKU from the configurable product, here is another blog to switch product SKU according to the selection of child products in Magento 2.

To do the same, first we need to create “di.xml” file in following path using below code.

app\code\Vendor\Extension\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">
    
    <type name="Magento\ConfigurableProduct\Block\Product\View\Type\Configurable">
        <plugin  name="Vendor_Extension_Plugin_ConfigurableProduct_Block_Product_View_Type_Configurable" sortOrder="10" type="Vendor\Extension\Plugin\ConfigurableProduct\Block\Product\View\Type\Configurable"/>
    </type>
 
    <type name="Magento\Swatches\Block\Product\Renderer\Configurable">
        <plugin  name="Vendor_Extension_ConfigurableSkuSwitch_Plugin_Magento_Swatches_Block_Product_Renderer_Configurable" sortOrder="10" type="Vendor\Extension\Plugin\Swatches\Block\Product\Renderer\Configurable"/>
    </type>
</config>

Now, we have to create “Configurable.php” file at following path using below code.

app\code\Vendor\Extension\Plugin\ConfigurableProduct\Block\Product\View\Type\Configurable.php

<?php 
namespace Vendor\Extension\Plugin\ConfigurableProduct\Block\Product\View\Type; 

class Configurable 
{ 
 public function afterGetJsonConfig( 
  \Magento\ConfigurableProduct\Block\Product\View\Type\Configurable $subject, $result 
 ) { 
  $jsonResult = json_decode($result, true); 
  $jsonResult['skus'] = []; 
  foreach ($subject->getAllowProducts() as $simpleProduct) {
              $jsonResult['skus'][$simpleProduct->getId()] = $simpleProduct->getSku();
  }
      $result = json_encode($jsonResult);
         return $result;
 }
}

Now, we have to create Configurable.php file at following path using below code.

app\code\Vendor\Extension\Plugin\Swatches\Block\Product\Renderer\Configurable.php

<?php 
namespace Vendor\Extension\Plugin\Swatches\Block\Product\Renderer; 
class Configurable 
{ 
 public function afterGetJsonConfig(
  \Magento\Swatches\Block\Product\Renderer\Configurable $subject, $result
 ) { 
  $jsonResult = json_decode($result, true); 
  $jsonResult['skus'] = []; 
  foreach ($subject->getAllowProducts() as $simpleProduct) {
             $jsonResult['skus'][$simpleProduct->getId()] = $simpleProduct->getSku();
         }
         $result = json_encode($jsonResult);
         return $result;
 }
}

In this code, we have defined “skuswitch.js” and “swatch-skuswitch.js” which we are required and we create in later step.

var config = {
    config: {
        mixins: {
            'Magento_ConfigurableProduct/js/configurable': {
                'Vendor_Extension/js/model/skuswitch': true
            },
            'Magento_Swatches/js/swatch-renderer': {
                'Vendor_Extension/js/model/swatch-skuswitch': true
            }
        }
 }
};

In this last step, we have to “skuswitch.js” using below code at this path.

app\code\Vendor\Extension\view\frontend\web\js\model\skuswitch.js

    define([
    'jquery',
    'mage/utils/wrapper'
], function ($, wrapper) {
 'use strict';
 
    return function(targetModule){
 
        var reloadPrice = targetModule.prototype._reloadPrice;
        var reloadPriceWrapper = wrapper.wrap(reloadPrice, function(original){
        var result = original();
        var simpleSku = this.options.spConfig.skus[this.simpleProduct];
 
            if(simpleSku != '') {
                $('div.product-info-main .sku .value').html(simpleSku);
            }
            return result;
        });
        targetModule.prototype._reloadPrice = reloadPriceWrapper;
        return targetModule;
 };
});

Now, we need to create remaining “swatch-skuswitch.js” file at below location.

app\code\Vendor\Extension\view\frontend\web\js\model\swatch-skuswitch.js

define([
    'jquery',
    'mage/utils/wrapper'
], function ($, wrapper) {
 'use strict';
 
    return function(targetModule){
        var updatePrice = targetModule.prototype._UpdatePrice;
        targetModule.prototype.configurableSku = $('div.product-info-main .sku .value').html();
        var updatePriceWrapper = wrapper.wrap(updatePrice, function(original){
            var allSelected = true;
            for(var i = 0; i<this.options.jsonConfig.attributes.length;i++){
                if (!$('div.product-info-main .product-options-wrapper .swatch-attribute.' + this.options.jsonConfig.attributes[i].code).attr('option-selected')){
                 allSelected = false;
                }
            }
            var simpleSku = this.configurableSku;
            if (allSelected){
                var products = this._CalcProducts();
                simpleSku = this.options.jsonConfig.skus[products.slice().shift()];
            }
            $('div.product-info-main .sku .value').html(simpleSku);
              return original();
        });
 
        targetModule.prototype._UpdatePrice = updatePriceWrapper;
        return targetModule;
 };
});

And that’s it! Now product SKU will be changed dynamically based on the customer selection. Also, You can use this code according to your need for changing Product SKU.
If you need any help regarding this code, simply leave a comment below and don’t forget to smash that stars if you found this blog helpful.
Happy Coding!

Click to rate this post!
[Total: 69 Average: 4.1]
Dhiren Vasoya

Dhiren Vasoya is a Director and Co-founder at MageComp, Passionate ?️ Certified Magento Developer?‍?. He has more than 9 years of experience in Magento Development and completed 850+ projects to solve the most important E-commerce challenges. He is fond❤️ of coding and if he is not busy developing then you can find him at the cricket ground, hitting boundaries.?

View Comments

  • Hi,

    I don;t understand where you place the bellow code:
    var config = {
    config: {
    mixins: {
    'Magento_ConfigurableProduct/js/configurable': {
    'Vendor_Extension/js/model/skuswitch': true
    },
    'Magento_Swatches/js/swatch-renderer': {
    'Vendor_Extension/js/model/swatch-skuswitch': true
    }
    }
    }
    };
    Thanks in advance

    Kostas

    • You need to create that file into following location
      app\code\Vendor\Extension\view\frontend\requirejs-config.js

  • Is this article still correct? The formatting doesn't look right. Especially the "app\code\Vendor\Extension\etc\di.xml" code.

    • Hyva theme have different structured compared to normal Magento theme. So if you have to implement this into Hyva, you need to do further customisation according to Hyva structure. For more information, you can contact on support@magecomp.com

  • Trying to use this for color swatch swapping but not seeing the SKU change. I did have to delete the di.xml file to get setup:upgrade to run as 2.3.7 was not happy with a blank file. Any suggestions?

  • Hello
    I have to hide magento default price and show my custom price and i am using this module for configurable product, for dropdown it working Properly but for swatches it is not working, may be due to update price function because i have hided price, so is there any other solution?? Or any other function which i use for swatches please help me

    • You have to identify the proper function which also works for Swatches and then need to do customization there as well.

  • I had been tried to chang sku number in existing product, saved it, then I tried to replace the older sku again in the same product it is not working, how to replace the old sku

Recent Posts

Improving Error Handling and Transition Management in Remix with useRouteError and useViewTransitionState

In modern web development, seamless navigation and state management are crucial for delivering a smooth…

6 days ago

Magento Open Source 2.4.8-Beta Release Notes

Magento Open Source 2.4.8 beta version released on October  8, 2024. The latest release of…

1 week ago

How to Create Catalog Price Rule in Magento 2 Programmatically?

Hello Magento Friends, Creating catalog price rules programmatically in Magento 2 can be a valuable…

1 week ago

Top 10 Tips to Hire Shopify Developers

As the world of eCommerce continues to thrive, Shopify has become one of the most…

2 weeks ago

Managing Browser Events and Navigation in Shopify Remix: useBeforeUnload, useHref, and useLocation Hooks

Shopify Remix is an innovative framework that provides a streamlined experience for building fast, dynamic,…

2 weeks ago

Ultimate Guide to Hiring a Top Shopify Development Agency

Building a successful eCommerce store requires expertise, and for many businesses, Shopify has become the…

2 weeks ago