نقل موقع يستخدم تكاملات Discourse للتعليقات

مرحبًا بالجميع،

أستخدم تكاملات Discourse لاستضافة التعليقات على مدونة موجودة في نطاق فرعي، ولكنني أريد نقل المدونة إلى مسار فرعي ضمن النطاق الرئيسي.

على سبيل المثال: حاليًا توجد المدونة في

blog.somedomain.com

ولكنني أريد نقلها إلى

somedomain.com/blog

كيف يمكنني تحديث مواضيع التعليقات الموجودة في Discourse لتشير إلى موقع المدونة الجديد؟

أظن أنه يمكنني تحديث محتوى المنشورات يدويًا، ولكن هل سيؤدي زيارة موقع المدونة الجديد إلى إنشاء مواضيع جديدة نظرًا لأن عناوينها URL مختلفة الآن؟

(المدونة مبنية على منصة Ghost، في حال كان ذلك مهمًا)

أي مساعدة مُقدَّرة.
براد

إعجاب واحد (1)

تعاملت مؤخرًا مع موقف مشابه. في تلك الحالة، كان الموقع قد قام بالفعل بتغيير نطاق مدونته. ونتيجة لذلك، تم إنشاء مواضيع مكررة على Discourse لأي من منشورات المدونة التي كانت قد ولّدت بالفعل مواضيع على Discourse.

كان الحل هو تشغيل سكريبت من وحدة تحكم Rails الخاصة بالموقع للبحث عن جميع إدخالات TopicEmbed التي تحتوي على embed_url في النطاق القديم. ثم تم تحديث قيم embed_url هذه لتتوافق مع النطاق الصحيح بعد حذف إدخالات TopicEmbed الخاصة بالمواضيع المكررة. وبعد ذلك، تم حذف المواضيع الجديدة التي تم إنشاؤها.

يبدو هذا حلاً معقدًا للمشكلة. يمكنني نشر تفاصيل السكريبت الذي استخدمته، لكن سيكون رائعًا سماع أفكار أي شخص آخر حول كيفية التعامل مع هذه المشكلة. فهذا أمر حتمي أن يظهر بين الحين والآخر مع المواضيع المدمجة.

إعجاب واحد (1)

مرحبًا سيمون،

شكرًا لك.

سيكون ذلك رائعًا (وأي معلومات حول كيفية تشغيله ستكون مفيدة).

أعتقد أنني سأحتاج إلى تحديث محتوى المنشور يدويًا في الأماكن التي تشير إلى المقال الأصلي. (أي: الجزء من نص المنشور الذي يقول “هذا موضوع نقاش مصاحب للمدخل الأصلي في…”).

أتفق معك - شيء نادرًا ما يحتاج إلى القيام به، لكنه يبدو مرهقًا للغاية عندما يحدث.

براد

سأشارك السكربت هنا. ضع في اعتبارك أنني لست متأكدًا من أن هذا هو أفضل نهج للمشكلة. يجب تشغيل السكربت بعد أن تبدأ المواضيع المكررة في الإنشاء نتيجة تغيير اسم النطاق. نظرًا لأن المواضيع لن يتم إنشاؤها حتى يبدأ المستخدمون في زيارة منشورات مدونتك على اسم النطاق الجديد، فستضطر على الأرجح إلى تشغيل السكربت عدة مرات لالتقاط جميع المواضيع. تأكد من استبدال old.domain.com من السطر الأول من السكربت باسم النطاق الفعلي الذي كانت تستخدمه مدونتك سابقًا.

# قم بتشغيل هذا أولاً:
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")

# ثم:
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 "Destroying TopicEmbed: #{new_embed.id} Topic: #{new_embed.topic_id}"
      new_embed.destroy
      puts "Updating TopicEmbed: #{original_embed.id} New embed_url: #{new_embed_url}"
      original_embed.update(embed_url: new_embed_url)
    end
  end
end

لتشغيل السكربت، أدخل وحدة تحكم Rails الخاصة بموقعك، ثم انسخ السطر الأول من السكربت إلى وحدة التحكم وقم بتنفيذه. سيؤدي هذا إلى تعيين متغير original_embeds إلى مصفوفة من سجلات TopicEmbed. بمجرد الانتهاء من ذلك، يمكنك نسخ بقية السكربت إلى وحدة التحكم وتشغيله.

