В вашем коде есть некоторые ошибки и ошибки, например, вы делаете цикл элемента корзины в другом цикле элемента корзины, который на самом деле не нужен.
Для изменения цены товара в корзине требуется только woocommerce_before_calculate_totals
крючок.
Поэтому попробуйте следующее:
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
function add_custom_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
$user_id = get_current_user_id();
// Loop Through cart items
foreach ( $cart->get_cart() as $cart_item ) {
$product_id = $cart_item['data']->get_id();
$product_group = get_field( "produktegruppe", $product_id );
$usergroup = get_field( $product_group, 'user_'. $user_id );
$value1 = $usergroup['rabatt'];
$value2 = $usergroup['zusatzrabatt'];
$price = (float) $cart_item['data']->get_price();
if ( $value2 ) {
$new_price = ($price / 100 * (100 - $value1)) / 100 * (100 - $value2);
}
else {
$new_price = $price / 100 * (100 - $price);
}
$cart_item['data']->set_price( $new_price );
}
}
Код входит в файл function.php вашего активного ребенкатема (или активная тема).Он должен работать.
Я протестировал этот хук с фиксированной ценой, и он работает с виджетом корзины повсюду на страницах архива и на отдельных страницах продукта…
Так что, если это не такне работает для вас, проблема исходит от чего-то другого (это может быть другая настройка вашей темы, или сделанная вами, или плагином). Он также может быть получен из плагина кэширования или кэша хоста.
Теперь вы можете попробовать добавить следующий код, который будет принудительно обновлять фрагменты корзины только на отдельных страницах товара:
add_action( 'wp_footer', 'single_product_page_refresh_fragments' );
function single_product_page_refresh_fragments() {
if ( is_product() ):
?>
<script type="text/javascript">
jQuery( function($){
$('body').trigger('wc_fragment_refresh');
$('body').trigger('wc_fragments_refreshed');
});
</script>
<?php
endif;
}
Код сохраняется в файле function.php вашей активной дочерней темы (или активной темы).Должно работать.