Estoy utilizando integraciones de Discourse para alojar comentarios en un blog ubicado en un subdominio, pero quiero mover el blog a una subdirección del dominio principal.
¿Cómo puedo actualizar los temas de comentarios existentes de Discourse para que apunten a la nueva ubicación del blog?
Supongo que puedo actualizar manualmente el contenido de los mensajes, pero ¿visitar el nuevo sitio del blog provocará la creación de nuevos temas, ya que ahora están en una URL diferente?
Recientemente me enfrenté a una situación similar. En ese caso, el sitio ya había cambiado el dominio de su blog. El resultado fue que se crearon temas duplicados en Discourse para cualquiera de sus publicaciones del blog que ya hubieran generado temas en Discourse.
La solución fue ejecutar un script desde la consola de Rails del sitio para encontrar todas las entradas TopicEmbed que tuvieran un embed_url en el dominio antiguo. Luego, esos valores de embed_url se actualizaron al dominio correcto después de eliminar la entrada TopicEmbed correspondiente al tema duplicado. Los nuevos temas que se habían generado también fueron eliminados.
Esto parece una forma complicada de resolver el problema. Puedo publicar detalles sobre el script que utilicé, pero sería genial escuchar si alguien más tiene ideas sobre cómo abordar el problema. Es algo que tarde o temprano surgirá con los temas incrustados.
Eso sería genial (y cualquier información sobre cómo ejecutarlo sería de gran ayuda).
Supongo que tendré que actualizar manualmente el contenido de las publicaciones donde hay enlaces que vuelven al artículo original (es decir, la parte del texto de la publicación que dice “Este es un tema de discusión complementario para la entrada original en…”).
Estoy de acuerdo: es algo que rara vez necesita hacerse, pero que parece un verdadero dolor de cabeza cuando ocurre.
Compartiré el script aquí. Ten en cuenta que no estoy seguro de que este sea el mejor enfoque para el problema. El script debe ejecutarse después de que hayan comenzado a crearse temas duplicados como resultado del cambio de nombre de dominio. Dado que los temas no se crearán hasta que los usuarios comiencen a visitar tus publicaciones de blog en el nuevo nombre de dominio, probablemente tendrás que ejecutar el script varias veces para capturar todos los temas. Asegúrate de reemplazar old.domain.com en la primera línea del script con el dominio real donde estaba alojado tu blog anteriormente.
# Ejecuta esto primero:
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")
# Luego:
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 "Destruyendo TopicEmbed: #{new_embed.id} Tema: #{new_embed.topic_id}"
new_embed.destroy
puts "Actualizando TopicEmbed: #{original_embed.id} Nuevo embed_url: #{new_embed_url}"
original_embed.update(embed_url: new_embed_url)
end
end
end
Para ejecutar el script, abre la consola de Rails de tu sitio, luego copia la primera línea del script en la consola y ejecútala. Esto establecerá la variable original_embeds en un array de registros TopicEmbed. Una vez hecho esto, puedes copiar el resto del script en la consola y ejecutarlo.
Por seguridad, debes crear una copia de seguridad de la base de datos de tu sitio antes de ejecutar el script. También sería una buena idea realizar una ejecución en seco del script que no realice ningún cambio. Esto funcionará para ello:
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 "(Ejecución en seco) Destruyendo TopicEmbed: #{new_embed.id} Tema: #{new_embed.topic_id}"
#new_embed.destroy
puts "(Ejecución en seco) Actualizando TopicEmbed: #{original_embed.id} Nuevo embed_url: #{new_embed_url}"
#original_embed.update(embed_url: new_embed_url)
end
end
end
Asegúrate de que la salida parezca razonable antes de descomentar las líneas que realizan los cambios reales en tu base de datos.
Lo que hace el script:
la variable original_embeds se establece en todos los registros TopicEmbed que coinciden con el dominio antiguo de tu blog
para cada uno de los original_embeds, intenta encontrar un tema con un título duplicado (el nuevo incrustado duplicado)
si se encuentra un tema duplicado y se encuentra un registro TopicEmbed para ese tema duplicado, ese registro TopicEmbed se elimina y el valor de su propiedad embed_url se transfiere al registro TopicEmbed antiguo.
Te recomendaría realizar una ejecución en seco (usando el segundo script de esta publicación) antes de ejecutar el script que realmente realiza cambios. Si se devuelven errores durante la ejecución en seco, tendrás que investigar qué los está causando. Al revisar el código ahora, veo un posible problema que podría ocurrir si había un tema en tu sitio de Discourse con un título duplicado respecto a un tema incrustado, pero que no tenía un TopicEmbed asociado. En ese caso, es algo que se puede resolver.
En mi caso, creo que las cosas son aún más sencillas, ya que el sitio del blog aún no se ha trasladado y no tengo duplicados. Creo que todo lo que necesito hacer es actualizar las entradas de incrustación existentes con la nueva URL.
Nunca he usado Ruby antes, pero a partir de tu ejemplo he montado a lo bruto el siguiente script. Además de actualizar las incrustaciones de temas, lo he extendido para que también actualice el texto y los enlaces en las publicaciones asociadas.
¿Te importaría echarle un vistazo rápido para asegurarte de que voy por buen camino? Lo he ejecutado con las actualizaciones comentadas y parece mostrar lo correcto.
(a propósito: ¿cuál es la forma habitual de ejecutar estos scripts? He estado editando en un editor de texto y luego pegando en la consola).
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 "Actualizando TopicEmbed: #{original_embed.id} con nueva 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 "Actualizando raw con #{new_raw}"
puts "Actualizando cooked con #{new_cooked}"
#post.update(raw: new_raw, cooked: new_cooked)
end