Display product prices with a shortcode by product ID in WooCommerce

Gaou picture Gaou · Nov 10, 2017 · Viewed 13.4k times · Source

IN WooCommerce I am using the code of this tread to display with a short code the product prices from a defined product ID. But it don't really do what I want. Here is that code:

function so_30165014_price_shortcode_callback( $atts ) {
$atts = shortcode_atts( array(
'id' => null,
), $atts, 'bartag' );

$html = '';

if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
 $_product = wc_get_product( $atts['id'] );
 $number = number_format($_product->get_price(), 2, '.', ',');
 $html = "$" . $number;

 }
 return $html;
 }
 add_shortcode( 'woocommerce_price', 'so_30165014_price_shortcode_callback' );

I have a poor knowledge in php coding. But I've seen that there this other thread to display product prices:

$_product->get_regular_price();
$_product->get_sale_price();
$_product->get_price();

I Have tried to mix these code into the big code, and replaced get_price()… It works, but what I want is to display prices is something like this :

What I want to display

So the Regular price crossed out, and the Sale price next to it, like in this screenshot. If there is no Sale price, it display only the regular price.

Also I have some other problems:

  • I need to display the price is in , not in $, so I have replaced the currency symbol from $ (dollars) to (euros) with this code: $html = "€" . $number;

  • I need to display the currency symbol after the price, like : 37 € (with a blank space between), not like $37.

How can I make it work in a clean normal way?

Answer

LoicTheAztec picture LoicTheAztec · Nov 11, 2017

Updated (takes into account if your prices are displayed with or without taxes)

With Woocommerce there is already formatting price function wc_price() that you can use in your code. Also you need to get the sale price

To get this working when there is a sale price or without it try this code (commented):

function custom_price_shortcode_callback( $atts ) {

    $atts = shortcode_atts( array(
        'id' => null,
    ), $atts, 'product_price' );

    $html = '';

    if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
        // Get an instance of the WC_Product object
        $product = wc_get_product( intval( $atts['id'] ) );

        // Get the product prices
        $price         = wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) ); // Get the active price
        $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Get the regular price
        $sale_price    = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) ); // Get the sale price

        // Your price CSS styles
        $style1 = 'style="font-size:40px;color:#e79a99;font-weight:bold;"';
        $style2 = 'style="font-size:25px;color:#e79a99"';

        // Formatting price settings (for the wc_price() function)
        $args = array(
            'ex_tax_label'       => false,
            'currency'           => 'EUR',
            'decimal_separator'  => '.',
            'thousand_separator' => ' ',
            'decimals'           => 2,
            'price_format'       => '%2$s %1$s',
        );

        // Formatting html output
        if( ! empty( $sale_price ) && $sale_price != 0 && $sale_price < $regular_price )
            $html = "<del $style2>" . wc_price( $regular_price, $args ) . "</del> <ins $style1>" . wc_price( $sale_price, $args ) . "</ins>"; // Sale price is set
        else
            $html = "<ins $style1>" . wc_price( $price, $args ) . "</ins>"; // No sale price set
    }
    return $html;
 }
 add_shortcode( 'product_price', 'custom_price_shortcode_callback' );

Code goes in function.php file of your active child theme (or theme) or also in any plugin file.


USAGE (for example product ID 37):

[product_price id="37"]

This code is tested and works. You will get this:

enter image description here