Mostrar el precio mínimo en productos variables de WooCommerce

Dificultad: Fácil

Este snippet muestra el precio más bajo en un producto de WooCommerce con variaciones de distinto precio. Puedes utilizar este sencillo snippet en php desde el archivo functions.php.

Importante: no modifiques directamente el archivo functions.php del tema que tengas instalado. Genera un tema hijo con alguno de los plugins del repositorio de WordPress y actívalo. Cuando lo tengas, entra en el functions.php del tema hijo. Una alternativa es instalar algún plugin que permite incrustar código sin problema de pérdida en la actualización del tema.


/**
 * Mostrar solo el precio mínimo en productos variables,
 * respetando la oferta de la variación más barata.
 */
add_filter( 'woocommerce_variable_price_html', 'mi_variable_price_min_oferta_misma_variacion', 10, 2 );

function mi_variable_price_min_oferta_misma_variacion( $price_html, $product ) {
    if ( ! $product || ! is_a( $product, 'WC_Product_Variable' ) ) {
        return $price_html;
    }

    $prices = $product->get_variation_prices( true );

    if ( empty( $prices['price'] ) || ! is_array( $prices['price'] ) ) {
        return $price_html;
    }

    /*
     * Nos aseguramos de localizar la variación con menor precio activo
     * sin asumir el orden interno del array.
     */
    $display_prices = $prices['price'];
    asort( $display_prices, SORT_NUMERIC );

    $min_variation_id = array_key_first( $display_prices );

    if ( ! $min_variation_id ) {
        return $price_html;
    }

    $min_price         = isset( $prices['price'][ $min_variation_id ] ) ? (float) $prices['price'][ $min_variation_id ] : null;
    $min_regular_price = isset( $prices['regular_price'][ $min_variation_id ] ) ? (float) $prices['regular_price'][ $min_variation_id ] : null;

    if ( null === $min_price ) {
        return $price_html;
    }

    // Si esa variación concreta está rebajada, mostramos tachado + oferta.
    if ( null !== $min_regular_price && $min_regular_price > $min_price ) {
        return wc_format_sale_price(
            wc_price( $min_regular_price ),
            wc_price( $min_price )
        );
    }

    // Si no está rebajada, mostramos solo el precio mínimo.
    return wc_price( $min_price );
}

Nota: Este código respeta los precios en oferta, mostrando tachado el precio estándar del producto.