Skip to content

Commit e21db0c

Browse files
authored
UR-4681 Fix - Payment Before Login not enforced for pending payments (#1361)
* UR-4681 Fix - Payment Before Login not enforced for pending payments * Implement login gate seeding for pending paid members to ensure proper registration flow
1 parent 3a440a2 commit e21db0c

2 files changed

Lines changed: 45 additions & 2 deletions

File tree

includes/class-ur-user-approval.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,15 @@ public function check_status_on_login( $user, $password ) {
308308
return $user;
309309
} elseif ( 'payment' === $login_option ) {
310310

311+
if ( $is_membership_active ) {
312+
$members_repository = new \WPEverest\URMembership\Admin\Repositories\MembersRepository();
313+
$membership = $members_repository->get_member_membership_by_id( $user->ID );
314+
$members_order_repository = new \WPEverest\URMembership\Admin\Repositories\MembersOrderRepository();
315+
$last_order = $members_order_repository->get_member_orders( $user->ID );
316+
}
317+
311318
$payment_status = get_user_meta( $user->ID, 'ur_payment_status', true );
312-
$is_member = $is_membership_active && ! empty( $membership );
319+
$is_member = $is_membership_active && ! empty( $membership ) && ! empty( $last_order );
313320
if ( $is_member ) {
314321
$payment_status = $last_order['status'];
315322
$membership_payment_method = $last_order['payment_method'];
@@ -338,7 +345,7 @@ public function check_status_on_login( $user, $password ) {
338345
$payment_service = new \WPEverest\URMembership\Admin\Services\PaymentService( $payment_method, $membership_id, $user->user_email );
339346
$response_data = array(
340347
'membership' => $membership_id,
341-
'subscription_id' => $membership['subscription_id'],
348+
'subscription_id' => $membership[0]['subscription_id'],
342349
'member_id' => $user_id,
343350
);
344351
$is_upgrading = get_user_meta( $user_id, 'urm_is_user_upgraded', true );

modules/membership/includes/Admin.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)