تبدیل واحد تومان یا هزارتومان به میلیون تومان

سلام
وقت بخیر
دوستان از این کد استفاده میکنم در فانکشن تم(برای تبدیل هزارتومان به میلیون تومان)

    /*------------
    add_filter('raw_woocommerce_price','bistscriptmilionprice');
function bistscriptmilionprice($price){
  if(is_single()){
  if(floatval($price) >= 999){
    $price = $price / 1000;
    return $price;
  }
  }
  return $price;
}
add_filter('woocommerce_currency_symbol','bistscriptmilionsymbol');

function bistscriptmilionsymbol($symbol){
  if(is_single()){
  $product = new WC_Product(get_the_ID());
  $productprice = $product->get_price();
  if(strlen($productprice) >= 4){
    return 'میلیون تومان';
  }
  }
  return 'تومان';
}
    -----------------------*/

همینو با تغییراتی که میدونید برای تومان به میلیون تومان هم باز استفاده کردم ولی کار نمیکنه، اعشار هم در تنظیمات واحد پولی ووکامرس برداشتم، سپریتور(مجزاکنندۀ) “سه رقم سه رقم” هم حذف کردم؛ درحالات مختلف هم تست کردم.
هیچ تغییری نمیکنه متأسفانه و کماکان به همون صورتی نشون میده که در پیکربندی ووکامرس، واحد پولیو هرچی انتخاب کنیم همونو نشون میده و اصلاً انگار نه انگار فانکشنو تغییر میدیم
افزونه های بی ربط دیگه هم حتی غیر فعال کردم بازم حل نشد
کسی میدونه مشکل از کجاست؟

میشه یه توضیح کوتاه بدین که دلیل نیاز به این تبدیل چیه؟ می خوام ایده دقیق تری داشته باشم.

از کد زیر در فانکشن استفاده کنید مشکل حل میشه


add_filter(‘raw_woocommerce_price’,’7hostprice’);

function 7hostprice($price){

if(is_single()){

if(floatval($price) >= 999999){

$price = $price / 1000000;

return $price;

}

}

return $price;

}

add_filter(‘woocommerce_currency_symbol’,’7hostsymbol’);

function 7hostsymbol($symbol){

if(is_single()){

$product = new WC_Product(get_the_ID());

$productprice = $product->get_price();

if(strlen($productprice) >= 7){

return ‘میلیون تومان’;

}

}

return ‘تومان’;

}
1 پسندیده

سلام
این کد همون اولش سینتکس ارور میده!!!
ضمن اینکه این همون کدیه که ابتدای پست نوشتم، فقط اسم سون هاست جابجا شده
و با این کد مشکل حل نمیشه

برای اینکه قیمتهایی که یک میلیون به بالا هستن راحت تر خونده بشه و تعداد صفرهای زیاد نداشته باشه

یه جنسی که 1000000تومانه بنویسه 1میلیون تومان، و جنسی که 350000تومانه بنویسه 350هزارتومان و جنسی که 1500000تومانه بنویسه 1میلیون و 500هزارتومان

مثل این سایت:
arman in.ir/fa/shop

سلام وقت بخیر
دلیل اینکه کدهای شما تغییری در خروجی صفحات اعمال نمی کنه اینه که woocommerce_currency_symbol گزینه مناسبی برای کاری که شما می خواهید انجام بدهید نیست
لطفا قطعه کد زیر رو به انتهای فایل functions.php اضافه کنید:

class ToPersian
{
    public static $string = '';

    public static $separator = 'و ';

    public static function calculator($amount): string
    {
        if ($amount > 1000000000) {
            self::resolver($amount, 1000000000, 'میلیارد');
        }
        elseif ($amount > 1000000 && $amount < 1000000000) {
            self::resolver($amount, 1000000, 'میلیون');
        }
        else {
            $r = floor($amount / 1000);

            static::$string .= "$r هزار تومان";
        }

        return self::$string;
    }

    public static function resolver($amount, $base, $persianBase)
    {
        $a = $amount / $base;
        $s = floor($a);
        $separator = self::$separator;
        static::$string .= "$s $persianBase $separator";
        $b = (($a - $s) * $base);
        self::calculator($b);
    }
}

