لدي موقع أنشر فيه دروسًا ومدونات متنوعة، وأستخدم Discourse كمنتدى وكتابعليقات باستخدام ميزة التضمين.
هذا يعمل بشكل رائع في الغالب، باستثناء أنه عندما أنشئ صفحة جديدة على الموقع الرئيسي، يتم تضمين كل المحتوى في منشور Discourse. بعض مستخدمي لا يعرفون حتى عن الموقع الرئيسي، لأنهم يقرؤون دائمًا المنشور الكامل على المنتدى! وهذا يمثل مشكلة لأن ميزات مثل محررات الأكواد المضمنة لا تعمل على Discourse، مما يعطي انطباعًا بتجربة معيبة.
في عالم مثالي، سيكون منشور Discourse مجرد رابط قصير وواضح جدًا للمنشور الأصلي على الصفحة الرئيسية. ربما شيء مثل هذا:
الردود على هذا الموضوع ستظهر كتعليقات على المنشور الأصلي!
لقد حاولت تعطيل إعداد embed truncate كما هو موضح في هذا الموضوع، ولكن يبدو أن هذا يخفي زر “عرض المنشور الكامل” ولكنه لا يزال يعرض كل المحتوى في المنشور.
لقد حاولت أيضًا تعديل رسالة embed.imported_from، ولكن هذا يغير فقط النص الصغير في الأسفل الذي يبدو أن الناس يفتقدونه بالفعل.
هل هناك إعداد أغفلته، أو حيلة أخرى يمكنني استخدامها لتخصيص النص في منشور Discourse يتم إنشاؤه تلقائيًا؟ ربما شيء يمكنني تضمينه في HTML للموقع الرئيسي لخداع Discourse لعرض الشيء الصحيح؟ أو لست ضد التعديل اليدوي، إذا كانت هناك طريقة لإصلاح مشكلة عرض تنسيق Markdown.
لقد عدت وراجعت إعداد embed truncate. بالنظر إليه مرة أخرى الآن، أعتقد أن تمكينه أفضل بشكل هامشي، لكنني ما زلت آمل في طريقة لتجنب عرض النص الكامل للمقال الأصلي في Discourse على الإطلاق. بعبارة أخرى، لا أريد إخفاء النص الكامل خلف نقرة زر - لا أريد أبدًا عرض النص الكامل، فقط رابط للمقال الأصلي.
السلوك الذي أحاول تجنبه هو أن يأتي المستخدمون إلى Discourse الخاص بي ويقرأون المقال كاملاً على Discourse، بدلاً من الصفحة الأصلية. هذه مشكلة لأن النص الكامل على Discourse غالبًا ما يحتوي على أخطاء (مع JavaScript التفاعلي، والكود المضمن، وما إلى ذلك)، ثم أتلقى تقارير عن أخطاء يكون حلها هو التوقف عن القراءة على Discourse والانتقال إلى الموقع “الحقيقي” بدلاً من ذلك.
بمعنى آخر، سلوك المستخدم الذي أحاول تشجيعه هو قراءة المقال كاملاً على الصفحة الأصلية، بدلاً من منشور Discourse.
قد يبدو هذا بسيطًا (وفي المخطط الكبير للأشياء هو كذلك) ولكن خوفي هو أن المستخدمين يأتون إلى Discourse الخاص بي، ويعتقدون أن سلوك الصفحة به أخطاء، وينصرفون قبل أن يدركوا أن هناك صفحة على موقعي “الحقيقي” يجب عليهم قراءتها بدلاً من Discourse.
بعض الخيارات الممكنة التي فكرت فيها:
هل هناك إعداد يخبر Discourse بتضمين رابط فقط، وعدم تضمين أي جزء من المنشور الأصلي على الإطلاق؟
هل هناك فئة CSS أو سمة أخرى يمكنني إضافتها إلى HTML الأصلي الخاص بي للإشارة إلى الجزء الذي يجب تضمينه (أو استبعاده) من المقال في منشور Discourse؟
ربما يمكنني إضافة CSS مخصص إلى Discourse لإخفاء زر Show Full Post...؟
شكرًا على الشرح يا كيفن. لا توجد إعدادات موجهة خصيصًا لهذه المشكلة، ولكن هناك طريقتان يمكنك من خلالهما التعامل مع هذا الأمر.
تخصيص HTML الذي يتم سحبه من موقعك
تعمل التضمينات عن طريق كشط المحتوى من موقع باستخدام جوهرة Readability. تستخدم الجوهرة ومخرجاتها الخيارات التالية لتصفية HTML الذي يتم كشطه
opts[:whitelist] = SiteSetting.allowed_embed_selectors if SiteSetting.allowed_embed_selectors.present?
opts[:blacklist] = SiteSetting.blocked_embed_selectors if SiteSetting.blocked_embed_selectors.present?
allowed_embed_classnames = SiteSetting.allowed_embed_classnames if SiteSetting.allowed_embed_classnames.present?
لذلك، يمكنك تعيين إعدادات الموقع allowed_embed_selectors أو blocked_embed_selectors أو allowed_embed_classnames لتقييد المحتوى الذي يتم سحبه من HTML الخاص بك وعرضه في منشور Discourse، على سبيل المثال، يمكنك تقييده بفئات غير موجودة حتى لا يتم سحب أي محتوى.
بعد ذلك، يتم إلحاق هذا الـ HTML بالمحتوى الذي تم كشطه من الموقع:
لذلك، ستحتاج فقط إلى تخصيص نص embed.imported_from في لوحة الإدارة لإخبار المستخدم بقراءة المحتوى على المدونة. لاحظ أنه يمكنك تضمين رابط المحتوى في هذا النص، على سبيل المثال، النسخة الإنجليزية من نص اللغة هي
This is a companion discussion topic for the original entry at %{link}
إخفاء زر “إظهار المنشور بالكامل”
كما اقترحت، يجب أن يعمل إخفاء زر “إظهار المنشور بالكامل” باستخدام CSS أيضًا.
أواجه صعوبة في فهم سبب عدم وجود خيار لتخصيص النص المضمن بالكامل. لا أريد كشط أي محتوى فعلي من عنوان URL المضمن، بدلاً من ذلك فقط رابط له مع وصف قصير (على سبيل المثال، الملخص الوصفي فقط).
أفعل هذا حاليًا عن طريق استدعاء API آلي، ولكني أرغب في التبديل إلى ميزة التضمين الأصلية.
حاولت إنشاء عنصر مخفي في الموقع الذي تم كشطه خصيصًا لـ Discourse لكشط هذا العنصر الفردي فقط، ولكن العيب هو أن onebox لن يتم عرضه للرابط.
يحتوي تخصيص embed.imported_from أيضًا على قيوده، نظرًا لأنه يتم إجباره دائمًا على علامة \u003csmall\u003e مما لا يسمح بأي تخصيص فعلي.
صحيح، أريد فقط إنشاء موضوع تلقائي كلما تم نشر مقال جديد في المدونة.
ومع ذلك، أريد أيضًا استخدام ميزة التضمين الأصلية لـ JS لعرض التعليقات أسفل منشور المدونة على الموقع الخارجي، والذي يأتي مع سلوك التضمين في المنتدى أيضًا.
يأتي التشغيل الآلي الحالي الخاص بي مع تأخير طفيف (ليس في الوقت الفعلي)، وتنفيذ إنشاء موضوع تلقائي في نظام إدارة المحتوى الخاص بنا كلما تم نشر مقال جديد يكون أكثر صعوبة، لأنه ليس مجرد نظام إدارة محتوى للمدونة ولا يوجد حتى حدث “نشر” مميز.
في أي حال، ستكون هناك تعارضات بين تضمين JS الذي يحاول إنشاء الموضوع والتشغيل الآلي الخاص بي، حيث يكون الأول أسرع في معظم الأوقات. لهذا السبب أريد “التبديل” إلى استخدام ميزة تضمين JS فقط، مع عيب أن المواضيع تحتاج إلى تحريرها يدويًا في كل مرة.
تريد فقط رابطًا مع وصف قصير في المنشور الأول للموضوع المرتبط في discourse.
هل هذا صحيح؟ بالنسبة للنقطة الثانية، هل جربت إعداد الموقع embed truncate؟ إذا كنت قد جربته، فما الذي لم يعجبك فيه؟ أفهم أنك تطرقت إلى ذلك قليلاً في ردك الأول، ولكن هل يمكنك شرح ما الذي تواجهه صعوبة فيه بالتحديد؟ ربما تعطي مثالاً لما يمنعك من تحقيق النتيجة المرجوة (وما هي بالضبط تلك النتيجة المرجوة).
تكمن المشكلة في تضمين الروابط (link onebox)، والذي لا يظهر لأن المحتوى المضمن يتم دائمًا تغليفه في علامات HTML.
أعلم أن هذا يبدو تفصيلاً بسيطًا (وهو كذلك)، لكن مشكلة جودة الحياة المتمثلة في الاضطرار إلى تعديل هذا يدويًا لكل مقال كبيرة وشيء أردت إصلاحه منذ فترة طويلة.
ما أريده أن يبدو عليه (باستخدام مثال لمنشور مدونة Discourse):
حاليًا، سأضطر إلى العبث بالعناصر المخفية على الموقع لتتمكن من كشط عنوان URL والملخص بشكل خاص، وحتى ذلك الحين، تكمن المشكلة في عدم عرض الـ onebox. الشيء الوحيد الذي يمكنني تخصيصه بالكامل تقريبًا هو جزء “اقرأ تدوينة كاملة…” في الأسفل.
أعتقد أن ما أطلبه هو القدرة على إضافة شيء إلى مقتطف JavaScript مثل هذا:
DiscourseEmbed = {
discourseUrl: 'https://forum.example.com/',
discourseEmbedUrl: 'https://blog.discourse.org/2024/03/a-warm-welcome-to-spiceworks',
discourseRaw: 'https://blog.discourse.org/2024/03/a-warm-welcome-to-spiceworks\n\nWe are thrilled to share the move of the Spiceworks community to Discourse! The Spiceworks team has worked closely with our migration team\n\n<small>Read the full blog post on <a href="https://blog.discourse.org/2024/03/a-warm-welcome-to-spiceworks/">discourse.org</a>. This post has been created automatically and replies will be shown on the website.</small>'
};
discourseEmbedRaw يعادل قيمة raw في طلب API عادي إلى /posts.json.
لكنني أتفهم أن هذا قد يكون مطلبًا لحالة استخدام نادرة وغير ذي صلة لمعظم المستخدمين. أعتقد أنني سأحاول حل هذا عن طريق إنشاء المواضيع عبر API قبل أن يحاول مقتطف JavaScript القيام بذلك.
سيؤدي هذا إلى حدوث مشكلات مختلفة. دعنا نترك هذا جانبًا في الوقت الحالي.
أقدر أنك ترغب في الحصول على تحكم كامل في كل شيء، ولكن تحمل معي بينما أحاول ترجمة احتياجاتك إلى تحسينات قد تكون قابلة للتطبيق على النظام الحالي. ضع في اعتبارك أن هذه مجرد اقتراحات وليس لدي سيطرة على ما يقبله فريق Discourse.
المنشور المضمن في Discourse يتكون أساسًا من شيئين:
تريد تخصيصه ليكون، على سبيل المثال، مجرد عنوان URL بحيث يمكن تحويله إلى onebox. أعتقد أن تحسينًا قابلاً للتطبيق هناك سيكون إعداد موقع يقوم ببساطة بتبديل هذا إلى “عنوان URL فقط”، بحيث لا تضطر إلى السماح للمسؤولين بإدخال HTML في مكان ما.
2. التحكم في محتوى HTML المقتطع
يمكنك القيام بذلك بالفعل. فقط قم بتعيين إعداد الموقع allowed embed classnames إلى اسم فئة عنصر استخدمته لتغليف المقتطف الذي تريده على موقعك، على سبيل المثال:
على Discourse
قم بتعيين إعدادات الموقع هذه:
embed truncate إلى false
allowed embed classnames إلى “discourse-excerpt”
على صفحة مدونتك
<div class="discourse-excerpt">
نحن متحمسون لمشاركة انتقال مجتمع Spiceworks إلى Discourse! لقد عمل فريق Spiceworks عن كثب مع فريق الترحيل لدينا
</div>
3. التحكم في ترتيب HTML “الاستيراد من”، ومحتوى HTML
إذا كنت أفهمك بشكل صحيح، فأنت تريد أن يأتي جزء “المستورد من” (على سبيل المثال، مجرد عنوان URL) قبل محتوى HTML (أو المحتوى المقتطع). مرة أخرى، أبسط طريقة للقيام بذلك ستكون إعداد موقع منطقي، شيء مثل embed imported from above content.
لذلك، باختصار، إذا كنت أفهمك بشكل صحيح، يمكنك تحقيق ذلك بإضافة إعدادين منطقيين وتعديلات صغيرة على فئة TopicEmbed. ستلاحظ أن كل هذه التغييرات تتعلق بـ discourse/discourse نفسه حيث يجب أن تحدث المعالجة.
كما ذكرت أعلاه، هذه مجرد اقتراحات حول كيفية تحقيق ما تريد القيام به. للحصول على هذه التغييرات، أو شيء مشابه، سيحتاج الأمر إلى موافقة من فريق Discourse.
نعم، هذا بالضبط ما كنت ألعب به، المشكلة هي أن المحتوى سيتم تغليفه في عدة علامات HTML، وهذا هو السبب في أن الـ onebox لن يتم تفعيله. حاولت فصل عنوان URL بعلامات <br> (لتشغيل الـ onebox)، ولكن يبدو أن أشياء كهذه يتم اقتطاعها تلقائيًا.
الحصول على عنوان URL الخاص بالتضمين الخاص بك لـ onebox هو مشكلة منفصلة. استخدم allowed embed classnames فقط لتعيين مقتطف النص كما في مثالي.
لأنك ستعيد اختراع العجلة فعليًا لمحاولة التحايل على ما هو في الواقع مشكلة تحليل TopicEmbed. سيؤدي ذلك أيضًا إلى فتح مجموعة جديدة من المشكلات، مثل ماذا لو لم يتم تنفيذ الكود الخاص بك بالترتيب الذي تتوقعه، على سبيل المثال، هناك حالة سباق أو استثناء آخر يتدخل. تحدث هذه الأنواع من المشكلات بشكل متكرر مع مزيج من الكود على موقع خارجي مع إضافة WP Discourse. باختصار، الأمر لا يستحق العناء.
يبدو أنك تعرف طريقك حول قاعدة الكود . تحتاج فعليًا إلى إجراء تغييرين بسيطين على هذا الكلاس.
على مدونتي، لدي <div> بمعرف forum-excerpt، وهو مخفي باستخدام display:none ولكنه يحتوي على HTML الذي أود عرضه في منشور Discourse. (أفعل هذا باستخدام بعض منطق Jekyll / Liquid، ولكن هذا لا ينبغي أن يهم حقًا.)
على Discourse الخاص بي، قمت بتعيين محدد CSS للعناصر المسموح بها في التضمينات إلى #forum-excerpt. على الرغم من أن div مخفي في صفحتي الفعلية، إلا أن المحتوى يظهر في المنتدى.
لقد قمت أيضًا بإلغاء تحديداقتطاع المنشورات المضمنة.
في قسم CSS المضمن، أعطي .button خطًا أكبر. هذا تغيير صغير ولكنه يجعل الزر لإضافة تعليق أكبر.
لقد قمت أيضًا بتخصيص نص embed.continue و embed.start_discussion و embed.imported_from، مما يغير ما يظهر في قسم التعليقات على موقعي.
هذا يعني أن لدي تحكمًا كاملاً في HTML الذي يظهر في منشور المنتدى. HTML الذي أقدمه هو في الأساس ما يعادل OneBox - إنه صورة مصغرة كبيرة ورابط للمنشور الرئيسي.
هذا يعمل بشكل مثالي بالنسبة لي، شكرًا لك على المساعدة المتأخرة!