Поддержка WooCommerce Не меняется цена вариативного товара

  • На днях обновился вукомерц. После обновления перестало корректно меняться стоимость вариативного товара (заметил это после обновления). Точнее она меняется, но только после выбора вариации и нажатия на пустом месте экрана. Раньше менялась сразу при выборе вариации без нажатия по любому месту экрана. Подскажите в чем проблема и как решить данную проблему!? Данная проблема со всеми товарами.

    • Тема изменена 6 месяцев, 2 недели назад пользователем Ed777.

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 9 ответов — с 1 по 9 (всего 9)
  • Видимо, что что-то изменилось в шаблонах (тег или класс) и теперь скрипт, совместимый с предыдущей версией, не отрабатывают так, как задумывалось.

    @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 );
    
    //Показываем одинаковую стоимость вариативных товаров
    add_filter('woocommerce_available_variation', function ($value, $object = null, $variation = null) {
        if ($value['price_html'] == '') {
            $value['price_html'] = '<span class="price">' . $variation->get_price_html() . '</span>';
        }
        return $value;
    }, 10, 3);
    
    // 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.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">'.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 Я уже говорил, что код не мой, потому как я ближе к 0 в программировании. По этому я не могу однозначно определить проблему. К тому же я не обновлялся, по этому не могу потестить у себя. Видно что консоль ругается…
    «Uncaught TypeError: «<p class=»availability»>».html is not a function»

    попробуйте заменить эту часть кода
    .append('<p class="availability">'.html()+'</p>');

    на вот это
    .append('<p class="availability">'+'</p>');

    Я не уверен что это что-то решит, но как минимум станет ясно что дело не в этой ошибке.

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

    Не помогло. Но спасибо!

    Костыльком попробуйте:

    
    <script>
    
        jQuery(document).ready(function($) {
            
            $('select').change( function(){
            // console.log($( 'input.variation_id' ));
            window.setTimeout( change_price , 1000 );
              function change_price(){
                if( '' != $('input.variation_id').val() ){
                    $('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+'</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>
    

    @dallynx подскажите что значит попробовать Костыльком.) Не понимаю Вас(

    В том коде, который Вы опубликовали замените скрипт на тот, что предложил я. Это плохое решение. Работать если и будет, то с задержкой, поэтому «костыль».

    Вариант вместо вашего кода pastebin. Работает на storefront на других темах не знаю.

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

    Костылек действительно работает, но очень тормозит.
    Может быть кто-то уже нашел вариант нового кода для последней версии Woocommerce?
    Мне нужна только одна функция — смена цены при выборе вариации, чтобы выводилась цена выбранной вариации вместо диапазона.

Просмотр 9 ответов — с 1 по 9 (всего 9)