-->

Display product prices with a shortcode by product

2020-07-18 05:34发布

问题:

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 :

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?

回答1:

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:



回答2:

OK, a friend of me helped me, and gave me the good code. If it help someone else ... Here it is:

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'] ); 

      $price = $_product->get_price();
      $regular_price = $_product->get_regular_price();

          $price_format = number_format($_product->get_price(), 2, '.', ','); 
          $regular_price_format = number_format($_product->get_regular_price(), 2, '.', ',');

      if($price != $regular_price){
        $html .= "<span style='font-size:25px;text-decoration:line-through;'>".$regular_price_format."&nbsp;€"."</span>";  
      } 
      $html .= "<span style='font-size:40px;font-weight:bold;'>&nbsp;". $price_format."&nbsp;€"."</span>"; 
  } 
  return $html; 
} 

add_shortcode( 'woocommerce_price', 'so_30165014_price_shortcode_callback' );

bye !



回答3:

An alternative, if anyone needs simple text output of prices, is the following:

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

    if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){ 
        $_product = wc_get_product( $atts['id'] ); 
        $price = wc_price( $_product->get_price() );
      } 
  return $price; 
} 
add_shortcode( 'product_price', 'wc_price_by_id_shortcode' );

The shortcode is then [product_price id=XX] (replacing XX with the product id)

To add styling to the price, add a span class by adding the line:

$html .= "<span class="price_by_id_shortcode">". $price . "</span>";,

change the line return $price; to return $html;,

then add your style formatting to your css as needed.

(N.B. this only outputs current price, not regular price.)