کد امروز یک افزونهی ساده اما کاربردی برای ووکامرس (WooCommerce) است که وظیفه دارد حداقل مبلغ مجاز سفارش را برای مشتریان فروشگاه شما تعیین کند.
یعنی اگر مجموع مبلغ محصولات در سبد خرید (بدون هزینه ارسال) از مقدار تعیینشده کمتر باشد، سیستم اجازهی ادامهی پرداخت را نمیدهد و پیامی خطا برای کاربر نمایش میدهد.
این افزونه به طور کامل با ساختار ووکامرس سازگار است، از فیلترها و اکشنهای داخلی استفاده میکند، و حتی بخشی در تنظیمات ووکامرس ایجاد میکند تا مدیر سایت بتواند مقدار حداقل سفارش را بهراحتی از طریق پنل مدیریت تنظیم کند.
در ادامه قدمبهقدم این کد را بررسی میکنیم
بخش ۱ – اطلاعات اولیه افزونه
/**
* Plugin Name: حداقل مبلغ سفارش در ووکامرس
* Plugin URI: https://codegate.ir/
* Description: تعیین حداقل مبلغ سبد خرید (بدون هزینه ارسال) و جلوگیری از پرداخت اگر مبلغ کمتر از حد مجاز باشد.
* Version: 1.0
* Author: Saeed gharibi
* License: GPL2
*/
این بخش همان هدر استاندارد افزونههای وردپرس است که اطلاعات متا دربارهی پلاگین را در خود دارد:
- Plugin Name: نام افزونه که در لیست افزونهها در پیشخوان وردپرس نمایش داده میشود.
- Plugin URI: لینک مرجع یا صفحه معرفی افزونه.
- Description: توضیح مختصری دربارهی عملکرد افزونه.
- Version: نسخه افزونه.
- Author: نام نویسنده.
- License: نوع مجوز (در اینجا GPL2).
وردپرس با خواندن این هدر، افزونه را شناسایی و در فهرست افزونهها نمایش میدهد.
جلوگیری از اجرای مستقیم فایل
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
این خط یکی از موارد امنیتی استاندارد در تمام افزونههاست.
تابع defined('ABSPATH') بررسی میکند آیا وردپرس در حال اجراست یا خیر.
اگر فایل بهطور مستقیم از مرورگر اجرا شود (بدون بارگذاری وردپرس)، متغیر ABSPATH تعریف نشده و اجرای کد متوقف میشود.
نتیجه: جلوگیری از دسترسی مستقیم کاربران به فایل PHP افزونه.
بخش ۲ – افزودن تنظیمات به صفحه تنظیمات ووکامرس
تا اینجا افزونه فقط شناسایی شده، اما هنوز کاری انجام نمیدهد.
در مرحله بعد با استفاده از فیلترها (Filters) بخش جدیدی به تنظیمات عمومی ووکامرس اضافه میکنیم تا مدیر سایت بتواند حداقل مبلغ سفارش را مشخص کند.
۲.۱ افزودن بخش جدید در تنظیمات عمومی
add_filter( 'woocommerce_get_sections_general', 'wcmo_add_settings_section' );
function wcmo_add_settings_section( $sections ) {
$sections['wcmo'] = __( 'حداقل مبلغ سفارش', 'wcmo' );
return $sections;
}
تابع woocommerce_get_sections_general یکی از فیلترهای داخلی ووکامرس است که لیست بخشهای تنظیمات عمومی را برمیگرداند (مانند «عمومی»، «محصولات»، «مالیات» و …).
در اینجا، با اضافه کردن یک کلید جدید به آرایهی $sections، بخشی جدید با عنوان «حداقل مبلغ سفارش» به تنظیمات اضافه میکنیم.
یعنی در پیشخوان → ووکامرس → تنظیمات → بخش «عمومی»، حالا یک تب جدید به نام «حداقل مبلغ سفارش» نمایش داده میشود.
۲.۲ افزودن فیلد تنظیم مقدار حداقل مبلغ
add_filter( 'woocommerce_get_settings_general', 'wcmo_add_settings', 10, 2 );
function wcmo_add_settings( $settings, $current_section ) {
if ( 'wcmo' === $current_section ) {
$settings = array();
$settings[] = array(
'name' => __( 'تنظیمات حداقل مبلغ سفارش', 'wcmo' ),
'type' => 'title',
'id' => 'wcmo_settings_title'
);
$settings[] = array(
'name' => __( 'حداقل مبلغ سبد خرید', 'wcmo' ),
'id' => 'wcmo_minimum_amount',
'type' => 'number',
'desc_tip' => __( 'مبلغ حداقل سفارش (بدون احتساب هزینه ارسال) را وارد کنید.', 'wcmo' ),
'default' => 50,
'desc' => __( 'مثال: اگر مقدار را 50 وارد کنید، کاربران باید حداقل ۵۰ واحد پولی خرید داشته باشند تا بتوانند پرداخت کنند.', 'wcmo' ),
);
$settings[] = array( 'type' => 'sectionend', 'id' => 'wcmo_settings_end' );
return $settings;
}
return $settings;
}
در این بخش تابع ما با فیلتر دوم woocommerce_get_settings_general کار میکند.
این فیلتر مسئول نمایش فیلدهای هر بخش تنظیمات است.
ما بررسی میکنیم که اگر بخش فعلی ($current_section) همان بخش 'wcmo' باشد، فیلد مخصوص خود را به تنظیمات اضافه کنیم.
درون تابع، آرایهای از فیلدها ساخته میشود که شامل موارد زیر است:
- یک عنوان بخش (type: title)
- یک فیلد عددی (number) برای تعیین حداقل مبلغ سفارش
id: شناسه تنظیم که بعداً برای ذخیره و بازیابی مقدار استفاده میشود (wcmo_minimum_amount)default: مقدار پیشفرض (۵۰ واحد پولی)descوdesc_tip: توضیحات راهنما برای مدیر سایت
sectionend: پایان بخش تنظیمات
در نتیجه، در پنل ووکامرس، مدیر سایت میتواند در این قسمت مقدار مورد نظر را (مثلاً ۱۰۰۰۰ تومان) وارد کند.
بخش ۳ – بررسی حداقل مبلغ سفارش در سبد خرید
این قسمت قلب اصلی افزونه است؛ جایی که منطق بررسی و جلوگیری از پرداخت اجرا میشود.
۳.۱ اتصال به اکشنها
add_action( 'woocommerce_checkout_process', 'wcmo_check_minimum_order' );
add_action( 'woocommerce_before_cart', 'wcmo_check_minimum_order' );
اینجا از دو اکشن استفاده شده است:
woocommerce_before_cart→ اجرا قبل از نمایش صفحه سبد خرید.woocommerce_checkout_process→ اجرا قبل از نهایی کردن پرداخت (Checkout).
هر دو اکشن، تابع wcmo_check_minimum_order را اجرا میکنند تا اطمینان حاصل شود که بررسی حداقل مبلغ در هر دو صفحه انجام میشود.
۳.۲ تعریف تابع بررسی مبلغ
function wcmo_check_minimum_order() {
$minimum = get_option( 'wcmo_minimum_amount', 50 );
$cart_subtotal = WC()->cart->get_subtotal();
if ( $cart_subtotal < $minimum ) {
$message = sprintf(
__( 'مبلغ فعلی سبد خرید شما %s است — حداقل مبلغ مورد نیاز برای پرداخت %s میباشد.', 'wcmo' ),
wc_price( $cart_subtotal ),
wc_price( $minimum )
);
if ( is_cart() ) {
wc_print_notice( $message, 'error' );
} else {
wc_add_notice( $message, 'error' );
}
}
}
بیایید خطبهخط این تابع را توضیح دهیم
۱️⃣ دریافت مقدار تنظیمشده توسط مدیر
$minimum = get_option( 'wcmo_minimum_amount', 50 );
تابع get_option() مقدار ذخیرهشده در تنظیمات وردپرس را برمیگرداند.
اگر مدیر هنوز چیزی تنظیم نکرده باشد، مقدار پیشفرض ۵۰ استفاده میشود.
۲️⃣ محاسبه مجموع سبد خرید
$cart_subtotal = WC()->cart->get_subtotal();
با استفاده از شیء سراسری WC() (کلاس اصلی ووکامرس) و متد cart->get_subtotal() جمع کل سبد خرید بدون هزینه ارسال و مالیات محاسبه میشود.
۳️⃣ مقایسه و ایجاد پیام خطا
if ( $cart_subtotal < $minimum ) {
$message = sprintf(
__( 'مبلغ فعلی سبد خرید شما %s است — حداقل مبلغ مورد نیاز برای پرداخت %s میباشد.', 'wcmo' ),
wc_price( $cart_subtotal ),
wc_price( $minimum )
);
در اینجا بررسی میشود که آیا جمع سبد خرید کمتر از مقدار حداقل تعیینشده است یا نه.
اگر بله، یک پیام خطا (Error Notice) تولید میشود.
تابع sprintf() برای قرار دادن مقادیر عددی درون متن استفاده میشود.
تابع wc_price() نیز عدد خام را به قالب پولی ووکامرس (شامل واحد پول و فرمت عددی) تبدیل میکند.
نمونه خروجی برای کاربر:
مبلغ فعلی سبد خرید شما ۴۵٬۰۰۰ تومان است — حداقل مبلغ مورد نیاز برای پرداخت ۵۰٬۰۰۰ تومان میباشد.
۴️⃣ نمایش پیام خطا در مکان مناسب
if ( is_cart() ) {
wc_print_notice( $message, 'error' );
} else {
wc_add_notice( $message, 'error' );
}
اگر کاربر در صفحه سبد خرید (is_cart()) باشد، از تابع wc_print_notice() برای نمایش مستقیم پیام استفاده میشود.
اما اگر در صفحه پرداخت (Checkout) باشد، از wc_add_notice() استفاده میشود تا خطا در بالای فرم پرداخت نمایش داده شود.
این تفاوت برای سازگاری بهتر با قالبها و UX ووکامرس در نظر گرفته شده است.
نتیجه عملکرد افزونه
عملکرد افزونه بهصورت خلاصه به این شکل است:
- مدیر فروشگاه وارد ووکامرس → تنظیمات → حداقل مبلغ سفارش میشود.
- مقدار حداقل خرید را (مثلاً ۱۰۰٬۰۰۰ تومان) تعیین و ذخیره میکند.
- هر زمان مشتری بخواهد تسویهحساب کند، افزونه بررسی میکند که مبلغ سبد خرید از مقدار تعیینشده بیشتر باشد.
- اگر مبلغ کمتر باشد، پیام خطا نمایش داده میشود و کاربر نمیتواند پرداخت را ادامه دهد.
- در نتیجه، سفارشهایی با مبلغ بسیار کم ثبت نخواهند شد.
مزایای استفاده از این افزونه
- کنترل بهتر بر سود و هزینه ارسال:
اگر هزینه ارسال برای سفارشهای کوچک بهصرفه نیست، با تعیین حداقل مبلغ از ضرر جلوگیری میشود. - افزایش میانگین ارزش سبد خرید (AOV):
مشتری مجبور میشود محصولات بیشتری به سبد خود اضافه کند تا به حد نصاب برسد. - انعطافپذیری کامل برای مدیر سایت:
مقدار حداقل خرید از تنظیمات قابل تغییر است و نیازی به ویرایش کد نیست. - سازگاری کامل با ووکامرس:
از اکشنها و فیلترهای بومی ووکامرس استفاده شده، بدون نیاز به افزونه اضافی.
پیشنهادات توسعه بیشتر
این افزونه پایهای است اما میتوانید آن را گسترش دهید، برای مثال:
- اعمال حداقل مبلغ برای دستهبندی خاص:
فقط برای محصولات مثلاً “مواد غذایی” یا “پوشاک”. - تغییر پیام خطا به دلخواه:
یا حتی لینک دادن به صفحه پیشنهادات برای افزایش خرید. - افزودن پشتیبانی از چند ارز (Multi Currency):
در صورت استفاده از افزونههای ارزی. - اعمال حداقل مبلغ بر اساس نقش کاربر (User Role):
مثلاً حداقل خرید متفاوت برای عمدهفروشها و مشتریان عادی.
جمعبندی
این کد یک افزونه کاربردی ووکامرس است که با چند خط PHP ساده میتواند:
- به تنظیمات ووکامرس بخش جدیدی با عنوان حداقل مبلغ سفارش اضافه کند،
- مبلغ حداقل خرید را از مدیر دریافت کند،
- قبل از پرداخت، سبد خرید را بررسی نماید،
- و در صورت کمتر بودن مبلغ، فرآیند پرداخت را متوقف و پیام خطا نمایش دهد.
این روش بدون نیاز به هیچ افزونه جانبی، از طریق Hookها و Option API وردپرس پیادهسازی شده و کاملاً با ووکامرس هماهنگ است.
کل کد
<?php
/**
* Plugin Name: حداقل مبلغ سفارش در ووکامرس
* Plugin URI: https://codegate.ir/
* Description: تعیین حداقل مبلغ سبد خرید (بدون هزینه ارسال) و جلوگیری از پرداخت اگر مبلغ کمتر از حد مجاز باشد.
* Version: 1.0
* Author: Saeed gharibi
* License: GPL2
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// 1. افزودن فیلد تنظیمات به بخش تنظیمات ووکامرس
add_filter( 'woocommerce_get_sections_general', 'wcmo_add_settings_section' );
function wcmo_add_settings_section( $sections ) {
$sections['wcmo'] = __( 'حداقل مبلغ سفارش', 'wcmo' );
return $sections;
}
add_filter( 'woocommerce_get_settings_general', 'wcmo_add_settings', 10, 2 );
function wcmo_add_settings( $settings, $current_section ) {
if ( 'wcmo' === $current_section ) {
$settings = array();
$settings[] = array(
'name' => __( 'تنظیمات حداقل مبلغ سفارش', 'wcmo' ),
'type' => 'title',
'id' => 'wcmo_settings_title'
);
$settings[] = array(
'name' => __( 'حداقل مبلغ سبد خرید', 'wcmo' ),
'id' => 'wcmo_minimum_amount',
'type' => 'number',
'desc_tip' => __( 'مبلغ حداقل سفارش (بدون احتساب هزینه ارسال) را وارد کنید.', 'wcmo' ),
'default' => 50,
'desc' => __( 'مثال: اگر مقدار را 50 وارد کنید، کاربران باید حداقل ۵۰ واحد پولی خرید داشته باشند تا بتوانند پرداخت کنند.', 'wcmo' ),
);
$settings[] = array( 'type' => 'sectionend', 'id' => 'wcmo_settings_end' );
return $settings;
}
return $settings;
}
// 2. بررسی مبلغ سبد خرید قبل از پرداخت
add_action( 'woocommerce_checkout_process', 'wcmo_check_minimum_order' );
add_action( 'woocommerce_before_cart', 'wcmo_check_minimum_order' );
function wcmo_check_minimum_order() {
$minimum = get_option( 'wcmo_minimum_amount', 50 );
$cart_subtotal = WC()->cart->get_subtotal();
if ( $cart_subtotal < $minimum ) {
$message = sprintf(
__( 'مبلغ فعلی سبد خرید شما %s است — حداقل مبلغ مورد نیاز برای پرداخت %s میباشد.', 'wcmo' ),
wc_price( $cart_subtotal ),
wc_price( $minimum )
);
if ( is_cart() ) {
wc_print_notice( $message, 'error' );
} else {
wc_add_notice( $message, 'error' );
}
}
}