ایزی ریت
ورود / ثبت‌نامورود

تغییر قیمت ووکامرس بر اساس دلار؛ قیمت‌گذاری خودکار با نرخ لحظه‌ای

تغییر قیمت ووکامرس بر اساس دلار به‌صورت خودکار: فیلد قیمت دلاری برای هر محصول، محاسبه با نرخ روز، گرد کردن، حاشیهٔ امنیت و به‌روزرسانی زمان‌بندی‌شده با کد کامل.

عرفان فضلی
· کارشناس توسعه و برنامه نویسی
انتشار ۶ آبان ۱۴۰۵، ۰۹:۰۰ · ۳ دقیقه مطالعه
تغییر قیمت ووکامرس بر اساس دلار
خلاصه در سه خط
  • برای هر محصول یک «قیمت دلاری» ذخیره کنید و قیمت تومانی را از ضرب آن در نرخ فروش دلار به دست آورید.
  • قیمت‌ها را در یک کار زمان‌بندی‌شده (Action Scheduler یا WP-Cron) به‌روز کنید، نه در لحظهٔ نمایش صفحه.
  • حاشیهٔ امنیت، گرد کردن و سقف تغییر روزانه بگذارید تا یک جهش لحظه‌ای بازار قیمت سایت را به‌هم نریزد.

فروشگاه‌هایی که کالای وارداتی، قطعات الکترونیک، لوازم جانبی یا هر محصول دلاری می‌فروشند، با هر نوسان ارز یا ضرر می‌کنند یا ساعت‌ها وقت صرف به‌روزرسانی دستی قیمت‌ها می‌شود. در این آموزش تغییر قیمت ووکامرس بر اساس دلار را به‌صورت خودکار پیاده می‌کنیم، با تمهیداتی که یک جهش لحظه‌ای بازار قیمت‌ها را به‌هم نریزد.

★
پاسخ کوتاه
برای هر محصول فیلد _usd_price بسازید. یک کار زمان‌بندی‌شده هر ساعت نرخ فروش دلار را از API می‌گیرد، قیمت تومانی را با فرمول "قیمت دلاری × نرخ دلار × (۱ + حاشیه)" حساب و گرد می‌کند و با $product->set_regular_price() ذخیره می‌کند.

این آموزش بخشی از راهنمای کامل API قیمت ارز و طلا است و تابع اتصال آن را از آموزش نمایش قیمت ارز در وردپرس یاد بگیرید.

منطق قیمت‌گذاری: قبل از کد، فرمول را دقیق کنید

قیمت فروش یک کالای دلاری فقط "قیمت دلاری × نرخ دلار" نیست. باید سه چیز دیگر را هم در نظر بگیرید:

  • نرخ مبنا: نرخ فروش دلار بازار آزاد (sell) معمولاً منطقی‌ترین مبناست، چون جایگزین کردن کالا با همین نرخ ممکن است.
  • حاشیهٔ امنیت: بین به‌روزرسانی‌ها ممکن است دلار بالا برود. یک حاشیهٔ کوچک (مثلاً ۱ تا ۲ درصد) این ریسک را پوشش می‌دهد.
  • گرد کردن: قیمتی مثل ۲٬۳۴۷٬۸۱۲ تومان برای مشتری ناخوشایند است؛ به نزدیک‌ترین هزار یا ده هزار تومان گرد کنید.
قیمت تومانی = گرد (قیمت دلاری × نرخ فروش دلار × (۱ + حاشیه))
قیمت دلارینرخ دلار (فرضی)حاشیهمحاسبهقیمت نهایی گردشده
۴۹٫۹۰۱۰۰٬۰۰۰۲٪۴۹٫۹ × ۱۰۰٬۰۰۰ × ۱٫۰۲ = ۵٬۰۸۹٬۸۰۰۵٬۰۹۰٬۰۰۰
۱۲۰۱۰۰٬۰۰۰۲٪۱۲۰ × ۱۰۰٬۰۰۰ × ۱٫۰۲ = ۱۲٬۲۴۰٬۰۰۰۱۲٬۲۴۰٬۰۰۰

عدد نرخ دلار در جدول فرضی است تا محاسبه راحت دیده شود. نرخ واقعی را همیشه از API بگیرید.

گام ۱: فیلد قیمت دلاری در صفحهٔ محصول

php
<?php
// فیلد «قیمت دلاری» در تب «همگانی» محصول
add_action('woocommerce_product_options_pricing', function () {
    woocommerce_wp_text_input([
        'id' => '_usd_price', 'label' => 'قیمت دلاری (USD)', 'data_type' => 'price',
        'desc_tip' => true, 'description' => 'خالی بماند = قیمت این محصول خودکار تغییر نمی‌کند.',
    ]);
});
add_action('woocommerce_admin_process_product_object', function ($product) {
    $v = isset($_POST['_usd_price']) ? wc_clean(wp_unslash($_POST['_usd_price'])) : '';
    $product->update_meta_data('_usd_price', $v);
});
فیلد قیمت دلاری در صفحهٔ ویرایش محصول ووکامرس
فیلد جدید قیمت دلاری کنار قیمت عادی

