تعليقات HTML متعددة الأسطر غير مخفية في منشور من wp-discourse

مرحبًا،

لست متأكدًا مما إذا كانت هذه مشكلة خاصة بـ wp-discourse أو بمحلل HTML في Discourse نفسه، لكن يبدو أن تعليقات HTML متعددة الأسطر لا تُخفى في المنشورات المُنشأة بواسطة wp-discourse.

لقد انتهيت للتو من إعداد chinwag.pluralistic.net، استنادًا إلى منشورات pluralistic.net لكوري دكتورو. تتضمن منشوره بعض البيانات الوصفية في الأعلى على شكل تعليقات HTML. مؤخرًا، تغير هذا التنسيق من سطر واحد إلى متعدد الأسطر.

يمكنك رؤية ذلك في هذا المنشور:

تم حذف تعليق سطر واحد من المقال الأصلي:

ومع ذلك، يتم عرض تعليق متعدد الأسطر من منشور لاحق مباشرةً:

لا أعتقد أن المشكلة سببها إضافة ووردبريس. إليك مثالًا على ترميز لا يتم تفسيره كتعليق من قِبل ديسكورش:

<p><!--
Tags:


Summary:
New podcast; Europe's interop coalition; Scarfolk beermats; Miami cop owns illegal mansion nightclub; Video and transcript of my OII talk; Shower temperature vs handle position

URL:
https://pluralistic.net/2020/07/06/polbathic/

Title:
Pluralistic: 06 Jul 2020 polbathic

Bullet:
🧔🏿

Separator:
_,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,_

Top Sources:
Today's top sources: Fipi Lele, Naked Capitalism (https://www.nakedcapitalism.com/).

--></p>

يظهر على النحو التالي:

المشكلة تكمن في أن الأسطر الفارغة داخل التعليق تُفسَّر على أنها فقرات من قِبل ديسكورش. وعندما يحدث ذلك، يصبح تعليق HTML غير صالح من حيث الترميز. إذا تم إزالة الأسطر الفارغة من داخل التعليق، فسيتم تفسيره بشكل صحيح من قِبل ديسكورش:

<p><!--
Tags:
Summary:
New podcast; Europe's interop coalition; Scarfolk beermats; Miami cop owns illegal mansion nightclub; Video and transcript of my OII talk; Shower temperature vs handle position
URL:
https://pluralistic.net/2020/07/06/polbathic/
Title:
Pluralistic: 06 Jul 2020 polbathic
Bullet:
🧔🏿
Separator:
_,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,_
Top Sources:
Today's top sources: Fipi Lele, Naked Capitalism (https://www.nakedcapitalism.com/).
--></p>

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

ربما تكون أفضل طريقة للتعامل مع هذا هي إزالة التعليقات من المنشور قبل نشره على Discourse. ربما يجب أن يقوم الإضافة بذلك افتراضيًا، لكن هذه هي المرة الأولى التي أواجه فيها هذه المشكلة.

تحتوي إضافة WP Discourse على فلتر يمكن ربطه لتحليل محتوى المنشور قبل نشره على Discourse. يُسمى هذا الفلتر wp_discourse_excerpt. يتم تمرير محتوى المنشور إليه كمتغير. إليك كيفية استخدام هذا الفلتر لإزالة جميع التعليقات من منشور WordPress قبل نشره على Discourse. يمكن استخدام هذا النمط لتعديل المنشور بطرق أخرى أيضًا:

add_filter( 'wp_discourse_excerpt', 'wpdc_custom_discourse_excerpt' );
function wpdc_custom_discourse_excerpt( $html ) {
	if ( ! extension_loaded( 'libxml' ) ) {

		return $html;
	}

	$use_internal_errors   = libxml_use_internal_errors( true );
	$disable_entity_loader = libxml_disable_entity_loader( true );
	$html_doc              = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>' . $html . '</body></html>';
	$doc                   = new \DOMDocument( '1.0', 'utf-8' );
	$doc->loadHTML( $html_doc );
	$finder   = new \DOMXPath( $doc );
	$comments = $finder->query( '//comment()' );
	if ( $comments->length ) {
		foreach ( $comments as $comment ) {
			$comment->parentNode->removeChild( $comment );
		}

		$parsed = $doc->saveHTML( $doc->documentElement );
		libxml_clear_errors();
		libxml_use_internal_errors( $use_internal_errors );
		libxml_disable_entity_loader( $disable_entity_loader );

		return preg_replace( '~<(?:!DOCTYPE|/?(?:html|head|meta|body))[^>]*>\s*~i', '', $parsed );
	}

	libxml_clear_errors();
	libxml_use_internal_errors( $use_internal_errors );
	libxml_disable_entity_loader( $disable_entity_loader );

	return $html;
}

يجب أن يؤدي إضافة هذا الكود إلى ملف functions.php في قالب WordPress الخاص بك إلى حل المشكلة. إذا لم يعمل معك، فتأكد من تفعيل امتداد libxml على خادم موقع WordPress الخاص بك.

سأجرب هذا بالتأكيد، لكنه يبدو وكأنه مشكلة أكبر إذا أدت كيانات HTML في تعليق إلى أن يقرر ديسكوس أن التعليق أصبح الآن HTML غير صالح، أليس كذلك؟

لست متأكدًا من كيفية تعامل Discourse مع هذا الأمر. أعتقد أنه بالنسبة للمشاركات التي يتم إنشاؤها مباشرة على Discourse، فمن المنطقي القول إن مجموعة فرعية محدودة من HTML مدعومة فقط، لكن بالنسبة للمشاركات التي يتم إنشاؤها عبر واجهة برمجة التطبيقات (API) أو عن طريق جلب تغذية RSS، فليس من الواضح لي إلى أي مدى يجب أن يذهب Discourse لدعم HTML.

أعتقد أنه سيكون من المنطقي إضافة الكود الذي نشرته أعلاه مباشرةً إلى إضافة WP Discourse. الإضافة تستخدم بالفعل وظائف مشابهة لتنظيف التعليقات المستوردة إلى WordPress من Discourse. وقد استُخدم هذا الإجراء لفترة من الوقت دون أي تقارير عن مشاكل. سأعود إليك بشأن هذا الأمر خلال الأيام القليلة القادمة.

تمت إضافة هذه الميزة في إصدار WP Discourse 2.0.6. عند نشر محتوى المنشور الكامل من WordPress إلى Discourse، ستتم إزالة أي كتل تعليقات موجودة في المنشور قبل إرساله إلى Discourse.

شكرًا لك، سيمون! سأقوم بالتثبيت فور توفره وسأبلغك بالنتيجة.

تحديث: يعمل بشكل رائع. شكرًا لك!