wordpress, وردپرس

آموزش مخفی کردن بازه قیمت در محصولات متغیر ووکامرس | نمایش قیمت واحد با چند خط کد PHP

کدی که خواهیم دید برای تغییر نحوه‌ی نمایش قیمت محصولات متغیر (Variable Products) در صفحات محصول استفاده می‌شود. این قطعه کد با استفاده از فیلتر (Filter Hook) در وردپرس نوشته شده و باعث می‌شود که:

  • در صفحه‌ی محصول، اگر تمام متغیرها قیمت یکسانی دارند، فقط یک قیمت واحد نمایش داده شود.
  • اما اگر قیمت متغیرها متفاوت باشد، محدوده‌ی قیمتی (Price Range) نمایش داده نشود (یعنی قیمت پنهان شود).
  • در صفحات فروشگاه یا دسته‌بندی، همان رفتار پیش‌فرض ووکامرس حفظ شود.

در ادامه گام‌به‌گام و با جزئیات کامل این کد را بررسی می‌کنیم

۱. معرفی فیلتر add_filter

اولین خط به این صورت است:

add_filter('woocommerce_variable_price_html', 'custom_variable_price_display', 9999, 2);

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

اجزای این تابع عبارت‌اند از:

  • 'woocommerce_variable_price_html'
    نام فیلتری است که ووکامرس هنگام تولید HTML قیمت برای محصولات متغیر فراخوانی می‌کند.
  • 'custom_variable_price_display'
    نام تابعی است که ما نوشته‌ایم و در ادامه تعریف می‌شود. این تابع قرار است نحوه‌ی نمایش قیمت را تغییر دهد.
  • 9999
    مقدار اولویت (priority) است. هرچه این عدد بزرگ‌تر باشد، تابع شما دیرتر اجرا می‌شود و در نتیجه می‌تواند نتیجه‌ی نهایی سایر فیلترها را بازنویسی کند.
    چون مقدار ۹۹۹۹ بسیار بالاست، این تابع در آخر اجرا شده و هر تغییر دیگری را نادیده می‌گیرد.
  • 2
    این عدد نشان می‌دهد که تابع ما دو پارامتر دریافت می‌کند:
    1. $price → مقدار فعلی HTML قیمت
    2. $product → شیء محصول (از نوع WC_Product_Variable)

۲. تعریف تابع اصلی

