هجرة منتدى bbPress لإضافة WordPress إلى Discourse

لقد نجحت مؤخرًا في ترحيل قاعدة بيانات bbPress باستخدام سكريبت الترحيل المدمج في Discourse. والآن سأشاركه كدليل تعليمي خطوة بخطوة.

ملاحظة: هذا الدليل مخصص لـ إضافة bbPress، وليس النسخة المستقلة القديمة من bbPress.

ما هي البيانات التي يمكن استيرادها؟

  • المستخدمين (بما في ذلك المستخدمون المجهولون)
  • التصنيفات
  • المواضيع
  • المنشورات
  • الرسائل الخاصة (عبر BuddyPress)
  • المرفقات
  • الروابط الدائمة (Permalinks)

قبل بدء عملية الترحيل، قم بإعداد بيئة تطوير على جهازك (أو داخل آلة افتراضية) وقم بتشغيل عملية الاستيراد هناك بدلاً من داخل حاوية Docker. عندما جربت ذلك داخل حاوية Docker، واجهت مشكلة فشل مصادقة النظير (peer authentication failed). لذا، أوصي بشدة باستخدام جهاز تطوير. راجع دليل التثبيت لـ macOS أو Ubuntu / Debian للتطوير.

يتطلب Discourse إصدار Ruby 3.4 أو أحدث. يمكنك التحقق من إصدار Ruby الخاص بك عبر:

ruby -v

الآن نحتاج إلى تثبيت اعتماد libmysqlclient-dev لتمكين استخدام gem mysql2.

sudo apt-get install libmysqlclient-dev

بعد التثبيت الناجح، انتقل إلى مسار تثبيت تطوير Discourse (عادةً ~/discourse).

cd ~/discourse

إعداد اتصال قاعدة البيانات

يقرأ سكريبت استيراد bbPress جميع إعدادات اتصال قاعدة البيانات من متغيرات البيئة. لا تحتاج إلى تعديل ملف السكريبت. المتغيرات البيئية المدعومة هي:

المتغير الافتراضي الوصف
BBPRESS_HOST localhost مستضيف قاعدة بيانات MySQL
BBPRESS_USER root اسم مستخدم MySQL
BBPRESS_PW (فارغ) كلمة مرور MySQL
BBPRESS_DB bbpress اسم قاعدة بيانات MySQL
BBPRESS_PREFIX wp_ بادئة جداول WordPress
BBPRESS_ATTACHMENTS_DIR /path/to/attachments المسار إلى مجلد مرفقات bbPress

إذا كنت ترحل قاعدة بياناتك من localhost، فعادةً ما تحتاج فقط إلى تعيين اسم قاعدة البيانات:

IMPORT=1 bundle && IMPORT=1 BBPRESS_DB="my_bbpress" bundle exec ruby script/import_scripts/bbpress.rb

إذا كنت ترحل قاعدة بياناتك من خادم خارجي، فستحتاج أيضًا إلى تعيين المضيف واسم المستخدم وكلمة المرور:

IMPORT=1 bundle && IMPORT=1 BBPRESS_HOST="REMOTE_HOST_NAME" BBPRESS_USER="DB_USERNAME" BBPRESS_PW="MY_SECURE_PASSWORD" BBPRESS_DB="DB_NAME" bundle exec ruby script/import_scripts/bbpress.rb

تهانينا! تم ترحيل قاعدة بياناتك بنجاح من bbPress إلى Discourse :clap: :wave: :boom:

الآن قم بنسخ احتياطي من صفحة الإدارة /admin/backups واستوردها في موقع Discourse المباشر الخاص بك.


بعد نقل منتدى bbPress إلى Discourse، إذا كنت ستستمر في استخدام موقع WordPress الخاص بك كموقع رئيسي وتود ربطه بـ Discourse، فقم بتثبيت إضافة WordPress الرسمية من Discourse.

15 إعجابًا

Just wanted to thank you for providing this step-by-step guide. We migrated our site from bbpress to Discourse with minimal headache thanks to you. Since we’re running multisite wordpress there were a few tweaks to make to the importer, but other than that it went very smoothly. Thanks!

3 إعجابات

If you can share your tweaks then it will be helpful to other multisite owners.

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

Admittedly I didn’t take very good notes, and have since killed the VM it
was on (sorry!) but the basic gist is that if your bbpress install is not
on the primary site of the Multisite setup you’ll need to a) set the
environmental variable for BBPRESS_PREFIX to include your site’s ID number
(e.g. wp_6_ ) and then edit the migration script to use wp_users rather
than #{BBPRESS_PREFIX} for the Users sql. This is because on Multisite
installations the wp_users table is shared across sites and then each site
has its own tables for posts, postmeta, etc.

5 إعجابات

thanks for the details :thumbsup:

I recently posted on how to import bbpress into discourse

إعجابَين (2)

Great job on the tutorial! But it’s confusing to have two different guides on this. Do they serve different purposes? Otherwise we should figure out how to merge them.

That guide is about how to import bbpress inside of a development environment, mine is how to import bbpress using the docker container. It’s just 2 different ways to go. I’d recommend importing via docker container since it doesn’t ask for the additional step of setting up a development environment, which can be cumbersome.

Hello I am stuck trying to import successfully after all users are done importing.

As soon it begins to import anonymous users it cancels with an error of “Invalid Email… and Validation failed: Username can’t be blank (ActiveRecord::RecordInvalid)”.

I added the error below, does anyone encountered this before or have any ideas on what I should do?

Thanks,

