Динамическая Цена вариативного товара вместо диапазона
-
Здравствуйте!
В вариативном товаре выводиться диапазон цен, с помощью этого кода осталась минимальная ценаadd_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2); function custom_variation_price( $price, $product ) { $price = ''; $price .= woocommerce_price($product->get_price()); return $price; }
Но, при выборе вариации, цена не меняется, а просто внизу выводиться цена вариации.
Подскажите, как вместо этой минимальной цены выводить цену вариации?
Чтобы при выборе вариации цена динамично менялась и была в место той где сейчас минимальная.Дело в том, что это путает покупателей, типа плачу 100р выбираю цвет а мне еще 150р плюсует, оно не плюсует но люди думают именно так.
Я не программист, но оказался крайним в этом вопросе…
Прошу помощь, заранее благодарю!
-
Была такая же задача, но вместо минимальной цены должна была выводится цена вариации, назначенной по умолчанию.
В Вашем случае должен помочь код:
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; } } } }
А как сделать
$price = $price * 0.9;
т.е. у вариативной цены убавить 10%?Я не совсем понимаю цель…Проще ведь задать конкретную цену вариации на 10% ниже?
@takeback, У меня две цены — одна для Москвы, другая для Казахстана.
Я выставил отображать на странице товара по умолчанию вариант Москва и хотелось бы, чтобы прайс сразу показывал вместо диапазона (теперь уже от — до ) значение для Москвы.За ранее благодарю)
😛
Помогите!)
@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); }
@takeback спасибо, очень долго искал. Подскажите при вставке кода пишет слово ОТ, можно как то убрать это ОТ.
@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; } } } }
@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] );
Разница между первым вариантом и тем что я предложил сегодня в том, что первый ставит по умолчанию минимальную цену вариации (при открытии карточки товара, пока вариация не выбрана) а сегодняшний ставит цену вариации, указанной по умолчанию
@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 ); // 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 @d7fox7vr
Не нужно засорять чужую тему.
п.2 правил форума.@tuxfighter где я могу написать ответ, когда задается вопрос третьим лицом (не автором)? Я не нашел личных сообщений здесь. Мне стоит подождать, пока человек создаст отдельную тему? Создать свою с заголовком «для Коли из темы ниже?» Каков алгоритм взаимодействия в рамках данного ресурса?
Код пытаюсь исправить, совместить Ваши два
вот он как раз у меня и зачеркивает цену несколько раз. Второй работает без проблем:
https://prom2m.ru/kupit/vyezd-spetsialista/хотелось бы глянуть что у Вас не так, когда Вы ставите второй вариант
@tuxfighter согласен с @takeback, тем более это вопрос этой же темы и этот же код который в самом начале этой темы.
@takeback открыл новую тему, хотя не понимаю логики форума. Спасибо!
- Тема «Динамическая Цена вариативного товара вместо диапазона» закрыта для новых ответов.