حل خطای An account is already registered در ووکامرس
- مقالات آموزشی
- بروزرسانی شده در
خطای An account is already registered with your email address معمولاً وقتی دیده میشه که ایمیل مشتری از قبل در سایتتون ثبت شده، ولی ووکامرس موقع پرداخت دوباره میخواد برای همون ایمیل حساب تازهای بسازه. برای رفعش اول باید تنظیمات خرید مهمان، ورود و ساخت حساب رو بررسی کنید. اگه از تسویهحساب کلاسیک استفاده میکنید، میتونید در شرایط مشخص از قطعهکد هم کمک بگیرید.
نکته مهم اینه که تسویهحساب کلاسیک با بلوک تسویهحساب ووکامرس یکسان نیست. کدی که روی فرم کلاسیک کار میکنه، لزوماً روی بلوک جدید جواب نمیده. پس در این راهنما اول نوع صفحه پرداخت رو پیدا میکنیم، بعد راهحل مناسب همون صفحه رو قدمبهقدم جلو میبریم.
آنچه در این مقاله میخوانید
خطای An account is already registered with your email address یعنی چی؟
معنی ساده این پیام اینه: «یک حساب از قبل با این آدرس ایمیل ثبت شده». این پیام بهخودیخود نشونه خرابشدن سایت یا درگاه پرداخت نیست. ووکامرس فقط اجازه نمیده دو حساب کاربری با یک ایمیل یکسان ساخته بشه.
این خطا چه زمانی در صفحه تسویهحساب دیده میشه؟
این خطا بیشتر وقتی دیده میشه که مشتری قبلاً در سایتتون حساب ساخته، اما این بار بدون ورود وارد صفحه پرداخت شده. اگه گزینه ساخت حساب هم در سفارش فعال باشه، ووکامرس تلاش میکنه حساب تازهای با همون ایمیل بسازه و جلوی ادامه کار رو میگیره.
ممکنه مشتری اصلاً یادش نباشه که قبلاً عضو شده. گاهی هم حساب موقع یکی از خریدهای قبلی ساخته شده و مشتری هنوز رمز عبورش رو تعیین نکرده. در چنین شرایطی، نمایش واضح لینک ورود و بازیابی رمز عبور خیلی مهمه.
چطور بفهمید مشکل از حساب قبلی مشتریه؟
از پیشخوان وردپرس وارد «کاربران» بشید و ایمیلی رو جستوجو کنید که خطا برای اون نمایش داده شده. اگه کاربری با همون ایمیل پیدا شد، علت اصلی مشخصه. برای حفظ حریم خصوصی، فقط به مشتری بگید با اون ایمیل حسابی ثبت شده و باید وارد بشه یا رمز عبورش رو بازیابی کنه؛ هیچ اطلاعات دیگهای از حساب رو نمایش ندید.
قبل از رفع خطا، نوع صفحه تسویهحسابتون رو پیدا کنید
تفاوت تسویهحساب کلاسیک و بلوک تسویهحساب ووکامرس
تسویهحساب کلاسیک همون فرم قدیمی ووکامرسه که معمولاً با کد کوتاه [woocommerce_checkout] داخل برگه قرار میگیره. بلوک تسویهحساب نسخه جدیدتر صفحه پرداخت هست و درخواستهاش رو از راه Store API پردازش میکنه. Store API یعنی مسیر ارتباطیای که بلوکهای سبد خرید و پرداخت از راه اون اطلاعات سفارش رو برای ووکامرس میفرستن.
این تفاوت فقط ظاهری نیست. هوکها، یعنی نقاطی که کدهای سفارشی به روند ووکامرس وصل میشن، در این دو روش میتونن متفاوت باشن. به همین دلیل نباید قطعهکد کلاسیک رو بهعنوان راهحل عمومی هر صفحه پرداختی استفاده کنید.
روش تشخیص نوع صفحه تسویهحساب
از پیشخوان وارد «برگهها» بشید و برگه تسویهحساب رو ویرایش کنید. اگه داخل ویرایشگر بلوکی با عنوان «تسویهحساب» میبینید، صفحه شما بلوکیه. اگه فقط کد کوتاه [woocommerce_checkout] رو میبینید، از تسویهحساب کلاسیک استفاده میکنید.
بعد از اون، مسیر «ووکامرس ← پیکربندی ← پیشرفته» رو هم بررسی کنید و مطمئن بشید همین برگه بهعنوان برگه تسویهحساب انتخاب شده. ممکنه قالب یا افزونه صفحهساز، برگه متفاوتی رو به مشتری نشون بده؛ پس صفحهای رو بررسی کنید که واقعاً هنگام خرید باز میشه.
راهحل سریع از تنظیمات ووکامرس
قبل از اضافهکردن هر کدی، تنظیمات خود ووکامرس رو درست کنید. از پیشخوان به «ووکامرس ← پیکربندی ← حسابها و حریم خصوصی» برید.

