تمكنت بنجاح من نقل برنامج منتدى قديم كتبته بنفسي إلى منصة Discourse.
بعد استيراد 2 مليون سجل على مدار 24 ساعة، يعمل كل شيء بشكل ممتاز باستثناء الروابط الدائمة (Permalinks).
لدي حوالي 350,000 رابط دائم في جدول قاعدة البيانات المخصص للروابط الدائمة في Discourse. جميعها مكتوبة بحروف صغيرة، مثل: “forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html”.
للأسف، تقوم جوجل بالربط إلى “/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/”، مما يؤدي إلى ظهور رسالة خطأ 404.
هل لديك أي اقتراحات حول كيفية تحويل عنوان URL المطلوب إلى حروف صغيرة قبل البحث عنه في جدول الروابط الدائمة، دون التأثير على أي شيء آخر؟ ألا ينبغي أن يكون هذا النوع من التحويل قبل البحث إجراءً قياسياً؟
أعتقد أنك ترغب في إنشاء تطبيع للرابط الدائم يتجاهل الجزء التعريفي (slug) وينشئ روابط دائمة تحتوي فقط على معرف المنتدى.
أليس ما نحتاجه لتحديد الموضوع الصحيح هو t140842-s1؟
هناك بعض أدوات الاستيراد الأخرى التي تفعل ذلك، رغم أنني لست متأكدًا من أي منها. ربما vBulletin؟ ولكن إذا بحثت في جميعها عن التطبيع باستخدام grep، فستجد مثالًا.
لم أكن أعرف قبل الترحيل أن عملية البحث حساسة لحالة الأحرف — وإلا لكانت حاولت مراعاة ذلك والتأكد من حفظ الرابط بالطريقة التي كانت عليها في البرنامج القديم.
لكنني الآن بعد الترحيل، والموقع يعمل بشكل فعلي. لذا، للأسف، أنا أبحث عن طرق للتغلب على هذه المشكلة.
يمكنني تحديد موضوع من خلال معرفه (ID)، لذا فإن “/forum/t140842” سيكون كافيًا. عبر SQL، يمكنني تعديل حقل url في جدول الروابط الدائمة بهذه الطريقة، لكن هل سيؤدي ذلك إلى البحث وإعادة التوجيه؟ لقد أجريت اختبارًا سريعًا ولم ينجح.
هناك خيار لتطبيع الروابط الدائمة في إعدادات discourse — لكنني لم أفهم ما الذي يفعله بالضبط.
سيؤدي تطبيع الرابط الدائم إلى إعادة كتابة الرابط قبل مطابقته للرابط الدائم، مما يتيح لك استخدامه لإزالة الجزء المميز من الرابط. يشرح وصف هذه الميزة في الإعدادات كيفية عملها، لكن ربما فقط إذا كنت تفهمها بالفعل.
يجب أن تكون معرفات المواضيع القديمة موجودة في topicCustomField، لذا يجب أن تتمكن من إنشاء روابط دائمة جديدة من خلال التكرار عبر تلك القيم. ثم احذف الروابط القديمة. (أو احذفها جميعًا بمجرد التأكد من قدرتك على إنشاء الروابط التي تريدها).
يمكنك البحث هنا وفي أدوات الاستيراد الأخرى عن مصطلحي “الرابط الدائم” و"التطبيع" للعثور على بعض الأمثلة (grep -r إحدى الطرق). إذا احتجت إلى مزيد من المساعدة ولديك ميزانية، يمكنني مساعدتك الأسبوع المقبل.
في الإعدادات، غيّرت تعبير النمط الخاص بي إلى (أقصد أن تعبير النمط الخاص بي يجب أن يطابق معرف الموضوع أيضًا)
forum/t(\d*)/?$forum/t\1
عندما أضيف رابطًا دائمًا جديدًا إلى الجدول بعنوان URL “forum/t140842” وأحفظه… يقوم Discourse بتغيير الرابط إلى “f?$forum/t140842”. إما أن هناك خللًا أو أنني لا أفهم المفهوم هنا.
بعد محاولة المزيد من تطبيع التعبير النمطي (regex)، لم أتمكن من فهم كيفية عمل ذلك. أدى استخدام المثال المذكور في الوصف مرة أخرى إلى نتائج غير متوقعة في حقل الرابط عند إضافة روابط دائمة جديدة.
عندما قمت بالانتقال إلى منصة Discourse، قمت بإزالة بادئة www من النطاق. منحني هذا الآن الفرصة لإعادة كتابة URI على الخادم القديم عبر إعدادات Apache وملف .htaccess لتحويلها إلى أحرف صغيرة قبل إعادة التوجيه إلى خادم Discourse الجديد. هذا النوع من الحلول حل مشكلتي إلى حد ما في الوقت الحالي.
أو forum/t140842-s2/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html
أو forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html
إلى رابط بسيط يحتوي فقط على معرف الموضوع القديم: forum/t140842
يتم ذلك عبر أمر SQL يعيد كتابة الرابط باستخدام دالة REGEXP_REPLACE:
INSERT INTO permalinks (created_at, updated_at, topic_id, url) SELECT NOW(), NOW(), topic_id, REGEXP_REPLACE(url,'forum/t(\d*)(-?.*)/(.*)','forum/t\1','') url FROM permalinks WHERE topic_id > 0 ON CONFLICT DO NOTHING;
إعادة كتابة الطلبات القديمة عبر .htaccess على النطاق القديم
قامت جوجل بفهرسة الرابط https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html وربطت به. كنت محظوظًا لأن هذا الطلب انتهى على خادم Apache بسبب اختلاف النطاق، مما سمح لي باستخدام ملف .htaccess لإعادة الكتابة بسهولة. لذا قمت بإعادة توجيه هذا الطلب إلى https://discourse-domain.com/forum/t140842. في جدول الروابط الدائمة (permalinks)، أضفت سجل forum/t140842 هذا باستخدام الرابط الدائم المضاف مسبقًا الذي يحتوي على الرابط الكامل مع الجزء المخصص (slug) باستخدام تعبير نمطي (انظر أعلاه).