@@ -577,6 +577,9 @@ public function process_membership_after_registration( $success_params, $valid_f
577577 if ( 'free ' === $ data ['payment_method ' ] ) {
578578 do_action ( 'urm_member_registered ' , $ data , $ member_id );
579579 } else {
580+ // Paid path skips user_registration_after_register_user_action (payment_process=true),
581+ // so the core login-gate setters never run. Seed the gate here. UR-4681.
582+ $ this ->set_login_gate_for_pending_member ( $ member_id );
580583 update_user_meta ( $ member_id , 'ur_membership_registration_data ' , $ data );
581584 }
582585
@@ -604,6 +607,39 @@ public function process_membership_after_registration( $success_params, $valid_f
604607 }
605608
606609 /**
610+ * Seed the admin-approval / email-confirmation login gate for a paid member, since the
611+ * core setters on user_registration_after_register_user_action are skipped for paid
612+ * registrations. Writes only the gate meta (no emails), so email order is unchanged.
613+ * The 'payment' option is gated separately in UR_User_Approval::check_status_on_login().
614+ * UR-4681.
615+ *
616+ * @param int $member_id New member user ID.
617+ */
618+ private function set_login_gate_for_pending_member ( $ member_id ) {
619+ $ login_option = ur_get_user_login_option ( $ member_id );
620+
621+ // Only the approval / email-confirmation gates need seeding here.
622+ if ( ! in_array ( $ login_option , array ( 'admin_approval ' , 'email_confirmation ' , 'admin_approval_after_email_confirmation ' ), true ) ) {
623+ return ;
624+ }
625+
626+ // Never override a status that has somehow already been written (e.g. the core hook ran).
627+ if ( metadata_exists ( 'user ' , $ member_id , 'ur_user_status ' ) || metadata_exists ( 'user ' , $ member_id , 'ur_confirm_email ' ) ) {
628+ return ;
629+ }
630+
631+ if ( 'admin_approval ' === $ login_option ) {
632+ $ user_manager = new \UR_Admin_User_Manager ( $ member_id );
633+ $ user_manager ->save_status ( \UR_Admin_User_Manager::PENDING , false );
634+ } elseif ( 'email_confirmation ' === $ login_option ) {
635+ update_user_meta ( $ member_id , 'ur_confirm_email ' , 0 );
636+ } elseif ( 'admin_approval_after_email_confirmation ' === $ login_option ) {
637+ update_user_meta ( $ member_id , 'ur_confirm_email ' , 0 );
638+ update_user_meta ( $ member_id , 'ur_admin_approval_after_email_confirmation ' , 'false ' );
639+ update_user_meta ( $ member_id , 'ur_user_status ' , \UR_Admin_User_Manager::PENDING );
640+ }
641+ }
642+ /*
607643 * Whether a payment_method="free" submission on a non-free plan is a legitimate 100%-coupon
608644 * free order. Only ONE-TIME (paid) plans qualify; the coupon is re-validated against the DB
609645 * so a forged payment_method="free" cannot bypass payment. UR-4386.
0 commit comments