Поддержка WooCommerce Динамическая Цена вариативного товара вместо диапазона

  • Здравствуйте!
    В вариативном товаре выводиться диапазон цен, с помощью этого кода осталась минимальная цена

    add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
    
    function custom_variation_price( $price, $product ) {
     $price = '';
     $price .= woocommerce_price($product->get_price());
     return $price;
    }

    Но, при выборе вариации, цена не меняется, а просто внизу выводиться цена вариации.
    Подскажите, как вместо этой минимальной цены выводить цену вариации?
    Чтобы при выборе вариации цена динамично менялась и была в место той где сейчас минимальная.

    Дело в том, что это путает покупателей, типа плачу 100р выбираю цвет а мне еще 150р плюсует, оно не плюсует но люди думают именно так.

    Я не программист, но оказался крайним в этом вопросе…
    Прошу помощь, заранее благодарю!

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Была такая же задача, но вместо минимальной цены должна была выводится цена вариации, назначенной по умолчанию.

    В Вашем случае должен помочь код:

    add_action( 'woocommerce_before_single_product', 'check_if_variable_first' );
    function check_if_variable_first(){
        if ( is_product() ) {
            global $post;
            $product = wc_get_product( $post->ID );
            if ( $product->is_type( 'variable' ) ) {
                // removing the price of variable products
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    
    // Change location of
    add_action( 'woocommerce_single_product_summary', 'custom_wc_template_single_price', 10 );
    function custom_wc_template_single_price(){
        global $product;
    
    // Variable product only
    if($product->is_type('variable')):
    
        // Main Price
        $prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
        $price = $prices[0] !== $prices[1] ? sprintf( __( 'От: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    
        // Sale Price
        $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
        sort( $prices );
        $saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'От: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    
        if ( $price !== $saleprice && $product->is_on_sale() ) {
            $price = '<del>' . $saleprice . $product->get_price_suffix() . '</del> <ins>' . $price . $product->get_price_suffix() . '</ins>';
        }
    
        ?>
        <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>
        <script>
        jQuery(document).ready(function($) {
            $('select').blur( function(){
                if( '' != $('input.variation_id').val() ){
                    $('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+$('div.woocommerce-variation-availability').html()+'</p>');
                    console.log($('input.variation_id').val());
                } else {
                    $('p.price').html($('div.hidden-variable-price').html());
                    if($('p.availability'))
                        $('p.availability').remove();
                    console.log('NULL');
                }
            });
        });
        </script>
        <?php
    
        echo '<p class="price">'.$price.'</p>
        <div class="hidden-variable-price" >'.$price.'</div>';
    
    endif;
    }
    
            }
        }
    }

    А как сделать $price = $price * 0.9; т.е. у вариативной цены убавить 10%?

    Я не совсем понимаю цель…Проще ведь задать конкретную цену вариации на 10% ниже?

    @takeback, У меня две цены — одна для Москвы, другая для Казахстана.
    Я выставил отображать на странице товара по умолчанию вариант Москва и хотелось бы, чтобы прайс сразу показывал вместо диапазона (теперь уже от — до ) значение для Москвы.

    За ранее благодарю)

    😛

    • Ответ изменён 1 год, 6 месяцев назад пользователем jaaz.
    • Ответ изменён 1 год, 6 месяцев назад пользователем jaaz.
    • Ответ изменён 1 год, 6 месяцев назад пользователем jaaz.

    Помогите!)

    п.2 правил форума.

    @jaaz У меня вот так реализовано. Через functions.php Цена в каталоге выводится на вариацию — назначенную по умолчанию.

    //Убираем диапазон цен в вариативном товаре
    add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
    
        function custom_variation_price( $price, $product ) {
    
            foreach($product->get_available_variations() as $pav){
                $def=true;
                foreach($product->get_variation_default_attributes() as $defkey=>$defval){
                    if($pav['attributes']['attribute_'.$defkey]!=$defval){
                        $def=false;             
                    }   
                }
                if($def){
                    $price = $pav['display_price'];         
                }
            }   
            return woocommerce_price($price);
        }

    @takeback А Вы не знаете как тоже самое реализовать в каталоге товаров? Чтобы была возможность выбор вариации со сменой цены. Заранее спасибо.

    • Ответ изменён 1 год, 5 месяцев назад пользователем malvik.

    @takeback спасибо, очень долго искал. Подскажите при вставке кода пишет слово ОТ, можно как то убрать это ОТ.

    @d7fox7vr у меня измененный код под эти нужды чуть-чуть. Пишу как есть на сегодняшний день. PS: Я выкинул от туда sale price, потому как мне он без надобности, по этому не уверен как оно будет работать с ценой при распродаже.

    add_action( 'woocommerce_before_single_product', 'check_if_variable_first' );
    function check_if_variable_first(){
        if ( is_product() ) {
            global $post;
            $product = wc_get_product( $post->ID );
            if ( $product->is_type( 'variable' ) ) {
                // removing the price of variable products
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    
    // Change location of
    add_action( 'woocommerce_single_product_summary', 'custom_wc_template_single_price', 10 );
    function custom_wc_template_single_price(){
        global $product;
    
    // Variable product only
    if($product->is_type('variable')):
    
        // Main Price
    		foreach($product->get_available_variations() as $pav){
                $def=true;
                foreach($product->get_variation_default_attributes() as $defkey=>$defval){
                    if($pav['attributes']['attribute_'.$defkey]!=$defval){
                        $def=false;             
                    }   
                }
                if($def){
                    $price = $pav['price_html' ] ;
                }  
            }
      
    ?>
    
        <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>
        <script>
        jQuery(document).ready(function($) {
            $('select').blur( function(){
                if( '' != $('input.variation_id').val() ){
                    $('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+$('div.woocommerce-variation-availability').html()+'</p>');
                    console.log($('input.variation_id').val());
                } else {
                    $('p.price').html($('div.hidden-variable-price').html());
                    if($('p.availability'))
                        $('p.availability').remove();
                    console.log('NULL');
                }
            });
        });
        </script>
        <?php
    
        echo '<p class="price">'.$price.'</p>
        <div class="hidden-variable-price" >'.$price.'</div>';
    
    endif;
    }
    
            }
        }
    }

    @d7fox7vr А вообще достаточно просто стереть От: здесь

    $price = $prices[0] !== $prices[1] ? sprintf( __( 'От: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    и здесь

    $saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'От: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );

    Разница между первым вариантом и тем что я предложил сегодня в том, что первый ставит по умолчанию минимальную цену вариации (при открытии карточки товара, пока вариация не выбрана) а сегодняшний ставит цену вариации, указанной по умолчанию

    @takeback мне второй вариант тоже больше походит, но вот с ценами со скидкой не правильно работает, два раза перечеркивает полную стоимость товара. Код пытаюсь исправить, совместить Ваши два, но где то что то не то. Вот код для вставки, можете посмотреть что не так.

    add_action( 'woocommerce_before_single_product', 'check_if_variable_first' );
    function check_if_variable_first(){
        if ( is_product() ) {
            global $post;
            $product = wc_get_product( $post->ID );
            if ( $product->is_type( 'variable' ) ) {
                // removing the price of variable products
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    
    // Change location of
    add_action( 'woocommerce_single_product_summary', 'custom_wc_template_single_price', 10 );
    function custom_wc_template_single_price(){
        global $product;
    
    // Variable product only
    if($product->is_type('variable')):
    
        // Main Price
    		foreach($product->get_available_variations() as $pav){
                $def=true;
                foreach($product->get_variation_default_attributes() as $defkey=>$defval){
                    if($pav['attributes']['attribute_'.$defkey]!=$defval){
                        $def=false;             
                    }   
                }
                if($def){
                    $price = $pav['price_html' ] ;
                }  
            }
      
    // Sale Price
        $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
        sort( $prices );
        $saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'От: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
    
        if ( $price !== $saleprice && $product->is_on_sale() ) {
            $price = '<del>' . $saleprice . $product->get_price_suffix() . '</del> <ins>' . $price . $product->get_price_suffix() . '</ins>';
        }
    
    ?>
    
        <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>
        <script>
        jQuery(document).ready(function($) {
            $('select').blur( function(){
                if( '' != $('input.variation_id').val() ){
                    $('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+$('div.woocommerce-variation-availability').html()+'</p>');
                    console.log($('input.variation_id').val());
                } else {
                    $('p.price').html($('div.hidden-variable-price').html());
                    if($('p.availability'))
                        $('p.availability').remove();
                    console.log('NULL');
                }
            });
        });
        </script>
        <?php
    
        echo '<p class="price">'.$price.'</p>
        <div class="hidden-variable-price" >'.$price.'</div>';
    
    endif;
    }
    
            }
        }
    }

    @takeback и после установки первого варианта, не корректно отображается количество в наличии, после каждого изменения в вариации с новой строки отображается в наличии
    http://prntscr.com/op6up2

    @takeback @d7fox7vr
    Не нужно засорять чужую тему.
    п.2 правил форума.

    @tuxfighter где я могу написать ответ, когда задается вопрос третьим лицом (не автором)? Я не нашел личных сообщений здесь. Мне стоит подождать, пока человек создаст отдельную тему? Создать свою с заголовком «для Коли из темы ниже?» Каков алгоритм взаимодействия в рамках данного ресурса?

    @d7fox7vr

    Код пытаюсь исправить, совместить Ваши два

    вот он как раз у меня и зачеркивает цену несколько раз. Второй работает без проблем:
    https://prom2m.ru/kupit/vyezd-spetsialista/

    хотелось бы глянуть что у Вас не так, когда Вы ставите второй вариант

    @tuxfighter согласен с @takeback, тем более это вопрос этой же темы и этот же код который в самом начале этой темы.

    @takeback открыл новую тему, хотя не понимаю логики форума. Спасибо!

    Новая тема

Просмотр 15 ответов — с 1 по 15 (всего 18)
  • Тема «Динамическая Цена вариативного товара вместо диапазона» закрыта для новых ответов.