Skip to content

Commit 9a49ef3

Browse files
committed
Fix - Route Fixed Period renewals to the correct service and fix expiring-soon email exact-date match
1 parent ea4a313 commit 9a49ef3

10 files changed

Lines changed: 166 additions & 18 deletions

File tree

assets/css/admin.scss

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,6 +2749,15 @@ img.tips {
27492749
background-color: $white;
27502750
}
27512751

2752+
// The vendor theme fixes the month/year header at 34px, but WP-admin's own
2753+
// select/number-input styling renders the month dropdown and year input at 38px,
2754+
// so they overflow the header box and visually crowd the weekday row below it
2755+
// regardless of margin. Give the header enough height to actually contain them,
2756+
// then add breathing room on top of that.
2757+
.flatpickr-months .flatpickr-month {
2758+
height: 48px;
2759+
}
2760+
27522761
/**
27532762
* Fullscreen Mode
27542763
**/

assets/css/modules/membership/user-registration-membership-frontend.scss

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2054,7 +2054,8 @@ body,
20542054
.ur-membership-title-text,
20552055
.ur-membership-trial-label,
20562056
.ur-membership-period-text,
2057-
.ur-membership-trial-end {
2057+
.ur-membership-trial-end,
2058+
.ur-membership-fixed-period-end {
20582059
display: block;
20592060
}
20602061

@@ -2088,3 +2089,20 @@ body,
20882089
margin-top: 3px;
20892090
line-height: 16px;
20902091
}
2092+
2093+
.ur-membership-fixed-period-end {
2094+
font-size: 12px;
2095+
font-weight: 400;
2096+
color: #6b6b6b;
2097+
margin-top: 3px;
2098+
line-height: 16px;
2099+
}
2100+
2101+
.ur-membership-plan-expired {
2102+
opacity: 0.5;
2103+
cursor: not-allowed !important;
2104+
2105+
.ur-membership-fixed-period-end {
2106+
color: #d63638;
2107+
}
2108+
}

assets/css/my-account-layout.scss

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,6 +1690,18 @@
16901690
gap: 5px;
16911691
}
16921692
}
1693+
1694+
.ur-membership-early-renewal-note {
1695+
display: block !important;
1696+
padding: 0 !important;
1697+
border-radius: 0 !important;
1698+
background: transparent;
1699+
font-weight: 400;
1700+
font-size: 12px;
1701+
line-height: 16px;
1702+
text-transform: none;
1703+
color: #6b6b6b;
1704+
}
16931705
}
16941706

16951707
&--action {

includes/Functions/CoreFunctions.php

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -402,17 +402,36 @@ function build_membership_list_frontend( $memberships ) {
402402
}
403403
}
404404

