Замените диапазон переменной цены выбранной ценой изменения в WooCommerce 3
На WooCommerce я хотел бы изменить макет страницы с отдельным продуктом. Потому что, когда у вас есть переменный продукт, вы получаете эту ярость проводной цены (ниже названия продукта) на странице Variable Product, и она также отображается на странице магазина.
Для меня стандартный способ - показать самую низкую цену товара в магазине, а также страницу товара и изменить эту цену в соответствии с выбором переменных пользователем. Я не могу поверить, почему.
Я могу удалить диапазон цен и показать самую низкую цену, используя этот фрагмент кода.
https://businessbloomer.com/disable-variable-product-price-range-woocommerce/
Но опять же, эта самая низкая цена не меняется в зависимости от выбранных переменных. В переменной структуре продукта снова есть две цены. Это мой текущий переменный макет страницы продукта
http://www.preorders.lk/product/beats-solo3-wireless-on-ear-headphones/
Итак, кто-нибудь может помочь удалить диапазон цен со страницы с переменным продуктом и показать только одну самую низкую цену (под названием продукта) продукта по умолчанию. Таким образом, цена должна меняться в зависимости от переменных, которые имеют этот продукт. И эта самая низкая цена должна быть показана на странице магазина.
Надеюсь, это понятно. Пожалуйста, дайте мне знать, если что-то неясно. Пожалуйста, обратитесь к приложенному изображению для более подробной информации.
Благодарю.
2 ответа
Новое улучшенное обновление в следующей теме (июнь 2018 года):
Заменить ценовой диапазон для обработки отклонения по умолчанию отображаемой цены в Woocommerce 3
Обновление (декабрь 2017 г.): чтобы избежать, Проблемы с не переменными продуктами в некоторых темах и ошибка доступности повторения в некоторых темах
Примечание. Некоторые плагины, такие как German Market или некоторые темы , не будут работать с этим кодом, так как они вносят свои собственные изменения в хуки или в структуру html.
Это вполне возможно.
- Сначала мы удалим нежелательную цену.
- Вместо этого мы выводим переменную цену без ценового диапазона и показываем самую низкую цену.
- Мы делаем копию этой переменной цены в скрытом контейнере (который будет использоваться / считываться нашим скриптом jQuery)
- Затем мы скрываем контейнеры выбранной цены изменения (и наличие на складе)
- С помощью нашего
jQuery
сценарий, когда мы получаем выбранную цену изменения, мы заменяем переменную цену (и отображаем наличие на складе). - Если клиент изменяет вариант, мы обновляем цену... Если цена варианта не отображается в процессе этого изменения, отображается наша переменная цена.
Вот этот код:
add_action( 'woocommerce_before_single_product', 'move_variations_single_price', 1 );
function move_variations_single_price(){
global $product, $post;
if ( $product->is_type( 'variable' ) ) {
// removing the variations price for variable products
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
// Change location and inserting back the variations price
add_action( 'woocommerce_single_product_summary', 'replace_variation_single_price', 10 );
}
}
function replace_variation_single_price(){
global $product;
// Main Price
$prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
$price = $prices[0] !== $prices[1] ? sprintf( __( 'From: %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( __( 'From: %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() ){
if($('p.availability'))
$('p.availability').remove();
$('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>';
}
Код поступает в любой php-файл вашей активной дочерней темы (или темы), а также в любой php-файл плагина.
Этот код протестирован и работает на WooCommerce 3.2.x(также должен работать на WooCommerce 2.6.x)
Вы можете по желанию переместить CSS(
<style></style>
) кstyles.css
файл вашей активной дочерней темы (или активной темы), а затем удалите его из этой функции…
Связанные с:
Поздно к вечеринке, но я искал более динамичное / универсальное решение и меньше кода, поэтому я скорректировал ответ на следующее.
Цена обновляется на основе триггеров вариативной формы, поэтому стиль и исходный HTML сохраняются.
add_action( 'woocommerce_before_single_product', 'move_variations_single_price', 1 );
function move_variations_single_price(){
global $product, $post;
if ( $product->is_type( 'variable' ) ) {
add_action( 'woocommerce_single_product_summary', 'replace_variation_single_price', 10 );
}
}
function replace_variation_single_price() {
?>
<style>
.woocommerce-variation-price {
display: none;
}
</style>
<script>
jQuery(document).ready(function($) {
var priceselector = '.product p.price';
var originalprice = $(priceselector).html();
$( document ).on('show_variation', function() {
$(priceselector).html($('.single_variation .woocommerce-variation-price').html());
});
$( document ).on('hide_variation', function() {
$(priceselector).html(originalprice);
});
});
</script>
<?php
}
Успешно протестирован с v4.0.1. Пока темы / плагины не изменяют разметку, все должно работать. Если нет, вы можете легко изменитьpriceselector
соответственно.
Я знаю, что я воскрешаю здесь старый поток, но кое-что, что я обнаружил при использовании этого кода, это то, что вы должны знать, что с этим кодом вы рискуете помешать отображению единой, не переменной цены на некоторые темы как:
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_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( __( 'From: %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( __( 'From: %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;
}
}
}
}