Пользовательская скидка применяется дважды в корзине к сгруппированному продукту - WooCommerce
Я использую функцию для применения индивидуальной цены к продуктам в определенной категории в зависимости от роли пользователя. Вот сокращенный пример:
function return_custom_discounted_price($price, $product) {
$current_user = wp_get_current_user();
$newPrice = $price;
$prodID = $product->get_id();
if( in_array('example_customer', $current_user->roles) && !is_admin()){
if(has_term( 'example-category', 'product_cat', $prodID )){
$newPrice = $price * .9;
}
}
return $newPrice;
}
add_filter('woocommerce_product_get_price', 'return_custom_discounted_price', 10, 2);
Однако, если товар в этой категории добавляется из сгруппированного товара, скидка в корзине применяется дважды. Например, если товар стоил $100, корзина применяется:
(100 * .9) * .9 = 81
когда это должно быть просто
100 * .9 = 90
Что странно, потому что код работает нормально, если вы добавляете тот же продукт отдельно, а НЕ из сгруппированного продукта.
Я также использую расширение Product Addons WooCommerce для этих сгруппированных продуктов. Я использую jQuery, чтобы показать / скрыть дочерние продукты сгруппированной базы продуктов от их выбора дополнения. Надстройка не применяет никаких изменений стоимости.
Почему это происходит в корзине?
1 ответ
С некоторой помощью комментариев было обнаружено, что расширение надстройки продукта снова вызывает ловушку в корзине. Чтобы это исправить, все, что мне нужно было сделать, это заменить измененную цену первоначальной ценой продукта. Таким образом, даже если вызывается несколько раз, результат будет одинаковым. Ниже приведен рабочий пример.
function return_custom_discounted_price($price, $product) {
$current_user = wp_get_current_user();
$newPrice = $price;
$prodID = $product->get_id();
$originalPrice = $product->get_regular_price();
if( in_array('example_customer', $current_user->roles) && !is_admin()){
if(has_term( 'example-category', 'product_cat', $prodID )){
$newPrice = $originalPrice * .9;
}
}
return $newPrice;
}
add_filter('woocommerce_product_get_price', 'return_custom_discounted_price', 999, 2);