Как отобразить единицу измерения после цены товара Woocommerce?

Ссылка скопирована
1 ответ

Всем привет.
Есть код который выводит единицу измерения рядом с ценой товара, но почему то перед ценой а не после как нужно.
Что не так в коде? Помогите пожалуйста!

Сейчас единица измерения перед ценой

Как отобразить единицу измерения после цены товара Woocommerce?

Код:

add_filter( 'woocommerce_get_price_suffix', 'add_some_text_after_price', 99, 1 );  function add_some_text_after_price ($value){     $value = get_post_meta(get_the_ID(), '_edinica', true);      if (empty($value)) {         return;     }     echo '<span>' . '/ <span>' . esc_html($value) . '</span></span>';      };

add_filter( 'woocommerce_get_price_suffix', 'add_some_text_after_price', 99, 1 ); function add_some_text_after_price ($value){ $value = get_post_meta(get_the_ID(), '_edinica', true); if (empty($value)) { return; } echo '<span>' . '/ <span>' . esc_html($value) . '</span></span>'; };

Дополнительно:

Как отобразить единицу измерения после цены товара Woocommerce?

Потому что фильтр должен возвращать return, а не выводить echo

add_filter( 'woocommerce_get_price_suffix', 'add_some_text_after_price', 99, 1 );  function add_some_text_after_price ( $value ) { 	$value = get_post_meta( get_the_ID(), '_edinica', true );  	if ( empty( $value ) ) { 		return; 	}  	return '<span>/ <span>' . esc_html( $value ) . '</span></span>'; };

add_filter( 'woocommerce_get_price_suffix', 'add_some_text_after_price', 99, 1 ); function add_some_text_after_price ( $value ) { $value = get_post_meta( get_the_ID(), '_edinica', true ); if ( empty( $value ) ) { return; } return '<span>/ <span>' . esc_html( $value ) . '</span></span>'; };

  • Спасибо, действительно глупая ошибка. Еще раз спасибо за помощь!!!
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь NetOps Ответ

Проблема в том, что фильтр woocommerce_get_price_suffix должен возвращать строку, а не делать echo. Сейчас вы выводите единицу измерения напрямую и при этом не возвращаете корректный suffix, поэтому порядок может получаться неправильным.

Сделайте так:

add_filter('woocommerce_get_price_suffix', function ($suffix, $product, $price, $qty) {
    if (! $product instanceof WC_Product) {
        return $suffix;
    }
 
    $unit = get_post_meta($product->get_id(), '_edinica', true);
 
    if ($unit === '') {
        return $suffix;
    }
 
    return ' <span class="price-unit">/ ' . esc_html($unit) . '</span>';
}, 99, 4);

add_filter('woocommerce_get_price_suffix', function ($suffix, $product, $price, $qty) { if (! $product instanceof WC_Product) { return $suffix; } $unit = get_post_meta($product->get_id(), '_edinica', true); if ($unit === '') { return $suffix; } return ' <span class="price-unit">/ ' . esc_html($unit) . '</span>'; }, 99, 4);

Если метаполе хранится не у вариации, а у родительского товара, для вариативных товаров можно добавить fallback:

$product_id = $product->get_id();
$unit = get_post_meta($product_id, '_edinica', true);
 
if ($unit === '' && $product->is_type('variation')) {
    $unit = get_post_meta($product->get_parent_id(), '_edinica', true);
}

$product_id = $product->get_id(); $unit = get_post_meta($product_id, '_edinica', true); if ($unit === '' && $product->is_type('variation')) { $unit = get_post_meta($product->get_parent_id(), '_edinica', true); }

Ещё один важный момент: woocommerce_get_price_suffix добавляет именно суффикс к HTML цены, поэтому не нужно возвращать саму цену. WooCommerce сам поставит цену, а ваш фильтр добавит текст после неё.

Если нужно вывести единицу только в карточке товара, а не в каталоге, добавьте условие:

if (! is_product()) {
    return $suffix;
}

if (! is_product()) { return $suffix; }

После правки очистите кэш WooCommerce/плагина кэширования и проверьте простые и вариативные товары отдельно.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно