اكتشاف الصور المكررة في ووردبريس دون كسر ترجمات WPML

اكتشاف الصور المكررة في ووردبريس دون كسر ترجمات WPML

لو موقعك عربي وإنجليزي، ووردبريس الذي تُخزَّن فيه كل الصور والفيديوهات والملفات التي ترفعها، مع بياناتها مثل النص البديل. تنظيمها وضغط صورها ينعكسان على سرعة…">ومكتبة الوسائط عندك فيها آلاف الصور بعد كذا نقل للموقع، فأغلب الظن إن نصها متكرر ونص التكرار ده مش تكرار أصلاً. مطوّر إضافة مجانية اسمها Filikod جرّب يكتشف الصور المكررة على موقع عميل فيه 3,099 صورة وثلاث لغات، و3 افتراضات عنده وقعت في نفس اليوم. الدروس دي تنفعك سواء بتبني أداة أو بتنضّف موقعك.

الافتراض الأول: الصورة المكررة لها اسم مكرر

المتوقع أن تكون النسخ بأسماء مثل photo.jpg وphoto-1.jpg. بعضها كذلك، لكن أغلبها لا. لقطة شاشة واحدة قد تُرفع ثلاث مرات في ثلاثة أشهر، على يد ثلاثة محررين، بثلاثة عناوين ونصوص بديلة مختلفة. لا شيء في مكتبة الوسائط (Media Library) يربط بينها.

لذلك يجب أن تُعرَّف الصورة بمحتواها لا باسمها. بصمة (Hash) لبايتات الملف، مثل md5_file() أو sha1_file() في PHP، تكفي لالتقاط النسخ المتطابقة تماماً. أما النسخ المصغّرة أو المعاد ضغطها فهي ملفات مختلفة وقرار مختلف، وقد استبعدها الكاتب عمداً.

تنبيه: منذ ووردبريس 5.3، الصورة الكبيرة تُصغَّر عند الرفع ويشير المرفق إلى النسخة المصغّرة، بينما يبقى الأصل على السيرفر. رفع الصورة نفسها مرتين ينتج غالباً نسختين مصغّرتين متطابقتين، لكن ليس دائماً، خصوصاً لو تغيّرت مكتبة معالجة الصور على السيرفر بين الرفعتين. احسب البصمة على الملف الأصلي حين يكون موجوداً، ودالة wp_get_original_image_path() تعطيك مساره.

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

الافتراض الثاني: نفس الملف يعني نفس المشكلة

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

WPML Media Translation وPolylang وBogo تنشئ كلها مرفقاً منفصلاً لكل لغة يشير إلى نفس الملف الفعلي. البصمة متطابقة، لكنها ليست نسخاً للتنظيف. احذف إحداها، وتفقد النسخة الإسبانية من الصفحة صورتها.

والمشكلة كانت أعمق: أداة فحص النص البديل (Alt Text) كانت تخطئ منذ أشهر على هذا الموقع. نسخ الصورة الثلاث تحمل نفس النص البديل، وهذا طبيعي لاسم علامة تجارية، فكانت الأداة تحسبها ثلاثة أخطاء “نص بديل مكرر” وتخفض التقييم بلا سبب.

القاعدة: مجموعة الترجمة = صورة واحدة. كل إضافة ترجمة تحفظ روابط الترجمات في مكان يمكن ومنشئ الاستعلامات مع القالب كاملًا والنماذج والنوافذ المنبثقة.">Elementor.">JetEngine تبني الاستعلامات بصريًا بمنشئ…">الاستعلام عنه:

الإضافةأين تحفظ روابط الترجمةتحتاج معالجة؟
WPMLجدول خاص بها في السيرفر.">قاعدة البياناتنعم
Polylangتصنيف (Taxonomy) مخفينعم
Bogoحقل مخصص (Post Meta)نعم
Weglot / GTranslate / TranslatePressلا تنشئ مرفقاً ثانياًلا
WPGlobusكل اللغات في منشور واحدلا
MultilingualPressموقع منفصل لكل لغةلا

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

النتيجة بعد الإصلاح على نفس المكتبة: 29 مجموعة حقيقية و30 ملفاً زائداً فقط. صورة منتج مستخدمة في صفحتين باسمين، وأيقونة رفعها محرران، وشعار شريك موجود أربع مرات. قائمة يمكن لإنسان مراجعتها في عشرين دقيقة.

ملاحظة: المواقع العربية الإنجليزية في المنطقة تعتمد كثيراً على WPML أو Polylang، فالموضوع ده يخصك مباشرة. قبل ما تستخدم أي إضافة “تنظيف وسائط”، تأكد إنها بتفهم مجموعات الترجمة، وإلا ممكن تمسح صور النسخة العربية من موقعك وأنت مش واخد بالك.

