إزاي تعرف إن إضافة ووردبريس مهجورة؟ 5 إشارات

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

عندك موقع عميل فيه 25 إضافة، وواحدة منهم آخر تحديث ليها من سنتين. هل هي مهجورة فعلًا ولا شغالة تمام ومش محتاجة تحديث؟ للأسف مفيش خانة واحدة في ووردبريس تقولك الإجابة، بس فيه 5 إشارات لو قريتهم مع بعض هتعرف الحقيقة.

الإضافة المهجورة (Abandoned Plugin) هي التي توقف مطوّرها عن صيانتها. لا يوجد تعريف رسمي لها، لكن البيانات التي ينشرها مستودع إضافات ووردبريس (API عامًا يكشف تاريخ آخر إصدار وحالة الإغلاق لكل إضافة دون تسجيل.">WordPress.org Plugin Directory) كافية للحكم إذا قرأتها بالطريقة الصحيحة.

حالتان بنفس الرسالة ومعنيين متعاكسين

اسأل واجهة برمجة التطبيقات (API) الخاصة بالمستودع عن إضافة Display Widgets، وستحصل على هذا الرد:

{
  "error": "closed",
  "description": "This plugin has been closed as of January 30, 2021 and is not available for download. This closure is permanent. Reason: Security Issue."
}

ثم اسألها عن Paid Memberships Pro:

{
  "error": "closed",
  "description": "This plugin has been closed as of October 17, 2024 and is not available for download. This closure is permanent. Reason: Author Request."
}

الرسالة نفسها تقريبًا، وكلمة “permanent” في الحالتين. لكن الأولى سُحبت بسبب ثغرة أمنية، والثانية خرجت من المستودع بقرار مطوّريها واستمرت في إصدار التحديثات من موقعها الخاص حتى سبتمبر 2026.

أي فحص يكتفي بسؤال “هل الإضافة موجودة في المستودع؟” سيعامل الحالتين بالطريقة نفسها، وهذا خطأ.

اجمع البيانات بنفسك أولًا

كل ما يلي يأتي من نقطة وصول عامة واحدة، بلا مفتاح ولا تسجيل:

curl -s "https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&request[slug]=akismet&request[fields][sections]=0"

الحقول التي تهمك عند تقييم الصيانة:

الحقلماذا يحتوي
versionالإصدار الحالي
——
last_updatedتاريخ آخر إصدار، مثل 2026-08-18 11:42pm GMT
testedأحدث إصدار ووردبريس يقول المطوّر إنه اختبر الإضافة عليه
requires_phpأقل إصدار PHP تحتاجه الإضافة
active_installsعدد التثبيتات النشطة مقرَّبًا لأسفل، وليس رقمًا دقيقًا
support_threads / support_threads_resolvedمواضيع الدعم في الفترة الأخيرة، وكم منها مُعلَّم كمحلول

أما الإضافة المغلقة فلن تُرجع هذه الحقول، بل closed: true ومعها closed_date وreason مثل security-issue أو author-request.

الإشارة 1: تاريخ آخر إصدار (الأقوى)

الإصدار الجديد هو الدليل الوحيد على أن شخصًا عمل على الإضافة فعلًا مؤخرًا. استخدم هذا المقياس التقريبي:

  • أقل من 6 أشهر: الإضافة مُصانة بكل المقاييس.
  • من 6 إلى 11 شهرًا: تستحق نظرة، خاصة لو كانت إضافة كبيرة.
  • من 12 إلى 23 شهرًا: بدأت تشيخ. حدّد بديلها من الآن.
  • 24 شهرًا أو أكثر: اعتبرها غير مُصانة حتى يثبت العكس.

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

الخطر الحقيقي ليس التاريخ نفسه، بل ما يحدث عندما تصدر نسخة جديدة من PHP أو ووردبريس تكسر شيئًا ولا يوجد من يصلحه. والأفضل أن تعرف ذلك قبل أن تُرقّي شركة الاستضافة إصدار PHP، لا بعدها.

الإشارة 2: حقل Tested up to (يتقادم تلقائيًا)

حقل Tested up to (أحدث إصدار ووردبريس اختُبرت عليه الإضافة) يكتبه المطوّر بنفسه. ووردبريس يُصدر نسختين أو ثلاثًا رئيسية في السنة، لذلك أي إضافة لا يلمسها أحد ستتأخر في هذا الحقل حتى لو كانت تعمل بلا مشاكل.

يُظهر WordPress.org تحذيرًا على صفحة الإضافة إذا لم تُختبر مع آخر ثلاثة إصدارات رئيسية، وهو حد معقول. اقرأ الحقل دائمًا مع تاريخ الإصدار:

  • إصدار حديث + Tested up to قديم: غالبًا نسي المطوّر تحديث الرقم. القلق منخفض، لكن جرّب الإضافة في بيئة الاختبار (Staging) قبل أي ترقية رئيسية لووردبريس.
  • إصدار قديم + Tested up to قديم: الحقلان يقولان الشيء نفسه، والمهم هنا هو تاريخ الإصدار.

لا تحسبهما مشكلتين منفصلتين. إذا كان آخر إصدار أقدم من سنة، فتأخر Tested up to مجرد عَرَض لنفس الحقيقة.

الإشارة 3: الإغلاق ليس معناه واحدًا

هنا يفرّق حقل reason بين الحالتين اللتين بدأنا بهما:

  • security-issue (وأي سبب آخر يحدده فريق مراجعة الإضافات): المستودع سحب الإضافة. خذ الأمر بجدية، اعرف السبب، وخطّط لاستبدالها فورًا.
  • author-request: المطوّر طلب إزالة الإضافة. قد يعني ذلك أنه توقف، وقد يعني أنه نقل التوزيع إلى موقعه، كما فعلت Paid Memberships Pro.

في حالة author-request، الخطوة التالية أن تزور موقع المطوّر أو مستودعه على GitHub وتبحث عن إصدارات حديثة. إذا كان ما زال يُصدر تحديثات، فالإضافة مُصانة لكنها ببساطة خارج المستودع.

الإشارة 4: مواضيع الدعم (مُضلِّلة، استخدمها بحذر)

من المغري أن تقسم support_threads_resolved على support_threads وتعتبر الناتج مقياسًا لاستجابة المطوّر. لا تفعل ذلك بثقة.

الموضوع لا يُحسب محلولًا إلا إذا علّمه أحدهم كذلك. كثير من المطوّرين النشطين يردون على كل سؤال ولا يضغطون الزر، وكثير من المستخدمين لا يعودون لإغلاق مواضيعهم. كما أن العينة الصغيرة لا تعني شيئًا، فخمسة مواضيع منها اثنان محلولان لا تخبرك بأي شيء.

استخدم النسبة كدافع لفتح المنتدى وقراءة آخر صفحة من المواضيع بنفسك. إذا وجدت ردودًا حديثة من المطوّر، فالإضافة مدعومة مهما كانت النسبة.

الإشارة 5: الإضافات المدفوعة خارج الصورة كلها

الإضافات المدفوعة (Premium Plugins) التي تُباع من موقع مطوّرها لا توجد في المستودع، فلا تنطبق عليها أي من الحقول السابقة. وهذا طبيعي تمامًا، لكن له خطره الخاص.

القالب كاملًا والنماذج والنوافذ المنبثقة.">Elementor Pro وJetEngine. تحديثاتها مرتبطة بترخيص فعّال، فإذا انتهى الترخيص توقفت الإصلاحات دون أي تنبيه.">الإضافة المدفوعة تحصل على التحديثات عادةً فقط ما دام ترخيص الإضافة (Plugin License) فعّالًا. عندما ينتهي الترخيص تستمر الإضافة في العمل، لكنها تتوقف بهدوء عن تلقي الإصلاحات، ولن يُنبّهك الموقع بشيء.

في Elementor: هذا السيناريو شائع جدًا في مواقع العملاء المبنية على Elementor Pro وJetEngine. العميل يدفع الترخيص بالدولار أول سنة، ثم ينسى التجديد لأن بطاقته لا تدعم الدفع الدولي أو لأن التجديد كان على حساب المطوّر القديم. احتفظ بجدول بسيط فيه كل ترخيص، وتاريخ انتهائه، والبريد المسجَّل عليه، ومن المسؤول عن تجديده.

الصورة الكاملة في جدول واحد

ما تراهكيف تقرؤه
إصدار حديث + Tested up to حديثمُصانة
——
إصدار حديث + Tested up to قديممُصانة، اختبرها قبل الترقيات الكبيرة
لا إصدار منذ 12 شهرًا أو أكثرتشيخ، جهّز بديلها
لا إصدار منذ 24 شهرًا أو أكثر + إضافة كبيرةاعتبرها غير مُصانة
مغلقة بسبب security-issueاستبدلها
مغلقة بسبب author-requestراجع موقع المطوّر قبل أن تقرر
غير موجودة في المستودعمدفوعة أو مخصصة، راجع الترخيص

سكربت يفحص قائمة إضافات دفعة واحدة

احفظ الكود التالي في ملف باسم check-plugins.mjs وشغّله على Node 18 أو أحدث، ومرّر له أسماء الإضافات (Slugs):

node check-plugins.mjs akismet contact-form-7 display-widgets
const API = 'https://api.wordpress.org/plugins/info/1.2/';

function monthsSince(lastUpdated) {
  const date = new Date(lastUpdated.replace(/(d)(am|pm)/i, '$1 $2'));
  if (Number.isNaN(date.getTime())) return null;
  return Math.floor((Date.now() - date.getTime()) / (1000 * 60 * 60 * 24 * 30.44));
}

async function check(slug) {
  const url = `${API}?action=plugin_information&request[slug]=${encodeURIComponent(slug)}&request[fields][sections]=0`;
  const res = await fetch(url);
  const data = await res.json();

  if (data.closed) {
    return `${slug}: closed on ${data.closed_date} (${data.reason})`;
  }
  if (data.error) {
    return `${slug}: not in the directory (premium, custom, or a typo)`;
  }

  const months = monthsSince(data.last_updated);
  const age = months === null ? 'unknown' : `${months} month${months === 1 ? '' : 's'} ago`;
  return `${slug}: v${data.version}, last release ${age}, tested up to ${data.tested}`;
}

for (const slug of process.argv.slice(2)) {
  console.log(await check(slug));
}

تفصيلتان مهمتان في الكود: حقل last_updated يأتي بصيغة مثل 2026-08-18 11:42pm GMT، ومحلل التواريخ في JavaScript لا يقبلها بشكل موثوق إلا بعد إضافة مسافة قبل pm، وهذا ما تفعله الدالة monthsSince. والثانية أن الاسم غير الموجود أصلًا يُرجع error بدون closed، لذلك رسالة “not in the directory” تشمل الأخطاء الإملائية أيضًا، لا الإضافات المدفوعة فقط.

لو عندك WP-CLI على السيرفر، تقدر تطلع قائمة الأسماء جاهزة بالأمر التالي ثم تمرّرها للسكربت:

wp plugin list --field=name

الأسئلة الشائعة

س: هل كل إضافة لم تُحدَّث منذ سنة خطيرة؟
ج: لا. الإضافات الصغيرة ذات الوظيفة الواحدة قد تعمل لسنوات بلا تعديل. الخطر يزيد مع حجم الإضافة ومدى تعاملها مع أجزاء تتغير كثيرًا مثل الدفع ومنشئات الصفحات.

س: ماذا أفعل إذا وجدت إضافة مغلقة بسبب ثغرة أمنية؟
ج: اعتبرها أولوية قصوى. ابحث عن بديل مُصان، واختبر الاستبدال في بيئة الاختبار، ثم احذف الإضافة القديمة نهائيًا ولا تكتفِ بتعطيلها.

س: كيف أعرف حالة الإضافات المدفوعة مثل Elementor Pro؟
ج: من حسابك على موقع المطوّر. تأكد أن الترخيص فعّال ومربوط بالموقع، وأن صفحة الإضافات في لوحة التحكم تعرض التحديثات المتاحة لها.

س: هل نسبة المواضيع المحلولة في الدعم مؤشر موثوق؟
ج: ليست موثوقة وحدها، لأن كثيرًا من المواضيع لا تُعلَّم كمحلولة حتى بعد الرد عليها. افتح المنتدى واقرأ آخر المواضيع بنفسك.

الخلاصة

مفيش رقم سحري، بس تاريخ آخر إصدار هو أقوى إشارة، وسبب الإغلاق بيفرق جدًا، والإضافات المدفوعة محتاجة متابعة تراخيص مش فحص تقني. القاعدة البسيطة: أي إضافة عدّت سنة من غير إصدار، اعرف بديلها من دلوقتي، لأن اليوم اللي هتحتاجه فيه غالبًا هو يوم ما الاستضافة ترقّي PHP.

مرجع المقال (بالإنجليزية): How to Tell If a WordPress Plugin Is Abandoned (One Field Won’t Tell You)
المقال ده مش ترجمة حرفية: متكيّف للقارئ العربي ومضاف عليه سياق ووردبريس وElementor وJetEngine.

اترك تعليقاً