diff --git a/addons/bp_avatar_transfer.php b/addons/bp_avatar_transfer.php index d195545a..6a690702 100644 --- a/addons/bp_avatar_transfer.php +++ b/addons/bp_avatar_transfer.php @@ -11,10 +11,7 @@ class UM_ADDON_bp_avatar_transfer { add_action('um_admin_addon_hook', array(&$this, 'um_admin_addon_hook') ); } - - /*** - *** @extends the admin menu - ***/ + function admin_menu() { global $ultimatemember; @@ -22,10 +19,7 @@ class UM_ADDON_bp_avatar_transfer { add_submenu_page('ultimatemember', $this->addon[0], $this->addon[0], 'manage_options', 'bp_avatar_transfer', array(&$this, 'content') ); } - - /*** - *** @Runs a custom hook - ***/ + function um_admin_addon_hook( $hook ) { global $ultimatemember; switch( $hook ) { @@ -63,10 +57,7 @@ class UM_ADDON_bp_avatar_transfer { break; } } - - /*** - *** @Change admin content - ***/ + function admin_init() { if ( isset( $_REQUEST['um-addon-hook'] ) ) { $hook = $_REQUEST['um-addon-hook']; diff --git a/addons/multi_language.php b/addons/multi_language.php new file mode 100644 index 00000000..4ebc2a5e --- /dev/null +++ b/addons/multi_language.php @@ -0,0 +1,164 @@ + + + + + addon = $ultimatemember->addons['multi_language']; + add_submenu_page('ultimatemember', $this->addon[0], $this->addon[0], 'manage_options', 'multi_language', array(&$this, 'content') ); + + } + + function admin_init() { + + if ( isset( $_POST['multi-language'] ) && current_user_can('manage_options') ) { + + $sync = ''; + $lang = $_POST['lang']; + $form = $_POST['form']; + + $array = array('register','login','profile'); + + foreach( $array as $arrays ) { + foreach( $lang[$arrays] as $k => $v ) { + if ( $v ) { + $sync[$arrays][$v] = $form[$arrays][$k]; + } + } + } + + if ( isset( $sync ) ) { + update_option('um_multi_language', $sync ); + } + } + + } + + function content() { + global $ultimatemember; + + $this->process_link = add_query_arg('um-addon-hook','multi_language'); + $sync = get_option('um_multi_language'); + + ?> + +
@@ -79,6 +80,16 @@
+ ++ + + + + + +
+' . $emo .'' . sprintf(__('Your profile is looking a little empty. Why not add some information!','ultimatemember'), add_query_arg('um_action','edit') ) . '
'; + $output .= '' . $emo .'' . sprintf(__('Your profile is looking a little empty. Why not add some information!','ultimatemember'), um_edit_profile_url() ) . '
'; } else { $output .= ''. $emo . '' . __('This user has not added any information to their profile yet.','ultimatemember') . '
'; } diff --git a/core/um-filters-arguments.php b/core/um-filters-arguments.php index 1546424d..4301f3c7 100644 --- a/core/um-filters-arguments.php +++ b/core/um-filters-arguments.php @@ -9,6 +9,10 @@ if ( is_user_logged_in() && isset( $args['mode'] ) && $args['mode'] == 'login' ) { + if ( get_current_user_id() != um_user('ID' ) ) { + um_fetch_user( get_current_user_id() ); + } + $args['template'] = 'logout'; } diff --git a/core/um-filters-members.php b/core/um-filters-members.php index af4b8877..d358ad00 100644 --- a/core/um-filters-members.php +++ b/core/um-filters-members.php @@ -66,6 +66,8 @@ foreach( $query as $field => $value ) { + if(in_array($field, array('members_page'))) continue; + if ( in_array( $field, array('gender') ) ) { $operator = '='; } else { @@ -175,6 +177,8 @@ if ( isset( $order ) ) { $query_args['order'] = $order; } + + $query_args = apply_filters('um_modify_sortby_parameter', $query_args, $sortby); } diff --git a/core/um-form.php b/core/um-form.php index bb36e001..ae0d44ac 100644 --- a/core/um-form.php +++ b/core/um-form.php @@ -12,6 +12,8 @@ class UM_Form { $this->errors = null; + $this->processing = null; + add_action('init', array(&$this, 'form_init'), 2); add_action('init', array(&$this, 'field_declare'), 10); @@ -107,6 +109,8 @@ class UM_Form { $this->form_suffix = '-' . $form['form_id']; + $this->processing = $form['form_id']; + foreach($form as $key => $value){ if (strstr($key, $this->form_suffix) ) { $a_key = str_replace( $this->form_suffix, '', $key); diff --git a/core/um-mail.php b/core/um-mail.php index 5eac2b87..175ccd3b 100644 --- a/core/um-mail.php +++ b/core/um-mail.php @@ -6,6 +6,8 @@ class UM_Mail { add_filter('mandrill_nl2br', array(&$this, 'mandrill_nl2br') ); + $this->force_plain_text = ''; + } /*** @@ -25,14 +27,23 @@ class UM_Mail { /*** *** @check If template exists ***/ - function email_template( $template ) { + function email_template( $template, $args = array() ) { if ( file_exists( get_stylesheet_directory() . '/ultimate-member/templates/email/' . $template . '.html' ) ) { return get_stylesheet_directory() . '/ultimate-member/templates/email/' . $template . '.html'; } - if ( file_exists( um_path . 'templates/email/' . $template . '.html' ) ) { - return um_url . 'templates/email/' . $template . '.html'; + + if ( isset( $args['path'] ) ) { + $path = $args['path']; + } else { + $path = um_path . 'templates/email/'; } + + if ( file_exists( $path . $template . '.html' ) ) { + return $path . $template . '.html'; + } + return false; + } /*** @@ -48,38 +59,49 @@ class UM_Mail { $this->headers = 'From: '. um_get_option('mail_from') .' <'. um_get_option('mail_from_addr') .'>' . "\r\n"; $this->subject = um_get_option( $template . '_sub' ); - $this->subject = $this->convert_tags( $this->subject ); + $this->subject = $this->convert_tags( $this->subject, $args ); + + if ( isset( $args['admin'] ) || isset( $args['plain_text'] ) ) { + $this->force_plain_text = 'forced'; + } - // HTML e-mail - if ( um_get_option('email_html') && $this->email_template( $template ) ) { - $this->message = file_get_contents( $this->email_template( $template ) ); + // HTML e-mail or text + if ( um_get_option('email_html') && $this->email_template( $template, $args ) ) { + add_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); + $this->message = file_get_contents( $this->email_template( $template, $args ) ); } else { $this->message = um_get_option( $template ); } // Convert tags in body - $this->message = $this->convert_tags( $this->message ); + $this->message = $this->convert_tags( $this->message, $args ); // Send mail - add_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); wp_mail( $email, $this->subject, $this->message, $this->headers, $this->attachments ); remove_filter( 'wp_mail_content_type', array(&$this, 'set_content_type') ); + // reset globals + $this->force_plain_text = ''; + } /*** *** @maybe sending HTML emails ***/ function set_content_type( $content_type ) { - if ( um_get_option('email_html') ) - return 'text/html'; + + if ( $this->force_plain_text == 'forced' ) return 'text/plain'; + + if ( um_get_option('email_html') ) return 'text/html'; + return 'text/plain'; + } /*** *** @convert template tags in email template ***/ - function convert_tags( $content ) { + function convert_tags( $content, $args = array() ) { $search = array( '{display_name}', @@ -126,6 +148,11 @@ class UM_Mail { $replace = apply_filters('um_template_tags_replaces_hook', $replace); $content = str_replace($search, $replace, $content); + + if ( isset( $args['tags'] ) && isset( $args['tags_replace'] ) ) { + $content = str_replace($args['tags'], $args['tags_replace'], $content); + } + return $content; } diff --git a/core/um-members.php b/core/um-members.php index 071a34c2..41045ccc 100644 --- a/core/um-members.php +++ b/core/um-members.php @@ -73,9 +73,13 @@ class UM_Members { $fields = $ultimatemember->builtin->all_user_fields; - $attrs = $fields[$filter]; + if ( isset( $fields[$filter] ) ) { + $attrs = $fields[$filter]; + } else { + $attrs = apply_filters("um_custom_search_field_{$filter}", array() ); + } - if ( $ultimatemember->builtin->is_dropdown_field( $filter ) ) { + if ( $ultimatemember->builtin->is_dropdown_field( $filter, $attrs ) ) { $type = 'select'; } else { $type = 'text'; @@ -99,6 +103,9 @@ class UM_Members { if ( strstr($filter, 'role_') ) $opt = $k; + + if ( isset( $attrs['custom'] ) ) + $opt = $k; ?> diff --git a/core/um-permalinks.php b/core/um-permalinks.php index a992660d..fce53ebc 100644 --- a/core/um-permalinks.php +++ b/core/um-permalinks.php @@ -59,21 +59,22 @@ class UM_Permalinks { ***/ function activate_account_via_email_link(){ global $ultimatemember; - + if ( isset($_REQUEST['act']) && $_REQUEST['act'] == 'activate_via_email' && isset($_REQUEST['hash']) && strlen($_REQUEST['hash']) == 40 && isset($_REQUEST['user_id']) && is_numeric($_REQUEST['user_id']) ) { // valid token um_fetch_user( $_REQUEST['user_id'] ); - + if ( um_user('account_status') != 'awaiting_email_confirmation' ) wp_die('The activation link you used is invalid or has expired.'); if ( $_REQUEST['hash'] != um_user('account_secret_hash') ) wp_die('The secret key provided does not match this one for the user.'); $ultimatemember->user->approve(); + $redirect = ( um_user('url_email_activate') ) ? um_user('url_email_activate') : um_get_core_page('login', 'account_active'); um_reset_user(); - - exit( wp_redirect( um_get_core_page('login', 'account_active') ) ); + + exit( wp_redirect( $redirect ) ); } @@ -128,7 +129,7 @@ class UM_Permalinks { ***/ function profile_url() { global $ultimatemember; - + $profile_url = $this->core['user']; $profile_url = get_permalink($profile_url); diff --git a/core/um-query.php b/core/um-query.php index 893133a0..a008e5e5 100644 --- a/core/um-query.php +++ b/core/um-query.php @@ -8,6 +8,26 @@ class UM_Query { } + /*** + *** @get all forms + ***/ + function forms() { + + $args = array( + 'post_type' => 'um_form', + 'posts_per_page' => 200, + 'post_status' => array('publish') + ); + + $query = new WP_Query( $args ); + foreach( $query->posts as $post ) { + setup_postdata( $post ); + $results[ $post->ID ] = $post->post_title; + } + return $results; + + } + /*** *** @get all post types ***/ @@ -24,18 +44,21 @@ class UM_Query { function make( $args ) { $defaults = array( - 'post_type' => 'post' + 'post_type' => 'post', + 'post_status' => array('publish') ); $args = wp_parse_args( $args, $defaults ); if ( isset( $args['post__in'] ) && empty( $args['post__in'] ) ) return false; - + extract( $args ); if ( $post_type == 'comment' ) { // comments unset( $args['post_type'] ); + unset( $args['post_status'] ); + $comments = get_comments($args); return $comments; @@ -183,11 +206,6 @@ class UM_Query { ***/ function role_data( $role_slug ) { global $wpdb, $ultimatemember; - - // get cache - if ( $ultimatemember->cache->role_data( $role_slug ) ) { - return $ultimatemember->cache->role_data( $role_slug ); - } if ($role_slug == 'admin' || $role_slug == 'member'){ $try = $this->find_post_id('um_role','_um_core',$role_slug); @@ -217,9 +235,6 @@ class UM_Query { $array = $ultimatemember->setup->get_initial_permissions( $role_slug ); } - - // set cache - $ultimatemember->cache->set_role_data( $role_slug, $array ); return $array; } diff --git a/core/um-short-functions.php b/core/um-short-functions.php index 044b52de..f77e27df 100644 --- a/core/um-short-functions.php +++ b/core/um-short-functions.php @@ -278,7 +278,7 @@ function um_profile_id() { ***/ function um_is_core_page( $page ) { global $post, $ultimatemember; - if ( isset($post->ID) && $post->ID == $ultimatemember->permalinks->core[ $page ] ) + if ( isset($post->ID) && isset( $ultimatemember->permalinks->core[ $page ] ) && $post->ID == $ultimatemember->permalinks->core[ $page ] ) return true; return false; } @@ -321,7 +321,7 @@ function um_profile_id() { global $ultimatemember; if ( isset($_REQUEST['um_search']) ) { $query = $ultimatemember->permalinks->get_query_array(); - if ( in_array( $val, $query ) ) + if ( isset( $query[$filter] ) && $val == $query[$filter] ) echo 'selected="selected"'; } echo ''; @@ -472,19 +472,6 @@ function um_reset_user() { return false; } - /*** - *** @Returns profile edit link - ***/ - function um_edit_my_profile_uri() { - global $ultimatemember; - $url = $ultimatemember->permalinks->get_current_url( get_option('permalink_structure') ); - $url = remove_query_arg('profiletab', $url); - $url = remove_query_arg('subnav', $url); - $url = add_query_arg('profiletab', 'main', $url); - $url = add_query_arg('um_action', 'edit', $url); - return $url; - } - /*** *** @remove edit profile args from url ***/ @@ -605,7 +592,9 @@ function um_reset_user() { $role = get_user_meta( $user_id, 'role', true ); $permissions = $ultimatemember->query->role_data( $role ); $permissions = apply_filters('um_user_permissions_filter', $permissions, $user_id); - if ( $permissions[ $permission ] == 1 ) + if ( isset( $permissions[ $permission ] ) && is_serialized( $permissions[ $permission ] ) ) + return unserialize( $permissions[ $permission ] ); + if ( isset( $permissions[ $permission ] ) && $permissions[ $permission ] == 1 ) return true; return false; } @@ -653,6 +642,18 @@ function um_reset_user() { return $return; } + /*** + *** @Returns the edit profile link + ***/ + function um_edit_profile_url(){ + global $ultimatemember; + $url = remove_query_arg('profiletab'); + $url = remove_query_arg('subnav', $url); + $url = add_query_arg('profiletab', 'main',$url); + $url = add_query_arg('um_action','edit', $url); + return $url; + } + /*** *** @checks if user can edit his profile ***/ @@ -823,6 +824,14 @@ function um_fetch_user( $user_id ) { return $uri; } + /*** + *** @get avatar URL instead of image + ***/ + function um_get_avatar_url($get_avatar){ + preg_match('/src="(.*?)"/i', $get_avatar, $matches); + return $matches[1]; + } + /*** *** @get avatar uri ***/ diff --git a/core/um-shortcodes.php b/core/um-shortcodes.php index 7322bbb0..3513391b 100644 --- a/core/um-shortcodes.php +++ b/core/um-shortcodes.php @@ -21,6 +21,8 @@ class UM_Shortcodes { global $ultimatemember; $array = $ultimatemember->permalinks->core; + if ( !$array ) return $classes; + foreach( $array as $slug => $info ) { if ( um_is_core_page( $slug ) ) { $classes[] = 'um-page-' . $slug; @@ -104,7 +106,7 @@ class UM_Shortcodes { $defaults = array(); $args = wp_parse_args( $args, $defaults ); - + // when to not continue $this->form_id = (isset($args['form_id'])) ? $args['form_id'] : null; if (!$this->form_id) return; @@ -113,6 +115,9 @@ class UM_Shortcodes { // get data into one global array $post_data = $ultimatemember->query->post_data( $this->form_id ); + + $args = apply_filters('um_pre_args_setup', $post_data ); + if ( !isset( $args['template'] ) ) $args['template'] = ''; if ( isset( $post_data['template'] ) && $post_data['template'] != $args['template']) $args['template'] = $post_data['template']; if ( !$this->template_exists( $args['template'] ) ) $args['template'] = $post_data['mode']; @@ -146,9 +151,11 @@ class UM_Shortcodes { $this->dynamic_css( $args ); - if ( um_get_requested_user() ) { + if ( um_get_requested_user() || $mode == 'logout' ) { um_reset_user(); } + + do_action('um_after_everything_output'); $output = ob_get_contents(); ob_end_clean(); @@ -286,6 +293,7 @@ class UM_Shortcodes { '{last_name}', '{display_name}', '{user_avatar_small}', + '{username}', ); $pattern_array = apply_filters('um_allowed_user_tags_patterns', $pattern_array); @@ -304,6 +312,10 @@ class UM_Shortcodes { $value = um_user( $usermeta ); } + if ( $usermeta == 'username' ) { + $value = um_user('user_login'); + } + $value = apply_filters("um_profile_tag_hook__{$usermeta}", $value, um_user('ID') ); if ( $value ) { diff --git a/core/um-tracking.php b/core/um-tracking.php index 32ee3bdb..12f98fdf 100644 --- a/core/um-tracking.php +++ b/core/um-tracking.php @@ -16,9 +16,8 @@ class UM_Tracking { *** @setup info array ***/ private function setup_data() { - global $ultimatemember; - + $data = array(); // Retrieve current theme info @@ -33,16 +32,10 @@ class UM_Tracking { } $data['url'] = home_url(); - $data['theme'] = $theme; $data['theme_version'] = $theme_ver; - $data['wp_version'] = get_bloginfo( 'version' ); - $data['version'] = ultimatemember_version; - - $result = count_users(); - $data['users_count'] = $result['total_users']; // Retrieve current plugin information if( ! function_exists( 'get_plugins' ) ) { @@ -61,15 +54,14 @@ class UM_Tracking { $data['active_plugins'] = $active_plugins; $data['inactive_plugins'] = $plugins; - $data['language'] = get_bloginfo('language'); - $data['multisite'] = ( is_multisite() ) ? 1 : 0; if ( !get_option('__ultimatemember_sitekey') ) { $ultimatemember->setup->install_basics(); } + $data['email'] = get_option('admin_email'); $data['unique_sitekey'] = get_option('__ultimatemember_sitekey'); $this->data = $data; @@ -107,6 +99,12 @@ class UM_Tracking { $this->setup_data(); + if ( !get_option('__ultimatemember_coupon_sent') ) { + $this->data['send_discount'] = 1; + } else { + $this->data['send_discount'] = 0; + } + $request = wp_remote_post( 'https://ultimatemember.com/?um_action=checkin', array( 'method' => 'POST', 'timeout' => 20, @@ -118,6 +116,7 @@ class UM_Tracking { ) ); update_option( 'um_tracking_last_send', time() ); + update_option( '__ultimatemember_coupon_sent', 1 ); } /*** @@ -145,7 +144,7 @@ class UM_Tracking { echo ''; - echo __( 'Help us improve Ultimate Member’s compatibility with other plugins and themes by allowing us to track non-sensitive data on your site. Click here to see what data we track.', 'ultimatemember' ); + echo __( 'Allow Ultimate Member to track plugin usage? Opt-in to tracking and our newsletter and we will immediately e-mail you a 20% discount which you can use on any of our extensions. No sensitive data is tracked.', 'ultimatemember' ); echo '
'; diff --git a/core/um-user.php b/core/um-user.php index 4b198d23..fdabe435 100644 --- a/core/um-user.php +++ b/core/um-user.php @@ -173,6 +173,25 @@ class UM_User { $this->set(0, $clean); } + /*** + *** @Security check for roles + ***/ + function is_secure_role( $user_id, $role ) { + + if ( is_admin() ) return; + + if ( $role == 'admin' ) { + $this->delete( false ); + wp_die( __('This is not allowed for security reasons.','ultimatemember') ); + } + + if ( um_get_option('advanced_denied_roles') && strstr( um_get_option('advanced_denied_roles'), $role ) ) { + $this->delete( false ); + wp_die( __('This is not allowed for security reasons.','ultimatemember') ); + } + + } + /*** *** @Clean user profile ***/ @@ -219,6 +238,15 @@ class UM_User { *** @Set user's registration details ***/ function set_registration_details( $submitted ) { + + if ( isset( $submitted['user_pass'] ) ) { + unset( $submitted['user_pass'] ); + } + + if ( isset( $submitted['user_password'] ) ) { + unset( $submitted['user_password'] ); + } + update_user_meta( $this->id, 'submitted', $submitted ); } @@ -259,6 +287,8 @@ class UM_User { do_action('um_before_user_role_is_changed'); + do_action('um_member_role_upgrade', $role, $this->profile['role'] ); + $this->profile['role'] = $role; $this->update_usermeta_info('role'); @@ -453,6 +483,7 @@ class UM_User { if ( $send_mail ) { $ultimatemember->mail->send( um_user('user_email'), 'deletion_email' ); + $ultimatemember->mail->send( um_admin_email(), 'notification_deletion', array('admin' => true ) ); } $ultimatemember->files->remove_dir( um_user_uploads_dir() ); diff --git a/core/um-validation.php b/core/um-validation.php index 623a661f..a16cebcd 100644 --- a/core/um-validation.php +++ b/core/um-validation.php @@ -5,7 +5,6 @@ class UM_Validation { function __construct() { $this->regex_safe = '/\A[\w\-\.]+\z/'; - $this->regex_safe_email = '/\A[\w\-\.\@]+\z/'; $this->regex_phone_number = '/\A[\d\-\.\+\(\)\ ]+\z/'; } @@ -54,8 +53,8 @@ class UM_Validation { *** @space, dash, underscore ***/ function safe_username( $string ) { - if ( is_email( $string ) && !preg_match( $this->regex_safe_email, $string ) ) - return false; + if ( is_email( $string ) ) + return true; if ( !is_email( $string) && !preg_match( $this->regex_safe, $string ) ) return false; return true; diff --git a/index.php b/index.php index 5dbf3946..229fd96d 100644 --- a/index.php +++ b/index.php @@ -3,7 +3,7 @@ Plugin Name: Ultimate Member Plugin URI: http://ultimatemember.com/ Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress -Version: 1.0.89 +Version: 1.1.6 Author: Ultimate Member Author URI: http://ultimatemember.com/ */ diff --git a/readme.txt b/readme.txt index 2ac40aee..fc2e60b4 100644 --- a/readme.txt +++ b/readme.txt @@ -3,11 +3,11 @@ Author URI: https://ultimatemember.com/ Plugin URI: https://ultimatemember.com/ Contributors: ultimatemember Donate link: -Tags: access control, author, authors, author profile, comments, community, communities, conditional fields, conditional logic, conditional menus, content protection, custom fields, file uploads, form builder, front-end login, front-end registration, hide wp-admin, login, login page, logged-in users, mandrill, member, members, membership, member directory, profile, profiles, profile builder, registration, restriction, restrict content, role creation, role menus, search filters, sign in, sign up, social network, star ratings, toolbar, user, users, user fields, user profiles, user roles +Tags: access control, author, authors, author profile, comments, community, communities, conditional fields, conditional logic, conditional menus, content protection, custom fields, file uploads, form builder, front-end login, front-end registration, hide wp-admin, login, login page, logged-in users, mandrill, member, members, membership, member directory, profile, profiles, profile builder, registration, restriction, restrict content, role creation, role menus, search filters, sign in, sign up, social network, star ratings, toolbar, user, users, user fields, user profile, user-profile, user profiles, user roles Requires at least: 4.1 Tested up to: 4.1.1 -Stable Tag: 1.0.89 +Stable Tag: 1.1.6 License: GNU Version 2 or Any Later Version @@ -41,14 +41,17 @@ Features of the plugin include: * Developer friendly with dozens of actions and filters * Multi-site compatibility * Mandrill compatibility +* Multi language support **Paid Extensions** You can extend the power of Ultimate Member with one of our premium extensions: +* [Real-time Notifications](https://ultimatemember.com/extensions/real-time-notifications/) * [Social Login](https://ultimatemember.com/extensions/social-login/) * [bbPress](https://ultimatemember.com/extensions/bbpress/) * [MailChimp](https://ultimatemember.com/extensions/mailchimp/) +* [User Reviews](https://ultimatemember.com/extensions/user-reviews/) * [myCRED](https://ultimatemember.com/extensions/mycred/) * [Notices](https://ultimatemember.com/extensions/notices/) @@ -145,6 +148,7 @@ Ultimate Member has been translated into the following languages: * Suomi * Polski * Türkçe +* العربية == Installation == @@ -203,6 +207,88 @@ The plugin works with popular caching plugins by automatically excluding Ultimat == Changelog == += 1.1.6: April 7, 2015 = + +* Fixed: major bug with datepicker (Update recommended) + += 1.1.5: April 4, 2015 = + +* New: new action hook that runs when user role is changed um_member_role_upgrade +* Fixed: bug/compatibility issue with caching UM roles data +* Fixed: bug with changing role settings/permissions +* Fixed: bug with setting e-mail activation redirect URL + += 1.1.4: April 2, 2015 = + +* Fixed: Major bug with dropdown and date fields (Update recommended) +* Fixed: hard-coded translation issues + += 1.1.3: April 1, 2015 = + +* New: added option to manage if access control widgets can be edited by admins only +* Tweak: update to last security patch - deletes user who try to get unauthorized access + += 1.1.2: March 30, 2015 = + +* Fixed: Important security patch - please update +* Fixed: conflict with The Events Calendar plugin +* Fixed: bug with edit profile link + += 1.1.1: March 29, 2015 = + +* Fixed: bug where you user could use an already existing e-mail in account page +* Fixed: bug with special characaters in username +* Fixed: bug with showing draft posts in user profile + += 1.1.0: March 27, 2015 = + +* New: added multi language support to assign different languages to different forms (beta feature) +* New: added RTL support (beta, still partial) +* New: added a dashboard widget to view latest blog posts from the plugin +* Tweak: changed manage_options permission to edit_users on some admin actions +* Fixed: corrected all active color references in the css +* Fixed: bug with user_row_actions filter +* Fixed: do not store user_pass in submitted metakey during registration + += 1.0.96: March 25, 2015 = + +* New: Added Arabic language (ar) support +* Fixed: Date fields not working in Safari +* Fixed: issue with HTML e-mails +* Fixed: issue with showing sidebar logout widget on bbpress forums + += 1.0.95: March 24, 2015 = + +* Tweak: added more hooks to mail function to allow for sending custom e-mails +* Fixed: issue with content lock settings in backend appearing for non-admins +* Fixed: issue with form errors handling + += 1.0.94: March 23, 2015 = + +* Fixed: bug with member directory search +* Fixed: bug with custom role homepage + += 1.0.93: March 22, 2015 = + +* Fixed: bug with showing register and login forms on same page + += 1.0.92: March 20, 2015 = + +* New: added option to customize redirection URL after e-mail activation +* Fixed: issue with hardcoded ajax/upload URLs - they are now localized +* Fixed: issue with admin notification for a deleted account +* Fixed: admin notifications are in plain text format + += 1.0.91: March 20, 2015 = + +* Tweak: featured image in user posts goes to post link +* Fixed: solved a bug with e-mail validation + += 1.0.90: March 19, 2015 = + +* Tweak: minor admin css changes +* Tweak: error message for frontend upload with theme/plugin conflicts + = 1.0.89: March 18, 2015 = * Tweak: Major Performance Improvements (beta) diff --git a/templates/account.php b/templates/account.php index 89fec5c1..fd55a93c 100644 --- a/templates/account.php +++ b/templates/account.php @@ -56,6 +56,8 @@