Replace WooCommerce variable products price range

2020-02-02 02:36发布

问题:

I found the following code (from here) which enables me to show on a variable price product on WooCommerce: 'From: £10' (on a £10 - £50 product). I would like to effectively reverse this and show 'Up to: £50'.

I have tried to tweak the code below, but just can't figure it out:

function custom_variable_price_range( $price_html, $product ) {
    $prefix = sprintf('%s: ', __('From', 'woocommerce') );

    $min_regular_price = $product->get_variation_regular_price( 'min', true );
    $min_sale_price    = $product->get_variation_sale_price( 'min', true );
    $max_price         = $product->get_variation_price( 'max', true );
    $min_price         = $product->get_variation_price( 'min', true );

    $price_html = ( $min_sale_price == $min_regular_price ) ? wc_price( $min_regular_price ) :
    '<del>' . wc_price( $min_regular_price ) . '</del>' . '<ins>' . wc_price( $min_sale_price ) . '</ins>';

    return ( $min_price == $max_price ) ? $price_html : sprintf( '%s%s', $prefix, $price_html );
}
add_filter( 'woocommerce_variable_sale_price_html', 'custom_variable_price_range', 10, 2 );
add_filter( 'woocommerce_variable_price_html', 'custom_variable_price_range', 10, 2 );

This is how I would like it to look:

Any help is appreciated.

回答1:

The following code will give the "max" variable formatted price suffixed with "Up to:" and handling on sale price range:

add_filter( 'woocommerce_variable_sale_price_html', 'custom_variable_price_range', 10, 2 );
add_filter( 'woocommerce_variable_price_html', 'custom_variable_price_range', 10, 2 );
function custom_variable_price_range( $price_html, $product ) {

    $prefix = __('Up to', 'woocommerce');

    $max_regular_price = $product->get_variation_regular_price( 'max', true );
    $max_sale_price    = $product->get_variation_sale_price( 'max', true );
    $max_active_price  = $product->get_variation_price( 'max', true );
    $min_active_price  = $product->get_variation_price( 'min', true );

    $price_html = ( $max_sale_price == $max_regular_price ) ? wc_price( $max_active_price ) :
    '<del>' . wc_price( $max_regular_price ) . '</del> <ins>' . wc_price( $max_sale_price ) . '</ins>';

    return $min_active_price == $max_active_price ? $price_html : sprintf('%s %s', $prefix, $price_html);
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.


If you don't want to handle on sale price range, you will use instead:

add_filter( 'woocommerce_variable_sale_price_html', 'custom_variable_price_range', 10, 2 );
add_filter( 'woocommerce_variable_price_html', 'custom_variable_price_range', 10, 2 );
function custom_variable_price_range( $price_html, $product ) {

    $prefix = __('Up to', 'woocommerce');

    $max_active_price  = $product->get_variation_price( 'max', true );
    $min_active_price  = $product->get_variation_price( 'min', true );

    $price_html = wc_price( $max_active_price );

    return $min_active_price == $max_active_price ? $price_html : sprintf('%s %s', $prefix, $price_html );
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.



回答2:

Add this

    add_filter( 'woocommerce_variable_sale_price_html', 
   'lw_variable_product_price', 10, 2 );
    add_filter( 'woocommerce_variable_price_html', 
    'lw_variable_product_price', 10, 2 );

     function lw_variable_product_price( $v_price, $v_product ) {

    // Product Price
     $prod_prices = array( $v_product->get_variation_price( 'min', true ), 
     $v_product->get_variation_price( 'max', true ) );
    $prod_price = $prod_prices[0]!==$prod_prices[1] ? sprintf(__('Up to: %1$s', 
 'woocommerce'), 
   wc_price( $prod_prices[0] ) ) : wc_price( $prod_prices[0] );

  // Regular Price
  $regular_prices = array( $v_product->get_variation_regular_price( 'min', true ), 
  $v_product->get_variation_regular_price( 'max', true ) );
  sort( $regular_prices );
   $regular_price = $regular_prices[0]!==$regular_prices[1] ? sprintf(__('Up to: 
  %1$s','woocommerce')
  , wc_price( $regular_prices[0] ) ) : wc_price( $regular_prices[0] );

    if ( $prod_price !== $regular_price ) {
   $prod_price = '<del>'.$regular_price.$v_product->get_price_suffix() . '</del> 
    <ins>' . 
    $prod_price . $v_product->get_price_suffix() . '</ins>';
    }
   return $prod_price;
   }