Multi-Zeilen-HTML-Kommentare in einem Beitrag von wp-discourse nicht ausgeblendet

Hallo,

ich bin mir nicht sicher, ob dies ein Problem von wp-discourse selbst ist oder vom HTML-Parser in Discourse. Es sieht jedoch so aus, als ob mehrzeilige HTML-Kommentare in von wp-discourse generierten Beiträgen nicht ausgeblendet werden.

Ich habe gerade die Einrichtung von chinwag.pluralistic.net abgeschlossen, die auf den Beiträgen von Cory Doctorow von pluralistic.net basiert. Seine Beiträge enthalten oben einige Metadaten in Form von HTML-Kommentaren. Kürzlich wurde dieses Format von einzeilig auf mehrzeilig geändert.

Sie können dies in diesem Beitrag sehen:

Der einzeilige Kommentar aus dem Originalartikel wurde entfernt:

Der mehrzeilige Kommentar aus einem späteren Beitrag wird jedoch direkt angezeigt:

Ich glaube nicht, dass das Problem durch das WordPress-Plugin verursacht wird. Hier ist ein Beispiel für Markup, das von Discourse nicht als Kommentar interpretiert wird:

<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/).

--><br></p>

Wird dargestellt als:

Das Problem besteht darin, dass die leeren Zeilen innerhalb des Kommentars von Discourse als Absätze interpretiert werden. Dadurch ist der HTML-Kommentar keine gültige Markup mehr. Wenn die leeren Zeilen innerhalb des Kommentars entfernt werden, wird er von Discourse korrekt interpretiert:

<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/).
--><br></p>

Abgesehen davon, dass man den Beitraginhalt vor der Veröffentlichung auf Discourse bearbeitet, bin ich mir nicht sicher, welcher Ansatz am besten geeignet wäre, um damit umzugehen.

Der wahrscheinlich beste Weg, damit umzugehen, besteht darin, die Kommentare aus dem Beitrag zu entfernen, bevor der Beitrag an Discourse veröffentlicht wird. Vielleicht sollte das Plugin dies standardmäßig tun, aber mir ist dieses Problem zum ersten Mal begegnet.

Das WP Discourse-Plugin verfügt über einen Filter, der verwendet werden kann, um den Beitragstext zu analysieren, bevor er an Discourse veröffentlicht wird. Der Filter heißt wp_discourse_excerpt. Der Beitragstext wird als Variable an ihn übergeben. So kann dieser Filter verwendet werden, um alle Kommentare aus dem WordPress-Beitrag zu entfernen, bevor er an Discourse veröffentlicht wird. Dieses Muster kann auch verwendet werden, um den Beitrag auf andere Weise zu ändern:

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;
}

Das Hinzufügen dieses Codes zur Datei functions.php Ihres WordPress-Themes sollte das Problem lösen. Wenn es bei Ihnen nicht funktioniert, überprüfen Sie, ob die libxml-Erweiterung auf dem Server Ihrer WordPress-Website aktiviert ist.

Ich werde das tatsächlich versuchen, aber es klingt nach einem größeren Problem, wenn HTML-Entitäten in einem Kommentar dazu führen, dass Discourse diesen Kommentar als ungültiges HTML betrachtet, oder?

Ich bin mir nicht sicher, wie Discourse damit umgehen sollte. Ich denke, dass es für Beiträge, die direkt in Discourse erstellt werden, sinnvoll ist zu sagen, dass nur eine begrenzte Teilmenge von HTML unterstützt wird. Für Beiträge, die über die API erstellt oder durch Einlesen eines RSS-Feeds importiert werden, ist mir jedoch nicht klar, wie weit Discourse gehen sollte, um HTML zu unterstützen.

Ich finde es sinnvoll, den oben geposteten Code direkt in das WP-Discourse-Plugin aufzunehmen. Das Plugin verwendet bereits ähnliche Funktionen, um Kommentare zu bereinigen, die von Discourse nach WordPress importiert werden. Das wird seit einiger Zeit genutzt, ohne dass Probleme gemeldet wurden. Ich melde mich in den nächsten Tagen bei Ihnen dazu.

Dies wurde in WP Discourse Version 2.0.6 hinzugefügt. Wenn der vollständige Beitragsinhalt von WordPress an Discourse veröffentlicht wird, werden alle Kommentarblöcke im Beitrag entfernt, bevor der Beitrag an Discourse gesendet wird.

Danke, Simon! Ich werde es installieren, sobald es verfügbar ist, und mich wieder melden.

ETA: Funktioniert einwandfrei. Danke!