1

I use "Display price on add to cart button from the functions.php file in Woocommerce" answer code, that add price inside simple product.

But I want to improve this function and dynamically display chosen variation price inside button. With this code on variation product page it display only the lowest price. Is there any solution?

How add to cart button looks now (no options chosen): How add to cart button looks now(no options chosen)

How I want to be displayed: How I want to be displayed

LoicTheAztec
  • 229,944
  • 23
  • 356
  • 399
Артем
  • 109
  • 2
  • 13
  • 1
    This much more complicated and can only be done with additional Javascript / jQuery code as it's based on a an event on client side (but not on server side). See as an example: [Get selected variation price in jQuery on Woocommerce Variable products](https://stackoverflow.com/a/54928852/3730754) and [those related answers](https://stackoverflow.com/search?q=user%3A3730754+%5Bjquery%5D+variation-product-price) – LoicTheAztec Apr 24 '20 at 15:40
  • Thanks! You saved my project =) – Артем Apr 24 '20 at 19:39

1 Answers1

3

Maybe it will be useful for somebody! Result. Add to cart button of variable product

add_filter( 'woocommerce_product_add_to_cart_text', 'custom_add_to_cart_price', 20, 2 ); // Shop and other archives pages
add_filter( 'woocommerce_product_single_add_to_cart_text', 'custom_add_to_cart_price', 20, 2 ); // Single product pages
function custom_add_to_cart_price( $button_text, $product ) {
    // Variable products
    if( $product->is_type('variable') ) {
        // shop and archives
        if( ! is_product() ){

            $product_price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_variation_price() ) ) );
            return $button_text . ' - From ' . strip_tags( $product_price );
        } 
        // Single product pages
        else {
            $variations_data =[]; // Initializing

        // Loop through variations data
        foreach($product->get_available_variations() as $variation ) {
            // Set for each variation ID the corresponding price in the data array (to be used in jQuery)
            $variations_data[$variation['variation_id']] = $variation['display_price'];
        }
        ?>
        <script>
        jQuery(function($) {
            var jsonData = <?php echo json_encode($variations_data); ?>,
                inputVID = 'input.variation_id';

            $('input').change( function(){
                if( '' != $(inputVID).val() ) {
                    var vid      = $(inputVID).val(), // VARIATION ID
                       vprice   = ''; // Initilizing

                    // Loop through variation IDs / Prices pairs
                    $.each( jsonData, function( index, price ) {
                        if( index == $(inputVID).val() ) {
                            vprice = Math.round(price); // The right variation price
                        }
                    });
                    // Change price dynamically when changing options
                    $( "button.single_add_to_cart_button.button.alt span" ).remove();
                    $(".single_add_to_cart_button").append("<span>" + " " + vprice + " ₴" + "</span>");
                }
            });
        });
        </script><?php
            return $button_text;
        }
    } 
    // All other product types
    else {
        $product_price = wc_price( wc_get_price_to_display( $product ) );
        return $button_text . '  ' . strip_tags( $product_price );
    }
}
Артем
  • 109
  • 2
  • 13