Sto utilizzando le integrazioni di Discourse per ospitare i commenti di un blog situato su un sottodominio, ma vorrei spostare il blog in una sottopagina del dominio principale.
Come posso aggiornare gli argomenti esistenti dei commenti di Discourse per puntare alla nuova posizione del blog?
Immagino di poter aggiornare manualmente il contenuto dei post, ma visitare il nuovo sito del blog causerà la creazione di nuovi argomenti dato che ora si trovano su un URL diverso?
(Il blog è un blog Ghost, nel caso fosse rilevante)
Ho affrontato una situazione simile di recente. In quel caso, il sito aveva già modificato il dominio del proprio blog. Il risultato di tale operazione è stato la creazione di argomenti duplicati su Discourse per tutti i post del blog che avevano già generato argomenti su Discourse.
La soluzione consisteva nell’eseguire uno script dalla console Rails del sito per trovare tutte le voci TopicEmbed che avevano un embed_url sul vecchio dominio. Questi valori di embed_url sono stati poi aggiornati al dominio corretto dopo aver eliminato la voce TopicEmbed relativa all’argomento duplicato. Gli argomenti nuovi che erano stati generati sono stati successivamente eliminati.
Questa sembra una soluzione complessa. Posso condividere i dettagli dello script che ho utilizzato, ma sarebbe ottimo sapere se qualcun altro ha idee su come affrontare il problema. È una situazione che inevitabilmente si presenterà di tanto in tanto con gli argomenti incorporati.
Sarebbe fantastico (e sarebbe utile qualsiasi informazione su come eseguirlo).
Immagino che dovrò aggiornare manualmente il contenuto dei post dove fanno riferimento all’articolo originale. (cioè: la parte del testo del post che dice “Questa è una discussione di accompagnamento per la voce originale su…”).
Sono d’accordo: qualcosa che raramente deve essere fatto, ma che sembra una seccatura totale quando si presenta.
Condividerò lo script qui. Tieni presente che non sono certo che questo sia l’approccio migliore al problema. Lo script deve essere eseguito dopo che sono stati creati argomenti duplicati a seguito della modifica del nome di dominio. Poiché gli argomenti non verranno creati finché gli utenti non inizieranno a visitare i tuoi post del blog sul nuovo nome di dominio, probabilmente dovrai eseguire lo script più volte per intercettare tutti gli argomenti. Assicurati di sostituire old.domain.com dalla prima riga dello script con il dominio effettivo del tuo blog precedente.
# Esegui prima questo:
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")
# Poi:
original_embeds.each do |original_embed|
original_topic = Topic.find(original_embed.topic_id)
if (original_topic && original_topic.title)
possible_dups = Topic.where(title: original_topic.title).order(:created_at)
if possible_dups.length === 2
new_embed = TopicEmbed.find_by(topic_id: possible_dups.last.id)
new_embed_url = new_embed.embed_url
puts "Distruzione di TopicEmbed: #{new_embed.id} Argomento: #{new_embed.topic_id}"
new_embed.destroy
puts "Aggiornamento di TopicEmbed: #{original_embed.id} Nuovo embed_url: #{new_embed_url}"
original_embed.update(embed_url: new_embed_url)
end
end
end
Per eseguire lo script, apri la console Rails del tuo sito, quindi copia la prima riga dello script nella console ed eseguila. Questo assegnerà la variabile original_embeds a un array di record TopicEmbed. Una volta fatto ciò, puoi copiare il resto dello script nella console ed eseguirlo.
Per sicurezza, dovresti creare un backup del database del tuo sito prima di eseguire lo script. Sarebbe anche una buona idea eseguire una simulazione dello script che non apporta alcuna modifica. Ecco come fare:
original_embeds.each do |original_embed|
original_topic = Topic.find(original_embed.topic_id)
if (original_topic && original_topic.title)
possible_dups = Topic.where(title: original_topic.title).order(:created_at)
if possible_dups.length === 2
new_embed = TopicEmbed.find_by(topic_id: possible_dups.last.id)
new_embed_url = new_embed.embed_url
puts "(Simulazione) Distruzione di TopicEmbed: #{new_embed.id} Argomento: #{new_embed.topic_id}"
#new_embed.destroy
puts "(Simulazione) Aggiornamento di TopicEmbed: #{original_embed.id} Nuovo embed_url: #{new_embed_url}"
#original_embed.update(embed_url: new_embed_url)
end
end
end
Assicurati che l’output sembri ragionevole prima di rimuovere i commenti dalle righe che apportano le modifiche effettive al database.
Cosa fa lo script:
la variabile original_embeds viene impostata su tutti i record TopicEmbed che corrispondono al vecchio dominio del tuo blog
per ciascuno degli original_embeds, cerca un argomento con un titolo duplicato (il nuovo embed duplicato)
se viene trovato un argomento duplicato e un record TopicEmbed associato a tale argomento, quel record TopicEmbed viene eliminato e il valore della sua proprietà embed_url viene trasferito al vecchio record TopicEmbed.
Consiglio vivamente di eseguire una simulazione (utilizzando il secondo script di questo post) prima di eseguire lo script che apporta effettivamente le modifiche. Se la simulazione restituisce errori, dovrai capire cosa li causa. Osservando il codice ora, vedo un possibile problema che potrebbe verificarsi se sul tuo sito Discourse esistesse un argomento con lo stesso titolo di un argomento incorporato, ma senza un TopicEmbed associato. Se è così, è qualcosa che può essere risolto.
Nel mio caso, penso che le cose siano ancora più semplici, dato che il sito del blog non è stato ancora spostato e non ho duplicati. Penso che tutto ciò di cui ho bisogno sia aggiornare le voci di incorporamento esistenti con il nuovo URL.
Non ho mai usato Ruby prima, ma dal tuo esempio ho messo insieme lo script qui sotto. Oltre ad aggiornare gli incorporamenti dei topic, l’ho esteso per aggiornare anche il testo e i link nei post associati.
Ti dispiacerebbe dargli un’occhiata veloce per assicurarti che sia sulla strada giusta? L’ho eseguito con gli aggiornamenti commentati e sembra mostrare le cose giuste.
(a proposito: qual è il modo normale per eseguire questi script? Ho continuato a modificarli in un editor di testo e poi incollarli nella console)
Brad
original_embeds = TopicEmbed.where("embed_url LIKE ?", "https://blog.cantabilesoftware.com%")
old_url_prefix = "https://blog.cantabilesoftware.com/"
new_url_prefix = "https://www.cantabilesoftware.com/blog/"
original_embeds.each do |original_embed|
new_embed_url = original_embed.embed_url
new_embed_url.sub!(old_url_prefix, new_url_prefix)
puts "Updating TopicEmbed: #{original_embed.id} with new url: #{new_embed_url}"
#original_embed.update(embed_url: new_embed_url)
post = Post.find_by(id: original_embed.post_id)
new_raw = post.raw
new_raw.gsub!(old_url_prefix, new_url_prefix)
new_cooked = post.cooked
new_cooked.gsub!(old_url_prefix, new_url_prefix)
puts "Updating raw with #{new_raw}"
puts "Updating cooked with #{new_cooked}"
#post.update(raw: new_raw, cooked: new_cooked)
end