takeback
Ответы в темах
-
Форум: WooCommerce
Тема: Не меняется цена вариативного товара@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? Скрыта вариация которой нет в наличии?
На стороне админа есть вариант глянуть скрин раздела вариации?
если я отключу плагин 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 где я могу написать ответ, когда задается вопрос третьим лицом (не автором)? Я не нашел личных сообщений здесь. Мне стоит подождать, пока человек создаст отдельную тему? Создать свою с заголовком «для Коли из темы ниже?» Каков алгоритм взаимодействия в рамках данного ресурса?
Код пытаюсь исправить, совместить Ваши два
вот он как раз у меня и зачеркивает цену несколько раз. Второй работает без проблем:
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; } } } }