Ciao! Vorrei reindirizzare tutti i link esterni (o, se non è possibile filtrarli, tutti i link) a qualcosa come exit.website.tld/?page={{URL}}. È possibile farlo con Discourse? In caso contrario, esiste un plugin per questo? Ho già cercato ma non ne ho trovato uno con le query di ricerca che ho utilizzato.
Quindi, in modo simile a come fa Steam. (Esempio)
Anch’io ci stavo pensando; volevo aggiungere l’URL di salvataggio di Internet Archive a tutti i link esterni, e diciamocelo: sarebbe figo poterlo impostare per categoria.
Penso che ci sia qualche tipo di filtro da gestire tramite un plugin, ma la gente usa i componenti del tema in modi che sembrano piegare le regole sulla manipolazione dei dati. Quindi, se al momento non è possibile, come si approccerebbe la cosa: tramite plugin o componente del tema?
Lo consideriamo una sorta di funzionalità ostile all’utente (simile alle “firme dei forum”), quindi dovrebbe essere un plugin. Non sono sicuro che possa essere realizzato tramite un componente del tema.
Ho visto questa richiesta in precedenza nel contesto della sicurezza, come in
oh no! stai per visitare un IPERCOLLEGAMENTO a un SITO WEB! Ti sei preparato per un PERICOLO INCREDIBILE?!?!
e immagino che potrebbe avere senso in alcuni contesti estremamente rari in alcune comunità estremamente rare.. eh.. immagino?
Amministro una categoria per l’archiviazione di siti web. Il nostro caso d’uso è super specifico/pigro. ![]()
Inoltre, considero il proxy dell’archivio web simile al salvataggio di una copia di un’immagine in un messaggio, ma ripeto, amministro una categoria per l’archiviazione di siti web. ![]()
Secondo me, potrebbe effettivamente essere una questione di sicurezza, perché ovviamente qui sul Forum Meta di Discourse o su alcuni Forum di Programmazione le persone sanno distinguere gli URL ecc., ma su Forum non così focalizzati sulla tecnologia (specialmente Forum per lavori non tecnici, scuole, ecc.) molte persone potrebbero non accorgersi se si trovano su un sito che appare identico ma ha un TLD diverso o forse addirittura un Nome di Dominio completamente diverso.
E mentre questo potrebbe ovviamente essere ostile all’utente per alcuni Forum, nessuno dice che debba essere abilitato per impostazione predefinita. Potresti semplicemente renderlo come una casella di spunta che utilizzerebbe una Pagina di Discourse stesso o collegherebbe direttamente una Pagina personalizzata.
Secondo me questa è più una funzionalità essenziale che dovrebbe essere integrata direttamente in Discourse, ma ovviamente, questa è solo la mia opinione.
Jeff ha chiarito che questo dovrà essere un plugin (a meno che non possa essere realizzato in un tema, cosa che sembra probabile). La storia suggerisce che, se sviluppate il sistema di accesso e centinaia di siti lo richiedono, inclusi dozzine di clienti aziendali, diventerà un plugin ufficiale in pochi anni.
Tuttavia, se è possibile farlo in un tema, come penso possa essere, allora si può dire che Discourse supporta già la funzionalità: vi serve solo un tema per attivarla! Potete consultare la Guida per sviluppatori ai temi di Discourse o pubblicare un annuncio in Marketplace con un budget. Secondo me, il costo sarà almeno di 1000 dollari, ma potrei sbagliarmi.
Anche se non ho esperienza con i temi di Discourse, ecc., ho una conoscenza di base di JS e HTML. Una cosa del genere non dovrebbe richiedere più di 10-20 minuti di lavoro. Perché servirebbe un budget di 1000 $?
Se puoi farlo in venti minuti, allora avresti già dovuto farlo. Sono ancora piuttosto carente in JavaScript e Ember, forse è molto più facile di quanto pensi. Penso che richieda diverse ore di lavoro.
Per favore, pubblica un link al tuo tema! Non vedo l’ora di vederlo.
Dopo circa 5 minuti ho ottenuto un codice JS funzionante (che ha ancora bisogno di alcuni miglioramenti, ma funziona; 10 righe per la precisione)
L’unica cosa che devo ancora capire è come eseguire questo codice dopo il caricamento della pagina…
Fantastico! Sono contento che sia stato così semplice! Quelle cose mi richiedono un tempo pazzesco. Di solito sono più bravo a indovinare quanto tempo dovrebbe volerci.
In generale, si tratta semplicemente di verificare se si è su una pagina articolo, iterare su tutti i tag , individuare il tag effettivo del contenuto al suo interno, iterare su tutti i tag presenti e, se il loro href non punta a un sito ufficiale (utilizzando una semplice espressione regolare per questo), aggiungere l’URL della pagina di uscita davanti.
Tuttavia, sto ancora faticando a capire come eseguire il codice JS dopo che la pagina è stata caricata e tutto il contenuto dinamico (come i post) è stato caricato. Una soluzione temporanea sarebbe eseguire il codice dopo 1-2 secondi, ma non è una soluzione ideale e per alcune persone il caricamento potrebbe richiedere più tempo…
Può certamente essere realizzato come componente del tema, ma tieni presente che dovrà essere un plugin se desideri che influisca anche sulla visualizzazione del crawler.
Quello che stai cercando si chiama “post decorator”. È un hook che ti permette di eseguire script prima che ogni post venga renderizzato. Fa parte della plugin API.
Ora, riguardo a ciò che vuoi fare (reindirizzare tutti i link esterni). Non penso che aggiungere così tanto attrito sia una buona idea, quindi non posso aiutarti con questo — per di più hai già risolto quella parte. Detto questo, ecco un esempio commentato su come creare una configurazione che individui tutti i link esterni nei post.
Questo va inserito nella sezione header del tuo tema o componente del tema:
<script type="text/discourse-plugin" version="0.8">
// Memorizza il nome host per poterlo riutilizzare.
const siteHostname = location.hostname;
// Creiamo un decorator per farlo in ogni post
api.decorateCooked(
post => {
// Il post contiene link?
const links = [...post[0].querySelectorAll("a")];
// Nessun link, esci.
if (!links.length) return;
// Abbiamo dei link, filtriamoli e prendiamo solo quelli esterni
const externalLinks = links.filter(
link => link.hostname !== siteHostname
);
// Se ci sono link esterni, possiamo fare qualcosa. Ad esempio, possiamo
// aggiungere una classe a ogni link esterno come segue.
externalLinks.forEach(link => {
link.classList.add('external-link');
// Fai altro lavoro qui.
});
},
// Assegniamo un ID al decorator per prevenire perdite di memoria.
{ id: "external-link-decorator" }
);
</script>
Ancora una volta, reindirizzare gli utenti crea troppo attrito e diventerà rapidamente fastidioso. Quindi, ti consiglio di considerare un approccio diverso, come ad esempio aggiungere un’icona sottile accanto ai link esterni e insegnare agli utenti cosa significa?
Penso che questo caso d’uso sia meglio gestito da un plugin o da un’integrazione esterna (utilizzando un webhook di creazione/modifica dei post) che garantisca la corretta conservazione di tutti i siti collegati, indipendentemente dal fatto che qualcuno vi faccia clic o meno.