للتأكد من السلامة، يجب عليك إنشاء نسخة احتياطية من قاعدة بيانات موقعك قبل تشغيل السكربت. سيكون من الجيد أيضًا إجراء تجربة جافة للسكربت لا تقوم بأي تغييرات. هذا سيعمل لذلك:

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 "(Dry run) Destroying TopicEmbed: #{new_embed.id} Topic: #{new_embed.topic_id}"
      #new_embed.destroy
      puts "(Dry run) Updating TopicEmbed: #{original_embed.id} New embed_url: #{new_embed_url}"
      #original_embed.update(embed_url: new_embed_url)
    end
  end
end

تأكد من أن المخرجات تبدو معقولة قبل إلغاء التعليق عن الأسطر التي تقوم بالتغييرات الفعلية على قاعدة بياناتك.

ما يفعله السكربت:

  • يتم تعيين متغير original_embeds إلى جميع سجلات TopicEmbed التي تطابق نطاق مدونتك القديم

  • لكل من original_embeds يحاول العثور على موضوع بعنوان مكرر (الإدراج المكرر الجديد)

  • إذا تم العثور على موضوع مكرر، وتم العثور على سجل TopicEmbed للموضوع المكرر، يتم حذف سجل TopicEmbed هذا ويتم نقل قيمة خاصية embed_url الخاصة به إلى سجل TopicEmbed القديم.

أوصي بإجراء تجربة جافة (باستخدام السكربت الثاني من هذا المنشور) قبل تشغيل السكربت الذي يقوم فعليًا بإجراء التغييرات. إذا تم إرجاع أي أخطاء من التجربة الجافة، فستحتاج إلى معرفة ما يسببها. بالنظر إلى الكود الآن، يمكنني رؤية مشكلة محتملة قد تحدث إذا كان هناك موضوع على موقع Discourse الخاص بك يحمل عنوانًا مكررًا لموضوع مدمج، لكنه لم يكن مرتبطًا بـ TopicEmbed. إذا كان الأمر كذلك، فهناك شيء يمكن التعامل معه.

3 إعجابات

مرحبًا سيمون،

هذا مفيد جدًا. شكرًا لك.

في حالتي، أعتقد أن الأمور أبسط لأن موقع المدونة لم يتم نقله بعد، ولا أملك أي نسخ مكررة. أظن أن كل ما عليّ فعله هو تحديث إدخالات التضمين الحالية بالرابط الجديد.

لم أستخدم لغة Ruby من قبل، لكن من مثالك قمتُ بدمج السكربت أدناه. بالإضافة إلى تحديث تضمينات المواضيع، وسّعتُ السكربت ليقوم أيضًا بتحديث النصوص والروابط في المنشورات ذات الصلة.

هل تمانع إلقاء نظرة سريعة عليه للتأكد من أنني على المسار الصحيح؟ لقد قمت بتشغيله مع تعليق التحديثات، ويبدو أنه يعرض العناصر الصحيحة.

(بالمناسبة: ما هي الطريقة المعتادة لتشغيل هذه السكربتات؟ لقد كنت أقوم بالتحرير في محرر نصوص ثم ألصقها في وحدة التحكم)

براد

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
إعجابَين (2)

للتسجيل، لقد عمل الأمر أعلاه بشكل صحيح. إليك العملية الكاملة التي اتبعتها:

  1. تعيين Discourse في وضع القراءة فقط
  2. إنشاء نسخة احتياطية
  3. تشغيل السكربت المذكور أعلاه
  4. التحقق من تحديث صفحات Discourse بشكل صحيح
  5. إيقاف تشغيل المدونة القديمة وبدء تشغيل المدونة الجديدة
  6. إعداد إعادة توجيه من موقع المدونة القديمة إلى الجديد
  7. إيقاف وضع القراءة فقط في Discourse
  8. إعادة تكوين تضمينات Discourse لمنع المجال القديم وقبول الجديد
  9. إعداد التضمينات على المدونة الجديدة.

شكرًا جزيلاً لك @simon على المساعدة في هذا الأمر. :+1:

إعجاب واحد (1)