Вопрос или проблема
Я пытаюсь отредактировать значение цены для одного товара.
В single-product/price.php
есть вызов шаблона $product->get_price_html
. Как я могу изменить эту функцию/метод, чтобы изменить способ отображения HTML?
На данный момент, даже если я удаляю все содержимое функции, находящейся в class-wc-product
, она все равно чудесным образом отображается? Кто-нибудь знает, почему?
Ядро и файлы плагинов никогда не должны редактироваться напрямую, поскольку любые обновления могут перезаписать ваши изменения. Если вы посмотрите в исходный код WooCommerce на метод get_price_html
, есть несколько фильтров, доступных для изменения вывода функции.
Смотрите add_filter
в Codex для получения дополнительной информации о добавлении фильтров к вызовам 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 );
}
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
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 ‘‘. ( ( is_numeric( $from ) ) ? woocommerce_price( $from ) : $from ) .’ Розничная цена | ‘.( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) .’Наша цена’;
} else {
$to = $product->price;
return ” . ( ( is_numeric( $to ) ) ? woocommerce_price( $to ) : $to ) . ‘Наша цена’;
}
} else {
return ‘0 Наша цена’;
}
}
Ответ или решение
Как редактировать get_price_html в WooCommerce
Если вы хотите изменить представление цены для отдельного продукта в WooCommerce, метод get_price_html
класса WC_Product
— это ваше решение. В этой статье мы рассмотрим, как безопасно модифицировать вывод цены, чтобы сохранить ваши изменения при обновлениях.
Понимание проблемы
Ваша попытка удалить содержимое метода get_price_html
в файле исходного кода класса class-wc-product
не приводит к изменению, потому что редактирование файлов ядра WordPress или плагинов не рекомендуется. При каждом обновлении WooCommerce ваши изменения будут потеряны. Вместо этого вы можете использовать фильтры WordPress для безопасного изменения.
Метод get_price_html
включает в себя вызов функции apply_filters
, как показано ниже:
return apply_filters('woocommerce_get_price_html', $price, $this);
Это означает, что вы можете использовать фильтр woocommerce_get_price_html
, чтобы модифицировать вывод цены, не затрагивая основной код.
Применение фильтра
Для изменения HTML вывода цены можно добавить пользовательский фильтр в файл functions.php
вашей темы:
add_filter('woocommerce_get_price_html', 'custom_price_html', 100, 2);
function custom_price_html($price, $product) {
// Здесь вы можете изменить HTML для представления цены
if ($product->is_on_sale()) {
$regular_price = $product->get_regular_price();
$sale_price = $product->get_price();
$price = '<div class="price">
<del>' . wc_price($regular_price) . '</del>
<ins>' . wc_price($sale_price) . ' Наши цены!</ins>
</div>';
} else {
$price = '<div class="price">' . wc_price($product->get_price()) . ' Наши цены!</div>';
}
return $price;
}
Создание собственного метода загружаемой цены
Если вам нужно больше контроля, вы можете создать свою собственную функцию для преобразования и отображения цен. Вот пример:
function my_custom_price($product) {
$price_html = '<div class="custom-price">';
if ($product->get_price() > 0) {
if ($product->get_regular_price()) {
$regular_price = $product->get_regular_price();
$sale_price = $product->get_price();
$price_html .= '<del>' . wc_price($regular_price) . '</del> <ins>' . wc_price($sale_price) . ' Наши цены!</ins>';
} else {
$sale_price = $product->get_price();
$price_html .= '<ins>' . wc_price($sale_price) . ' Наши цены!</ins>';
}
} else {
$price_html .= '<span>Бесплатно</span>';
}
$price_html .= '</div>';
return $price_html;
}
Затем вы можете использовать эту функцию в любом месте вашего шаблона (например, в single-product.php
):
global $product;
echo my_custom_price($product);
Заключение
Редактирование представления цены в WooCommerce может быть выполнено безопасно и эффективно через использование фильтров WordPress и пользовательских функций. Следуя описанным методам, вы можете модифицировать вывод цены, добавляя стиль и специфику, сохраняя при этом стойкость к обновлениям плагинов и тем.
FAQ
Почему модификация price.php в WooCommerce не работает?
При изменении файлов ядра WooCommerce изменения могут не проявляться, так как кэширование и вызовы фильтров могут возвращать старый вывод.
Могу ли я удалить wc_price
для кастомизации HTML?
Да, вы можете удалить wc_price
, чтобы избежать стандартной обертки, но необходимо вручную форматировать вывод в своем коде.
Следуя изложенным рекомендациям, вы добьетесь желаемого результата, сохранив управляемость вашего проекта.