ملفات ووردبريس الأساسية، ببساطة
كل ملف مهم بيعمل إيه، بيتقرا إمتى أثناء تحميل الصفحة، بيرتبط بإيه في الداتابيز، يحصل إيه لو اتمسح، وإزاي تعدّل عليه وتأمّنه.
١. شكل ووردبريس من جوه
أي موقع ووردبريس بيتكوّن من حاجتين منفصلين تمامًا، ولازم تفهم الفرق بينهم من الأول:
القاعدة الذهبية: wp-admin و wp-includes وملفات الجذر دي ملك ووردبريس وبتتستبدل مع كل تحديث. wp-content و wp-config.php و .htaccess دول ملكك إنت.
٢. ملفات الجذر ووظيفة كل ملف
| الملف | وظيفته ببساطة | أهميته |
|---|---|---|
wp-config.php | بيانات الاتصال بالداتابيز، مفاتيح التشفير، بادئة الجداول، ووضع الديباج. مش جزء من الكور ومش بيتغير مع التحديث. | حرج جدًا |
.htaccess | ملف إعدادات سيرفر Apache. ووردبريس بيكتب فيه قواعد الروابط الدائمة (Permalinks). على Nginx مش موجود والقواعد بتبقى في إعدادات السيرفر. | حرج |
index.php | أول ملف بيستقبل أي زيارة للموقع. ملف صغير جدًا، بيعرّف إن القالب هيستخدم ويستدعي wp-blog-header.php. | حرج |
wp-blog-header.php | بيحمّل ووردبريس، يشغّل دالة wp() اللي بتفهم الطلب، وبعدين يستدعي محمّل القوالب. | حرج |
wp-load.php | بيحدد مسار الموقع ABSPATH ويدوّر على wp-config.php (في نفس المجلد أو مجلد فوقه) ويحمّله. لو مش لاقيه يحوّلك لصفحة التنصيب. | حرج |
wp-settings.php | المايسترو: بيحمّل ملفات wp-includes، يتصل بالداتابيز، يحمّل الإضافات والقالب، ويطلق الـ hooks الأساسية زي init. | حرج |
wp-login.php | صفحة تسجيل الدخول، الخروج، التسجيل، واستعادة كلمة المرور. | مهم |
wp-cron.php | بيشغّل المهام المجدولة (نشر مقال مجدول، تحديثات، نسخ احتياطي) لما حد يزور الموقع. المهام نفسها متخزنة في الداتابيز. | مهم |
xmlrpc.php | واجهة قديمة للتحكم عن بعد (تطبيقات الموبايل القديمة، Jetpack، Pingbacks). هدف مشهور لهجمات تخمين كلمات المرور. | حساس أمنيًا |
wp-comments-post.php | بيستقبل التعليقات اللي الزوار بيبعتوها ويحفظها. | عادي |
wp-signup.php / wp-activate.php | تسجيل وتفعيل الحسابات والمواقع في شبكة Multisite. | عادي |
wp-mail.php | ميزة قديمة للنشر عن طريق الإيميل. | عادي |
wp-trackback.php | استقبال الـ Trackbacks من مواقع تانية. | عادي |
wp-links-opml.php | تصدير الروابط بصيغة OPML (ميزة قديمة). | عادي |
wp-config-sample.php | نموذج فاضي لـ wp-config. مش بيتقري أثناء التشغيل. | مرجع فقط |
readme.html / license.txt | معلومات ورخصة. readme.html ممكن يكشف إن الموقع ووردبريس. | غير ضروري للتشغيل |
المجلدات الأساسية
wp-includes/ فيها كل الدوال والكلاسات اللي ووردبريس شغال بيها، زي class-wp-query.php (جلب المقالات)، functions.php (دوال عامة – غير functions.php بتاع القالب)، pluggable.php (دوال ممكن الإضافات تستبدلها زي wp_mail)، template-loader.php (بيختار ملف القالب المناسب)، و version.php (رقم إصدار ووردبريس).
wp-admin/ فيها كل صفحات لوحة التحكم. أهم ملفاتها admin.php اللي كل صفحة أدمن بتمر بيه، و admin-ajax.php اللي بيستقبل طلبات AJAX من الإضافات والقوالب، و setup-config.php و install.php بتوع التنصيب.
٣. مجلد wp-content
ده مجلدك إنت، والتحديثات مش بتلمسه (إلا لو ووردبريس بيضيف قالب افتراضي جديد). ده المجلد اللي لازم يكون في النسخة الاحتياطية دايمًا مع الداتابيز.
themes (القوالب)
كل قالب في مجلد لوحده. أقل حاجة القالب الكلاسيكي محتاجها: style.css (فيه رأس الملف اللي عليه اسم القالب وبياناته) و index.php. قوالب البلوكات الحديثة محتاجة style.css و templates/index.html.
| ملف القالب | وظيفته |
|---|---|
style.css | رأس الملف فيه اسم القالب، الإصدار، و Template: لو ده قالب فرعي. من غيره ووردبريس مش هيعترف بالقالب أصلًا. |
functions.php | كود PHP بيتحمّل مع كل صفحة طول ما القالب شغال: تسجيل القوائم، دعم الصور البارزة، تحميل ملفات CSS/JS. غلطة فيه ممكن توقع الموقع كله. |
index.php | القالب الاحتياطي الأخير لو مفيش ملف أدق. |
header.php / footer.php | رأس وذيل الصفحة، ولازم يكون فيهم wp_head() و wp_footer() عشان الإضافات تشتغل. |
single.php، page.php، archive.php، 404.php، search.php | قوالب لأنواع صفحات محددة حسب «التسلسل الهرمي للقوالب» Template Hierarchy. |
theme.json | في القوالب الحديثة: الألوان، الخطوط، المسافات، وإعدادات المحرر. |
style.css فيه سطر Template: اسم-مجلد-القالب-الأصلي، ويُفضَّل functions.php يحمّل ستايل القالب الأب.plugins (الإضافات)
كل إضافة في مجلد، وفيها ملف رئيسي عليه رأس Plugin Name:. ووردبريس بيحفظ في الداتابيز المسار النسبي للملف ده (مثلًا akismet/akismet.php) عشان يعرف إن الإضافة مفعّلة.
mu-plugins (إضافات إجبارية)
أي ملف PHP في المجلد ده بيشتغل تلقائيًا قبل الإضافات العادية، ومينفعش يتعطل من لوحة التحكم. مفيد لكود لازم يشتغل دايمًا. ملاحظة: ووردبريس بيقرأ الملفات اللي في المجلد مباشرة بس، مش اللي جوه مجلدات فرعية.
uploads (الملفات المرفوعة)
الصور والملفات بتتخزن بالشكل uploads/2026/09/photo.jpg مع نسخ بمقاسات مختلفة. الملف نفسه على السيرفر، وبياناته في الداتابيز كـ «مرفق» attachment.
ملفات Drop-ins الخاصة
ملفات بأسماء محددة لو حطيتها مباشرة في wp-content بتستبدل سلوك الكور: advanced-cache.php و object-cache.php (الكاش)، db.php (طبقة الداتابيز)، maintenance.php (صفحة الصيانة)، php-error.php و fatal-error-handler.php (صفحات الأخطاء). إضافات الكاش بتنشئ بعضها تلقائيًا.
٤. أهم ملف: wp-config.php
ده الملف الوحيد اللي من غيره ووردبريس ميعرفش يتصل بالداتابيز، وبالتالي ميعرفش أي حاجة عن موقعك. وفي نفس الوقت هو أخطر ملف أمنيًا لأن فيه باسورد الداتابيز. مش متخزن في الداتابيز خالص، ولو ضاع ومفيش نسخة لازم تكتبه من جديد.
// بيانات الاتصال بالداتابيز
define( 'DB_NAME', 'database_name' );
define( 'DB_USER', 'database_user' );
define( 'DB_PASSWORD', 'strong_password' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
// مفاتيح التشفير (بتتولد من https://api.wordpress.org/secret-key/1.1/salt/)
define( 'AUTH_KEY', '...' );
define( 'SECURE_AUTH_KEY', '...' );
define( 'LOGGED_IN_KEY', '...' );
define( 'NONCE_KEY', '...' );
define( 'AUTH_SALT', '...' );
define( 'SECURE_AUTH_SALT', '...' );
define( 'LOGGED_IN_SALT', '...' );
define( 'NONCE_SALT', '...' );
// بادئة الجداول (لازم تطابق أسماء الجداول في الداتابيز)
$table_prefix = 'wp_';
// الديباج: شغّله على نسخة التجربة بس
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_LOG', false ); // يكتب الأخطاء في wp-content/debug.log
define( 'WP_DEBUG_DISPLAY', false ); // ميعرضش الأخطاء للزوار
// إعدادات مفيدة
define( 'DISALLOW_FILE_EDIT', true ); // يقفل محرر الملفات من لوحة التحكم
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_POST_REVISIONS', 10 ); // حد أقصى لمراجعات المقال
define( 'FORCE_SSL_ADMIN', true );
// define( 'WP_HOME', 'https://example.com' ); // بيتجاوز قيمة home في الداتابيز
// define( 'WP_SITEURL', 'https://example.com' ); // بيتجاوز قيمة siteurl
/* لا تكتب أي حاجة بعد السطر ده */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
require_once ABSPATH . 'wp-settings.php';
define تضيفه لازم يكون قبل سطر require_once ABSPATH . 'wp-settings.php';، وإلا مش هيتطبق لأن ووردبريس يكون اتحمّل خلاص.أهمية الملفات بالترتيب: wp-config.php ثم .htaccess ثم ملفات سلسلة التحميل (index.php ← wp-blog-header.php ← wp-load.php ← wp-settings.php) ثم functions.php بتاع القالب لأنه أكتر ملف بيتعدل وبيوقع مواقع.
٥. دورة الطلب Request Lifecycle
لما حد يفتح example.com/my-post/، ده اللي بيحصل بالترتيب. الدوائر المتقطعة هي نقاط الـ hooks اللي الإضافات والقوالب بتتدخل فيها.
- السيرفر يستقبل الطلب ويقرأ .htaccessالرابط
/my-post/مش ملف حقيقي، فقواعد الـ Rewrite بتحوّله لـindex.php. - index.phpيعرّف
WP_USE_THEMES = trueويستدعيwp-blog-header.php. - wp-blog-header.php ← wp-load.phpيحدد
ABSPATHويدوّر علىwp-config.php. - wp-config.phpيعرّف بيانات الداتابيز والثوابت، وفي آخره يستدعي
wp-settings.php. - wp-settings.php يبدأ التحميليحمّل ملفات wp-includes، يتصل بالداتابيز، ويحمّل الخيارات المحمّلة تلقائيًا (autoload) من جدول
wp_options. - mu-plugins ثم الإضافات المفعّلةيقرأ
active_pluginsمن الداتابيز ويحمّل ملفاتها. بعدهاmuplugins_loadedثمplugins_loaded. - pluggable.phpيحمّل الدوال القابلة للاستبدال (لو إضافة معرّفاها قبله، نسختها هي اللي بتشتغل).
- القالب: functions.php
setup_themeثم تحميل functions.php للقالب الفرعي ثم الأب، ثمafter_setup_theme. - init ثم wp_loadedالمستخدم الحالي اتعرف. هنا بتتسجل أنواع المقالات المخصصة والتصنيفات. ووردبريس جاهز بالكامل.
- wp(): فهم الطلب
parse_requestيطابق الرابط معrewrite_rulesالمخزنة، ثمWP_Queryيجيب المحتوى منwp_posts، ثم hookwp. - template_redirectآخر فرصة للتحويل أو منع الوصول قبل عرض أي HTML.
- template-loader.php يختار ملف القالبحسب التسلسل الهرمي: مقال مفرد ←
single-post.php←single.php←singular.php←index.php. - عرض الصفحةملف القالب يشتغل، و
wp_headوwp_footerيطبعوا ستايلات وسكربتات الإضافات. - shutdownنهاية الطلب. وممكن
wp-cron.phpيتنادى في الخلفية لو فيه مهام مجدولة وقتها جه.
wp-admin/admin.php اللي بيستدعي wp-load.php مباشرة (من غير index.php والقالب)، وبعد init بيطلق admin_init. نفس الكلام لطلبات admin-ajax.php و REST API (/wp-json/).٦. كل حاجة بتتخزن فين في الداتابيز
الجداول الافتراضية ١٢ جدول (بالبادئة wp_ أو اللي محددها في wp-config):
| الجدول | بيخزن إيه |
|---|---|
wp_options | إعدادات الموقع كلها: الرابط، الاسم، القالب الشغال، الإضافات المفعّلة، الويدجت، المهام المجدولة، الكاش المؤقت (transients). |
wp_posts | المقالات، الصفحات، المرفقات، المراجعات، عناصر القوائم، CSS الإضافي، قوالب البلوكات، وأي نوع مقال مخصص (منتجات ووكومرس مثلًا). |
wp_postmeta | بيانات إضافية لكل مقال: مسار الصورة، الصورة البارزة، قالب الصفحة، الحقول المخصصة. |
wp_users | المستخدمين: اسم الدخول، الإيميل، كلمة المرور مشفّرة (hash). |
wp_usermeta | صلاحيات المستخدم ودوره، إعداداته، وجلسات الدخول. |
wp_terms | أسماء التصنيفات والوسوم والقوائم. |
wp_term_taxonomy | نوع كل term (تصنيف؟ وسم؟ قائمة؟) والأب وعدد المقالات. |
wp_term_relationships | الربط بين المقالات والتصنيفات/الوسوم/القوائم. |
wp_termmeta | بيانات إضافية للتصنيفات. |
wp_comments / wp_commentmeta | التعليقات وبياناتها. |
wp_links | مدير الروابط القديم (غالبًا فاضي). |
ربط كل ملف أو مجلد بمكانه في الداتابيز
| الملف / المجلد | اللي بيتخزن عنه في الداتابيز |
|---|---|
wp-config.php | لا شيء. هو اللي بيقول لووردبريس الداتابيز فين. استثناء: لو عرّفت WP_HOME و WP_SITEURL فيه، بيتجاوزوا قيم home و siteurl في wp_options. |
.htaccess | الملف نفسه لأ، لكن شكل الرابط في wp_options → permalink_structure، والقواعد الداخلية المحسوبة في wp_options → rewrite_rules. |
القالب الشغال (themes/) | wp_options → template (مجلد القالب الأب) و stylesheet (مجلد القالب الفعلي، الفرعي لو موجود). إعدادات التخصيص في theme_mods_اسم-القالب. الويدجت في widget_* و sidebars_widgets. |
| تعديلات المحرر في قوالب البلوكات | wp_posts بأنواع wp_template و wp_template_part و wp_global_styles. يعني لو عدّلت الهيدر من المحرر، التعديل في الداتابيز مش في ملف القالب. |
| CSS الإضافي (Customizer) | wp_posts بنوع custom_css. |
الإضافات (plugins/) | قائمة المفعّل في wp_options → active_plugins (مصفوفة serialized فيها مسارات زي folder/file.php). إعدادات كل إضافة غالبًا في wp_options وبعضها بيعمل جداول خاصة بيه. |
mu-plugins/ | مش متسجلة في الداتابيز، بتشتغل لمجرد وجودها. |
الصور (uploads/) | صف في wp_posts نوعه attachment، ومسار الملف في wp_postmeta → _wp_attached_file، والمقاسات في _wp_attachment_metadata. مسار مجلد الرفع العام في upload_path لو متغيّر. |
| القوائم | القائمة نفسها term في wp_terms، والعناصر صفوف في wp_posts بنوع nav_menu_item، ومكانها في القالب داخل theme_mods. |
wp-cron.php | جدول المهام في wp_options → cron. |
إصدار ووردبريس (wp-includes/version.php) | إصدار الداتابيز في wp_options → db_version. لو الملفات أحدث من الداتابيز، ووردبريس بيطلب «تحديث قاعدة البيانات». |
wp-login.php | المستخدم في wp_users، والدور في wp_usermeta → wp_capabilities، والجلسات في session_tokens. تعريف الأدوار نفسها في wp_options → wp_user_roles. |
wp search-replace 'old.com' 'new.com' من WP-CLI أو إضافة زي Better Search Replace.٧. إيه اللي يتعدل وإيه اللي لأ
| المكان | تعدّل؟ | السبب |
|---|---|---|
wp-admin/، wp-includes/، ملفات الجذر | لا | أي تحديث لووردبريس بيستبدلهم، وتعديلك هيضيع، وممكن يعمل ثغرة. |
wp-config.php | نعم | معمول عشان يتعدل ومش بيتلمس في التحديث. |
.htaccess | بحذر | اكتب قواعدك برّه علامات # BEGIN WordPress و # END WordPress، لأن ووردبريس بيعيد كتابة اللي بينهم. |
| قالب جاهز (مش بتاعك) | لا مباشرة | استخدم قالب فرعي، لأن تحديث القالب بيمسح التعديلات. |
| القالب الفرعي / قالب إنت عامله | نعم | ده مكانك الطبيعي. |
| إضافة جاهزة | لا | استخدم الـ hooks بتاعتها من إضافة صغيرة خاصة بيك أو mu-plugin. |
mu-plugins/، إضافة خاصة بيك | نعم | أفضل مكان لكود الموقع اللي مش مرتبط بشكل القالب. |
uploads/ | من الوسائط | ارفع وامسح من مكتبة الوسائط، مش من FTP، عشان الداتابيز تفضل متطابقة. |
الحاجات اللي بتتغير لوحدها طبيعي: .htaccess (لما تحفظ الروابط الدائمة أو إضافة أمان/كاش تكتب فيه)، uploads/، ملفات الكاش في wp-content/cache/، debug.log، وملف .maintenance المؤقت أثناء التحديثات.
٨. إزاي نعدل على الملفات صح
- خد نسخة احتياطية من الملف اللي هتعدله (وحبذا الموقع كله: الملفات + الداتابيز).
- اشتغل على نسخة تجريبية Staging لو التعديل كبير.
- عدّل عن طريق SFTP أو File Manager في لوحة الاستضافة، مش من «محرر ملفات القوالب» داخل ووردبريس. لو غلطت في المحرر الداخلي وحصل Fatal Error، ممكن متعرفش تدخل تصلحه.
- استخدم محرر نصوص حقيقي (VS Code، Notepad++)، مش Word أو Notepad الويندوز القديم، واحفظ بترميز UTF-8 بدون BOM. الـ BOM أو أي مسافة قبل
<?phpبتعمل خطأ «Headers already sent». - شغّل الديباج مؤقتًا وتابع
wp-content/debug.log، وبعد ما تخلص اقفله. - بلاش تقفل ملفات PHP بـ
?>في آخر functions.php أو الإضافات، عشان أي سطر فاضي بعدها بيعمل مشاكل.
مثال: إضافة كود لقالب فرعي بشكل سليم في functions.php:
<?php
// تحميل ستايل القالب الأب
add_action( 'wp_enqueue_scripts', function () {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
} );
ولو عندك WP-CLI على السيرفر، ده أسهل طريق لحاجات كتير: wp plugin deactivate --all، wp theme activate twentytwentyfive، wp option get siteurl.
٩. لو ملف اتمسح: الأعراض والحل
| الملف المفقود | اللي هيحصل | الحل |
|---|---|---|
wp-config.php | الموقع يحوّلك لصفحة التنصيب «لنبدأ». خطر أمني: أي حد ممكن يكمّل التنصيب ويربط موقعك بداتابيز بتاعته ويتحكم فيه. | ارفعه من النسخة الاحتياطية فورًا. لو مفيش، أنشئه من wp-config-sample.php بنفس بيانات الداتابيز ونفس $table_prefix (بص على أسماء الجداول في phpMyAdmin). المفاتيح ولّد جديدة. |
.htaccess | الصفحة الرئيسية شغالة، لكن كل الصفحات والمقالات تدي 404 (لو الروابط الدائمة مفعّلة). ولو كان فيه قواعد أمان أو تحويل HTTPS هتضيع. | من لوحة التحكم: الإعدادات ← الروابط الدائمة ← حفظ من غير تغيير. أو أنشئه يدويًا بالمحتوى الافتراضي تحت الجدول ده. |
index.php (الجذر) | خطأ 403 Forbidden أو يظهر لستة ملفات الموقع (Directory Listing) أو صفحة الاستضافة الافتراضية. | ارفعه من نسخة ووردبريس بنفس الإصدار. |
wp-blog-header.php / wp-load.php / wp-settings.php | شاشة بيضاء أو Fatal error: require(): Failed opening required ...، والموقع ولوحة التحكم الاتنين واقفين. | استبدال ملفات الكور (القسم ١١). |
أي ملف في wp-includes أو wp-admin | Fatal error باسم الملف الناقص، أو جزء معين من لوحة التحكم يبوظ. غالبًا سببه تحديث اتقطع في النص. | استبدال مجلدي wp-admin و wp-includes بالكامل. |
wp-login.php | صفحة الدخول تدي 404 ومحدش يقدر يدخل. (لو إضافة أمان غيّرت رابط الدخول، ده طبيعي والملف موجود.) | ارفعه من نسخة ووردبريس نظيفة. |
wp-cron.php | المقالات المجدولة تفضل «فاتها الموعد»، التحديثات التلقائية والنسخ الاحتياطية المجدولة تقف. | ارفعه من نسخة ووردبريس. |
xmlrpc.php | غالبًا محدش هيحس، إلا تطبيقات الموبايل القديمة وبعض خصائص Jetpack. | لو محتاجه ارفعه. لو لأ، الأفضل يتقفل بقاعدة سيرفر مش بالمسح لأنه هيرجع مع التحديث. |
style.css بتاع القالب | ووردبريس يعتبر القالب «معطوب» ويرجع تلقائيًا لقالب افتراضي لو موجود، فشكل الموقع يتغير فجأة. | ارفع الملف تاني، وبعدين فعّل القالب من جديد لأن الإعداد اتغير في الداتابيز. |
index.php بتاع القالب | نفس اللي فوق: القالب يعتبر ناقص. | أعد رفع القالب كامل. |
functions.php بتاع القالب | الموقع يشتغل بس خصائص تختفي: القوائم، الصور البارزة، ستايلات أو سكربتات. | أعد رفع القالب أو ملفك من النسخة الاحتياطية. |
| مجلد القالب كله | رجوع لقالب افتراضي. لو مفيش أي قالب افتراضي، الواجهة تبقى فاضية. | ارفع القالب وفعّله. الإعدادات (theme_mods) لسه في الداتابيز وهترجع. |
| مجلد إضافة | ووردبريس يعطّلها تلقائيًا ويظهر رسالة إن ملف الإضافة غير موجود. إعداداتها لسه في الداتابيز. | ارفعها تاني وفعّلها، هترجع بإعداداتها. |
ملفات من uploads | صور مكسورة. المرفق لسه ظاهر في مكتبة الوسائط لأن سجله في الداتابيز موجود. | استرجع المجلد من النسخة الاحتياطية بنفس المسارات بالظبط. |
index.php في wp-content أو plugins أو themes | مفيش مشكلة في التشغيل، لكن ممكن حد يشوف لستة الملفات لو الـ Directory Listing مفتوح على السيرفر. | أنشئ ملف فيه <?php // Silence is golden. وأقفل الـ Indexes من السيرفر. |
object-cache.php أو advanced-cache.php | الموقع يشتغل بس أبطأ، وإضافة الكاش تشتكي. | من إعدادات إضافة الكاش: عطّل وفعّل تاني عشان تنشئه. |
محتوى .htaccess الافتراضي لموقع في جذر الدومين:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
ولو الموقع في مجلد فرعي زي /blog/، غيّر RewriteBase /blog/ والسطر الأخير لـ /blog/index.php.
١٠. الأخطاء الشائعة وحلها
| الخطأ | السبب الغالب | الحل |
|---|---|---|
| Error establishing a database connection | بيانات غلط في wp-config، أو سيرفر الداتابيز واقف، أو المستخدم ملوش صلاحيات، أو جداول تالفة. | راجع DB_NAME و DB_USER و DB_PASSWORD و DB_HOST مع لوحة الاستضافة. للإصلاح: define('WP_ALLOW_REPAIR', true); وافتح /wp-admin/maint/repair.php ثم امسح السطر. |
| شاشة بيضاء WSOD أو «There has been a critical error» | خطأ PHP في إضافة أو قالب، غالبًا بعد تعديل أو تحديث. | شغّل WP_DEBUG_LOG واقرأ debug.log. شوف إيميل «Recovery Mode» اللي ووردبريس بيبعته للأدمن. أو غيّر اسم مجلد plugins لـ plugins-off وجرّب. |
| Parse error / syntax error, unexpected ... | غلطة كتابة في ملف عدّلته (فاصلة منقوطة، قوس). | الرسالة فيها اسم الملف ورقم السطر. صلّحه أو رجّع النسخة القديمة عن طريق SFTP. |
| 404 على كل الصفحات ماعدا الرئيسية | .htaccess ناقص أو تالف، أو mod_rewrite مش مفعّل، أو على Nginx من غير try_files. | احفظ الروابط الدائمة، أو اكتب الملف يدويًا. على Nginx: try_files $uri $uri/ /index.php?$args; |
| 500 Internal Server Error | قاعدة غلط في .htaccess، أو صلاحيات ملفات غلط، أو حد الذاكرة. | غيّر اسم .htaccess مؤقتًا وجرّب، راجع صلاحيات الملفات، واقرأ error log السيرفر. |
| Briefly unavailable for scheduled maintenance | تحديث اتقطع وساب ملف .maintenance في الجذر. | امسح ملف .maintenance (ملف مخفي)، وبعدين أعد التحديث. |
| Allowed memory size exhausted | إضافة أو عملية محتاجة ذاكرة أكتر. | define('WP_MEMORY_LIMIT','256M'); في wp-config، والحد الحقيقي بيتحكم فيه memory_limit في إعدادات PHP. |
| Cannot modify header information – headers already sent | مسافة أو سطر فاضي أو BOM قبل <?php أو بعد ?>. | الرسالة بتقولك الملف والسطر. امسح المسافة واحفظ UTF-8 بدون BOM. |
| الموقع بيحوّل لدومين قديم أو Too many redirects | قيم home و siteurl غلط، أو تعارض HTTPS مع البروكسي/Cloudflare. | صحح القيم في wp_options أو عرّف WP_HOME و WP_SITEURL مؤقتًا في wp-config. |
| الصور مش ظاهرة بعد النقل | مسارات قديمة في المحتوى أو ملفات uploads ناقصة أو صلاحيات. | wp search-replace للدومين، وتأكد إن uploads اتنقل كامل. |
| مقالات مجدولة «فاتها الموعد» | الموقع قليل الزيارات أو DISABLE_WP_CRON مفعّل من غير Cron حقيقي. | اعمل Cron Job على السيرفر يشغّل wp-cron.php كل ٥ دقايق. |
١١. خطوات استرجاع ملفات الكور
ملفات الكور مش محتاجة نسخة احتياطية عشان ترجعها، لأنها نفس الملفات عند كل الناس. المهم تنزل نفس الإصدار اللي عندك.
- اعرف الإصدار من
wp-includes/version.php(المتغير$wp_version) أو من قيمةdb_version. - نزّل نفس الإصدار من wordpress.org/download/releases.
- فك الضغط، وامسح من النسخة الجديدة مجلد
wp-contentوملفwp-config-sample.phpلو حابب، عشان متكتبش فوق شغلك. - ارفع واستبدل:
wp-adminوwp-includesبالكامل، وملفات الجذر. - متلمسش
wp-config.phpولاwp-content. وراجع.htaccessإنه موجود.
أو بـ WP-CLI، أسرع وأضمن:
# يقارن ملفات الكور بالنسخة الرسمية ويقولك إيه ناقص أو متعدّل
wp core verify-checksums
# يعيد تنزيل الكور بنفس الإصدار من غير ما يلمس wp-content
wp core download --version=$(wp core version) --skip-content --force
# نفس الفحص للإضافات
wp plugin verify-checksums --all
١٢. الأمان
تأمين wp-config.php
- صلاحياته
400أو440(أو600حسب الاستضافة) عشان محدش غير صاحب الملف يقراه. - ممكن تنقله مجلد واحد فوق جذر الموقع، وووردبريس هيلاقيه تلقائيًا.
- مفاتيح تشفير قوية وفريدة، وغيّرها بعد أي اشتباه في اختراق.
- بادئة جداول غير
wp_في التنصيبات الجديدة (حماية بسيطة مش أساسية). DISALLOW_FILE_EDIT= true. ولو عايز تمنع تثبيت إضافات وتحديثات من اللوحة كمان:DISALLOW_FILE_MODS.WP_DEBUG_DISPLAY= false على الموقع الحقيقي، عشان رسائل الخطأ متكشفش مسارات.- مستخدم الداتابيز يبقى ليه صلاحيات على الداتابيز دي بس، ومش root.
قواعد .htaccess مفيدة
# منع الوصول لـ wp-config.php و .htaccess نفسه
<Files wp-config.php>
Require all denied
</Files>
<Files .htaccess>
Require all denied
</Files>
# قفل xmlrpc.php لو مش محتاجه (Jetpack وتطبيقات قديمة بتحتاجه)
<Files xmlrpc.php>
Require all denied
</Files>
# منع عرض محتوى المجلدات
Options -Indexes
وفي ملف .htaccess منفصل جوه wp-content/uploads/ عشان تمنع تشغيل أي PHP حد يرفعه متخفي كصورة:
<FilesMatch "\.(php|phtml|php\d)$">
Require all denied
</FilesMatch>
ملحوظة: Require all denied صيغة Apache 2.4. السيرفرات القديمة بتستخدم Order allow,deny و Deny from all. وعلى Nginx نفس القواعد بتتكتب في إعدادات السيرفر بـ location ... { deny all; }.
صلاحيات الملفات
| العنصر | الصلاحية |
|---|---|
| المجلدات | 755 |
| الملفات | 644 |
wp-config.php | 400 / 440 / 600 |
| أي حاجة | أبدًا 777 |
عادات أمان أساسية
- حدّث ووردبريس والقوالب والإضافات باستمرار، وامسح أي إضافة أو قالب مش مستخدم (حتى لو معطّل).
- متستخدمش اسم مستخدم
admin، وفعّل التحقق بخطوتين، وحدد عدد محاولات الدخول. - HTTPS على الموقع كله.
- نسخ احتياطي تلقائي للملفات والداتابيز متخزن برّه السيرفر، وجرّب الاسترجاع مرة على الأقل.
- نزّل القوالب والإضافات من مصادرها الرسمية بس، مش نسخ «Nulled» مجانية لأنها غالبًا فيها باك دور.
- افحص دوريًا بـ
wp core verify-checksumsواعرف لو فيه ملفات PHP غريبة فيuploads.
١٣. ملخص سريع
أهم ملف:
wp-config.php، ومش متخزن في الداتابيز، فلازم يبقى في النسخة الاحتياطية.الكور (
wp-admin، wp-includes، ملفات الجذر) بيتسترجع من نسخة نظيفة بنفس الإصدار، وممنوع التعديل عليه.wp-content + الداتابيز + wp-config.php + .htaccess = موقعك الحقيقي.الترتيب:
.htaccess ← index.php ← wp-blog-header.php ← wp-load.php ← wp-config.php ← wp-settings.php ← الإضافات ← القالب ← init ← WP_Query ← ملف القالب.القالب والإضافات المفعّلة متسجلين في
wp_options باسم المجلد، فلو اتمسحوا ورجعتهم بنفس الاسم، إعداداتهم بترجع.التعديل: نسخة احتياطية، SFTP، قالب فرعي، ديباج على ملف log، ومتعدلش الكور.