Mostrar precio prefijado y precio unitario adicional en productos simples de Woocommerce

4 minutos de lectura

Mostrar precio prefijado y precio unitario adicional en productos simples
Schalk Joubert

Usando Woocommerce vendo vino por caja con 6 botellas en una caja. Entonces, naturalmente, ingreso un precio por caja cuando configuro mi producto. Sin embargo, quiero que el usuario también vea el precio por botella.

$120 / caja

$20 / botella

Traté de usar Mostrar en las páginas de la tienda el precio unitario y el precio al por mayor en las páginas de productos código de respuesta. Hace exactamente lo que quiero, excepto que elimina el precio original (por caja).

El fragmento editado a continuación muestra tanto el $precio original como el $precio unitario, así como el indicador de grupo/unidad (para productos simples):

add_filter( 'woocommerce_get_price_html', 'unit_product_price_on_archives', 10, 2 );
function unit_product_price_on_archives( $price, $product ) {
    if ( is_product() || is_product_category() || is_product_tag() ) {
        $unit_divider = 6;
        $group_suffix = ' '. __('(per box)', 'woocommerce');
        $unit_suffix = ' '. __('(per bottle)', 'woocommerce');

        if( $product->is_on_sale() )
        {
            $regular_price_unit = $product->get_regular_price() / $unit_divider;
            $regular_price_unit = wc_get_price_to_display( $product, array( 'price' => $regular_price_unit ) );

            $regular_price_group = $product->get_regular_price();
            $regular_price_group = wc_get_price_to_display( $product, array( 'price' => $regular_price_group ) );
          
            $group_price_sale = $product->get_sale_price();
            $group_price_sale = wc_get_price_to_display( $product, array( 'price' => $group_price_sale ) );

            $group_price_sale = wc_format_sale_price( $regular_price_group, $group_price_sale ) . $group_suffix;


            $unit_price_sale = $product->get_sale_price() / $unit_divider;
            $unit_price_sale = wc_get_price_to_display( $product, array( 'price' => $unit_price_sale ) );
            $unit_price_sale = wc_format_sale_price( $regular_price_unit, $unit_price_sale ) . $unit_suffix;
         
            $price = $group_price_sale . '<br>' . $unit_price_sale;
        }
        else
        {
            $group_price = $price;
            $group_price = $group_price . $group_suffix;
            $unit_price = $product->get_price() / $unit_divider;
            $unit_price = wc_get_price_to_display( $product, array( 'price' => $unit_price ) );
            $unit_price = $price = wc_price($unit_price) . $unit_suffix;
            $price = $group_price . '<br>' . $unit_price;
        }
    }
    return $price;
}

Sin embargo, solo atendí productos estándar con precio regular o de oferta.

yo hice no extender esto a productos agrupados o variables.

  • cualquier comentario sobre las respuestas a continuación es bienvenido, por favor.

    – LoicTheAztec

    26 de julio de 2020 a las 20:47

Mostrar precio prefijado y precio unitario adicional en productos simples
LoicTheAztec

He revisado el código y lo he simplificado. (solo para productos individuales):

add_filter( 'woocommerce_get_price_html', 'custom_product_price_html', 10, 2 );
function custom_product_price_html( $price, $product ) {
    // For simple products only
    if ( $product->is_type('simple') ) {

        $unit_divider = 6;
        $suffix_box   = ' '. __('(per box)', 'woocommerce');
        $suffix_unit=" ". __('(per bottle)', 'woocommerce');

        $active_price_unit  = wc_get_price_to_display( $product, array( 'price' => ( $product->get_price() / $unit_divider ) ) );

        if($product->is_on_sale() )
        {
            $regular_price_unit   = wc_get_price_to_display( $product, array( 'price' => ( $product->get_regular_price() / $unit_divider ) ) );
            $formatted_price_unit = wc_format_sale_price( $regular_price_unit, $active_price_unit );

            $price .= $suffix_box . '<br><span class="unit-price">' . $formatted_price_unit . $suffix_unit . '</span>';
        }
        else
        {
            $price .= $suffix_box . '<br><span class="unit-price">' . wc_price($active_price_unit) . $suffix_unit . '</span>';
        }
    }
    return $price;
}

El código va en el archivo function.php de su tema secundario activo (o tema). Probado y funciona.


Relacionados:

  • Mostrar en las páginas de la tienda el precio unitario y el precio al por mayor en las páginas de productos
  • Mostrar un sufijo de precio solo en todos los productos individuales de WooCommerce

Hay varias maneras de lograr esto. El que publicó anteriormente podría funcionar una vez que agregue el nuevo precio a la cadena original cambiando estas dos líneas

$price = $group_price_sale . '<br>' . $unit_price_sale;
$price = $group_price . '<br>' . $unit_price;

para

$price .= $group_price_sale . '<br>' . $unit_price_sale;
$price .= $group_price . '<br>' . $unit_price;

Otra forma sería conectarse a la función de sufijo de precio:

function so1664798_add_bottle_price_suffix( $html, $product, $price, $qty ){
  $bottleprice = $price / 6;
  $html .= ' ('.$bottleprice .' per bottle)';
  return $html;
}
add_filter( 'woocommerce_get_price_suffix', 'so1664798_add_bottle_price_suffix', 99, 4 );

O, si desea que el precio por botella se muestre, por ejemplo, en la página de un solo producto, puede conectarse allí con este código (lo uso para obtener información sobre el precio por litro):

function so1664798_add_bottle_price() {
    global $product;
    $price = $product->get_price();
    $price_per_bottle = $price / 6;
    echo '<span class="price-unit smaller">'.number_format((float)$price_per_bottle, 2, wc_get_price_decimal_separator(), '').get_woocommerce_currency_symbol()."https://stackoverflow.com/".__('Bottle','txtdomain').',&nbsp;</span>';
}
add_action('woocommerce_single_product_summary','so1664798_add_bottle_price_summary',10);

La última opción será la más segura si desea evitar que el precio de su botella se muestre en varios otros lugares (pago, carrito, …) pero solo lo desea en la página del producto.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad