• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Важно! Отображение специфических ценников в WooCommerce

D&B

Администратор
Команда форума
Местный
Скажем, вы торгуете шашлыком из элитных сортов говядины, и в килограмме у вас определенное количество шампуров. Покупатель может выбрать количество шампуров, но вы хотите выводить именно цену за килограмм, чтоб покупатель мог сравнить цены. Если вас волнует подобный вопрос или вы хотите узнать, как можно вывести другие специфические ценники, то в этой статье вы найдете ответы на все свои вопросы.

Вы можете изменить отображение цен, что облегчит покупателям процесс сравнивания средних цен на ваши товары. Для изменения выводимых ценников, вам понадобятся следующие важные фильтры:

  • woocommerce_get_price_html: изменяет то, как отображается цена на странице товара и страницах магазина
  • woocommerce_cart_item_price: изменяет то, как отображаются цены, которые отображаются в списке товаров корзины (не на странице оформления заказа, так как там отображается только количество товаров и общая цена, а не средняя).

WooCommerce-фильтр для отображения цен на все товары.

Допустим, вы хотите сделать в конце ценника пометку: «за упаковку». Вы можете добавить эту приписку к ценнику с помощью фильтров цен товаров и корзины:

Код:
<?php
// only copy opening php tag if needed
// Adds "per package" after each product price throughout the shop
function sv_change_product_price_display( $price ) {
    $price .= ' per package';
    return $price;
}
add_filter( 'woocommerce_get_price_html', 'sv_change_product_price_display' );
add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_display' );

Фильтр woocommerce_get_price_html изменяет этот показатель на страницах магазина:

woocommerce-change-all-product-price-display-1.jpg

И на единичных страницах товаров:

woocommerce-price-label-added-2.jpg

Фильтр woocommerce_cart_item_price так же добавит это отображение для корзины:

woocommerce-cart-price-label-added-3.jpg

WooCommerce-фильтр отображения цены для единичного товара.

Что делать, если вы хотите изменить отображение цены для определенного товара? Вы можете сделать это с помощью тех же фильтров, так как они также позволяют использовать дополнительные аргументы, чтоб изменить цену согласно каким-то условиям. Вернемся к «нашим» шашлыкам: вы продаете шампур за 150 рублей, но хотите вывести ценник «1 125 рублей за кг», чтоб покупатель мог сравнить разные товары.

woocommerce-price-display 4.jpg

На этот раз мы разделим эти фильтры и используем 2 функции, чтоб модифицировать цену на товар и цену для корзины. Сначала нам нужно узнать ID товара, затем заменить отображение цены только для этого товара.

Код:
function sv_change_product_html( $price_html, $product ) {
    if ( 337 === $product->id ) {
        $price_html = '<span class="amount">$15.00 per kg</span>';   
    }
   
    return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'sv_change_product_html', 10, 2 );


function sv_change_product_price_cart( $price, $cart_item, $cart_item_key ) {
    if ( 337 === $cart_item['product_id'] ) {
        $price = '$15.00 per kg<br>(7-8 skewers per kg)';
    }
    return $price;
}   
add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_cart', 10, 3 );

Первая функция изменит страницу «моего товара»:

woocommerce-price-display 5.jpg

Вместе с отображением в магазине:

woocommerce-price-display 6.jpg

В то время как вторая функция добавит новый прайсинг к «моей корзине»:

woocommerce-price-display 7.jpg

Но как бы то ни было, если у вас много товаров со средней ценой, данный метод может быть проблематичным для применения, так как вам, вряд ли, захочется проделывать данную операцию для ID каждого товара. Вместо этого советуется, использовать кастомное поле товара, чтоб добавить расширение ценника.

WooCommerce-фильтр для отображения цены на основе поля товара.

Если вам нужно изменить отображение ценника для некоторых товаров, но не для всех, или вы решили, что каждый товар будет иметь разную среднюю цену, то использование кастомного поля даст вам возможность внедрить очень простой сниппет: мы можем добавить данное поле для каждого товара, а затем просто модифицировать его сниппетом.

Вы можете добавить кастомное поле unit_price для каждого продукта, которому это требуется, а затем в нем прописать значение средней цены.

woocommerce-price-display 8.jpg

После его добавления, вы можете задать среднюю цену. После того, как вы задали среднюю цену, добавьте отображение прайсинга, чтоб использовать эту среднюю цену и кастомный ценник:

Код:
<?php
// only copy the opening php tag if needed
// Change the shop / product prices if a unit_price is set
function sv_change_product_html( $price_html, $product ) {
    $unit_price = get_post_meta( $product->id, 'unit_price', true );
    if ( ! empty( $unit_price ) ) {
        $price_html = '<span class="amount">' . wc_price( $unit_price ) . ' per kg</span>';   
    }
   
    return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'sv_change_product_html', 10, 2 );
// Change the cart prices if a unit_price is set
function sv_change_product_price_cart( $price, $cart_item, $cart_item_key ) {
    $unit_price = get_post_meta( $cart_item['product_id'], 'unit_price', true );
    if ( ! empty( $unit_price ) ) {
        $price = wc_price( $unit_price ) . ' per kg';   
    }
    return $price;
}   
add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_cart', 10, 3 );

wc_price() – это маленькая полезная функция, которая поможет отформатировать цифры с помощью настроек отображения прайсинга магазина.

В этом случае отображение цен на страницах товара или магазина можно будет изменять при установленной средней цене. Если таковой не установлено, то цена останется прежней:

woocommerce-price-display 9.jpg

То же самое случится и с товарами в корзине – WooCommerce-отображение цены будет добавлено, если у товара заявлен сет unit_price в кастомном поле.

woocommerce-price-display 10.jpg

Оригинал здесь
 

GlowWormy

Форумчанин
На скриншоте в 1 сообщении видна кнопка: "Add custom field"
Кнопку на скриншоте я вижу, но не могу найти ее в админке(
Может перед этим плагин какой-то поставить? или снести??
Вообще можна через импорт мета, но тогда и редактировать придется через экспорт-импорт(
И в вариациях и сгруппированых продуктах оно не работает(((
 

N1k0lay

Новичок
Магазин строй материалов. У некоторых категорий нужно использовать например "150р за м2", а у других "300р за упаковку". Все это автоматически добавляться в зависимости от категории. Как это можно реализовать? По примеру с ID товара?
 

GlowWormy

Форумчанин
Можно ли в магазине отображать цену за кг, а на страничке товара цену за единицу товара?
 

timen

Новичок
Как сделать то же самое, что в статье, но для вариативных товаров?
 

can_do

Новичок
WooCommerce-фильтр для отображения цены на основе поля товара.

Если вам нужно изменить отображение ценника для некоторых товаров, но не для всех, или вы решили, что каждый товар будет иметь разную среднюю цену, то использование кастомного поля даст вам возможность внедрить очень простой сниппет: мы можем добавить данное поле для каждого товара, а затем просто модифицировать его сниппетом.

Вы можете добавить кастомное поле unit_price для каждого продукта, которому это требуется, а затем в нем прописать значение средней цены.

Посмотреть вложение 1794

После его добавления, вы можете задать среднюю цену. После того, как вы задали среднюю цену, добавьте отображение прайсинга, чтоб использовать эту среднюю цену и кастомный ценник:

Код:
<?php
// only copy the opening php tag if needed
// Change the shop / product prices if a unit_price is set
function sv_change_product_html( $price_html, $product ) {
    $unit_price = get_post_meta( $product->id, 'unit_price', true );
    if ( ! empty( $unit_price ) ) {
        $price_html = '<span class="amount">' . wc_price( $unit_price ) . ' per kg</span>';  
    }
  
    return $price_html;
}
add_filter( 'woocommerce_get_price_html', 'sv_change_product_html', 10, 2 );
// Change the cart prices if a unit_price is set
function sv_change_product_price_cart( $price, $cart_item, $cart_item_key ) {
    $unit_price = get_post_meta( $cart_item['product_id'], 'unit_price', true );
    if ( ! empty( $unit_price ) ) {
        $price = wc_price( $unit_price ) . ' per kg';  
    }
    return $price;
}  
add_filter( 'woocommerce_cart_item_price', 'sv_change_product_price_cart', 10, 3 );

wc_price() – это маленькая полезная функция, которая поможет отформатировать цифры с помощью настроек отображения прайсинга магазина.

В этом случае отображение цен на страницах товара или магазина можно будет изменять при установленной средней цене. Если таковой не установлено, то цена останется прежней:

Посмотреть вложение 1795

То же самое случится и с товарами в корзине – WooCommerce-отображение цены будет добавлено, если у товара заявлен сет unit_price в кастомном поле.

Посмотреть вложение 1796

Оригинал здесь


Как бы еще чтобы указать для полей вариативного товара?
 

ut4utc

Новичок
А кто подскажет как реализовать перевод на несколько языков этой переменной unit_price или per kg с помощью wpml?
Нужно добавить в шаблон темы какое-то значение?
 

ut4utc

Новичок
А кто подскажет как реализовать перевод на несколько языков этой переменной unit_price или per kg с помощью wpml?
Нужно добавить в шаблон темы какое-то значение?

Если кому-то решение пригодиться - то я сделал вот так
PHP:
if ( ICL_LANGUAGE_CODE=='en' ) {
        $lang_litr = 'for 1 liter';
        $lang_kg = 'for 1 piece';
    } elseif ( ICL_LANGUAGE_CODE=='uk' ) {
        $lang_litr = 'за 1 літр';
        $lang_kg = 'за 1 шт.';
    } elseif ( ICL_LANGUAGE_CODE=='ru' ) {
        $lang_litr = 'за 1 литр';
        $lang_kg = 'за 1 шт.';
    } elseif ( ICL_LANGUAGE_CODE=='de' ) {
        $lang_litr = 'für 1 Liter';
        $lang_kg = 'für 1 Stück';
    }

ну а дальше просто сравнение с массивом и вывод в тексте переменной $lang_litr и $lang_kg = 'за 1 шт.';
 

misha25

Форумчанин
Магазин строй материалов. У некоторых категорий нужно использовать например "150р за м2", а у других "300р за упаковку". Все это автоматически добавляться в зависимости от категории. Как это можно реализовать? По примеру с ID товара?
PHP:
// Изменение валюты рубля на руб/кг для товаров категории Грунтовка
add_filter('woocommerce_currency_symbol', 'change_currency_symbol_in_cat', 10, 2);
function change_currency_symbol_in_cat( $currency_symbol, $currency ) {
global $post, $product;
 
if ( has_term( 'gruntovka', 'product_cat' ) ) {
switch( $currency ) {
case 'RUB': $currency_symbol = 'руб/кг';
break;
}
}
return $currency_symbol;
}

Источник
 
Сверху Снизу