عنوان دقیق گزینهها ممکنه با ترجمه فارسی نصب شما کمی فرق داشته باشه، ولی گزینههای مربوط به خرید مهمان، ورود و ساخت حساب در همین صفحه هستن.
فعالکردن خرید مهمان
اگه محصولاتتون برای تحویل یا استفاده به حساب کاربری نیاز ندارن، گزینهای رو فعال کنید که به مشتری اجازه میده بدون حساب سفارش ثبت کنه. با خرید مهمان، ووکامرس مجبور نیست برای هر پرداخت یک کاربر تازه بسازه.
برای آشنایی بیشتر با رفتار سفارشهای مهمان، راهنمای ثبت مشتری بهعنوان مهمان در سفارشهای ووکامرس هم میتونه کمکتون کنه.
فعالکردن ورود مشتری در صفحه تسویهحساب
گزینه ورود هنگام تسویهحساب رو فعال کنید تا مشتریای که قبلاً حساب ساخته، همونجا وارد حسابش بشه. بهتره لینک بازیابی رمز عبور هم واضح و در دسترس باشه. این کار به مشتری راه خروج از خطا رو نشون میده و احتمال رهاکردن خرید رو کمتر میکنه.
تنظیم ساخت حساب و لینک تعیین رمز عبور
در همون صفحه تنظیمات مشخص کنید مشتری چه زمانی اجازه ساخت حساب داره. اگه ساخت حساب حین یا بعد از پرداخت رو فعال میکنید، گزینه استفاده از ایمیل بهعنوان شناسه ورود و فرستادن لینک تعیین رمز عبور رو هم بررسی کنید. این روش باعث میشه مشتری مجبور نباشه وسط پرداخت یک رمز تازه انتخاب کنه.

بعد از ذخیره تنظیمات، با یک ایمیل تازه و یک ایمیل ثبتشده آزمایش انجام بدید. فقط فعالکردن گزینهها کافی نیست، چون افزونه عضویت یا قالب سفارشی میتونه رفتار فرم رو تغییر بده.
چه فروشگاههایی نباید خرید مهمان رو فعال کنن؟
اگه مشتری برای دسترسی به محصول، اشتراک، دانلود محافظتشده، دوره آموزشی یا پنل خدماتی به حساب نیاز داره، خرید مهمان ممکنه مناسب نباشه. در این فروشگاهها بهتره ورود و بازیابی رمز عبور رو ساده کنید و ساخت حساب تکراری رو از مسیر درست همون سیستم عضویت کنترل کنید.
اگه مطمئن نیستید، یک سفارش آزمایشی کامل ثبت کنید و ببینید مشتری بعد از پرداخت چطور به خریدش دسترسی میگیره. تصمیم نهایی باید با شیوه تحویل محصولتون هماهنگ باشه.
رفع خطا در تسویهحساب کلاسیک ووکامرس
اگه تنظیمات خرید مهمان درست هست، ولی فرم کلاسیک هنوز میخواد برای ایمیل ثبتشده حساب تازه بسازه، قطعهکد زیر میتونه درخواست ساخت حساب رو برای همون سفارش غیرفعال کنه. این راهحل فقط برای تسویهحساب کلاسیک نوشته شده.

