قامت Optistream بدمج اثني عشر ملحق (plugin) مخصصًا لـ WordPress في قاعدة كود واحدة دون فقدان تحسين محركات البحث (SEO) لأي من صفحاتها العامة البالغ عددها ألف صفحة.

لماذا كان الدمج مهمًا

ينتهي الأمر بموقع WordPress النموذجي بامتلاك حفنة من الملحقات؛ أما المواقع الأكبر فتبدو مثل ورشة عمل مليئة بالأسلاك، كل منها يصدر طنينًا ولكن لا يمكن فصل أي منها بسهولة. كان موقع Optistream يعمل باثني عشر ملحقًا مخصصًا لإدارة ملفات تعريف البث المباشر (streamer profiles)، وفرق الرياضات الإلكترونية، وبيانات الألعاب. أنتجت هذه الملحقات ألف صفحة قابلة للفهرسة. وكان الحفاظ على هذه الروابط (URLs) كما هي أمرًا غير قابل للتفاوض، فأي تغيير كان سيؤدي إلى فشل عملية النقل.

كيف كان يبدو الإعداد القديم

كان كل ملحق من الملحقات الاثني عشر يعيش في مجلده الخاص، ويسجل نوع المنشور المخصص (custom post type) الخاص به، ويرتبط بـ WordPress في نقاط مختلفة. وتراكمت المشكلات:

  • كانت الروابط (Hooks) والأصول (assets) مبعثرة، مما جعل من الصعب التنبؤ بالكود الذي يعمل ومتى.
  • كان منطق التوجيه (Routing logic) موجودًا في العديد من الملفات المنفصلة، لذا يمكن أن يتأثر رابط واحد بعدة ملحقات.
  • كانت ملفات CSS تُحمل بترتيب غير متوقع، مما أدى إلى تضارب في التنسيقات.
  • تطلب تصحيح الأخطاء (Debugging) فتح اثني عشر دليلًا مختلفًا، مما استنزف وقت أي مطور.

لم يكن الهدف تقليل عدد الملفات، بل منح النظام بأكمله دورة حياة واحدة ومكانًا واحدًا لإدارة التبعيات (dependencies).

كيف تم التخطيط لعملية النقل

تعامل الفريق مع الواجهة العامة — الروابط (URLs)، والقوالب (templates)، والبيانات الوصفية (meta data) — كعقد لا يمكن خرقه. وأي تغيير في الواجهة الأمامية (front end) سيعتبر فشلاً. ومع وضع هذه القاعدة في الاعتبار، قاموا بصياغة قائمة مراجعة لتنفيذها بعد كل خطوة.

1. حصر العقود العامة

تم تدوين كل مسار URL مع نوع المنشور الخاص به، والاسم اللطيف لإعادة الكتابة (rewrite slug)، وملف القالب، ومفاتيح البيانات الوصفية (meta keys) التي يعتمد عليها. أصبحت ورقة البيانات هذه هي كتاب القواعد: إذا تغير رابط URL بعد نقل وحدة (module)، يتم التراجع عن عملية النقل.

2. بناء مُحمّل (loader) بسيط

تم إنشاء ملف bootstrap صغير. كل ملحق سابق يسجل الآن "نطاق محتوى" (content domain) واحدًا من خلال اسم دالة (function name) يمكن التنبؤ به. لا يفعل المُحمّل أي شيء معقد — فقط ما يكفي لسحب الوحدة الصحيحة إلى WordPress عند الحاجة. البساطة تجعل الإخفاقات واضحة.

3. حماية البيانات

كان تغيير أسماء مفاتيح البيانات الوصفية (meta keys) سيحول تغيير الكود إلى عملية نقل بيانات، مما يضيف مخاطر غير ضرورية. بقيت المفاتيح القديمة دون تغيير؛ وتقوم دوال مساعدة جديدة بتغليفها، مما يحافظ على استقرار مخطط قاعدة البيانات (database schema).

4. إصلاح ملكية CSS

تم حل تضاربات التنسيق من خلال ثلاثة إجراءات:

  • يتم وضع ملفات CSS الخاصة بالوحدات في قائمة الانتظار (enqueued) بأولوية عالية بحيث تُحمل في النهاية.
  • يتم حصر جميع المحددات (selectors) ضمن فئة غلاف (wrapper class) فريدة لكل وحدة.
  • تُستخدم الدالة filemtime() عند وضع الملفات في قائمة الانتظار لتجاوز ذاكرة التخزين المؤقت للمتصفح (bust browser caches) في حال تغير ملف التنسيق.

5. استخدام حلقة آمنة

استمرت عملية النقل وحدة تلو الأخرى. بعد نقل وحدة ما، تحقق الفريق من تسجيل نوع المنشور، والتوجيه، وتخطيط الهاتف المحمول قبل الانتقال إلى الوحدة التالية. ظلت الملحقات الأصلية مثبتة ولكن غير نشطة، مما وفر مسارًا فوريًا للتراجع.

قائمة مراجعة الإنتاج

بعد كل استبدال للوحدات، تحقق الفريق مما يلي:

  • كل رابط URL لنوع المحتوى يعيد حالة HTTP بقيمة 200.
  • رأس الـ URL الأساسي (canonical URL header) يطابق الرابط الأصلي.
  • عناوين الصفحات والأوصاف الوصفية (meta descriptions) لم تتغير.
  • جميع الصور تُحمل دون روابط مكسورة.
  • لا يظهر أي تجاوز أفقي (horizontal overflow) على شاشات الهاتف المحمول.
  • تُظهر وحدة تحكم المتصفح (browser console) صفر أخطاء في JavaScript أو CSS.

فقط عندما تم اجتياز قائمة المراجعة، قام الفريق بإلغاء تنشيط الملحق القديم نهائيًا.

ما يقدمه الملحق الجديد

الملحق الواحد الناتج لا يقلص قاعدة الكود؛ بل يجعل الحدود مرئية فحسب. تشترك الآن جميع المجالات الوظيفية الاثني عشر في دورة حياة واحدة، ومجموعة واحدة من الروابط (hooks)، ومكان واحد لإدارة التبعيات. لم يجعل الملحق الجديد النظام أصغر، بل جعل الحدود مرئية، وهو ما ثبت أنه أكثر فائدة من امتلاك عدد أقل من الملحقات.

المخاطر والحجج المضادة

تُظهر حالة Optistream أن اتباع نهج منضبط يعتمد على "العقد أولاً" (contract-first) والتدشين التدريجي خطوة بخطوة يمكن أن يبقي المخاطر تحت السيطرة.

ما يجب مراقبته لاحقًا

إذا كنت تفكر في عملية دمج مماثلة، فابدأ بهذين الركنين:

  1. استقرار الروابط (URL stability) – قم برسم خريطة لكل مسار عام قبل كتابة سطر كود واحد.
  2. استقرار البيانات (Data stability) – تجنب إعادة تسمية حقول قاعدة البيانات ما لم تكن مستعدًا لعملية نقل كاملة.

ومن هناك، قم ببناء مُحمّل (loader) صغير، وحافظ على حصر نطاق CSS، وانقل الوحدات واحدة تلو الأخرى مع تشغيل قائمة مراجعة إنتاج دقيقة.