Skip to content

Commit 792593f

Browse files
committed
Final version bump to v5.2.6 for public release.
1 parent d74e96b commit 792593f

20 files changed

Lines changed: 1119 additions & 803 deletions

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2906,4 +2906,12 @@ body .upgrade-plan-container #upgradable-plans .upgrade-membership-label,
29062906
color: #6b6b6b;
29072907
margin-top: 3px;
29082908
line-height: 16px;
2909+
}
2910+
2911+
.ur-submit-button.urm-submit-currency-blocked, .ur-submit-button:disabled,
2912+
.urm-update-membership-button.urm-submit-currency-blocked,
2913+
.urm-update-membership-button:disabled {
2914+
opacity: 0.5;
2915+
cursor: not-allowed;
2916+
pointer-events: none;
29092917
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,3 +2088,13 @@ body,
20882088
margin-top: 3px;
20892089
line-height: 16px;
20902090
}
2091+
2092+
.ur-submit-button,
2093+
.urm-update-membership-button {
2094+
&.urm-submit-currency-blocked,
2095+
&:disabled {
2096+
opacity: 0.5;
2097+
cursor: not-allowed;
2098+
pointer-events: none;
2099+
}
2100+
}

assets/js/modules/membership/frontend/user-registration-membership-frontend.js