function sv_change_product_price_display($priceHtml): string
{
    // $priceHtml formatted by woo
    global $product;

   return '<span class="woocommerce-Price-amount amount">' . ToPersian::calculator($product->get_price()) . '</span>';
}

add_filter( 'woocommerce_get_price_html', 'sv_change_product_price_display' );
1 پسندیده

سلام
وقت بخیر
ممنون از شما
کد جالبی بود چون حداقل یه تغییری بالاخره توی خروجیِ قیمتهای فروشگاه از خودش نشون داد
ولی جالبتر اینجا بود که قیمتهارو اینطوری نشون میده:

1 میلیون و 500 هزار تومان0 هزار تومان
1 میلیون و 500 هزار تومان0 هزار تومان0 هزار تومان0 هزار تومان
1 میلیون و 500 هزار تومان0 هزار تومان0 هزار تومان0 هزار تومان3 میلیون و 0 هزار تومان
1 میلیون و 500 هزار تومان0 هزار تومان0 هزار تومان0 هزار تومان3 میلیون و 0 هزار تومان1000 هزار تومان

و الی آخر!!!

پس اینهم نهایتاً به کار نمیاد ولی خوبیش اینه که حداقل یه بخاری از خودش نشون داد، کدهای قبلی اصلاً در خروجی تغییری ایجاد نمیکردن

یعنی به محصولی که حتی هیچ قیمتی هم نداره و برچسب تماس بگیرید داره قیمتشو اینطوری نشون میده:
“1 میلیون و 500 هزار تومان0 هزار تومان”

سلام مجدد
واقعیتش من خیلی روی جزییات کار دقت نکردم و فقط صفحه single محصول رو چک کردم
این مشکل در صفحات لیست به وجود میاد
برای حل این مشکل شما کافیه کد زیر رو جایگزین کنید.

class ToPersian
{
    protected static $string = '';

    protected static $separator = 'و ';

    public static function calculator($amount): string
    {
        if ($amount > 1000000000) {
            self::resolver($amount, 1000000000, 'میلیارد');
        } elseif ($amount > 1000000 && $amount < 1000000000) {
            self::resolver($amount, 1000000, 'میلیون');
        } else {
            $r = floor($amount / 1000);

            static::$string .= "$r هزار تومان";
        }

        return self::$string;
    }

    public static function resolver($amount, $base, $persianBase)
    {
        $a = $amount / $base;
        $s = floor($a);
        $separator = self::$separator;
        static::$string .= "$s $persianBase $separator";
        $b = (($a - $s) * $base);
        self::calculator($b);
    }

    public static function reset()
    {
        self::$string = '';
    }
}

function sv_change_product_price_display($priceHtml, $product): string
{
    if ($product->get_price() <= 0) {
        return $priceHtml;
    }
    $price = ToPersian::calculator($product->get_price());
    ToPersian::reset();

    return '<span class="woocommerce-Price-amount amount">'.$price.'</span>';
}

add_filter('woocommerce_get_price_html', 'sv_change_product_price_display', 100, 2);
2 پسندیده

مهندس @ali_khosravi برنامه نویس ارشد تیم سون هاست هستن. از تجارب ایشون استفاده کنید.

شما لطف دارید،
کوچیک همه عزیزان هستم

1 پسندیده

سلام بر دوستان

الآن یک محصولی که قیمتش 100هزارتومانه، داره “0 هزار تومان” نشون میده
یا مثلاً یه محصولی که قیمتش 3میلیون تومان بوده رو اینطوری نشون میده: “3 میلیون و 0 هزار تومان”
یا مثلاً یه محصولی که با پایه پولی ووکامرسِ تومان، مبلغشو " ۱,۰۰۰,۰۰۰ تومان" نشون میده، با این کد تبدیل میشه به “1000 هزار تومان” که طبیعتاً تبدیلش یا فهمش برای خریدار مشکله.

یعنی درواقع اگر بخوایم از این کد استفاده کنیم فقط درصورتی همه چیزو درست نشون میده که اولاً قیمتهامون بالای یک میلیون تومان باشن ثانیاً حتماً خورده داشته باشن تا مثلاً ننویسه “3 میلیون و 0 هزار تومان”