405+
$fixed_period_status = 'off';
406+
$fixed_period_valid_until = '';
407+
$fixed_period_expired = false;
408+
if ( 'paid' === $membership_type
409+
&& ur_string_to_bool( $membership['meta_value']['enable_fixed_period_duration'] ?? '' )
410+
&& 'fixed_expiration_date' === ( $membership['meta_value']['fixed_period']['period_type'] ?? '' )
411+
&& ! empty( $membership['meta_value']['fixed_period']['expiration_date'] )
412+
) {
413+
$expiration_timestamp = strtotime( $membership['meta_value']['fixed_period']['expiration_date'] );
414+
if ( false !== $expiration_timestamp ) {
415+
$fixed_period_status = 'on';
416+
$fixed_period_valid_until = date_i18n( 'M j, Y', $expiration_timestamp );
417+
$fixed_period_expired = $expiration_timestamp < strtotime( gmdate( 'Y-m-d' ) );
418+
}
419+
}
420+
405421
$new_mem[ $k ] = array(
406-
'ID' => $membership_id,
407-
'title' => ! empty( $membership['post_title'] ) ? $membership['post_title'] : '',
408-
'description' => ! empty( $membership['post_content']['description'] ) ? $membership['post_content']['description'] : get_post_meta( $membership_id, 'ur_membership_description', true ),
409-
'type' => $membership_type,
410-
'amount' => ! empty( $membership_meta_value ) ? $membership['meta_value']['amount'] : 0,
411-
'currency_symbol' => $symbol,
412-
'calculated_amount' => 'free' === $membership_type ? 0 : ( ! empty( $membership_meta_value ) ? (float) $membership_meta_value['amount'] : 0 ),
413-
'period' => 'free' === $membership_type ? __( 'Free', 'user-registration' ) : $subscription_period,
414-
'trial_status' => ! empty( $membership['meta_value']['trial_status'] ) ? $membership['meta_value']['trial_status'] : 'off',
415-
'trial_data' => ( ! empty( $membership['meta_value']['trial_data'] ) && is_array( $membership['meta_value']['trial_data'] ) ) ? $membership['meta_value']['trial_data'] : array(),
422+
'ID' => $membership_id,
423+
'title' => ! empty( $membership['post_title'] ) ? $membership['post_title'] : '',
424+
'description' => ! empty( $membership['post_content']['description'] ) ? $membership['post_content']['description'] : get_post_meta( $membership_id, 'ur_membership_description', true ),
425+
'type' => $membership_type,
426+
'amount' => ! empty( $membership_meta_value ) ? $membership['meta_value']['amount'] : 0,
427+
'currency_symbol' => $symbol,
428+
'calculated_amount' => 'free' === $membership_type ? 0 : ( ! empty( $membership_meta_value ) ? (float) $membership_meta_value['amount'] : 0 ),
429+
'period' => 'free' === $membership_type ? __( 'Free', 'user-registration' ) : $subscription_period,
430+
'trial_status' => ! empty( $membership['meta_value']['trial_status'] ) ? $membership['meta_value']['trial_status'] : 'off',
431+
'trial_data' => ( ! empty( $membership['meta_value']['trial_data'] ) && is_array( $membership['meta_value']['trial_data'] ) ) ? $membership['meta_value']['trial_data'] : array(),
432+
'fixed_period_status' => $fixed_period_status,
433+
'fixed_period_valid_until' => $fixed_period_valid_until,
434+
'fixed_period_expired' => $fixed_period_expired,
416435
);
417436