گام ۲: به‌روزرسانی زمان‌بندی‌شدهٔ قیمت‌ها

قیمت را هرگز هنگام نمایش صفحه محاسبه نکنید؛ هم کند است و هم قیمت سبد خرید و صفحهٔ محصول ممکن است با هم فرق کنند. یک کار پس‌زمینه قیمت‌ها را ذخیره می‌کند:

php
<?php
const EZ_MARGIN = 0.02;        // حاشیهٔ امنیت ۲٪
const EZ_ROUND  = 1000;        // گرد به نزدیک‌ترین هزار تومان
const EZ_MAX_DAILY_JUMP = 0.08; // اگر دلار بیش از ۸٪ تغییر کرد، خودکار اعمال نشود

add_action('init', function () {
    if (! wp_next_scheduled('ezrate_reprice')) {
        wp_schedule_event(time(), 'hourly', 'ezrate_reprice');
    }
});

add_action('ezrate_reprice', function () {
    $usd = ezrate_rates('usd')['usd']['sell'] ?? null;   // تابع آموزش وردپرس
    if (! $usd) {
        return;                                               // API در دسترس نیست
    }
    $last = (float) get_option('ezrate_last_usd', 0);
    if ($last && abs($usd - $last) / $last > EZ_MAX_DAILY_JUMP) {
        update_option('ezrate_reprice_paused', current_time('mysql'));
        return;                                               // جهش غیرعادی: بررسی دستی
    }
    $ids = wc_get_products(['limit' => -1, 'return' => 'ids', 'meta_key' => '_usd_price', 'meta_compare' => 'EXISTS']);
    foreach ($ids as $id) {
        $p = wc_get_product($id);
        $usdPrice = (float) $p->get_meta('_usd_price');
        if ($usdPrice <= 0) {
            continue;
        }
        $toman = ceil($usdPrice * $usd * (1 + EZ_MARGIN) / EZ_ROUND) * EZ_ROUND;
        $p->set_regular_price((string) $toman);
        $p->save();
    }
    update_option('ezrate_last_usd', $usd);
});
!
هشدار
WP-Cron فقط با بازدید سایت اجرا می‌شود. در فروشگاه‌های جدی، در هاست یک Cron Job واقعی برای wp-cron.php بگذارید یا از Action Scheduler ووکامرس استفاده کنید. برای فروشگاه‌های با هزاران محصول، به‌روزرسانی را در دسته‌های ۱۰۰ تایی انجام دهید.

گام ۳: شفافیت برای مشتری

مشتری باید بداند قیمت چرا تغییر می‌کند. یک جملهٔ کوتاه زیر قیمت محصولات دلاری اعتماد می‌سازد:

php
add_action('woocommerce_single_product_summary', function () {
    global $product;
    if ($product->get_meta('_usd_price')) {
        echo '<p class="ez-note">قیمت این کالا بر اساس نرخ روز ارز به‌روز می‌شود.</p>';
    }
}, 11);

سؤالات مهم کسب‌وکاری

سفارش‌های ثبت‌شده چه می‌شوند؟

ووکامرس قیمت هر سفارش را در لحظهٔ ثبت ذخیره می‌کند، پس تغییر قیمت بعدی روی سفارش‌های قبلی اثری ندارد.

اگر دلار پایین آمد چه کنیم؟

فرمول در هر دو جهت کار می‌کند. اگر نمی‌خواهید قیمت‌ها پایین بیایند (مثلاً چون کالا را گران خریده‌اید)، در کد شرط بگذارید که قیمت جدید فقط وقتی اعمال شود که از قیمت فعلی بیشتر است. این تصمیم تجاری است، نه فنی.

محصولات تخفیف‌دار؟

اگر قیمت حراج دارید، آن را هم به‌صورت دلاری ذخیره کنید یا درصد تخفیف را روی قیمت محاسبه‌شده اعمال کنید.

نسخهٔ انگلیسی این آموزش با رویکرد بین‌المللی در WooCommerce Live Toman Rates و منطق کلی قیمت‌گذاری پویا در Dynamic Pricing with FX APIs آمده است.

دلار آمریکا۲۷۰٬۰۰۰تومان−۱٫۲۳٪

محصولات متغیر (Variable Products)

اگر محصولی چند رنگ یا مدل با قیمت متفاوت دارد، فیلد قیمت دلاری را برای هر «متغیر» جدا تعریف کنید. هوک‌های مخصوص متغیرها در ووکامرس woocommerce_variation_options_pricing برای نمایش فیلد و woocommerce_save_product_variation برای ذخیره است. در تابع به‌روزرسانی هم به‌جای محصول والد، روی متغیرها حلقه بزنید ($product->get_children()).