مابقی موارد درسته، پایه پولی تومان بذاریم ووکامرسو درست به درگاه پرداخت منتقل میشه ولی فقط مشکل کماکان در نمایش قیمتهاست.

ولی الحق و الانصاف درود بیکران بر شما که انقدر ریزبین هستین و کارتون درسته

راهی هست به نظرتون این مشکل حل بشه؟

سلام مجدد
قطعه کد زیر رو جایگزین کنید:

class ToPersian
{
    protected static $string = '';

    protected static $separator = 'و ';

    public static function handle($amount): string
    {
        if ($amount > 1000000000) {
            self::calculator($amount, 1000000000, 'میلیارد');
        } elseif ($amount > 1000000 && $amount < 1000000000) {
            self::calculator($amount, 1000000, 'میلیون');
        } elseif ($amount > 1000 && $amount < 1000000) {
            self::calculator($amount, 1000, 'هزار');
        } else {
            static::$string = rtrim(static::$string, self::$separator);
            self::$string .= ' تومان';
        }

        return self::$string;
    }

    public static function calculator($amount, $base, $persianBase)
    {
        $a = $amount / $base;
        $s = floor($a);
        $separator = self::$separator;
        static::$string .= "$s $persianBase $separator";
        $b = (($a - $s) * $base);
        self::handle($b);
    }

    public static function reset()
    {
        self::$string = '';
    }
}

function sv_change_product_price_display($priceHtml, $product): string
{
    if ($product->get_price() < 1000) {
        return $priceHtml;
    }
    $price = ToPersian::handle($product->get_price());
    ToPersian::reset();

    return '<span class="woocommerce-Price-amount amount">'.$price.'</span>';
}

add_filter('woocommerce_get_price_html', 'sv_change_product_price_display', 100, 2);

کدی که خودتون قرار دادید مشکلی نداره
تنها یک مشکل داره اونم اینه که کد را کامنت کردید


    add_filter('raw_woocommerce_price','bistscriptmilionprice');
function bistscriptmilionprice($price){
  if(is_single()){
  if(floatval($price) >= 999){
    $price = $price / 1000;
    return $price;
  }
  }
  return $price;
}
add_filter('woocommerce_currency_symbol','bistscriptmilionsymbol');

function bistscriptmilionsymbol($symbol){
  if(is_single()){
  $product = new WC_Product(get_the_ID());
  $productprice = $product->get_price();
  if(strlen($productprice) >= 4){
    return 'میلیون تومان';
  }
  }
  return 'تومان';
}

عرض کردم این کد متأسفانه در قالب نهایی اعمال نمیشه
خودم کامنتش کردم چون بلااستفاده شده بود

درود فراوان بر دوست عزیز

مواردیکه مشاهده شد:

قیمتو که میزنیم 1300000، درست نشون میده
ولی اگه قیمتهای زوج باشه رقم خوردش، مثل 1میلیون و 200هزارتومان، اینطوری نشون میده: “1 میلیون و 199 هزار تومان”
یا اگه قیمت 1میلیون و 400هزارتومان بزنیم در محصول، اینطوری نشون میده: “1 میلیون و 399 هزار تومان”
ولی 1300000تومانو درست نشون میده: “1 میلیون و 300 هزار تومان” یا مثلاً 1700000تومانو درست نشون میده: “1 میلیون و 700 هزار تومان”
1800000تومانم درست نشون میده: “1 میلیون و 800 هزار تومان”
ولی 1میلیونو900هزارتومانو اینطوری نشون میده:“1 میلیون و 899 هزار تومان”؛ جالب اینجاست که اومدیم خودمون 1000تومان اضافه کردیم به مبلغ محصول و زدیم 1901000تومان، چیزی که نشون داد درست بود!!!: “1 میلیون و 901 هزار تومان”
حالا اگه قیمتو بزنیم 2900000تومان، اینطوری نشون میده: “2 میلیون و 899 هزار تومان”
جالب اینجاست که برخی از این اتفاق برای بالای 2میلیون تومان نمیافته و شرایط بهتره، یعنی اگر قیمت 2200000تومان باشه نشون میده: “2 میلیون و 200 هزار تومان” که درسته، درصورتیکه همین رقم اگر 1200000تومان بود اینطوری نشون میده: “1 میلیون و 199 هزار تومان”
یا اگر 1220000تومان باشه نشون میده: “1 میلیون و 219 هزار تومان”
حالا اگه همین بشه 2220000تومان، دقیقاً درست نشون میده:“2 میلیون و 220 هزار تومان”
یا اگه بزنیم 3300000تومان، نشون میده: “3 میلیون و 299 هزار تومان”
حتی اگه خورده هم داشته باشه درست نشون میده مثلاً 1550هزارتومانو درست نشون میده: “1 میلیون و 550 هزار تومان”
یه مشکل دیگه اینکه اگر قیمت محصولی دقیقاً 1000000تومان(یک میلیون تومان) باشه، فقط نشون میده: " تومان"؛ ولی این قضیه برای 2میلیون تومان به بالا درسته و “2 میلیون تومان” نشون میده.
درواقع الآن همه چیز تقریباً عالیه درصورتیکه قیمتها بالای 1میلیون تومان باشه
البته قیمتهای زیر یک میلیون تومان هم همه چیزش درسته

