Ответы в темах

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • @d7fox7vr Я уже говорил, что код не мой, потому как я ближе к 0 в программировании. По этому я не могу однозначно определить проблему. К тому же я не обновлялся, по этому не могу потестить у себя. Видно что консоль ругается…
    «Uncaught TypeError: «<p class=»availability»>».html is not a function»

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

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

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

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

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

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

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

    @d7fox7vr

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

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

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

    @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)

    @d7fox7vr Добавьте товар в корзину (одну штучку). Потом обновите страницу. У меня становится 2, потом 3 и т.д. при каждом обновлении страницы.

    @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: после добавления товара в корзину, при обновлении страницы кол-во товаров увеличивается. Так и было?

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

    //Показываем одинаковую стоимость вариативных товаров
    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 не утруждает себя выводом одинаковой стоимости вариаций. Он просто показывает основной прайс. А так как предыдущий код эту цену прячет, и меняет ценой вариации, получается что цена исчезает. Данный фикс решает проблему.

    Второй это уже эксперименты Ваши) Ставьте вот этот

    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-браслета и давайте посмотрим что там не так

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

    @d7fox7vr

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

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

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

    @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] );

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

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

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

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

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

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

    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;
    }
    
            }
        }
    }
Просмотр 15 ответов — с 1 по 15 (всего 15)