importing anonymous users...
Invalid email '' for ''. Using '6be92499a6f885cb271d94bffd5e667b@email.invalid'
Error on record: {:id=>"", :email=>"", :name=>"", :website=>nil}
Traceback (most recent call last):
	23: from script/import_scripts/bbpress.rb:512:in `<main>'
	22: from /home/lutechi/discourse/script/import_scripts/base.rb:49:in `perform'
	21: from script/import_scripts/bbpress.rb:31:in `execute'
	20: from script/import_scripts/bbpress.rb:153:in `import_anonymous_users'
	19: from /home/lutechi/discourse/script/import_scripts/base.rb:249:in `create_users'
	18: from /home/lutechi/discourse/script/import_scripts/base.rb:249:in `each'
	17: from /home/lutechi/discourse/script/import_scripts/base.rb:261:in `block in create_users'
	16: from /home/lutechi/discourse/script/import_scripts/base.rb:337:in `create_user'
	15: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
	14: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:267:in `transaction'
	13: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:236:in `within_new_transaction'
	12: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
	11: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:239:in `block in within_new_transaction'
	10: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:267:in `block in transaction'
	 9: from /home/lutechi/discourse/script/import_scripts/base.rb:338:in `block in create_user'
	 8: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/suppressor.rb:48:in `save!'
	 7: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:315:in `save!'
	 6: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:385:in `with_transaction_returning_status'
	 5: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
	 4: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:265:in `transaction'
	 3: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:387:in `block in with_transaction_returning_status'
	 2: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:315:in `block in save!'
	 1: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/validations.rb:52:in `save!'
/home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Username can't be blank (ActiveRecord::RecordInvalid)

شكرًا لك على هذا الدليل المفيد - لقد نجح معي، رغم أن لديّ مشكلتين صغيرتين:

  1. بدا أن عملية التثبيت قمت بتثبيت PostgreSQL 11، بينما يدعم إصدار Discourse المضيف PostgreSQL 10، مما يسبّب بعض الارتباك!

  2. يبدو أن المستخدمين المستوردين غير قادرين على تسجيل الدخول إلى Discourse باستخدام بيانات اعتماد WordPress الخاصة بهم - جربت ذلك مع حسابي الشخصي، سواء باستخدام اسم المستخدم أو عنوان البريد الإلكتروني، لكن لم ينجح أي منهما. يمكنني تسجيل الدخول إلى WordPress بنجاح، والحساب موجود في Discourse مع موضوعات المنتدى المرتبطة به. هل حدث تغيير ما في كلمات المرور/المصادقة؟

هل تستخدم SSO من WordPress؟

يتطلب هذا إضافة ترحيل كلمة المرور. هل قمت بتثبيتها؟

3 إعجابات

مرحبًا مايكل،

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

روث

3 إعجابات

مرحبًا :waving_hand:

هل يمكن أيضًا ترحيل الصور التي يرفعها المستخدمون؟
كانت إضافة رفع الملفات الخاصة بالمستخدمين هي GD bbPress Attachments

مع أطيب التحيات :beers:

يبدو أن السكربت يستورد المرفقات.

يجب عليك تعيين متغير بيئة BB_PRESS_ATTACHMENTS_DIR يحتوي على المسار إلى المرفقات.

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

يبدو أن ملفات إضافة bbPress قد تم تخزينها في مجلد /uploads ضمن تثبيت WordPress. تم استخدام إضافة GD bbPress Attachments لهذا الغرض. لست متأكدًا من نوع المسار الذي يجب وضعه في متغير BB_PRESS_ATTACHMENTS_DIR. هل يمكنك مساعدتي في هذا الشأن؟ هل يجب أن أضع المسار الكامل للرابط إلى الملفات المرفوعة، مثل http://www.example.com/httpdocs/wp-content/uploads/2018/02/picture.png، أم هناك خيار آخر؟

لاحظت أن سكريبت الاستيراد لم يكتمل بنجاح لأن خطوة import_private_messages فشلت. لم تكن الرسائل الخاصة مفعلة في المنتدى. قمت بإزالة هذه الخطوة من السكريبت، لكنه فشل مع الرسالة: table wp_bb_attachments doesn't exist وهو أمر صحيح. لا أستطيع العثور على أي جدول للمرفقات في قاعدة البيانات على الرغم من ذلك. كيف يمكن أن تعمل المرفقات من الأساس؟ :thinking:

يجب أن تكون المرفقات في دليل على الخادم حيث تقوم بتشغيل الاستيراد.

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

يبدو أنك بحاجة إلى وظيفة أخرى لاستيرادها. إذا كان لديك ميزانية، يمكنني المساعدة. يحتوي الرابط Redirecting… على معلومات حول عمليات الاستيراد. لا يبدو أنك بحاجة إلى خدمة كاملة، لذا ستكون تكلفتك أقل مما هو مقترح هناك.

نظرًا لأن Discourse تعمل دائمًا داخل حاوية Docker، هل يجب ربط هذا الدليل في حاوية الاستيراد؟

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

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

سؤال أخير. بما أنك ذكرت خدمة الاستيراد الخاصة بك، قمت بفحص الموقع والبحث أكثر في قاعدة بياناتي وعثرت على مكان تخزين المرفقات. جملة واحدة في صفحتك أثارت قلقي قليلاً:

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

وجدت أن مرفقاتي مخزنة في جدول wp_postsmeta تحت اسم _wp_attached_file. أما المنشور نفسه الذي يحتوي على هذا المرفق المرتبط، فلا يوجد فيه أي ذكر لذلك في نص المنشور. يبدو أن الرابط الوحيد هنا هو post_id و meta_id الخاص به. هل يعني هذا أن هذا مرفق “غير مرتبط” وسيتم حذفه؟