Elliot

Не знаю как добавить разделитель тысяч в цене через php

13 posts in this topic

Такая фот проблема, добавил код который обновляет цену в карточке товара в зависимости от количества единиц товара.

Вот сам код

// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>';

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( currency + product_total.toFixed(2));
                        $('#cart_total_price .price').html( currency + cart_total.toFixed(2));
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

Проблема в том, что в цене пропадает разделитель тысяч, а как его добавить в этот код - не понимаю, со знаниями php плохо.

Помогите пожалуйста! Заранее спасибо!

Share this post


Link to post
Share on other sites

Попробуйте так:

// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>',
                    t_sep = '<?php echo wc_get_price_thousand_separator(); ?>',
                    d_sep = '<?php echo wc_get_price_decimal_separator(); ?>';

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( currency + product_total.toFixed(2).replace( '.', d_sep ).replace( /\d(?=(\d{3})+\.)/g, '$&' + t_sep ));
                        $('#cart_total_price .price').html( currency + cart_total.toFixed(2).replace( '.', d_sep ).replace( /\d(?=(\d{3})+\.)/g, '$&' + t_sep ));
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

 

Elliot likes this

Share this post


Link to post
Share on other sites
В 08.09.2018 в 9:20 AM, c00x сказал:

Попробуйте так:


// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>',
                    t_sep = '<?php echo wc_get_price_thousand_separator(); ?>',
                    d_sep = '<?php echo wc_get_price_decimal_separator(); ?>';

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( currency + product_total.toFixed(2).replace( '.', d_sep ).replace( /\d(?=(\d{3})+\.)/g, '$&' + t_sep ));
                        $('#cart_total_price .price').html( currency + cart_total.toFixed(2).replace( '.', d_sep ).replace( /\d(?=(\d{3})+\.)/g, '$&' + t_sep ));
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

 

Спасибо за ответ!

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

Share this post


Link to post
Share on other sites
// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>',
                    t_sep = '<?php echo wc_get_price_thousand_separator(); ?>',
                    d_sep = '<?php echo wc_get_price_decimal_separator(); ?>',
                    d_num = <?php echo wc_get_price_decimals(); ?>;

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( product_total.toFixed(d_num).replace( '.', d_sep ).replace( /\d(?=(\d{3})+)/g, '$&' + t_sep ) + ' ' + currency );
                        $('#cart_total_price .price').html( cart_total.toFixed(d_num).replace( '.', d_sep ).replace( /\d(?=(\d{3})+)/g, '$&' + t_sep ) + ' ' + currency );
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

Исправил. Все настройки отображения валюты (кроме расположения символа валюты) берутся из админки.

Elliot likes this

Share this post


Link to post
Share on other sites
15 минут назад, c00x сказал:

// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>',
                    t_sep = '<?php echo wc_get_price_thousand_separator(); ?>',
                    d_sep = '<?php echo wc_get_price_decimal_separator(); ?>',
                    d_num = <?php echo wc_get_price_decimals(); ?>;

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( product_total.toFixed(d_num).replace( '.', d_sep ).replace( /\d(?=(\d{3})+)/g, '$&' + t_sep ) + ' ' + currency );
                        $('#cart_total_price .price').html( cart_total.toFixed(d_num).replace( '.', d_sep ).replace( /\d(?=(\d{3})+)/g, '$&' + t_sep ) + ' ' + currency );
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

Исправил. Все настройки отображения валюты (кроме расположения символа валюты) берутся из админки.

Получилось два разделителя, изначальная цена 9,450 но когда умножается за две единицы то выходит так 1,8,900 руб.

Share this post


Link to post
Share on other sites

Вообще, ваш код сломается, если в корзине больше 1 товара. Не самый лучший, но если не можете лучше, один из вариантов, переменным добавить в конце ID продукта: price_80 - например.

https://raw.githubusercontent.com/kvz/locutus/master/src/php/strings/number_format.js - добавьте в код это.

number_format( product_total, d_num, d_sep, t_sep ); - вот как-то так вам нужно.

 

  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep)
  }

- вот как в этой функции реализовано.

c00x and Elliot like this

Share this post


Link to post
Share on other sites

Да, немного накосячил с регулярным выражением). Попробуйте так:

// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>',
                    t_sep = '<?php echo wc_get_price_thousand_separator(); ?>',
                    d_sep = '<?php echo wc_get_price_decimal_separator(); ?>',
                    d_num = <?php echo wc_get_price_decimals(); ?>;

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( product_total.toFixed(d_num).replace( '.', d_sep ).replace( /\B(?=(\d{3})+(?!\d))/g, '$&' + t_sep ) + ' ' + currency );
                        $('#cart_total_price .price').html( cart_total.toFixed(d_num).replace( '.', d_sep ).replace( /\B(?=(\d{3})+(?!\d))/g, '$&' + t_sep ) + ' ' + currency );
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

 

Elliot likes this

Share this post


Link to post
Share on other sites
9 минут назад, c00x сказал:

Да, немного накосячил с регулярным выражением). Попробуйте так:


// we are going to hook this on priority 31, so that it would display below add to cart button.
add_action( 'woocommerce_single_product_summary', 'woocommerce_total_product_price', 31 );
function woocommerce_total_product_price() {
    global $woocommerce, $product;
    // let's setup our divs
    echo sprintf('<div id="product_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Product Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    echo sprintf('<div id="cart_total_price" style="margin-bottom:20px;display:none">%s %s</div>',__('Cart Total:','woocommerce'),'<span class="price">'.$product->get_price().'</span>');
    ?>
        <script>
            jQuery(function($){
                var price = <?php echo $product->get_price(); ?>,
                    current_cart_total = <?php echo $woocommerce->cart->cart_contents_total; ?>,
                    currency = '<?php echo get_woocommerce_currency_symbol(); ?>',
                    t_sep = '<?php echo wc_get_price_thousand_separator(); ?>',
                    d_sep = '<?php echo wc_get_price_decimal_separator(); ?>',
                    d_num = <?php echo wc_get_price_decimals(); ?>;

                $('[name=quantity]').change(function(){
                    if (!(this.value < 1)) {
                        var product_total = parseFloat(price * this.value),
                        cart_total = parseFloat(product_total + current_cart_total);

                        $('#product_total_price .price').html( product_total.toFixed(d_num).replace( '.', d_sep ).replace( /\B(?=(\d{3})+(?!\d))/g, '$&' + t_sep ) + ' ' + currency );
                        $('#cart_total_price .price').html( cart_total.toFixed(d_num).replace( '.', d_sep ).replace( /\B(?=(\d{3})+(?!\d))/g, '$&' + t_sep ) + ' ' + currency );
                    }
                    $('#product_total_price,#cart_total_price').toggle(!(this.value <= 1));

                });
            });
        </script>
    <?php
}

 

Спасибо, теперь все работает четко ;)

 

9 минут назад, kkey80 сказал:

Вообще, ваш код сломается, если в корзине больше 1 товара. Не самый лучший, но если не можете лучше, один из вариантов, переменным добавить в конце ID продукта: price_80 - например.

https://raw.githubusercontent.com/kvz/locutus/master/src/php/strings/number_format.js - добавьте в код это.

number_format( product_total, d_num, d_sep, t_sep ); - вот как-то так вам нужно.

 


  if (s[0].length > 3) {
    s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep)
  }

- вот как в этой функции реализовано.

Так не ломается, в корзине 3 товара и цены отображаются корректно, или я что-то не вижу?

c00x likes this

Share this post


Link to post
Share on other sites
11 минуту назад, kkey80 сказал:

Вообще, ваш код сломается, если в корзине больше 1 товара. Не самый лучший, но если не можете лучше, один из вариантов, переменным добавить в конце ID продукта: price_80 - например.

Не, код же выводится один раз на странице товара, а не в корзине.

А вообще да, по-хорошему стоило написать отдельную функцию для форматирования цены.

Share this post


Link to post
Share on other sites
2 минуты назад, c00x сказал:

А вообще да, по-хорошему стоило написать отдельную функцию для форматирования цены.

Да, но я точно не смогу ее написать, если вы можете, буду вам благодарен ;)

Share this post


Link to post
Share on other sites
25 минут назад, Elliot сказал:

Да, но я точно не смогу ее написать, если вы можете, буду вам благодарен ;)

Попросите kkey80. А мой лимит безвозмездной помощи на сегодня исчерпан. :D

Elliot likes this

Share this post


Link to post
Share on other sites
Только что, c00x сказал:

Попросите kkey80. А мой лимит безвозмездной помощи на сегодня исчерпан. :D

Тогда я напишу вам завтра)))

А по факту, большое спасибо ;)

c00x likes this

Share this post


Link to post
Share on other sites

Приветствую всех!

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

Ну или хотя бы отключить работу этого скрипта в вариативных товарах...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.