نمایش علامت سؤال به جای فارسی در وردپرس

حل مشکل نمایش حروف فارسی در وردپرس بصورت علامت سوال

اگر هنگام نصب وردپرس، مهاجرت سایت، یا حتی بعد از چند ماه فعالیت ناگهان با متن‌های فارسی به شکل «????» یا علامت سؤال در نوشته‌ها، دیدگاه‌ها، عنوان‌ها یا بخش‌های مدیریتی مواجه شوید، معمولاً یک چیز به‌هم ریخته است: زنجیره کُدگذاری...

Picture of هانیه مجللی
هانیه مجللی

اگر هنگام نصب وردپرس، مهاجرت سایت، یا حتی بعد از چند ماه فعالیت ناگهان با متن‌های فارسی به شکل «????» یا علامت سؤال در نوشته‌ها، دیدگاه‌ها، عنوان‌ها یا بخش‌های مدیریتی مواجه شوید، معمولاً یک چیز به‌هم ریخته است: زنجیره کُدگذاری (Encoding) بین وردپرس، پایگاه‌داده و اتصال دیتابیس.

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

علت اصلی نمایش علامت سؤال به جای فارسی در وردپرس

علت اصلی نمایش علامت سؤال به جای فارسی در وردپرس چیست؟

وقتی شما در وردپرس متن فارسی ذخیره می‌کنید، داده از مرورگر به PHP، سپس به MySQL و در نهایت به جدول‌های دیتابیس منتقل می‌شود. اگر در هر مرحله‌ای «مجموعه‌کاراکتر» و «Collation» هماهنگ نباشد، کاراکترهای فارسی قابل ذخیره یا بازیابی صحیح نیستند و نتیجه به صورت علامت سؤال یا کاراکترهای ناخوانا دیده می‌شود.

در اکثر مواقع، ریشه مشکل یکی از موارد زیر است: تنظیم نبودن utf8mb4 در دیتابیس، ناسازگاری collation جدول‌ها، مقدار اشتباه DB_CHARSET در wp-config.php، یا تنظیم نادرست connection در زمان اتصال به دیتابیس.

قاعده طلایی: تا زمانی که «دیتابیس + جدول‌ها + اتصال + وردپرس» همگی روی utf8mb4 و collation سازگار باشند، فارسی سالم نمایش داده می‌شود؛ در غیر این صورت، دیر یا زود مشکل رخ می‌دهد.

نشانه‌ها و سناریوهای رایج این مشکل

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

  • فقط نوشته‌های قدیمی «????» شده‌اند ولی نوشته‌های جدید درست‌اند.
  • در مدیریت وردپرس فارسی درست است اما در سایت (Front-end) خراب نمایش داده می‌شود.
  • در phpMyAdmin داده‌ها درست‌اند ولی در وردپرس خراب دیده می‌شوند (مشکل اتصال/خروجی).
  • بعد از انتقال هاست یا ریستور بکاپ مشکل شروع شده است.
  • بعد از نصب یک افزونه/قالب یا تغییر PHP/MySQL، فارسی به هم ریخته است.

قبل از هر کاری: از دیتابیس بکاپ بگیرید

هر تغییری روی charset/collation یا تبدیل جدول‌ها، در صورت اجرای اشتباه می‌تواند داده را غیرقابل بازگشت کند. بنابراین ابتدا از دیتابیس خروجی بگیرید. اگر دسترسی هاست دارید:

  1. از طریق phpMyAdmin وارد دیتابیس شوید و Export بگیرید (فرمت SQL).
  2. اگر سایت بزرگ است، از ابزارهای بکاپ هاست یا WP-CLI برای خروجی مطمئن‌تر استفاده کنید.
  3. فایل SQL را دانلود و در سیستم خود نگه دارید.

اگر وب‌سایت کسب‌وکاری است و نمی‌خواهید ریسک کنید، بهتر است قبل از تغییرات فنی از یک متخصص کمک بگیرید. در بسیاری از پروژه‌ها، همزمان با رفع مشکل کُدگذاری، نیاز به بهینه‌سازی و سفارشی‌سازی هم ایجاد می‌شود؛ مثلاً اگر قصد طراحی پلاگین وردپرس برای مدیریت محتوا یا یکپارچه‌سازی سرویس‌ها دارید، بهتر است ساختار دیتابیس از ابتدا استاندارد باشد.

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