Lines changed: 74 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,38 @@
900900
prefix + " " + urmf_data.labels.i18n_coupon_discount_message
901901
);
902902
},
903+
/**
904+
* Clear an applied coupon and recalculate totals.
905+
* Used by the cancel (X) control and when the coupon input is emptied.
906+
*
907+
* @param {Object} options Optional settings.
908+
* @param {boolean} options.skipEmptyInput Skip clearing the input when already empty.
909+
*/
910+
clear_applied_coupon: function (options) {
911+
options = options || {};
912+
913+
if (!options.skipEmptyInput) {
914+
$("#ur-membership-coupon").val("");
915+
}
916+
917+
$("#coupon-validation-error")
918+
.text("")
919+
.removeClass("notice_blue notice_red");
920+
$(".urm_apply_coupon").show();
921+
$("#total-input-notice").text("");
922+
923+
var selected_membership = $(
924+
'input[name="urm_membership"]:checked'
925+
);
926+
927+
selected_membership
928+
.removeData("ur-discount-amount")
929+
.removeAttr("data-ur-discount-amount");
930+
931+
if (selected_membership.length) {
932+
ur_membership_ajax_utils.calculate_total(selected_membership);
933+
}
934+
},
903935
/**
904936
* Send data to the backend API.
905937
*
@@ -3360,17 +3392,35 @@
33603392
});
33613393
//coupon clear input
33623394
$(document).on("click", ".ur_clear_coupon", function () {
3363-
$("#ur-membership-coupon").val("");
3364-
$("#coupon-validation-error").text("");
3365-
$(".urm_apply_coupon").show();
3366-
$("#total-input-notice").text("");
3395+
ur_membership_ajax_utils.clear_applied_coupon();
3396+
});
3397+
// Clear applied coupon when the field is emptied (e.g. backspace), same as cancel (X).
3398+
$(document).on("input", "#ur-membership-coupon", function () {
3399+
if ($(this).val().trim() !== "") {
3400+
return;
3401+
}
3402+
33673403
var selected_membership = $(
33683404
'input[name="urm_membership"]:checked'
33693405
);
3370-
selected_membership
3371-
.removeData("ur-discount-amount")
3372-
.removeAttr("data-ur-discount-amount");
3373-
ur_membership_ajax_utils.calculate_total(selected_membership);
3406+
var hasAppliedDiscount =
3407+
typeof selected_membership.attr(
3408+
"data-ur-discount-amount"
3409+
) !== "undefined" ||
3410+
typeof selected_membership.data("ur-discount-amount") !==
3411+
"undefined";
3412+
3413+
if (!hasAppliedDiscount) {
3414+
$("#coupon-validation-error")
3415+
.text("")
3416+
.removeClass("notice_blue notice_red");
3417+
$(".urm_apply_coupon").show();
3418+
return;
3419+
}
3420+
3421+
ur_membership_ajax_utils.clear_applied_coupon({
3422+
skipEmptyInput: true
3423+
});
33743424
});
33753425
//redirect to membership member registration form
33763426
$(document).on(
@@ -3985,10 +4035,22 @@
39854035
var oldText = $periodText.length
39864036
? $periodText.text()
39874037
: $span.text();
3988-
var parts = oldText.split("/");
3989-
var durationPart = parts[1]
3990-
? "/ " + parts[1].trim()
3991-
: "";
4038+
var durationPart = "";
4039+
var everyIndex = oldText
4040+
.toLowerCase()
4041+
.indexOf(" every ");
4042+
4043+
if (everyIndex !== -1) {
4044+
durationPart = oldText
4045+
.substring(everyIndex)
4046+
.trim();
4047+
} else {
4048+
// Legacy slash format: "$200.00 / 2 Weeks".
4049+
var parts = oldText.split("/");
4050+
durationPart = parts[1]
4051+
? "/ " + parts[1].trim()
4052+
: "";
4053+
}
39924054

39934055
if (localCurrencyDetails[currency]) {
39944056
var newCalculatedValue =

assets/js/modules/membership/frontend/user-registration-membership-frontend.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

assets/js/ur-components/ur-components.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,21 @@ jQuery(function ($) {
6161
"click",
6262
".user-registration-card__toggle",
6363
function () {
64-
$(this)
64+
var card_body = $(this)
6565
.closest(".user-registration-card")
66-
.find(".user-registration-card__body")
67-
.toggle();
66+
.find(".user-registration-card__body");
67+
68+
card_body.toggle();
69+
70+
if (card_body.is(":visible")) {
71+
$(this).html(
72+
'<svg viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1"><polyline points="6 15 12 9 18 15"></polyline></svg>'
73+
);
74+
} else {
75+
$(this).html(
76+
'<svg viewBox="0 0 24 24" width="24" height="24" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1"><polyline points="6 9 12 15 18 9"></polyline></svg>'
77+
);
78+
}
6879
}
6980
);
7081

assets/js/ur-components/ur-components.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

includes/class-ur-shortcodes.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,10 @@ public static function form( $atts ) {
276276
$users_can_register = apply_filters( 'ur_register_setting_override', get_option( 'users_can_register' ) );
277277
$check_user_state = isset( $atts['userState'] ) && 'logged_in' === $atts['userState'];
278278

279+
if ( ! is_user_logged_in() && ! $check_user_state && ! $users_can_register ) {
280+
return apply_filters( 'ur_register_pre_form_message', '<p class="alert" id="ur_register_pre_form_message">' . __( 'Registration is currently disabled.', 'user-registration' ) . '</p>' );
281+
}
282+
279283
if ( is_user_logged_in() || $check_user_state ) {
280284

281285
$is_membership_module_active = ur_check_module_activation( 'membership' );

includes/form/class-ur-form-field-country.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public function get_selected_countries( $form_id, $field_name ) {
315315

316316
// Get selected_countries data of the field.
317317
foreach ( $fields as $field ) {
318-
if ( 'country' === $field->field_key && $field_name === $field->general_setting->field_name ) {
318+
if ( isset( $field->field_key ) && 'country' === $field->field_key && $field_name === $field->general_setting->field_name ) {
319319
$advance_setting = $field->advance_setting;
320320
if ( isset( $advance_setting->selected_countries ) ) {
321321
$selected_countries = $advance_setting->selected_countries;

includes/frontend/class-ur-frontend.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,26 @@ function ( $item, $key ) {
734734
$data['period'] = $amount;
735735
}
736736

737+
// Override the plan's base price with what the member actually paid (may differ under Local Currency), mirroring the admin member view.
738+
if ( 'free' !== ( $membership['post_content']['type'] ?? '' ) ) {
739+
$period_order = $orders_repository->get_order_by_subscription( $membership['subscription_id'] );
740+
741+
if ( ! empty( $period_order['ID'] ) ) {
742+
$local_currency_meta = $orders_repository->get_order_meta_by_order_id_and_meta_key( $period_order['ID'], 'local_currency' );
743+
$order_currency = ! empty( $local_currency_meta['meta_value'] ) ? $local_currency_meta['meta_value'] : $currency;
744+
$order_symbol = ur_get_currency_symbol( $order_currency );
745+
$order_amount_display = $order_symbol . number_format( (float) $period_order['total_amount'], 2 );
746+
747+
$duration_suffix = '';
748+
$every_pos = strpos( $data['period'], ' every ' );
749+
if ( false !== $every_pos ) {
750+
$duration_suffix = substr( $data['period'], $every_pos );
751+
}
752+
753+
$data['period'] = $order_amount_display . $duration_suffix;
754+
}
755+
}
756+
737757
$subscription_last_order = $orders_repository->get_order_by_subscription( $membership['subscription_id'] );
738758
if ( ! empty( $subscription_last_order ) && $subscription_last_order['status'] === 'completed' ) {
739759
$data = apply_filters( 'user_registration_membership_add_team_data_if_exists', $data, $subscription_last_order );

includes/functions-ur-core.php

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3238,8 +3238,11 @@ function user_registration_pro_render_conditional_logic( $connection, $integrati
32383238
$output .= '</div>';
32393239
$output .= '</div>';
32403240

3241-
$wrapper_style = '' === $checked ? ' style="display:none;"' : '';
3242-
$output .= '<div class="form-row ur_conditional_logic_wrapper"' . $wrapper_style . ' data-source="' . esc_attr( $integration ) . '">';
3241+
// Keep the rules hidden initially when conditional logic is disabled,
3242+
// so the "Conditional Rules" section only shows once the toggle is on.
3243+
$wrapper_style = $checked ? '' : ' style="display:none;"';
3244+
$output .= '<div class="form-row ur_conditional_logic_wrapper" data-source="' . esc_attr( $integration ) . '"' . $wrapper_style . '>';
3245+
32433246
$output .= '<label class="ur-label checkbox">' . esc_html__( 'Conditional Rules', 'user-registration' ) . '</label>';
32443247
$output .= '<div class="ur-logic"><p>' . esc_html__( 'Send data only if the following matches.', 'user-registration' ) . '</p></div>';
32453248
$output .= '<div class="ur-conditional-wrapper">';
@@ -5524,7 +5527,6 @@ function ur_process_registration( $nonce_value ) {
55245527
);
55255528
}
55265529

5527-
55285530
$logger->info(
55295531
sprintf( '[Form #%d] Processing form submission.', $form_id ),
55305532
array(
@@ -5656,6 +5658,22 @@ function ur_process_registration( $nonce_value ) {
56565658
*/
56575659
$users_can_register = apply_filters( 'ur_register_setting_override', get_option( 'users_can_register' ) );
56585660

5661+
if ( ! is_user_logged_in() && ! $users_can_register ) {
5662+
$logger->warning(
5663+
sprintf( '[Form #%d] Registration is disabled by the site administrator.', $form_id ) . "\n",
5664+
array(
5665+
'source' => 'form-submission',
5666+
'form_id' => $form_id,
5667+
)
5668+
);
5669+
5670+
wp_send_json_error(
5671+
array(
5672+
'message' => __( 'Registration is currently disabled.', 'user-registration' ),
5673+
)
5674+
);
5675+
}
5676+
56595677
if ( is_user_logged_in() ) {
56605678
/**
56615679
* Filter to modify user capability.

0 commit comments

Comments
 (0)