قبل از اضافهکردن کد از سایتتون نسخه پشتیبان بگیرید
قبل از تغییر کد، از فایلها و پایگاه داده سایتتون نسخه پشتیبان بگیرید. بهتره اول تغییر رو روی سایت آزمایشی اجرا کنید. سایت آزمایشی نسخهای جدا از فروشگاه اصلیه که میتونید تغییرات رو بدون ایجاد مشکل برای مشتریها روی اون امتحان کنید.
کد رو کجا قرار بدید؟
- ساخت یک افزونه اختصاصی کوچک: انتخاب مطمئنتریه، چون کد با عوضشدن یا بهروزرسانی قالب از بین نمیره.
- استفاده از افزونه مدیریت قطعهکد: برای تازهکارها سادهتره و معمولاً میتونید کد مشکلدار رو بدون ویرایش فایل غیرفعال کنید.
- استفاده از فایل
functions.phpقالب فرزند: این روش قابلاستفادهست، ولی کد به قالب وابسته میمونه. قالب فرزند نسخهای جدا برای تغییراته تا بهروزرسانی قالب اصلی تغییراتتون رو پاک نکنه.
کد رو مستقیم داخل فایل functions.php قالب اصلی قرار ندید. یک خطای تایپی هم میتونه سایت رو از دسترس خارج کنه و بهروزرسانی قالب هم ممکنه کدتون رو پاک کنه.
اضافهکردن قطعهکد برای جلوگیری از ساخت حساب تکراری
کد زیر ایمیل صورتحساب رو بررسی میکنه. اگه این ایمیل از قبل به یک کاربر وردپرس تعلق داشته باشه، درخواست ساخت حساب تازه رو برای همون پرداخت خاموش میکنه:
function mihanwp_disable_duplicate_account_creation( $data ) { if ( empty( $data['billing_email'] ) ) { return $data; } $email = sanitize_email( $data['billing_email'] ); if ( $email && email_exists( $email ) ) { $data['createaccount'] = 0; } return $data;}add_filter( 'woocommerce_checkout_posted_data', 'mihanwp_disable_duplicate_account_creation' );بعد از ذخیره کد، صفحه پرداخت رو با حالت ناشناس مرورگر باز کنید و همه حالتهای گفتهشده در بخش تست رو انجام بدید. اگه سایتتون عضویت اجباری داره، از این کد استفاده نکنید؛ چون خاموششدن ساخت حساب میتونه با شیوه تحویل محصولتون ناسازگار باشه.
این قطعهکد چطور ایمیل ثبتشده رو تشخیص میده؟
تابع sanitize_email() اول ایمیل واردشده رو پاکسازی میکنه. بعد تابع email_exists() بررسی میکنه که کاربری با اون ایمیل در وردپرس ثبت شده یا نه. اگه نتیجه مثبت باشه، مقدار createaccount صفر میشه تا ووکامرس در همون سفارش برای ساخت حساب تکراری تلاش نکنه.
این کد حساب قبلی رو حذف یا ویرایش نمیکنه و مشتری رو هم وارد حساب نمیکنه. فقط درخواست ساخت حساب تازه رو کنار میذاره. پس فعالبودن خرید مهمان و درستبودن بقیه تنظیمات هنوز مهمه.
رفع خطا در بلوک تسویهحساب ووکامرس
چرا کد تسویهحساب کلاسیک روی بلوک تسویهحساب کار نمیکنه؟
بلوک تسویهحساب دادهها رو از مسیر Store API میفرسته و روند پردازشش با فرم کلاسیک فرق داره. هوک woocommerce_checkout_posted_data به دادههای ارسالشده از فرم کلاسیک مربوطه، پس نباید انتظار داشته باشید قطعهکد بالا رفتار بلوک پرداخت رو تغییر بده.
تنظیم ورود و ساخت حساب در تسویهحساب بلوکی
اول تنظیمات «حسابها و حریم خصوصی» ووکامرس رو بررسی کنید. بعد برگه تسویهحساب رو در ویرایشگر باز کنید، بلوک تسویهحساب رو انتخاب کنید و تنظیمات قابلنمایش اون رو ببینید. مطمئن بشید مشتری قبلی مسیر روشنی برای ورود داره و رفتار ساخت حساب با خرید مهمان یا عضویت اجباری فروشگاهتون هماهنگه.
اگه افزونهای فرم ورود، فیلد ایمیل یا روند ساخت حساب رو تغییر میده، سازگاری همون افزونه با بلوکهای سبد خرید و تسویهحساب رو از مستندات رسمی سازنده بررسی کنید. سازگاری با تسویهحساب کلاسیک بهتنهایی کافی نیست.
راهحل سازگار با Store API باید چه شرایطی داشته باشه؟
راهحل بلوکی باید مشخصاً برای Store API و بلوک تسویهحساب نوشته شده باشه، ایمیل رو در سمت سرور بررسی کنه و اطلاعات حساب قبلی رو لو نده. این راهحل باید سناریوهای خرید مهمان، ورود کاربر، ساخت حساب، پرداخت ناموفق و تلاش دوباره برای پرداخت رو هم درست مدیریت کنه.
یک قطعهکد عمومی و تأییدنشده رو روی فروشگاه اصلی قرار ندید. اگه تنظیمات ووکامرس مشکل رو حل نکرد، از توسعهدهنده بخواید راهحل رو بر اساس افزونههای فعال و روش تحویل محصولتون بسازه و روی محیط آزمایشی تست کنه.
چطور مطمئن بشید خطا برطرف شده؟
بعد از هر تغییر، فقط یک خرید معمولی انجام ندید. چهار حالت زیر رو جداگانه آزمایش کنید:
- خرید با یک ایمیل جدید رو آزمایش کنید: بررسی کنید سفارش ثبت میشه و ساخت حساب دقیقاً طبق تنظیماتتون پیش میره.
- خرید مهمان با یک ایمیل ثبتشده رو آزمایش کنید: بدون ورود، ایمیلی رو وارد کنید که از قبل در سایت حساب داره و نتیجه رو ببینید.
- ورود با حساب قبلی و تکمیل سفارش رو آزمایش کنید: با همون کاربر وارد بشید و مطمئن بشید سفارش به حساب درست وصل میشه.
- نتیجه رو در موبایل و حالت ناشناس مرورگر بررسی کنید: این کار اثر نشست ورود، کوکیها و بعضی دادههای ذخیرهشده مرورگر رو کمتر میکنه.
برای این آزمایشها از درگاه آزمایشی یا روش پرداختی استفاده کنید که هزینه واقعی ایجاد نمیکنه. بعد از تست هم سفارشها و حسابهای آزمایشی رو با دقت پاک کنید.
اگه خطا هنوز نمایش داده میشه، این موارد رو بررسی کنید
کش سایت و مرورگر رو پاک کنید
کش یعنی نسخه ذخیرهشده صفحه که برای سریعترشدن سایت نگه داشته میشه. کش افزونه بهینهسازی، سرور، شبکه توزیع محتوا و مرورگر رو پاک کنید. صفحه سبد خرید، تسویهحساب و حساب کاربری معمولاً نباید بهشکل عمومی کش بشن.
تداخل افزونههای ورود، عضویت و تسویهحساب رو بررسی کنید
افزونههای ورود با شماره موبایل، عضویت، ویرایش فیلدهای پرداخت یا ساخت حساب میتونن روند پیشفرض ووکامرس رو عوض کنن. روی سایت آزمایشی، این افزونهها رو یکییکی غیرفعال کنید و بعد از هر تغییر دوباره تست بگیرید. این کار رو وسط ساعت فروش روی سایت اصلی انجام ندید.
سفارشیسازیهای قالب و صفحه پرداخت رو موقتاً بررسی کنید
اگه قالب یا صفحهساز، فایلهای ووکامرس رو بازنویسی کرده باشه، ممکنه فرم پرداخت رفتار متفاوتی داشته باشه. روی محیط آزمایشی موقتاً یک قالب پیشفرض سازگار رو فعال کنید یا صفحه پرداخت سفارشی رو کنار بذارید. اگه خطا ناپدید شد، مشکل به یکی از سفارشیسازیها مربوطه.
گزارشهای ووکامرس رو برای پیدا کردن خطا ببینید
از مسیر «ووکامرس ← وضعیت ← گزارشها» گزارشهای مربوط به زمان آزمایش رو باز کنید. نام منو ممکنه با ترجمه یا نسخه نصبشده کمی فرق داشته باشه. خطاهای PHP و گزارش افزونههای پرداخت یا عضویت هم میتونن سرنخ بدن. قبل از فرستادن گزارش برای پشتیبانی، ایمیل، آدرس، کلیدها و اطلاعات پرداخت مشتری رو حذف کنید.
نکات امنیتی و نگهداری راهحل
چرا نباید قالب اصلی رو مستقیم ویرایش کنید؟
بهروزرسانی قالب اصلی میتونه تغییرات مستقیم شما رو پاک کنه. از طرف دیگه، یک اشتباه کوچک در فایل توابع ممکنه خطای جدی ایجاد کنه. افزونه اختصاصی کوچک یا افزونه مدیریت قطعهکد، نگهداری و غیرفعالکردن راهحل رو سادهتر میکنه.
بعد از بهروزرسانی وردپرس و ووکامرس چه چیزهایی رو دوباره تست کنید؟
بعد از هر بهروزرسانی مهم، خرید با ایمیل تازه، خرید با ایمیل ثبتشده، ورود مشتری قبلی، بازیابی رمز عبور و اتصال سفارش به حساب رو دوباره آزمایش کنید. اگه از بلوک تسویهحساب استفاده میکنید، سازگاری افزونههای مرتبط با بلوکها و Store API رو هم بررسی کنید.
تاریخ افزودن کد، دلیل استفاده و نتیجه تستها رو جایی ثبت کنید. این یادداشت کوتاه کمک میکنه خودتون یا مدیر بعدی سایت بفهمید کد چرا اضافه شده و چه زمانی باید دوباره بررسی بشه.
سؤالهای رایج
آیا فعالکردن خرید مهمان این خطا رو برطرف میکنه؟
در خیلی از فروشگاهها بله، چون ووکامرس دیگه مجبور نیست برای تکمیل هر سفارش حساب تازهای بسازه. ولی باید ورود، ساخت حساب و افزونههای عضویت رو هم بررسی کنید. خرید مهمان برای محصولاتی که حتماً به حساب کاربری نیاز دارن انتخاب مناسبی نیست.
آیا مشتری با ایمیل ثبتشده میتونه بدون ورود خرید کنه؟
اگه خرید مهمان فعال باشه و افزونه یا قانون دیگهای ورود رو اجباری نکرده باشه، این کار میتونه ممکن باشه. بااینحال، نتیجه به تنظیمات فروشگاه و نوع محصول بستگی داره و باید با یک حساب آزمایشی بررسیش کنید.
آیا این راهحل برای بلوک تسویهحساب هم کار میکنه؟
قطعهکد این مقاله برای تسویهحساب کلاسیکه و نباید اون رو راهحل بلوک تسویهحساب بدونید. بلوک پرداخت از Store API استفاده میکنه و راهحل سفارشی اون باید مشخصاً با همین مسیر سازگار باشه.
آیا ویرایش فایل functions.php امنه؟
ویرایش فایل functions.php قالب اصلی پیشنهاد نمیشه، چون بهروزرسانی قالب میتونه کد رو پاک کنه و خطای تایپی هم ممکنه سایت رو از دسترس خارج کنه. افزونه اختصاصی کوچک، افزونه مدیریت قطعهکد یا در اولویت بعدی فایل functions.php قالب فرزند انتخابهای بهتری هستن.
چرا این خطا فقط برای بعضی مشتریها دیده میشه؟
چون معمولاً فقط ایمیل بعضی مشتریها از قبل در سایت ثبت شده. مشتری تازه با ایمیل جدید با این پیام روبهرو نمیشه، ولی مشتری قبلی که بدون ورود دوباره میخواد حساب بسازه ممکنه این خطا رو ببینه.
جمعبندی
برای رفع خطای An account is already registered with your email address در ووکامرس، اول بررسی کنید ایمیل مشتری از قبل در سایت ثبت شده یا نه. بعد نوع صفحه تسویهحسابتون رو مشخص کنید و تنظیمات خرید مهمان، ورود و ساخت حساب رو با نیاز واقعی فروشگاهتون هماهنگ کنید. در خیلی از فروشگاهها همین تنظیمات ساده مشکل رو حل میکنن.
اگه از تسویهحساب کلاسیک استفاده میکنید و مشکل باقی مونده، میتونید قطعهکد مقاله رو بعد از تهیه نسخه پشتیبان و آزمایش روی سایت آزمایشی به کار ببرید. برای بلوک تسویهحساب هم سراغ کد کلاسیک نرید و فقط از راهحلی استفاده کنید که با Store API سازگار باشه. در آخر، خرید با ایمیل تازه و ثبتشده رو جداگانه تست کنید تا مطمئن بشید مشتری بدون برخورد با خطا میتونه سفارشش رو کامل کنه.

برای ارسال نظر لطفا ابتدا ثبتنام کنید یا وارد شوید.