2
votes

For my Woocommerce variable products I'm implementing a custom size chooser on the single product page and have this sizes in a table:

enter image description here

These variations are just: 30B 30C 30D rather than being split in to: 30 and B C D

What I am trying to figure out is: How to grab the shipping class for each product variations?

I have something similar on cart page but I don't know what is the variation ID or how to get it from the single product page:

$product_id = ( 0 != $cart_item['variation_id'] ) ? $cart_item['variation_id'] : $cart_item['product_id'];
// need the variation id for the above to be able to do the rest:

$product_shipping_classes = get_the_terms( $product_id, 'product_shipping_class' );
$product_shipping_class_name = ( $product_shipping_classes && ! is_wp_error( $product_shipping_classes ) ) ? current( $product_shipping_classes )->name : '';

I know how to do it once I have the variation ID. I just can't figure out how to get it in order to do the rest. The only things that I need to get for it, are the product id and the slug for the variations (there is also a color attribute on this page).

However I have given to the product a default variation to use (so the hidden variation_id is set).

Perhaps that needs to be fetched first to know the id of the selected color to then fetch the variation ids for the others?

1
So on the basket/cart page, you are trying to get the variation ID, and then get the shipping class for each variable product in the cart, is that correct?Michael Doye
Hi @Und3rTow, got that working on the basket page, trying to show the shipping class for each variant on the actual single product page where you add items to the basket.martincarlin87

1 Answers

9
votes

In WooCommerce product single pages for variable products, you can't get the selected product variation in PHP as it's a live event (client side, not server side).

The way to do it is using JavaScript/jQuery to get it. As you don't provide any related code for this single product page regarding your variable products, is not possible for me to give you a real working code that will completely match your needs.

Get the selected variation ID on single product page for variable product (In this example I display the selected variation ID dynamically below add to cart button):

add_action( 'woocommerce_single_product_summary', 'single_product_variable_customization', 3, 0 );
function single_product_variable_customization() {
    global $product;

    // Only for variable products on single product pages
    if ( $product->is_type('variable') && is_product() ) {

    ##  ==>  ==>  Here goes your php code (if needed)  ==>  ==>  ##

    // Passing a variable to javascript
    $string1 = "The selected Variation ID is: ";
    $string2 = "No Variation ID is selected ";
    ?>
    <script>
    jQuery(document).ready(function($) {

        // Initializing
        var myText1 = '<?php echo $string1; ?>', myText2 = '<?php echo $string2; ?>';

        // Get and display the default variation ID after add-to-cart button (initialization)
        if( '' != $('input.variation_id').val() )
            $('div.woocommerce-variation-add-to-cart').after('<div class="selected-variation-id">'+myText1+$('input.variation_id').val()+'</div>');
        else
            $('div.woocommerce-variation-add-to-cart').after('<div class="selected-variation-id">'+myText2+'</div>'); // No ID selected

        console.log($('input.variation_id').val()); // Output in the browser console


        // Get and display the chosen variation ID after add-to-cart button
        $('select').blur( function(){
            if( '' != $('input.variation_id').val() )
                $('div.selected-variation-id').html(myText1+$('input.variation_id').val());
            else
                $('div.selected-variation-id').html(myText2); // No ID selected

            console.log($('input.variation_id').val()); // Output in the browser console
        });
    });
    </script>
    <?php
    }
}

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.

This code is tested under WooCommerce 3+ and works.

So on this base you can make your own function to match your requirements (as you don't give anymore necessary details or code).

Some related answers examples usage (with jQuery and Woocommerce single product pages):