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

    • Тема изменена 4 года, 8 месяцев назад пользователем Ed777.
Просмотр 13 ответов — с 16 по 28 (всего 28)
  • @lukadp
    вас тоже нужно ткнуть носом в п.2 правил форума.?

    @lukadp вы вот этот код вставляли, насколько я понимаю у вас такая же ситуация что и у меня была. Первый код в начеле темы был неправильный, дальше в сообщениях уже готовый рабочий. Должен работать. Кеш почистите.

    @tuxfighter а чего носом ткуть. в чем вопрос @lukadp отличатся от данной темы?

    Дублирую верный код

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

    отличатся от данной темы?

    всем.
    Еще раз дать ссылку для ознакомления и просветления?

    @tuxfighter в данном случаи вы зосаряете тему. Вы учасник форума или модератор? Насколько я вижу учасник как и я! У человека такая же самая проблема была как и у меня. У него Код не работает! Он обратился в тему в которой это обсуждают и пытаются решить данную проблему. Если вы прочитаете тему с начала вы поймёте! А не увидев фразу, возможно не туда пишу, делать какие то выводы.

    @tuxfighter в данном случаи вы зосаряете тему.

    Вы хотите об этом поговорить? Создайте отдельную тему пожалуйста.

    Модератор Yui

    (@fierevere)

    永子

    @d7fox7vr , если вам указали на правила форума, будьте добры их прочесть и уважать.

    У человека такая же самая проблема была как и у меня

    Общая проблема совершенно не означает общего решения.

    @tuxfighter нет не хочу. Я хочу что бы вы не спамили и НЕ засоряли тему своими неуместными комментариями, догадками и мнениями!!!!!!!!!!!!!

    @fierevere для чего открывать еще одну тему с для решения одного и того же вопроса?

    Модератор Yui

    (@fierevere)

    永子

    Хотя бы потому, что вопросы могут быть в результате разными.
    У нас на форуме так принято, что один человек, заводит свою тему с одним своим вопросом, остальные участники участвуют в обсуждении поставленного автором темы вопроса, вопросы от них возможны только наводящие, а уж никак не решение их собственных возможно похожих, а часто даже и не похожих проблем, по сути захламляя тему и лишая автора темы решения его/ее вопроса.

    У нас так принято, на всем wordpress.org так принято.

    @fierevere вообще не согласен, коллективный ум намного лучше и при решении любого вопроса в данном случаи одинакового, я считаю что это должно обсуждаться в одной теме. т.к. при решении и поиске любого другого вопроса как показывает практика, приходится перечитывать кучу разных тем с одной и той же проблемой и все это собирать в кучу. Но если у Вас такие правила — ок! Вы модератор, Вам виднее!

    Представляю как злорадствует @tuxfighter . Ну это так к слову.

    Давайте о правилах форума прекратим. Мы здесь не для этого. Спасибо!

    @tuxfighter нет не хочу.

    Тогда может быть не будете нарушать правила этого форума и дальше?

    @fierevere вообще не согласен

    Ни кто вам не запрещает создать собственный форум, со своими правилами, порядками и пиченьками.

    Модератор Yui

    (@fierevere)

    永子

    вообще не согласен

    Правила не обсуждают. Тем более установленные глобально.

    Были конечно пара исключений, связанные с багами свежих выпусков WP, но эти исключения 1) были по выяснению подробностей бага сразу же прекращены. 2) скорее подтверждают правило.

    Давайте о правилах форума прекратим. Мы здесь не для этого. Спасибо!

    поэтому… соблюдаем их )

    приходится перечитывать кучу разных тем с одной и той же проблемой и все это собирать в кучу

    есть ключевые слова, в виде меток темы, в этой теме кстати никаких меток нет, это повод для того чтобы их установить )

    @d7fox7vr получается что цена выводится на отсутствующую вариацию, а так быть не должно. Зачем клиенту цена на то, что купить нельзя. Уберите код, и проверьте, будет ли выводиться цена 57? Если да — значит проблема не в нем. Нужно проверять настройки.

Просмотр 13 ответов — с 16 по 28 (всего 28)
  • Тема «Скрыть диапазон цен для вариативных товаров, оставить цену товара» закрыта для новых ответов.