WooCommerce: Cómo editar el get_price_html
Estoy tratando de editar el valor del precio para un producto individual.
En single-product/price.php
hay una llamada a la plantilla $product->get_price_html
. ¿Cómo puedo editar esa función/método para cambiar la forma en que se presenta el HTML?
En este momento, incluso si elimino todo el contenido de la función ubicada en class-wc-product
, ¡aún se muestra milagrosamente! ¿Alguien sabe por qué?

Los archivos del núcleo y de los plugins nunca deben editarse directamente, ya que cualquier actualización podría sobrescribir tus cambios. Si revisas el código fuente de WooCommerce en el método get_price_html
, hay varios filtros disponibles para modificar la salida de la función.
Consulta add_filter
en el Codex para obtener más información sobre cómo añadir filtros a las llamadas de apply_filters
.
Desde get_price_html
en class-wc-product
:
return apply_filters('woocommerce_get_price_html', $price, $this);
Así que para añadir tu propio filtro:
add_filter( 'woocommerce_get_price_html', 'wpa83367_price_html', 100, 2 );
function wpa83367_price_html( $price, $product ){
return 'Precio anterior:' . str_replace( '<ins>', ' Precio actual:<ins>', $price );
}

Gracias por la respuesta, por cierto ¿por qué cuando elimino el contenido de la función principal todavía devuelve la salida como normal?

Digamos que si hubiera una oferta y me devuelve <del>£2</del><ins>£1</ins>
, ¿cómo puedo cambiarlo a Antes:<del>£2</del> Ahora:<ins>£1</ins>
con un filtro?

No estoy seguro, no estoy muy familiarizado con WooCommerce, quizás otra clase lo extienda. Mira la edición anterior para tu segunda pregunta.

Estoy tratando de saber qué está pasando en el filtro por defecto woocommerce_get_price_html
para $price
. En mi sitio, WooCommerce muestra $0 para productos gratis en lugar de ¡Gratis!

function wpa83368_price_html( $price,$product ){
// devuelve $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 ) .' Precio Regular </del> | </div><div class="live-colst">'.( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) .'Nuestro Precio</div>';
} else {
$to = $product->price;
return '<div class="live-colst">' . ( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) . 'Nuestro Precio</div>';
}
} else {
return '<div class="live-colst">0 Nuestro Precio</div>';
}
}

Aunque tu código pueda funcionar (y no tengo motivos para pensar que no), esto es un sitio de preguntas y respuestas, no un repositorio de código. Por lo tanto, es mejor compartir experiencia y conocimiento explicando tu código, en lugar de simplemente escribir código sin explicaciones ni comentarios internos...

en el archivo 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;
}
en el archivo donde quieras mostrar el precio como single-product.php
global $product;
echo h08831n_get_price($product);
también puedes eliminar wc_price de la función para remover los formatos HTML por defecto de WooCommerce
