J’utilise les intégrations Discourse pour héberger les commentaires d’un blog situé sur un sous-domaine, mais je souhaite déplacer ce blog vers un sous-URL du domaine principal.
Comment puis-je mettre à jour les sujets de commentaires Discourse existants pour qu’ils pointent vers le nouvel emplacement du blog ?
Je suppose que je peux mettre à jour manuellement le contenu des messages, mais est-ce que la visite du nouveau site de blog entraînera la création de nouveaux sujets, car ils se trouvent désormais à une URL différente ?
(Le blog est un blog Ghost, au cas où cela aurait de l’importance.)
J’ai récemment traité un cas similaire. Dans cette situation, le site avait déjà changé le domaine de son blog. Cela a entraîné la création de sujets dupliqués sur Discourse pour tous les articles de blog qui avaient déjà généré des sujets Discourse.
La solution consistait à exécuter un script depuis la console Rails du site pour trouver toutes les entrées TopicEmbed ayant un embed_url sur l’ancien domaine. Ces valeurs embed_url ont ensuite été mises à jour avec le bon domaine après avoir supprimé l’entrée TopicEmbed correspondant au sujet en double. Les nouveaux sujets générés ont ensuite été supprimés.
Cela semble être une méthode compliquée pour résoudre le problème. Je peux publier les détails du script que j’ai utilisé, mais il serait excellent d’entendre si quelqu’un d’autre a des idées sur la manière d’aborder ce problème. C’est une situation qui risque de se présenter de temps en temps avec les sujets intégrés.
Ce serait formidable (et toute information sur la façon de l’exécuter serait utile).
Je suppose que je devrai mettre à jour manuellement le contenu des publications qui renvoient à l’article original. (c’est-à-dire la partie du texte de la publication qui indique : « Ceci est un sujet de discussion complémentaire pour l’entrée originale à… »).
Je suis d’accord — quelque chose qui doit rarement être fait, mais qui semble être une véritable corvée lorsqu’il faut le faire.
Je vais partager le script ici. Gardez à l’esprit que je ne suis pas certain que ce soit la meilleure approche pour résoudre ce problème. Le script doit être exécuté après que des sujets en double aient commencé à être créés à la suite du changement de nom de domaine. Comme les sujets ne seront créés que lorsque les utilisateurs commenceront à visiter vos articles de blog sur le nouveau nom de domaine, vous devrez probablement exécuter le script plusieurs fois pour capturer tous les sujets. Assurez-vous de remplacer old.domain.com sur la première ligne du script par le véritable domaine où se trouvait votre blog auparavant.
# Exécutez ceci en premier :
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")
# Ensuite :
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 "Destruction de TopicEmbed : #{new_embed.id} Sujet : #{new_embed.topic_id}"
new_embed.destroy
puts "Mise à jour de TopicEmbed : #{original_embed.id} Nouveau embed_url : #{new_embed_url}"
original_embed.update(embed_url: new_embed_url)
end
end
end
Pour exécuter le script, ouvrez la console Rails de votre site, puis copiez la première ligne du script dans la console et exécutez-la. Cela affectera la variable original_embeds à un tableau d’enregistrements TopicEmbed. Une fois cela fait, vous pouvez copier le reste du script dans la console et l’exécuter.
Par mesure de sécurité, vous devriez créer une sauvegarde de la base de données de votre site avant d’exécuter le script. Il serait également judicieux de faire un test à blanc du script qui n’effectue aucune modification. Voici comment procéder :
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 "(Test à blanc) Destruction de TopicEmbed : #{new_embed.id} Sujet : #{new_embed.topic_id}"
#new_embed.destroy
puts "(Test à blanc) Mise à jour de TopicEmbed : #{original_embed.id} Nouveau embed_url : #{new_embed_url}"
#original_embed.update(embed_url: new_embed_url)
end
end
end
Assurez-vous que la sortie semble raisonnable avant de décommenter les lignes qui effectuent les modifications réelles sur votre base de données.
Voici ce que fait le script :
la variable original_embeds est affectée à tous les enregistrements TopicEmbed correspondant à l’ancien domaine de votre blog
pour chacun des original_embeds, il tente de trouver un sujet avec un titre en double (le nouvel embed en double)
si un sujet en double est trouvé et qu’un enregistrement TopicEmbed existe pour ce sujet en double, cet enregistrement TopicEmbed est supprimé et la valeur de sa propriété embed_url est transférée à l’ancien enregistrement TopicEmbed.
Je vous recommande vivement de faire un test à blanc (en utilisant le deuxième script de cet article) avant d’exécuter le script qui effectue réellement les modifications. Si des erreurs sont retournées lors du test à blanc, vous devrez identifier leur cause. En examinant le code, je remarque un problème potentiel qui pourrait survenir si un sujet sur votre site Discourse avait un titre en double avec un sujet intégré, mais sans enregistrement TopicEmbed associé. Si c’est le cas, cela peut être résolu.
Dans mon cas, je pense que les choses sont encore plus simples, car le site du blog n’a pas encore été déplacé et je n’ai aucun doublon. Je pense que tout ce que j’ai à faire est de mettre à jour les entrées d’intégration existantes avec la nouvelle URL.
Je n’ai jamais utilisé Ruby auparavant, mais à partir de votre exemple, j’ai bricolé le script ci-dessous. En plus de mettre à jour les intégrations de sujets, je l’ai étendu pour mettre à jour également le texte et les liens dans les publications associées.
Pourriez-vous y jeter un coup d’œil rapide pour m’assurer que je suis sur la bonne voie ? Je l’ai exécuté avec les mises à jour commentées et il semble afficher les bonnes informations.
(Au fait : quelle est la méthode habituelle pour exécuter ces scripts ? J’ai édité dans un éditeur de texte puis collé dans la 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