Das, wonach du suchst, heißt Post-Decorator. Es ist ein Hook, der es ermöglicht, Skripte auszuführen, bevor jeder Beitrag gerendert wird. Es ist Teil der Plugin-API.
Was nun dein Vorhaben angeht (alle externen Links umzuleiten): Ich glaube nicht, dass so viel Reibung eine gute Idee ist, daher kann ich dir dabei nicht helfen – außerdem hast du diesen Teil schon selbst herausgefunden. Dennoch hier ein kommentiertes Beispiel, wie du eine Einrichtung erstellen kannst, die alle externen Links in Beiträgen anspricht.
Dies geht in den header-Bereich deines Themes bzw. Theme-Komponenten:
<script type="text/discourse-plugin" version="0.8">
// Speichere den Hostnamen, damit wir ihn wiederverwenden können.
const siteHostname = location.hostname;
// Erstellen wir einen Decorator, um dies in jedem Beitrag durchzuführen
api.decorateCooked(
post => {
// Enthält der Beitrag Links?
const links = [...post[0].querySelectorAll("a")];
// Keine Links vorhanden, abbrechen.
if (!links.length) return;
// Wir haben Links, filtern sie und holen nur die externen heraus
const externalLinks = links.filter(
link => link.hostname !== siteHostname
);
// Wenn wir externe Links haben, können wir etwas tun. Zum Beispiel können wir
// jeder externen Link eine Klasse hinzufügen, wie hier gezeigt.
externalLinks.forEach(link => {
link.classList.add('external-link');
// Hier können weitere Aktionen erfolgen.
});
},
// Wir geben unserem Decorator eine ID, um Speicherlecks zu vermeiden.
{ id: "external-link-decorator" }
);
</script>
Noch einmal: Benutzer umzuleiten erzeugt zu viel Reibung und wird schnell lästig. Daher würde ich einen anderen Ansatz in Betracht ziehen, zum Beispiel das Hinzufügen eines dezenten Icons neben externe Links und das Erläutern seiner Bedeutung für deine Nutzer?
