Нестандартное значение цены в мини-карте неверно только на сайте одного продукта - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть функция, которая изменяет цену товара в моей корзине.

На самом деле все работает.Я могу добавить товар в корзину, завершить заказ и везде появится моя custom_price.Когда я добавляю продукт через страницу архива, все работает нормально (widget-cart и shopping-cart).

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

Страница архива снимков экрана

Страница снимка экрана одиночного продукта

Вот мой код:

add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
add_action( 'woocommerce_before_mini_cart', 'add_custom_price' );

 function add_custom_price( $cart_object ) {

  if( !WC()->session->__isset( "reload_checkout" )) {

    foreach ( $cart_object->cart_contents as $key => $value ) {

        foreach( WC()->cart->get_cart() as $cart_item ){
                    $product_id = $cart_item['data']->get_id(); 
        }               

            $product_group = get_field( "produktegruppe", $product_id );
            $current_user_id = get_current_user_id();
            $usergroup = get_field($product_group,'user_'. $current_user_id);
            $value1 = $usergroup['rabatt'];
            $value2 = $usergroup['zusatzrabatt'];

            $orgPrice = floatval( $value['data']->get_price() );
            if ( $value2 ) {
                $discPrice = ($orgPrice / 100 * (100-$value1)) / 100 * (100-$value2);
            }
            else {
                $discPrice = $orgPrice / 100 * (100-$value1);               
            }    
            $value['data']->set_price($discPrice);

    }
  }
}

У кого-нибудь есть решение этой проблемы?

1 Ответ

0 голосов
/ 27 февраля 2019

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

Для изменения цены товара в корзине требуется только 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 вашей активной дочерней темы (или активной темы).Должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...