diff --git a/includes/class-functions.php b/includes/class-functions.php index 4fd75217..3a770725 100644 --- a/includes/class-functions.php +++ b/includes/class-functions.php @@ -391,5 +391,20 @@ if ( ! class_exists( 'UM_Functions' ) ) { } } + + /** + * Replace the first match in the string, alternative for the `str_replace()` function + * + * @param string $search + * @param string $replace + * @param string $subject + * + * @return string + */ + function str_replace_first( $search, $replace, $subject ) { + $search = '/' . preg_quote( $search, '/' ) . '/'; + return preg_replace( $search, $replace, $subject, 1 ); + } + } } diff --git a/includes/core/class-password.php b/includes/core/class-password.php index 9fecd952..b6e0605b 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -549,11 +549,11 @@ if ( ! class_exists( 'um\core\Password' ) ) { $max_length = ! empty( $max_length ) ? $max_length : 30; if ( mb_strlen( $args['user_password'] ) < $min_length ) { - UM()->form()->add_error( 'user_password', __( 'Your password must contain at least 8 characters', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_password', sprintf( __( 'Your password must contain at least %d characters', 'ultimate-member' ), $min_length ) ); } if ( mb_strlen( $args['user_password'] ) > $max_length ) { - UM()->form()->add_error( 'user_password', __( 'Your password must contain less than 30 characters', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_password', sprintf( __( 'Your password must contain less than %d characters', 'ultimate-member' ), $max_length ) ); } if ( ! UM()->validation()->strong_pass( $args['user_password'] ) ) { diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 00ef054c..6488f035 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -15,6 +15,14 @@ if ( ! class_exists( 'um\core\User' ) ) { class User { + /** + * Data that we will set before the update profile to compare it after update + * + * @var null + */ + public $previous_data = null; + + /** * User constructor. */ diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 2417b560..93126416 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -88,11 +88,11 @@ function um_submit_account_errors_hook( $args ) { $max_length = ! empty( $max_length ) ? $max_length : 30; if ( mb_strlen( $args['user_password'] ) < $min_length ) { - UM()->form()->add_error( 'user_password', __( 'Your password must contain at least 8 characters', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_password', sprintf( __( 'Your password must contain at least %d characters', 'ultimate-member' ), $min_length ) ); } if ( mb_strlen( $args['user_password'] ) > $max_length ) { - UM()->form()->add_error( 'user_password', __( 'Your password must contain less than 30 characters', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_password', sprintf( __( 'Your password must contain less than %d characters', 'ultimate-member' ), $max_length ) ); } if ( ! UM()->validation()->strong_pass( $args['user_password'] ) ) { @@ -375,8 +375,24 @@ function um_submit_account_details( $args ) { */ do_action( 'um_account_pre_update_profile', $changes, $user_id ); - UM()->user()->update_profile( $changes ); + if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) || isset( $changes['nickname'] ) ) { + $user = get_userdata( $user_id ); + if ( ! empty( $user ) && ! is_wp_error( $user ) ) { + UM()->user()->previous_data['display_name'] = $user->display_name; + if ( isset( $changes['first_name'] ) ) { + UM()->user()->previous_data['first_name'] = $user->first_name; + } + if ( isset( $changes['last_name'] ) ) { + UM()->user()->previous_data['last_name'] = $user->last_name; + } + if ( isset( $changes['nickname'] ) ) { + UM()->user()->previous_data['nickname'] = $user->nickname; + } + } + } + + UM()->user()->update_profile( $changes ); if ( UM()->account()->is_secure_enabled() ) { update_user_meta( $user_id, 'um_account_secure_fields', array() ); @@ -502,7 +518,7 @@ add_action( 'um_before_account_notifications', 'um_before_account_notifications' * @param array $changes An array of fields values. */ function um_after_user_account_updated_permalink( $user_id, $changes ) { - if ( isset( $changes['first_name'] ) && isset( $changes['last_name'] ) ) { + if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) ) { do_action( 'um_update_profile_full_name', $user_id, $changes ); } } diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 92ccf3e5..25bb9b18 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -462,8 +462,27 @@ function um_user_edit_profile( $args ) { */ $to_update = apply_filters( 'um_user_pre_updating_profile_array', $to_update, $user_id ); - if ( is_array( $to_update ) ) { + + if ( isset( $to_update['first_name'] ) || isset( $to_update['last_name'] ) || isset( $to_update['nickname'] ) ) { + $user = get_userdata( $user_id ); + if ( ! empty( $user ) && ! is_wp_error( $user ) ) { + UM()->user()->previous_data['display_name'] = $user->display_name; + + if ( isset( $to_update['first_name'] ) ) { + UM()->user()->previous_data['first_name'] = $user->first_name; + } + + if ( isset( $to_update['last_name'] ) ) { + UM()->user()->previous_data['last_name'] = $user->last_name; + } + + if ( isset( $to_update['nickname'] ) ) { + UM()->user()->previous_data['nickname'] = $user->nickname; + } + } + } + UM()->user()->update_profile( $to_update ); /** * UM hook diff --git a/includes/core/um-actions-save-profile.php b/includes/core/um-actions-save-profile.php index 2a1a6232..fb2775d6 100644 --- a/includes/core/um-actions-save-profile.php +++ b/includes/core/um-actions-save-profile.php @@ -40,12 +40,48 @@ function um_update_profile_full_name( $user_id, $changes ) { break; case 'nickname': $update_name = get_user_meta( $user_id, 'nickname', true ); + break; + case 'default': + $user = get_userdata( $user_id ); + + if ( ! empty( $user ) && ! is_wp_error( $user ) ) { + if ( ! empty( UM()->user()->previous_data['display_name'] ) ) { + if ( isset( UM()->user()->previous_data['first_name'] ) ) { + $fname = get_user_meta( $user_id, 'first_name', true ); + $update_name = UM()->str_replace_first( UM()->user()->previous_data['first_name'], $fname, UM()->user()->previous_data['display_name'] ); + } + + if ( isset( UM()->user()->previous_data['last_name'] ) ) { + $lname = get_user_meta( $user_id, 'last_name', true ); + if ( isset( $update_name ) ) { + $update_name = UM()->str_replace_first( UM()->user()->previous_data['last_name'], $lname, $update_name ); + } else { + $update_name = UM()->str_replace_first( UM()->user()->previous_data['last_name'], $lname, UM()->user()->previous_data['display_name'] ); + } + } + + if ( isset( UM()->user()->previous_data['nickname'] ) ) { + $nickname = get_user_meta( $user_id, 'nickname', true ); + if ( isset( $update_name ) ) { + $update_name = UM()->str_replace_first( UM()->user()->previous_data['nickname'], $nickname, $update_name ); + } else { + $update_name = UM()->str_replace_first( UM()->user()->previous_data['nickname'], $nickname, UM()->user()->previous_data['display_name'] ); + } + } + + // unset if the display name is the same + if ( isset( $update_name ) && $update_name === UM()->user()->previous_data['display_name'] ) { + unset( $update_name ); + } + } + } + break; } if ( isset( $update_name ) ) { - $arr_user = array( 'ID' => $user_id, 'display_name' => $update_name ); + $arr_user = array( 'ID' => $user_id, 'display_name' => $update_name ); $return = wp_update_user( $arr_user ); if ( is_wp_error( $return ) ) { @@ -54,7 +90,7 @@ function um_update_profile_full_name( $user_id, $changes ) { } - if ( isset( $changes['first_name'] ) && isset( $changes['last_name'] ) ) { + if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) ) { $user = get_userdata( $user_id ); if ( ! empty( $user ) && ! is_wp_error( $user ) ) { $full_name = $user->display_name; @@ -67,4 +103,4 @@ function um_update_profile_full_name( $user_id, $changes ) { // regenerate slug UM()->user()->generate_profile_slug( $user_id ); } -add_action( 'um_update_profile_full_name', 'um_update_profile_full_name', 10, 2 ); \ No newline at end of file +add_action( 'um_update_profile_full_name', 'um_update_profile_full_name', 10, 2 );