آموزش کامل افزودن فیلد کد ملی به تسویه حساب ووکامرس (همراه با اعتبارسنجی)
اگر صاحب یک فروشگاه اینترنتی با ووکامرس هستید، بدون شک میدانید که صفحه تسویه حساب مهمترین نقطه تماس کاربر با کسبوکار شماست. در این مرحله اطلاعات حیاتی مشتری ثبت میشود و هر دادهای که در این بخش دریافت میکنید میتواند در مدیریت سفارشها، بازاریابی و حتی مسائل حقوقی به شما کمک کند.
یکی از مهمترین اطلاعات برای فروشگاههای ایرانی، کد ملی مشتری است. با این حال، ووکامرس به صورت پیشفرض فیلدی برای دریافت کد ملی ندارد. در این مقاله از وب دنج قصد داریم به صورت کاملاً تخصصی و سئو شده، نحوه افزودن فیلد کد ملی به تسویه حساب ووکامرس را همراه با اعتبارسنجی الگوریتم رسمی ثبت احوال، ذخیره در دیتابیس، نمایش در پنل مدیریت و ایمیلها آموزش دهیم.
چرا افزودن فیلد کد ملی در ووکامرس اهمیت دارد؟
کد ملی یک شناسه یکتای ۱۰ رقمی برای هر فرد ایرانی است. داشتن این داده در فروشگاه اینترنتی میتواند تحولی جدی در مدیریت سفارشها ایجاد کند.
مهمترین مزایای استفاده از کد ملی در صفحه تسویه حساب شامل موارد زیر است:
-
- مدیریت دقیق سفارشها: شما میتوانید سفارشهای یک فرد را تنها با جستجوی کد ملی در پنل مدیریت پیدا کنید.
- جلوگیری از ثبت سفارشهای تکراری یا سوءاستفاده: با اعتبارسنجی الگوریتمی، از ورود کدهای جعلی جلوگیری میشود.
- گزارشگیری حرفهای: در خروجی اکسل یا سیستمهای حسابداری، وجود کد ملی باعث یکپارچگی اطلاعات میشود.
- دستهبندی مشتریان: امکان ایجاد کمپینهای تخفیفی برای مشتریان خاص یا VIP فراهم میشود.
- استفاده در فاکتور رسمی: در بسیاری از فروشگاهها برای صدور فاکتور رسمی، دریافت کد ملی ضروری است.
ساختار و الگوریتم کد ملی ایرانی
برای اینکه سیستم شما حرفهای عمل کند، فقط افزودن یک فیلد ساده کافی نیست. باید کد ملی را طبق الگوریتم رسمی اعتبارسنجی کنید.
ویژگیهای اصلی کد ملی معتبر:
-
-
- طول دقیق آن باید ۱۰ رقم باشد.
- فقط شامل اعداد ۰ تا ۹ باشد.
- کدهای تکراری مانند 1111111111 یا 0000000000 معتبر نیستند.
- رقم دهم به عنوان چکدیجیت طبق الگوریتم مشخصی محاسبه میشود.
-
در این آموزش، تمام این موارد در کد لحاظ شده است تا هیچ کد ملی جعلی در دیتابیس شما ذخیره نشود.
کد کامل افزودن فیلد کد ملی به ووکامرس
<?php
// تابع بررسی صحت کد ملی (اصلاح شده)
function check_national_code($code) {
// بررسی طول و فقط اعداد
if (!preg_match('/^[0-9]{10}$/', $code)) {
return false;
}
// بررسی کدهای تکراری (0000000000 تا 9999999999)
for ($i = 0; $i < 10; $i++) {
if (preg_match('/^' . $i . '{10}$/', $code)) {
return false;
}
}
// الگوریتم محاسبه چک دیجیت
$sum = 0;
for ($i = 0; $i < 9; $i++) {
$sum += (10 - $i) * intval(substr($code, $i, 1));
}
$ret = $sum % 11;
$parity = intval(substr($code, 9, 1));
if (($ret < 2 && $ret == $parity) || ($ret >= 2 && $ret == 11 - $parity)) {
return true;
}
return false;
}
// اضافه کردن فیلد کد ملی به صفحه پرداخت
function add_custom_national_code_field() {
?>
<div class="form-row form-row-wide woocommerce-additional-fields__field-wrapper">
<label for="billing_national_code"><?php _e('کد ملی', 'woocommerce'); ?> <span class="required">*</span></label>
<span class="woocommerce-input-wrapper">
<input type="text"
class="input-text"
name="billing_national_code"
id="billing_national_code"
value="<?php echo esc_attr(wp_unslash($_POST['billing_national_code'] ?? '')); ?>"
maxlength="10"
pattern="[0-9]{10}"
placeholder="1234567890"
autocomplete="off" />
</span>
</div>
<?php
}
add_action('woocommerce_after_checkout_billing_form', 'add_custom_national_code_field');
// اعتبارسنجی فیلد
function validate_custom_national_code_field() {
$code = isset($_POST['billing_national_code']) ? sanitize_text_field(wp_unslash($_POST['billing_national_code'])) : '';
if (empty($code)) {
wc_add_notice(__('لطفاً کد ملی خود را وارد کنید.', 'woocommerce'), 'error');
return;
}
if (!check_national_code($code)) {
wc_add_notice(__('کد ملی وارد شده معتبر نیست.', 'woocommerce'), 'error');
}
}
add_action('woocommerce_checkout_process', 'validate_custom_national_code_field');
// ذخیره کد ملی در سفارش
function save_custom_national_code_field($order_id) {
if (!empty($_POST['billing_national_code'])) {
$code = sanitize_text_field(wp_unslash($_POST['billing_national_code']));
if (check_national_code($code)) {
update_post_meta($order_id, '_billing_national_code', $code);
}
}
}
add_action('woocommerce_checkout_update_order_meta', 'save_custom_national_code_field');
// نمایش در پنل مدیریت (اصلاح شده)
function display_admin_order_national_code($order) {
$national_code = get_post_meta($order->get_id(), '_billing_national_code', true);
if ($national_code) {
echo '<p><strong>' . __('کد ملی', 'woocommerce') . ':</strong> ' . esc_html($national_code) . '</p>';
}
}
add_action('woocommerce_admin_order_data_after_billing_address', 'display_admin_order_national_code', 10, 1);
// نمایش در ایمیلها و My Account
function display_national_code_in_order($order) {
$national_code = get_post_meta($order->get_id(), '_billing_national_code', true);
if ($national_code) {
echo '<p><strong>کد ملی:</strong> ' . esc_html($national_code) . '</p>';
}
}
add_action('woocommerce_order_details_after_order_table', 'display_national_code_in_order');
?>
نحوه نصب کد در وردپرس
برای اضافه کردن این قابلیت به سایت خود دو روش استاندارد دارید.
روش اول: افزودن به فایل functions.php
وارد پیشخوان وردپرس شوید، از بخش نمایش وارد ویرایشگر پوسته شوید و فایل functions.php قالب فرزند را باز کنید. کد بالا را در انتهای فایل قرار دهید و ذخیره کنید. استفاده از قالب چایلد توصیه میشود تا در بروزرسانی قالب، تغییرات شما حذف نشود.
روش دوم: ساخت افزونه اختصاصی
یک پوشه جدید در مسیر wp-content/plugins ایجاد کنید. یک فایل PHP داخل آن قرار دهید و کد بالا را در آن قرار دهید. سپس افزونه را از پنل وردپرس فعال کنید. این روش حرفهایتر است و وابسته به قالب نخواهد بود.
نمایش کد ملی در پنل مدیریت و سفارشها
پس از ثبت سفارش، کد ملی در متای سفارش ذخیره میشود. شما میتوانید آن را در بخش جزئیات سفارش، زیر اطلاعات صورتحساب مشاهده کنید. همچنین امکان توسعه کد برای نمایش در ایمیلها، پنل کاربری مشتری و حتی فاکتورهای PDF وجود دارد.
نکات امنیتی مهم در ذخیره کد ملی
در این پیادهسازی از توابع sanitize_text_field برای پاکسازی ورودی و ساختار استاندارد هوکهای ووکامرس استفاده شده است. این موضوع از حملات XSS جلوگیری میکند و باعث میشود اطلاعات به شکل ایمن در دیتابیس ذخیره شوند.
همچنین اعتبارسنجی الگوریتمی باعث میشود هیچ داده اشتباهی وارد سیستم نشود و دیتابیس شما تمیز و قابل اعتماد باقی بماند.
مشکلات رایج و راهحلها
اگر فیلد نمایش داده نمیشود، ابتدا کش سایت و افزونههای کش را پاک کنید. در صورتی که خطای PHP دریافت کردید، مطمئن شوید کد را به درستی داخل تگ php قرار دادهاید. اگر مقدار ذخیره نمیشود، بررسی کنید که هوک woocommerce_checkout_update_order_meta به درستی اجرا شود.
آیا این کد با بروزرسانی ووکامرس سازگار است؟
بله. چون از هوکهای استاندارد ووکامرس استفاده شده، با بروزرسانیهای آینده دچار مشکل نخواهد شد. این روش کاملاً اصولی و مطابق با استاندارد توسعه وردپرس است.
جمعبندی نهایی
افزودن فیلد کد ملی به صفحه تسویه حساب ووکامرس یک قابلیت حرفهای و ضروری برای فروشگاههای ایرانی است. با استفاده از کدی که در این مقاله از وب دنج ارائه شد، شما میتوانید یک سیستم کامل، امن و استاندارد برای دریافت و اعتبارسنجی کد ملی پیادهسازی کنید.
این آموزش به صورت عملی تست شده و روی نسخههای جدید ووکامرس بدون مشکل اجرا میشود. اگر در پیادهسازی آن سوالی داشتید، میتوانید در بخش دیدگاههای سایت وب دنج مطرح کنید تا راهنمایی شوید.