قیمت دلاری را به مشتری هم نشان دهیم؟

این یک تصمیم تجاری است. نمایش قیمت دلاری برای مشتریان حرفه‌ای (مثلاً خریداران قطعات صنعتی) شفافیت می‌آورد؛ اما برای خریدار عادی ممکن است این حس را ایجاد کند که قیمت ناپایدار است. یک راه میانه، نمایش جملهٔ «قیمت بر اساس نرخ روز ارز» بدون عدد دلاری است. اگر عدد دلاری نشان می‌دهید، تاریخ و ساعت آخرین به‌روزرسانی را هم کنارش بنویسید.

گزارش تغییرات برای مدیر فروشگاه

مدیر فروشگاه باید بداند هر به‌روزرسانی چه کرده است. یک خط ساده در لاگ ووکامرس کافی است:

php
wc_get_logger()->info(sprintf('Repriced %d products at USD %s', count($ids), number_format($usd)), ['source' => 'ezrate']);

این لاگ از «ووکامرس › وضعیت › گزارش‌ها» در دسترس است. اگر به‌روزرسانی به‌خاطر جهش غیرعادی متوقف شد (ezrate_reprice_paused)، یک اعلان مدیریتی هم در پیشخوان نشان دهید تا کسی بررسی و تأیید کند.

چند اشتباه رایج

  • گرد کردن به پایین (floor) به‌جای بالا (ceil): در جمع هزاران سفارش، اختلاف کوچک به ضرر شما جمع می‌شود.
  • ذخیرهٔ قیمت جدید بدون پاک کردن کش صفحه: افزونهٔ کش ممکن است صفحهٔ محصول را با قیمت قدیم نشان دهد. بعد از به‌روزرسانی، کش صفحه‌های محصولات تغییرکرده را پاک کنید.
  • استفاده از نرخ لحظه‌ای برای کالایی که با دلار هفتهٔ قبل خریده‌اید، بدون توجه به سیاست قیمت‌گذاری خودتان.
لاگ به‌روزرسانی قیمت محصولات در گزارش‌های ووکامرس
گزارش هر نوبت به‌روزرسانی قیمت‌ها

نرخ‌های لحظه‌ای مرتبط با این مطلب: قیمت دلار، قیمت طلای ۱۸ عیار، قیمت سکه امامی.

تغییر قیمت ووکامرس بر اساس دلار را بدون کدنویسی هم می‌شود انجام داد؟
افزونه‌هایی برای این کار وجود دارند، اما باید منبع نرخ دلار بازار آزاد ایران را پشتیبانی کنند. کد این آموزش کنترل کامل حاشیه، گرد کردن و توقف در جهش را به شما می‌دهد.
هر چند وقت قیمت‌ها را به‌روز کنم؟
برای بیشتر فروشگاه‌ها هر یک تا چند ساعت کافی است. به‌روزرسانی خیلی مکرر قیمت سبد خرید مشتری را در حین خرید عوض می‌کند و تجربهٔ بدی می‌سازد.
نرخ خرید دلار را مبنا بگذارم یا فروش؟
برای قیمت فروش کالا، نرخ فروش (sell). این نرخی است که شما برای تأمین دوبارهٔ کالا می‌پردازید.
اگر API قطع شد قیمت‌ها چه می‌شوند؟
در کد بالا هیچ تغییری اعمال نمی‌شود و قیمت‌های قبلی می‌مانند. این امن‌ترین رفتار است.
عرفان فضلی
من در حوزه توسعه نرم‌افزار و برنامه‌نویسی فعالیت می‌کنم و به طراحی و پیاده‌سازی راهکارهای کاربردی و بهینه علاقه‌مندم. تمرکز من بر توسعه قابلیت‌های جدید، بهبود عملکرد سیستم‌ها و حل چالش‌های فنی با استفاده از فناوری‌های روز است. در مسیر کاری خود تلاش می‌کنم با یادگیری مستمر و به‌کارگیری روش‌های نوین برنامه‌نویسی، محصولات نرم‌افزاری کارآمد، پایدار و قابل‌اعتماد توسعه دهم.
همهٔ مطالب نویسنده ←

نظرات (۰)

نظرها پس از تأیید نمایش داده می‌شوند؛ برای ارسال، ورود به حساب لازم است.

مطالب مرتبط

API و برنامه‌نویسی
سورس ربات تلگرام قیمت ارز با Node.js؛ آموزش ساخت ربات اعلام قیمت دلار و سکه
API و برنامه‌نویسی
اسکرپ قیمت ارز یا API رسمی؟ مقایسهٔ فنی، حقوقی و هزینهٔ واقعی
API و برنامه‌نویسی
دریافت نرخ ارز در PHP و لاراول با cURL و Guzzle؛ آموزش کامل