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 1 semana, 2 días por  Alvaromasa.
    • Este debate fue modificado hace 1 semana, 2 días por  Alvaromasa.
Viendo 1 respuesta (de 1 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>';
    }
Viendo 1 respuesta (de 1 total)
  • Debes estar registrado para responder a este tema.