WooCommerce: Come modificare il get_price_html
Sto cercando di modificare il valore del prezzo per un singolo prodotto.
In single-product/price.php
c'è una chiamata al template $product->get_price_html
. Come posso modificare quella funzione/metodo per cambiare il modo in cui viene presentato l'HTML?
Al momento, anche se elimino tutto il contenuto della funzione situata in class-wc-product
, viene ancora mostrato miracolosamente. Qualcuno sa perché?

I file del core e dei plugin non dovrebbero mai essere modificati direttamente, poiché eventuali aggiornamenti potrebbero sovrascrivere le tue modifiche. Se guardi nel codice sorgente di WooCommerce il metodo get_price_html
, ci sono diversi filtri disponibili per modificare l'output della funzione.
Vedi add_filter
nel Codex per maggiori informazioni sull'aggiunta di filtri alle chiamate apply_filters
.
Da get_price_html
in class-wc-product
:
return apply_filters('woocommerce_get_price_html', $price, $this);
Quindi per aggiungere il tuo filtro:
add_filter( 'woocommerce_get_price_html', 'wpa83367_price_html', 100, 2 );
function wpa83367_price_html( $price, $product ){
return 'Prezzo originale:' . str_replace( '<ins>', ' Prezzo scontato:<ins>', $price );
}

Grazie per la risposta, comunque perché quando cancello i contenuti della funzione principale restituisce comunque l'output normalmente

Quindi diciamo che se c'era una vendita e mi restituisce <del>£2</del><ins>£1</ins>
, come posso cambiarlo in Era:<del>£2</del> Ora:<ins>£1</ins>
con un filtro?

non sono sicuro, non ho molta familiarità con WooCommerce, forse un'altra classe lo estende. vedi la modifica sopra per la tua seconda domanda.

Sto cercando di capire cosa succede nel filtro predefinito woocommerce_get_price_html
per $price
. Nel mio sito, WooCommerce mostra 0$ per i prodotti gratuiti invece di Free!

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 ) .' Prezzo di listino </del> | </div><div class="live-colst">'.( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) .'Il nostro prezzo</div>';
} else {
$to = $product->price;
return '<div class="live-colst">' . ( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) . 'Il nostro prezzo</div>';
}
} else {
return '<div class="live-colst">0 Il nostro prezzo</div>';
}
}

Anche se il tuo codice può funzionare (e non ho motivo di pensare che non lo faccia) questo è un sito di domande/risposte, non un repository di codice quindi è meglio condividere competenze e conoscenze spiegando il tuo codice, invece di scrivere semplicemente codice senza spiegazioni né commenti inline...

nel file 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">gratis</div>';
}
$price_html .= '</div>';
return $price_html;
}
nel punto in cui vuoi visualizzare il prezzo come in single-product.php
global $product;
echo h08831n_get_price($product);
puoi anche rimuovere wc_price dalla funzione per eliminare i formati HTML predefiniti di WooCommerce
