To make it work also for variable products and their variations, it requires Javascript (jQuery) to get the selected variation SKU for variable products.
Try the following that works for simple an variable product types, displaying the selected variation SKU for variable products:
add_shortcode( 'product_sku_div', 'wc_product_sku_div');
function wc_product_sku_div() {
global $product;
if( ! is_a('WC_Product', $product) ) {
$product = wc_get_product( get_the_id() );
}
## 1 - For variable products (and their variations)
if( $product->is_type('variable') ) {
ob_start(); // Starting buffering
?>
<div class="widget" sp-sku=""></div>
<script type="text/javascript">
jQuery( function($){
$('form.variations_form').on('show_variation', function( event, data ){
$( 'div.widget' ).attr( 'sp-sku', data.sku );
// For testing
console.log( 'Variation Id: ' + data.variation_id + ' | Sku: ' + data.sku );
});
$('form.variations_form').on('hide_variation', function(){
$( 'div.widget' ).attr( 'sp-sku', '' );
});
});
</script><?php
return ob_get_clean(); // return the buffered content
}
## 2 - For other products types
else {
return sprintf( '<div class="widget" sp-sku="%s"></div>', $product->get_sku() );
}
}
Code goes in functions.php file of your active child theme (or active theme). Tested and work.