انتقل للمحتوى
اعطال ووردبريس

تعارض إضافتين في ووردبريس رغم عمل كل واحدة وحدها: تجربة مصفوفة

إضافتان كل واحدة بتشتغل لحالها، لكن لما تفعلهم مع بعض الموقع يتعطل؟ هذا تعارض حقيقي، وممكن يضيع اذا جربت تعطيل مجموعة كبيرة مرة واحدة. لازم تعمل مصفوفة: A وحدها، B وحدها، A+B، وبعد الاصلاح A+B مرة ثانية.

إضافة المختبر A حولت قيمة فلتر من string إلى array. الإضافة B القديمة افترضت ان القيمة دايما string وشغلت عليها strtoupper(). A وحدها رجعت 200، وB وحدها رجعت 200، لكن الاثنين معا رجعوا TypeError وHTTP 500. عدلنا B لتفحص النوع وتحافظ على بنية A، فعاد الرد 200.

التعارضات تظهر في دعم ووردبريس عن تعارض اعتماد بين إضافتين، ونقاش ريديت عن صعوبة اكتشاف زوج متعارض يوضح لماذا التقسيم النصفي وحده قد يخفي المشكلة. دليل اخطاء ووردبريس الشائعة الرسمي يوصي بعزل الإضافات عند مشاكل التوافق.

مصفوفة النتيجة

  • A وحدها: HTTP 200 ونوع array.
  • B وحدها: HTTP 200 ونوع string وقيمة BASE.
  • A+B قبل الاصلاح: HTTP 500 وTypeError.
  • A+B بعد فحص النوع: HTTP 200 وarray فيها normalized=PLUGIN-A.

A وحدها سليمة

تقرير يظهر HTTP 200 ونتيجة array صحيحة عند تفعيل الإضافة A وحدها
A حولت القيمة إلى array والـ endpoint قبلها.

B وحدها سليمة

تقرير يظهر HTTP 200 وتحويل القيمة BASE عند تفعيل الإضافة B وحدها
B استلمت base كنص وحولته إلى BASE.

لو وقف الاختبار هون، كل مطور رح يقول إضافته شغالة. المشكلة ما ظهرت الا لما مر ناتج A إلى B عبر نفس الفلتر.

الاثنتان معا

تقرير يظهر HTTP 500 وTypeError لان الإضافة الثانية توقعت string واستلمت array من الأولى
B استلمت array بدل string، فحصل TypeError ورجع endpoint 500.

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

بعد اصلاح العقد

تقرير يظهر HTTP 200 واحتفاظ النتيجة ببنية array بعد فحص النوع
B فحصت النوع واضافت قيمتها من غير تدمير بنية A، فعاد 200.

فيديو توثيق التجربة الفعلية

هذا تسجيل شاشة صامت ومتواصل للاختبار وهو يحدث داخل بيئة محلية معزولة. تظهر الخطوات والنتائج الفعلية لحظة التنفيذ، من غير تركيب صور ثابتة.

تسجيل شاشة صامت ومتواصل لتجربة فعلية داخل بيئة محلية معزولة. يعرض الحالة السليمة، تنفيذ المسبب، ظهور النتيجة، ثم الاصلاح واعادة الفحص. لا يستخدم صورا مركبة.

كيف تعزل تعارضا بدون اسقاط الإنتاج؟

  1. خذ نسخة واشتغل على staging او troubleshooting mode.
  2. حدد الوظيفة المكسورة وطلبا واحدا يعيدها.
  3. سجل نسخ PHP وWordPress والقالب والإضافات.
  4. جرب الإضافة المشتبه بها وحدها.
  5. جرب كل طرف وحده ثم الزوج معا.
  6. اقرأ اول fatal او console error او request فاشل.
  7. ثبت النتيجة بعد الاصلاح بنفس المصفوفة.
  8. رجع قائمة الإضافات الاصلية وتأكد من الكاش وCron.

ليش تعطيل النصف ممكن يخدعك؟

اذا التعارض يحتاج A وB معا، ووضع التقسيم كل واحدة في نصف مختلف، تعطيل اي نصف يزيل طرفا ويختفي الخطأ. بتعرف ان المشكلة في مجموعة كبيرة لكن ما بتعرف الزوج. بعد العزل العام، اعمل اختبار pairwise للمشتبه بهم.

انواع تعارض شائعة

  • نسختان مختلفتان من مكتبة Composer بنفس namespace.
  • اسم دالة او class عام مكرر.
  • فلتر يغير نوع البيانات من غير توثيق.
  • إضافتا كاش او تحسين تعدلان نفس HTML.
  • JavaScript global او CSS selector مشترك.
  • ترتيب hooks يخلي واحدا يعمل قبل تهيئة الثاني.
  • REST route او Cron hook بنفس الاسم لكن عقد مختلف.

شو ترسل لمطوري الإضافتين؟

ارسل المصفوفة والنسخ وstack trace والطلب الذي يعيد المشكلة. وضح ان A فقط pass وB فقط pass والزوج fail. اذا عندك سطر ونوع متوقع ونوع فعلي، اذكرهم. هاي معلومات اقوى بكثير من جملة الإضافات متعارضة.

namespace وscoping

اذا المشكلة اعتماد مشترك، تحديث المكتبة او prefixing/scoping قد يمنع تحميل نسختين تحت نفس الاسم. اذا المشكلة فلتر، وثق الشكل المتوقع ولا تغير النوع من غير توافق خلفي. الحل يعتمد على سبب التعارض، مش وصفة واحدة.

لا تصلحها بتعطيل الأخطاء

اخفاء display_errors يحمي الزوار من التفاصيل لكنه ما يحل TypeError. لازم يبقى الخطأ في log وتصلح العقد او ترتيب التحميل. وكذلك رفع الذاكرة ما له علاقة بتعارض نوع البيانات.

حدود تجربتنا

الإضافتان مصممتان للمختبر والتعارض مقصود. المواقع الحقيقية قد تتعارض في JavaScript او CSS او SQL بدل PHP. القيمة هي طريقة المصفوفة والاثبات ان كل إضافة سليمة منفردة والزوج وحده يفشل.

الخلاصة

A رجعت 200 وحدها، وB رجعت 200 وحدها، لكنهما معا رجعتا 500 لان B توقعت string. بعد فحص النوع والحفاظ على بنية الفلتر عاد الزوج إلى 200. اثبات التعارض يحتاج مصفوفة، مش تخمينا باسم آخر إضافة حدثت.