صفحة إعادة التوجيه لعناوين URL الخارجية

مرحبًا! أود إعادة توجيه جميع الروابط الخارجية (أو إذا لم يكن ذلك ممكنًا، فجميع الروابط) إلى مثلاً exit.website.tld/?page={{URL}}
هل هذا ممكن في Discourse؟ وإذا لم يكن كذلك، هل توجد إضافة (Plugin) لذلك؟ لقد بحثت بالفعل ولكن لم أستطع العثور على واحدة باستخدام استعلامات البحث التي استخدمتها.
شيء مشابه لكيفية عمل Steam. (مثال)

كنت أفكر في الأمر أيضًا؛ كنت أرغب في إرفاق رابط حفظ أرشيف الإنترنت بجميع الروابط الخارجية، ولنكن صريحين: سيكون من الرائع تعيين ذلك حسب الفئة.

أعتقد أن هناك نوعًا من الفلترة يمكن تنفيذه بواسطة إضافة، لكن الناس يقومون بأشياء باستخدام مكونات القالب تبدو وكأنها تتجاوز قواعد معالجة البيانات، لذا إذا لم يكن هذا ممكنًا حاليًا، فكيف يقترح الناس إضافة هذه الميزة: عبر إضافة أم عبر مكون القالب؟

نعتبر هذه الميزة نوعًا من الميزات المعادية للمستخدم (على غرار “تواقيع المنتديات”)، لذا سيكون من الضروري أن تكون على شكل إضافة. غير متأكد مما إذا كان يمكن تنفيذها في مكون من مكونات السمة.

لقد رأيت هذا الطلب من قبل في سياق السلامة، كما في

:scream: أوه لا! أنت على وشك زيارة رابط تشعبي لموقع ويب! هل استعدت نفسك للخطر الهائل؟!

وأعتقد أن ذلك قد يكون منطقيًا في بعض السياقات النادرة جدًا وفي بعض المجتمعات النادرة جدًا.. أوه.. أعتقد؟

أدير تصنيفًا لأرشفة المواقع الإلكترونية. حالة الاستخدام لدينا محددة للغاية / كسولة. :slight_smile:

أيضًا، أعتبر وكيل أرشيف الويب مشابهًا لالتقاط نسخة من صورة في رسالة، ولكن مرة أخرى، أدير تصنيفًا لأرشفة المواقع الإلكترونية. :nerd_face:

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

في رأيي، قد يكون الأمر في الواقع متعلقاً بالسلامة، لأنه بالطبع هنا في منتدى ميتا الخاص بـ Discourse أو في بعض منتديات البرمجة، يعرف الناس كيفية التمييز بين عناوين URL وما إلى ذلك، ولكن في المنتديات التي لا تركز على التكنولوجيا (خاصة المنتديات المخصصة لوظائف غير تقنية، والمدارس، وما إلى ذلك)، قد لا يلاحظ الكثيرون إذا كانوا على موقع يبدو مطابقاً ولكن له امتداد نطاق مختلف، أو ربما حتى اسم نطاق مختلف تماماً.
وبينما قد يكون هذا بالطبع معادياً للمستخدم في بعض المنتديات، لا أحد يقول إنه يجب تفعيله افتراضياً. يمكنك ببساطة جعله مثل مربع اختيار، والذي سيستخدم بعد ذلك صفحة من Discourse نفسه أو يربط صفحة مخصصة مباشرة.
في رأيي، هذه ميزة أساسية يجب أن تكون مباشرة في Discourse، ولكن بالطبع، هذا مجرد رأيي الشخصي.

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

لكن، إذا كان من الممكن تنفيذها في قالب، وهو ما أعتقد أنه ممكن، فإن من المنطقي أن منصة Discourse تدعم الميزة بالفعل، كل ما تحتاجه هو قالب لتنفيذها! يمكنك الاطلاع على دليل المطور لقوالب Discourse أو النشر في قناة Marketplace مع ذكر الميزانية. تقديري هو أن التكلفة لا تقل عن 1000 دولار، لكن قد أكون مخطئًا.