از طرف دیگر، گاهی مشکل در ظاهر سایت یا فونت/خروجی قالب خودش را نشان می‌دهد؛ اگر قالب قدیمی یا غیر استاندارد است، انتخاب درست در طراحی قالب وردپرس باعث می‌شود نمایش حروف، استانداردسازی فایل‌ها و سازگاری با UTF-8 به شکل اصولی انجام شود.

چک‌لیست سریع عیب‌یابی (در ۱۰ دقیقه)

قبل از ورود به تغییرات سنگین، این موارد را به ترتیب بررسی کنید:

  • آیا مشکل بعد از انتقال هاست/ریستور بکاپ شروع شده؟
  • در phpMyAdmin، داده فارسی داخل جدول wp_posts یا wp_options درست نمایش داده می‌شود یا «????» است؟
  • charset دیتابیس و collation آن چیست؟
  • مقادیر DB_CHARSET و DB_COLLATE در wp-config.php چه هستند؟
  • نسخه MySQL/MariaDB و PHP روی هاست جدید تغییر کرده؟

استاندارد پیشنهادی برای وردپرس فارسی: utf8mb4

وردپرس مدرن توصیه می‌کند از utf8mb4 استفاده شود. این کُدگذاری نه‌تنها فارسی را درست ذخیره می‌کند، بلکه برای ایموجی‌ها و برخی کاراکترهای چندبایتی هم ضروری است. نکته مهم این است که «utf8» در MySQL با UTF-8 واقعی تفاوت دارد و محدودیت‌هایی دارد؛ بنابراین بهترین گزینه utf8mb4 است.

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

جدول مقایسه سریع charset و اثر آن روی فارسی

Charsetمناسب برای فارسیپیشنهادتوضیح
latin1خیرعدم استفادهباعث تبدیل حروف به علامت سؤال و خرابی داده می‌شود
utf8تا حدیدر صورت نبود utf8mb4محدودیت در کاراکترهای 4 بایتی دارد
utf8mb4بلهبهترین انتخابپشتیبانی کامل از فارسی و کاراکترهای چندبایتی

مرحله ۱: بررسی wp-config.php (مهم و کم‌ریسک)

اولین جایی که باید بررسی کنید فایل wp-config.php است. این فایل معمولاً در ریشه وردپرس قرار دارد. به دنبال این خطوط بگردید:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

پیشنهاد عمومی برای وردپرس‌های جدید این است:

define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');

اگر DB_COLLATE مقدار خاصی دارد و مطمئن نیستید، معمولاً خالی گذاشتن آن بهتر است تا وردپرس و دیتابیس بهترین گزینه را انتخاب کنند. البته اگر دیتابیس شما collation مشخصی مثل utf8mb4_unicode_ci دارد، باید مطمئن شوید همه جدول‌ها هم با همان هماهنگ هستند.

اگر مشکل شما دقیقاً نمایش حروف فارسی در وردپرس بصورت علامت سوال است، تغییر wp-config به تنهایی فقط زمانی جواب می‌دهد که داده‌ها هنوز خراب نشده باشند و مسئله صرفاً در اتصال/تنظیمات باشد.

مرحله ۲: بررسی charset و collation دیتابیس در phpMyAdmin

وارد phpMyAdmin شوید، دیتابیس مربوط به سایت را انتخاب کنید و در بخش Operations (عملیات) به این موارد دقت کنید:

  • Database Collation
  • Table Collation برای جدول‌های اصلی (wp_posts، wp_options، wp_comments و …)

اگر دیتابیس یا اکثر جدول‌ها روی latin1 هستند، احتمال بسیار زیاد همین علت است. اگر روی utf8 هستند اما مشکل دارید، بررسی کنید که آیا برخی جدول‌ها یا ستون‌ها collation متفاوتی دارند یا خیر.

چطور بفهمیم داده از قبل خراب شده است؟

یک رکورد فارسی را در جدول wp_posts باز کنید. اگر در phpMyAdmin هم «????» می‌بینید، یعنی داده هنگام ذخیره خراب شده و باید بازیابی/اصلاح انجام شود (اگر بکاپ سالم دارید). اما اگر در phpMyAdmin درست است و فقط سایت خراب نمایش می‌دهد، احتمالاً مشکل از اتصال، collation یا خروجی (مثلاً فایل‌های قالب) است.

مرحله ۳: تبدیل دیتابیس و جدول‌ها به utf8mb4 (راه‌حل اصلی)

اگر دیتابیس/جدول‌ها استاندارد نیستند، باید تبدیل انجام شود. این کار باید با احتیاط انجام شود چون ممکن است روی سایت‌های بزرگ زمان‌بر باشد.

روش پیشنهادی: تبدیل Collation از طریق SQL

پس از بکاپ، می‌توانید از دستورهای SQL استفاده کنید. ابتدا دیتابیس را به utf8mb4 تغییر دهید (نام دیتابیس را جایگزین کنید):

ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

سپس جدول‌ها را یکی‌یکی تبدیل کنید. نمونه برای جدول wp_posts:

ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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

نکته مهم درباره utf8mb4_unicode_ci و utf8mb4_general_ci

برای فارسی معمولاً utf8mb4_unicode_ci انتخاب دقیق‌تری است. اما برخی سیستم‌ها از utf8mb4_unicode_520_ci هم پشتیبانی می‌کنند که جدیدتر است. مهم‌تر از نام دقیق، «یکپارچه بودن» collation در کل دیتابیس است.

مرحله ۴: بررسی اتصال MySQL و مشکل character_set_client

گاهی دیتابیس درست است اما اتصال از سمت PHP به MySQL با charset اشتباه برقرار می‌شود. وردپرس به طور پیش‌فرض این موضوع را مدیریت می‌کند، اما در شرایط زیر ممکن است مشکل ایجاد شود:

  • مهاجرت به سرور قدیمی با MySQL قدیمی
  • استفاده از پلاگین‌های کش/بهینه‌ساز دیتابیس که کوئری‌ها را تغییر می‌دهند
  • تغییرات سفارشی در wp-db.php یا استفاده از Drop-in های دیتابیس

در این حالت، بررسی کنید آیا فایل‌های غیرمعمولی مثل wp-content/db.php وجود دارد یا خیر. اگر وجود دارد و از آن استفاده نمی‌کنید، موقتاً (با بکاپ) آن را غیرفعال کنید و دوباره تست بگیرید.

مرحله ۵: وقتی فقط بخشی از سایت علامت سؤال می‌شود

بعضی وقت‌ها مشکل در یک بخش خاص رخ می‌دهد و همین باعث سردرگمی می‌شود. چند حالت رایج:

۱) مشکل فقط در عنوان سایت یا توضیحات سایت

این داده‌ها در جدول wp_options ذخیره می‌شوند. collation یا charset این جدول و ستون option_value را چک کنید. اگر روی latin1 باشد، احتمالاً همین علت است.

۲) مشکل فقط در دیدگاه‌ها

جدول wp_comments و ستون comment_content را بررسی کنید. همچنین اگر فرم نظرات از افزونه‌های شخص ثالث استفاده می‌کند، مطمئن شوید خروجی HTML/متاها charset درست دارد.

۳) مشکل فقط در خروجی قالب یا یک صفحه خاص

در این وضعیت، ممکن است مشکل از متا تگ charset یا هدرهای خروجی باشد. در HTML باید این مورد وجود داشته باشد:

<meta charset="UTF-8">

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

مرحله ۶: تشخیص «خرابی واقعی داده» در برابر «اشتباه در نمایش»

برای حل قطعی، باید بدانید داده‌ها واقعاً خراب شده‌اند یا فقط نمایش آنها مشکل دارد:

  • اگر در phpMyAdmin متن فارسی را درست می‌بینید اما در وردپرس نه: مشکل نمایش/اتصال/قالب است.
  • اگر در phpMyAdmin هم «????» است: داده هنگام ذخیره یا در زمان تبدیل/مهاجرت خراب شده است.

در حالت دوم، بهترین راه بازیابی از بکاپ سالم است. تبدیل charset معمولاً داده خراب‌شده را «جادویی» درست نمی‌کند؛ چون اطلاعات اصلی از بین رفته است.

مرحله ۷: مشکلات رایج هنگام مهاجرت و ریستور بکاپ

بخش زیادی از گزارش‌های نمایش حروف فارسی در وردپرس بصورت علامت سوال بعد از انتقال سایت رخ می‌دهد. چند خطای متداول:

  • Export گرفتن از دیتابیس با collation اشتباه یا ابزار قدیمی
  • Import کردن در دیتابیس مقصد که charset پیش‌فرض آن latin1 است
  • استفاده از فایل SQL که داخل آن SET NAMES درست نیست
  • ریستور توسط اسکریپت‌های بکاپ که encoding را تغییر می‌دهند

اگر با افزونه‌های مهاجرت کار می‌کنید، مطمئن شوید افزونه از utf8mb4 پشتیبانی می‌کند و در مقصد هم دیتابیس از ابتدا با utf8mb4 ساخته شده باشد.

مرحله ۸: راهکارهای پیشگیرانه (برای اینکه دوباره تکرار نشود)

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

  1. همیشه دیتابیس جدید را با utf8mb4 ایجاد کنید.
  2. در wp-config.php مقدار DB_CHARSET را روی utf8mb4 بگذارید.
  3. از قالب‌ها و افزونه‌های معتبر و استاندارد استفاده کنید.
  4. قبل از مهاجرت، یک تست روی محیط staging انجام دهید.
  5. در خروجی قالب، meta charset و توابع استاندارد وردپرس را رعایت کنید.

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

اگر بخواهیم کل مسیر را در یک سناریوی قابل اجرا خلاصه کنیم:

  • بکاپ دیتابیس
  • تنظیم wp-config.php روی utf8mb4
  • تبدیل دیتابیس به utf8mb4_unicode_ci
  • تبدیل همه جدول‌ها به utf8mb4_unicode_ci
  • تست نمایش نوشته‌ها، عنوان سایت، دیدگاه‌ها و جستجو

اگر بعد از این مراحل هنوز مشکل وجود داشت، به احتمال بالا داده از قبل آسیب دیده یا یک Drop-in/افزونه در مسیر اتصال به دیتابیس دخالت می‌کند.

پرسش و پاسخ (FAQ)

آیا تغییر charset دیتابیس باعث حل کامل مشکل می‌شود؟

اگر مشکل از ناسازگاری کُدگذاری باشد و داده‌ها هنوز سالم باشند، بله. اما اگر متن‌ها قبلاً به «????» تبدیل شده‌اند، اطلاعات اصلی از دست رفته و باید از بکاپ سالم بازیابی کنید.

چرا فقط بخشی از محتوا خراب شده و بقیه درست است؟

معمولاً به خاطر این است که برخی جدول‌ها یا ستون‌ها collation متفاوتی دارند، یا بخشی از محتوا در زمان دیگری و با تنظیمات دیگر ذخیره شده است (مثلاً قبل و بعد از مهاجرت).

آیا استفاده از utf8 به جای utf8mb4 برای فارسی کافی است؟

برای فارسی در بسیاری از سایت‌ها utf8 هم کار می‌کند، اما توصیه حرفه‌ای وردپرس utf8mb4 است؛ چون کامل‌تر است و در آینده شما را از دردسرهای کاراکترهای خاص و ایموجی‌ها نجات می‌دهد.

چطور بفهمم مشکل از قالب است یا دیتابیس؟

یک متن فارسی را داخل phpMyAdmin بررسی کنید. اگر آنجا درست است، احتمالاً دیتابیس سالم است و مشکل از خروجی/قالب/هدرها یا اتصال است. اگر آنجا هم علامت سؤال می‌بینید، مشکل دیتابیس/ذخیره‌سازی است.

آیا افزونه‌ها می‌توانند باعث این مشکل شوند؟

به‌صورت مستقیم کمتر، اما افزونه‌هایی که دیتابیس را بهینه می‌کنند، یا Drop-in های دیتابیس، یا ابزارهای مهاجرت می‌توانند در encoding اختلال ایجاد کنند؛ به‌خصوص اگر قدیمی یا ناسازگار باشند.

نتیجه‌گیری

مشکل نمایش حروف فارسی در وردپرس بصورت علامت سوال تقریباً همیشه از عدم هماهنگی charset و collation بین وردپرس و دیتابیس ایجاد می‌شود؛ و بهترین راه‌حل پایدار، استانداردسازی کامل روی utf8mb4 و یکپارچه کردن collation در سطح دیتابیس و جدول‌ها است.

فراموش نکنید: اگر داده‌ها از قبل به علامت سؤال تبدیل شده باشند، تبدیل charset به تنهایی آن‌ها را برنمی‌گرداند و باید از بکاپ سالم استفاده کنید. با یک بکاپ مطمئن، تنظیم صحیح wp-config.php، و تبدیل اصولی دیتابیس، می‌توانید این مشکل را ریشه‌ای حل کنید و خیال خودتان را برای همیشه راحت نگه دارید.

امتیاز دادن

نظرات با ارزش کاربران

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

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

فهرست مطالب