Модератор
Юрій
(@yube)
Видимо, что что-то изменилось в шаблонах (тег или класс) и теперь скрипт, совместимый с предыдущей версией, не отрабатывают так, как задумывалось.
@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 );
//Показываем одинаковую стоимость вариативных товаров
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 Я уже говорил, что код не мой, потому как я ближе к 0 в программировании. По этому я не могу однозначно определить проблему. К тому же я не обновлялся, по этому не могу потестить у себя. Видно что консоль ругается…
«Uncaught TypeError: «<p class=»availability»>».html is not a function»
попробуйте заменить эту часть кода
.append('<p class="availability">'.html()+'</p>');
на вот это
.append('<p class="availability">'+'</p>');
Я не уверен что это что-то решит, но как минимум станет ясно что дело не в этой ошибке.
-
Ответ изменён 5 лет, 5 месяцев назад пользователем
takeback.
Костыльком попробуйте:
<script>
jQuery(document).ready(function($) {
$('select').change( function(){
// console.log($( 'input.variation_id' ));
window.setTimeout( change_price , 1000 );
function change_price(){
if( '' != $('input.variation_id').val() ){
$('p.price').html($('div.woocommerce-variation-price > span.price').html()).append('<p class="availability">'+'</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>
@dallynx подскажите что значит попробовать Костыльком.) Не понимаю Вас(
В том коде, который Вы опубликовали замените скрипт на тот, что предложил я. Это плохое решение. Работать если и будет, то с задержкой, поэтому «костыль».
Вариант вместо вашего кода pastebin. Работает на storefront на других темах не знаю.
-
Ответ изменён 5 лет, 5 месяцев назад пользователем
dallynx.
Костылек действительно работает, но очень тормозит.
Может быть кто-то уже нашел вариант нового кода для последней версии Woocommerce?
Мне нужна только одна функция — смена цены при выборе вариации, чтобы выводилась цена выбранной вариации вместо диапазона.