Поддержка WooCommerce Скрыть диапазон цен для вариативных товаров, оставить цену товара

  • Первый код

    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;
    }
    
            }
        }
    }

    Второй код

    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 мне второй вариант тоже больше походит, но вот с ценами со скидкой не правильно работает, два раза перечеркивает полную стоимость товара. Код пытаюсь исправить, совместить Ваши два, но где то что то не то. Вот код для вставки, можете посмотреть что не так.

    • Тема изменена 2 мес., 1 неделя назад пользователем  Ed777.
Просмотр 15 ответов — с 1 по 15 (всего 28)
  • Второй это уже эксперименты Ваши) Ставьте вот этот

    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;
    }
    
            }
        }
    }

    ставьте скидку на вариацию usb-браслета и давайте посмотрим что там не так

    @takeback проблема в тех товарах которые стоят с управлением склада, цена полностью пропадает и пропадает поле В наличии при установке кода, вместо цены при выборе вариации начинает отображаться количество в наличии.
    http://prntscr.com/opf7u0
    http://prntscr.com/opf7zy
    http://prntscr.com/opf854
    В остальных товарах которые идут без управления складом вроде все работает.

    А если добавить это?

    //Показываем одинаковую стоимость вариативных товаров
    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);

    Дело в том что woocommerce не утруждает себя выводом одинаковой стоимости вариаций. Он просто показывает основной прайс. А так как предыдущий код эту цену прячет, и меняет ценой вариации, получается что цена исчезает. Данный фикс решает проблему.

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

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

    http://prntscr.com/opfj8p
    http://prntscr.com/opfjjc
    http://prntscr.com/opfjqs

    Вот другая страница с отображением В наличии, как было до установки кода, было везде так. http://prntscr.com/opflzt

    @d7fox7vr Первое что пришло на ум — отключить вывод количества рядом с ценой, и оставить её внизу, возле выбора вариации

    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.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;
    }
    
            }
        }
    }

    Можно заморочиться и вывести ее вверху, рядом с ценой, и повесить стиль, но быстро подобрать нужный кусок кода не получается. Попробую позже.

    PS: после добавления товара в корзину, при обновлении страницы кол-во товаров увеличивается. Так и было?

    @takeback пока работает, ошибок не вижу, Вы не добавили показывать одинаковую стоимость вариативного товара, я добавил. Потестю отпишусь. Не совсем понял о том что вы написали в P.S. при добавлении в корзину у меня количество не увеличивается!
    Спасибо Вам огромное!
    Готовый код

    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 Добавьте товар в корзину (одну штучку). Потом обновите страницу. У меня становится 2, потом 3 и т.д. при каждом обновлении страницы.

    @takeback да действительно, я даже не видел. У меня вообще с ней тоже проблема. на странице Просмотра корзины все работает правильно, а вот на странице Оформления заказа не открывается окно ввода промокода и не правильно считает Доставку курьером и Новой почты, если выбрано Курьер на странице Просмотр корзины и перехожу в Оформление, там меняю на Новую почту стоимость не меняется, а должна. Тоже искал решение не нашел, теперь еще и эта ошибка о которой вы написали.

    @d7fox7vr прошу Вас создать новую тему, чтобы не нарушать правила форума))

    Это — от повторного добавления товара в корзину

    add_action('add_to_cart_redirect', 'resolve_dupes_add_to_cart_redirect');
    function resolve_dupes_add_to_cart_redirect($url = false) {
    if(!empty($url)) { return $url; }
    return get_bloginfo('wpurl').add_query_arg(array(), remove_query_arg('add-to-cart'));
    }

    Это — от слова подытог которое бьет по глазам (хотя дело хозяйское)

    add_filter('gettext', 'translate_text');
    add_filter('ngettext', 'translate_text');
    function translate_text($translated) {
    $translated = str_ireplace('Подытог', 'Сумма', $translated);	
    return $translated;
    }

    Касаемо того, что стоимость доставки не пересчитывается — там не срабатывает, судя по всему, метод класса WC_AJAX::update_order_review. Возможно из-за конфликта плагинов. Я бы начал с последовательного их отключения и проверки восстановления чекаута (и первым бы вырубил woocommerce checkout manager)

    @takeback супер спасибо!)))
    Мы обсуждаем то что относиться к этой теме)))

    По коду скрыть стоимость, все таки как то не совсем корректно работает, при первом заходе на страницу с товаром, не та цена отображается. Стоит вариация по умолчанию, а цена отображается другой вариации. После того как клацаешь по вариации, выбираешь другую и потом ту что стоит по умолчанию, отображается правильная.
    http://prntscr.com/opnqv4
    http://prntscr.com/opnr1l
    http://prntscr.com/opnr69

    Остальные два кода супер! Работают!

    Касательно ошибки в корзине, если я отключу плагин woocommerce checkout manager, как я скрою ненужные поля? Я только это решение нашел.

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

    @d7fox7vr

    если я отключу плагин woocommerce checkout manager, как я скрою ненужные поля?

    Saphali WC lite тоже все это умеет, хотя и не вызывает восторга у меня. Сперва нужно понять — что за плагин мешает (и судя по тому что обновление стоимости пошло — Вы нашли причину). Потом попробовать обновить конфликтный плагин, или отключить специфические поля (если они есть) и уже потом пробовать замену.

    По подмене цены позже гляну внимательнее. Не выключайте если не мешает

    @d7fox7vr Брелок ‘Сердце’ – Металлический цена 43-57. Вариация одна — серебряный (43). Как-то можете прояснить — откуда вторая цена 57? Скрыта вариация которой нет в наличии?

    На стороне админа есть вариант глянуть скрин раздела вариации?

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

    Добрый день, возможно, не совсем по теме. Воспользовался вашим кодом, для динамического изменения цены вариативного товара, но при выборе вариации, я получаю две цены в разных местах страницы. Каким образом я могу убрать нижнюю цену? Пытался спрятать, но не получается… https://prnt.sc/oqi64k
    Спасибо

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