418437
if ( isset( $membership['meta_value']['payment_gateways'] ) ) {

modules/membership/includes/Admin/Forms/Views/admin-membership.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ function ( $m ) use ( $selected_ids ) {
165165
}
166166
}
167167
?>
168-
<div class="urmg-plan-card <?php echo esc_attr( $selected_class ); ?>"
168+
<div class="urmg-plan-card <?php echo esc_attr( $selected_class ); ?><?php echo ! empty( $option['fixed_period_expired'] ) ? ' ur-membership-plan-expired' : ''; ?>"
169169
data-plan-id="<?php echo $plan_id; ?>"
170170
data-plan-amount="<?php echo esc_attr( $plan_amount ); ?>"
171171
data-plan-type="<?php echo esc_attr( $plan_type ); ?>">
@@ -190,6 +190,18 @@ function ( $m ) use ( $selected_ids ) {
190190
printf( esc_html__( 'Trial ends %s', 'user-registration' ), esc_html( $admin_trial_end_display ) );
191191
?>
192192
</span>
193+
<?php elseif ( ! empty( $option['fixed_period_valid_until'] ) ) : ?>
194+
<span class="ur-membership-fixed-period-end">
195+
<?php
196+
if ( ! empty( $option['fixed_period_expired'] ) ) {
197+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
198+
printf( esc_html__( 'Expired on %s', 'user-registration' ), esc_html( $option['fixed_period_valid_until'] ) );
199+
} else {
200+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
201+
printf( esc_html__( 'Valid until: %s', 'user-registration' ), esc_html( $option['fixed_period_valid_until'] ) );
202+
}
203+
?>
204+
</span>
193205
<?php endif; ?>
194206
</div>
195207
</div>

modules/membership/includes/Admin/Services/Paypal/NewPaypalService.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1369,7 +1369,17 @@ public function handle_paypal_redirect_response( $params, $payer_id ) {
13691369
$member_subscription = $this->members_subscription_repository->get_subscription_data_by_subscription_id( $member_order['subscription_id'] );
13701370

13711371
if ( $is_renewing && ! empty( $member_subscription ) ) {
1372-
$subscription_service = new SubscriptionService();
1372+
$is_paid = isset( $membership_metas['type'] ) && 'paid' === $membership_metas['type'];
1373+
$is_fixed_period = ! empty( $membership_metas['enable_fixed_period_duration'] );
1374+
$is_renewable = ! empty( $membership_metas['fixed_period']['expiration_date_renewal'] );
1375+
$is_fixed_period_addon_active = class_exists( '\WPEverest\URM\FixedPeriodMemebership\FixedPeriodSubscriptionService' );
1376+
1377+
if ( $is_paid && $is_fixed_period && $is_renewable && $is_fixed_period_addon_active ) {
1378+
$subscription_service = new \WPEverest\URM\FixedPeriodMemebership\FixedPeriodSubscriptionService();
1379+
} else {
1380+
$subscription_service = new SubscriptionService();
1381+
}
1382+
13731383
$subscription_service->update_subscription_data_for_renewal( $member_subscription, $membership_metas );
13741384
}
13751385

modules/membership/includes/Templates/membership-listing.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ class="membership-signup-button <?php echo esc_attr( $button_class ); ?>" <?php
258258
}
259259
?>
260260
<div class="membership-block">
261-
<label class="ur_membership_input_label ur-label"
261+
<label class="ur_membership_input_label ur-label<?php echo ! empty( $membership['fixed_period_expired'] ) ? ' ur-membership-plan-expired' : ''; ?>"
262262
for="ur-membership-select-membership-<?php echo esc_attr( $membership['ID'] ); ?>">
263263
<input class="ur_membership_input_class ur_membership_radio_input ur-frontend-field <?php echo esc_html( $radio_class ); ?>"
264264
id="ur-membership-select-membership-<?php echo esc_attr( $membership['ID'] ); ?>"
@@ -269,6 +269,7 @@ class="membership-signup-button <?php echo esc_attr( $button_class ); ?>" <?php
269269
data-action="<?php echo esc_attr( $intended_action ); ?>"
270270
data-redirect="<?php echo esc_url( $redirect_page_url ); ?>"
271271
data-thankyou="<?php echo esc_attr( $thank_you_page_id ); ?>"
272+
<?php disabled( ! empty( $membership['fixed_period_expired'] ) ); ?>
272273
>
273274
<div class="ur-membership-title-wrapper">
274275
<span class="ur-membership-title">
@@ -303,6 +304,18 @@ class="membership-signup-button <?php echo esc_attr( $button_class ); ?>" <?php
303304
printf( esc_html__( 'Trial ends %s', 'user-registration' ), esc_html( $trial_end_display ) );
304305
?>
305306
</span>
307+
<?php elseif ( ! empty( $membership['fixed_period_valid_until'] ) ) : ?>
308+
<span class="ur-membership-fixed-period-end">
309+
<?php
310+
if ( ! empty( $membership['fixed_period_expired'] ) ) {
311+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
312+
printf( esc_html__( 'Expired on %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
313+
} else {
314+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
315+
printf( esc_html__( 'Valid until: %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
316+
}
317+
?>
318+
</span>
306319
<?php endif; ?>
307320
</div>
308321
<?php } else { ?>

modules/membership/includes/Templates/membership-registration-form.php

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class="ur-label ur_membership_local_currency"><?php echo __( 'Switch Currency',
210210
$urm_default_pg = apply_filters( 'user_registration_membership_default_payment_gateway', '' );
211211
$has_team_pricing = $is_team_addon_activated && ! empty( $membership['team_pricing'] );
212212
?>
213-
<label class="ur_membership_input_label ur-label <?php echo $has_team_pricing ? 'ur-has-team-pricing' : 'ur-normal-pricing'; ?>"
213+
<label class="ur_membership_input_label ur-label <?php echo $has_team_pricing ? 'ur-has-team-pricing' : 'ur-normal-pricing'; ?><?php echo ! empty( $membership['fixed_period_expired'] ) ? ' ur-membership-plan-expired' : ''; ?>"
214214
for="ur-membership-select-membership-<?php echo esc_attr( $membership['ID'] ); ?>"
215215
data-membership-id="<?php echo esc_attr( $membership['ID'] ); ?>">
216216
<input class="ur_membership_input_class ur_membership_radio_input ur-frontend-field"
@@ -236,6 +236,7 @@ class="ur-label ur_membership_local_currency"><?php echo __( 'Switch Currency',
236236
<?php echo isset( $_GET['membership_id'] ) && ! empty( $_GET['membership_id'] ) && $_GET['membership_id'] == $membership['ID'] ? 'checked' : ''; ?>
237237
data-local-currency="<?php echo esc_attr( ! empty( $final_period ) ? $local_currency_by_country : '' ); ?>"
238238
data-zone-id="<?php echo esc_attr( ! empty( $final_period ) && isset( $enabled_zones[ $local_currency_by_country ]['ID'] ) ? $enabled_zones[ $local_currency_by_country ]['ID'] : '' ); ?>"
239+
<?php disabled( ! empty( $membership['fixed_period_expired'] ) ); ?>
239240
>
240241
<span class="ur-membership-duration ur-membership-name-wrap">
241242
<span class="ur-membership-title-text"><?php echo esc_html( $membership['title'] ); ?></span>
@@ -252,6 +253,18 @@ class="ur-label ur_membership_local_currency"><?php echo __( 'Switch Currency',
252253
printf( esc_html__( 'Trial ends %s', 'user-registration' ), esc_html( $trial_end_display ) );
253254
?>
254255
</span>
256+
<?php elseif ( ! empty( $membership['fixed_period_valid_until'] ) ) : ?>
257+
<span class="ur-membership-fixed-period-end">
258+
<?php
259+
if ( ! empty( $membership['fixed_period_expired'] ) ) {
260+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
261+
printf( esc_html__( 'Expired on %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
262+
} else {
263+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
264+
printf( esc_html__( 'Valid until: %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
265+
}
266+
?>
267+
</span>
255268
<?php endif; ?>
256269
</span>
257270
</label>
@@ -260,7 +273,7 @@ class="ur-label ur_membership_local_currency"><?php echo __( 'Switch Currency',
260273
<div class="urm-team-pricing-container" id="urm-team-pricing-container-<?php echo esc_attr( $membership['ID'] ); ?>" style="display: none;">
261274
<div class="urm-team-pricing-card">
262275
<div class="urm-team-pricing-card__body">
263-
<label class="ur_membership_input_label ur-label ur-team-pricing-label"
276+
<label class="ur_membership_input_label ur-label ur-team-pricing-label<?php echo ! empty( $membership['fixed_period_expired'] ) ? ' ur-membership-plan-expired' : ''; ?>"
264277
for="ur-membership-select-membership-<?php echo esc_attr( $membership['ID'] ); ?>">
265278
<input class="ur_membership_input_class ur_membership_radio_input ur-frontend-field"
266279
data-key-name="ur-membership-id"
@@ -277,6 +290,7 @@ class="ur-label ur_membership_local_currency"><?php echo __( 'Switch Currency',
277290
data-has-coupon-link="<?php echo esc_attr( in_array( $membership['ID'], $membership_ids_link_with_coupons ) ? 'yes' : 'no' ); ?>"
278291
data-urm-default-pg="<?php echo $urm_default_pg; ?>"
279292
<?php echo isset( $_GET['membership_id'] ) && ! empty( $_GET['membership_id'] ) && $_GET['membership_id'] == $membership['ID'] ? 'checked' : ''; ?>
293+
<?php disabled( ! empty( $membership['fixed_period_expired'] ) ); ?>
280294
>
281295
<span
282296
class="ur-membership-duration ur-membership-title ur-membership-name-wrap">
@@ -296,6 +310,18 @@ class="ur-membership-duration ur-membership-title ur-membership-name-wrap">
296310
printf( esc_html__( 'Trial ends %s', 'user-registration' ), esc_html( $trial_end_display ) );
297311
?>
298312
</span>
313+
<?php elseif ( ! empty( $membership['fixed_period_valid_until'] ) ) : ?>
314+
<span class="ur-membership-fixed-period-end">
315+
<?php
316+
if ( ! empty( $membership['fixed_period_expired'] ) ) {
317+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
318+
printf( esc_html__( 'Expired on %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
319+
} else {
320+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
321+
printf( esc_html__( 'Valid until: %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
322+
}
323+
?>
324+
</span>
299325
<?php endif; ?>
300326
</div>
301327
<div class="urm-team-pricing-btn">
@@ -398,6 +424,18 @@ class="ur-membership-duration ur-membership-title ur-membership-name-wrap">
398424
printf( esc_html__( 'Trial ends %s', 'user-registration' ), esc_html( $trial_end_display ) );
399425
?>
400426
</span>
427+
<?php elseif ( ! empty( $membership['fixed_period_valid_until'] ) ) : ?>
428+
<span class="ur-membership-fixed-period-end">
429+
<?php
430+
if ( ! empty( $membership['fixed_period_expired'] ) ) {
431+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
432+
printf( esc_html__( 'Expired on %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
433+
} else {
434+
/* translators: %s: expiration date (e.g. "Jul 30, 2026") */
435+
printf( esc_html__( 'Valid until: %s', 'user-registration' ), esc_html( $membership['fixed_period_valid_until'] ) );
436+
}
437+
?>
438+
</span>
401439
<?php endif; ?>
402440
</div>
403441
</div>

modules/payment-history/Admin/OrderService.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,16 @@ public function approve_payment_status( $order, $subscription_id ) {
245245
$membership = $membership_repository->get_single_membership_by_ID( $member_subscription['item_id'] );
246246
$membership_metas = wp_unslash( json_decode( $membership['meta_value'], true ) );
247247
$membership_metas['post_title'] = $membership['post_title'];
248+
249+
$is_paid = isset( $membership_metas['type'] ) && 'paid' === $membership_metas['type'];
250+
$is_fixed_period = ! empty( $membership_metas['enable_fixed_period_duration'] );
251+
$is_renewable = ! empty( $membership_metas['fixed_period']['expiration_date_renewal'] );
252+
$is_fixed_period_addon_active = class_exists( '\WPEverest\URM\FixedPeriodMemebership\FixedPeriodSubscriptionService' );
253+
254+
if ( $is_paid && $is_fixed_period && $is_renewable && $is_fixed_period_addon_active ) {
255+
$subscription_service = new \WPEverest\URM\FixedPeriodMemebership\FixedPeriodSubscriptionService();
256+
}
257+
248258
$subscription_service->update_subscription_data_for_renewal( $member_subscription, $membership_metas );
249259
$subscription_data['start_date'] = date( 'Y-m-d 00:00:00' );
250260
}

templates/myaccount/membership.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,14 @@
7070
$can_renew = ! $is_renewing && isset( $membership['post_content']['type'] ) && 'automatic' !== $data['renewal_behaviour'] && 'subscription' == $membership_type;
7171

7272
// Fixed-period paid memberships with annual renewal enabled (pro + module required).
73-
if ( UR_PRO_ACTIVE
73+
$is_fixed_period_renewable = UR_PRO_ACTIVE
7474
&& ur_check_module_activation( 'fixed-period-membership' )
7575
&& class_exists( '\WPEverest\URM\FixedPeriodMemebership\FixedPeriodSubscriptionService' )
7676
&& 'paid' === $membership_type
7777
&& ur_string_to_bool( get_user_meta( $membership['user_id'], 'expiration_date_renewal', true ) )
78-
&& ! empty( $membership['expiry_date'] ) ) {
78+
&& ! empty( $membership['expiry_date'] );
79+
80+
if ( $is_fixed_period_renewable ) {
7981
$can_renew = true;
8082
}
8183

@@ -191,6 +193,11 @@
191193
?>
192194
</span>
193195
<?php endif; ?>
196+
<?php if ( $is_fixed_period_renewable && ! $is_membership_expired ) : ?>
197+
<span class="ur-membership-early-renewal-note">
198+
<?php esc_html_e( 'Early renewal available', 'user-registration' ); ?>
199+
</span>
200+
<?php endif; ?>
194201
<?php
195202
else :
196203
echo __( 'N/A', 'user-registration' );

0 commit comments

Comments
 (0)