Ce que vous recherchez s’appelle un décorateur de message. Il s’agit d’un crochet (hook) qui vous permet d’exécuter des scripts avant que chaque message ne soit rendu. Il fait partie de l’API des plugins.
Maintenant, concernant ce que vous souhaitez faire (rediriger tous les liens externes), je ne pense pas qu’ajouter autant de friction soit une bonne idée, donc je ne peux pas vous aider là-dessus — d’autant plus que vous avez déjà résolu cette partie. Cela dit, voici un exemple commenté montrant comment créer une configuration qui cible tous les liens externes dans les messages.
Cela doit être placé dans la section header de votre thème ou composant de thème :
<script type="text/discourse-plugin" version="0.8">
// Stocker le nom d'hôte pour pouvoir le réutiliser.
const siteHostname = location.hostname;
// Créons un décorateur pour le faire dans chaque message
api.decorateCooked(
post => {
// Le message contient-il des liens ?
const links = [...post[0].querySelectorAll("a")];
// Pas de liens, on arrête.
if (!links.length) return;
// Nous avons des liens, filtrons-les pour ne garder que les externes
const externalLinks = links.filter(
link => link.hostname !== siteHostname
);
// Si nous avons des liens externes, effectuons quelques actions. Par exemple, nous pouvons
// ajouter une classe à chaque lien externe comme ceci.
externalLinks.forEach(link => {
link.classList.add('external-link');
// Faites d'autres actions ici.
});
},
// Donnons un identifiant à notre décorateur pour éviter les fuites de mémoire.
{ id: "external-link-decorator" }
);
</script>
Encore une fois, rediriger les utilisateurs crée trop de friction et deviendra rapidement agaçant. Je vous conseillerais donc d’envisager une autre approche, comme ajouter une icône subtile à côté des liens externes et apprendre à vos utilisateurs ce qu’elle signifie ?
