اگر تا به امروز برای افزودن فرم تماس به سایت وردپرستان به افزونههای پیچیده وابسته بودید، شاید وقت آن رسیده که یک روش مستقل و انعطافپذیر را امتحان کنید. در این راهنمای گامبهگام، با کدهای ساده اما قدرتمند، ساختار HTML، پردازش PHP و تنظیمات ایمیل را از صفر میسازید. هر بخش با توضیح مختصر و نکات عملی همراه است تا درک دقیقتری از نحوه کار هر قطعه داشته باشید. بهعلاوه، نکات امنیتی و بهینهسازی را نیز میآموزید تا فرمتان هم کارآمد و هم ایمن بماند. با پیروی از این راهکارها، میتوانید فرم تماس سفارشی خود را بدون وابستگی به افزونههای سنگین، بهسرعت در هر پوستهای پیادهسازی کنید. نتیجهگیری این است که کنترل کامل بر ظاهر و رفتار فرم، در دسترس شماست و میتوانید آن را مطابق نیازهای دقیق سایتتان تنظیم کنید.
فهرست مطالب
- درک ساختار فرم ساده HTML
- ایجاد فیلدهای ورودی با کد
- افزودن اعتبارسنجی سمت کلاینت
- تنظیم ارسال ایمیل وردپرس
- محافظت از فرم با nonce و CAPTCHA
- تست و رفع اشکال نهایی
- سوالات متداول
درک ساختار فرم ساده HTML
در ابتدا برای ساخت یک فرم تماس ساده، باید به دو بخش اصلی فرم - ساختار کلی (تگ
مرتبط باشد. برچسب (label) نه تنها دسترسیپذیری را بالا میبرد، بلکه کاربر را بهصورت واضح راهنمایی میکند. برای هر یا ، ویژگی name الزامی است؛ این نام، کلید دادهای است که به اسکریپت پردازشکننده (مثلاً PHP یا یک webhook) ارسال میشود. همچنین میتوانید از ویژگی required برای اجباریسازی پر کردن فیلد استفاده کنید.
در ادامه یک جدول فشرده از رایجترین فیلدهای فرم تماس آورده شده است. این جدول میتواند بهسرعت بهعنوان یک چکلیست برای اطمینان از پوشش تمام نیازهای اساسی فرم استفاده شود.
| فیلد | تگ HTML | ویژگیهای کلیدی |
|---|---|---|
| نام | |
name="user_name"، required |
| ایمیل | |
name="user_email"، required |
| موضوع | |
name="subject" |
| متن پیام | |
name="message"، rows="5" |
| دکمه ارسال | |
متن دکمه (مثلاً «ارسال») |
بهعنوان مثال، یک فرم تماس پایه میتواند به این صورت کدنویسی شود:
نکتهٔ عملی: قبل از افزودن این فرم به قالب وردپرس، حتماً از تابع wp_nonce_field() برای جلوگیری از حملات CSRF استفاده کنید و در فایل functions.php یک هک (hook) به admin_post_nopriv_* و admin_post_* اضافه کنید تا دادهها بهدرستی پردازش شوند. این تنظیمات ساده باعث میشود فرم شما امن، قابلاعمال و بدون نیاز به افزونهٔ فرمساز باشد.
ایجاد فیلدهای ورودی با کد
برای ساخت یک فرم تماس ساده در وردپرس بدون استفاده از افزونه، اولین گام اضافه کردن فیلدهای ورودی بهصورت کد است. میتوانید این کد را در فایل قالب (مثلاً page-contact.php) یا داخل یک shortcode بگذارید تا در هر صفحهای قابل فراخوانی باشد. در اینجا از عناصر استاندارد HTML مانند و استفاده میکنیم و نوع دادهٔ مورد انتظار را با ویژگی type مشخص میکنیم.
یک فرم پایهای معمولاً شامل فیلدهای نام، ایمیل و پیام است. برای هر فیلد یک برچسب () همراه با شناسهٔ یکتا (id) تعریف میکنید تا دسترسیپذیری بهبود یابد. مثال زیر، ساختار اولیهٔ فرم را نشان میدهد:
بعد از دریافت دادهها، مهم است که ورودیها را پاکسازی (sanitize) و اعتبارسنجی کنید تا از حملات XSS و injection جلوگیری شود. در هوک admin_post_nopriv_handle_contact_form میتوانید از توابع وردپرس مانند sanitize_text_field()، sanitize_email() و wp_kses_post() استفاده کنید. نمونهای از پردازش دادهها به شکل زیر است:
function handle_contact_form() {
if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'contact_form' ) ) {
wp_die( 'دسترسی غیرمجاز' );
}
$name = sanitize_text_field( $_POST['cf_name'] );
$email = sanitize_email( $_POST['cf_email'] );
$message = wp_kses_post( $_POST['cf_message'] );
// در اینجا میتوانید ایمیل بفرستید یا در دیتابیس ذخیره کنید
wp_redirect( home_url( '/thanks/' ) );
exit;
}
add_action( 'admin_post_nopriv_handle_contact_form', 'handle_contact_form' );
add_action( 'admin_post_handle_contact_form', 'handle_contact_form' );
| فیلد | عنصر HTML | توابع پاکسازی | قیدهای اعتبارسنجی |
|---|---|---|---|
| نام | | sanitize_text_field() | required, minlength = 2 |
| ایمیل | | sanitize_email() | required, format email |
| پیام | |
wp_kses_post() |
required, maxlength = 500 |
برای ایمنسازی نهایی، حتماً از nonce استفاده کنید؛ این مقدار یک توکن یکبار مصرف است که ارسال فرم را از دسترسیهای غیرمجاز محافظت میکند. همچنین، بهجای پردازش مستقیم در همان صفحه، از هوکهای admin_post یا admin_post_nopriv بهره بگیرید؛ این کار به جداسازی منطق فرم از نمایش محتوا کمک میکند و نگهداری کد را سادهتر میسازد.
افزودن اعتبارسنجی سمت کلاینت
اعتبارسنجی سمت کلاینت نقش اساسی در بهبود تجربه کاربری و کاهش بار پردازشی سرور دارد. وقتی کاربر فرم را پر میکند، میتوان خطاهای واضح مثل فیلدهای خالی یا فرمت نادرست ایمیل را بلافاصله نشان داد و از ارسال درخواستهای نادرست جلوگیری کرد. این کار نه تنها از نارضایتی کاربران جلوگیری میکند، بلکه میزان درخواستهای ناموفق به سرور را بهطور چشمگیری کم میکند.
سادهترین راه برای پیادهسازی اعتبارسنجی، استفاده از ویژگیهای داخلی HTML5 است. ویژگیهای required، type="email"، pattern، minlength و maxlength بهسرعت میتوانند اکثر نیازهای پایه را پوشش دهند. برای مثال، افزودن required به فیلد پیام، تضمین میکند که کاربر حداقل یک مقدار وارد کرده باشد، در حالی که type="email" بهطور خودکار قالب ایمیل را چک میکند.
برای مواردی که نیاز به قواعد پیچیدهتر دارید، میتوانید از جاوااسکریپت استفاده کنید. در ادامه یک مثال کوتاه آورده شده که با استفاده از addEventListener فرم را قبل از ارسال بررسی میکند و در صورت عدم تطابق الگوی ایمیل، پیام خطا نمایش میدهد:
document.getElementById('contact-form').addEventListener('submit', function(e) {
var email = document.getElementById('email').value;
var emailPattern = /^[^s@]+@[^s@]+.[^s@]+$/;
if (!emailPattern.test(email)) {
e.preventDefault();
alert('لطفاً یک ایمیل معتبر وارد کنید.');
}
});
در جدول زیر ترکیبی از ویژگیهای HTML5 و چکهای جاوااسکریپت را بهصورت خلاصه نشان میدهد تا بتوانید به سرعت تصمیم بگیرید که کدام روش برای هر فیلد مناسب است:
| قالب اعتبارسنجی | ویژگی / کد | موارد استفاده رایج |
|---|---|---|
| HTML5 | required | فیلدهای اجباری (نام، پیام) |
| HTML5 | type="email" | آدرس ایمیل |
| HTML5 | pattern="^[0-9]{10}$" | شماره تلفن ثابت 10 رقمی |
| جاوااسکریپت | RegExp + event.preventDefault() | قواعد پیچیده (حداکثر طول پیام، چک اسپم) |
تنظیم ارسال ایمیل وردپرس
در بیشتر سرورهای اشتراکگذاری، تابع پیشفرض wp_mail() که بر پایه mail() پیاچپی کار میکند، بهدلیل محدودیتهای پیکربندی یا فیلترهای اسپم، ایمیلها بهصورت ناهموار یا حتی بهکل ارسال نمیشوند. برای اطمینان از تحویل قابلاعتماد، بهتر است ارسال ایمیل را به یک سرویس SMTP معتبر (مانند Gmail, Outlook یا یک سرویس ایمیل تجاری) منتقل کنید؛ این کار نه تنها نرخ تحویل را بالا میبرد، بلکه امکان پیگیری خطاها را نیز میسر میسازد.
برای تنظیم SMTP در وردپرس، تنها کافی است یک افزونهٔ سبک مانند WP SMTP نصب کنید و مقادیر زیر را در صفحه تنظیمات وارد کنید:
- سرور SMTP (مثلاً
smtp.gmail.com) - پورت (۲۲۵ یا ۵۸۷ برای TLS/SSL)
- روش رمزنگاری (TLS یا SSL)
- نام کاربری و رمز عبور حساب ایمیل
پس از ذخیره، افزونه بهصورت خودکار wp_mail() را بازنویسی میکند تا تمام ایمیلهای وردپرس-including فرم تماس سادهٔ شما-از طریق این سرور ارسال شوند.
اگر نمیخواهید از افزونه استفاده کنید، میتوانید کد زیر را به فایل functions.php قالب خود اضافه کنید. این قطعه کد بهصورت مستقیم با PHPMailer داخلی وردپرس کار میکند و تنظیمات SMTP را اعمال مینماید:
add_action( 'phpmailer_init', function( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.example.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Port = 587;
$phpmailer->Username = 'your@email.com';
$phpmailer->Password = 'yourpassword';
$phpmailer->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
});سپس میتوانید فرم تماس ساده را با توابع زیر بهسرعت پیادهسازی کنید؛ توجه داشته باشید که wp_mail() بهصورت خودکار از تنظیمات بالا استفاده میکند:
$to = 'admin@yourdomain.com';
$subject = 'پیام جدید از فرم تماس';
$message = "نام: $namenایمیل: $emailnمتن: $message";
$headers = array('Content-Type: text/plain; charset=UTF-8');
wp_mail( $to, $subject, $message, $headers );| سرویس | سرور SMTP | پورت | رمزنگاری |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587 | TLS |
| Outlook/Office 365 | smtp.office365.com | 587 | TLS |
| Zoho Mail | smtp.zoho.com | 465 | SSL |
در نهایت، برای اطمینان از عملکرد صحیح، یک ایمیل تستی از طریق صفحهٔ تماس ارسال کنید و با استفاده از افزونهٔ WP Mail Logging یا ابزارهای لاگسرور، هدرها و پاسخهای SMTP را بررسی کنید. اگر خطایی مشاهده شد، پیامهای خطا معمولاً حاوی توضیحاتی دربارهٔ ناموفق بودن اعتبارسنجی یا پورتهای مسدود شده هستند که میتوانید بهسرعت آنها را رفع کنید.
محافظت از فرم با nonce و CAPTCHA
یکی از بزرگترین خطرهای فرمهای تماس، حملات CSRF (Cross‑Site Request Forgery) است که مهاجمان با ارسال درخواستهای جعلی میتوانند دادههای فرم را بهصورت خودکار پر کرده و سرور را گمراه کنند. برای رفع این مشکل در فرم سفارشی وردپرس، میتوانید از nonce استفاده کنید؛ nonce مخفف «number used once» است و یک توکن تصادفی و موقت میسازد که هر بار صفحه بارگذاری میشود تغییر میکند. توکن را میتوانید با wp_create_nonce('my_contact_form') تولید و در یک فیلد پنهان قرار دهید؛ سپس هنگام پردازش فرم با check_admin_referer('my_contact_form', 'my_form_nonce') اعتبارسنجی کنید.
اگر فرم شما در دسترس عمومی است، افزودن لایهای دیگر امنیتی مانند CAPTCHA توصیه میشود تا روباتها نتوانند بهسرعت فرم را پر کنند. دو گزینهٔ رایج وجود دارد: Google reCAPTCHA v2 (چکباکس «من ربات نیستم») و reCAPTCHA v3 (امتیاز مخفی). نسخهٔ v2 برای سایتهای کوچک که کاربران تمایل به کلیک دارند مناسب است، در حالی که v3 برای تجربهٔ کاربری بیوقفه و تشخیص هوشمند تر مناسبتر است. برای استفاده، کافیست کلیدهای سایت و مخفی را از پانل گوگل دریافت کنید و اسکریپت مربوطه را در هدر یا فوتر قالب بارگذاری کنید.
| ویژگی | reCAPTCHA v2 | reCAPTCHA v3 |
|---|---|---|
| نوع تعامل | کلیک روی چکباکس | بدون تعامل کاربر |
| پیادهسازی | اسکریپت ساده + توکن مخفی | اسکریپت پیشرفته + امتیاز بر پایهٔ JavaScript |
| تجربه کاربری | محدودیتهای زمانی برای حل چالش | کاملا شفاف، فقط در پسزمینه بررسی میشود |
در عمل، ترکیب nonce و CAPTCHA بهصورت زیر میتواند امنیت فرم را تضمین کند: ۱) توکن nonce را در فرم قرار دهید؛ ۲) اسکریپت reCAPTCHA را اضافه کنید و توکن دریافتشده را بهعنوان یک فیلد مخفی دیگر بفرستید؛ ۳) در فایل پردازش فرم، ابتدا check_admin_referer را اجرا کنید، سپس $_POST['g-recaptcha-response'] را به سرویس Google بفرستید و پاسخ را بررسی کنید. اگر هر دو اعتبارسنجی موفق بود، میتوانید ایمیل یا دیتابیس را بهروز کنید؛ در غیر این صورت درخواست را رد کنید.
تست و رفع اشکال نهایی
پس از افزودن فرم تماس به تم، اولین گام تست عملکرد است. برای این کار فرم را در یک صفحه آزمایشی باز کنید و هر فیلد را با دادههای معتبر پر کنید. سپس دکمه ارسال را کلیک کنید و مطمئن شوید ایمیل به آدرس مقصد میرسد؛ اگر ایمیل دریافت نشد، به لاگ سرور (مانند wp_mail()) نگاه کنید یا از افزونهای مثل WP Mail Logging برای ضبط درخواستهای ایمیل استفاده کنید.
اگر فرم به درستی ارسال میشود اما مقادیر وارد شده در ایمیل ناقص یا به شکل نامنظم ظاهر میشوند، احتمالاً قالببندی قالب (template) ایمیل دچار مشکل است. در فایل functions.php یا فایلی که پیام ایمیل را میسازد، تگهای HTML را با دقت بررسی کنید؛ بهویژه استفاده از nl2br() برای تبدیل خطهای جدید به یا تابع sanitize_text_field() برای پاکسازی دادهها. اصلاح این توابع معمولاً مشکل نمایش نادرست را رفع میکند.
در برخی موارد فرم ممکن است بهدلیل تداخل اسکریپتهای جاوااسکریپت دیگر صفحه (مانند اسلایدر یا منوهای تعاملی) از کار بیفتد. برای شناسایی این تداخل، ابتدا تمام اسکریپتهای غیرضروری را موقتاً غیرفعال کنید و دوباره تست کنید. اگر مشکل رفع شد، میتوانید اسکریپتهای باقیمانده را با استفاده از توابع wp_enqueue_script() بهصورت «defer» یا «async» بارگذاری کنید تا ترتیب اجرا بهبود یابد.
| مشکل رایج | راهحل پیشنهادی |
|---|---|
| ایمیل دریافت نمیشود | بررسی تنظیمات wp_mail()، استفاده از سرویس SMTP (مانند WP Mail SMTP) و فعالسازی لاگ ایمیل. |
| متن ایمیل نامرتب است | استفاده از توابع nl2br() یا wpautop()، و اطمینان از پاکسازی ورودی با sanitize_text_field(). |
| دکمه ارسال کار نمیکند | بررسی خطاهای جاوااسکریپت در کنسول مرورگر، حذف اسکریپتهای تداخلساز و بارگذاری اسکریپت فرم با defer. |
| فیلدهای اجباری رد میشوند | اطمینان از اضافه کردن ویژگی required به ورودیها و بررسی تابع اعتبارسنجی سروری (validate_contact_form()). |
در نهایت، برای اطمینان از سازگاری فرم با مرورگرهای مختلف، صفحه تست را در Chrome, Firefox و Safari باز کنید. اگر در یکی از مرورگرها نمایش متفاوتی مشاهده کردید، بهخصوص در دستگاههای موبایل، از ابزارهای توسعه (DevTools) برای شناسایی CSSهای متناقض استفاده کنید و استایلهای مرتبط با فرم را در یک فایل جداگانه (مثلاً contact-form.css) بهروز کنید. این کار نه تنها مشکلات ظاهری را برطرف میکند، بلکه تجربه کاربری سازگار و حرفهایتری فراهم میسازد.
سوالات متداول
چطور میتوانم فرم تماس ساده با HTML بسازم؟
ابتدا یک فرم با تگ form بسازید و فیلدهای نام، ایمیل و پیام را اضافه کنید. از ویژگی required برای اجباری کردن پر کردن استفاده کنید. مسیر action را به فایلی که پردازش PHP انجام میدهد، تنظیم کنید.
آیا نیاز به تنظیمات سرور برای ارسال ایمیل دارم؟
برای ارسال ایمیل به PHP نیاز به تابع mail یا کتابخانهای مثل PHPMailer دارید. سرور باید امکان ارسال ایمیل از طریق تابع mail را فعال داشته باشد. اگر در localhost تست میکنید، ممکن است نیاز به تنظیمات SMTP داشته باشید.
چطور میتوانم اسکریپت PHP ارسال ایمیل را امن کنم؟
برای امنیت بهتر ورودیها را با تابع htmlspecialchars یا filter_var پاکسازی کنید. همچنین از توکنهای nonce برای جلوگیری از CSRF استفاده کنید. فایل PHP را در پوشهای خارج از دسترس عمومی قرار ندهید.
فرم من پس از ارسال خالی نمیشود، چرا؟
معمولاً پس از ارسال باید با جاوااسکریپت یا PHP مقادیر فیلدها را پاک کنید. میتوانید از ویژگی reset در فرم یا دستور unset برای متغیرهای POST استفاده کنید. همچنین از جلوگیری مرورگر از ذخیره خودکار مطمئن شوید.
چکلیست سریع
- ساختار پایه یک فرم HTML را بهصورت ساده درک کنید.
- فیلدهای متنی، ایمیل و متنپیام را با تگهای مناسب اضافه کنید.
- با JavaScript یا ویژگیهای HTML5 اعتبارسنجی سمت کاربر را فعال کنید.
- تابع wp_mail را تنظیم کنید تا پیامها به ایمیل موردنظر ارسال شوند.
- nonce و CAPTCHA را برای محافظت در برابر حملات پیادهسازی کنید.
- فرم را تست کنید و خطاهای احتمالی را رفع نمایید.
با اجرای این مراحل، میتوانید فرم تماس کاملاً سفارشی و ایمن را بدون نیاز به افزونه، مستقیماً در قالب خود پیاده کنید. این روش نه تنها بار اضافی سرور را کاهش میدهد، بلکه کنترل کامل بر ظاهر و رفتار فرم را به دست میگیرید. اگر سؤال یا تجربهای در این زمینه دارید، خوشحال میشوم آن را با شما بهاشتراک بگذارم.