الافتراض الثالث: مكتبة الوسائط تحتوي ملفات

انتهى الفحص و232 صورة “في الانتظار”. لم تكن تنتظر شيئاً. كانت مرفقات ملفاتها لم تعد موجودة على السيرفر، بقايا عمليتي نقل للموقع، ما زالت ظاهرة في المكتبة بعنوان ونص بديل، ومستخدمة في بعض الصفحات، وتظهر للزوار صوراً مكسورة.

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

افحص موقعك: لكل مرفق، get_attached_file() تعطيك المسار، وfile_exists() تخبرك هل الملف موجود فعلاً.

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

WPML وPolylang يفلتران استعلامات لوحة التحكم (Dashboard) حسب اللغة المختارة في شريط الإدارة. أداة الكاتب كانت تتخطى ثلثي المكتبة بصمت لأن اللغة المختارة كانت الفرنسية، حتى أضاف هذا الإعداد إلى الاستعلام ليتجاهل فلاتر الإضافات الأخرى:

‘suppress_filters’ => true,

لو كتبت يوماً أداة فحص أو تصدير أو سكريبت تنظيف يعمل داخل لوحة تحكم موقع متعدد اللغات، قارن أرقامك بعدّ مباشر من قاعدة البيانات (Database). أرقام الكاتب كانت ناقصة 1,838 صورة. مثال لعدّ الصور مباشرة (غيّر بادئة الجداول wp_ إن كانت مختلفة عندك):

SELECT COUNT(*) FROM wp_posts

WHERE post_type = ‘attachment’

  AND post_mime_type LIKE ‘image/%’;

لماذا لا تحذف الأداة شيئاً تلقائياً؟

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

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

في Elementor: صفحات Elementor تحفظ روابط الصور ومعرّفاتها داخل حقل _elementor_data بصيغة JSON، لا في محتوى المقالة العادي. لذلك لو حذفت صورة “مكررة” من المكتبة، قد لا تظهر لك أنها مستخدمة في أي مقالة، بينما هي داخل تصميم صفحة. ونفس الشيء ينطبق على الحقول المخصصة في JetEngine. افتح الصفحة وتأكد قبل الحذف.

أرقام أول يوم فحص

المؤشرالرقم
إجمالي الصور في المكتبة3,099
صور حُسبت بصمتها2,867
مرفقات بلا ملف على السيرفر232
مجموعات مكررة قبل معالجة الترجماتعدة مئات
مجموعات مكررة حقيقية بعدها29
ملفات زائدة ومساحتها30 ملفاً، 11 ميجابايت
صور كانت أداة النص البديل تتخطاها1,838

الخلاصة

التكرار الحقيقي يُعرف من محتوى الملف لا من اسمه، ومجموعة الترجمة صورة واحدة لا ثلاث، والمرفقات بلا ملفات مشكلة مستقلة تستحق قائمتها. وعلى أي موقع متعدد اللغات، راجع أرقام أدواتك مقابل قاعدة البيانات مباشرة.

الإضافة اللي اتكلمنا عنها اسمها Filikod، مجانية ومرخّصة GPL على مستودع ووردبريس لو حابب تجربها. ولو موقعك متعدد اللغات ومحتاج حد يراجع معاك مكتبة الوسائط قبل ما تنضفها، احجز جلسة من هنا احجز استشارة مجانية.

مرجع المقال (بالإنجليزية): Finding duplicate images in a WordPress media library, without flagging WPML translations
المقال ده مش ترجمة حرفية: متكيّف للقارئ العربي ومضاف عليه سياق ووردبريس وElementor وJetEngine.

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

كيف أعرف الصور المكررة في مكتبة وسائط ووردبريس؟

الاعتماد على اسم الملف لا يكفي، لأن الصورة نفسها قد تُرفع بأسماء مختلفة. الطريقة الموثوقة هي حساب بصمة (Hash) لمحتوى الملف ومقارنة البصمات المتطابقة.

هل ترجمات WPML للصورة تعتبر صوراً مكررة؟

لا. WPML وPolylang ينشئان مرفقاً منفصلاً لكل لغة يشير إلى نفس الملف. حذف أحدها قد يُفقد نسخة اللغة الأخرى صورتها، لذلك يجب معاملة مجموعة الترجمة كصورة واحدة.

لماذا يختلف عدد الصور في أداتي عن العدد الحقيقي على موقع متعدد اللغات؟

لأن إضافات الترجمة تفلتر استعلامات لوحة التحكم حسب اللغة المختارة. أضف ‘suppress_filters’ => true إلى استعلامك وقارن النتيجة بعدّ مباشر من قاعدة البيانات.

هل أحذف الصور المكررة تلقائياً؟

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

اترك تعليقاً