بينما لا أملك خبرة في قوالب Discourse وما شابه، فإن لدي خبرة أساسية في JS و HTML. شيء مثل هذا لا يجب أن يستغرق أكثر من 10-20 دقيقة من العمل. لماذا يحتاج ذلك إلى ميزانية قدرها 1000 دولار؟

إذا كان بإمكانك إنجاز الأمر في عشرين دقيقة، لكان عليك أن تنجزه بالفعل. لا تزال مهاراتي في جافا سكريبت وإمبير غير جيدة، ربما يكون الأمر أسهل بكثير مما أظن. أعتقد أنه يتطلب عدة ساعات من العمل.

يرجى نشر رابط لسمتك! لا يسعني الانتظار لرؤيته.

بعد حوالي 5 دقائق، حصلت على كود جافا سكريبت يعمل (ما زال يحتاج إلى بعض التحسينات، لكنه يعمل؛ 10 أسطر بالمناسبة).
الشيء الوحيد الذي أحتاج إلى اكتشافه الآن هو كيفية تشغيل هذا الكود بعد تحميل الصفحة…

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

بشكل عام، يتم التحقق فقط مما إذا كنت في صفحة مقال، ثم التكرار عبر جميع وسوم <article>، وإيجاد الوسم الفعلي للمحتوى بداخلها، والتكرار عبر جميع وسوم <a> الموجودة هناك، وإذا لم يكن الرابط (href) لموقع رسمي (باستخدام تعبير نمطي بسيط لذلك)، يتم إضافة رابط صفحة الخروج قبله.
لكن لا يزال لدي صعوبة في معرفة كيفية تشغيل كود JavaScript بعد تحميل الصفحة وتحميل جميع المحتويات الديناميكية (مثل المنشورات). سيكون الحل المؤقت هو تشغيل الكود بعد 1-2 ثانية، لكن هذا ليس مثالياً، وقد يستغرق الأمر وقتاً أطول من ذلك لدى بعض الأشخاص لتحميل الصفحة…

يمكن بالتأكيد تنفيذه كمكون سمة، لكن ضع في اعتبارك أنه سيتعين أن يكون إضافة إذا أردت أن يؤثر أيضًا على عرض الزاحف.

ما تبحث عنه يُسمى “زخرفة المنشور” (post decorator). إنه خطاف يسمح لك بتشغيل السكريبتات قبل عرض كل منشور. وهو جزء من واجهة برمجة التطبيقات للإضافات.

الآن، فيما يتعلق بما تريد فعله (إعادة توجيه جميع الروابط الخارجية). لا أعتقد أن إضافة مثل هذا الاحتكاك فكرة جيدة، لذا لا يمكنني مساعدتك في ذلك - بالإضافة إلى أنك قد استنتجت ذلك الجزء بالفعل. مع ذلك، إليك مثال مُعلق يوضح كيفية إنشاء إعداد يستهدف جميع الروابط الخارجية في المنشورات

يتم وضع هذا في قسم header من السمة الخاصة بك أو مكون السمة

<script type="text/discourse-plugin" version="0.8">
  // تخزين اسم المضيف (hostname) لإعادة استخدامه.
  const siteHostname = location.hostname;
  
  // لنقم بإنشاء زخرفة لتنفيذ ذلك في كل منشور
  api.decorateCooked(
    post => {
      // هل يحتوي المنشور على روابط؟
      const links = [...post[0].querySelectorAll("a")];
      
      // لا توجد روابط، نخرج.
      if (!links.length) return;
      
      لدينا روابط، فلنقوم بتصفيتها ونستخرج فقط تلك الخارجية
      const externalLinks = links.filter(
        link => link.hostname !== siteHostname
      );
      
      // إذا كانت لدينا روابط خارجية، فلنقم ببعض العمل. على سبيل المثال، يمكننا
      // إضافة فئة إلى كل رابط خارجي كالتالي.
      externalLinks.forEach(link => {
        link.classList.add('external-link');
        // قم بمزيد من العمل هنا.
      });
    },
    // نعطي زخرفتنا معرفًا لمنع تسرب الذاكرة.
    { id: "external-link-decorator" }
  );
</script>

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

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