function custom_variable_price_display($price, $product) {

در این خط تابع ما آغاز می‌شود.
دو ورودی می‌گیرد:

  • $price: رشته‌ی HTML شامل قیمت فعلی (مثل $10 – $20)
  • $product: شیء محصول که شامل تمام اطلاعات متغیرها و قیمت‌ها است.

تمام منطق ما داخل این تابع پیاده‌سازی می‌شود.

۳. شرط بررسی صفحه‌ی محصول

if (is_product()) {

تابع is_product() یکی از توابع شرطی (Conditional Tags) ووکامرس است.
این تابع بررسی می‌کند که آیا کاربر در حال مشاهده‌ی صفحه‌ی یک محصول خاص است یا خیر.

اگر کاربر در صفحه‌ی فروشگاه، دسته‌بندی یا جستجو باشد، مقدار false برمی‌گرداند.
بنابراین ما مطمئن می‌شویم که این تغییر فقط در صفحه‌ی تکی محصول (Single Product Page) اعمال شود.

دلیل این کار چیست؟
زیرا در صفحه‌ی فروشگاه نمایش محدوده قیمت (مثلاً ۱۰ تا ۳۰ دلار) برای کاربر مفید است تا حدود قیمت را بداند.
اما در صفحه‌ی محصول شاید بخواهیم این محدوده را پنهان کنیم تا کاربر بعد از انتخاب ویژگی (مثلاً سایز یا رنگ) قیمت واقعی را ببیند.

۴. دریافت قیمت‌های متغیرها

$prices = $product->get_variation_prices(true);

در اینجا از متد get_variation_prices() استفاده می‌کنیم.
این متد تمام قیمت‌های متغیرهای محصول را به صورت یک آرایه (Array) برمی‌گرداند.

پارامتر true باعث می‌شود قیمت‌ها به ترتیب صعودی مرتب شوند.

نتیجه‌ای که این متد برمی‌گرداند به صورت زیر است:

$prices = array(
    'price' => array(
        123 => 15000,
        124 => 20000,
        125 => 25000
    ),
    'regular_price' => array(...),
    'sale_price' => array(...)
);

در واقع هر کلید عددی در آرایه بالا شناسه‌ی یک متغیر (Variation ID) است و مقدار آن، قیمت آن متغیر.

۵. بررسی خالی بودن آرایه قیمت‌ها

if (empty($prices['price'])) {
    return $price; // fallback
}

این بخش برای جلوگیری از خطا در مواقع خاص است.
اگر محصول به هر دلیلی متغیر نداشته باشد یا قیمت‌ها هنوز ثبت نشده باشند، این شرط برقرار می‌شود.

در این صورت، تابع مقدار اصلی $price را برمی‌گرداند تا ووکامرس رفتار پیش‌فرض خود را ادامه دهد.

۶. تعیین کمترین و بیشترین قیمت

$min_price = min($prices['price']);
$max_price = max($prices['price']);

در این قسمت، با استفاده از توابع PHP، کمترین قیمت (min_price) و بیشترین قیمت (max_price) بین تمام متغیرها محاسبه می‌شود.

مثلاً اگر سه متغیر با قیمت‌های زیر داشته باشیم:

  • سایز کوچک → ۱۰۰۰۰ تومان
  • سایز متوسط → ۱۵۰۰۰ تومان
  • سایز بزرگ → ۲۰۰۰۰ تومان

آنگاه:

  • $min_price = 10000
  • $max_price = 20000

۷. بررسی تساوی قیمت‌ها

if ($min_price === $max_price) {
    return wc_price($min_price);
}

اگر کمترین و بیشترین قیمت برابر باشند، یعنی تمام متغیرها قیمت یکسانی دارند.
در این حالت نیازی نیست ووکامرس محدوده‌ی قیمت را نمایش دهد.

تابع wc_price() قیمت را به‌صورت قالب‌بندی‌شده برمی‌گرداند، مثلاً:

wc_price(15000);

خروجی HTML مانند زیر خواهد بود:

<span class="woocommerce-Price-amount amount">15,000 تومان</span>

بنابراین اگر تمام متغیرها ۱۵۰۰۰ تومان باشند، خروجی فقط همین مقدار است (بدون “تا”).

۸. پنهان‌سازی قیمت در صورت اختلاف قیمت‌ها

return '';

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

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

۹. بازگرداندن رفتار پیش‌فرض در صفحات دیگر

return $price;

اگر شرط is_product() برقرار نباشد (یعنی در صفحه محصول نباشیم)، این خط اجرا می‌شود.
در این حالت قیمت به همان صورت پیش‌فرض ووکامرس نمایش داده می‌شود، مثل $10 – $20.

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

۱۰. نتیجه‌ی کلی عملکرد کد

به‌طور خلاصه:

حالتنوع صفحهوضعیت قیمت‌هاخروجی نهایی
صفحه‌ی محصولتمام قیمت‌ها برابرندنمایش یک قیمت واحد
صفحه‌ی محصولقیمت متغیرها متفاوت استپنهان‌سازی قیمت
صفحه‌ی فروشگاه یا آرشیوهر نوع قیمتنمایش پیش‌فرض ووکامرس (مثلاً ۱۰ تا ۲۰ دلار)

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

۱۱. مثال عملی

فرض کنید محصولی به نام «تی‌شرت ساده» دارید با قیمت‌های زیر:

سایزقیمت
کوچک۲۰۰۰۰ تومان
متوسط۲۰۰۰۰ تومان
بزرگ۲۰۰۰۰ تومان

در این حالت چون تمام قیمت‌ها یکسان هستند، فقط همین نمایش داده می‌شود:

۲۰,۰۰۰ تومان

اما اگر محصولی دیگر به نام «هودی» داشته باشید با قیمت‌های متفاوت:

سایزقیمت
کوچک۲۵۰۰۰ تومان
متوسط۳۰,۰۰۰ تومان
بزرگ۳۵,۰۰۰ تومان

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

در صفحات فروشگاه اما همچنان محدوده زیر نمایش داده می‌شود:

۲۵,۰۰۰ – ۳۵,۰۰۰ تومان

۱۲. مزایای این روش

  1. نمای ظاهری تمیزتر و حرفه‌ای‌تر
    نمایش محدوده قیمت در برخی طراحی‌ها شلوغ یا گیج‌کننده است.
    این کد ظاهر صفحه را مینیمال‌تر می‌کند.
  2. 👇 افزایش تعامل کاربر با محصول
    وقتی قیمت پنهان باشد، کاربر مجبور می‌شود ویژگی‌ها را انتخاب کند و این باعث افزایش زمان ماندگاری در صفحه می‌شود.
  3. ⚙️ نمایش هوشمندانه قیمت یکتا
    اگر همه متغیرها قیمت یکسان دارند، دیگر نمایش “۲۰ تا ۲۰” منطقی نیست.
  4. 🔁 سازگاری با صفحات فروشگاه
    چون فقط در صفحه محصول فعال است، عملکرد پیش‌فرض ووکامرس در سایر صفحات مختل نمی‌شود.

۱۳. گسترش و شخصی‌سازی کد

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

🔹 نمایش عبارت “شروع از” به‌جای پنهان کردن قیمت:

return 'شروع از ' . wc_price($min_price);

🔹 نمایش پیام سفارشی:

return '<span class="price-message">لطفاً گزینه‌ای را انتخاب کنید تا قیمت نمایش داده شود.</span>';

🔹 اعمال فقط بر دسته‌بندی خاص:

if (has_term('پوشاک', 'product_cat', $product->get_id())) {
    // کد تغییر قیمت فقط برای دسته پوشاک اجرا شود
}

۱۴. نکات فنی و توصیه‌ها

  • این کد را بهتر است در فایل functions.php قالب فعال خود یا در پلاگین اختصاصی‌تان قرار دهید.
  • همیشه قبل از اعمال در سایت اصلی، روی نسخه‌ی تست (staging) بررسی کنید.
  • اگر از افزونه‌های کش یا سئو استفاده می‌کنید، ممکن است نیاز به پاک‌سازی کش پس از ذخیره فایل داشته باشید.

۱۵. جمع‌بندی

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

  1. بررسی می‌کند آیا در صفحه محصول هستیم.
  2. تمام قیمت‌های متغیر را دریافت می‌کند.
  3. کمترین و بیشترین قیمت را می‌یابد.
  4. اگر همه قیمت‌ها یکسان باشند → فقط همان قیمت نمایش داده می‌شود.
  5. اگر قیمت‌ها متفاوت باشند → قیمت پنهان می‌شود.
  6. در سایر صفحات (فروشگاه/دسته‌بندی) → نمایش پیش‌فرض ووکامرس باقی می‌ماند.

نتیجه‌ی این کد، صفحه‌ی محصولی ساده‌تر، مرتب‌تر و کاربرپسندتر است.

تمامی کد

add_filter('woocommerce_variable_price_html', 'custom_variable_price_display', 9999, 2);
function custom_variable_price_display($price, $product) {
    // Only apply on single product pages
    if (is_product()) {
        // Get all variation prices
        $prices = $product->get_variation_prices(true);

        if (empty($prices['price'])) {
            return $price; // fallback
        }

        $min_price = min($prices['price']);
        $max_price = max($prices['price']);

        // If all variation prices are equal → show the single price
        if ($min_price === $max_price) {
            return wc_price($min_price);
        }

        // If prices differ → hide the price range
        return '';
    }

    // Keep default behavior elsewhere (shop/archive)
    return $price;
}

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *