كيف تبدو المشكلة
قبل
INSERT INTO wp_posts (post_title) VALUES ('ظ…ط±طط¨ط§ ط¨ظƒظ…طŒ طھظ… ط´طظ† ط§ظ„ط·ظ„ط¨');بعد
INSERT INTO wp_posts (post_title) VALUES ('مرحبا بكم، تم شحن الطلب');من أين تأتي المشكلة
يخزن WordPress النص بترميز UTF-8. لكن كثيرًا من التثبيتات القديمة أنشأت جداولها بترميز latin1، أو اتصلت بقاعدة البيانات بهذا الترميز. وما دامت الكتابة والقراءة ترتكبان الخطأ نفسه، لا يلاحظ أحد شيئًا. وبعد الانتقال إلى خادم جديد، أو التصدير عبر phpMyAdmin، أو تغيير ترميز الاتصال، يتحول كل حرف عربي فجأة إلى حرفين.
- قيمة
DB_CHARSETفيwp-config.phpهيlatin1أو لا تطابق الجداول. - صُدّرت النسخة بترميز
latin1واستُوردت بترميزutf8mb4، أو العكس. - حوّلت إضافة أو أداة استيراد نصًا تالفًا أصلًا مرة أخرى. وهكذا ينشأ الترميز المزدوج.
إصلاح ملف التصدير
- خذ نسخة احتياطية من قاعدة البيانات قبل تغيير أي شيء.
- صدّر الجداول المتضررة إلى ملف
.sql، مثلًا عبر phpMyAdmin أوmysqldump --default-character-set=utf8mb4. - اسحب الملف إلى المربع أعلاه. يصلح Mojibuster المواضع التالفة فقط ويعرض لك كل تغيير.
- نزّل الملف المصلح واستورده بترميز
utf8mb4إلى قاعدة بيانات تجريبية جديدة. - افحص الموقع. فإذا بدا كل شيء سليمًا فاستورده إلى قاعدة البيانات الفعلية.
لا يُرفع الملف إلى أي مكان. وهذا مهم، لأنه يحتوي عادةً على حسابات المستخدمين وعناوين البريد الإلكتروني والتعليقات.
احذر من البيانات المتسلسلة (serialized)
يحفظ WordPress بعض الإعدادات في wp_options وwp_postmeta على شكل قيم PHP متسلسلة، مثل s:8:"سلام";. الرقم هو الطول بالبايت: في UTF-8 يشغل كل حرف عربي بايتين. وللنص التالف طول مختلف عن النص المصلح، لذلك لا يطابق الرقم بعد الإصلاح ويتجاهل WordPress القيمة. أصلح أولًا جداول المحتوى مثل wp_posts وwp_comments وwp_terms. أما للإعدادات فالأفضل استخدام wp search-replace من WP-CLI لأنه يحدّث الأطوال.
معالجة السبب في MySQL
- حوّل الجداول والاتصال إلى
utf8mb4واكتب فيwp-config.phpالسطرdefine('DB_CHARSET', 'utf8mb4');. - إذا كان عمود
latin1يحوي بايتات UTF-8 فلا تحوّله مباشرة، وإلا ترمّز النص مرة ثانية. الطريق المعتاد يمر عبر نوع ثنائي: أولًاMODIFY … LONGBLOBثمMODIFY … LONGTEXT CHARACTER SET utf8mb4. - جرّب كل تغيير أولًا على نسخة من قاعدة البيانات.
أسئلة شائعة
هل أستطيع إصلاح قاعدة بيانات WordPress كاملة دفعة واحدة؟
نعم، حتى ملفات SQL الكبيرة. لكن انتبه إلى البيانات المتسلسلة في wp_options وwp_postmeta، فـ WP-CLI يعالجها بشكل أفضل.
هل ستتغير الحروف السليمة في الملف؟
لا. يصلح Mojibuster المتواليات التالفة بوضوح فقط. والنص السليم يبقى كما هو.
ما الفرق بين utf8 وutf8mb4؟
في MySQL يخزن utf8 حروفًا لا تتجاوز ثلاثة بايتات، فتضيع الرموز التعبيرية. أما utf8mb4 فهو UTF-8 الحقيقي وهو الخيار الصحيح لـ WordPress.
هل ينفع هذا مع أنظمة غير WordPress؟
نعم. لدى Joomla وDrupal وMagento وتطبيقك الخاص على MySQL أو MariaDB المشكلة نفسها والحل نفسه.