با این اوصاف، شما در این الگو متوجه قاعدۀ خاصی شدین؟

سلام مجدد
نگران نباشید، بنده عذرخواهی میکنم چون خیلی وقت ندارم همه حالت ها رو چک کنم
این قطعه کد زیر رو تست کنید این مواردی که اشاره کردید فیکس شد:

class ToPersian
{
    protected static $string = '';

    protected static $separator = 'و ';

    public static function handle($amount): string
    {
        if ($amount >= 1000000000) {
            self::calculator($amount, 1000000000, 'میلیارد');
        } elseif ($amount >= 1000000) {
            self::calculator($amount, 1000000, 'میلیون');
        } elseif ($amount >= 1000) {
            self::calculator($amount, 1000, 'هزار');
        } else {
            static::$string = rtrim(static::$string, self::$separator);
            self::$string .= ' تومان';
        }

        return self::$string;
    }

    public static function calculator($amount, $base, $persianBase)
    {
        $result = $amount / $base;
        $inBase = floor($result);
        $separator = self::$separator;
        static::$string .= "$inBase $persianBase $separator";
        $outOfBase = ($result * $base) - ($inBase * $base);
        self::handle($outOfBase);
    }

    public static function reset()
    {
        self::$string = '';
    }
}

function sv_change_product_price_display($priceHtml, $product): string
{
    if ($product->get_price() < 1000) {
        return $priceHtml;
    }
    $price = ToPersian::handle($product->get_price());
    ToPersian::reset();

    return '<span class="woocommerce-Price-amount amount">'.$price.'</span>';
}

add_filter('woocommerce_get_price_html', 'sv_change_product_price_display', 100, 2);
3 پسندیده

الحق و الانصاف اگه سون هاست چنین کارمندای مسلطی به بک‌اند و فرانت‌اند داره باید بهش دست‌مریزاد گفت
این کدی که شما زدی خودش 3واحد کلاس آموزشیه
خداییش داخل فروم ووکامرسم نتونستن به این قشنگی حلش کنن، جالب بود کارتون واقعاً
حتی از سایت هدف هم بهتر درومد نتیجۀ کار
مختصر و مفید
کاملاً درست کار کرد
در همۀ حالتها درست کار کرد
اعلا میشد اگر اعدادم فارسی نشون میداد، چون دیفالت ووکامرس که روی اعداد فارسیه رو بایپس میکنه انگار
البته درکل دَم شما گرم واقعاً
دست مریزاد به سون هاست با یه چنین پرسنلی، انصافاً از صمیم قلب خداقوت

1 پسندیده

شما لطف دارید خیلی ممنون
برای اعداد فارسی پیشنهاد میکنم به جای درگیر کردن بک اند روی این مسئله از یک فونت فارسی استفاده کنید که اعداد رو بصورت فارسی نمایش بده
که اغلب فونت های پدر مادر دار مثل iran sans نسخه مخصوص برای عدد های فارسی رو هم دارن
موفق باشید

3 پسندیده

بسیار ممنون از راهنماییتون :heart:

1 پسندیده