WooCommerce: Как редактировать get_price_html
Я пытаюсь отредактировать значение цены для отдельного товара.
В single-product/price.php
есть вызов шаблона $product->get_price_html
. Как можно отредактировать эту функцию/метод, чтобы изменить способ отображения HTML?
В данный момент, даже если я удалю все содержимое функции, расположенной в class-wc-product
, она все равно каким-то чудом отображается. Кто-нибудь знает почему?

Файлы ядра и плагинов никогда не следует редактировать напрямую, так как любые обновления могут перезаписать ваши изменения. Если вы посмотрите в исходном коде WooCommerce метод get_price_html
, там доступно несколько фильтров для изменения вывода функции.
Смотрите add_filter
в Кодексе для получения дополнительной информации о добавлении фильтров к вызовам apply_filters
.
Из get_price_html
в class-wc-product
:
return apply_filters('woocommerce_get_price_html', $price, $this);
Таким образом, чтобы добавить свой собственный фильтр:
add_filter( 'woocommerce_get_price_html', 'wpa83367_price_html', 100, 2 );
function wpa83367_price_html( $price, $product ){
return 'Было:' . str_replace( '<ins>', ' Сейчас:<ins>', $price );
}

Спасибо за ответ, кстати, почему когда я удаляю содержимое основной функции, она все равно возвращает вывод как обычно

Допустим, если была распродажа и возвращается <del>£2</del><ins>£1</ins>
, как я могу изменить это на Было:<del>£2</del> Теперь:<ins>£1</ins>
с помощью фильтра?

Не уверен, не слишком знаком с WooCommerce, возможно, другой класс его расширяет. Смотрите правку выше для вашего второго вопроса.

Я пытаюсь понять, что происходит в фильтре по умолчанию woocommerce_get_price_html
для $price
. На моем сайте WooCommerce показывает 0$ для бесплатных товаров вместо 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 ) .' Розничная цена </del> | </div><div class="live-colst">'.( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) .'Наша цена</div>';
} else {
$to = $product->price;
return '<div class="live-colst">' . ( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) . 'Наша цена</div>';
}
} else {
return '<div class="live-colst">0 Наша цена</div>';
}
}

Даже если ваш код может работать (и у меня нет причин думать, что это не так), это сайт вопросов и ответов, а не репозиторий кода. Поэтому лучше делиться экспертизой и знаниями, объясняя свой код, а не просто писать код без объяснений и комментариев...

в файле 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">бесплатно</div>';
}
$price_html .= '</div>';
return $price_html;
}
в месте, где нужно отобразить цену, например в single-product.php
global $product;
echo h08831n_get_price($product);
также можно удалить wc_price из функции, чтобы убрать стандартные HTML-форматы WooCommerce
