إعادة توجيه تسجيل الدخول إلى لوحة تحكم ووردبريس في ديسكورت

عند إعداد المصادقة الموحدة (SSO) مع ووردبريس في البداية، كان المستخدمون ينتقلون إلى رابط المنتدى، ثم يتم إعادة توجيههم إلى صفحة تسجيل الدخول في ووردبريس، وبعد تسجيل الدخول يتم إعادة توجيههم مرة أخرى إلى المنتدى.

لكن في مرحلة ما، تغير هذا السلوك ولا أعرف كيف. الآن، بعد تسجيل الدخول في ووردبريس، يتم إعادة توجيه المستخدم إلى لوحة تحكم ووردبريس.

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

هل لديكم أي أفكار حول كيفية استكشاف هذه المشكلة وحلها؟

من المحتمل أن يكون هناك مكون إضافي لـ WordPress يتعارض مع مساراتك و/أو يتصل بوظائف تسجيل الدخول لديك. ما عليك سوى تعطيل نصف المكونات الإضافية لـ WordPress ومعرفة أي النصف يسبب المشكلة، ثم قم بتعطيل نصف المكونات الإضافية في تلك المجموعة وهكذا.

ابدأ بالمكونات الإضافية المتعلقة بالمصادقة والعضويات وتسجيل الدخول.

إجابة مايكل صحيحة على الأرجح. أيضًا، هل قمت بتثبيت إضافة Woocommerce على موقعك؟ إذا كان الأمر كذلك، فهناك كود يمكنك إضافته إلى موقعك لحل المشكلة.

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

إذا لم ترغب في تعطيل الإضافات لجميع المستخدمين، فيمكنك تعطيلها لجلستك الفردية باستخدام إضافة WordPress Health Check: Health Check & Troubleshooting – WordPress plugin | WordPress.org English (Canada).

شكرًا لكما يا مايكل وسيمون!

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

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

مايكل – أقدر حقًا مساعدتك ونصائحك حول الإضافات التي قد تكون مشتبهًا بها. لقد وفرت عليّ الكثير من الوقت لأن هاتين الإضافتين كانتا أول ما تفحصته.

سيمون – شكرًا لإخباري عن إضافة WordPress Health Check. لم أكن سمعت بها من قبل، لكنني سأنصبها الآن وأستخدمها لاستكشاف الأخطاء وإصلاحها في المستقبل.

راجع إعدادات الإضافة للتحقق من أي تحويلات تسجيل دخول تنشئها. يبدو أنها تحوّل المستخدمين إلى صفحة ملفهم الشخصي قبل أن تتمكن إضافة WP Discourse من إعادة توجيههم إلى Discourse. إذا وجدت الحل، يرجى نشره هنا. وإذا لم تجد الحل، فأخبرنا بذلك. يمكنني محاولة تثبيت MemberPress على موقعي المحلي.

نعم، تعد إضافة Health Check رائعة لاستكشاف هذا النوع من المشكلات وتصحيحها.

مرحبًا @simon

لم أستطع التوصل إلى أي حل مع MemberPress لهذه المشكلة. بالتأكيد هناك تعارض مع MemberPress، لأنها الإضافة الوحيدة التي قمت فيها بتعيين عنوان إعادة توجيه محدد، أي /jump.

لا أعرف حقًا ما الخطوة التالية. عندما يسجل شخص ما الدخول من موقع WordPress الخاص بي، أريد إعادة توجيه هؤلاء الأشخاص إلى /jump بعد تسجيل الدخول. إذن، MemberPress تقوم بعملها بشكل صحيح في هذا الجانب.

لكن عندما يصل الأشخاص إلى موقع discourse الخاص بي، مثل community.mydomain.com، يتم إعادة توجيههم إلى صفحة تسجيل الدخول في WordPress، وبعد تسجيل الدخول، يتم إرسالهم أيضًا إلى /jump بدلاً من العودة إلى المنتدى.

هل لديك أي أفكار حول ما يمكنني تجربته آخر؟

شكرًا - عمر

هل تعرف الإعدادات التي قمت بتفعيلها في MemberPress لإنشاء إعادة التوجيه؟ لدي إصدار حديث من MemberPress مثبتًا على موقع التطوير الخاص بي، لكنني لم أستطع إعادة إنتاج مشكلة تسجيل الدخول، ولا مشكلة عدم تسجيل خروج المستخدمين من Discourse.

هل موقع WordPress الخاص بك يعمل على تثبيت متعدد المواقع (multisite)، أم أنه تثبيت عادي لـ WordPress؟

من الممكن أن المشكلة التي تواجهها فيما يتعلق بعدم تسجيل خروج المستخدمين من Discourse تعود إلى أن موقع Discourse مُعدّ لطلب تسجيل الدخول لعرض المحتوى. في هذه الحالة، عند تحديث صفحة Discourse، سيتم بدء عملية تسجيل الدخول عبر SSO. لتسجيل خروج المستخدمين بالكامل من Discourse، يجب أيضًا تسجيل خروجهم من WordPress. ويمكن تحقيق ذلك عن طريق إدخال https://example.com/?request=logout في إعداد موقع Discourse المسمى logout redirect. استبدل example.com بنطاق موقع WordPress الخاص بك. أخبرني إذا قمت بذلك ولا تزال المشكلة قائمة.

مرحبًا سيمون

إنه تثبيت ووردبريس عادي (ليس موقعًا متعدد المواقع). وتم إصلاح تسجيل الخروج.

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

–عمر

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

نعم، لقد قمت بذلك. لقد قمت بإعداد إعادة توجيه الصفحة في مكانين:

  1. MemberPress > الإعدادات > الحساب > “عنوان URL الذي سيتم توجيه العضو إليه بعد تسجيل الدخول”

  2. MemberPress > العضويات > [خطة العضوية] > متقدم > “عنوان URL الافتراضي لإعادة التوجيه بعد تسجيل الدخول”

شكرًا! هذه هي الخيارات التي تسبب المشكلة.

مثير للاهتمام! أحتاج إلى ترك هذا الإعداد كما هو عندما ينتقل الأعضاء إلى موقع WordPress وينقرون على تسجيل الدخول.

هل لديك أي فكرة عما إذا كان هناك أي كود PHP يمكنني إضافته إلى ملف functions.php الخاص بي لتجاوز هذا الإعداد لتسجيل الدخول إلى Discourse؟

المشكلة تحدث في الدالة track_and_override_login_redirect_mepr. هذه الدالة مربوطة بفلتر MemberPress mepr-process-login-redirect-url. قد يكون من الممكن الربط بهذه الدالة وتجاوزها عن طريق التحقق من استعلام الاستعلام الذي تم تعيينه. يمكن القيام بذلك باستخدام الدالة wp_get_referer().

لا أعتقد أن لدي وقتًا لحل هذه المشكلة اليوم، لكنني سأراجعها مرة أخرى خلال الأيام القليلة القادمة.

أعدت النظر في هذا الأمر بينما لا يزال حديثاً في ذهني. إضافة الدالة التالية إلى ملف functions.php الخاص بالقالب حل المشكلة بالنسبة لي، لكن لم يتم اختبار هذا الحل بشكل كافٍ.

add_filter( 'mepr-process-login-redirect-url', 'wpdc_login_redirect', 12, 3);
function wpdc_login_redirect( $redirect, $user = false, $is_wp_login_page = false ) {
	$referer = wp_get_referer();
	if ( $referer ) {
		$query_params = [];
		parse_str( parse_url( $referer, PHP_URL_QUERY ), $query_params );
		$sso_referer = ! empty( $query_params['redirect_to'] ) && preg_match( '/^\/\?sso/', $query_params['redirect_to'] );
		if ( $sso_referer ) {

			return home_url( $query_params['redirect_to'] );
		}
	}

	return MeprProductsCtrl::track_and_override_login_redirect_mepr( $redirect, $user, $is_wp_login_page );
}

تقوم هذه الدالة بالالتصاق بفلتر 'mepr-process-login-redirect-url' قبل أن يلتصق به MemberPress. ثم تتحقق من قيمة معلمات الاستعلام لمعرفة ما إذا كان الطلب قد بدأ بواسطة طلب SSO من Discourse. إذا كان الأمر كذلك، فإنها تعيد توجيه المستخدم إلى الصفحة الرئيسية لـ WordPress مع الحفاظ على معلمات الاستعلام كما هي. هذا سيسبب في إكمال إضافة WP Discourse لطلب SSO. أعتقد أن هذا قد يعمل حتى لو كانت الصفحة الرئيسية محمية بواسطة MemberPress، ولكن من الجيد التأكد من ذلك.

إذا لم يكن الطلب قد بدأ بواسطة Discourse، فإن الدالة الثابتة MeprProductsCtrl::track_and_override_login_redirect_mepr تُستدعى بالوسائط التي تم تمريرها إلى الفلتر.

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

هذا رائع يا سيمون! أنت نجم!

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