Wenn man in WordPress ein Wort verlinkt und den Beitrag über ActivityPub im Fediverse veröffentlicht, wird der Link entfernt. Doch wie kann man ihn behalten?

Als ich das in einem Funktionswunsch auf GitHub gefragt habe, kam @obenland mit einer sehr schönen Lösung, die ich hier teilen möchte, da sie genau das tut, was ich wollte.

Am Ende sieht der folgende Text …

Franz jagt im komplett verwahrlosten Taxi quer durch Bayern

… im Fediverse so aus:

Franz jagt im komplett verwahrlosten Taxi (https://de.wikipedia.org/wiki/Taxi) quer durch Bayern

Ich musste allerdings den Filter anpassen, da ich nur den Textauszug verwende, wenn ich meine Inhalte teile. Das ist in Einstellungen > ActivityPub > Einstellungen > Aktivitäten > Beitragsinhalt über [ap_excerpt] definiert (und ein Legacy-Template-System). Deshalb konnte ich den Vorgeschlagenen Filter activitypub_the_content nicht verwenden. Ich musste den Code zum generischen Filter post_content anpassen und manuell prüfen, ob die aktuelle Anfrage eine ActivityPub-Anfrage ist.

Das ist der finale Code:

<?php
/**
 * Transform links behind text to text (link).
 *
 * @see		https://github.com/Automattic/wordpress-activitypub/issues/1859#issuecomment-3480894020
 *
 * @param	string	$content Current content
 * @return	string Updated content
 */
function plugin_format_activitypub_links_with_urls( string $content ): string {
	if ( ! \function_exists( 'Activitypub\is_activitypub_request' ) || ! \Activitypub\is_activitypub_request() ) {
		return $content;
	}

	$content = \preg_replace_callback(
		'/<a\s+([^>]*?)href=["\']([^"\']+)["\']([^>]*?)>(.*?)<\/a>/is',
		function( $matches ) {
			$href = $matches[2];
			$link_text = \wp_strip_all_tags( $matches[4] );

			if ( empty( $href ) || \strpos( $href, '#' ) === 0 ) {
				return $matches[0];
			}

			if ( $link_text === $href ) {
				return $matches[0];
			}

			return $link_text . ' (' . \esc_url( $href ) . ')';
		},
		$content
	);

	return $content;
}

\add_filter( 'post_content', 'plugin_format_activitypub_links_with_urls' );
Code-Sprache: PHP (php)

Er hat nur Auswirkungen auf Inhalt, den man über einen Fediverse-Client ansieht. Es ändert den Inhalt nicht, wenn man ihn in einem anderen Beitrag oder auf einer anderen Seite einbettet oder ähnliches.

Neuveröffentlichungen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Um auf deiner eigenen Website zu antworten, gib die URL deiner Antwort ein, die einen Link zur Permalink-URL dieses Beitrags enthalten sollte. Deine Antwort wird dann (möglicherweise nach der Moderation) auf dieser Seite erscheinen. Möchtest du deine Antwort aktualisieren oder entfernen? Aktualisiere oder lösche deinen Beitrag und gib die URL deines Beitrags noch einmal ein. (Mehr über die Funktion von Webmentions erfahren)