В настоящее время я играю с кодом в этом посте
https://stackoverflow.com/a/40120814
Я знаю, что это очень старый код для очень старых WP и Woo. Так что, возможно, сейчас есть лучший способ.
Однако, похоже, он все еще работает, но я хочу сохранить цену From под заголовком до тех пор, пока цена вариации не будет показана после отображения переменных.
У меня есть дополнительный код для выполнения From-price
add_filter('woocommerce_variable_sale_price_html', 'custom_variation_price_format', 10, 2);
add_filter('woocommerce_variable_price_html', 'custom_variation_price_format', 10, 2);
function custom_variation_price_format($price, $product) {
// Get the available variations prices
$variation_prices = $product->get_variation_prices(true);
// Get the minimum price
$min_price = current($variation_prices['price']);
$min_price_html = wc_price($min_price);
// Add "From" before the price
$price = sprintf(__('From: %s', 'woocommerce'), $min_price_html);
return $price;
}
а затем комбинированный код из сообщения, указанного выше.
/** Hide Variable prices */
add_filter( 'woocommerce_variable_sale_price_html', 'bbloomer_variation_price_format', 10, 2 );
add_filter( 'woocommerce_variable_price_html', 'bbloomer_variation_price_format', 10, 2 );
function bbloomer_variation_price_format( $price, $product ) {
if (is_product()) {
return $product->get_price();
} else {
// 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 ) {
$price = '<del>' . $saleprice . '</del> <ins>' . $price . '</ins>';
}
return $price;
}
}
// show variation price
add_filter('woocommerce_show_variation_price', function() {return true;});
//override woocommerce function
function woocommerce_template_single_price() {
global $product;
if ( ! $product->is_type('variable') ) {
woocommerce_get_template( 'single-product/price.php' );
}
}
function shuffle_variable_product_elements(){
if ( is_product() ) {
global $post;
$product = wc_get_product( $post->ID );
if ( $product->is_type( 'variable' ) ) {
remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation', 10 );
add_action( 'woocommerce_before_variations_form', 'woocommerce_single_variation', 20 );
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_title', 5 );
add_action( 'woocommerce_before_variations_form', 'woocommerce_template_single_title', 10 );
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_excerpt', 20 );
add_action( 'woocommerce_before_variations_form', 'woocommerce_template_single_excerpt', 30 );
}
}
}
add_action( 'woocommerce_before_single_product', 'shuffle_variable_product_elements' );
Однако я хочу сохранить цену From там, где она есть, но заменить ее переменной ценой после того, как все варианты были выбраны, надеюсь, мое изображение объясняет это лучше.
Спасибо
Следующий фрагмент кода позволяет это сделать. На моем сайте все работает нормально. Если вам это не помогло, попробуйте изменить классы переменных и вариационных цен.
add_action( 'woocommerce_variable_add_to_cart', 'gs_change_variable_price' );
function gs_change_variable_price() {
global $product;
$price = $product->get_price_html();
wc_enqueue_js( "
$(document).on('found_variation', 'form.cart', function( event, variation ) {
if (variation.price_html) {
$('.summary > p.price').html(variation.price_html);
$('.woocommerce-variation-price').hide();
}
});
$(document).on('hide_variation', 'form.cart', function( event, variation ) {
$('.summary > p.price').html('" . $price . "');
});
" );
}
Во-первых, вам необходимо отображать переменную цену продукта, поэтому не используйте код функции woocommerce_template_single_price()
.
Поскольку вы хотите сохранить отображаемую цену варианта (как на снимке экрана) и заменить переменную цену продукта отображаемой ценой варианта (когда выбраны все атрибуты), используйте следующее:
add_action( 'woocommerce_before_variations_form', 'display_selected_variation_price' );
function display_selected_variation_price() {
wc_enqueue_js( "const priceHTML = $('p.price').html();
$('form.variations_form').on('show_variation', function(event, data){
$('p.price').html(data.price_html);
}).on('hide_variation', function() {
$('p.price').html(priceHTML);
});
" );
}
Если вы хотите заменить переменную цену выбранной ценой варианта (когда выбраны все атрибуты) и скрыть отображаемую цену исходного выбранного варианта, используйте:
add_action( 'woocommerce_before_variations_form', 'display_selected_variation_price' );
function display_selected_variation_price() {
echo '<style>.woocommerce-variation-price{display:none;}</style>';
wc_enqueue_js( "const priceHTML = $('p.price').html();
$('form.variations_form').on('show_variation', function(event, data){
$('p.price').html(data.price_html);
}).on('hide_variation', function() {
$('p.price').html(priceHTML);
});
" );
}
Спасибо, первый сработал для того, что мне было нужно. Мне также удалось сохранить свой код для отображения цены from, а затем удалить его после того, как выбор был сделан.