Soporte » Plugins y Hacks » WooCommerce » Productos variables, ver precio de la variacion

  • Necesito hacer una modificacion. Tengo productos variables. Mediante un Snnipet he logrado cambiar el típico
    desde 125€ a 500€ por Desde 125€, pero no acaba de agradarme. Quiero que cuando elija una variación del producto, el precio cambien. Tratare de explicarlo mediante este montaje

    ¿Sabéis como puedo hacer esto mediante un snnipet?

    La web es: https://www.maqhosteleria.es/comprar/mesa-mural-acero-inox-copia/

    • Este debate fue modificado hace 5 meses, 3 semanas por  Alvaromasa.
    • Este debate fue modificado hace 5 meses, 3 semanas por  Alvaromasa.
Viendo 2 respuestas - 1 de 2 (de 2 total)
  • Moderador Fernando Tellado

    (@fernandot)

    ¿Has probado esta función?

    // Función para obtener el precio de la variación por defecto (si existe)
    function get_default_variation( $product ){
        $attributes_count = count($product->get_variation_attributes());
        $default_attributes = $product->get_default_attributes();
        // Si no hay variación por defecto salimos
        if( $attributes_count != count($default_attributes) )
            return false;
    
        // Loop por las variaciones disponibles
        foreach( $product->get_available_variations() as $variation ){
            $found = true;
            // Loop por los atributos de las variaciones
            foreach( $variation['attributes'] as $key => $value ){
                $taxonomy = str_replace( 'attribute_', '', $key );
                // Busqueda de una variación por defecto
                if( isset($default_attributes[$taxonomy]) && $default_attributes[$taxonomy] != $value ){
                    $found = false;
                    break;
                }
            }
            // Si tenemos variación por defecto
            if( $found ) {
                $default_variaton = $variation;
                break;
            }
            // Si no, continuamos
            else {
                continue;
            }
        }
        return isset($default_variaton) ? $default_variaton : false;
    }
    
    add_action( 'woocommerce_before_single_product', 'move_variations_single_price', 1 );
    function move_variations_single_price(){
        global $product, $post;
    
        if ( $product->is_type( 'variable' ) ) {
            // quitando el precio de las variaciones en productos variables
            remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    
            // Cambiamos la ubicación y volvemos a insertar los precios de las variaciones
            add_action( 'woocommerce_single_product_summary', 'replace_variation_single_price', 10 );
        }
    }
    
    function replace_variation_single_price(){
        global $product;
    
        // Precio principal
        $prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
        $active_price = $prices[0] !== $prices[1] ? sprintf( __( 'Desde: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    
        // Precio rebajado
        $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
        sort( $prices );
        $regular_price = $prices[0] !== $prices[1] ? sprintf( __( 'Desde: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    
        if ( $active_price !== $regular_price && $product->is_on_sale() ) {
            $price = '<del>' . $regular_price . $product->get_price_suffix() . '</del> <ins>' . $active_price . $product->get_price_suffix() . '</ins>';
        } else {
            $price = $regular_price;
        }
    
        // Cuando hay variación por defecto
        if( get_default_variation( $product ) ) {
            $default_variaton = get_default_variation( $product );
            if( ! empty($default_variaton['price_html']) ){
                $price_html = $default_variaton['price_html'];
            } else {
                if ( ! $product->is_on_sale() )
                    $price_html = $price = wc_price($default_variaton['display_price']);
                else
                    $price_html = $price;
            }
            $availiability = $default_variaton['availability_html'];
        } else {
            $price_html = $price;
            $availiability = '';
        }
        // Estilos ?>
        <style>
            div.woocommerce-variation-price,
            div.woocommerce-variation-availability,
            div.hidden-variable-price {
                height: 0px !important;
                overflow:hidden;
                position:relative;
                line-height: 0px !important;
                font-size: 0% !important;
            }
        </style>
        <?php // Jquery ?>
        <script>
        jQuery(document).ready(function($) {
            var a = 'div.wc-availability', p = 'p.price';
    
            $('select').blur( function(){
                if( '' != $('input.variation_id').val() ){
                    if($(a).html() != '' ) $(a).html('');
                    $(p).html($('div.woocommerce-variation-price > span.price').html());
                    $(a).html($('div.woocommerce-variation-availability').html());
                } else {
                    if($(a).html() != '' ) $(a).html('');
                    $(p).html($('div.hidden-variable-price').html());
                }
            });
        });
        </script>
        <?php
    
        echo '<p class="price">'.$price_html.'</p>
        <div class="wc-availability">'.$availiability.'</div>
        <div class="hidden-variable-price" >'.$price.'</div>';
    }

    Hola @fernandot
    He visto tu respuesta y es genial se acerca mucho a lo que pide @alvaromasa

    El caso es que a mi me aparece el precio «desde: 129€» y justo debajo «desde 129€ – 145€» ¿Es posible que en vez de aparecer el precio debajo, directamente aparezca el precio final que sea donde ponía «desde:129€?
    Un funcionamiento tipo esto:
    https://www.parachutehome.com/products/linen-double-up-bundle

    Gracias de verdad por toda la ayuda.
    Saludos

Viendo 2 respuestas - 1 de 2 (de 2 total)
  • Debes estar registrado para responder a este tema.