19

I am trying to edit the price value for a single product.

In single-product/price.php there is a template call to $product->get_price_html. How can I edit that function/method to change the way the HTML is presented?

At the moment even if I delete all the contents of the function located in class-wc-product it still miraculously displays? Anyone know why?

3 Answers 3

26

Core and plugin files should never be edited directly, as any updates could overwrite your changes. If you look in WooCommerce source at the get_price_html method, there are a number of filters available to modify the output of the function.

See add_filter in Codex for more info on adding filters to apply_filters calls.

From get_price_html in class-wc-product:

return apply_filters('woocommerce_get_price_html', $price, $this);

So to add your own filter:

add_filter( 'woocommerce_get_price_html', 'wpa83367_price_html', 100, 2 );
function wpa83367_price_html( $price, $product ){
    return 'Was:' . str_replace( '<ins>', ' Now:<ins>', $price );
}
6
  • Thanks for the answer, by the way why when I delete the contents of the main function it still returns the output as normal
    – Lucky Luke
    Commented Jan 27, 2013 at 20:09
  • 1
    So lets say if there was a sale on and it returns me <del>£2</del><ins>£1</ins>, how can i change that into Was:<del>£2</del> Now:<ins>£1</ins> with a filter?
    – Lucky Luke
    Commented Jan 27, 2013 at 20:19
  • not sure, not too familiar with WooCommerce, perhaps another class extends it. see edit above for your second question.
    – Milo
    Commented Jan 27, 2013 at 20:27
  • Brill, ;), great help
    – Lucky Luke
    Commented Jan 27, 2013 at 20:33
  • I am trying to know that what happening in default woocommerce_get_price_html filter for $price. In my site,woocommerce shows 0$ for free products instead Free! Commented Dec 7, 2016 at 9:42
6
function wpa83368_price_html( $price,$product ){
   // return $product->price;
    if ( $product->price > 0 ) {
      if ( $product->price && isset( $product->regular_price ) ) {
        $from = $product->regular_price;
        $to = $product->price;
        return '<div class="old-colt"><del>'. ( ( is_numeric( $from ) ) ? woocommerce_price( $from ) : $from ) .' Retail </del>  | </div><div class="live-colst">'.( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) .'Our Price</div>';
      } else {
        $to = $product->price;
        return '<div class="live-colst">' . ( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) . 'Our Price</div>';
      }
   } else {
     return '<div class="live-colst">0 Our Price</div>';
   }
}
2
  • 6
    Even if your code can work (and I have no reason to think it doesn't) this is a Q/A site, not a code repository so it's better share expertice and knowledge explaining your code, instead of just write code with no explaination nor inline comments...
    – gmazzap
    Commented Jan 3, 2014 at 14:38
  • the code also uses object properties which is not good. Commented May 8, 2018 at 18:50
0

in the functions.php

function h08831n_get_price($product){
        $price_html = '<div class="product-price">';
        if ( $product->get_price() > 0 ) {
            if ($product->get_price() && $product->get_regular_price()) {
                $from = $product->get_regular_price();
                $to = $product->get_price();
                $price_html .= '<del>'. ( ( is_numeric( $from ) ) ? wc_price( $from ) : $from ) .'</del><ins>'.( ( is_numeric( $to ) ) ? wc_price( $to ) : $to ) .'</ins>';
            }else{
                $to = $product->get_price();
                $price_html .= '<ins>' . ( ( is_numeric( $to ) ) ? wc_price( $to ) : $to ) . '</ins>';
            }
        }else{
            $price_html .= '<div class="free">free</div>';
        }
        $price_html .= '</div>';
        return $price_html;
    }

in the where you want to display the price like single-product.php

global $product;
echo h08831n_get_price($product);

you can also remove wc_price in the function to remove woocommerce default HTML formats

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.