Version Description
Download this release
Release Info
Developer | champsupertramp |
Plugin | Ultimate Member – User Profile & Membership Plugin |
Version | 1.3.77 |
Comparing to | |
See all releases |
Code changes from version 1.3.73 to 1.3.77
- admin/core/lib/ReduxFramework/{readme.txt → README.txt} +0 -0
- admin/core/um-admin-actions.php +4 -7
- core/um-actions-access.php +66 -64
- core/um-actions-form.php +4 -2
- core/um-actions-password.php +16 -2
- core/um-actions-register.php +6 -4
- core/um-actions-save-profile.php +11 -2
- core/um-filters-arguments.php +7 -4
- core/um-form.php +13 -9
- core/um-user.php +28 -0
- index.php +1 -1
- readme.txt +32 -2
admin/core/lib/ReduxFramework/{readme.txt → README.txt}
RENAMED
File without changes
|
admin/core/um-admin-actions.php
CHANGED
@@ -254,15 +254,12 @@
|
|
254 |
***/
|
255 |
add_action('um_admin_do_action__user_cache', 'um_admin_do_action__user_cache');
|
256 |
function um_admin_do_action__user_cache( $action ){
|
257 |
-
global $ultimatemember;
|
258 |
if ( !is_admin() || !current_user_can('manage_options') ) die();
|
259 |
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
delete_option( $k );
|
264 |
-
}
|
265 |
-
}
|
266 |
|
267 |
$url = admin_url('admin.php?page=ultimatemember');
|
268 |
$url = add_query_arg('update','cleared_cache',$url);
|
254 |
***/
|
255 |
add_action('um_admin_do_action__user_cache', 'um_admin_do_action__user_cache');
|
256 |
function um_admin_do_action__user_cache( $action ){
|
257 |
+
global $ultimatemember, $wpdb;
|
258 |
if ( !is_admin() || !current_user_can('manage_options') ) die();
|
259 |
|
260 |
+
|
261 |
+
$wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'um_cache_userdata_%'" );
|
262 |
+
|
|
|
|
|
|
|
263 |
|
264 |
$url = admin_url('admin.php?page=ultimatemember');
|
265 |
$url = add_query_arg('update','cleared_cache',$url);
|
core/um-actions-access.php
CHANGED
@@ -571,88 +571,90 @@
|
|
571 |
|
572 |
}
|
573 |
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
|
|
591 |
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
|
605 |
-
|
606 |
|
607 |
-
|
608 |
|
609 |
-
|
610 |
|
611 |
-
|
612 |
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
|
623 |
-
|
624 |
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
|
629 |
-
|
630 |
-
|
631 |
-
|
632 |
-
|
633 |
-
|
634 |
-
|
|
|
|
|
|
|
|
|
635 |
}
|
636 |
|
637 |
-
}else{ // if allowed all roles
|
638 |
-
$ultimatemember->access->allow_access = true;
|
639 |
}
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
}
|
644 |
|
645 |
|
646 |
-
|
647 |
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
652 |
-
|
653 |
-
} // end foreach
|
654 |
-
}
|
655 |
|
|
|
|
|
|
|
|
|
656 |
// post restriction
|
657 |
if ( isset( $args['custom_access_settings'] ) && $args['custom_access_settings'] == 1 ) {
|
658 |
|
571 |
|
572 |
}
|
573 |
|
574 |
+
if( isset( $post->ID ) ){
|
575 |
+
$post_type = get_post_type( $post->ID );
|
576 |
+
|
577 |
+
// post's category restriction
|
578 |
+
if ( $post_type != 'page' && isset( $args['custom_access_settings'] ) && $args['custom_access_settings'] == 0 ) {
|
579 |
+
|
580 |
+
$categories = get_the_category( $post->ID );
|
581 |
+
foreach( $categories as $cat ){
|
582 |
+
|
583 |
+
$opt = get_option("category_{$cat->term_id}");
|
584 |
+
|
585 |
+
if ( isset( $opt['_um_accessible'] ) ) {
|
586 |
+
switch( $opt['_um_accessible'] ) {
|
587 |
+
|
588 |
+
case 0: // Open to everyone
|
589 |
+
$ultimatemember->access->allow_access = true;
|
590 |
+
$ultimatemember->access->redirect_handler = false; // open to everyone
|
591 |
+
break;
|
592 |
|
593 |
+
case 1: // Logged out users only
|
594 |
+
|
595 |
+
if ( is_user_logged_in() ){
|
596 |
+
$redirect = ( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : site_url();
|
597 |
+
$redirect = $ultimatemember->access->set_referer( $redirect, "page_cat_1a_t{$cat->term_id}_pt{$post_type}" );
|
598 |
+
$ultimatemember->access->redirect_handler = $redirect;
|
599 |
+
$ultimatemember->access->allow_access = false;
|
600 |
+
}
|
601 |
|
602 |
+
if ( !is_user_logged_in() ){
|
603 |
+
$ultimatemember->access->allow_access = true;
|
604 |
+
}
|
605 |
|
606 |
+
break;
|
607 |
|
608 |
+
case 2: // Logged in users only
|
609 |
|
610 |
+
if ( ! is_user_logged_in() ){
|
611 |
|
612 |
+
$redirect = ( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : um_get_core_page('login');
|
613 |
|
614 |
+
$redirect = $ultimatemember->access->set_referer( $redirect, "page_cat_2a_t{$cat->term_id}_pt{$post_type}" );
|
615 |
+
$ultimatemember->access->redirect_handler = $redirect;
|
616 |
+
|
617 |
+
$ultimatemember->access->allow_access = false;
|
618 |
+
}
|
619 |
|
620 |
+
if ( is_user_logged_in() ){
|
621 |
+
|
622 |
+
if( isset( $opt['_um_roles'] ) && !empty( $opt['_um_roles'] ) ){
|
623 |
|
624 |
+
if ( in_array( um_user('role'), $opt['_um_roles'] ) ) {
|
625 |
|
626 |
+
$ultimatemember->access->allow_access = true;
|
627 |
+
|
628 |
+
}else{
|
629 |
|
630 |
+
$redirect = ( isset( $opt['_um_redirect'] ) && ! empty( $opt['_um_redirect'] ) ) ? $opt['_um_redirect'] : site_url();
|
631 |
+
$redirect = $ultimatemember->access->set_referer( $redirect, "page_cat_2b_t{$cat->term_id}_pt{$post_type}" );
|
632 |
+
$ultimatemember->access->redirect_handler = $redirect;
|
633 |
+
|
634 |
+
$ultimatemember->access->allow_access = false;
|
635 |
+
|
636 |
+
}
|
637 |
+
|
638 |
+
}else{ // if allowed all roles
|
639 |
+
$ultimatemember->access->allow_access = true;
|
640 |
}
|
641 |
|
|
|
|
|
642 |
}
|
643 |
+
|
644 |
+
}
|
|
|
|
|
645 |
|
646 |
|
647 |
+
} // end if isset( $opt['_um_accessible'] )
|
648 |
|
649 |
+
// if one of the categories has enabled restriction, apply its settings to the current post
|
650 |
+
if( $ultimatemember->access->allow_access == false ){
|
651 |
+
return;
|
652 |
+
}
|
|
|
|
|
|
|
653 |
|
654 |
+
} // end foreach
|
655 |
+
}
|
656 |
+
}
|
657 |
+
|
658 |
// post restriction
|
659 |
if ( isset( $args['custom_access_settings'] ) && $args['custom_access_settings'] == 1 ) {
|
660 |
|
core/um-actions-form.php
CHANGED
@@ -389,11 +389,13 @@
|
|
389 |
$args['user_id'] = um_get_requested_user();
|
390 |
}
|
391 |
|
|
|
|
|
392 |
if ( $args[$key] == '' && in_array( $key, array('user_email') ) ) {
|
393 |
$ultimatemember->form->add_error($key, __('You must provide your email','ultimatemember') );
|
394 |
-
} else if ( in_array( $mode, array('register') ) && email_exists
|
395 |
$ultimatemember->form->add_error($key, __('This email is already linked to an existing account','ultimatemember') );
|
396 |
-
} else if ( in_array( $mode, array('profile') ) && email_exists
|
397 |
$ultimatemember->form->add_error($key, __('This email is already linked to an existing account','ultimatemember') );
|
398 |
} else if ( !is_email( $args[$key] ) ) {
|
399 |
$ultimatemember->form->add_error($key, __('This is not a valid email','ultimatemember') );
|
389 |
$args['user_id'] = um_get_requested_user();
|
390 |
}
|
391 |
|
392 |
+
$email_exists = email_exists( $args[$key] );
|
393 |
+
|
394 |
if ( $args[$key] == '' && in_array( $key, array('user_email') ) ) {
|
395 |
$ultimatemember->form->add_error($key, __('You must provide your email','ultimatemember') );
|
396 |
+
} else if ( in_array( $mode, array('register') ) && $email_exists ) {
|
397 |
$ultimatemember->form->add_error($key, __('This email is already linked to an existing account','ultimatemember') );
|
398 |
+
} else if ( in_array( $mode, array('profile') ) && $email_exists && $email_exists != $args['user_id'] ) {
|
399 |
$ultimatemember->form->add_error($key, __('This email is already linked to an existing account','ultimatemember') );
|
400 |
} else if ( !is_email( $args[$key] ) ) {
|
401 |
$ultimatemember->form->add_error($key, __('This is not a valid email','ultimatemember') );
|
core/um-actions-password.php
CHANGED
@@ -156,8 +156,9 @@
|
|
156 |
function um_change_password_errors_hook( $args ) {
|
157 |
global $ultimatemember;
|
158 |
|
159 |
-
if ( $_POST[ $ultimatemember->honeypot ] != '' )
|
160 |
wp_die('Hello, spam bot!');
|
|
|
161 |
|
162 |
$form_timestamp = trim($_POST['timestamp']);
|
163 |
$live_timestamp = current_time( 'timestamp' );
|
@@ -168,7 +169,20 @@
|
|
168 |
if ( $live_timestamp - $form_timestamp < 3 && um_get_option('enable_timebot') == 1 ){
|
169 |
wp_die( __('Whoa, slow down! You\'re seeing this message because you tried to submit a form too fast and we think you might be a spam bot. If you are a real human being please wait a few seconds before submitting the form. Thanks!') );
|
170 |
}
|
171 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
172 |
|
173 |
if ( isset( $args['user_password'] ) && empty( $args['user_password'] ) ) {
|
174 |
$ultimatemember->form->add_error('user_password', __('You must enter a new password','ultimatemember') );
|
156 |
function um_change_password_errors_hook( $args ) {
|
157 |
global $ultimatemember;
|
158 |
|
159 |
+
if ( isset( $_POST[ $ultimatemember->honeypot ] ) && $_POST[ $ultimatemember->honeypot ] != '' ){
|
160 |
wp_die('Hello, spam bot!');
|
161 |
+
}
|
162 |
|
163 |
$form_timestamp = trim($_POST['timestamp']);
|
164 |
$live_timestamp = current_time( 'timestamp' );
|
169 |
if ( $live_timestamp - $form_timestamp < 3 && um_get_option('enable_timebot') == 1 ){
|
170 |
wp_die( __('Whoa, slow down! You\'re seeing this message because you tried to submit a form too fast and we think you might be a spam bot. If you are a real human being please wait a few seconds before submitting the form. Thanks!') );
|
171 |
}
|
172 |
+
|
173 |
+
$reset_pass_hash = '';
|
174 |
+
|
175 |
+
if( isset( $_REQUEST['act'] ) && $_REQUEST['act'] == 'reset_password' && um_is_core_page('password-reset') ){
|
176 |
+
$reset_pass_hash = get_user_meta( $args['user_id'], 'reset_pass_hash', true );
|
177 |
+
|
178 |
+
}
|
179 |
+
|
180 |
+
if( !is_user_logged_in() && isset( $args ) && ! um_is_core_page('password-reset') ||
|
181 |
+
is_user_logged_in() && isset( $args['user_id'] ) && $args['user_id'] != get_current_user_id() ||
|
182 |
+
!is_user_logged_in() && isset( $_REQUEST['hash'] ) && $reset_pass_hash != $_REQUEST['hash'] && um_is_core_page('password-reset')
|
183 |
+
){
|
184 |
+
wp_die( __( 'This is not possible for security reasons.','ultimatemember') );
|
185 |
+
}
|
186 |
|
187 |
if ( isset( $args['user_password'] ) && empty( $args['user_password'] ) ) {
|
188 |
$ultimatemember->form->add_error('user_password', __('You must enter a new password','ultimatemember') );
|
core/um-actions-register.php
CHANGED
@@ -231,10 +231,12 @@
|
|
231 |
}
|
232 |
|
233 |
if ( um_user( $status . '_action' ) == 'show_message' && um_user( $status . '_message' ) != '' ) {
|
234 |
-
|
235 |
-
$
|
236 |
-
$url
|
237 |
-
$url
|
|
|
|
|
238 |
|
239 |
exit( wp_redirect( $url ) );
|
240 |
}
|
231 |
}
|
232 |
|
233 |
if ( um_user( $status . '_action' ) == 'show_message' && um_user( $status . '_message' ) != '' ) {
|
234 |
+
|
235 |
+
$role_id = $ultimatemember->user->get_role_name( um_user('role'), true );
|
236 |
+
$url = $ultimatemember->permalinks->get_current_url();
|
237 |
+
$url = add_query_arg( 'message', esc_attr( $status ), $url );
|
238 |
+
$url = add_query_arg( 'um_role', esc_attr( $role_id ), $url );
|
239 |
+
$url = add_query_arg( 'um_form_id', esc_attr( $form_id ), $url );
|
240 |
|
241 |
exit( wp_redirect( $url ) );
|
242 |
}
|
core/um-actions-save-profile.php
CHANGED
@@ -10,7 +10,15 @@
|
|
10 |
|
11 |
// Sync display name changes
|
12 |
$option = um_get_option('display_name');
|
|
|
13 |
$user_id = $ultimatemember->user->id;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
switch ( $option ) {
|
15 |
default:
|
16 |
break;
|
@@ -39,10 +47,11 @@
|
|
39 |
|
40 |
if ( isset( $update_name ) ) {
|
41 |
|
42 |
-
$
|
|
|
43 |
|
44 |
if( is_wp_error( $return ) ) {
|
45 |
-
wp_die( $return->get_error_message() );
|
46 |
}
|
47 |
|
48 |
|
10 |
|
11 |
// Sync display name changes
|
12 |
$option = um_get_option('display_name');
|
13 |
+
|
14 |
$user_id = $ultimatemember->user->id;
|
15 |
+
|
16 |
+
if( ! isset( $user_id ) || empty( $user_id ) ){
|
17 |
+
$user = get_user_by( 'email', $changes['user_email'] );
|
18 |
+
um_fetch_user( $user->ID );
|
19 |
+
$user_id = $user->ID;
|
20 |
+
}
|
21 |
+
|
22 |
switch ( $option ) {
|
23 |
default:
|
24 |
break;
|
47 |
|
48 |
if ( isset( $update_name ) ) {
|
49 |
|
50 |
+
$arr_user = array( 'ID' => $user_id, 'display_name' => $update_name );
|
51 |
+
$return = wp_update_user( $arr_user );
|
52 |
|
53 |
if( is_wp_error( $return ) ) {
|
54 |
+
wp_die( '<pre>' . var_export( array( 'message' => $return->get_error_message(), 'dump' => $arr_user, 'changes' => $changes ), true ) . '</pre>' );
|
55 |
}
|
56 |
|
57 |
|
core/um-filters-arguments.php
CHANGED
@@ -29,12 +29,15 @@
|
|
29 |
global $ultimatemember;
|
30 |
|
31 |
if ($ultimatemember->shortcodes->message_mode == true) {
|
|
|
32 |
$args['template'] = 'message';
|
33 |
-
|
34 |
-
|
35 |
-
$ultimatemember->
|
|
|
|
|
|
|
36 |
|
37 |
-
um_reset_user();
|
38 |
}
|
39 |
|
40 |
foreach( $args as $k => $v ) {
|
29 |
global $ultimatemember;
|
30 |
|
31 |
if ($ultimatemember->shortcodes->message_mode == true) {
|
32 |
+
|
33 |
$args['template'] = 'message';
|
34 |
+
$role = esc_attr( $_REQUEST['um_role'] );
|
35 |
+
$role_slug = $ultimatemember->user->get_role_slug_by_id( $role );
|
36 |
+
$role = $ultimatemember->query->role_data( $role_slug );
|
37 |
+
$status = $role["status"];
|
38 |
+
$message = $role["{$status}_message"];
|
39 |
+
$ultimatemember->shortcodes->custom_message = $message;
|
40 |
|
|
|
41 |
}
|
42 |
|
43 |
foreach( $args as $k => $v ) {
|
core/um-form.php
CHANGED
@@ -114,18 +114,22 @@ class UM_Form {
|
|
114 |
|
115 |
$custom_field_roles = $this->custom_field_roles( $this->form_data['custom_fields'] );
|
116 |
|
117 |
-
|
|
|
118 |
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
|
127 |
-
|
128 |
-
|
|
|
|
|
|
|
129 |
|
130 |
}else if( isset( $this->post_form['mode'] ) && $this->post_form['mode'] == 'register' ) {
|
131 |
$role = $this->assigned_role( $this->form_id );
|
114 |
|
115 |
$custom_field_roles = $this->custom_field_roles( $this->form_data['custom_fields'] );
|
116 |
|
117 |
+
if( isset( $_POST['role'] ) ){
|
118 |
+
$role = $_POST['role'];
|
119 |
|
120 |
+
if( is_array( $_POST['role'] ) ){
|
121 |
+
$role = current( $_POST['role'] );
|
122 |
+
}
|
123 |
|
124 |
+
if ( isset( $custom_field_roles ) && is_array( $custom_field_roles ) && ! in_array( $role , $custom_field_roles ) ) {
|
125 |
+
wp_die( __( 'This is not possible for security reasons.','ultimatemember') );
|
126 |
+
}
|
127 |
|
128 |
+
$this->post_form['role'] = $role;
|
129 |
+
$this->post_form['submitted']['role'] = $role;
|
130 |
+
}
|
131 |
+
|
132 |
+
|
133 |
|
134 |
}else if( isset( $this->post_form['mode'] ) && $this->post_form['mode'] == 'register' ) {
|
135 |
$role = $this->assigned_role( $this->form_id );
|
core/um-user.php
CHANGED
@@ -704,6 +704,34 @@ class UM_User {
|
|
704 |
return $role_title;
|
705 |
}
|
706 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
707 |
/***
|
708 |
*** @Update one key in user meta
|
709 |
***/
|
704 |
return $role_title;
|
705 |
}
|
706 |
|
707 |
+
/**
|
708 |
+
* Get role slug by ID
|
709 |
+
* @param integer $id
|
710 |
+
* @return string
|
711 |
+
*/
|
712 |
+
function get_role_slug_by_id( $id ) {
|
713 |
+
global $wpdb, $ultimatemember;
|
714 |
+
|
715 |
+
|
716 |
+
$args = array(
|
717 |
+
'posts_per_page' => 1,
|
718 |
+
'post_type' => 'um_role',
|
719 |
+
'page_id' => $id,
|
720 |
+
'post_status' => array('publish'),
|
721 |
+
);
|
722 |
+
|
723 |
+
$roles = new WP_Query( $args );
|
724 |
+
$role_slug = '';
|
725 |
+
|
726 |
+
if ( $roles->have_posts() ) {
|
727 |
+
$role_slug = $roles->post->post_name;
|
728 |
+
}
|
729 |
+
|
730 |
+
wp_reset_query();
|
731 |
+
|
732 |
+
return $role_slug;
|
733 |
+
}
|
734 |
+
|
735 |
/***
|
736 |
*** @Update one key in user meta
|
737 |
***/
|
index.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
Plugin Name: Ultimate Member
|
4 |
Plugin URI: http://ultimatemember.com/
|
5 |
Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress
|
6 |
-
Version: 1.3.
|
7 |
Author: Ultimate Member
|
8 |
Author URI: http://ultimatemember.com/
|
9 |
Text Domain: ultimatemember
|
3 |
Plugin Name: Ultimate Member
|
4 |
Plugin URI: http://ultimatemember.com/
|
5 |
Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress
|
6 |
+
Version: 1.3.77
|
7 |
Author: Ultimate Member
|
8 |
Author URI: http://ultimatemember.com/
|
9 |
Text Domain: ultimatemember
|
readme.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
|
2 |
Author URI: https://ultimatemember.com/
|
3 |
Plugin URI: https://ultimatemember.com/
|
4 |
Contributors: ultimatemember, champsupertramp
|
@@ -7,7 +7,7 @@ Tags: access control, author, authors, author profile, comments, community, comm
|
|
7 |
Requires at least: 4.1
|
8 |
Tested up to: 4.6.1
|
9 |
|
10 |
-
Stable Tag: 1.3.
|
11 |
|
12 |
License: GNU Version 2 or Any Later Version
|
13 |
|
@@ -59,6 +59,7 @@ Ultimate Member has a range of extensions that allow you to extend the power of
|
|
59 |
* [myCRED](https://ultimatemember.com/extensions/mycred/) - With the myCRED extension you can integrate Ultimate Member with the popular myCRED points management plugin
|
60 |
* [Notices](https://ultimatemember.com/extensions/notices/) - Alert users to important information using conditional notices
|
61 |
* [Profile Completeness](https://ultimatemember.com/extensions/profile-completeness/) - Encourage or force users to complete their profiles with the profile completeness extension
|
|
|
62 |
|
63 |
= Free Extensions =
|
64 |
|
@@ -149,6 +150,35 @@ The plugin works with popular caching plugins by automatically excluding Ultimat
|
|
149 |
|
150 |
== Changelog ==
|
151 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
= 1.3.73: November 17, 2016 =
|
153 |
|
154 |
* Enhancements:
|
1 |
+
=== Ultimate Member ===
|
2 |
Author URI: https://ultimatemember.com/
|
3 |
Plugin URI: https://ultimatemember.com/
|
4 |
Contributors: ultimatemember, champsupertramp
|
7 |
Requires at least: 4.1
|
8 |
Tested up to: 4.6.1
|
9 |
|
10 |
+
Stable Tag: 1.3.76
|
11 |
|
12 |
License: GNU Version 2 or Any Later Version
|
13 |
|
59 |
* [myCRED](https://ultimatemember.com/extensions/mycred/) - With the myCRED extension you can integrate Ultimate Member with the popular myCRED points management plugin
|
60 |
* [Notices](https://ultimatemember.com/extensions/notices/) - Alert users to important information using conditional notices
|
61 |
* [Profile Completeness](https://ultimatemember.com/extensions/profile-completeness/) - Encourage or force users to complete their profiles with the profile completeness extension
|
62 |
+
* [Friends](https://ultimatemember.com/extensions/friends/) - Allows users to become friends by sending & accepting/rejecting friend requests
|
63 |
|
64 |
= Free Extensions =
|
65 |
|
150 |
|
151 |
== Changelog ==
|
152 |
|
153 |
+
= 1.3.77: November 30, 2016 =
|
154 |
+
|
155 |
+
* Bugfixes:
|
156 |
+
* Fix set and reset password validation.
|
157 |
+
* Remove notices.
|
158 |
+
|
159 |
+
= 1.3.76: November 30, 2016 =
|
160 |
+
|
161 |
+
* Bugfixes:
|
162 |
+
* Fix invalid security notice in set password.
|
163 |
+
|
164 |
+
= 1.3.75: November 29, 2016 =
|
165 |
+
|
166 |
+
* Bugfixes:
|
167 |
+
* Fix 'Invalid user ID' on profile update
|
168 |
+
|
169 |
+
= 1.3.74: November 29, 2016 =
|
170 |
+
|
171 |
+
* Enhancements:
|
172 |
+
* Improves clear users cache.
|
173 |
+
* Removes user id from redirect URL on registration process for pending review and email activation statuses.
|
174 |
+
|
175 |
+
* Bugfixes:
|
176 |
+
* Fix assigning of role on registration process
|
177 |
+
* Fix change email address in edit mode.
|
178 |
+
* Fix change password validation.
|
179 |
+
* Removes notices when role field is present in the profile form.
|
180 |
+
|
181 |
+
|
182 |
= 1.3.73: November 17, 2016 =
|
183 |
|
184 |
* Enhancements:
|