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

- برای هر محصول یک «قیمت دلاری» ذخیره کنید و قیمت تومانی را از ضرب آن در نرخ فروش دلار به دست آورید.
- قیمتها را در یک کار زمانبندیشده (Action Scheduler یا WP-Cron) بهروز کنید، نه در لحظهٔ نمایش صفحه.
- حاشیهٔ امنیت، گرد کردن و سقف تغییر روزانه بگذارید تا یک جهش لحظهای بازار قیمت سایت را بههم نریزد.
فروشگاههایی که کالای وارداتی، قطعات الکترونیک، لوازم جانبی یا هر محصول دلاری میفروشند، با هر نوسان ارز یا ضرر میکنند یا ساعتها وقت صرف بهروزرسانی دستی قیمتها میشود. در این آموزش تغییر قیمت ووکامرس بر اساس دلار را بهصورت خودکار پیاده میکنیم، با تمهیداتی که یک جهش لحظهای بازار قیمتها را بههم نریزد.
_usd_price بسازید. یک کار زمانبندیشده هر ساعت نرخ فروش دلار را از API میگیرد، قیمت تومانی را با فرمول "قیمت دلاری × نرخ دلار × (۱ + حاشیه)" حساب و گرد میکند و با $product->set_regular_price() ذخیره میکند.این آموزش بخشی از راهنمای کامل API قیمت ارز و طلا است و تابع اتصال آن را از آموزش نمایش قیمت ارز در وردپرس یاد بگیرید.
منطق قیمتگذاری: قبل از کد، فرمول را دقیق کنید
قیمت فروش یک کالای دلاری فقط "قیمت دلاری × نرخ دلار" نیست. باید سه چیز دیگر را هم در نظر بگیرید:
- نرخ مبنا: نرخ فروش دلار بازار آزاد (
sell) معمولاً منطقیترین مبناست، چون جایگزین کردن کالا با همین نرخ ممکن است. - حاشیهٔ امنیت: بین بهروزرسانیها ممکن است دلار بالا برود. یک حاشیهٔ کوچک (مثلاً ۱ تا ۲ درصد) این ریسک را پوشش میدهد.
- گرد کردن: قیمتی مثل ۲٬۳۴۷٬۸۱۲ تومان برای مشتری ناخوشایند است؛ به نزدیکترین هزار یا ده هزار تومان گرد کنید.
قیمت تومانی = گرد (قیمت دلاری × نرخ فروش دلار × (۱ + حاشیه))
| قیمت دلاری | نرخ دلار (فرضی) | حاشیه | محاسبه | قیمت نهایی گردشده |
|---|---|---|---|---|
| ۴۹٫۹۰ | ۱۰۰٬۰۰۰ | ۲٪ | ۴۹٫۹ × ۱۰۰٬۰۰۰ × ۱٫۰۲ = ۵٬۰۸۹٬۸۰۰ | ۵٬۰۹۰٬۰۰۰ |
| ۱۲۰ | ۱۰۰٬۰۰۰ | ۲٪ | ۱۲۰ × ۱۰۰٬۰۰۰ × ۱٫۰۲ = ۱۲٬۲۴۰٬۰۰۰ | ۱۲٬۲۴۰٬۰۰۰ |
عدد نرخ دلار در جدول فرضی است تا محاسبه راحت دیده شود. نرخ واقعی را همیشه از API بگیرید.
گام ۱: فیلد قیمت دلاری در صفحهٔ محصول
<?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
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.php بگذارید یا از Action Scheduler ووکامرس استفاده کنید. برای فروشگاههای با هزاران محصول، بهروزرسانی را در دستههای ۱۰۰ تایی انجام دهید.گام ۳: شفافیت برای مشتری
مشتری باید بداند قیمت چرا تغییر میکند. یک جملهٔ کوتاه زیر قیمت محصولات دلاری اعتماد میسازد:
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()).
قیمت دلاری را به مشتری هم نشان دهیم؟
این یک تصمیم تجاری است. نمایش قیمت دلاری برای مشتریان حرفهای (مثلاً خریداران قطعات صنعتی) شفافیت میآورد؛ اما برای خریدار عادی ممکن است این حس را ایجاد کند که قیمت ناپایدار است. یک راه میانه، نمایش جملهٔ «قیمت بر اساس نرخ روز ارز» بدون عدد دلاری است. اگر عدد دلاری نشان میدهید، تاریخ و ساعت آخرین بهروزرسانی را هم کنارش بنویسید.
گزارش تغییرات برای مدیر فروشگاه
مدیر فروشگاه باید بداند هر بهروزرسانی چه کرده است. یک خط ساده در لاگ ووکامرس کافی است:
wc_get_logger()->info(sprintf('Repriced %d products at USD %s', count($ids), number_format($usd)), ['source' => 'ezrate']);این لاگ از «ووکامرس › وضعیت › گزارشها» در دسترس است. اگر بهروزرسانی بهخاطر جهش غیرعادی متوقف شد (ezrate_reprice_paused)، یک اعلان مدیریتی هم در پیشخوان نشان دهید تا کسی بررسی و تأیید کند.
چند اشتباه رایج
- گرد کردن به پایین (
floor) بهجای بالا (ceil): در جمع هزاران سفارش، اختلاف کوچک به ضرر شما جمع میشود. - ذخیرهٔ قیمت جدید بدون پاک کردن کش صفحه: افزونهٔ کش ممکن است صفحهٔ محصول را با قیمت قدیم نشان دهد. بعد از بهروزرسانی، کش صفحههای محصولات تغییرکرده را پاک کنید.
- استفاده از نرخ لحظهای برای کالایی که با دلار هفتهٔ قبل خریدهاید، بدون توجه به سیاست قیمتگذاری خودتان.

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

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


