From 9df3393e6ad41650cbcbd9378a5a5e3308e95e26 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Mon, 4 Dec 2023 14:46:17 +0200 Subject: [PATCH 01/97] - change shema for person --- includes/core/um-actions-profile.php | 43 ++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 49e58869..78407f4e 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -644,7 +644,7 @@ function um_profile_dynamic_meta_desc() { $user_id = um_get_requested_user(); - if ( $user_id !== um_user('ID') ) { + if ( um_user( 'ID' ) !== $user_id) { um_fetch_user( $user_id ); } @@ -742,14 +742,41 @@ function um_profile_dynamic_meta_desc() { } $person = array( - "@context" => "http://schema.org", - "@type" => "Person", - "name" => esc_attr( $title ), - "description" => esc_attr( stripslashes( $description ) ), - "image" => esc_url( $image ), - "url" => esc_url( $url ), + '@context' => 'http://schema.org', + '@type' => 'ProfilePage', + 'dateCreated' => um_user( 'user_registered' ), + 'dateModified' => gmdate( 'Y-m-d H:i:s', um_user( 'last_update' ) ), + 'mainEntity' => array( + '@type' => 'Person', + 'name' => esc_attr( $title ), + 'alternateName' => um_user( 'user_login' ), + 'description' => esc_attr( stripslashes( $description ) ), + 'image' => esc_url( $image ), + 'sameAs' => array( + $url, + ), + ), ); + /** + * Filters changing the shema.org of profile's person. + * + * @param {array} $person Data of the profile person. + * @param {int} $user_id User ID. + * + * @return {array} Changed person's data. + * + * @since 2.8.0 + * @hook um_profile_dynamic_meta_profile_schema + * + * @example Change name of person. + * function my_um_profile_dynamic_meta_profile_schema( $core_search_fields ) { + * $person['mainEntity']['name'] = 'John Doe'; + * } + * add_filter( 'um_profile_dynamic_meta_profile_schema', 'my_um_profile_dynamic_meta_profile_schema' ); + */ + $person = apply_filters( 'um_profile_dynamic_meta_profile_schema', $person, $user_id ); + um_reset_user(); ?> @@ -781,7 +808,7 @@ function um_profile_dynamic_meta_desc() { - + Date: Fri, 14 Jun 2024 21:52:05 +0300 Subject: [PATCH 02/97] - fixed Telegram and Discord social links in profile header --- includes/core/class-builtin.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php index cae769cb..a0fd52c4 100644 --- a/includes/core/class-builtin.php +++ b/includes/core/class-builtin.php @@ -1074,6 +1074,8 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'icon' => 'fab fa-telegram', 'validate' => 'telegram_url', 'url_text' => 'Telegram', + 'advanced' => 'social', + 'color' => '#24A1DE', 'match' => 'https://t.me/', ), @@ -1090,7 +1092,9 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'url_text' => __( 'Discord', 'ultimate-member' ), 'url_rel' => 'nofollow', 'validate' => 'discord', + 'advanced' => 'social', 'color' => '#7289da', + 'match' => 'https://discord.com/users/', ), 'tiktok' => array( From 474d54d6dfb29ad4abc04a784da380ec549b4d40 Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 29 Jul 2024 13:10:36 +0200 Subject: [PATCH 03/97] Added conditional checks for phone field --- includes/core/um-filters-fields.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 8576e68a..6627c63c 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -144,6 +144,13 @@ add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filte * @return int|string */ function um_profile_field_filter_hook__phone( $value, $data ) { + $value = str_replace( '+', '', $value ); + $value = trim( $value ); + + if ( ! $value ) { + return ''; + } + $value = '' . esc_html( $value ) . ''; return $value; } From 744362706a919dd13d850d36dfb9aa4f8c3665eb Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 29 Jul 2024 14:12:11 +0200 Subject: [PATCH 04/97] Added sanitized tel input type --- includes/core/class-form.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/includes/core/class-form.php b/includes/core/class-form.php index 0593c112..e5439dd7 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -863,6 +863,9 @@ if ( ! class_exists( 'um\core\Form' ) ) { case 'checkbox': $form[ $k ] = is_array( $form[ $k ] ) ? array_map( 'sanitize_text_field', $form[ $k ] ) : sanitize_text_field( $form[ $k ] ); break; + case 'tel': + $form[ $k ] = sanitize_text_field( $field ); + break; } } } From 518e84d27fffa936fc2523a8e9f3185c0d158eee Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 29 Jul 2024 15:01:28 +0200 Subject: [PATCH 05/97] Moved tel to other types that use same sanitization --- includes/core/class-form.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/includes/core/class-form.php b/includes/core/class-form.php index e5439dd7..eecc1eec 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -856,6 +856,7 @@ if ( ! class_exists( 'um\core\Form' ) ) { case 'vimeo_video': case 'soundcloud_track': case 'spotify': + case 'tel': $form[ $k ] = sanitize_text_field( $form[ $k ] ); break; case 'multiselect': @@ -863,9 +864,6 @@ if ( ! class_exists( 'um\core\Form' ) ) { case 'checkbox': $form[ $k ] = is_array( $form[ $k ] ) ? array_map( 'sanitize_text_field', $form[ $k ] ) : sanitize_text_field( $form[ $k ] ); break; - case 'tel': - $form[ $k ] = sanitize_text_field( $field ); - break; } } } From 3096f7e4119a08e3e7862d3c5107d0a08a6817cd Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 29 Jul 2024 15:01:59 +0200 Subject: [PATCH 06/97] Updated conditions to use test value and not remove plus sign --- includes/core/um-filters-fields.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 6627c63c..2c19fb71 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -141,16 +141,17 @@ add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filte * @param $value * @param $data * - * @return int|string + * @return string */ function um_profile_field_filter_hook__phone( $value, $data ) { - $value = str_replace( '+', '', $value ); - $value = trim( $value ); + $test_value = str_replace( '+', '', $value ); + $test_value = trim( $test_value ); - if ( ! $value ) { + if ( ! $test_value ) { return ''; } + $value = trim( $value ); $value = '' . esc_html( $value ) . ''; return $value; } From f49fdecbb33c7e4a592701a1a9c64ef1827dfe4e Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 29 Jul 2024 15:23:02 +0200 Subject: [PATCH 07/97] Updated condition --- includes/core/um-filters-fields.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 2c19fb71..4edee90a 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -144,10 +144,7 @@ add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filte * @return string */ function um_profile_field_filter_hook__phone( $value, $data ) { - $test_value = str_replace( '+', '', $value ); - $test_value = trim( $test_value ); - - if ( ! $test_value ) { + if ( ! trim( str_replace( '+', '', $value ) ) ) { return ''; } From 798c82bed0c677ad6b0797cd27fec5b9dd3ae297 Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 29 Jul 2024 15:42:58 +0200 Subject: [PATCH 08/97] Updated condition --- includes/core/um-filters-fields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 4edee90a..9d145edc 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -144,7 +144,7 @@ add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filte * @return string */ function um_profile_field_filter_hook__phone( $value, $data ) { - if ( ! trim( str_replace( '+', '', $value ) ) ) { + if ( empty( trim( str_replace( '+', '', $value ) ) ) ) { return ''; } From ef21ff1832c913bf8de373cc643c1e6a1dc08b5b Mon Sep 17 00:00:00 2001 From: Yurii Nalivaiko Date: Mon, 19 Aug 2024 12:23:07 +0200 Subject: [PATCH 09/97] Added Timeout ti clear all --- assets/js/um-members.js | 4 +++- assets/js/um-members.min.js | 2 +- changelog.txt | 6 ++++++ ultimate-member.php | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/assets/js/um-members.js b/assets/js/um-members.js index ab6aeeca..c39492d4 100644 --- a/assets/js/um-members.js +++ b/assets/js/um-members.js @@ -1534,7 +1534,9 @@ jQuery(document.body).ready( function() { }); if ( directory.find( '.um-search-filter select[data-um-parent="' + filter_name + '"]' ).length > 0 ) { - select.trigger('change'); + setTimeout(function(){ + select.trigger('change'); + }, 250); } } else if ( type === 'slider' ) { diff --git a/assets/js/um-members.min.js b/assets/js/um-members.min.js index 96ce97a0..a52f7ab5 100644 --- a/assets/js/um-members.min.js +++ b/assets/js/um-members.min.js @@ -1 +1 @@ -var um_members_directory_busy=[],um_member_directories=[],um_member_directory_last_data=[];function um_parse_current_url(){var r={},t=window.location.search.substring(1).split("&");return jQuery.each(t,function(e){e=t[e].split("=");r[e[0]]=e[1]}),r}function um_get_data_for_directory(e,r){var t=um_members_get_hash(e),a={},i=um_parse_current_url();if(jQuery.each(i,function(e){-1!==e.indexOf("_"+t)&&""!==i[e]&&(a[e.replace("_"+t,"")]=i[e])}),r){if(void 0!==a[r])try{a[r]=decodeURIComponent(a[r])}catch(e){console.error(e)}return a[r]}return a}function um_set_url_from_data(e,r,t){var a=um_members_get_hash(e),i=um_get_data_for_directory(e),m={},d=(Array.isArray(t)?(jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")):jQuery.isNumeric(t)||(t=t.split("||"),jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")),""!==t&&(m[r+"_"+a]=t),jQuery.each(i,function(e){r===e?""!==t&&(m[e+"_"+a]=t):m[e+"_"+a]=i[e]}),jQuery.each(um_member_directories,function(e){var r,t=um_member_directories[e];t!==a&&(r=um_get_data_for_directory(jQuery('.um-directory[data-hash="'+t+'"]')),jQuery.each(r,function(e){m[e+"_"+t]=r[e]}))}),[]),e=(jQuery.each(m,function(e){d.push(e+"="+m[e])}),"?"+(d=wp.hooks.applyFilters("um_member_directory_url_attrs",d)).join("&"));"?"===e&&(e=""),window.history.pushState("string","UM Member Directory",window.location.origin+window.location.pathname+e)}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){e=um_members_get_hash(e);return void 0!==um_members_directory_busy[e]&&um_members_directory_busy[e]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t,a="",i=e.siblings(".um-slider-range").data("placeholder-s"),m=e.siblings(".um-slider-range").data("placeholder-p"),r=r?(a=(r.values[0]===r.values[1]?i.replace("{value}",r.values[0]):m.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=r.values[0],r.values[1]):(a=(e.slider("values",0)===e.slider("values",1)?i.replace("{value}",e.slider("values",0)):m.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(a),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(r)}function um_get_search(e){return e.find(".um-search-line").length?e.find(".um-search-line").val():""}function um_get_sort(e){return e.data("sorting")}function um_get_current_page(e){e=e.data("page");return e=e&&void 0!==e?e:1}function um_time_convert(e,r){var t=Math.floor(e/60),e=e%60;return(t=60<=e&&(e=0,24<=(t+=1))?0:t)+":"+(e=e<10?"0"+e:e)}function um_ajax_get_members(_,e){var r,t,a,i,s,m=um_members_get_hash(_);wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,m,_)?(r=um_get_current_page(_),t=um_get_search(_),a=um_get_sort(_),i=-(new Date).getTimezoneOffset()/60,s={directory_id:m,page:r,search:t,sorting:a,gmt_offset:i,post_refferer:_.data("base-post"),nonce:um_scripts.nonce},_.find(".um-search-filter").length&&_.find(".um-search-filter").each(function(){var e,r,t,a,i,m,d,u=jQuery(this);u.find(".um-slider").length?(m=u.find(".um-slider").data("field_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-datepicker-filter").length?(m=u.find(".um-datepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-timepicker-filter").length?(m=u.find(".um-timepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0!==r&&(r=(i=(i=+(r=r.split(":"))[0])<10?"0"+i:i)+":"+(a=(a=+r[1])<10?"0"+a:a)+":00"),void 0!==e&&(a=+(t=e.split(":"))[1],e=(i=(i=+t[0])<10?"0"+i:i)+":"+(a=a<10?"0"+a:a)+":59"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find("select").length?(m=u.find("select").attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d.split("||"))):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(m=u.find('input[type="text"]').attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d)):s=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",s,u,_)}),s=wp.hooks.applyFilters("um_member_directory_filter_request",s),wp.ajax.send("um_get_members",{data:s,success:function(e){um_member_directory_last_data[m]=e,um_build_template(_,e);var r=wp.template("um-members-pagination");_.find(".um-members-pagination-box").html(r(e)),_.data("total_pages",e.pagination.total_pages),e.pagination.total_pages?(_.find(".um-member-directory-sorting-options").prop("disabled",!1),_.find(".um-member-directory-view-type").removeClass("um-disabled")):(_.find(".um-member-directory-sorting-options").prop("disabled",!0),_.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",_,e),um_init_new_dropdown(),um_members_hide_preloader(_)},error:function(e){console.log(e),um_members_hide_preloader(_)}})):setTimeout(um_ajax_get_members,600,_,e)}function um_build_template(e,r){var t,a=e.data("view_type"),a=wp.template("um-member-"+a+"-"+um_members_get_hash(e));jQuery(".um-"+um_members_get_hash(e)).length&&(e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(a(r.users)),a=wp.template("um-members-header"),e.find(".um-members-intro").remove(),t=wp.hooks.applyFilters("um_member_directory_generate_header",!1,e),(void 0!==r.is_search&&r.is_search||t)&&e.find(".um-members-wrapper").prepend(a(r)),e.addClass("um-loaded"),wp.hooks.addAction("um_window_resize","um_members",function(){e.find(".um-members.um-members-grid").length&&UM_Member_Grid(e.find(".um-members.um-members-grid"))}),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize"),UM.common.tipsy.init())}function UM_Member_Grid(r){r.find(".um-member").length&&r.imagesLoaded(function(){var e=wp.hooks.applyFilters("um_member_directory_grid_masonry_attrs",{itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"},r);r.masonry(e).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}function um_get_filters_data(_){var s=[];return _.find(".um-search-filter").each(function(){var d,t,a,i,e,r,m,u=jQuery(this);u.find("input.um-datepicker-filter").length?(d="datepicker",u.find("input.um-datepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("input.um-timepicker-filter").length?(d="timepicker",u.find("input.um-timepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("select").length?(d="select",t=u.find("select").attr("name"),a=u.find("select").data("placeholder"),i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?[]:(i=um_unsanitize_value(i)).split("||"),jQuery.each(i,function(e){var r=u.find('select option[value="'+i[e]+'"]').data("value_label");s.push({name:t,label:a,value_label:r,value:i[e],type:d})})):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(d="text",t=u.find('input[type="text"]').attr("name"),a=u.find('input[type="text"]').attr("placeholder"),""!=(i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?"":i)&&s.push({name:t,label:a,value_label:i,value:i,type:d})):u.find("div.ui-slider").length?(d="slider",t=u.find("div.ui-slider").data("field_name"),e=um_get_data_for_directory(_,"filter_"+t+"_from"),r=um_get_data_for_directory(_,"filter_"+t+"_to"),void 0===e&&void 0===r||(m=(e===r?u.find("div.um-slider-range").data("placeholder-s").replace("{value}",e):u.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",e).replace("{max_range}",r)).replace("{field_label}",u.find("div.um-slider-range").data("label")),a=u.find("div.um-slider-range").data("label"),s.push({name:t,label:a,value_label:m,value:[e,r],type:d}))):s=wp.hooks.applyFilters("um_member_directory_get_filter_data",s,_,u)}),s}function um_change_tag(e){var r,t=um_get_filters_data(e),a=(e.find(".um-members-filter-tag").remove(),e.find(".um-filtered-line"));a.length&&(r=wp.template("um-members-filtered-line"),a.prepend(r({filters:t})),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible")))}function um_run_search(e){if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=um_get_data_for_directory(e,"search"),t=um_sanitize_value(e.find(".um-search-line").val());if(t===r||""===t&&void 0===r)um_members_hide_preloader(e);else{e.data("general_search",t),um_set_url_from_data(e,"search",t),e.data("page",1),um_set_url_from_data(e,"page","");if(!wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,e)){r=e.data("must-search");if(1===r&&(t=um_get_search(e),0===e.find(".um-members-filter-remove").length)&&!t)return e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),void um_members_hide_preloader(e)}e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}}function um_slider_filter_init(e){e.find(".um-slider").each(function(){var e=jQuery(this),t=e.parents(".um-directory"),a=e.data("field_name"),r=um_get_data_for_directory(t,"filter_"+a+"_from"),i=um_get_data_for_directory(t,"filter_"+a+"_to"),r=[r=void 0===r?parseInt(e.data("min")):r,i=void 0===i?parseInt(e.data("max")):i];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:r,create:function(e,r){},step:1,slide:function(e,r){um_set_range_label(jQuery(this),r)},stop:function(e,r){um_is_directory_busy(t)||(um_members_show_preloader(t),um_set_url_from_data(t,"filter_"+a+"_from",r.values[0]),um_set_url_from_data(t,"filter_"+a+"_to",r.values[1]),t.data("page",1),um_set_url_from_data(t,"page",""),um_ajax_get_members(t),um_change_tag(t),t.data("searched",1),t.find(".um-member-directory-sorting-options").prop("disabled",!1),t.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),um_set_range_label(e)})}function um_datepicker_filter_init(e){e.find(".um-datepicker-filter").each(function(){var d=jQuery(this),u=new Date(1e3*d.data("date_min")),_=new Date(1e3*d.data("date_max")),e=d.pickadate({selectYears:!0,min:u,max:_,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){d.blur()},onClose:function(){d.blur()},onSet:function(e){var r,t,a,i,m;!e.select||um_is_directory_busy(r=d.parents(".um-directory"))||(um_members_show_preloader(r),t=d.data("filter_name"),a=d.data("range"),i=um_get_data_for_directory(r,"filter_"+t+"_from"),m=um_get_data_for_directory(r,"filter_"+t+"_to"),void 0===i&&(i=u/1e3),void 0===m&&(m=_/1e3),e=e.select/1e3,d.val(),"from"===a?i=e:"to"===a&&(m=e),um_set_url_from_data(r,"filter_"+t+"_from",i),um_set_url_from_data(r,"filter_"+t+"_to",m),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}).pickadate("picker"),r=d.data("filter_name"),t=d.data("range"),r=um_get_data_for_directory(d.parents(".um-directory"),"filter_"+r+"_"+t);void 0!==r&&e.set("select",1e3*r)})}function um_timepicker_filter_init(e){e.find(".um-timepicker-filter").each(function(){var d=jQuery(this),u=d.attr("id"),_=d.data("filter_name"),s=d.attr("data-min"),o=d.attr("data-max"),e=s.split(":"),r=o.split(":"),e=d.pickatime({format:d.data("format"),interval:parseInt(d.data("intervals")),min:[e[0],e[1]],max:[r[0],r[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){d.blur()},onClose:function(){d.blur()},onSet:function(e){var r,t,a,i,m;!e.select||um_is_directory_busy(r=d.parents(".um-directory"))||(um_members_show_preloader(r),t=d.data("filter_name"),a=d.data("range"),i=um_get_data_for_directory(r,"filter_"+t+"_from"),m=um_get_data_for_directory(r,"filter_"+t+"_to"),void 0===i&&(i=s),void 0===m&&(m=o),void 0!==e.select?(e=um_time_convert(e.select,a),"from"===a?i=e:"to"===a&&(m=e)):"from"===a?i=s:"to"===a&&(m=o),e=jQuery("#"+u).val(),"from"===d.data("range")?jQuery("#"+_+"_to").pickatime("picker").set("min",e):jQuery("#"+_+"_from").pickatime("picker").set("max",e),um_set_url_from_data(r,"filter_"+t+"_from",i),um_set_url_from_data(r,"filter_"+t+"_to",m),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}).pickatime("picker"),r=d.data("filter_name"),t=d.data("range"),r=um_get_data_for_directory(d.parents(".um-directory"),"filter_"+r+"_"+t);void 0!==r&&(t=r.split(":"),e.set("select",60*t[0]+ +t[1]))})}jQuery(document.body).ready(function(){jQuery(".um-directory .um-search-filter select").each(function(){1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var e=jQuery(this);e.select2("destroy").select2({dropdownParent:e.parent()})}),jQuery(document.body).on("mouseover",".um-directory .um-member-directory-view-type",function(){var e;jQuery(this).hasClass("um-disabled")||((e=jQuery(this).find(".um-member-directory-view-type-a:visible")).hide(),(e.next().length?e.next():jQuery(this).find(".um-member-directory-view-type-a:first")).show().tipsy("show"))}).on("mouseout",".um-directory .um-member-directory-view-type",function(){jQuery(this).hasClass("um-disabled")||(jQuery(this).find(".um-member-directory-view-type-a").hide().tipsy("hide"),jQuery(this).find('.um-member-directory-view-type-a[data-type="'+jQuery(this).parents(".um-directory").data("view_type")+'"]').show())}),jQuery(document.body).on("click",".um-directory .um-member-directory-view-type-a",function(){var e=jQuery(this).parents(".um-directory");if(um_is_directory_busy(e))return!1;var r,t=jQuery(this),a=t.parents(".um-member-directory-view-type");a.hasClass("um-disabled")||(um_members_show_preloader(e),(r=a.find(".um-member-directory-view-type-a:visible")).hide(),(r.next().length?r.next():a.find(".um-member-directory-view-type-a:first")).show().tipsy("show"),null!==(r=um_member_directory_last_data[um_members_get_hash(e)])&&(um_set_url_from_data(e,"view_type",a=t.data("type")),e.data("view_type",a),um_build_template(e,r),um_init_new_dropdown()),um_members_hide_preloader(e))}),jQuery(document.body).on("click",".um-directory .um-do-search",function(){um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("keypress",".um-directory .um-search-line",function(e){13===e.which&&um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("click",'.um-new-dropdown[data-element=".um-member-directory-sorting-a"] li a',function(){var e,r,t;1===jQuery(this).data("selected")||(e=jQuery(this).data("directory-hash"),um_is_directory_busy(e=jQuery('.um-directory[data-hash="'+e+'"]')))||(um_members_show_preloader(e),r=jQuery(this).html(),t=jQuery(this).data("value"),e.data("sorting",t),um_set_url_from_data(e,"sort",t),um_ajax_get_members(e),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"] a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),e.find(".um-member-directory-sorting-a").find("> a").html(r))}),jQuery(document.body).on("click",".um-directory .pagi:not(.current)",function(){var e,r;jQuery(this).hasClass("disabled")||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),(1===(r="first"===jQuery(this).data("page")?1:"prev"===jQuery(this).data("page")?+e.data("page")-1:"next"===jQuery(this).data("page")?+e.data("page")+1:"last"===jQuery(this).data("page")?parseInt(e.data("total_pages")):parseInt(jQuery(this).data("page")))?(e.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass("disabled"),e.find('.pagi[data-page="prev"], .pagi[data-page="last"]')):(r===parseInt(e.data("total_pages"))?e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass("disabled"):e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled"),e.find('.pagi[data-page="first"], .pagi[data-page="prev"]'))).removeClass("disabled"),e.find(".pagi").removeClass("current"),e.find('.pagi[data-page="'+r+'"]').addClass("current"),e.data("page",r),um_set_url_from_data(e,"page",1===r?"":r),um_ajax_get_members(e))}),jQuery(document.body).on("change",".um-directory .um-members-pagi-dropdown",function(){var e,r=jQuery(this).parents(".um-directory");um_is_directory_busy(r)||(um_members_show_preloader(r),e=jQuery(this).val(),r.find(".pagi").removeClass("current"),r.find('.pagi[data-page="'+e+'"]').addClass("current"),r.data("page",e),um_set_url_from_data(r,"page",1===e?"":e),um_ajax_get_members(r))}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-more a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-more").hide(),e.find(".um-member-meta-main").slideDown(),e.find(".um-member-less").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-less a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-less").hide(),e.find(".um-member-meta-main").slideUp(),e.find(".um-member-more").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-more a",function(e){e.preventDefault();var e=jQuery(this).parents(".um-member"),r=jQuery(this).parents(".um-members");return e.find(".um-member-more").hide(),e.find(".um-member-meta").slideDown(function(){UM_Member_Grid(r)}),e.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(r)},100),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(t)}),!1}),jQuery(".um-member-directory-filters-a").on("click",function(){var e=jQuery(this),r=e.parents(".um-directory").find(".um-search");r.is(":visible")?r.slideUp(250,function(){e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}):r.slideDown({duration:250,start:function(){jQuery(this).css({display:"grid"}),e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}})}),jQuery(document.body).on("change",".um-directory .um-search-filter select",function(){var e,r,t,a=jQuery(this).val(),i=um_sanitize_value(a);""===i||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),t=void 0===(t=um_get_data_for_directory(e,"filter_"+(r=jQuery(this).prop("name"))))?[]:t.split("||"),-1===jQuery.inArray(i,t)&&(t.push(i),um_set_url_from_data(e,"filter_"+r,t=t.join("||")),e.data("page",1),um_set_url_from_data(e,"page","")),jQuery(this).find('option[value="'+a+'"]').prop("disabled",!0).hide(),1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0),(i=jQuery(this)).select2("destroy").select2({dropdownParent:i.parent()}),i.val("").trigger("change"),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("blur",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(){var e,r,t,a=jQuery(this).parents(".um-directory");um_is_directory_busy(a)||(e=um_sanitize_value(jQuery(this).val()))!==(t=void 0===(t=um_get_data_for_directory(a,"filter_"+(r=jQuery(this).prop("name"))))?"":t)&&(um_members_show_preloader(a),um_set_url_from_data(a,"filter_"+r,e),a.data("page",1),um_set_url_from_data(a,"page",""),um_ajax_get_members(a),um_change_tag(a),a.data("searched",1),a.find(".um-member-directory-sorting-options").prop("disabled",!1),a.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("keypress",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(e){var r,t,a;13!==e.which||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(r=um_sanitize_value(jQuery(this).val()))!==(a=void 0===(a=um_get_data_for_directory(e,"filter_"+(t=jQuery(this).prop("name"))))?"":a)&&(um_members_show_preloader(e),um_set_url_from_data(e,"filter_"+t,r),e.data("page",1),um_set_url_from_data(e,"page",""),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("click",".um-directory .um-members-filter-remove",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)&&e){um_members_show_preloader(e);var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type"),i=("text"===a?(um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("")):"select"===a?(m=void 0===(m=um_get_data_for_directory(e,"filter_"+t))?[]:(m=um_unsanitize_value(m)).split("||"),um_set_url_from_data(e,"filter_"+t,m=(m=-1!==jQuery.inArray(r.toString(),m)?jQuery.grep(m,function(e){return e!==r.toString()}):m).length?m:""),(m=jQuery('.um-search-filter select[name="'+t+'"]')).find('option[value="'+r+'"]').prop("disabled",!1).show(),1a.data("total_pages")&&(t=a.data("total_pages")),a.data("page",t).attr("data-page",t),a.find(".um-member-directory-sorting").length&&(void 0===(t=um_get_data_for_directory(a,"sort"))&&(t=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),a.data("sorting",t),(e=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]')).find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),a.find(".um-member-directory-sorting-a").find("> a").html(e.find('a[data-value="'+t+'"]').html())),a.find(".um-member-directory-view-type").length&&(void 0===(e=um_get_data_for_directory(a,"view_type"))&&(e=a.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),a.data("view_type",e),a.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),a.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+e+'"]').show()),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=e.pickadate("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?r.set("select",1e3*t):r.clear()}),a.find(".um-slider").each(function(){var e=jQuery(this),r=e.data("field_name"),t=um_get_data_for_directory(a,"filter_"+r+"_from"),r=um_get_data_for_directory(a,"filter_"+r+"_to");void 0===t&&(t=e.data("min")),t=parseInt(t),void 0===r&&(r=e.data("max")),r=parseInt(r),e.slider("values",[t,r]),um_set_range_label(e)}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.pickatime("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?(e=t.split(":"),r.set("select",60*e[0])):r.clear()}),wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,a));if(!t&&1===a.data("must-search")){var i=um_get_search(a);if(!um_get_filters_data(a).length&&!i)return a.data("searched",0),void um_members_hide_preloader(a);a.data("searched",1)}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,a,r)||(um_ajax_get_members(a),um_change_tag(a))})})}); \ No newline at end of file +var um_members_directory_busy=[],um_member_directories=[],um_member_directory_last_data=[];function um_parse_current_url(){var e={},r=window.location.search.substring(1).split("&");return jQuery.each(r,function(t){var a=r[t].split("=");e[a[0]]=a[1]}),e}function um_get_data_for_directory(e,r){var t=um_members_get_hash(e),a={},i=um_parse_current_url();if(jQuery.each(i,function(e){-1!==e.indexOf("_"+t)&&""!==i[e]&&(a[e.replace("_"+t,"")]=i[e])}),!r)return a;if(void 0!==a[r])try{a[r]=decodeURIComponent(a[r])}catch(m){console.error(m)}return a[r]}function um_set_url_from_data(e,r,t){var a=um_members_get_hash(e),i=um_get_data_for_directory(e),m={};Array.isArray(t)?(jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")):jQuery.isNumeric(t)||(t=t.split("||"),jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")),""!==t&&(m[r+"_"+a]=t),jQuery.each(i,function(e){r===e?""!==t&&(m[e+"_"+a]=t):m[e+"_"+a]=i[e]}),jQuery.each(um_member_directories,function(e){var r=um_member_directories[e];if(r!==a){var t=jQuery('.um-directory[data-hash="'+r+'"]'),i=um_get_data_for_directory(t);jQuery.each(i,function(e){m[e+"_"+r]=i[e]})}});var d=[];jQuery.each(m,function(e){d.push(e+"="+m[e])});var s="?"+(d=wp.hooks.applyFilters("um_member_directory_url_attrs",d)).join("&");"?"===s&&(s=""),window.history.pushState("string","UM Member Directory",window.location.origin+window.location.pathname+s)}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){var r=um_members_get_hash(e);return void 0!==um_members_directory_busy[r]&&um_members_directory_busy[r]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t,a,i="",m=e.siblings(".um-slider-range").data("placeholder-s"),d=e.siblings(".um-slider-range").data("placeholder-p");r?(i=r.values[0]===r.values[1]?m.replace("{value}",r.values[0]).replace("{field_label}",e.siblings(".um-slider-range").data("label")):d.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1]).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=r.values[0],a=r.values[1]):(i=e.slider("values",0)===e.slider("values",1)?m.replace("{value}",e.slider("values",0)).replace("{field_label}",e.siblings(".um-slider-range").data("label")):d.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1)).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),a=e.slider("values",1)),e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function um_get_search(e){return e.find(".um-search-line").length?e.find(".um-search-line").val():""}function um_get_sort(e){return e.data("sorting")}function um_get_current_page(e){var r=e.data("page");return r&&void 0!==r||(r=1),r}function um_time_convert(e,r){var t=Math.floor(e/60),a=e%60;return a>=60&&(a=0,(t+=1)>=24&&(t=0)),a<10&&(a="0"+a),t+":"+a}function um_ajax_get_members(e,r){var t=um_members_get_hash(e);if(!wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,t,e)){setTimeout(um_ajax_get_members,600,e,r);return}var a=um_get_current_page(e),i=um_get_search(e),m=um_get_sort(e),d=-new Date().getTimezoneOffset()/60,s={directory_id:t,page:a,search:i,sorting:m,gmt_offset:d,post_refferer:e.data("base-post"),nonce:um_scripts.nonce};e.find(".um-search-filter").length&&e.find(".um-search-filter").each(function(){var r=jQuery(this);if(r.find(".um-slider").length){var t=r.find(".um-slider").data("field_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");(void 0!==a||void 0!==i)&&(s[t]=[a,i])}else if(r.find(".um-datepicker-filter").length){var t=r.find(".um-datepicker-filter").data("filter_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");(void 0!==a||void 0!==i)&&(s[t]=[a,i])}else if(r.find(".um-timepicker-filter").length){var t=r.find(".um-timepicker-filter").data("filter_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");if(void 0!==a){var a=a.split(":"),m=1*a[0];m<10&&(m="0"+m);var d=1*a[1];d<10&&(d="0"+d),a=m+":"+d+":00"}if(void 0!==i){var o=i.split(":"),d=1*o[1],m=1*o[0];m<10&&(m="0"+m),d<10&&(d="0"+d),i=m+":"+d+":59"}(void 0!==a||void 0!==i)&&(s[t]=[a,i])}else if(r.find("select").length){var t=r.find("select").attr("name"),l=um_get_data_for_directory(e,"filter_"+t);void 0!==l&&(l=um_unsanitize_value(l),s[t]=l.split("||"))}else if(r.hasClass("um-text-filter-type")&&r.find('input[type="text"]').length){var t=r.find('input[type="text"]').attr("name"),l=um_get_data_for_directory(e,"filter_"+t);void 0!==l&&(l=um_unsanitize_value(l),s[t]=l)}else s=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",s,r,e)}),s=wp.hooks.applyFilters("um_member_directory_filter_request",s),wp.ajax.send("um_get_members",{data:s,success:function(r){um_member_directory_last_data[t]=r,um_build_template(e,r);var a=wp.template("um-members-pagination");e.find(".um-members-pagination-box").html(a(r)),e.data("total_pages",r.pagination.total_pages),r.pagination.total_pages?(e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled")):(e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",e,r),um_init_new_dropdown(),um_members_hide_preloader(e)},error:function(r){console.log(r),um_members_hide_preloader(e)}})}function um_build_template(e,r){var t=e.data("view_type"),a=wp.template("um-member-"+t+"-"+um_members_get_hash(e));if(jQuery(".um-"+um_members_get_hash(e)).length){e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(a(r.users));var i=wp.template("um-members-header");e.find(".um-members-intro").remove();var m=wp.hooks.applyFilters("um_member_directory_generate_header",!1,e);(void 0!==r.is_search&&r.is_search||m)&&e.find(".um-members-wrapper").prepend(i(r)),e.addClass("um-loaded"),wp.hooks.addAction("um_window_resize","um_members",function(){e.find(".um-members.um-members-grid").length&&UM_Member_Grid(e.find(".um-members.um-members-grid"))}),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize"),UM.common.tipsy.init()}}function UM_Member_Grid(e){e.find(".um-member").length&&e.imagesLoaded(function(){var r=wp.hooks.applyFilters("um_member_directory_grid_masonry_attrs",{itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"},e);e.masonry(r).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}function um_get_filters_data(e){var r=[];return e.find(".um-search-filter").each(function(){var t=jQuery(this);if(t.find("input.um-datepicker-filter").length)d="datepicker",t.find("input.um-datepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var t,a=jQuery(this).data("filter_name"),i=um_get_data_for_directory(e,"filter_"+a+"_from"),m=um_get_data_for_directory(e,"filter_"+a+"_to");if(void 0!==i||void 0!==m){var s=jQuery(this).val(),o=e.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+a+'"]').val();s===o?t=o:""!==s&&""!==o?t=s+" - "+o:""===s?t="before "+o:""===o&&(t="since "+s),r.push({name:a,label:jQuery(this).data("filter-label"),value_label:t,value:[i,m],type:d})}}});else if(t.find("input.um-timepicker-filter").length)d="timepicker",t.find("input.um-timepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var t,a=jQuery(this).data("filter_name"),i=um_get_data_for_directory(e,"filter_"+a+"_from"),m=um_get_data_for_directory(e,"filter_"+a+"_to");if(void 0!==i||void 0!==m){var s=jQuery(this).val(),o=e.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+a+'"]').val();s===o?t=o:""!==s&&""!==o?t=s+" - "+o:""===s?t="before "+o:""===o&&(t="since "+s),r.push({name:a,label:jQuery(this).data("filter-label"),value_label:t,value:[i,m],type:d})}}});else if(t.find("select").length){d="select",i=t.find("select").attr("name"),m=t.find("select").data("placeholder");var a=um_get_data_for_directory(e,"filter_"+i);a=void 0===a?[]:(a=um_unsanitize_value(a)).split("||"),jQuery.each(a,function(e){var s=t.find('select option[value="'+a[e]+'"]').data("value_label");r.push({name:i,label:m,value_label:s,value:a[e],type:d})})}else if(t.hasClass("um-text-filter-type")&&t.find('input[type="text"]').length){d="text",i=t.find('input[type="text"]').attr("name"),m=t.find('input[type="text"]').attr("placeholder");var a=um_get_data_for_directory(e,"filter_"+i);void 0===a&&(a=""),""!=a&&r.push({name:i,label:m,value_label:a,value:a,type:d})}else if(t.find("div.ui-slider").length){d="slider";var i,m,d,s,o=um_get_data_for_directory(e,"filter_"+(i=t.find("div.ui-slider").data("field_name"))+"_from"),l=um_get_data_for_directory(e,"filter_"+i+"_to");if(void 0===o&&void 0===l)return;s=o===l?t.find("div.um-slider-range").data("placeholder-s").replace("{value}",o).replace("{field_label}",t.find("div.um-slider-range").data("label")):t.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",o).replace("{max_range}",l).replace("{field_label}",t.find("div.um-slider-range").data("label")),m=t.find("div.um-slider-range").data("label"),r.push({name:i,label:m,value_label:s,value:[o,l],type:d})}else r=wp.hooks.applyFilters("um_member_directory_get_filter_data",r,e,t)}),r}function um_change_tag(e){var r=um_get_filters_data(e);e.find(".um-members-filter-tag").remove();var t=e.find(".um-filtered-line");if(t.length){var a=wp.template("um-members-filtered-line");t.prepend(a({filters:r})),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible"))}}function um_run_search(e){if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=um_get_data_for_directory(e,"search"),t=um_sanitize_value(e.find(".um-search-line").val());if(t===r||""===t&&void 0===r){um_members_hide_preloader(e);return}e.data("general_search",t),um_set_url_from_data(e,"search",t),e.data("page",1),um_set_url_from_data(e,"page","");var a=!1;if(!(a=wp.hooks.applyFilters("um_member_directory_ignore_after_search",a,e))&&1===e.data("must-search")&&(t=um_get_search(e),0===e.find(".um-members-filter-remove").length&&!t)){e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),um_members_hide_preloader(e);return}e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}function um_slider_filter_init(e){e.find(".um-slider").each(function(){var e=jQuery(this),r=e.parents(".um-directory"),t=e.data("field_name"),a=um_get_data_for_directory(r,"filter_"+t+"_from"),i=um_get_data_for_directory(r,"filter_"+t+"_to");void 0===a&&(a=parseInt(e.data("min"))),void 0===i&&(i=parseInt(e.data("max")));var m=[a,i];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:m,create:function(e,r){},step:1,slide:function(e,r){um_set_range_label(jQuery(this),r)},stop:function(e,a){um_is_directory_busy(r)||(um_members_show_preloader(r),um_set_url_from_data(r,"filter_"+t+"_from",a.values[0]),um_set_url_from_data(r,"filter_"+t+"_to",a.values[1]),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),um_set_range_label(e)})}function um_datepicker_filter_init(e){e.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max")),a=e.pickadate({selectYears:!0,min:r,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(a){if(a.select){var i=e.parents(".um-directory");if(!um_is_directory_busy(i)){um_members_show_preloader(i);var m=e.data("filter_name"),d=e.data("range"),s=um_get_data_for_directory(i,"filter_"+m+"_from"),o=um_get_data_for_directory(i,"filter_"+m+"_to");void 0===s&&(s=r/1e3),void 0===o&&(o=t/1e3);var l=a.select/1e3;e.val(),"from"===d?s=l:"to"===d&&(o=l),um_set_url_from_data(i,"filter_"+m+"_from",s),um_set_url_from_data(i,"filter_"+m+"_to",o),i.data("page",1),um_set_url_from_data(i,"page",""),um_ajax_get_members(i),um_change_tag(i),i.data("searched",1),i.find(".um-member-directory-sorting-options").prop("disabled",!1),i.find(".um-member-directory-view-type").removeClass("um-disabled")}}}}).pickadate("picker"),i=e.data("filter_name"),m=e.data("range"),d=um_get_data_for_directory(e.parents(".um-directory"),"filter_"+i+"_"+m);void 0!==d&&a.set("select",1e3*d)})}function um_timepicker_filter_init(e){e.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.attr("id"),t=e.data("filter_name"),a=e.attr("data-min"),i=e.attr("data-max"),m=a.split(":"),d=i.split(":"),s=e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[m[0],m[1]],max:[d[0],d[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(m){if(m.select){var d=e.parents(".um-directory");if(!um_is_directory_busy(d)){um_members_show_preloader(d);var s=e.data("filter_name"),o=e.data("range"),l=um_get_data_for_directory(d,"filter_"+s+"_from"),u=um_get_data_for_directory(d,"filter_"+s+"_to");if(void 0===l&&(l=a),void 0===u&&(u=i),void 0!==m.select){var n=um_time_convert(m.select,o);"from"===o?l=n:"to"===o&&(u=n)}else"from"===o?l=a:"to"===o&&(u=i);var f=jQuery("#"+r).val();"from"===e.data("range")?jQuery("#"+t+"_to").pickatime("picker").set("min",f):jQuery("#"+t+"_from").pickatime("picker").set("max",f),um_set_url_from_data(d,"filter_"+s+"_from",l),um_set_url_from_data(d,"filter_"+s+"_to",u),d.data("page",1),um_set_url_from_data(d,"page",""),um_ajax_get_members(d),um_change_tag(d),d.data("searched",1),d.find(".um-member-directory-sorting-options").prop("disabled",!1),d.find(".um-member-directory-view-type").removeClass("um-disabled")}}}}).pickatime("picker"),o=e.data("filter_name"),l=e.data("range"),u=um_get_data_for_directory(e.parents(".um-directory"),"filter_"+o+"_"+l);if(void 0!==u){var n=u.split(":");s.set("select",60*n[0]+1*n[1])}})}jQuery(document.body).ready(function(){jQuery(".um-directory .um-search-filter select").each(function(){1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var e=jQuery(this);e.select2("destroy").select2({dropdownParent:e.parent()})}),jQuery(document.body).on("mouseover",".um-directory .um-member-directory-view-type",function(){if(!jQuery(this).hasClass("um-disabled")){var e=jQuery(this).find(".um-member-directory-view-type-a:visible");e.hide(),e.next().length?e.next().show().tipsy("show"):jQuery(this).find(".um-member-directory-view-type-a:first").show().tipsy("show")}}).on("mouseout",".um-directory .um-member-directory-view-type",function(){!jQuery(this).hasClass("um-disabled")&&(jQuery(this).find(".um-member-directory-view-type-a").hide().tipsy("hide"),jQuery(this).find('.um-member-directory-view-type-a[data-type="'+jQuery(this).parents(".um-directory").data("view_type")+'"]').show())}),jQuery(document.body).on("click",".um-directory .um-member-directory-view-type-a",function(){var e=jQuery(this).parents(".um-directory");if(um_is_directory_busy(e))return!1;var r=jQuery(this),t=r.parents(".um-member-directory-view-type");if(!t.hasClass("um-disabled")){um_members_show_preloader(e);var a=t.find(".um-member-directory-view-type-a:visible");a.hide(),a.next().length?a.next().show().tipsy("show"):t.find(".um-member-directory-view-type-a:first").show().tipsy("show");var i=um_member_directory_last_data[um_members_get_hash(e)];if(null!==i){var m=r.data("type");um_set_url_from_data(e,"view_type",m),e.data("view_type",m),um_build_template(e,i),um_init_new_dropdown()}um_members_hide_preloader(e)}}),jQuery(document.body).on("click",".um-directory .um-do-search",function(){var e=jQuery(this).parents(".um-directory");um_run_search(e)}),jQuery(document.body).on("keypress",".um-directory .um-search-line",function(e){if(13===e.which){var r=jQuery(this).parents(".um-directory");um_run_search(r)}}),jQuery(document.body).on("click",'.um-new-dropdown[data-element=".um-member-directory-sorting-a"] li a',function(){if(1!==jQuery(this).data("selected")){var e=jQuery(this).data("directory-hash"),r=jQuery('.um-directory[data-hash="'+e+'"]');if(!um_is_directory_busy(r)){um_members_show_preloader(r);var t=jQuery(this).html(),a=jQuery(this).data("value");r.data("sorting",a),um_set_url_from_data(r,"sort",a),um_ajax_get_members(r),r.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),r.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"] a[data-value="'+a+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),r.find(".um-member-directory-sorting-a").find("> a").html(t)}}}),jQuery(document.body).on("click",".um-directory .pagi:not(.current)",function(){if(!jQuery(this).hasClass("disabled")){var e,r=jQuery(this).parents(".um-directory");!um_is_directory_busy(r)&&(um_members_show_preloader(r),1===(e="first"===jQuery(this).data("page")?1:"prev"===jQuery(this).data("page")?1*r.data("page")-1:"next"===jQuery(this).data("page")?1*r.data("page")+1:"last"===jQuery(this).data("page")?parseInt(r.data("total_pages")):parseInt(jQuery(this).data("page")))?(r.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass("disabled"),r.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled")):e===parseInt(r.data("total_pages"))?(r.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass("disabled"),r.find('.pagi[data-page="first"], .pagi[data-page="prev"]').removeClass("disabled")):(r.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled"),r.find('.pagi[data-page="first"], .pagi[data-page="prev"]').removeClass("disabled")),r.find(".pagi").removeClass("current"),r.find('.pagi[data-page="'+e+'"]').addClass("current"),r.data("page",e),1===e?um_set_url_from_data(r,"page",""):um_set_url_from_data(r,"page",e),um_ajax_get_members(r))}}),jQuery(document.body).on("change",".um-directory .um-members-pagi-dropdown",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=jQuery(this).val();e.find(".pagi").removeClass("current"),e.find('.pagi[data-page="'+r+'"]').addClass("current"),e.data("page",r),1===r?um_set_url_from_data(e,"page",""):um_set_url_from_data(e,"page",r),um_ajax_get_members(e)}}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-more a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member");return r.find(".um-member-more").hide(),r.find(".um-member-meta-main").slideDown(),r.find(".um-member-less").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member");return r.find(".um-member-less").hide(),r.find(".um-member-meta-main").slideUp(),r.find(".um-member-more").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-more a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-more").hide(),r.find(".um-member-meta").slideDown(function(){UM_Member_Grid(t)}),r.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(t)},100),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(t)}),!1}),jQuery(".um-member-directory-filters-a").on("click",function(){var e=jQuery(this),r=e.parents(".um-directory").find(".um-search");r.is(":visible")?r.slideUp(250,function(){e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}):r.slideDown({duration:250,start:function(){jQuery(this).css({display:"grid"}),e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}})}),jQuery(document.body).on("change",".um-directory .um-search-filter select",function(){var e=jQuery(this).val(),r=um_sanitize_value(e);if(""!==r){var t=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(t)){um_members_show_preloader(t);var a=jQuery(this).prop("name"),i=um_get_data_for_directory(t,"filter_"+a);i=void 0===i?[]:i.split("||"),-1===jQuery.inArray(r,i)&&(i.push(r),um_set_url_from_data(t,"filter_"+a,i=i.join("||")),t.data("page",1),um_set_url_from_data(t,"page","")),jQuery(this).find('option[value="'+e+'"]').prop("disabled",!0).hide(),1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var m=jQuery(this);m.select2("destroy").select2({dropdownParent:m.parent()}),m.val("").trigger("change"),um_ajax_get_members(t),um_change_tag(t),t.data("searched",1),t.find(".um-member-directory-sorting-options").prop("disabled",!1),t.find(".um-member-directory-view-type").removeClass("um-disabled")}}}),jQuery(document.body).on("blur",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)){var r=um_sanitize_value(jQuery(this).val()),t=jQuery(this).prop("name"),a=um_get_data_for_directory(e,"filter_"+t);void 0===a&&(a=""),r!==a&&(um_members_show_preloader(e),um_set_url_from_data(e,"filter_"+t,r),e.data("page",1),um_set_url_from_data(e,"page",""),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),jQuery(document.body).on("keypress",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(e){if(13===e.which){var r=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(r)){var t=um_sanitize_value(jQuery(this).val()),a=jQuery(this).prop("name"),i=um_get_data_for_directory(r,"filter_"+a);void 0===i&&(i=""),t!==i&&(um_members_show_preloader(r),um_set_url_from_data(r,"filter_"+a,t),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}}),jQuery(document.body).on("click",".um-directory .um-members-filter-remove",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)&&e){um_members_show_preloader(e);var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type");if("text"===a)um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("");else if("select"===a){var i=um_get_data_for_directory(e,"filter_"+t);i=void 0===i?[]:(i=um_unsanitize_value(i)).split("||"),-1!==jQuery.inArray(r.toString(),i)&&(i=jQuery.grep(i,function(e){return e!==r.toString()})),i.length||(i=""),um_set_url_from_data(e,"filter_"+t,i);var m=jQuery('.um-search-filter select[name="'+t+'"]');m.find('option[value="'+r+'"]').prop("disabled",!1).show(),m.find("option:not(:disabled)").length>1&&m.prop("disabled",!1),m.select2("destroy").select2({dropdownParent:m.parent()}),e.find('.um-search-filter select[data-um-parent="'+t+'"]').length>0&&m.trigger("change")}else if("slider"===a){um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to","");var d=jQuery(".um-search-filter #"+t+"_min").siblings(".um-slider"),s=d.slider("option");d.slider("values",[s.min,s.max]),jQuery(".um-search-filter #"+t+"_min").val(""),jQuery(".um-search-filter #"+t+"_max").val(""),um_set_range_label(d)}else"datepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):"timepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):wp.hooks.doAction("um_member_directory_filter_remove",a,e,t,r);e.data("page",1),um_set_url_from_data(e,"page",""),jQuery(this).tipsy("hide"),jQuery(this).parents(".um-members-filter-tag").remove(),0===e.find(".um-members-filter-remove").length?e.find(".um-clear-filters").hide():e.find(".um-clear-filters").show();var o=!1;if(!(o=wp.hooks.applyFilters("um_member_directory_ignore_after_search",o,e))&&1===e.data("must-search")){var l=um_get_search(e);if(0===e.find(".um-members-filter-remove").length&&!l){e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),um_members_hide_preloader(e);return}}e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}),jQuery(document.body).on("click",".um-directory .um-clear-filters-a",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)){um_members_show_preloader(e),e.find(".um-members-filter-remove").each(function(){var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type");if("text"===a)um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("");else if("select"===a){var i=um_get_data_for_directory(e,"filter_"+t);i=void 0===i?[]:(i=um_unsanitize_value(i)).split("||"),-1!==jQuery.inArray(r.toString(),i)&&(i=jQuery.grep(i,function(e){return e!==r.toString()})),i.length||(i=""),um_set_url_from_data(e,"filter_"+t,i);var m=jQuery('.um-search-filter select[name="'+t+'"]');m.find('option[value="'+r+'"]').prop("disabled",!1).show(),m.find("option:not(:disabled)").length>1&&m.prop("disabled",!1),m.select2("destroy").select2({dropdownParent:m.parent()}),e.find('.um-search-filter select[data-um-parent="'+t+'"]').length>0&&setTimeout(function(){m.trigger("change")},250)}else if("slider"===a){um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to","");var d=jQuery(".um-search-filter #"+t+"_min").siblings(".um-slider"),s=d.slider("option");d.slider("values",[s.min,s.max]),jQuery(".um-search-filter #"+t+"_min").val(""),jQuery(".um-search-filter #"+t+"_max").val(""),um_set_range_label(d)}else"datepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):"timepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):wp.hooks.doAction("um_member_directory_clear_filters",a,e,t,r)}),e.data("page",1),um_set_url_from_data(e,"page",""),e.find(".um-members-filter-tag").remove(),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible"));var r=!1;if(!(r=wp.hooks.applyFilters("um_member_directory_ignore_after_search",r,e))&&1===e.data("must-search")&&!um_get_search(e)){e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),um_members_hide_preloader(e);return}e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}),wp.hooks.doAction("um_member_directory_on_first_pages_loading"),jQuery(".um-directory").each(function(){var e=jQuery(this),r=um_members_get_hash(e);um_member_directories.push(r),e.find(".um-search").length&&!e.find(".um-search").is(":visible")&&e.find(".um-search").css({display:"grid"}).slideUp(1),um_slider_filter_init(e),um_datepicker_filter_init(e),um_timepicker_filter_init(e),wp.hooks.doAction("um_member_directory_on_init",e,r);var t=!1;if(!(t=wp.hooks.applyFilters("um_member_directory_ignore_after_search",t,e))&&1===e.data("must-search")){var a=um_get_search(e);if(!um_get_filters_data(e).length&&!a)return}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,e,r)||(um_members_show_preloader(e),um_ajax_get_members(e,{first_load:!0}),um_change_tag(e))}),window.addEventListener("popstate",function(e){jQuery(".um-directory").each(function(){var e=jQuery(this),r=um_members_get_hash(e);if(um_member_directories.push(r),um_members_show_preloader(e),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-search-line").length){var t=um_get_data_for_directory(e,"search");void 0===t&&(t=""),e.data("general_search",t),e.find(".um-search-line").val(t)}var a=um_get_data_for_directory(e,"page");if(void 0===a?a=1:a>e.data("total_pages")&&(a=e.data("total_pages")),e.data("page",a).attr("data-page",a),e.find(".um-member-directory-sorting").length){var i=um_get_data_for_directory(e,"sort");void 0===i&&(i=e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),e.data("sorting",i);var m=e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]');m.find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),m.find('a[data-value="'+i+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),e.find(".um-member-directory-sorting-a").find("> a").html(m.find('a[data-value="'+i+'"]').html())}if(e.find(".um-member-directory-view-type").length){var d=um_get_data_for_directory(e,"view_type");void 0===d&&(d=e.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),e.data("view_type",d),e.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),e.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+d+'"]').show()}e.find(".um-datepicker-filter").each(function(){var r,t=jQuery(this),a=t.pickadate("picker"),i=um_get_data_for_directory(e,"filter_"+t.data("filter_name")+"_"+t.data("range"));void 0!==i?a.set("select",1e3*i):a.clear()}),e.find(".um-slider").each(function(){var r=jQuery(this),t=r.data("field_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");void 0===a&&(a=r.data("min")),a=parseInt(a),void 0===i&&(i=r.data("max")),i=parseInt(i),r.slider("values",[a,i]),um_set_range_label(r)}),e.find(".um-timepicker-filter").each(function(){var r,t=jQuery(this),a=t.pickatime("picker"),i=um_get_data_for_directory(e,"filter_"+t.data("filter_name")+"_"+t.data("range"));if(void 0!==i){var m=i.split(":");a.set("select",60*m[0])}else a.clear()});var s=!1;if(!(s=wp.hooks.applyFilters("um_member_directory_ignore_after_search",s,e))&&1===e.data("must-search")){var t=um_get_search(e);if(um_get_filters_data(e).length||t)e.data("searched",1);else{e.data("searched",0),um_members_hide_preloader(e);return}}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,e,r)||(um_ajax_get_members(e),um_change_tag(e))})})}); diff --git a/changelog.txt b/changelog.txt index 856ce70f..0d4e2755 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,11 @@ == Changelog == += 2.8.7 Aug 19, 2024 = + +* Bugfixes: + + - Fixed: The "Clear All" button in the member directory did not reset all dependent dropdowns. + = 2.8.6 May 22, 2024 = * Enhancements: diff --git a/ultimate-member.php b/ultimate-member.php index 879d4866..c24ef586 100644 --- a/ultimate-member.php +++ b/ultimate-member.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: 2.8.6 + * Version: 2.8.7 * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * Text Domain: ultimate-member From e7c86052ab4bd43e037196ca10ba395ac0d83cc4 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 12 Sep 2024 16:22:37 +0300 Subject: [PATCH 10/97] - WPCS; --- includes/admin/core/class-admin-users.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php index 6582793a..6db6d889 100644 --- a/includes/admin/core/class-admin-users.php +++ b/includes/admin/core/class-admin-users.php @@ -149,7 +149,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { case 'um_approve_membership': case 'um_reenable': - add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 ); add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 ); @@ -161,7 +160,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { break; case 'um_resend_activation': - add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 ); add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 ); @@ -174,7 +172,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { case 'um_delete': if ( is_admin() ) { - wp_die( __( 'This action is not allowed in backend.', 'ultimate-member' ) ); + wp_die( esc_html__( 'This action is not allowed in backend.', 'ultimate-member' ) ); } UM()->user()->delete(); break; @@ -484,6 +482,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { $rolename = UM()->roles()->get_priority_user_role( get_current_user_id() ); $role = get_role( $rolename ); + if ( empty( $role ) ) { + wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); + } + if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); } @@ -540,14 +542,14 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { $uri = $this->set_redirect_uri( admin_url( 'users.php' ) ); $uri = add_query_arg( 'update', 'um_users_updated', $uri ); - wp_redirect( $uri ); + wp_safe_redirect( $uri ); exit; - } elseif ( ! empty( $_REQUEST['um_bulkedit'] ) ) { + } + if ( ! empty( $_REQUEST['um_bulkedit'] ) ) { $uri = $this->set_redirect_uri( admin_url( 'users.php' ) ); - wp_redirect( $uri ); + wp_safe_redirect( $uri ); exit; - } } From 6c632a2c68e3953f71a2eedd3d353496fa620609 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 12 Sep 2024 16:44:53 +0300 Subject: [PATCH 11/97] - fixed CVE ID: CVE-2024-8519 - WPCS; --- includes/core/class-shortcodes.php | 116 ++++++++++---------------- includes/um-short-functions.php | 1 - templates/account.php | 2 +- templates/gdpr-register.php | 2 +- templates/login-to-view.php | 12 ++- templates/login.php | 2 +- templates/logout.php | 2 +- templates/members-grid.php | 2 +- templates/members-header.php | 2 +- templates/members-list.php | 2 +- templates/members-pagination.php | 2 +- templates/members.php | 2 +- templates/message.php | 2 +- templates/modal/upload-single.php | 2 +- templates/modal/view-photo.php | 2 +- templates/password-change.php | 2 +- templates/password-reset.php | 2 +- templates/profile.php | 2 +- templates/profile/comments-single.php | 2 +- templates/profile/comments.php | 2 +- templates/profile/posts-single.php | 2 +- templates/profile/posts.php | 2 +- templates/register.php | 2 +- templates/restricted-blog.php | 2 +- templates/restricted-taxonomy.php | 2 +- templates/searchform.php | 2 +- 26 files changed, 71 insertions(+), 104 deletions(-) diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index bd5c5ddd..4f04b5fb 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -392,21 +392,18 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { return $classes; } - /** * Logged-in only content * - * @param array $args + * @param array $args * @param string $content * * @return string */ - function um_loggedin( $args = array(), $content = "" ) { - ob_start(); - + public function um_loggedin( $args = array(), $content = '' ) { $args = shortcode_atts( array( - 'lock_text' => __( 'This content has been restricted to logged in users only. Please login to view this content.', 'ultimate-member' ), + 'lock_text' => __( 'This content has been restricted to logged-in users only. Please login to view this content.', 'ultimate-member' ), 'show_lock' => 'yes', ), $args, @@ -414,50 +411,32 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { ); if ( ! is_user_logged_in() ) { + // Hide content for not logged-in users. Maybe display locked content notice. if ( 'no' === $args['show_lock'] ) { - echo ''; - } else { - $args['lock_text'] = $this->convert_locker_tags( $args['lock_text'] ); - UM()->get_template( 'login-to-view.php', '', $args, true ); - } - } else { - if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) { - echo do_shortcode( $this->convert_locker_tags( wpautop( $content ) ) ); - } else { - echo apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) ); + return ''; } + + $args['lock_text'] = $this->convert_locker_tags( $args['lock_text'] ); + return UM()->get_template( 'login-to-view.php', '', $args ); } - $output = ob_get_clean(); - - return htmlspecialchars_decode( $output, ENT_NOQUOTES ); + return apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) ); } - /** * Logged-out only content * - * @param array $args + * @param array $args * @param string $content * * @return string */ - function um_loggedout( $args = array(), $content = '' ) { - ob_start(); - - // Hide for logged in users + public function um_loggedout( $args = array(), $content = '' ) { if ( is_user_logged_in() ) { - echo ''; - } else { - if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) { - echo do_shortcode( wpautop( $content ) ); - } else { - echo apply_shortcodes( wpautop( $content ) ); - } + // Hide for logged-in users + return ''; } - - $output = ob_get_clean(); - return $output; + return apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) ); } /** @@ -1192,9 +1171,9 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { * * @return mixed|string */ - function convert_locker_tags( $str ) { - add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ), 10, 1 ); + public function convert_locker_tags( $str ) { + add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) ); return um_convert_tags( $str, array(), false ); } @@ -1319,18 +1298,22 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { * @param string $content * @return string */ - function um_shortcode_show_content_for_role( $atts = array() , $content = '' ) { + public function um_shortcode_show_content_for_role( $atts = array(), $content = '' ) { global $user_ID; if ( ! is_user_logged_in() ) { - return; + return ''; } - $a = shortcode_atts( array( - 'roles' => '', - 'not' => '', - 'is_profile' => false, - ), $atts ); + $a = shortcode_atts( + array( + 'roles' => '', + 'not' => '', + 'is_profile' => false, + ), + $atts, + 'um_show_content' + ); if ( $a['is_profile'] ) { um_fetch_user( um_profile_id() ); @@ -1341,39 +1324,26 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { $current_user_roles = um_user( 'roles' ); if ( ! empty( $a['not'] ) && ! empty( $a['roles'] ) ) { - if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) { - return do_shortcode( $this->convert_locker_tags( $content ) ); - } else { - return apply_shortcodes( $this->convert_locker_tags( $content ) ); - } + return apply_shortcodes( $this->convert_locker_tags( $content ) ); } if ( ! empty( $a['not'] ) ) { - $not_in_roles = explode( ",", $a['not'] ); + $not_in_roles = explode( ',', $a['not'] ); if ( is_array( $not_in_roles ) && ( empty( $current_user_roles ) || count( array_intersect( $current_user_roles, $not_in_roles ) ) <= 0 ) ) { - if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) { - return do_shortcode( $this->convert_locker_tags( $content ) ); - } else { - return apply_shortcodes( $this->convert_locker_tags( $content ) ); - } + return apply_shortcodes( $this->convert_locker_tags( $content ) ); } } else { - $roles = explode( ",", $a['roles'] ); + $roles = explode( ',', $a['roles'] ); if ( ! empty( $current_user_roles ) && is_array( $roles ) && count( array_intersect( $current_user_roles, $roles ) ) > 0 ) { - if ( version_compare( get_bloginfo('version'),'5.4', '<' ) ) { - return do_shortcode( $this->convert_locker_tags( $content ) ); - } else { - return apply_shortcodes( $this->convert_locker_tags( $content ) ); - } + return apply_shortcodes( $this->convert_locker_tags( $content ) ); } } return ''; } - /** * @param array $args * @param string $content @@ -1426,36 +1396,36 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { $search_value = array_values( $query ); - $template = UM()->get_template( 'searchform.php', '', array( 'query' => $query, 'search_value' => $search_value[0], 'members_page' => um_get_core_page( 'members' ) ) ); - - return $template; + $t_args = array( + 'query' => $query, + 'search_value' => $search_value[0], + 'members_page' => um_get_core_page( 'members' ), + ); + return UM()->get_template( 'searchform.php', '', $t_args ); } - /** * UM Placeholders for login referrer * - * @param $placeholders + * @param array $placeholders * * @return array */ - function add_placeholder( $placeholders ) { + public function add_placeholder( $placeholders ) { $placeholders[] = '{login_referrer}'; return $placeholders; } - /** * UM Replace Placeholders for login referrer * - * @param $replace_placeholders + * @param array $replace_placeholders * * @return array */ - function add_replace_placeholder( $replace_placeholders ) { + public function add_replace_placeholder( $replace_placeholders ) { $replace_placeholders[] = um_dynamic_login_page_redirect(); return $replace_placeholders; } - } } diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index b4179d30..1a8bf60c 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -120,7 +120,6 @@ function um_replace_placeholders() { '{user_account_link}', ); - /** * UM hook * diff --git a/templates/account.php b/templates/account.php index 58be0bc9..aa7c5d99 100644 --- a/templates/account.php +++ b/templates/account.php @@ -2,7 +2,7 @@ /** * Template for the account page * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/account.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/account.php * * Page: "Account" * diff --git a/templates/gdpr-register.php b/templates/gdpr-register.php index 64202327..c89e43b7 100644 --- a/templates/gdpr-register.php +++ b/templates/gdpr-register.php @@ -2,7 +2,7 @@ /** * Template for the GDPR checkbox in register form * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/gdpr-register.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/gdpr-register.php * * Page: "Register" * Call: function display_option() diff --git a/templates/login-to-view.php b/templates/login-to-view.php index aaf5e87b..829cd560 100644 --- a/templates/login-to-view.php +++ b/templates/login-to-view.php @@ -2,20 +2,18 @@ /** * Template for the login only content, locked message * - * This template can be overridden by copying it to yourtheme/ultimate-member/login-to-view.php + * This template can be overridden by copying it to your-theme/ultimate-member/login-to-view.php * * Call: function um_loggedin() * - * @version 2.6.1 + * @version 2.8.7 * * @var string $lock_text */ if ( ! defined( 'ABSPATH' ) ) { exit; -} ?> - +} +?>
- -
- +
get_allowed_html( 'templates' ) ); ?>
diff --git a/templates/login.php b/templates/login.php index cacb42e6..180d38d8 100644 --- a/templates/login.php +++ b/templates/login.php @@ -2,7 +2,7 @@ /** * Template for the login form * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/login.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/login.php * * Page: "Login" * diff --git a/templates/logout.php b/templates/logout.php index 2857ab80..b87c1eae 100644 --- a/templates/logout.php +++ b/templates/logout.php @@ -2,7 +2,7 @@ /** * Template for the logout * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/logout.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/logout.php * * Page: "Logout" * diff --git a/templates/members-grid.php b/templates/members-grid.php index 0b326965..e6e02c15 100644 --- a/templates/members-grid.php +++ b/templates/members-grid.php @@ -2,7 +2,7 @@ /** * Template for the members directory grid * - * This template can be overridden by copying it to yourtheme/ultimate-member/members-grid.php + * This template can be overridden by copying it to your-theme/ultimate-member/members-grid.php * * Page: "Members" * diff --git a/templates/members-header.php b/templates/members-header.php index 4e0b1875..331aa4f6 100644 --- a/templates/members-header.php +++ b/templates/members-header.php @@ -2,7 +2,7 @@ /** * Template for the members directory header JS-template * - * This template can be overridden by copying it to yourtheme/ultimate-member/members-header.php + * This template can be overridden by copying it to your-theme/ultimate-member/members-header.php * * Page: "Members" * diff --git a/templates/members-list.php b/templates/members-list.php index 78f2f6b7..5c92bf38 100644 --- a/templates/members-list.php +++ b/templates/members-list.php @@ -2,7 +2,7 @@ /** * Template for the members directory list * - * This template can be overridden by copying it to yourtheme/ultimate-member/members-list.php + * This template can be overridden by copying it to your-theme/ultimate-member/members-list.php * * Page: "Members" * diff --git a/templates/members-pagination.php b/templates/members-pagination.php index f1664b5f..e3cbf0ce 100644 --- a/templates/members-pagination.php +++ b/templates/members-pagination.php @@ -2,7 +2,7 @@ /** * Template for the members directory pagination JS template * - * This template can be overridden by copying it to yourtheme/ultimate-member/members-pagination.php + * This template can be overridden by copying it to your-theme/ultimate-member/members-pagination.php * * Page: "Members" * diff --git a/templates/members.php b/templates/members.php index c1ba9c6b..88c74c79 100644 --- a/templates/members.php +++ b/templates/members.php @@ -2,7 +2,7 @@ /** * Template for the members directory * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/members.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/members.php * * Page: "Members" * diff --git a/templates/message.php b/templates/message.php index d48a05de..c7b1e8f1 100644 --- a/templates/message.php +++ b/templates/message.php @@ -2,7 +2,7 @@ /** * Template for the message after registration process * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/message.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/message.php * * Call: function parse_shortcode_args() * diff --git a/templates/modal/upload-single.php b/templates/modal/upload-single.php index d6c6b701..f071477b 100644 --- a/templates/modal/upload-single.php +++ b/templates/modal/upload-single.php @@ -2,7 +2,7 @@ /** * Template for the modal form * - * This template can be overridden by copying it to yourtheme/ultimate-member/modal/upload-single.php + * This template can be overridden by copying it to your-theme/ultimate-member/modal/upload-single.php * * @version 2.8.6 */ diff --git a/templates/modal/view-photo.php b/templates/modal/view-photo.php index 0ec49f81..d0ef6fbc 100644 --- a/templates/modal/view-photo.php +++ b/templates/modal/view-photo.php @@ -2,7 +2,7 @@ /** * Template for the modal photo * - * This template can be overridden by copying it to yourtheme/ultimate-member/modal/view-photo.php + * This template can be overridden by copying it to your-theme/ultimate-member/modal/view-photo.php * * @version 2.8.6 */ diff --git a/templates/password-change.php b/templates/password-change.php index 6ad5b9c1..185ea490 100644 --- a/templates/password-change.php +++ b/templates/password-change.php @@ -2,7 +2,7 @@ /** * Template for the password change * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/password-change.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/password-change.php * * Call: function ultimatemember_password() * diff --git a/templates/password-reset.php b/templates/password-reset.php index 33b61756..6dcf9cb8 100644 --- a/templates/password-reset.php +++ b/templates/password-reset.php @@ -2,7 +2,7 @@ /** * Template for the password reset * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/password-reset.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/password-reset.php * * Call: function ultimatemember_password() * diff --git a/templates/profile.php b/templates/profile.php index 5c0cdefc..de84b96a 100644 --- a/templates/profile.php +++ b/templates/profile.php @@ -2,7 +2,7 @@ /** * Template for the profile page * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/profile.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/profile.php * * Page: "Profile" * diff --git a/templates/profile/comments-single.php b/templates/profile/comments-single.php index c6d635a6..a507987e 100644 --- a/templates/profile/comments-single.php +++ b/templates/profile/comments-single.php @@ -2,7 +2,7 @@ /** * Template for the profile single comments * - * This template can be overridden by copying it to yourtheme/ultimate-member/profile/comments-single.php + * This template can be overridden by copying it to your-theme/ultimate-member/profile/comments-single.php * * Page: "Profile" * diff --git a/templates/profile/comments.php b/templates/profile/comments.php index 7535a0ad..349fdb51 100644 --- a/templates/profile/comments.php +++ b/templates/profile/comments.php @@ -2,7 +2,7 @@ /** * Template for the profile comments * - * This template can be overridden by copying it to yourtheme/ultimate-member/profile/comments.php + * This template can be overridden by copying it to your-theme/ultimate-member/profile/comments.php * * Page: "Profile" * Call: function add_comments(), function load_comments() diff --git a/templates/profile/posts-single.php b/templates/profile/posts-single.php index ac81db3a..0f829839 100644 --- a/templates/profile/posts-single.php +++ b/templates/profile/posts-single.php @@ -2,7 +2,7 @@ /** * Template for the profile single post * - * This template can be overridden by copying it to yourtheme/ultimate-member/profile/posts-single.php + * This template can be overridden by copying it to your-theme/ultimate-member/profile/posts-single.php * * Page: "Profile" * diff --git a/templates/profile/posts.php b/templates/profile/posts.php index 791c8f87..b72cb3e8 100644 --- a/templates/profile/posts.php +++ b/templates/profile/posts.php @@ -2,7 +2,7 @@ /** * Template for the profile posts * - * This template can be overridden by copying it to yourtheme/ultimate-member/profile/posts.php + * This template can be overridden by copying it to your-theme/ultimate-member/profile/posts.php * * Page: "Profile" * diff --git a/templates/register.php b/templates/register.php index 43993db9..6ab617f6 100644 --- a/templates/register.php +++ b/templates/register.php @@ -2,7 +2,7 @@ /** * Template for the register page * - * This template can be overridden by copying it to yourtheme/ultimate-member/templates/register.php + * This template can be overridden by copying it to your-theme/ultimate-member/templates/register.php * * Page: "Register" * diff --git a/templates/restricted-blog.php b/templates/restricted-blog.php index 8fe0168f..fb50fb9c 100644 --- a/templates/restricted-blog.php +++ b/templates/restricted-blog.php @@ -2,7 +2,7 @@ /** * Template for the blog restricted message * - * This template can be overridden by copying it to yourtheme/ultimate-member/restricted-blog.php + * This template can be overridden by copying it to your-theme/ultimate-member/restricted-blog.php * * Call: function blog_message() * diff --git a/templates/restricted-taxonomy.php b/templates/restricted-taxonomy.php index 4e996616..a764a2f2 100644 --- a/templates/restricted-taxonomy.php +++ b/templates/restricted-taxonomy.php @@ -2,7 +2,7 @@ /** * Template for the taxonomy restricted message * - * This template can be overridden by copying it to yourtheme/ultimate-member/restricted-taxonomy.php + * This template can be overridden by copying it to your-theme/ultimate-member/restricted-taxonomy.php * * Call: function taxonomy_message() * diff --git a/templates/searchform.php b/templates/searchform.php index 68938a9f..acdc6a2d 100644 --- a/templates/searchform.php +++ b/templates/searchform.php @@ -2,7 +2,7 @@ /** * Template for the search form * - * This template can be overridden by copying it to yourtheme/ultimate-member/searchform.php + * This template can be overridden by copying it to your-theme/ultimate-member/searchform.php * * Call: function ultimatemember_searchform() * From c76f074a050f97df91dbec87fa425bb22bee1234 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 17 Sep 2024 16:12:35 +0300 Subject: [PATCH 12/97] - fixed wp_kses allowed HTML tags; --- includes/class-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/class-functions.php b/includes/class-functions.php index 6c0aff80..c4811570 100644 --- a/includes/class-functions.php +++ b/includes/class-functions.php @@ -709,7 +709,7 @@ if ( ! class_exists( 'UM_Functions' ) ) { ), ); - $allowed_html = array_merge( $global_allowed, $allowed_html ); + $allowed_html = array_merge_recursive( $global_allowed, $allowed_html ); $allowed_html = array_map( '_wp_add_global_attributes', $allowed_html ); /** From 2c0478757fd76a2cb1156155d7de5eee3801c381 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 18 Sep 2024 14:03:18 +0300 Subject: [PATCH 13/97] - added bulk actions to WordPress native dropdown; --- includes/admin/class-admin.php | 13 + includes/admin/class-users-columns.php | 499 ++++++++++++++++++++++ includes/admin/core/class-admin-users.php | 30 +- 3 files changed, 515 insertions(+), 27 deletions(-) create mode 100644 includes/admin/class-users-columns.php diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index 0afb0a04..5a3717cd 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -83,6 +83,7 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { $this->notices(); $this->secure(); $this->site_health(); + $this->users_columns(); } public function init_variables() { @@ -2130,5 +2131,17 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { } return UM()->classes['um\admin\site_health']; } + + /** + * @since 2.8.7 + * + * @return Users_Columns + */ + public function users_columns() { + if ( empty( UM()->classes['um\admin\users_columns'] ) ) { + UM()->classes['um\admin\users_columns'] = new Users_Columns(); + } + return UM()->classes['um\admin\users_columns']; + } } } diff --git a/includes/admin/class-users-columns.php b/includes/admin/class-users-columns.php new file mode 100644 index 00000000..6273de0a --- /dev/null +++ b/includes/admin/class-users-columns.php @@ -0,0 +1,499 @@ + __( 'Approve Membership', 'ultimate-member' ), + 'um_reject_membership' => __( 'Reject Membership', 'ultimate-member' ), + 'um_put_as_pending' => __( 'Put as Pending Review', 'ultimate-member' ), + 'um_resend_activation' => __( 'Resend Activation E-mail', 'ultimate-member' ), + 'um_deactivate' => __( 'Deactivate', 'ultimate-member' ), + 'um_reactivate' => __( 'Reactivate', 'ultimate-member' ), + ); + /** + * Filters wp-admin > Users List Table bulk actions. + * + * @since 1.3.x + * @since 2.8.7 changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` + * @hook um_admin_bulk_user_actions_hook + * + * @param {array} $um_actions Users admin actions. + * + * @return {array} Users admin actions. + * + * @example Add `$action_title` to Users List Table bulk actions. + * function um_custom_admin_bulk_user_actions_hook( $um_actions ) { + * $um_actions[ $action_slug ] = $action_title; + * return $um_actions; + * } + * add_filter( 'um_admin_bulk_user_actions_hook', 'um_custom_admin_bulk_user_actions_hook' ); + */ + return apply_filters( 'um_admin_bulk_user_actions_hook', $um_actions ); + } + + /** + * @param array $actions + * + * @return array + */ + public function add_bulk_actions( $actions ) { + $rolename = UM()->roles()->get_priority_user_role( get_current_user_id() ); + $role = get_role( $rolename ); + + if ( null === $role ) { + return $actions; + } + + // Add Ultimate Member bulk actions only when the current user has 'edit_users' capability. + if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { + return $actions; + } + + $actions[ esc_html__( 'Ultimate Member', 'ultimate-member' ) ] = $this->get_user_bulk_actions(); + return $actions; + } + + /** + * Add query args to list of query variable names to remove. + * + * @param array $removable_query_args An array of query variable names to remove from a URL + * + * @return array + */ + public function add_removable_query_args( $removable_query_args ) { + $removable_query_args[] = '_um_wpnonce'; + $removable_query_args[] = 'approved_count'; + $removable_query_args[] = 'rejected_count'; + $removable_query_args[] = 'reactivated_count'; + $removable_query_args[] = 'deactivated_count'; + $removable_query_args[] = 'pending_count'; + $removable_query_args[] = 'resend_activation_count'; + return $removable_query_args; + } + + /** + * Get the user statuses list. + * + * @return array + */ + public function get_user_statuses() { + $statuses = apply_filters( + 'um_admin_get_user_statuses', + array( + 'approved' => __( 'Approved', 'ultimate-member' ), + 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), + 'awaiting_email_confirmation' => __( 'Waiting e-mail confirmation', 'ultimate-member' ), + 'inactive' => __( 'Inactive', 'ultimate-member' ), + 'rejected' => __( 'Rejected', 'ultimate-member' ), + ) + ); + + return $statuses; + } + + /** + * Function for handling custom bulk actions on the Users List Table + * + * @param string $sendback URL for redirect after handling bulk action + * @param string $current_action Bulk action key + * @param array $userids User IDs + * + * @return string URL for redirect after handling bulk action + */ + public function handle_bulk_actions( $sendback, $current_action, $userids ) { + $um_actions = $this->get_user_bulk_actions(); + + if ( ! array_key_exists( $current_action, $um_actions ) ) { + return $sendback; + } + + // need to handle there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions + check_admin_referer( 'bulk-users', '_um_wpnonce' ); + + $rolename = UM()->roles()->get_priority_user_role( get_current_user_id() ); + $role = get_role( $rolename ); + + // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. + if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { + wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); + } + + $users = array_map( 'absint', $userids ); + + switch ( $current_action ) { + case 'um_approve_membership': + $approved_count = 0; + foreach ( $users as $user_id ) { + $res = UM()->common()->user()->approve( $user_id ); + if ( $res ) { + $approved_count++; + } + } + + $sendback = add_query_arg( + array( + 'approved_count' => $approved_count, + 'update' => 'um_approved', + ), + $this->set_redirect_uri( $sendback ) + ); + break; + case 'um_reactivate': + $reactivated_count = 0; + foreach ( $users as $user_id ) { + $res = UM()->common()->user()->reactivate( $user_id ); + if ( $res ) { + $reactivated_count++; + } + } + + $sendback = add_query_arg( + array( + 'reactivated_count' => $reactivated_count, + 'update' => 'um_reactivated', + ), + $this->set_redirect_uri( $sendback ) + ); + break; + case 'um_reject_membership': + $rejected_count = 0; + foreach ( $users as $user_id ) { + $res = UM()->common()->user()->reject( $user_id ); + if ( $res ) { + $rejected_count++; + } + } + + $sendback = add_query_arg( + array( + 'rejected_count' => $rejected_count, + 'update' => 'um_rejected', + ), + $this->set_redirect_uri( $sendback ) + ); + break; + case 'um_deactivate': + $deactivated_count = 0; + foreach ( $users as $user_id ) { + $res = UM()->common()->user()->deactivate( $user_id ); + if ( $res ) { + $deactivated_count++; + } + } + + $sendback = add_query_arg( + array( + 'deactivated_count' => $deactivated_count, + 'update' => 'um_deactivate', + ), + $this->set_redirect_uri( $sendback ) + ); + break; + case 'um_put_as_pending': + $pending_count = 0; + foreach ( $users as $user_id ) { + $res = UM()->common()->user()->set_as_pending( $user_id ); + if ( $res ) { + $pending_count++; + } + } + + $sendback = add_query_arg( + array( + 'pending_count' => $pending_count, + 'update' => 'um_pending', + ), + $this->set_redirect_uri( $sendback ) + ); + break; + case 'um_resend_activation': + $email_pending_count = 0; + foreach ( $users as $user_id ) { + $res = UM()->common()->user()->resend_activation( $user_id ); + if ( $res ) { + $email_pending_count++; + } + } + + $sendback = add_query_arg( + array( + 'resend_activation_count' => $email_pending_count, + 'update' => 'um_resend_activation', + ), + $this->set_redirect_uri( $sendback ) + ); + break; + default: + // hook for the handling custom UM actions added via 'um_admin_bulk_user_actions_hook' hook + $sendback = apply_filters( "um_handle_bulk_actions-users-{$current_action}", $sendback, $userids ); + break; + } + + return $sendback; + } + + /** + * Adds HTML with the filter by the Ultimate Member status. + * + * @param string $which Where the callback's hook fired. + */ + public function filter_by_status_action( $which ) { + $id = 'bottom' === $which ? 'um_status2' : 'um_status'; + $button_id = 'bottom' === $which ? 'um_filter_action2' : 'um_filter_action'; + + if ( 'top' === $which ) { + // need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions + wp_nonce_field('bulk-users', '_um_wpnonce', false ); + } + + // Set default statuses if not already done. + UM()->install()->set_default_user_status(); + + $statuses = $this->get_user_statuses(); + ?> +
+ + + +
+ ID; + + // Link to Ultimate Member Profile. + $actions['frontend_profile'] = '' . esc_html__( 'View profile', 'ultimate-member' ) . ''; + + // The link for open popup with the registration data submitted through Ultimate Member Registration form. + $submitted = get_user_meta( $user_id, 'submitted', true ); + if ( ! empty( $submitted ) ) { + $actions['view_info'] = '' . esc_html__( 'Info', 'ultimate-member' ) . ''; + } + + // Remove row actions for now Administrator role and who cannot view profiles of row's user. + // @todo make the um_can_view_profile() function review. Maybe rewrite it. + if ( ! current_user_can( 'manage_options' ) && ! um_can_view_profile( $user_id ) ) { + unset( $actions['frontend_profile'], $actions['view_info'], $actions['view'] ); + } + + /** + * Filters the rows actions for the user in wp-admin > Users List Table screen. + * + * Note: Row actions format is 'key' => 'action_link_html' + * + * @since 2.8.7 + * @hook um_admin_user_row_actions + * + * @param {array} $actions User's row actions. + * @param {int} $user_id Row's user ID. + * + * @return {array} User's row actions. + */ + return apply_filters( 'um_admin_user_row_actions', $actions, $user_id ); + } + + /** + * Hide users who are hidden by role access for not Administrator user + * + * @param array $args + * @return array + */ + public function hide_by_caps( $args ) { + if ( current_user_can( 'administrator' ) ) { + return $args; + } + + // @todo avoid um_user() function using + $can_view_roles = um_user( 'can_view_roles' ); + if ( um_user( 'can_view_all' ) && ! empty( $can_view_roles ) ) { + $args['role__in'] = $can_view_roles; + } + + return $args; + } + + /** + * Change default sorting at WP Users list table + * + * @param \WP_User_Query $query + */ + public function sort_by_newest( $query ) { + global $pagenow; + + if ( is_admin() && 'users.php' === $pagenow ) { + if ( ! isset( $_REQUEST['orderby'] ) ) { + $query->query_vars['order'] = 'desc'; + $query->query_orderby = ' ORDER BY user_registered ' . ( 'desc' === $query->query_vars['order'] ? 'desc ' : 'asc ' ); //set sort order + } + } + } + + /** + * Filter WP users by UM Status + * + * @param \WP_User_Query $query + */ + public function filter_users_by_status( $query ) { + global $wpdb, $pagenow; + + if ( is_admin() && 'users.php' === $pagenow && ! empty( $_REQUEST['um_status'] ) ) { + $status = sanitize_key( $_REQUEST['um_status'] ); + + $skip_status_filter = apply_filters( 'um_skip_filter_users_by_status', false, $status ); + if ( ! $skip_status_filter ) { + $query->query_where = str_replace( + 'WHERE 1=1', + "WHERE 1=1 AND {$wpdb->users}.ID IN ( + SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = 'account_status' + AND {$wpdb->usermeta}.meta_value = '{$status}')", + $query->query_where + ); + } + } + } + + /** + * Does an action to user asap + * + * @param string $action + */ + public function user_action_hook( $action ) { + switch ( $action ) { + default: + /** + * UM hook + * + * @type action + * @title um_admin_custom_hook_{$action} + * @description Integration hook on user action + * @input_vars + * [{"var":"$user_id","type":"int","desc":"User ID"}] + * @change_log + * ["Since: 2.0"] + * @usage add_action( 'um_admin_custom_hook_{$action}', 'function_name', 10, 1 ); + * @example + * + */ + do_action( "um_admin_custom_hook_{$action}", UM()->user()->id ); + break; + +// case 'um_put_as_pending': +// UM()->user()->pending(); +// break; + +// case 'um_approve_membership': +// case 'um_reenable': +// +// add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 ); +// add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 ); +// +// UM()->user()->approve(); +// break; + +// case 'um_reject_membership': +// UM()->user()->reject(); +// break; + +// case 'um_resend_activation': +// +// add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 ); +// add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 ); +// +// UM()->user()->email_pending(); +// break; + +// case 'um_deactivate': +// UM()->user()->deactivate(); +// break; + + case 'um_delete': + if ( is_admin() ) { + wp_die( __( 'This action is not allowed in backend.', 'ultimate-member' ) ); + } + UM()->user()->delete(); + break; + } + } + + /** + * Sets redirect URI after bulk action + * + * @param string $uri + * @return string + */ + private function set_redirect_uri( $uri ) { + if ( ! empty( $_REQUEST['s'] ) ) { + $uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri ); + } + + if ( ! empty( $_REQUEST['um_status'] ) ) { + $uri = add_query_arg( 'um_status', sanitize_key( $_REQUEST['um_status'] ), $uri ); + } + + return $uri; + } + } +} diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php index 6db6d889..85936125 100644 --- a/includes/admin/core/class-admin-users.php +++ b/includes/admin/core/class-admin-users.php @@ -22,8 +22,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { * Admin_Users constructor. */ public function __construct() { - add_action( 'restrict_manage_users', array( &$this, 'restrict_manage_users' ) ); - add_filter( 'user_row_actions', array( &$this, 'user_row_actions' ), 10, 2 ); add_filter( 'user_has_cap', array( &$this, 'map_caps_by_role' ), 10, 4 ); @@ -181,7 +179,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { /** * Add UM Bulk actions to Users List Table - * + * @deprecated 2.8.7 */ public function restrict_manage_users() { ?> @@ -207,33 +205,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { /** * Get UM bulk actions HTML * + * @deprecated 2.8.7 + * * @return string */ public function get_bulk_admin_actions() { - - /** - * UM hook - * - * @type filter - * @title um_admin_bulk_user_actions_hook - * @description Admin Users List Table bulk actions - * @input_vars - * [{"var":"$actions","type":"array","desc":"User List Table bulk actions"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_admin_bulk_user_actions_hook', 'function_name', 10, 1 ); - * @example - * 'My Custom Bulk Action' - * ); - * return $actions; - * } - * ?> - */ $actions = apply_filters( 'um_admin_bulk_user_actions_hook', array( 'um_approve_membership' => array( 'label' => __( 'Approve Membership', 'ultimate-member' ) From 3b5eba768d68b0d59724f2807c5137faa0e7d713 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 19 Sep 2024 16:06:28 +0300 Subject: [PATCH 14/97] - added 'um_loggedin_inner_content' hook; - added wp_kses for inner content of [um_loggedin] shortcode; --- includes/core/class-shortcodes.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index 4f04b5fb..89ff081e 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -420,7 +420,27 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { return UM()->get_template( 'login-to-view.php', '', $args ); } - return apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) ); + $prepared_content = wp_kses( apply_shortcodes( $this->convert_locker_tags( wpautop( $content ) ) ), UM()->get_allowed_html( 'templates' ) ); + + /** + * Filters prepared inner content via Ultimate Member handlers in [um_loggedin] shortcode. + * + * @since 2.8.7 + * @hook um_loggedin_inner_content + * + * @param {string} $prepared_content Prepared inner content via Ultimate Member handlers. + * @param {string} $content Original inner content. + * + * @return {string} Prepared inner content. + * + * @example Change inner content with own handlers. + * function my_um_loggedin_inner_content( $prepared_content, $content ) { + * $prepared_content = esc_html( $content ); + * return $prepared_content; + * } + * add_filter( 'um_loggedin_inner_content', 'my_um_loggedin_inner_content', 10, 2 ); + */ + return apply_filters( 'um_loggedin_inner_content', $prepared_content, $content ); } /** From 512dc53a18e4fa6ffd36192bff5636a4a3909b93 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 20 Sep 2024 18:41:08 +0300 Subject: [PATCH 15/97] - changed wp-admin > Users page; * updated filters by status, avoid slow queries for getting users count; * updated bulk-actions for changing statuses (moved to WP native dropdown) * separate handlers for changing user statuses on wp-admin and frontend (partially implemented); * created class UM()->common()->users() to handle user statuses in more clear format; * deprecated old hooks and old functions --- includes/admin/class-secure.php | 3 +- includes/admin/class-users-columns.php | 547 +++++++------ .../admin/core/class-admin-ajax-hooks.php | 2 - includes/admin/core/class-admin-columns.php | 36 - includes/admin/core/class-admin-notices.php | 30 + includes/admin/core/class-admin-users.php | 386 +-------- includes/ajax/class-init.php | 13 + includes/ajax/class-users.php | 56 ++ includes/class-init.php | 15 - includes/common/class-init.php | 13 + includes/common/class-secure.php | 6 +- includes/common/class-users.php | 755 ++++++++++++++++++ includes/core/class-permalinks.php | 2 +- includes/core/class-user.php | 339 +------- includes/core/rest/class-api-v1.php | 3 +- includes/core/rest/class-api-v2.php | 3 +- includes/core/um-actions-core.php | 26 +- includes/core/um-actions-register.php | 9 +- includes/core/um-filters-user.php | 2 +- includes/um-deprecated-hooks.php | 20 + includes/um-short-functions.php | 2 +- ultimate-member.php | 2 +- 22 files changed, 1250 insertions(+), 1020 deletions(-) create mode 100644 includes/ajax/class-users.php create mode 100644 includes/common/class-users.php diff --git a/includes/admin/class-secure.php b/includes/admin/class-secure.php index 30bb4ff2..772891ec 100644 --- a/includes/admin/class-secure.php +++ b/includes/admin/class-secure.php @@ -150,7 +150,8 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { } // Restore Account Status. if ( isset( $metadata['account_status'] ) ) { - UM()->user()->set_status( $metadata['account_status'] ); + // UM()->user()->set_status( $metadata['account_status'] ); + UM()->common()->users()->set_status( $user_id, $metadata['account_status'] ); } // Delete blocked meta. diff --git a/includes/admin/class-users-columns.php b/includes/admin/class-users-columns.php index 6273de0a..57cce403 100644 --- a/includes/admin/class-users-columns.php +++ b/includes/admin/class-users-columns.php @@ -2,6 +2,7 @@ namespace um\admin; use WP_User; +use WP_User_Query; if ( ! defined( 'ABSPATH' ) ) { exit; @@ -20,17 +21,157 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { * Users_Columns constructor. */ public function __construct() { + add_filter( 'manage_users_columns', array( &$this, 'manage_users_columns' ) ); + add_filter( 'manage_users_custom_column', array( &$this, 'manage_users_custom_column' ), 10, 3 ); + + add_action( 'pre_user_query', array( &$this, 'sort_by_newest' ) ); + add_filter( 'users_list_table_query_args', array( &$this, 'hide_by_caps' ), 1 ); + add_filter( 'views_users', array( &$this, 'restrict_role_links' ) ); + + add_filter( 'user_row_actions', array( &$this, 'user_row_actions' ), 10, 2 ); add_filter( 'bulk_actions-users', array( &$this, 'add_bulk_actions' ) ); -// add_filter( 'handle_bulk_actions-users', array( &$this, 'handle_bulk_actions' ), 10, 3 ); -// add_action( 'manage_users_extra_tablenav', array( &$this, 'filter_by_status_action' ) ); -// -// add_filter( 'user_row_actions', array( &$this, 'user_row_actions' ), 10, 2 ); -// -// add_filter( 'users_list_table_query_args', array( &$this, 'hide_by_caps' ), 1 ); -// add_action( 'pre_user_query', array( &$this, 'sort_by_newest' ) ); -// add_action( 'pre_user_query', array( &$this, 'filter_users_by_status' ) ); -// -// add_filter( 'removable_query_args', array( &$this, 'add_removable_query_args' ) ); + add_filter( 'handle_bulk_actions-users', array( &$this, 'handle_bulk_actions' ), 10, 3 ); + + add_action( 'manage_users_extra_tablenav', array( &$this, 'add_status_filter' ) ); + add_action( 'pre_user_query', array( &$this, 'filter_users_by_status' ) ); + + add_filter( 'removable_query_args', array( &$this, 'add_removable_query_args' ) ); + } + + /** + * Filter: Add column 'Status' + * + * @param array $columns + * + * @return array + */ + public function manage_users_columns( $columns ) { + $columns['account_status'] = __( 'Status', 'ultimate-member' ); + return $columns; + } + + /** + * Filter: Show column 'Status' + * + * @param string $value + * @param string $column_name + * @param int $user_id + * + * @return string + */ + public function manage_users_custom_column( $value, $column_name, $user_id ) { + if ( 'account_status' === $column_name ) { + um_fetch_user( $user_id ); + $value = um_user( 'account_status_name' ); + um_reset_user(); + } + return $value; + } + + /** + * Change default sorting at WP Users list table + * + * @param WP_User_Query $query Current instance of WP_User_Query (passed by reference). + */ + public function sort_by_newest( $query ) { + global $pagenow; + + // phpcs:ignore WordPress.Security.NonceVerification -- situated in WP native query and just checking sorting + if ( 'users.php' === $pagenow && ! isset( $_REQUEST['orderby'] ) && is_admin() ) { + $query->query_vars['order'] = 'desc'; + $query->query_orderby = ' ORDER BY user_registered DESC'; + } + } + + /** + * Hide users who are hidden by role access for not Administrator user + * + * @param array $args Arguments passed to WP_User_Query to retrieve items for the current + * users list table + * + * @return array + */ + public function hide_by_caps( $args ) { + if ( current_user_can( 'manage_options' ) ) { + return $args; + } + + // @todo avoid um_user() function using + // @todo check another restrictions not only the role settings. We need to exclude users per user ID. + $can_view_roles = um_user( 'can_view_roles' ); + if ( ! empty( $can_view_roles ) && um_user( 'can_view_all' ) ) { + $args['role__in'] = $can_view_roles; + } + + return $args; + } + + /** + * Hide role filters with not accessible roles + * + * @param array $views + * @return array + */ + public function restrict_role_links( $views ) { + if ( current_user_can( 'manage_options' ) ) { + return $views; + } + + $can_view_roles = um_user( 'can_view_roles' ); + if ( ! empty( $can_view_roles ) && um_user( 'can_view_all' ) ) { + $wp_roles = wp_roles(); + foreach ( $wp_roles->get_names() as $this_role => $name ) { + if ( ! in_array( $this_role, $can_view_roles, true ) ) { + unset( $views[ $this_role ] ); + } + } + } + + return $views; + } + + /** + * Custom row actions for users page + * + * @param array $actions + * @param WP_User $user_object + * + * @return array + */ + public function user_row_actions( $actions, $user_object ) { + $user_id = $user_object->ID; + + // Link to Ultimate Member Profile. + $actions['frontend_profile'] = '' . esc_html__( 'View profile', 'ultimate-member' ) . ''; + + // The link for open popup with the registration data submitted through Ultimate Member Registration form. + $submitted = get_user_meta( $user_id, 'submitted', true ); + if ( ! empty( $submitted ) ) { + $actions['view_info'] = '' . esc_html__( 'Info', 'ultimate-member' ) . ''; + // For new modal below. + // $actions['view_info'] = '' . esc_html__( 'Info', 'ultimate-member' ) . ''; + } + + // Remove row actions for now Administrator role and who cannot view profiles of row's user. + if ( ! current_user_can( 'manage_options' ) && ! um_can_view_profile( $user_id ) ) { + unset( $actions['frontend_profile'], $actions['view_info'], $actions['view'] ); + } + + /** + * Filters the rows actions for the user in wp-admin > Users List Table screen. + * + * Note: Row actions format is 'key' => 'action_link_html' + * + * @since 1.3.x + * @hook um_admin_user_row_actions + * + * @param {array} $actions User's row actions. + * @param {int} $user_id Row's user ID. + * + * @return {array} User's row actions. + */ + return apply_filters( 'um_admin_user_row_actions', $actions, $user_id ); } /** @@ -46,7 +187,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { 'um_put_as_pending' => __( 'Put as Pending Review', 'ultimate-member' ), 'um_resend_activation' => __( 'Resend Activation E-mail', 'ultimate-member' ), 'um_deactivate' => __( 'Deactivate', 'ultimate-member' ), - 'um_reactivate' => __( 'Reactivate', 'ultimate-member' ), + 'um_reactivate' => __( 'Reactivate', 'ultimate-member' ), // um_reenable ); /** * Filters wp-admin > Users List Table bulk actions. @@ -92,41 +233,41 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { } /** - * Add query args to list of query variable names to remove. + * Adds HTML with the filter by the Ultimate Member status. * - * @param array $removable_query_args An array of query variable names to remove from a URL - * - * @return array + * @param string $which Where the callback's hook fired. */ - public function add_removable_query_args( $removable_query_args ) { - $removable_query_args[] = '_um_wpnonce'; - $removable_query_args[] = 'approved_count'; - $removable_query_args[] = 'rejected_count'; - $removable_query_args[] = 'reactivated_count'; - $removable_query_args[] = 'deactivated_count'; - $removable_query_args[] = 'pending_count'; - $removable_query_args[] = 'resend_activation_count'; - return $removable_query_args; - } + public function add_status_filter( $which ) { + if ( 'top' !== $which ) { + return; + } - /** - * Get the user statuses list. - * - * @return array - */ - public function get_user_statuses() { - $statuses = apply_filters( - 'um_admin_get_user_statuses', - array( - 'approved' => __( 'Approved', 'ultimate-member' ), - 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), - 'awaiting_email_confirmation' => __( 'Waiting e-mail confirmation', 'ultimate-member' ), - 'inactive' => __( 'Inactive', 'ultimate-member' ), - 'rejected' => __( 'Rejected', 'ultimate-member' ), - ) - ); + // Set default statuses if not already done. + UM()->setup()->set_default_user_status(); - return $statuses; + $id = 'um_user_status'; + + // need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions + wp_nonce_field( 'um-bulk-users', '_um_wpnonce', false ); + + $statuses = UM()->common()->users()->statuses_list(); + ?> +
+ + + +
+ roles()->get_priority_user_role( get_current_user_id() ); $role = get_role( $rolename ); + if ( null === $role ) { + return $sendback; + } + // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); } $users = array_map( 'absint', $userids ); + $users = array_diff( $users, array( get_current_user_id() ) ); // cannot make any action related to himself. switch ( $current_action ) { case 'um_approve_membership': $approved_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->user()->approve( $user_id ); + $res = UM()->common()->users()->approve( $user_id ); if ( $res ) { - $approved_count++; + ++$approved_count; } } @@ -176,12 +322,13 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $this->set_redirect_uri( $sendback ) ); break; + case 'um_reactivate': $reactivated_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->user()->reactivate( $user_id ); + $res = UM()->common()->users()->reactivate( $user_id ); if ( $res ) { - $reactivated_count++; + ++$reactivated_count; } } @@ -193,12 +340,13 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $this->set_redirect_uri( $sendback ) ); break; + case 'um_reject_membership': $rejected_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->user()->reject( $user_id ); + $res = UM()->common()->users()->reject( $user_id ); if ( $res ) { - $rejected_count++; + ++$rejected_count; } } @@ -210,12 +358,13 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $this->set_redirect_uri( $sendback ) ); break; + case 'um_deactivate': $deactivated_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->user()->deactivate( $user_id ); + $res = UM()->common()->users()->deactivate( $user_id ); if ( $res ) { - $deactivated_count++; + ++$deactivated_count; } } @@ -227,12 +376,13 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $this->set_redirect_uri( $sendback ) ); break; + case 'um_put_as_pending': $pending_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->user()->set_as_pending( $user_id ); + $res = UM()->common()->users()->set_as_pending( $user_id ); if ( $res ) { - $pending_count++; + ++$pending_count; } } @@ -244,12 +394,13 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $this->set_redirect_uri( $sendback ) ); break; + case 'um_resend_activation': $email_pending_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->user()->resend_activation( $user_id ); + $res = UM()->common()->users()->send_activation( $user_id ); if ( $res ) { - $email_pending_count++; + ++$email_pending_count; } } @@ -261,221 +412,89 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $this->set_redirect_uri( $sendback ) ); break; + default: - // hook for the handling custom UM actions added via 'um_admin_bulk_user_actions_hook' hook - $sendback = apply_filters( "um_handle_bulk_actions-users-{$current_action}", $sendback, $userids ); + /** + * Fires when a custom Ultimate Member bulk action for wp-admin > Users list table should be handled. + * + * The redirect link should be modified with success or failure feedback + * from the action to be used to display feedback to the user. + * + * The dynamic portion of the hook name, `$current_action`, refers to the current bulk action. + * Use together with custom actions added via `um_admin_bulk_user_actions_hook` hook. + * + * @param {string} $sendback The redirect URL. + * @param {array} $userids Selected users in bulk action. + * + * @return {string} The redirect URL. + * + * @since 2.8.7 + * @hook um_handle_bulk_actions-users-{$current_action} + * + * @example Handle custom-action and set redirect after it. + * function um_custom_bulk_actions_users( $sendback, $userids ) { + * foreach ( $userids as $user_id ) { + * // make some action here + * } + * return add_query_arg( 'action_counter', 'completed action count', $sendback ); + * } + * add_filter( 'um_handle_bulk_actions-users-custom-action', 'um_custom_bulk_actions_users' ); + */ + $sendback = apply_filters( "um_handle_bulk_actions-users-{$current_action}", $sendback, $userids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores break; } return $sendback; } - /** - * Adds HTML with the filter by the Ultimate Member status. - * - * @param string $which Where the callback's hook fired. - */ - public function filter_by_status_action( $which ) { - $id = 'bottom' === $which ? 'um_status2' : 'um_status'; - $button_id = 'bottom' === $which ? 'um_filter_action2' : 'um_filter_action'; - - if ( 'top' === $which ) { - // need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions - wp_nonce_field('bulk-users', '_um_wpnonce', false ); - } - - // Set default statuses if not already done. - UM()->install()->set_default_user_status(); - - $statuses = $this->get_user_statuses(); - ?> -
- - - -
- ID; - - // Link to Ultimate Member Profile. - $actions['frontend_profile'] = '' . esc_html__( 'View profile', 'ultimate-member' ) . ''; - - // The link for open popup with the registration data submitted through Ultimate Member Registration form. - $submitted = get_user_meta( $user_id, 'submitted', true ); - if ( ! empty( $submitted ) ) { - $actions['view_info'] = '' . esc_html__( 'Info', 'ultimate-member' ) . ''; - } - - // Remove row actions for now Administrator role and who cannot view profiles of row's user. - // @todo make the um_can_view_profile() function review. Maybe rewrite it. - if ( ! current_user_can( 'manage_options' ) && ! um_can_view_profile( $user_id ) ) { - unset( $actions['frontend_profile'], $actions['view_info'], $actions['view'] ); - } - - /** - * Filters the rows actions for the user in wp-admin > Users List Table screen. - * - * Note: Row actions format is 'key' => 'action_link_html' - * - * @since 2.8.7 - * @hook um_admin_user_row_actions - * - * @param {array} $actions User's row actions. - * @param {int} $user_id Row's user ID. - * - * @return {array} User's row actions. - */ - return apply_filters( 'um_admin_user_row_actions', $actions, $user_id ); - } - - /** - * Hide users who are hidden by role access for not Administrator user - * - * @param array $args - * @return array - */ - public function hide_by_caps( $args ) { - if ( current_user_can( 'administrator' ) ) { - return $args; - } - - // @todo avoid um_user() function using - $can_view_roles = um_user( 'can_view_roles' ); - if ( um_user( 'can_view_all' ) && ! empty( $can_view_roles ) ) { - $args['role__in'] = $can_view_roles; - } - - return $args; - } - - /** - * Change default sorting at WP Users list table - * - * @param \WP_User_Query $query - */ - public function sort_by_newest( $query ) { - global $pagenow; - - if ( is_admin() && 'users.php' === $pagenow ) { - if ( ! isset( $_REQUEST['orderby'] ) ) { - $query->query_vars['order'] = 'desc'; - $query->query_orderby = ' ORDER BY user_registered ' . ( 'desc' === $query->query_vars['order'] ? 'desc ' : 'asc ' ); //set sort order - } - } - } - /** * Filter WP users by UM Status * - * @param \WP_User_Query $query + * WP_User_Query $query Current instance of WP_User_Query (passed by reference). */ public function filter_users_by_status( $query ) { global $wpdb, $pagenow; - if ( is_admin() && 'users.php' === $pagenow && ! empty( $_REQUEST['um_status'] ) ) { - $status = sanitize_key( $_REQUEST['um_status'] ); - - $skip_status_filter = apply_filters( 'um_skip_filter_users_by_status', false, $status ); - if ( ! $skip_status_filter ) { - $query->query_where = str_replace( - 'WHERE 1=1', - "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'account_status' - AND {$wpdb->usermeta}.meta_value = '{$status}')", - $query->query_where - ); - } + if ( 'users.php' !== $pagenow || ! is_admin() ) { + return; } - } - /** - * Does an action to user asap - * - * @param string $action - */ - public function user_action_hook( $action ) { - switch ( $action ) { - default: - /** - * UM hook - * - * @type action - * @title um_admin_custom_hook_{$action} - * @description Integration hook on user action - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_admin_custom_hook_{$action}', 'function_name', 10, 1 ); - * @example - * - */ - do_action( "um_admin_custom_hook_{$action}", UM()->user()->id ); - break; - -// case 'um_put_as_pending': -// UM()->user()->pending(); -// break; - -// case 'um_approve_membership': -// case 'um_reenable': -// -// add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 ); -// add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 ); -// -// UM()->user()->approve(); -// break; - -// case 'um_reject_membership': -// UM()->user()->reject(); -// break; - -// case 'um_resend_activation': -// -// add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 ); -// add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 ); -// -// UM()->user()->email_pending(); -// break; - -// case 'um_deactivate': -// UM()->user()->deactivate(); -// break; - - case 'um_delete': - if ( is_admin() ) { - wp_die( __( 'This action is not allowed in backend.', 'ultimate-member' ) ); - } - UM()->user()->delete(); - break; + if ( empty( $_REQUEST['um_user_status'] ) ) { + return; } + + $status = sanitize_key( $_REQUEST['um_user_status'] ); + + /** + * Filters the marker to disable Ultimate Member default filter by user status. + * + * @since 2.8.7 + * @hook um_skip_filter_users_by_status + * + * @param {bool} $skip Marker to skip Ultimate Member core user filter handler. + * @param {string} $status User Status + * + * @return {array} User's row actions. + */ + $skip_status_filter = apply_filters( 'um_skip_filter_users_by_status', false, $status ); + if ( false !== $skip_status_filter ) { + return; + } + + $query->query_where = str_replace( + 'WHERE 1=1', + $wpdb->prepare( + "WHERE 1=1 AND + {$wpdb->users}.ID IN ( + SELECT {$wpdb->usermeta}.user_id + FROM $wpdb->usermeta + WHERE {$wpdb->usermeta}.meta_key = 'account_status' AND + {$wpdb->usermeta}.meta_value = %s + )", + $status + ), + $query->query_where + ); } /** @@ -489,11 +508,29 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { $uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri ); } - if ( ! empty( $_REQUEST['um_status'] ) ) { - $uri = add_query_arg( 'um_status', sanitize_key( $_REQUEST['um_status'] ), $uri ); + if ( ! empty( $_REQUEST['um_user_status'] ) ) { + $uri = add_query_arg( 'um_user_status', sanitize_key( $_REQUEST['um_user_status'] ), $uri ); } return $uri; } + + /** + * Add query args to list of query variable names to remove. + * + * @param array $removable_query_args An array of query variable names to remove from a URL + * + * @return array + */ + public function add_removable_query_args( $removable_query_args ) { + $removable_query_args[] = '_um_wpnonce'; // need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions + $removable_query_args[] = 'approved_count'; + $removable_query_args[] = 'rejected_count'; + $removable_query_args[] = 'reactivated_count'; + $removable_query_args[] = 'deactivated_count'; + $removable_query_args[] = 'pending_count'; + $removable_query_args[] = 'resend_activation_count'; + return $removable_query_args; + } } } diff --git a/includes/admin/core/class-admin-ajax-hooks.php b/includes/admin/core/class-admin-ajax-hooks.php index 23e27f06..2342a2cd 100644 --- a/includes/admin/core/class-admin-ajax-hooks.php +++ b/includes/admin/core/class-admin-ajax-hooks.php @@ -30,8 +30,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Ajax_Hooks' ) ) { add_action( 'wp_ajax_um_member_directory_default_filter_settings', array( UM()->member_directory(), 'default_filter_settings' ) ); add_action( 'wp_ajax_um_same_page_update', array( UM()->admin_settings(), 'same_page_update_ajax' ) ); - - add_action( 'wp_ajax_um_get_users', array( UM()->users(), 'get_users' ) ); } } diff --git a/includes/admin/core/class-admin-columns.php b/includes/admin/core/class-admin-columns.php index 9baa4527..2b689bec 100644 --- a/includes/admin/core/class-admin-columns.php +++ b/includes/admin/core/class-admin-columns.php @@ -33,42 +33,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Columns' ) ) { add_filter( 'display_post_states', array( &$this, 'add_display_post_states' ), 10, 2 ); add_filter( 'post_row_actions', array( &$this, 'remove_bulk_actions_um_form_inline' ), 10, 2 ); - - add_filter( 'manage_users_columns', array( &$this, 'manage_users_columns' ) ); - - add_filter( 'manage_users_custom_column', array( &$this, 'manage_users_custom_column' ), 10, 3 ); - } - - /** - * Filter: Add column 'Status' - * - * @param array $columns - * - * @return array - */ - public function manage_users_columns( $columns ) { - $columns['account_status'] = __( 'Status', 'ultimate-member' ); - return $columns; - } - - - /** - * Filter: Show column 'Status' - * - * @param string $val - * @param string $column_name - * @param int $user_id - * - * @return string - */ - public function manage_users_custom_column( $val, $column_name, $user_id ) { - if ( $column_name == 'account_status' ) { - um_fetch_user( $user_id ); - $value = um_user( 'account_status_name' ); - um_reset_user(); - return $value; - } - return $val; } /** diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php index 8ea72173..b9222e09 100644 --- a/includes/admin/core/class-admin-notices.php +++ b/includes/admin/core/class-admin-notices.php @@ -502,6 +502,36 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { case 'um_secure_restore': $messages[0]['content'] = __( 'Account has been successfully restored.', 'ultimate-member' ); break; + case 'um_approved': + $approved_count = isset( $_REQUEST['approved_count'] ) ? absint( $_REQUEST['approved_count'] ) : 0; + + $messages[0]['content'] = sprintf( _n( '%s user has been approved.', '%s users have been approved.', $approved_count, 'ultimate-member' ), $approved_count ); + break; + case 'um_reactivated': + $reactivated_count = isset( $_REQUEST['reactivated_count'] ) ? absint( $_REQUEST['reactivated_count'] ) : 0; + + $messages[0]['content'] = sprintf( _n( '%s user has been reactivated.', '%s users have been reactivated.', $reactivated_count, 'ultimate-member' ), $reactivated_count ); + break; + case 'um_rejected': + $rejected_count = isset( $_REQUEST['rejected_count'] ) ? absint( $_REQUEST['rejected_count'] ) : 0; + + $messages[0]['content'] = sprintf( _n( '%s user has been rejected.', '%s users have been rejected.', $rejected_count, 'ultimate-member' ), $rejected_count ); + break; + case 'um_deactivate': + $deactivated_count = isset( $_REQUEST['deactivated_count'] ) ? absint( $_REQUEST['deactivated_count'] ) : 0; + + $messages[0]['content'] = sprintf( _n( '%s user has been deactivated.', '%s users have been deactivated.', $deactivated_count, 'ultimate-member' ), $deactivated_count ); + break; + case 'um_pending': + $pending_count = isset( $_REQUEST['pending_count'] ) ? absint( $_REQUEST['pending_count'] ) : 0; + + $messages[0]['content'] = sprintf( _n( '%s user has been set as pending admin review.', '%s users have been set as pending admin review.', $pending_count, 'ultimate-member' ), $pending_count ); + break; + case 'um_resend_activation': + $resend_activation_count = isset( $_REQUEST['resend_activation_count'] ) ? absint( $_REQUEST['resend_activation_count'] ) : 0; + + $messages[0]['content'] = sprintf( _n( 'Activation email for %s user has been sent.', 'Activation emails for %s users have been sent.', $resend_activation_count, 'ultimate-member' ), $resend_activation_count ); + break; default: /** * Filters the custom admin notice after um_adm_action. diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php index 85936125..8612c377 100644 --- a/includes/admin/core/class-admin-users.php +++ b/includes/admin/core/class-admin-users.php @@ -13,102 +13,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { */ class Admin_Users { - /** - * @var string - */ - public $custom_role = 'um_role'; - /** * Admin_Users constructor. */ public function __construct() { - add_filter( 'user_row_actions', array( &$this, 'user_row_actions' ), 10, 2 ); + //add_action( 'admin_init', array( &$this, 'um_bulk_users_edit' ), 9 ); - add_filter( 'user_has_cap', array( &$this, 'map_caps_by_role' ), 10, 4 ); - - add_filter( 'users_list_table_query_args', array( &$this, 'hide_by_caps' ), 1, 1 ); - - add_filter( 'pre_user_query', array( &$this, 'sort_by_newest' ) ); - - add_filter( 'pre_user_query', array( &$this, 'filter_users_by_status' ) ); - - add_filter( 'views_users', array( &$this, 'add_status_links' ) ); - - add_action( 'admin_init', array( &$this, 'um_bulk_users_edit' ), 9 ); - - add_action( 'um_admin_user_action_hook', array( &$this, 'user_action_hook' ), 10, 1 ); - } - - public function get_users() { - UM()->admin()->check_ajax_nonce(); - - $search_request = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : ''; - $page = ! empty( $_REQUEST['page'] ) ? absint( $_REQUEST['page'] ) : 1; - $per_page = 20; - - $args = array( - 'fields' => array( 'ID', 'user_login' ), - 'paged' => $page, - 'number' => $per_page, - ); - - if ( ! empty( $search_request ) ) { - $args['search'] = '*' . $search_request . '*'; - } - - $args = apply_filters( 'um_get_users_list_ajax_args', $args ); - - $users_query = new \WP_User_Query( $args ); - $users = $users_query->get_results(); - $total_count = $users_query->get_total(); - - if ( ! empty( $_REQUEST['avatar'] ) ) { - foreach ( $users as $key => $user ) { - $url = get_avatar_url( $user->ID ); - $users[ $key ]->img = $url; - } - } - - wp_send_json_success( - array( - 'users' => $users, - 'total_count' => $total_count, - ) - ); - } - - /** - * Restrict the edit/delete users via wp-admin screen by the UM role capabilities - * - * @param $allcaps - * @param $cap - * @param $args - * @param $user - * - * @return mixed - */ - public function map_caps_by_role( $allcaps, $cap, $args, $user ) { - if ( isset( $cap[0] ) && $cap[0] == 'edit_users' ) { - if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'edit_user' ) { - if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'edit', $args[2] ) ) { - $allcaps[ $cap[0] ] = false; - } - } - } elseif ( isset( $cap[0] ) && $cap[0] == 'delete_users' ) { - if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'delete_user' ) { - if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'delete', $args[2] ) ) { - $allcaps[ $cap[0] ] = false; - } - } - } elseif ( isset( $cap[0] ) && $cap[0] == 'list_users' ) { - if ( isset( $args[0] ) && isset( $args[1] ) && ! user_can( $args[1], 'administrator' ) && $args[0] == 'list_users' ) { - if ( ! um_user( 'can_view_all' ) ) { - $allcaps[ $cap[0] ] = false; - } - } - } - - return $allcaps; + //add_action( 'um_admin_user_action_hook', array( &$this, 'user_action_hook' ), 10, 1 ); } /** @@ -141,33 +52,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { do_action( "um_admin_custom_hook_{$action}", UM()->user()->id ); break; - case 'um_put_as_pending': - UM()->user()->pending(); - break; - - case 'um_approve_membership': - case 'um_reenable': - add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 ); - - UM()->user()->approve(); - break; - - case 'um_reject_membership': - UM()->user()->reject(); - break; - - case 'um_resend_activation': - add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 ); - - UM()->user()->email_pending(); - break; - - case 'um_deactivate': - UM()->user()->deactivate(); - break; - case 'um_delete': if ( is_admin() ) { wp_die( esc_html__( 'This action is not allowed in backend.', 'ultimate-member' ) ); @@ -202,252 +86,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { } } - /** - * Get UM bulk actions HTML - * - * @deprecated 2.8.7 - * - * @return string - */ - public function get_bulk_admin_actions() { - $actions = apply_filters( 'um_admin_bulk_user_actions_hook', array( - 'um_approve_membership' => array( - 'label' => __( 'Approve Membership', 'ultimate-member' ) - ), - 'um_reject_membership' => array( - 'label' => __( 'Reject Membership', 'ultimate-member' ) - ), - 'um_put_as_pending' => array( - 'label' => __( 'Put as Pending Review', 'ultimate-member' ) - ), - 'um_resend_activation' => array( - 'label' => __( 'Resend Activation Email', 'ultimate-member' ) - ), - 'um_deactivate' => array( - 'label' => __( 'Deactivate', 'ultimate-member' ) - ), - 'um_reenable' => array( - 'label' => __( 'Reactivate', 'ultimate-member' ) - ) - ) ); - - $output = ''; - foreach ( $actions as $id => $action_data ) { - $output .= ''; - } - return $output; - } - - /** - * Custom row actions for users page - * - * @param array $actions - * @param $user_object \WP_User - * @return array - */ - public function user_row_actions( $actions, $user_object ) { - $user_id = $user_object->ID; - - $actions['frontend_profile'] = '' . __( 'View profile', 'ultimate-member' ) . ''; - - $submitted = get_user_meta( $user_id, 'submitted', true ); - if ( ! empty( $submitted ) ) { - $actions['view_info'] = '' . __( 'Info', 'ultimate-member' ) . ''; - } - - if ( ! current_user_can( 'administrator' ) ) { - if ( ! um_can_view_profile( $user_id ) ) { - unset( $actions['frontend_profile'] ); - unset( $actions['view_info'] ); - unset( $actions['view'] ); - } - } - - /** - * UM hook - * - * @type filter - * @title um_admin_user_row_actions - * @description Admin views array - * @input_vars - * [{"var":"$actions","type":"array","desc":"User List Table actions"}, - * {"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_admin_user_row_actions', 'function_name', 10, 2 ); - * @example - * - */ - $actions = apply_filters( 'um_admin_user_row_actions', $actions, $user_id ); - - return $actions; - } - - /** - * Change default sorting at WP Users list table - * - * @param array $args - * @return array - */ - public function hide_by_caps( $args ) { - if ( ! current_user_can( 'administrator' ) ) { - $can_view_roles = um_user( 'can_view_roles' ); - if ( um_user( 'can_view_all' ) && ! empty( $can_view_roles ) ) { - $args['role__in'] = $can_view_roles; - } - } - - return $args; - } - - /** - * Change default sorting at WP Users list table - * - * @param $query - * @return mixed - */ - public function sort_by_newest( $query ) { - global $pagenow; - - if ( is_admin() && 'users.php' === $pagenow ) { - if ( ! isset( $_REQUEST['orderby'] ) ) { - $query->query_vars['order'] = 'desc'; - $query->query_orderby = ' ORDER BY user_registered ' . ( 'desc' === $query->query_vars['order'] ? 'desc ' : 'asc ' ); //set sort order - } - } - - return $query; - } - - /** - * Filter WP users by UM Status - * - * @param $query - * @return mixed - */ - public function filter_users_by_status( $query ) { - global $wpdb, $pagenow; - if ( is_admin() && 'users.php' === $pagenow && ! empty( $_REQUEST['um_status'] ) ) { - - $status = sanitize_key( $_REQUEST['um_status'] ); - - if ( 'needs-verification' === $status ) { - $query->query_where = str_replace('WHERE 1=1', - "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = '_um_verified' - AND {$wpdb->usermeta}.meta_value = 'pending')", - $query->query_where - ); - } else { - $query->query_where = str_replace('WHERE 1=1', - "WHERE 1=1 AND {$wpdb->users}.ID IN ( - SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta - WHERE {$wpdb->usermeta}.meta_key = 'account_status' - AND {$wpdb->usermeta}.meta_value = '{$status}')", - $query->query_where - ); - } - } - - return $query; - } - - /** - * Add status links to WP Users List Table - * - * @param $views - * @return array - */ - public function add_status_links( $views ) { - remove_filter( 'pre_user_query', array( &$this, 'filter_users_by_status' ) ); - - $old_views = $views; - $views = array(); - - if ( ! isset( $_REQUEST['role'] ) && ! isset( $_REQUEST['um_status'] ) ) { - $views['all'] = '' . __( 'All', 'ultimate-member' ) . ' (' . UM()->query()->count_users() . ')'; - } else { - $views['all'] = '' . __( 'All', 'ultimate-member' ) . ' (' . UM()->query()->count_users() . ')'; - } - - $status = array( - 'approved' => __( 'Approved', 'ultimate-member' ), - 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), - 'awaiting_email_confirmation' => __( 'Waiting email confirmation', 'ultimate-member' ), - 'inactive' => __( 'Inactive', 'ultimate-member' ), - 'rejected' => __( 'Rejected', 'ultimate-member' ), - ); - - // set default statuses if not already done - UM()->setup()->set_default_user_status(); - - foreach ( $status as $k => $v ) { - if ( isset( $_REQUEST['um_status'] ) && sanitize_key( $_REQUEST['um_status'] ) === $k ) { - $current = 'class="current"'; - } else { - $current = ''; - } - - $views[ $k ] = '' . $v . ' (' . UM()->query()->count_users_by_status( $k ) . ')'; - } - - /** - * UM hook - * - * @type filter - * @title um_admin_views_users - * @description Admin views array - * @input_vars - * [{"var":"$views","type":"array","desc":"User Views"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_admin_views_users', 'function_name', 10, 1 ); - * @example - * - */ - $views = apply_filters( 'um_admin_views_users', $views ); - - // remove all filters - unset( $old_views['all'] ); - - // add separator - $views['subsep'] = ''; - - // merge views - foreach ( $old_views as $key => $view ) { - $views[ $key ] = $view; - } - - // hide filters with not accessible roles - if ( ! current_user_can( 'administrator' ) ) { - $wp_roles = wp_roles(); - $can_view_roles = um_user( 'can_view_roles' ); - if ( ! empty( $can_view_roles ) ) { - foreach ( $wp_roles->get_names() as $this_role => $name ) { - if ( ! in_array( $this_role, $can_view_roles, true ) ) { - unset( $views[ $this_role ] ); - } - } - } - } - - return $views; - } - /** * Bulk user editing actions */ @@ -528,25 +166,5 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { exit; } } - - /** - * Sets redirect URI after bulk action - * - * @param string $uri - * @return string - */ - public function set_redirect_uri( $uri ) { - - if ( ! empty( $_REQUEST['s'] ) ) { - $uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri ); - } - - if ( ! empty( $_REQUEST['um_status'] ) ) { - $uri = add_query_arg( 'um_status', sanitize_key( $_REQUEST['um_status'] ), $uri ); - } - - return $uri; - - } } } diff --git a/includes/ajax/class-init.php b/includes/ajax/class-init.php index 50645233..eeb2e7fc 100644 --- a/includes/ajax/class-init.php +++ b/includes/ajax/class-init.php @@ -23,6 +23,7 @@ if ( ! class_exists( 'um\ajax\Init' ) ) { $this->forms(); $this->pages(); $this->secure(); + $this->users(); } /** @@ -60,5 +61,17 @@ if ( ! class_exists( 'um\ajax\Init' ) ) { } return UM()->classes['um\ajax\secure']; } + + /** + * @since 2.8.7 + * + * @return Users + */ + public function users() { + if ( empty( UM()->classes['um\ajax\users'] ) ) { + UM()->classes['um\ajax\users'] = new Users(); + } + return UM()->classes['um\ajax\users']; + } } } diff --git a/includes/ajax/class-users.php b/includes/ajax/class-users.php new file mode 100644 index 00000000..bd44eaa5 --- /dev/null +++ b/includes/ajax/class-users.php @@ -0,0 +1,56 @@ +admin()->check_ajax_nonce(); + + $search_request = ! empty( $_REQUEST['search'] ) ? sanitize_text_field( $_REQUEST['search'] ) : ''; + $page = ! empty( $_REQUEST['page'] ) ? absint( $_REQUEST['page'] ) : 1; + $per_page = 20; + + $args = array( + 'fields' => array( 'ID', 'user_login' ), + 'paged' => $page, + 'number' => $per_page, + ); + + if ( ! empty( $search_request ) ) { + $args['search'] = '*' . $search_request . '*'; + } + + $args = apply_filters( 'um_get_users_list_ajax_args', $args ); + + $users_query = new \WP_User_Query( $args ); + $users = $users_query->get_results(); + $total_count = $users_query->get_total(); + + if ( ! empty( $_REQUEST['avatar'] ) ) { + foreach ( $users as $key => $user ) { + $url = get_avatar_url( $user->ID ); + $users[ $key ]->img = $url; + } + } + + wp_send_json_success( + array( + 'users' => $users, + 'total_count' => $total_count, + ) + ); + } +} diff --git a/includes/class-init.php b/includes/class-init.php index efa6cf07..8cd2d914 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -526,7 +526,6 @@ if ( ! class_exists( 'UM' ) ) { $this->admin_settings(); $this->columns(); $this->metabox(); - $this->users(); $this->dragdrop(); $this->admin_gdpr(); $this->admin_navmenu(); @@ -902,20 +901,6 @@ if ( ! class_exists( 'UM' ) ) { return $this->classes['admin_metabox']; } - - /** - * @since 2.0 - * - * @return um\admin\core\Admin_Users() - */ - function users() { - if ( empty( $this->classes['admin_users'] ) ) { - $this->classes['admin_users'] = new um\admin\core\Admin_Users(); - } - return $this->classes['admin_users']; - } - - /** * @since 2.0 * diff --git a/includes/common/class-init.php b/includes/common/class-init.php index 1e9e74cd..41ad1b2a 100644 --- a/includes/common/class-init.php +++ b/includes/common/class-init.php @@ -25,6 +25,7 @@ if ( ! class_exists( 'um\common\Init' ) ) { $this->secure()->hooks(); $this->site_health(); $this->theme()->hooks(); + $this->users()->hooks(); } /** @@ -86,5 +87,17 @@ if ( ! class_exists( 'um\common\Init' ) ) { } return UM()->classes['um\common\theme']; } + + /** + * @since 2.8.7 + * + * @return Users + */ + public function users() { + if ( empty( UM()->classes['um\common\users'] ) ) { + UM()->classes['um\common\users'] = new Users(); + } + return UM()->classes['um\common\users']; + } } } diff --git a/includes/common/class-secure.php b/includes/common/class-secure.php index a0d01571..6fd084fa 100644 --- a/includes/common/class-secure.php +++ b/includes/common/class-secure.php @@ -229,9 +229,11 @@ if ( ! class_exists( 'um\common\Secure' ) ) { $user->update_user_level_from_caps(); if ( is_user_logged_in() ) { - UM()->user()->set_status( 'inactive' ); + //UM()->user()->set_status( 'inactive' ); + UM()->common()->users()->set_status( $user->ID, 'inactive' ); } else { - UM()->user()->set_status( 'rejected' ); + //UM()->user()->set_status( 'rejected' ); + UM()->common()->users()->set_status( $user->ID, 'rejected' ); } um_reset_user(); update_user_meta( $user->ID, 'um_user_blocked', 'suspicious_activity' ); diff --git a/includes/common/class-users.php b/includes/common/class-users.php new file mode 100644 index 00000000..e440f621 --- /dev/null +++ b/includes/common/class-users.php @@ -0,0 +1,755 @@ +roles()->um_current_user_can( 'edit', $args[2] ) ) { + $allcaps[ $caps[0] ] = false; + } + } elseif ( 'delete_users' === $caps[0] && 'delete_user' === $args[0] ) { + if ( isset( $args[2] ) && ! UM()->roles()->um_current_user_can( 'delete', $args[2] ) ) { + $allcaps[ $caps[0] ] = false; + } + } elseif ( 'list_users' === $caps[0] ) { + if ( 'list_users' === $args[0] && ! um_user( 'can_view_all' ) ) { + $allcaps[ $caps[0] ] = false; + } + } + + return $allcaps; + } + + /** + * Hide role filters with not accessible roles + * + * @param array $roles + * @return array + */ + public function restrict_roles( $roles ) { + if ( current_user_can( 'manage_options' ) ) { + return $roles; + } + + $can_view_roles = UM()->roles()->um_user_can( 'can_view_roles' ); + if ( UM()->roles()->um_user_can( 'can_view_all' ) && empty( $can_view_roles ) ) { + return $roles; + } + + if ( ! empty( $can_view_roles ) ) { + $wp_roles = wp_roles(); + foreach ( $wp_roles->get_names() as $this_role => $name ) { + if ( ! in_array( $this_role, $can_view_roles, true ) ) { + unset( $roles[ $this_role ] ); + } + } + } + + return $roles; + } + + /** + * Get the user statuses list. + * + * @return array + */ + public function statuses_list() { + $statuses = array( + 'approved' => __( 'Approved', 'ultimate-member' ), + 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), + 'awaiting_email_confirmation' => __( 'Waiting email confirmation', 'ultimate-member' ), + 'inactive' => __( 'Inactive', 'ultimate-member' ), + 'rejected' => __( 'Rejected', 'ultimate-member' ), + ); + /** + * Filters the user statuses added via Ultimate Member plugin. + * + * Note: Statuses format is 'key' => 'title' + * + * @since 2.8.7 + * @hook um_admin_get_user_statuses + * + * @param {array} $statuses User statuses in Ultimate Member environment. + * + * @return {array} User statuses. + */ + return apply_filters( 'um_admin_get_user_statuses', $statuses ); + } + + /** + * Set user's account status. + * + * @param int $user_id User ID. + * @param string $status Status key. + * + * @return bool + */ + public function set_status( $user_id, $status ) { + $old_status = $this->get_status( $user_id ); + + /** + * Fires before User status is set. + * + * @since 2.8.7 + * @hook um_before_user_status_is_set + * + * @param {string} $status New status key. + * @param {int} $user_id User ID. + * @param {string} $old_status Old status key. + */ + do_action( 'um_before_user_status_is_set', $status, $user_id, $old_status ); + + $result = update_user_meta( $user_id, 'account_status', $status ); + + // false on failure or if the value passed to the function is the same as the one that is already in the database. + if ( false !== $result ) { + // backward compatibility. @todo maybe uncomment it after some testing. + // UM()->user()->profile['account_status'] = $status; + + // Reset cache. + $this->remove_cache( $user_id ); + + /** + * Fires just after User status is changed. + * + * @since 1.3.x + * @since 2.0 Added $user_id + * @since 2.8.7 Added $old_status + * + * @hook um_after_user_status_is_changed + * + * @param {string} $status Status key. + * @param {int} $user_id User ID. Since 2.0 + * @param {string} $old_status Old status key. Since 2.8.7 + */ + do_action( 'um_after_user_status_is_changed', $status, $user_id, $old_status ); + + return true; + } + + return false; + } + + /** + * Get user account status. + * + * @param int $user_id User ID + * + * @return string + */ + public function get_status( $user_id ) { + return get_user_meta( $user_id, 'account_status', true ); + } + + /** + * Check if user has selected account status. + * + * @since 2.8.7 + * + * @param int $user_id User ID. + * @param string $status_control Status key. + * + * @return bool + */ + public function has_status( $user_id, $status_control ) { + $status = $this->get_status( $user_id ); + return $status === $status_control; + } + + /** + * Reset User cache + * + * @param int $user_id User ID. + */ + public function remove_cache( $user_id ) { + delete_option( "um_cache_userdata_{$user_id}" ); + } + + /** + * Reset Activation link hash. + * + * @param int $user_id User ID. + */ + public function reset_activation_link( $user_id ) { + delete_user_meta( $user_id, 'account_secret_hash' ); + delete_user_meta( $user_id, 'account_secret_hash_expiry' ); + } + + /** + * Set user's activation link hash + * + * @param int $user_id User ID. + */ + public function assign_secretkey( $user_id ) { + if ( ! $this->has_status( $user_id, 'awaiting_email_confirmation' ) ) { + return; + } + + /** + * Fires before user activation link hash is generated. + * + * @since 1.3.x + * @since 2.8.7 Added $user_id + * @hook um_before_user_hash_is_changed + * + * @param {int} $user_id User ID. Since 2.8.7 + */ + do_action( 'um_before_user_hash_is_changed', $user_id ); + + $hash = UM()->validation()->generate(); + update_user_meta( $user_id, 'account_secret_hash', $hash ); + // backward compatibility. @todo maybe uncomment it after some testing. + // UM()->user()->profile['account_secret_hash'] = $hash; + + $expiration = ''; + $expiry_time = UM()->options()->get( 'activation_link_expiry_time' ); + if ( ! empty( $expiry_time ) && is_numeric( $expiry_time ) ) { + $expiration = time() + $expiry_time * DAY_IN_SECONDS; + update_user_meta( $user_id, 'account_secret_hash_expiry', $expiration ); + // backward compatibility. @todo maybe uncomment it after some testing. + // UM()->user()->profile['account_secret_hash_expiry'] = $expiration; + } + + /** + * Fires after user activation link hash is changed. + * + * @since 1.3.x + * @since 2.8.7 Added $user_id, $hash, $expiration + * @hook um_before_user_hash_is_changed + * + * @param {int} $user_id User ID. Since 2.8.7. + * @param {string} $hash Activation link hash. Since 2.8.7. + * @param {int} $expiration Expiration timestamp. Since 2.8.7. + */ + do_action( 'um_after_user_hash_is_changed', $user_id, $hash, $expiration ); + } + + /** + * @param WP_User $userdata + * + * @return string|WP_Error + */ + public function maybe_generate_password_reset_key( $userdata ) { + return get_password_reset_key( $userdata ); + } + + public function can_activation_send( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id ) { + return false; + } + +// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); +// $role = get_role( $rolename ); +// +// if ( null === $role ) { +// return false; +// } +// +// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. +// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { +// return false; +// } + + $status = $this->get_status( $user_id ); + return 'awaiting_admin_review' !== $status; + } + + public function send_activation( $user_id ) { + if ( ! $this->can_activation_send( $user_id ) ) { + return false; + } + + /** + * Fires before User has been set as pending email confirmation. + * + * @since 2.8.7 + * @hook um_before_user_is_set_as_awaiting_email_confirmation + * + * @param {int} $user_id User ID. + */ + do_action( 'um_before_user_is_set_as_awaiting_email_confirmation', $user_id ); + + $result = $this->set_status( $user_id, 'awaiting_email_confirmation' ); + + // It's `false` on failure or if the user already has rejected status. + if ( false !== $result ) { + //clear all sessions for email confirmation pending users + $user = WP_Session_Tokens::get_instance( $user_id ); + $user->destroy_all(); + + // Set activation link hash. + $this->assign_secretkey( $user_id ); + + $userdata = get_userdata( $user_id ); + + add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) ); + + UM()->mail()->send( $userdata->user_email, 'checkmail_email' ); + + /** + * Fires after User has been set as pending email confirmation. + * + * @since 2.8.7 + * @hook um_after_user_is_set_as_awaiting_email_confirmation + * + * @param {int} $user_id User ID. + */ + do_action( 'um_after_user_is_set_as_awaiting_email_confirmation', $user_id ); + return true; + } + + return false; + } + + /** + * @param $user_id + * + * @return bool + */ + public function can_be_deactivated( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id ) { + return false; + } + +// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); +// $role = get_role( $rolename ); +// +// if ( null === $role ) { +// return false; +// } +// +// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. +// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { +// return false; +// } + + $status = $this->get_status( $user_id ); + if ( 'inactive' === $status ) { + // Break if the user already approved + return false; + } + + if ( 'approved' !== $status ) { + // Break if the user already doesn't approved yet + return false; + } + + return true; + } + + /** + * @param $user_id + * + * @return bool + */ + public function deactivate( $user_id ) { + if ( ! $this->can_be_deactivated( $user_id ) ) { + return false; + } + + /** + * Fires before User has been deactivated. + * + * @since 2.8.7 + * @hook um_before_user_is_deactivated + * + * @param {int} $user_id User ID. + */ + do_action( 'um_before_user_is_deactivated', $user_id ); + + $result = $this->set_status( $user_id, 'inactive' ); + + // It's `false` on failure or if the user already has approved status. + if ( false !== $result ) { + // Clear all sessions for inactive users + $user = WP_Session_Tokens::get_instance( $user_id ); + $user->destroy_all(); + + $userdata = get_userdata( $user_id ); + UM()->mail()->send( $userdata->user_email, 'inactive_email' ); + + /** + * Fires after User has been deactivated. + * + * @since 1.3.x + * @hook um_after_user_is_inactive + * + * @param {int} $user_id User ID. + */ + do_action( 'um_after_user_is_inactive', $user_id ); + return true; + } + + return false; + } + + /** + * @param $user_id + * + * @return bool + */ + public function can_be_rejected( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id ) { + return false; + } + +// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); +// $role = get_role( $rolename ); +// +// if ( null === $role ) { +// return false; +// } +// +// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. +// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { +// return false; +// } + + $status = $this->get_status( $user_id ); + if ( 'rejected' === $status ) { + // Break if the user already rejected + return false; + } + + if ( 'approved' !== $status ) { + // Break if the user already doesn't approved yet + return false; + } + + return true; + } + + /** + * @param $user_id + * + * @return bool + */ + public function reject( $user_id ) { + if ( ! $this->can_be_rejected( $user_id ) ) { + return false; + } + + /** + * Fires before User has been rejected. + * + * @since 2.8.7 + * @hook um_before_user_is_rejected + * + * @param {int} $user_id User ID. + */ + do_action( 'um_before_user_is_rejected', $user_id ); + + $result = $this->set_status( $user_id, 'rejected' ); + + // It's `false` on failure or if the user already has rejected status. + if ( false !== $result ) { + // Clear all sessions for rejected users + $user = WP_Session_Tokens::get_instance( $user_id ); + $user->destroy_all(); + + $userdata = get_userdata( $user_id ); + UM()->mail()->send( $userdata->user_email, 'rejected_email' ); + + /** + * Fires after User has been rejected. + * + * @since 2.8.7 + * @hook um_after_user_is_rejected + * + * @param {int} $user_id User ID. + */ + do_action( 'um_after_user_is_rejected', $user_id ); + return true; + } + + return false; + } + + /** + * @param int $user_id + * + * @return bool + */ + public function can_be_set_as_pending( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id ) { + return false; + } + +// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); +// $role = get_role( $rolename ); +// +// if ( null === $role ) { +// return false; +// } +// +// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. +// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { +// return false; +// } + + $status = $this->get_status( $user_id ); + return 'awaiting_admin_review' !== $status; + } + + /** + * @param int $user_id + * + * @return bool + */ + public function set_as_pending( $user_id ) { + if ( ! $this->can_be_set_as_pending( $user_id ) ) { + return false; + } + + /** + * Fires before User has been set as pending admin review. + * + * @since 2.8.7 + * @hook um_before_user_is_set_as_pending + * + * @param {int} $user_id User ID. + */ + do_action( 'um_before_user_is_set_as_pending', $user_id ); + + $result = $this->set_status( $user_id, 'awaiting_admin_review' ); + + // It's `false` on failure or if the user already has rejected status. + if ( false !== $result ) { + // Clear all sessions for awaiting admin confirmation users + $user = WP_Session_Tokens::get_instance( $user_id ); + $user->destroy_all(); + + $userdata = get_userdata( $user_id ); + UM()->mail()->send( $userdata->user_email, 'pending_email' ); + + /** + * Fires after User has been set as pending admin review. + * + * @since 2.8.7 + * @hook um_after_user_is_set_as_pending + * + * @param {int} $user_id User ID. + */ + do_action( 'um_after_user_is_set_as_pending', $user_id ); + return true; + } + + return false; + } + + /** + * Check if the user can be approved. + * + * @param int $user_id User ID + * + * @return bool + */ + public function can_be_approved( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id ) { + return false; + } + +// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); +// $role = get_role( $rolename ); +// +// if ( null === $role ) { +// return false; +// } +// +// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. +// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { +// return false; +// } + + $status = $this->get_status( $user_id ); + return 'approved' !== $status; + } + + /** + * Approve user. + * + * @param int $user_id User ID. + * + * @return bool `true` if the user has been approved + * `false` on failure or if the user already has approved status. + */ + public function approve( $user_id ) { + if ( ! $this->can_be_approved( $user_id ) ) { + return false; + } + + /** + * Fires before User has been approved. + * + * @since 2.8.7 + * @hook um_before_user_is_approved + * + * @param {int} $user_id User ID. + */ + do_action( 'um_before_user_is_approved', $user_id ); + + $old_status = $this->get_status( $user_id ); + + $result = $this->set_status( $user_id, 'approved' ); + + // It's `false` on failure or if the user already has approved status. + if ( false !== $result ) { + $userdata = get_userdata( $user_id ); + + $this->reset_activation_link( $user_id ); + + $email_slug = 'welcome_email'; + if ( 'awaiting_admin_review' === $old_status ) { + $email_slug = 'approved_email'; + $this->maybe_generate_password_reset_key( $userdata ); + } + + add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); + + UM()->mail()->send( $userdata->user_email, $email_slug ); + + /** + * Fires after User has been approved. + * + * @since 1.3.x + * @hook um_after_user_is_approved + * + * @param {int} $user_id User ID. + */ + do_action( 'um_after_user_is_approved', $user_id ); + return true; + } + + return false; + } + + /** + * @param int $user_id + * + * @return bool + */ + public function can_be_reactivated( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id ) { + return false; + } + +// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); +// $role = get_role( $rolename ); +// +// if ( null === $role ) { +// return false; +// } +// +// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. +// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { +// return false; +// } + + $status = $this->get_status( $user_id ); + return 'inactive' === $status; + } + + /** + * @param int $user_id + * + * @return bool + */ + public function reactivate( $user_id ) { + if ( ! $this->can_be_reactivated( $user_id ) ) { + return false; + } + + /** + * Fires before User has been reactivated. + * + * @since 2.8.7 + * @hook um_before_user_is_reactivated + * + * @param {int} $user_id User ID. + */ + do_action( 'um_before_user_is_reactivated', $user_id ); + + $result = $this->set_status( $user_id, 'approved' ); + + // It's `false` on failure or if the user already has approved status. + if ( false !== $result ) { + // Reset activation link hash. + $this->reset_activation_link( $user_id ); + + $userdata = get_userdata( $user_id ); + + add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); + + UM()->mail()->send( $userdata->user_email, 'welcome_email' ); + + /** + * Fires after User has been reactivated. + * + * @since 2.8.7 + * @hook um_after_user_is_reactivated + * + * @param {int} $user_id User ID. + */ + do_action( 'um_after_user_is_reactivated', $user_id ); + return true; + } + + return false; + } +} diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php index b2714d45..3f04ffac 100644 --- a/includes/core/class-permalinks.php +++ b/includes/core/class-permalinks.php @@ -129,7 +129,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { $set_password_required = get_user_meta( $user_id, 'um_set_password_required', true ); um_fetch_user( $user_id ); - UM()->user()->approve(); + UM()->common()->users()->approve( $user_id ); if ( ! empty( $set_password_required ) ) { $redirect = um_user( 'password_reset_link' ); } diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 914a82b2..0654ef31 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -130,7 +130,6 @@ if ( ! class_exists( 'um\core\User' ) ) { add_action( 'personal_options_update', array( &$this, 'remove_cache' ) ); //add_action('edit_user_profile_update', array(&$this, 'remove_cache') ); add_action( 'um_when_role_is_set', array( &$this, 'remove_cache' ) ); - add_action( 'um_when_status_is_set', array( &$this, 'remove_cache' ) ); add_action( 'show_user_profile', array( $this, 'profile_form_additional_section' ), 10 ); add_action( 'user_new_form', array( $this, 'profile_form_additional_section' ), 10 ); @@ -1504,134 +1503,23 @@ if ( ! class_exists( 'um\core\User' ) ) { /** * Set user's account status * - * @param $status + * @deprecated 2.8.7 + * + * @param string $status */ - function set_status( $status ) { - - /** - * UM hook - * - * @type action - * @title um_when_status_is_set - * @description Action on user status changed - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_when_status_is_set', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_when_status_is_set', um_user( 'ID' ) ); - - $this->profile['account_status'] = $status; - - $this->update_usermeta_info( 'account_status' ); - - /** - * UM hook - * - * @type action - * @title um_after_user_status_is_changed_hook - * @description Action after user status changed - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_user_status_is_changed_hook', 'function_name', 10 ); - * @example - * - */ - do_action( 'um_after_user_status_is_changed_hook', um_user( 'ID' ) ); - - /** - * UM hook - * - * @type action - * @title um_after_user_status_is_changed - * @description Action after user status changed - * @input_vars - * [{"var":"$status","type":"string","desc":"User Status"}, - * {"var":"$user_id","type":"integer","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_user_status_is_changed', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_after_user_status_is_changed', $status, um_user( 'ID' ) ); - + public function set_status( $status ) { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->set_status()' ); + UM()->common()->users()->set_status( $status, um_user( 'ID' ) ); } - /** * Set user's hash */ - function assign_secretkey() { - /** - * UM hook - * - * @type action - * @title um_before_user_hash_is_changed - * @description Action before user hash is changed - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_before_user_hash_is_changed', 'function_name', 10 ); - * @example - * - */ - do_action( 'um_before_user_hash_is_changed' ); - - $this->profile['account_secret_hash'] = UM()->validation()->generate(); - $this->update_usermeta_info( 'account_secret_hash' ); - - $expiry_time = UM()->options()->get( 'activation_link_expiry_time' ); - if ( ! empty( $expiry_time ) && is_numeric( $expiry_time ) ) { - $this->profile['account_secret_hash_expiry'] = time() + $expiry_time * DAY_IN_SECONDS; - $this->update_usermeta_info( 'account_secret_hash_expiry' ); - } - - /** - * UM hook - * - * @type action - * @title um_after_user_hash_is_changed - * @description Action after user hash is changed - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_user_hash_is_changed', 'function_name', 10 ); - * @example - * - */ - do_action( 'um_after_user_hash_is_changed' ); + public function assign_secretkey() { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->assign_secretkey()' ); + UM()->common()->users()->assign_secretkey( um_user( 'ID' ) ); } - /** * @param \WP_User $userdata * @@ -1677,186 +1565,53 @@ if ( ! class_exists( 'um\core\User' ) ) { /** * This method approves a user membership and sends them an optional welcome/approval email. - * - * @usage user()->approve(); ?> - * - * @example Approve a pending user and allow him to sign-in to your site. - - user()->approve(); - - ?> - * + * @param bool $repeat @deprecated + * @deprecated 2.8.7 */ - public function approve( $repeat = true ) { - $user_id = um_user( 'ID' ); - - if ( ! $repeat ) { - $status = get_user_meta( $user_id, 'account_status', true ); - if ( 'approved' === $status ) { - return; - } - } - - delete_option( "um_cache_userdata_{$user_id}" ); - - if ( 'awaiting_admin_review' === um_user( 'account_status' ) ) { - $userdata = get_userdata( $user_id ); - - $this->maybe_generate_password_reset_key( $userdata ); - - UM()->mail()->send( um_user( 'user_email' ), 'approved_email' ); - - } else { - //$userdata = get_userdata( $user_id ); - //get_password_reset_key( $userdata ); - UM()->mail()->send( um_user( 'user_email' ), 'welcome_email' ); - } - - $this->set_status( 'approved' ); - $this->delete_meta( 'account_secret_hash' ); - $this->delete_meta( 'account_secret_hash_expiry' ); - - /** - * UM hook - * - * @type action - * @title um_after_user_is_approved - * @description Action after user was approved - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_user_is_approved', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_after_user_is_approved', um_user( 'ID' ) ); + public function approve( $repeat = true ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- deprecated function + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->approve()' ); + UM()->common()->users()->approve( um_user( 'ID' ) ); } - /** * Pending email + * @deprecated 2.8.7 */ - function email_pending() { - $this->assign_secretkey(); - $this->set_status( 'awaiting_email_confirmation' ); - - //clear all sessions for email confirmation pending users - $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) ); - $user->destroy_all(); - - UM()->mail()->send( um_user( 'user_email' ), 'checkmail_email' ); + public function email_pending() { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->send_activation()' ); + UM()->common()->users()->send_activation( um_user( 'ID' ) ); } - /** * This method puts a user under manual review by administrator and sends them an optional email. - * - * @usage user()->pending(); ?> - * - * @example An example of putting a user pending manual review - - user()->pending(); - - ?> - * + * @deprecated 2.8.7 + * @return void */ - function pending() { - $this->set_status( 'awaiting_admin_review' ); - - //clear all sessions for awaiting admin confirmation users - $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) ); - $user->destroy_all(); - - UM()->mail()->send( um_user( 'user_email' ), 'pending_email' ); + public function pending() { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->set_as_pending()' ); + UM()->common()->users()->set_as_pending( um_user( 'ID' ) ); } - /** * This method rejects a user membership and sends them an optional email. - * - * @usage user()->reject(); ?> - * - * @example Reject a user membership example - - user()->reject(); - - ?> - - * + * @deprecated 2.8.7 + * @return void */ - function reject() { - $this->set_status( 'rejected' ); - - //clear all sessions for rejected users - $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) ); - $user->destroy_all(); - - UM()->mail()->send( um_user( 'user_email' ), 'rejected_email' ); + public function reject() { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->reject()' ); + UM()->common()->users()->reject( um_user( 'ID' ) ); } - /** * This method deactivates a user membership and sends them an optional email. - * - * @usage user()->deactivate(); ?> - * - * @example Deactivate a user membership with the following example - - user->deactivate(); - - ?> - * + * @deprecated 2.8.7 + * @return void */ - function deactivate() { - $this->set_status( 'inactive' ); - - //clear all sessions for inactive users - $user = \WP_Session_Tokens::get_instance( um_user( 'ID' ) ); - $user->destroy_all(); - - /** - * UM hook - * - * @type action - * @title um_after_user_is_inactive - * @description Action after user was inactive - * @input_vars - * [{"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_after_user_is_inactive', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_after_user_is_inactive', um_user( 'ID' ) ); - - UM()->mail()->send( um_user( 'user_email' ), 'inactive_email' ); + public function deactivate() { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->deactivate()' ); + UM()->common()->users()->deactivate( um_user( 'ID' ) ); } - /** * Delete user * @@ -2522,7 +2277,6 @@ if ( ! class_exists( 'um\core\User' ) ) { return $hash_email_address; } - /** * UM Placeholders for activation link in email * @@ -2530,12 +2284,11 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @return array */ - function add_activation_placeholder( $placeholders ) { + public function add_activation_placeholder( $placeholders ) { $placeholders[] = '{account_activation_link}'; return $placeholders; } - /** * UM Replace Placeholders for activation link in email * @@ -2543,31 +2296,9 @@ if ( ! class_exists( 'um\core\User' ) ) { * * @return array */ - function add_activation_replace_placeholder( $replace_placeholders ) { + public function add_activation_replace_placeholder( $replace_placeholders ) { $replace_placeholders[] = um_user( 'account_activation_link' ); return $replace_placeholders; } - - - /** - * Get pending users (in queue) - * - * @deprecated 2.4.2 - */ - function get_pending_users_count() { - _deprecated_function( __METHOD__, '2.4.2', 'UM()->query()->get_pending_users_count()' ); - return UM()->query()->get_pending_users_count(); - } - - - /** - * Remove cached queue from Users backend - * - * @deprecated 2.4.2 - */ - function remove_cached_queue() { - _deprecated_function( __METHOD__, '2.4.2', '' ); - delete_option( 'um_cached_users_queue' ); - } } } diff --git a/includes/core/rest/class-api-v1.php b/includes/core/rest/class-api-v1.php index a3aee5c2..40a0df97 100644 --- a/includes/core/rest/class-api-v1.php +++ b/includes/core/rest/class-api-v1.php @@ -239,7 +239,8 @@ if ( ! class_exists( 'um\core\rest\API_v1' ) ) { switch ( $data ) { case 'status': - UM()->user()->set_status( $value ); + //UM()->user()->set_status( $value ); + UM()->common()->users()->set_status( $id, $value ); $response['success'] = __( 'User status has been changed.', 'ultimate-member' ); break; case 'role': diff --git a/includes/core/rest/class-api-v2.php b/includes/core/rest/class-api-v2.php index 3874b827..68cc382c 100644 --- a/includes/core/rest/class-api-v2.php +++ b/includes/core/rest/class-api-v2.php @@ -221,7 +221,8 @@ if ( ! class_exists( 'um\core\rest\API_v2' ) ) { switch ( $data ) { case 'status': - UM()->user()->set_status( $value ); + // UM()->user()->set_status( $value ); + UM()->common()->users()->set_status( $id, $value ); $response['success'] = __( 'User status has been changed.', 'ultimate-member' ); break; case 'role': diff --git a/includes/core/um-actions-core.php b/includes/core/um-actions-core.php index 8779fafc..f0e0ef08 100644 --- a/includes/core/um-actions-core.php +++ b/includes/core/um-actions-core.php @@ -90,22 +90,29 @@ function um_action_request_process() { } um_fetch_user( $uid ); - UM()->user()->reject(); + UM()->common()->users()->reject( $uid ); exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); break; case 'um_approve_membership': - case 'um_reenable': if ( ! $can_edit_users ) { wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); } um_fetch_user( $uid ); - add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ), 10, 1 ); + UM()->common()->users()->approve( $uid ); + exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); + break; - UM()->user()->approve(); + case 'um_reactivate': + if ( ! $can_edit_users ) { + wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); + } + + um_fetch_user( $uid ); + + UM()->common()->users()->reactivate( $uid ); exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); break; @@ -115,7 +122,7 @@ function um_action_request_process() { } um_fetch_user( $uid ); - UM()->user()->pending(); + UM()->common()->users()->set_as_pending( $uid ); exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); break; @@ -124,11 +131,8 @@ function um_action_request_process() { wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); } - add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ), 10, 1 ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ), 10, 1 ); - um_fetch_user( $uid ); - UM()->user()->email_pending(); + UM()->common()->users()->send_activation( $uid ); exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); break; @@ -138,7 +142,7 @@ function um_action_request_process() { } um_fetch_user( $uid ); - UM()->user()->deactivate(); + UM()->common()->users()->deactivate( $uid ); exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); break; diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index d79718c4..f2c65e92 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -11,7 +11,7 @@ if ( ! defined( 'ABSPATH' ) ) { function um_post_registration_approved_hook( $user_id ) { um_fetch_user( $user_id ); - UM()->user()->approve(); + UM()->common()->users()->approve( $user_id ); } add_action( 'um_post_registration_approved_hook', 'um_post_registration_approved_hook' ); @@ -23,7 +23,7 @@ add_action( 'um_post_registration_approved_hook', 'um_post_registration_approved function um_post_registration_checkmail_hook( $user_id ) { um_fetch_user( $user_id ); - UM()->user()->email_pending(); + UM()->common()->users()->send_activation( $user_id ); } add_action( 'um_post_registration_checkmail_hook', 'um_post_registration_checkmail_hook' ); @@ -35,7 +35,7 @@ add_action( 'um_post_registration_checkmail_hook', 'um_post_registration_checkma function um_post_registration_pending_hook( $user_id ) { um_fetch_user( $user_id ); - UM()->user()->pending(); + UM()->common()->users()->set_as_pending( $user_id ); } add_action( 'um_post_registration_pending_hook', 'um_post_registration_pending_hook' ); @@ -64,7 +64,8 @@ function um_after_insert_user( $user_id, $args, $form_data = null ) { um_fetch_user( $user_id ); $status = um_user( 'status' ); } - UM()->user()->set_status( $status ); + // UM()->user()->set_status( $status ); + UM()->common()->users()->set_status( $user_id, $status ); // Create user uploads directory. UM()->uploader()->get_upload_user_base_dir( $user_id, true ); diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index 2ff9e293..c696a411 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -42,7 +42,7 @@ function um_admin_user_actions_hook( $actions, $user_id ) { } if ( 'inactive' === $account_status ) { - $actions['um_reenable'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); + $actions['um_reactivate'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); } } diff --git a/includes/um-deprecated-hooks.php b/includes/um-deprecated-hooks.php index 86a01327..0a0fa5c7 100644 --- a/includes/um-deprecated-hooks.php +++ b/includes/um-deprecated-hooks.php @@ -45,3 +45,23 @@ if ( ! defined( 'ABSPATH' ) ) { * } * add_filter( 'um_language_file', 'my_um_language_file' ); */ + +/** + * Fires after user status changed. + * + * @param {int} $user_id User ID. + * + * @since 1.3.x + * @depecated 2.8.7 use action hook `um_after_user_status_is_changed` instead. + * @hook um_after_user_status_is_changed_hook + */ + +/** + * Fires just before User status is changed. + * + * @since 1.3.x + * @depecated 2.8.7 use action hook `um_before_user_status_is_set` instead. + * @hook um_when_status_is_set + * + * @param {int} $user_id User ID. Since 2.0 + */ diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index b4179d30..280b3714 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -1579,7 +1579,7 @@ function um_can_view_field( $data ) { /** * Checks if user can view profile - * + * @todo make the function review. Maybe rewrite it. * @param int $user_id * * @return bool diff --git a/ultimate-member.php b/ultimate-member.php index ea2c7aa5..c24ef586 100644 --- a/ultimate-member.php +++ b/ultimate-member.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: 2.8.7-alpha + * Version: 2.8.7 * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * Text Domain: ultimate-member From 33bc4846293e8180e55c7176972974430f2e041f Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Sep 2024 13:18:48 +0300 Subject: [PATCH 16/97] * Admin Users bulk-actions * Admin single user actions * Frontend single user action --- assets/css/admin/users.css | 33 +++ assets/css/admin/users.min.css | 2 +- assets/css/admin/users.sass | 23 +++ assets/js/admin/block-restrictions.min.js | 2 +- assets/js/admin/security.min.js | 2 +- assets/js/um-gdpr.min.js | 2 +- assets/js/um-scripts.js | 4 +- assets/js/um-scripts.min.js | 2 +- assets/libs/raty/um-raty.min.js | 2 +- includes/admin/class-actions-listener.php | 160 ++++++++++++++ includes/admin/class-admin.php | 78 ++----- includes/admin/class-users-columns.php | 113 +++++++++- includes/admin/core/class-admin-notices.php | 3 - includes/admin/core/class-admin-users.php | 170 --------------- includes/class-init.php | 2 +- includes/common/class-users.php | 82 ++++++-- includes/core/class-member-directory.php | 45 ++-- includes/core/class-rewrite.php | 4 +- includes/core/class-user.php | 49 +---- includes/core/um-actions-core.php | 161 --------------- includes/core/um-filters-user.php | 55 ----- includes/frontend/class-actions-listener.php | 207 +++++++++++++++++++ includes/frontend/class-init.php | 40 ++++ includes/frontend/class-user-profile.php | 69 +++++++ includes/frontend/class-users.php | 81 ++++++++ includes/um-deprecated-hooks.php | 30 +++ 26 files changed, 858 insertions(+), 563 deletions(-) create mode 100644 includes/admin/class-actions-listener.php delete mode 100644 includes/admin/core/class-admin-users.php delete mode 100644 includes/core/um-actions-core.php create mode 100644 includes/frontend/class-actions-listener.php create mode 100644 includes/frontend/class-user-profile.php create mode 100644 includes/frontend/class-users.php diff --git a/assets/css/admin/users.css b/assets/css/admin/users.css index bb7b01fc..f4d527c3 100644 --- a/assets/css/admin/users.css +++ b/assets/css/admin/users.css @@ -1,3 +1,36 @@ +.um-admin.users-php .um_account_status { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; +} +.um-admin.users-php .um_account_status span { + margin: 0 0 2px 0; + padding: 0; +} +.um-admin.users-php .um_account_status ul { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: wrap; + column-gap: 4px; + row-gap: 0; + margin: 0 0 4px 0; + padding: 0; +} +.um-admin.users-php .um_account_status ul li { + margin: 0; + padding: 0; +} +.um-admin.users-php .um_account_status ul li a.um-set-status-rejected, .um-admin.users-php .um_account_status ul li a.um-deactivate-user { + color: #b32d2e; +} +.um-admin.users-php .um_account_status ul li a.um-set-status-rejected:active, .um-admin.users-php .um_account_status ul li a.um-set-status-rejected:hover, .um-admin.users-php .um_account_status ul li a.um-deactivate-user:active, .um-admin.users-php .um_account_status ul li a.um-deactivate-user:hover { + color: #b32d2e; +} + .um-admin.users-php .subsubsub li.subsep { display: block; visibility: hidden; diff --git a/assets/css/admin/users.min.css b/assets/css/admin/users.min.css index eb6d1dc7..1efe0289 100644 --- a/assets/css/admin/users.min.css +++ b/assets/css/admin/users.min.css @@ -1 +1 @@ -.um-admin.users-php .subsubsub li.subsep{display:block;visibility:hidden;height:0}.um-admin-modal .um-admin-infobox label{font-weight:700;display:block;color:#333;cursor:default}.um-admin-modal .um-admin-infobox p{color:#666;padding-top:15px}.um-admin-modal .um-admin-infobox>p:not(:first-child){border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>p:first-child{margin-top:0;padding-top:0}.um-admin-modal .um-admin-infobox>.um-row>p{border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>.um-row>p:last-child{margin-bottom:0}#UM_preview_registration .um-admin-modal-foot{display:none} \ No newline at end of file +.um-admin.users-php .um_account_status{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap}.um-admin.users-php .um_account_status span{margin:0 0 2px 0;padding:0}.um-admin.users-php .um_account_status ul{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;column-gap:4px;row-gap:0;margin:0 0 4px 0;padding:0}.um-admin.users-php .um_account_status ul li{margin:0;padding:0}.um-admin.users-php .um_account_status ul li a.um-deactivate-user,.um-admin.users-php .um_account_status ul li a.um-set-status-rejected{color:#b32d2e}.um-admin.users-php .um_account_status ul li a.um-deactivate-user:active,.um-admin.users-php .um_account_status ul li a.um-deactivate-user:hover,.um-admin.users-php .um_account_status ul li a.um-set-status-rejected:active,.um-admin.users-php .um_account_status ul li a.um-set-status-rejected:hover{color:#b32d2e}.um-admin.users-php .subsubsub li.subsep{display:block;visibility:hidden;height:0}.um-admin-modal .um-admin-infobox label{font-weight:700;display:block;color:#333;cursor:default}.um-admin-modal .um-admin-infobox p{color:#666;padding-top:15px}.um-admin-modal .um-admin-infobox>p:not(:first-child){border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>p:first-child{margin-top:0;padding-top:0}.um-admin-modal .um-admin-infobox>.um-row>p{border-top:1px solid #e5e5e5}.um-admin-modal .um-admin-infobox>.um-row>p:last-child{margin-bottom:0}#UM_preview_registration .um-admin-modal-foot{display:none} \ No newline at end of file diff --git a/assets/css/admin/users.sass b/assets/css/admin/users.sass index fe61d28f..09b3756e 100644 --- a/assets/css/admin/users.sass +++ b/assets/css/admin/users.sass @@ -1,5 +1,28 @@ @import "selectors" +@import "mixins" +.#{$prefix}admin.users-php + .um_account_status + +flex( column, flex-start, stretch, nowrap ) + span + margin: 0 0 2px 0 + padding: 0 + ul + +flex( row, flex-start, baseline, wrap ) + column-gap: 4px + row-gap: 0 + margin: 0 0 4px 0 + padding: 0 + li + margin: 0 + padding: 0 + a + &.um-set-status-rejected, + &.um-deactivate-user + color: #b32d2e + &:active, + &:hover + color: #b32d2e .#{$prefix}admin.users-php .subsubsub li.subsep diff --git a/assets/js/admin/block-restrictions.min.js b/assets/js/admin/block-restrictions.min.js index 50daef62..203ca795 100644 --- a/assets/js/admin/block-restrictions.min.js +++ b/assets/js/admin/block-restrictions.min.js @@ -1 +1 @@ -"use strict";var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction); \ No newline at end of file +var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction); \ No newline at end of file diff --git a/assets/js/admin/security.min.js b/assets/js/admin/security.min.js index 680722e6..1fc8d38c 100644 --- a/assets/js/admin/security.min.js +++ b/assets/js/admin/security.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){const n=jQuery(".um-secure-scan-results"),t=jQuery(".um-secure-scan-content"),e=jQuery("input[data-field_id^='banned_capabilities']");var c={init:function(){n.css({"margin-top":"10px",padding:"10px","padding-bottom":"10px","background-color":"#fff",display:"block","max-height":"200px",height:"500px","overflow-y":"scroll"}),t.on("click",function(e){c.effect(),e.preventDefault(),jQuery(this).prop("disabled",!0),n.empty(),c.log(wp.i18n.__("Scanning site..","ultimate-member")),c.ajax("")}),e.on("change",function(){t.after(' '+wp.i18n.__("You can start the scan now but you must save the settings to apply the selected capabilities after the scan is complete.","ultimate-member")+""),e.off("change")})},ajax:function(e){let a=[];n.parents(".um-form-table").find('input[type="checkbox"][data-field_id^="banned_capabilities_"]:checked').each(function(){a.push(jQuery(this).data("field_id").replace("banned_capabilities_",""))});e={nonce:um_admin_scripts.nonce,capabilities:a,last_scanned_capability:e};wp.ajax.send("um_secure_scan_affected_users",{data:e,success:function(e){e.completed?e.completed&&(n.empty(),c.log(e.recommendations),n.find(".current").removeClass("current"),t.prop("disabled",!1)):(c.ajax(e.last_scanned_capability),c.log(e.message))}})},log:function(e){n.find(".current").removeClass("current"),n.append(''+e+"
")},effect:function(){setInterval(function(){n.find(".current").fadeTo(100,.1).fadeTo(200,1)},1e3)}};c.init()}); \ No newline at end of file +jQuery(document).ready(function(){let t=jQuery(".um-secure-scan-results"),n=jQuery(".um-secure-scan-content"),e=jQuery("input[data-field_id^='banned_capabilities']");var c={init:function(){t.css({"margin-top":"10px",padding:"10px","padding-bottom":"10px","background-color":"#fff",display:"block","max-height":"200px",height:"500px","overflow-y":"scroll"}),n.on("click",function(e){c.effect(),e.preventDefault(),jQuery(this).prop("disabled",!0),t.empty(),c.log(wp.i18n.__("Scanning site..","ultimate-member")),c.ajax("")}),e.on("change",function(){n.after(' '+wp.i18n.__("You can start the scan now but you must save the settings to apply the selected capabilities after the scan is complete.","ultimate-member")+""),e.off("change")})},ajax:function(e){let a=[];t.parents(".um-form-table").find('input[type="checkbox"][data-field_id^="banned_capabilities_"]:checked').each(function(){a.push(jQuery(this).data("field_id").replace("banned_capabilities_",""))});e={nonce:um_admin_scripts.nonce,capabilities:a,last_scanned_capability:e};wp.ajax.send("um_secure_scan_affected_users",{data:e,success:function(e){e.completed?e.completed&&(t.empty(),c.log(e.recommendations),t.find(".current").removeClass("current"),n.prop("disabled",!1)):(c.ajax(e.last_scanned_capability),c.log(e.message))}})},log:function(e){t.find(".current").removeClass("current"),t.append(''+e+"
")},effect:function(){setInterval(function(){t.find(".current").fadeTo(100,.1).fadeTo(200,1)},1e3)}};c.init()}); \ No newline at end of file diff --git a/assets/js/um-gdpr.min.js b/assets/js/um-gdpr.min.js index 98f5ff88..76470131 100644 --- a/assets/js/um-gdpr.min.js +++ b/assets/js/um-gdpr.min.js @@ -1 +1 @@ -!function(){"use strict";jQuery(document).on("click","a.um-toggle-gdpr",function(e){var e=jQuery(e.currentTarget),t=e.closest(".um-field-area"),g=t.find(".um-gdpr-content");g.is(":visible")?(t.find("a.um-toggle-gdpr").text(e.data("toggle-show")),g.hide().find("a.um-toggle-gdpr").remove(),e.length&&e.get(0).scrollIntoView()):(t.find("a.um-toggle-gdpr").text(e.data("toggle-hide")),g.show().prepend(e.clone()))})}(); \ No newline at end of file +jQuery(document).on("click","a.um-toggle-gdpr",function(e){var e=jQuery(e.currentTarget),t=e.closest(".um-field-area"),g=t.find(".um-gdpr-content");g.is(":visible")?(t.find("a.um-toggle-gdpr").text(e.data("toggle-show")),g.hide().find("a.um-toggle-gdpr").remove(),e.length&&e.get(0).scrollIntoView()):(t.find("a.um-toggle-gdpr").text(e.data("toggle-hide")),g.show().prepend(e.clone()))}); \ No newline at end of file diff --git a/assets/js/um-scripts.js b/assets/js/um-scripts.js index a14ddb83..0e005ffe 100644 --- a/assets/js/um-scripts.js +++ b/assets/js/um-scripts.js @@ -417,7 +417,7 @@ jQuery(document).ready(function() { e.preventDefault(); var hook = jQuery(this).data('hook'); var user_id = jQuery(this).data('user_id'); - var arguments = jQuery(this).data('arguments'); + var args = jQuery(this).data('args'); if ( jQuery(this).data('js-remove') ){ jQuery(this).parents('.'+jQuery(this).data('js-remove')).fadeOut('fast'); @@ -430,7 +430,7 @@ jQuery(document).ready(function() { action: 'um_muted_action', hook: hook, user_id: user_id, - arguments: arguments, + arguments: args, nonce: um_scripts.nonce }, success: function(data){ diff --git a/assets/js/um-scripts.min.js b/assets/js/um-scripts.min.js index 40e412d4..087cfa13 100644 --- a/assets/js/um-scripts.min.js +++ b/assets/js/um-scripts.min.js @@ -1 +1 @@ -function um_sanitize_value(e,t){var a=document.createElement("div"),e=(a.innerText=e,a.innerHTML);return t&&jQuery(t).val(e),e}function um_unsanitize_value(e){var t=document.createElement("textarea");return t.innerHTML=e,0===t.childNodes.length?"":t.childNodes[0].nodeValue}jQuery(document).ready(function(){function n(e){var a=jQuery(e.currentTarget),e=a.find(":selected");1'),a.find(".um-single-image-preview").removeAttr("style").hide(),a.find(".ajax-upload-dragdrop").show(),a.find(".um-modal-btn.um-finish-upload").addClass("disabled"),um_modal_responsive()}}):(a=jQuery(this).parents(".um-field"),n=a.data("mode"),i=a.find(".um-single-image-preview img").attr("src"),e=a.find('input[type="hidden"]#'+a.data("key")+"-"+jQuery(this).parents("form").find('input[type="hidden"][name="form_id"]').val()).val(),r={data:{mode:n,filename:e,src:i,nonce:um_scripts.nonce},success:function(){a.find(".um-single-image-preview img").replaceWith(''),a.find(".um-single-image-preview").removeAttr("style").hide(),a.find(".um-btn-auto-width").html(a.data("upload-label")),a.find('input[type="hidden"]').val("empty_file")}},"register"!==n&&(r.data.user_id=jQuery(this).parents("form").find("#user_id").val())),wp.ajax.send("um_remove_file",r)}),jQuery(document.body).on("click",".um-single-file-preview a.cancel",function(e){e.preventDefault();let t=!1;0'),a.find(".um-single-image-preview").removeAttr("style").hide(),a.find(".ajax-upload-dragdrop").show(),a.find(".um-modal-btn.um-finish-upload").addClass("disabled"),um_modal_responsive()}}):(a=jQuery(this).parents(".um-field"),n=a.data("mode"),i=a.find(".um-single-image-preview img").attr("src"),e=a.find('input[type="hidden"]#'+a.data("key")+"-"+jQuery(this).parents("form").find('input[type="hidden"][name="form_id"]').val()).val(),r={data:{mode:n,filename:e,src:i,nonce:um_scripts.nonce},success:function(){a.find(".um-single-image-preview img").replaceWith(''),a.find(".um-single-image-preview").removeAttr("style").hide(),a.find(".um-btn-auto-width").html(a.data("upload-label")),a.find('input[type="hidden"]').val("empty_file")}},"register"!==n&&(r.data.user_id=jQuery(this).parents("form").find("#user_id").val())),wp.ajax.send("um_remove_file",r)}),jQuery(document.body).on("click",".um-single-file-preview a.cancel",function(e){e.preventDefault();let t=!1;0",{name:this.opt.scoreName,type:"hidden"}).appendTo(this)},_createCancel:function(){var t=this.opt.path+this.opt.cancelOff,e=i("<"+this.opt.starType+" />",{title:this.opt.cancelHint,class:this.opt.cancelClass});"img"===this.opt.starType?e.attr({src:t,alt:"x"}):e.attr("data-alt","x").addClass(t),"left"===this.opt.cancelPlace?this.self.prepend(" ").prepend(e):this.self.append(" ").append(e),this.cancel=e},_createScore:function(){var t=i(this.opt.targetScore);this.score=t.length?t:r._buildScoreField.call(this)},_createStars:function(){for(var t=1;t<=this.opt.number;t++){var e=r._nameForIndex.call(this,t),e={alt:t,src:this.opt.path+this.opt[e]};(e="img"!==this.opt.starType?{"data-alt":t,class:e.src}:e).title=r._getHint.call(this,t),i("<"+this.opt.starType+" />",e).appendTo(this),this.opt.space&&this.self.append(te?(s=this.opt.iconRange[e],i=r._getRangeIcon.call(this,s,n),a<=s.range&&r._setIcon.call(this,o,i),a===s.range&&e++):(i=this.opt[n?"starOn":"starOff"],r._setIcon.call(this,o,i))}},_getRangeIcon:function(t,e){return e?t.on||this.opt.starOn:t.off||this.opt.starOff},_getScoreByPosition:function(t,e){var a,s=parseInt(e.alt||e.getAttribute("data-alt"),10);return this.opt.half&&(a=r._getSize.call(this),t=parseFloat((t.pageX-i(e).offset().left)/a),s=this.opt.precision?s-1+t:s-1+(.5=t?"starOn":"starOff"},_roundStars:function(t){var e,a=(t%1).toFixed(2);a>this.opt.round.down&&(e="starOn",this.opt.halfShow&&a=e.number&&(t=e.number-1,a=10);e=r._getSize.call(this)/10,t=i(this.stars[t]),e=t.offset().left+e*parseInt(a,10),a=i.Event("mousemove",{pageX:e});t.trigger(a)})},readOnly:function(e){return this.each(function(){var t=i(this);t.data("readonly")!==e&&((e?(t.off(".um_raty").children("img").off(".um_raty"),r._lock):(r._binds.call(this),r._unlock)).call(this),t.data("readonly",e))})},reload:function(){return r.set.call(this,{})},score:function(){var t=i(this);return arguments.length?r.setScore.apply(t,arguments):r.getScore.call(t)},set:function(a){return this.each(function(){var t=i(this),e=t.data("options"),e=i.extend({},e,a);t.um_raty(e)})},setScore:function(t){return this.each(function(){!0!==i(this).data("readonly")&&(r._apply.call(this,t),r._target.call(this,t))})}};i.fn.um_raty=function(t){return r[t]?r[t].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof t&&t?void i.error("Method "+t+" does not exist!"):r.init.apply(this,arguments)},i.fn.um_raty.defaults={cancel:!1,cancelClass:"raty-cancel",cancelHint:wp.i18n.__("Cancel this rating!","ultimate-member"),cancelOff:"cancel-off.png",cancelOn:"cancel-on.png",cancelPlace:"left",click:void 0,half:!1,halfShow:!0,hints:["bad","poor","regular","good","gorgeous"],iconRange:void 0,mouseout:void 0,mouseover:void 0,noRatedMsg:wp.i18n.__("Not rated yet!","ultimate-member"),number:5,numberMax:20,path:void 0,precision:!1,readOnly:!1,round:{down:.25,full:.6,up:.76},score:void 0,scoreName:"score",single:!1,space:!0,starHalf:"star-half.png",starOff:"star-off.png",starOn:"star-on.png",starType:"img",target:void 0,targetFormat:"{score}",targetKeep:!1,targetScore:void 0,targetText:"",targetType:"hint"}}(jQuery); \ No newline at end of file +!function(i){var r={init:function(t){return this.each(function(){this.self=i(this),r.destroy.call(this.self),this.opt=i.extend(!0,{},i.fn.um_raty.defaults,t),r._adjustCallback.call(this),r._adjustNumber.call(this),"img"!==this.opt.starType&&r._adjustStarType.call(this),r._adjustPath.call(this),r._createStars.call(this),this.opt.cancel&&r._createCancel.call(this),this.opt.precision&&r._adjustPrecision.call(this),r._createScore.call(this),r._apply.call(this,this.opt.score),r._target.call(this,this.opt.score),(this.opt.readOnly?r._lock:(this.style.cursor="pointer",r._binds)).call(this),this.self.data("options",this.opt)})},_adjustCallback:function(){for(var t=["number","readOnly","score","scoreName","target"],e=0;e",{name:this.opt.scoreName,type:"hidden"}).appendTo(this)},_createCancel:function(){var t=this.opt.path+this.opt.cancelOff,e=i("<"+this.opt.starType+" />",{title:this.opt.cancelHint,class:this.opt.cancelClass});"img"===this.opt.starType?e.attr({src:t,alt:"x"}):e.attr("data-alt","x").addClass(t),"left"===this.opt.cancelPlace?this.self.prepend(" ").prepend(e):this.self.append(" ").append(e),this.cancel=e},_createScore:function(){var t=i(this.opt.targetScore);this.score=t.length?t:r._buildScoreField.call(this)},_createStars:function(){for(var t=1;t<=this.opt.number;t++){var e=r._nameForIndex.call(this,t),e={alt:t,src:this.opt.path+this.opt[e]};(e="img"!==this.opt.starType?{"data-alt":t,class:e.src}:e).title=r._getHint.call(this,t),i("<"+this.opt.starType+" />",e).appendTo(this),this.opt.space&&this.self.append(te?(s=this.opt.iconRange[e],i=r._getRangeIcon.call(this,s,n),a<=s.range&&r._setIcon.call(this,o,i),a===s.range&&e++):(i=this.opt[n?"starOn":"starOff"],r._setIcon.call(this,o,i))}},_getRangeIcon:function(t,e){return e?t.on||this.opt.starOn:t.off||this.opt.starOff},_getScoreByPosition:function(t,e){var a,s=parseInt(e.alt||e.getAttribute("data-alt"),10);return this.opt.half&&(a=r._getSize.call(this),t=parseFloat((t.pageX-i(e).offset().left)/a),s=this.opt.precision?s-1+t:s-1+(.5=t?"starOn":"starOff"},_roundStars:function(t){var e,a=(t%1).toFixed(2);a>this.opt.round.down&&(e="starOn",this.opt.halfShow&&a=e.number&&(t=e.number-1,a=10);e=r._getSize.call(this)/10,t=i(this.stars[t]),e=t.offset().left+e*parseInt(a,10),a=i.Event("mousemove",{pageX:e});t.trigger(a)})},readOnly:function(e){return this.each(function(){var t=i(this);t.data("readonly")!==e&&((e?(t.off(".um_raty").children("img").off(".um_raty"),r._lock):(r._binds.call(this),r._unlock)).call(this),t.data("readonly",e))})},reload:function(){return r.set.call(this,{})},score:function(){var t=i(this);return arguments.length?r.setScore.apply(t,arguments):r.getScore.call(t)},set:function(a){return this.each(function(){var t=i(this),e=t.data("options"),e=i.extend({},e,a);t.um_raty(e)})},setScore:function(t){return this.each(function(){!0!==i(this).data("readonly")&&(r._apply.call(this,t),r._target.call(this,t))})}};i.fn.um_raty=function(t){return r[t]?r[t].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof t&&t?void i.error("Method "+t+" does not exist!"):r.init.apply(this,arguments)},i.fn.um_raty.defaults={cancel:!1,cancelClass:"raty-cancel",cancelHint:wp.i18n.__("Cancel this rating!","ultimate-member"),cancelOff:"cancel-off.png",cancelOn:"cancel-on.png",cancelPlace:"left",click:void 0,half:!1,halfShow:!0,hints:["bad","poor","regular","good","gorgeous"],iconRange:void 0,mouseout:void 0,mouseover:void 0,noRatedMsg:wp.i18n.__("Not rated yet!","ultimate-member"),number:5,numberMax:20,path:void 0,precision:!1,readOnly:!1,round:{down:.25,full:.6,up:.76},score:void 0,scoreName:"score",single:!1,space:!0,starHalf:"star-half.png",starOff:"star-off.png",starOn:"star-on.png",starType:"img",target:void 0,targetFormat:"{score}",targetKeep:!1,targetScore:void 0,targetText:"",targetType:"hint"}}(jQuery); \ No newline at end of file diff --git a/includes/admin/class-actions-listener.php b/includes/admin/class-actions-listener.php new file mode 100644 index 00000000..81442364 --- /dev/null +++ b/includes/admin/class-actions-listener.php @@ -0,0 +1,160 @@ +common()->users()->can_current_user_edit_user( $user_id ) ) { + $result = UM()->common()->users()->approve( $user_id ); + if ( $result ) { + $redirect = add_query_arg( array( 'update' => 'um_approved', 'approved_count' => 1 ), $redirect ); + } + } + + wp_safe_redirect( $redirect ); + exit; + case 'reactivate_user': + if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) { + die( esc_html__( 'Invalid user ID', 'ultimate-member' ) ); + } + + $user_id = absint( $_REQUEST['uid'] ); + + check_admin_referer( "reactivate_user{$user_id}" ); + + $redirect = wp_get_referer(); + if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + $result = UM()->common()->users()->reactivate( $user_id ); + if ( $result ) { + $redirect = add_query_arg( array( 'update' => 'um_reactivated', 'reactivated_count' => 1 ), $redirect ); + } + } + wp_safe_redirect( $redirect ); + exit; + case 'put_user_as_pending': + if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) { + die( esc_html__( 'Invalid user ID', 'ultimate-member' ) ); + } + + $user_id = absint( $_REQUEST['uid'] ); + + check_admin_referer( "put_user_as_pending{$user_id}" ); + + $redirect = wp_get_referer(); + if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + $result = UM()->common()->users()->set_as_pending( $user_id ); + if ( $result ) { + $redirect = add_query_arg( array( 'update' => 'um_pending', 'pending_count' => 1 ), $redirect ); + } + } + wp_safe_redirect( $redirect ); + exit; + case 'resend_user_activation': + if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) { + die( esc_html__( 'Invalid user ID', 'ultimate-member' ) ); + } + + $user_id = absint( $_REQUEST['uid'] ); + + check_admin_referer( "resend_user_activation{$user_id}" ); + + $redirect = wp_get_referer(); + if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + $result = UM()->common()->users()->send_activation( $user_id ); + if ( $result ) { + $redirect = add_query_arg( array( 'update' => 'um_resend_activation', 'resend_activation_count' => 1 ), $redirect ); + } + } + wp_safe_redirect( $redirect ); + exit; + case 'reject_user': + if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) { + die( esc_html__( 'Invalid user ID', 'ultimate-member' ) ); + } + + $user_id = absint( $_REQUEST['uid'] ); + + check_admin_referer( "reject_user{$user_id}" ); + + $redirect = wp_get_referer(); + if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + $result = UM()->common()->users()->reject( $user_id ); + if ( $result ) { + $redirect = add_query_arg( array( 'update' => 'um_rejected', 'rejected_count' => 1 ), $redirect ); + } + } + wp_safe_redirect( $redirect ); + exit; + case 'deactivate_user': + if ( empty( $_REQUEST['uid'] ) || ! is_numeric( $_REQUEST['uid'] ) ) { + die( esc_html__( 'Invalid user ID', 'ultimate-member' ) ); + } + + $user_id = absint( $_REQUEST['uid'] ); + + check_admin_referer( "deactivate_user{$user_id}" ); + + $redirect = wp_get_referer(); + if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + $result = UM()->common()->users()->deactivate( $user_id ); + if ( $result ) { + $redirect = add_query_arg( array( 'update' => 'um_deactivate', 'deactivated_count' => 1 ), $redirect ); + } + } + wp_safe_redirect( $redirect ); + exit; + } + } + } + + public function extends_individual_nonce_actions( $actions ) { + $actions[] = 'approve_user'; + $actions[] = 'reactivate_user'; + $actions[] = 'put_user_as_pending'; + $actions[] = 'resend_user_activation'; + $actions[] = 'reject_user'; + $actions[] = 'deactivate_user'; + return $actions; + } + } +} diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index 5a3717cd..c34d913c 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -67,7 +67,6 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { add_action( 'um_admin_do_action__purge_temp', array( &$this, 'purge_temp' ) ); add_action( 'um_admin_do_action__manual_upgrades_request', array( &$this, 'manual_upgrades_request' ) ); add_action( 'um_admin_do_action__duplicate_form', array( &$this, 'duplicate_form' ) ); - add_action( 'um_admin_do_action__user_action', array( &$this, 'user_action' ) ); add_action( 'um_admin_do_action__check_templates_version', array( &$this, 'check_templates_version' ) ); add_action( 'um_admin_do_action__install_core_pages', array( &$this, 'install_core_pages' ) ); @@ -79,6 +78,7 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { } public function includes() { + $this->actions_listener(); $this->enqueue(); $this->notices(); $this->secure(); @@ -1841,69 +1841,6 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { exit; } - /** - * Various user actions. - */ - public function user_action() { - if ( ! current_user_can( 'edit_users' ) ) { - die(); - } - if ( ! isset( $_REQUEST['sub'] ) ) { - die(); - } - if ( ! isset( $_REQUEST['user_id'] ) ) { - die(); - } - - um_fetch_user( absint( $_REQUEST['user_id'] ) ); - - $subaction = sanitize_key( $_REQUEST['sub'] ); - - /** - * UM hook - * - * @type action - * @title um_admin_user_action_hook - * @description Action on bulk user subaction - * @input_vars - * [{"var":"$subaction","type":"string","desc":"Bulk Subaction"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_admin_user_action_hook', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_admin_user_action_hook', $subaction ); - /** - * UM hook - * - * @type action - * @title um_admin_user_action_{$subaction}_hook - * @description Action on bulk user subaction - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_admin_user_action_{$subaction}_hook', 'function_name', 10 ); - * @example - * - */ - do_action( "um_admin_user_action_{$subaction}_hook" ); - - um_reset_user(); - - wp_safe_redirect( add_query_arg( 'update', 'um_user_updated', admin_url( '?page=ultimatemember' ) ) ); - exit; - } - /** * Manual check templates versions. */ @@ -1947,7 +1884,6 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { $action = sanitize_key( $_REQUEST['um_adm_action'] ); $individual_nonce_actions = array( - 'user_action', 'duplicate_form', ); $individual_nonce_actions = apply_filters( 'um_adm_action_individual_nonce_actions', $individual_nonce_actions ); @@ -2072,6 +2008,18 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { return $parent_file; } + /** + * @since 2.8.7 + * + * @return Actions_Listener + */ + public function actions_listener() { + if ( empty( UM()->classes['um\admin\actions_listener'] ) ) { + UM()->classes['um\admin\actions_listener'] = new Actions_Listener(); + } + return UM()->classes['um\admin\actions_listener']; + } + /** * @since 2.7.0 * diff --git a/includes/admin/class-users-columns.php b/includes/admin/class-users-columns.php index 57cce403..76989262 100644 --- a/includes/admin/class-users-columns.php +++ b/includes/admin/class-users-columns.php @@ -46,7 +46,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { * @return array */ public function manage_users_columns( $columns ) { - $columns['account_status'] = __( 'Status', 'ultimate-member' ); + $columns['um_account_status'] = __( 'Status', 'ultimate-member' ); return $columns; } @@ -60,10 +60,91 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { * @return string */ public function manage_users_custom_column( $value, $column_name, $user_id ) { - if ( 'account_status' === $column_name ) { - um_fetch_user( $user_id ); - $value = um_user( 'account_status_name' ); - um_reset_user(); + if ( 'um_account_status' !== $column_name ) { + return $value; + } + + $status = UM()->common()->users()->get_status( $user_id, 'formatted' ); + + $status = apply_filters( 'um_users_column_account_status', $status, $user_id ); + + $value = '' . esc_html( $status ) . ''; + + if ( get_current_user_id() === $user_id ) { + return $value; + } + + $row_actions = array(); + if ( UM()->common()->users()->can_be_approved( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'approve_user', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'approve_user' . $user_id ), + ), + admin_url( 'users.php' ) + ); + $row_actions[] = '' . esc_html__( 'Approve', 'ultimate-member' ) . ''; + } + if ( UM()->common()->users()->can_be_reactivated( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'reactivate_user', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'reactivate_user' . $user_id ), + ), + admin_url( 'users.php' ) + ); + $row_actions[] = '' . esc_html__( 'Reactivate', 'ultimate-member' ) . ''; + } + if ( UM()->common()->users()->can_be_set_as_pending( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'put_user_as_pending', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'put_user_as_pending' . $user_id ), + ), + admin_url( 'users.php' ) + ); + $row_actions[] = '' . esc_html__( 'Put as pending', 'ultimate-member' ) . ''; + } + if ( UM()->common()->users()->can_activation_send( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'resend_user_activation', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'resend_user_activation' . $user_id ), + ), + admin_url( 'users.php' ) + ); + $row_actions[] = '' . esc_html__( 'Resend activation email', 'ultimate-member' ) . ''; + } + if ( UM()->common()->users()->can_be_rejected( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'reject_user', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'reject_user' . $user_id ), + ), + admin_url( 'users.php' ) + ); + $row_actions[] = '' . esc_html__( 'Reject', 'ultimate-member' ) . ''; + } + if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'deactivate_user', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'deactivate_user' . $user_id ), + ), + admin_url( 'users.php' ) + ); + $row_actions[] = '' . esc_html__( 'Deactivate', 'ultimate-member' ) . ''; + } + + $row_actions = apply_filters( 'um_users_column_account_status_row_actions', $row_actions, $user_id ); + if ( ! empty( $row_actions ) ) { + $value .= '
  • ' . implode( '
  • |
  • ', $row_actions ) . '
'; } return $value; } @@ -180,7 +261,6 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { * @return array */ private function get_user_bulk_actions() { - // @todo check verified users module for the proper integration. remove old integration way $um_actions = array( 'um_approve_membership' => __( 'Approve Membership', 'ultimate-member' ), 'um_reject_membership' => __( 'Reject Membership', 'ultimate-member' ), @@ -232,6 +312,23 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { return $actions; } + private function get_statuses_filter_options() { + $statuses = UM()->common()->users()->statuses_list(); + /** + * Filters the user statuses added via Ultimate Member plugin. + * + * Note: Statuses format is 'key' => 'title' + * + * @since 2.8.7 + * @hook um_user_statuses_admin_filter_options + * + * @param {array} $statuses User statuses in Ultimate Member environment. + * + * @return {array} User statuses. + */ + return apply_filters( 'um_user_statuses_admin_filter_options', $statuses ); + } + /** * Adds HTML with the filter by the Ultimate Member status. * @@ -250,7 +347,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { // need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions wp_nonce_field( 'um-bulk-users', '_um_wpnonce', false ); - $statuses = UM()->common()->users()->statuses_list(); + $statuses = $this->get_statuses_filter_options(); ?>
@@ -503,7 +600,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { * @param string $uri * @return string */ - private function set_redirect_uri( $uri ) { + public function set_redirect_uri( $uri ) { if ( ! empty( $_REQUEST['s'] ) ) { $uri = add_query_arg( 's', sanitize_text_field( $_REQUEST['s'] ), $uri ); } diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php index b9222e09..94641895 100644 --- a/includes/admin/core/class-admin-notices.php +++ b/includes/admin/core/class-admin-notices.php @@ -490,9 +490,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { case 'um_settings_updated': $messages[0]['content'] = __( 'Settings have been saved successfully.', 'ultimate-member' ); break; - case 'um_user_updated': - $messages[0]['content'] = __( 'User has been updated.', 'ultimate-member' ); - break; case 'um_users_updated': $messages[0]['content'] = __( 'Users have been updated.', 'ultimate-member' ); break; diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php deleted file mode 100644 index 8612c377..00000000 --- a/includes/admin/core/class-admin-users.php +++ /dev/null @@ -1,170 +0,0 @@ - - */ - do_action( "um_admin_custom_hook_{$action}", UM()->user()->id ); - break; - - case 'um_delete': - if ( is_admin() ) { - wp_die( esc_html__( 'This action is not allowed in backend.', 'ultimate-member' ) ); - } - UM()->user()->delete(); - break; - } - } - - /** - * Add UM Bulk actions to Users List Table - * @deprecated 2.8.7 - */ - public function restrict_manage_users() { - ?> -
- - - - - - - -
- - - - roles()->get_priority_user_role( get_current_user_id() ); - $role = get_role( $rolename ); - - if ( empty( $role ) ) { - wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); - } - - if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { - wp_die( esc_html__( 'You do not have enough permissions to do that.', 'ultimate-member' ) ); - } - - check_admin_referer( 'bulk-users' ); - - $users = array_map( 'absint', (array) $_REQUEST['users'] ); - $bulk_action = current( array_filter( $_REQUEST['um_bulk_action'] ) ); - - foreach ( $users as $user_id ) { - UM()->user()->set( $user_id ); - - /** - * UM hook - * - * @type action - * @title um_admin_user_action_hook - * @description Action on bulk user action - * @input_vars - * [{"var":"$bulk_action","type":"string","desc":"Bulk Action"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_admin_user_action_hook{$action}', 'function_name', 10, 1 ); - * @example - * - */ - do_action( 'um_admin_user_action_hook', $bulk_action ); - - /** - * UM hook - * - * @type action - * @title um_admin_user_action_{$bulk_action}_hook - * @description Action on bulk user action - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_admin_user_action_{$bulk_action}_hook', 'function_name', 10 ); - * @example - * - */ - do_action( "um_admin_user_action_{$bulk_action}_hook" ); - } - - $uri = $this->set_redirect_uri( admin_url( 'users.php' ) ); - $uri = add_query_arg( 'update', 'um_users_updated', $uri ); - - wp_safe_redirect( $uri ); - exit; - } - - if ( ! empty( $_REQUEST['um_bulkedit'] ) ) { - $uri = $this->set_redirect_uri( admin_url( 'users.php' ) ); - wp_safe_redirect( $uri ); - exit; - } - } - } -} diff --git a/includes/class-init.php b/includes/class-init.php index 8cd2d914..9c8f811b 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -1451,7 +1451,7 @@ if ( ! class_exists( 'UM' ) ) { require_once 'core/um-actions-form.php'; require_once 'core/um-actions-access.php'; require_once 'core/um-actions-wpadmin.php'; - require_once 'core/um-actions-core.php'; +// require_once 'core/um-actions-core.php'; require_once 'core/um-actions-ajax.php'; require_once 'core/um-actions-login.php'; require_once 'core/um-actions-register.php'; diff --git a/includes/common/class-users.php b/includes/common/class-users.php index e440f621..f8a8b512 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -103,10 +103,10 @@ class Users { public function statuses_list() { $statuses = array( 'approved' => __( 'Approved', 'ultimate-member' ), - 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), + 'awaiting_admin_review' => __( 'Pending administrator review', 'ultimate-member' ), 'awaiting_email_confirmation' => __( 'Waiting email confirmation', 'ultimate-member' ), - 'inactive' => __( 'Inactive', 'ultimate-member' ), - 'rejected' => __( 'Rejected', 'ultimate-member' ), + 'inactive' => __( 'Membership inactive', 'ultimate-member' ), + 'rejected' => __( 'Membership rejected', 'ultimate-member' ), ); /** * Filters the user statuses added via Ultimate Member plugin. @@ -114,13 +114,13 @@ class Users { * Note: Statuses format is 'key' => 'title' * * @since 2.8.7 - * @hook um_admin_get_user_statuses + * @hook um_user_statuses * * @param {array} $statuses User statuses in Ultimate Member environment. * * @return {array} User statuses. */ - return apply_filters( 'um_admin_get_user_statuses', $statuses ); + return apply_filters( 'um_user_statuses', $statuses ); } /** @@ -184,8 +184,18 @@ class Users { * * @return string */ - public function get_status( $user_id ) { - return get_user_meta( $user_id, 'account_status', true ); + public function get_status( $user_id, $format = 'raw' ) { + $status = get_user_meta( $user_id, 'account_status', true ); + if ( 'raw' === $format ) { + return $status; + } + + $all_statuses = $this->statuses_list(); + if ( array_key_exists( $status, $all_statuses ) ) { + return $all_statuses[ $status ]; + } + + return __( 'Undefined', 'ultimate-member' ); } /** @@ -280,9 +290,34 @@ class Users { return get_password_reset_key( $userdata ); } - public function can_activation_send( $user_id ) { + public function can_current_user_edit_user( $user_id ) { $current_user_id = get_current_user_id(); if ( $current_user_id === $user_id ) { + return true; + } + + if ( ! self::user_exists( $user_id ) ) { + return false; + } + + $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); + $role = get_role( $rolename ); + + if ( null === $role ) { + return false; + } + + // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. + if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { + return false; + } + + return true; + } + + public function can_activation_send( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { return false; } @@ -357,7 +392,7 @@ class Users { */ public function can_be_deactivated( $user_id ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id ) { + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { return false; } @@ -440,7 +475,7 @@ class Users { */ public function can_be_rejected( $user_id ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id ) { + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { return false; } @@ -523,7 +558,7 @@ class Users { */ public function can_be_set_as_pending( $user_id ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id ) { + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { return false; } @@ -598,7 +633,7 @@ class Users { */ public function can_be_approved( $user_id ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id ) { + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { return false; } @@ -618,6 +653,27 @@ class Users { return 'approved' !== $status; } + /** + * @param int $user_id + * + * @return bool + */ + public static function user_exists( $user_id ) { + /** + * @var bool[] $search_results + */ + static $search_results = array(); + + if ( array_key_exists( $user_id, $search_results ) ) { + return $search_results[ $user_id ]; + } + + $user = get_userdata( $user_id ); + + $search_results[ $user_id ] = false !== $user; + return $search_results[ $user_id ]; + } + /** * Approve user. * @@ -684,7 +740,7 @@ class Users { */ public function can_be_reactivated( $user_id ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id ) { + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { return false; } diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index d9cdea0e..ea83dffa 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -2589,21 +2589,18 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { return $pagination_data; } - /** * @param int $user_id * * @return array */ - function build_user_actions_list( $user_id ) { - + private function build_user_actions_list( $user_id ) { $actions = array(); if ( ! is_user_logged_in() ) { return $actions; } - if ( get_current_user_id() != $user_id ) { - + if ( get_current_user_id() !== $user_id ) { if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) ) { $actions['um-editprofile'] = array( 'title' => esc_html__( 'Edit Profile', 'ultimate-member' ), @@ -2611,31 +2608,17 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { ); } - /** - * UM hook - * - * @type filter - * @title um_admin_user_actions_hook - * @description Extend admin actions for each user - * @input_vars - * [{"var":"$actions","type":"array","desc":"Actions for user"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $admin_actions = apply_filters( 'um_admin_user_actions_hook', array(), $user_id ); + $admin_actions = UM()->frontend()->users()->get_actions_list( $user_id ); if ( ! empty( $admin_actions ) ) { foreach ( $admin_actions as $id => $arr ) { - $url = add_query_arg( array( 'um_action' => $id, 'uid' => $user_id ), um_get_core_page( 'user' ) ); + $url = add_query_arg( + array( + 'um_action' => $id, + 'uid' => $user_id, + 'nonce' => wp_create_nonce( $id . $user_id ), + ), + um_user_profile_url( $user_id ) + ); $actions[ $id ] = array( 'title' => esc_html( $arr['label'] ), @@ -2645,9 +2628,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { } $actions = apply_filters( 'um_member_directory_users_card_actions', $actions, $user_id ); - } else { - if ( empty( UM()->user()->cannot_edit ) ) { $actions['um-editprofile'] = array( 'title' => esc_html__( 'Edit Profile', 'ultimate-member' ), @@ -2671,15 +2652,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { return $actions; } - /** * @param int $user_id * @param array $directory_data * * @return array */ - function build_user_card_data( $user_id, $directory_data ) { - + public function build_user_card_data( $user_id, $directory_data ) { um_fetch_user( $user_id ); $dropdown_actions = $this->build_user_actions_list( $user_id ); diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php index 13578add..7d238716 100644 --- a/includes/core/class-rewrite.php +++ b/includes/core/class-rewrite.php @@ -234,8 +234,8 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { $user_id = $this->get_user_id_by_user_login_slug(); } - if ( 'user_id' === $permalink_base ) { - $user_id = UM()->user()->user_exists_by_id( um_queried_user() ); + if ( 'user_id' === $permalink_base && UM()->common()->users()::user_exists( um_queried_user() ) ) { + $user_id = um_queried_user(); } if ( 'hash' === $permalink_base ) { diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 0654ef31..68f53dd9 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -1725,28 +1725,7 @@ if ( ! class_exists( 'um\core\User' ) ) { function get_admin_actions() { $items = array(); - /** - * UM hook - * - * @type filter - * @title um_admin_user_actions_hook - * @description Extend admin actions for each user - * @input_vars - * [{"var":"$actions","type":"array","desc":"Actions for user"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $actions = apply_filters( 'um_admin_user_actions_hook', array(), um_profile_id() ); + $actions = UM()->frontend()->users()->get_actions_list( um_profile_id() ); if ( empty( $actions ) ) { return $items; } @@ -1756,10 +1735,9 @@ if ( ! class_exists( 'um\core\User' ) ) { array( 'um_action' => $id, 'uid' => um_profile_id(), + 'nonce' => wp_create_nonce( $id . um_profile_id() ), ) ); - /*$url = add_query_arg( 'um_action', $id ); - $url = add_query_arg( 'uid', um_profile_id(), $url );*/ $items[] = '' . esc_html( $arr['label'] ) . ''; } return $items; @@ -2111,32 +2089,15 @@ if ( ! class_exists( 'um\core\User' ) ) { /** * This method checks if a user exists or not in your site based on the user ID. * - * @usage user()->user_exists_by_id( $user_id ); ?> + * @deprecated 2.8.7 * * @param int $user_id A user ID must be passed to check if the user exists * * @return bool|int - * - * @example Basic Usage - - user()->user_exists_by_id( 15 ); - if ( $boolean ) { - // That user exists - } - - ?> - - * */ public function user_exists_by_id( $user_id ) { - $aux = get_userdata( absint( $user_id ) ); - if ( $aux == false ) { - return false; - } else { - return $user_id; - } + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()::user_exists' ); + return UM()->common()->users()::user_exists( $user_id ) ? $user_id : false; } /** diff --git a/includes/core/um-actions-core.php b/includes/core/um-actions-core.php deleted file mode 100644 index f0e0ef08..00000000 --- a/includes/core/um-actions-core.php +++ /dev/null @@ -1,161 +0,0 @@ -user()->user_exists_by_id( $uid ) ) { - return; - } - - if ( ! empty( $uid ) && is_super_admin( $uid ) ) { - wp_die( esc_html__( 'Super administrators can not be modified.', 'ultimate-member' ) ); - } - - $role = get_role( UM()->roles()->get_priority_user_role( get_current_user_id() ) ); - $can_edit_users = current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); - - switch ( $action ) { - default: - /** - * UM hook - * - * @type action - * @title um_action_user_request_hook - * @description Integration for user actions - * @input_vars - * [{"var":"$action","type":"string","desc":"Action for user"}, - * {"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_action_user_request_hook', 'function_name', 10, 2 ); - * @example - * - */ - do_action( 'um_action_user_request_hook', $action, $uid ); - break; - - case 'edit': - UM()->fields()->editing = true; - if ( ! um_is_myprofile() ) { - if ( ! UM()->roles()->um_current_user_can( 'edit', um_profile_id() ) ) { - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - } - } else { - if ( ! um_can_edit_my_profile() ) { - $url = um_edit_my_profile_cancel_uri(); - exit( wp_redirect( $url ) ); - } - } - break; - - case 'um_switch_user': - if ( ! current_user_can( 'manage_options' ) ) { - return; - } - UM()->user()->auto_login( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_reject_membership': - if ( ! $can_edit_users ) { - wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - UM()->common()->users()->reject( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_approve_membership': - if ( ! $can_edit_users ) { - wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - - UM()->common()->users()->approve( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_reactivate': - if ( ! $can_edit_users ) { - wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - - UM()->common()->users()->reactivate( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_put_as_pending': - if ( ! $can_edit_users ) { - wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - UM()->common()->users()->set_as_pending( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_resend_activation': - if ( ! $can_edit_users ) { - wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - UM()->common()->users()->send_activation( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_deactivate': - if ( ! $can_edit_users ) { - wp_die( esc_html__( 'You do not have permission to make this action.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - UM()->common()->users()->deactivate( $uid ); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - case 'um_delete': - if ( ! UM()->roles()->um_current_user_can( 'delete', $uid ) ) { - wp_die( esc_html__( 'You do not have permission to delete this user.', 'ultimate-member' ) ); - } - - um_fetch_user( $uid ); - UM()->user()->delete(); - exit( wp_redirect( UM()->permalinks()->get_current_url( true ) ) ); - break; - - } -} -add_action( 'template_redirect', 'um_action_request_process', 10000 ); diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index c696a411..4d0eb375 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -3,61 +3,6 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -/** - * Main admin user actions. - * - * @param array $actions - * @param int $user_id - * - * @return array - */ -function um_admin_user_actions_hook( $actions, $user_id ) { - um_fetch_user( $user_id ); - - $role = get_role( UM()->roles()->get_priority_user_role( get_current_user_id() ) ); - - $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); - if ( $can_edit_users ) { - $account_status = um_user( 'account_status' ); - - if ( 'awaiting_admin_review' === $account_status ) { - $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); - $actions['um_reject_membership'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); - } - - if ( 'rejected' === $account_status ) { - $actions['um_approve_membership'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); - } - - if ( 'approved' === $account_status ) { - $actions['um_put_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) ); - } - - if ( 'awaiting_email_confirmation' === $account_status ) { - $actions['um_resend_activation'] = array( 'label' => __( 'Resend Activation Email', 'ultimate-member' ) ); - } - - if ( 'inactive' !== $account_status ) { - $actions['um_deactivate'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) ); - } - - if ( 'inactive' === $account_status ) { - $actions['um_reactivate'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); - } - } - - if ( UM()->roles()->um_current_user_can( 'delete', $user_id ) ) { - $actions['um_delete'] = array( 'label' => __( 'Delete this user', 'ultimate-member' ) ); - } - - if ( current_user_can( 'manage_options' ) && ! is_super_admin( $user_id ) ) { - $actions['um_switch_user'] = array( 'label' => __( 'Login as this user', 'ultimate-member' ) ); - } - - return $actions; -} -add_filter( 'um_admin_user_actions_hook', 'um_admin_user_actions_hook', 10, 2 ); - /** * Filter user basename. * diff --git a/includes/frontend/class-actions-listener.php b/includes/frontend/class-actions-listener.php new file mode 100644 index 00000000..467d0a6f --- /dev/null +++ b/includes/frontend/class-actions-listener.php @@ -0,0 +1,207 @@ +common()->users()::user_exists( $user_id ) ) { + return; + } + + if ( get_current_user_id() === $user_id ) { + return; + } + + if ( ! empty( $user_id ) && is_super_admin( $user_id ) ) { + wp_die( esc_html__( 'Super administrators can not be modified.', 'ultimate-member' ) ); + } + + $action = sanitize_key( $_REQUEST['um_action'] ); + // phpcs:enable WordPress.Security.NonceVerification -- there is nonce verification below for each case + switch ( $action ) { + case 'approve_user': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "approve_user{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); + } + + $result = UM()->common()->users()->approve( $user_id ); + if ( ! $result ) { + wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); + } + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'reactivate_user': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "reactivate_user{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); + } + + $result = UM()->common()->users()->reactivate( $user_id ); + if ( ! $result ) { + wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); + } + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'put_user_as_pending': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "put_user_as_pending{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); + } + + $result = UM()->common()->users()->set_as_pending( $user_id ); + if ( ! $result ) { + wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); + } + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'resend_user_activation': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "resend_user_activation{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); + } + + $result = UM()->common()->users()->send_activation( $user_id ); + if ( ! $result ) { + wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); + } + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'reject_user': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "reject_user{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); + } + + $result = UM()->common()->users()->reject( $user_id ); + if ( ! $result ) { + wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); + } + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'deactivate_user': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "deactivate_user{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); + } + + $result = UM()->common()->users()->deactivate( $user_id ); + if ( ! $result ) { + wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); + } + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'switch_user': + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "switch_user{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + UM()->user()->auto_login( $user_id ); + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + case 'delete': + if ( ! wp_verify_nonce( $_REQUEST['nonce'], "delete{$user_id}" ) ) { + wp_die( esc_html__( 'The link you followed has expired.', 'ultimate-member' ) ); + } + + if ( ! UM()->roles()->um_current_user_can( 'delete', $user_id ) ) { + wp_die( esc_html__( 'You do not have permission to delete this user.', 'ultimate-member' ) ); + } + + um_fetch_user( $user_id ); + UM()->user()->delete(); + + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + default: + /** + * UM hook + * + * @type action + * @title um_action_user_request_hook + * @description Integration for user actions + * @input_vars + * [{"var":"$action","type":"string","desc":"Action for user"}, + * {"var":"$user_id","type":"int","desc":"User ID"}] + * @change_log + * ["Since: 2.0"] + * @usage add_action( 'um_action_user_request_hook', 'function_name', 10, 2 ); + * @example + * + */ + do_action( 'um_action_user_request_hook', $action, $user_id ); + break; + } + } + } +} diff --git a/includes/frontend/class-init.php b/includes/frontend/class-init.php index b34cd983..1d3d460f 100644 --- a/includes/frontend/class-init.php +++ b/includes/frontend/class-init.php @@ -20,9 +20,25 @@ if ( ! class_exists( 'um\frontend\Init' ) ) { * @used-by \UM::includes() */ public function includes() { + $this->actions_listener(); $this->enqueue(); $this->modal(); $this->secure(); + $this->user_profile(); + $this->users(); + } + + /** + * @since 2.8.7 + * + * @return Actions_Listener + */ + public function actions_listener() { + if ( empty( UM()->classes['um\frontend\actions_listener'] ) ) { + UM()->classes['um\frontend\actions_listener'] = new Actions_Listener(); + } + + return UM()->classes['um\frontend\actions_listener']; } /** @@ -62,5 +78,29 @@ if ( ! class_exists( 'um\frontend\Init' ) ) { } return UM()->classes['um\frontend\secure']; } + + /** + * @since 2.8.7 + * + * @return User_Profile + */ + public function user_profile() { + if ( empty( UM()->classes['um\frontend\user_profile'] ) ) { + UM()->classes['um\frontend\user_profile'] = new User_Profile(); + } + return UM()->classes['um\frontend\user_profile']; + } + + /** + * @since 2.8.7 + * + * @return Users + */ + public function users() { + if ( empty( UM()->classes['um\frontend\users'] ) ) { + UM()->classes['um\frontend\users'] = new Users(); + } + return UM()->classes['um\frontend\users']; + } } } diff --git a/includes/frontend/class-user-profile.php b/includes/frontend/class-user-profile.php new file mode 100644 index 00000000..f77cd3cc --- /dev/null +++ b/includes/frontend/class-user-profile.php @@ -0,0 +1,69 @@ +common()->users()::user_exists( $uid ) ) { + return; + } + + if ( ! empty( $uid ) && is_super_admin( $uid ) ) { + wp_die( esc_html__( 'Super administrators can not be modified.', 'ultimate-member' ) ); + } + + UM()->fields()->editing = true; + + if ( ! um_is_myprofile() && ! UM()->roles()->um_current_user_can( 'edit', um_profile_id() ) ) { + um_safe_redirect( UM()->permalinks()->get_current_url( true ) ); + exit; + } + + if ( ! um_can_edit_my_profile() ) { + um_safe_redirect( um_edit_my_profile_cancel_uri() ); + exit; + } + } + } +} diff --git a/includes/frontend/class-users.php b/includes/frontend/class-users.php new file mode 100644 index 00000000..585cbcd9 --- /dev/null +++ b/includes/frontend/class-users.php @@ -0,0 +1,81 @@ +roles()->get_priority_user_role( get_current_user_id() ); + $role = get_role( $priority_role ); + + $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); + if ( $can_edit_users ) { + if ( UM()->common()->users()->can_be_approved( $user_id ) ) { + $actions['approve_user'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); + } + if ( UM()->common()->users()->can_be_reactivated( $user_id ) ) { + $actions['reactivate_user'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); + } + if ( UM()->common()->users()->can_be_set_as_pending( $user_id ) ) { + $actions['put_user_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) ); + } + if ( UM()->common()->users()->can_activation_send( $user_id ) ) { + $actions['resend_user_activation'] = array( 'label' => __( 'Resend Activation Email', 'ultimate-member' ) ); + } + if ( UM()->common()->users()->can_be_rejected( $user_id ) ) { + $actions['reject_user'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); + } + if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) { + $actions['deactivate_user'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) ); + } + } + + if ( UM()->roles()->um_current_user_can( 'delete', $user_id ) ) { + $actions['delete'] = array( 'label' => __( 'Delete this user', 'ultimate-member' ) ); + } + + if ( current_user_can( 'manage_options' ) && ! is_super_admin( $user_id ) ) { + $actions['switch_user'] = array( 'label' => __( 'Login as this user', 'ultimate-member' ) ); + } + + /** + * Filters users actions list in Ultimate Member frontend. + * + * @since 1.3.x + * @hook um_admin_user_actions_hook + * + * @param {array} $actions CPT keys. + * @param {int} $user_id User ID. + * + * @return {array} CPT keys. + * + * @example Add `um_custom_action` action to the users actions list on frontend. + * function um_custom_admin_user_actions_hook( $actions, $user_id ) { + * $actions['um_custom_action'] = array( 'label' => 'um_custom_action_label' ); + * return $actions; + * } + * add_filter( 'um_admin_user_actions_hook', 'um_custom_admin_user_actions_hook', 10, 2 ); + */ + return apply_filters( 'um_admin_user_actions_hook', $actions, $user_id ); + } +} diff --git a/includes/um-deprecated-hooks.php b/includes/um-deprecated-hooks.php index 0a0fa5c7..3231ab27 100644 --- a/includes/um-deprecated-hooks.php +++ b/includes/um-deprecated-hooks.php @@ -65,3 +65,33 @@ if ( ! defined( 'ABSPATH' ) ) { * * @param {int} $user_id User ID. Since 2.0 */ + +/** + * Fires for handle admin user_action scripts. + * + * @since 1.3.x + * @depecated 2.8.7 WordPress native `handle_bulk_actions-users` hook is used. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + * @hook um_admin_user_action_hook + * + * @param {string} $bulk_action Bulk action key + */ + +/** + * Fires for handle admin user_action scripts. + * Where $bulk_action is a bulk action key + * + * @since 1.3.x + * @depecated 2.8.7 WordPress native `handle_bulk_actions-users` hook is used. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + * @hook um_admin_user_action_{$bulk_action}_hook + */ + +/** + * Fires for handle custom admin user_action scripts. + * Where $action is a bulk action key + * + * @since 1.3.x + * @depecated 2.8.7 WordPress native `handle_bulk_actions-users` hook is used. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + * @hook um_admin_custom_hook_{$action} + * + * @param {int} $user_id User ID. + */ From 4c2415086d31a3565f39f1727c043d961b2bfb6e Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Sep 2024 13:27:17 +0300 Subject: [PATCH 17/97] * hookdocs; --- includes/frontend/class-actions-listener.php | 31 ++++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/includes/frontend/class-actions-listener.php b/includes/frontend/class-actions-listener.php index 467d0a6f..389f7a21 100644 --- a/includes/frontend/class-actions-listener.php +++ b/includes/frontend/class-actions-listener.php @@ -180,24 +180,23 @@ if ( ! class_exists( 'um\frontend\Actions_Listener' ) ) { exit; default: /** - * UM hook + * Fires to handle 3rd-party user actions from User Profile. * - * @type action - * @title um_action_user_request_hook - * @description Integration for user actions - * @input_vars - * [{"var":"$action","type":"string","desc":"Action for user"}, - * {"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.0"] - * @usage add_action( 'um_action_user_request_hook', 'function_name', 10, 2 ); - * @example - * Update `some_custom_meta` user meta on `my_custom_action`. + * function um_action_user_request_hook( $action, $user_id ) { + * if ( 'my_custom_action' === $action ) { + * update_user_meta( $user_id, 'some_custom_meta', true ); + * } * } - * ?> + * add_action( 'um_action_user_request_hook', 'um_action_user_request_hook', 10, 2 ); */ do_action( 'um_action_user_request_hook', $action, $user_id ); break; From ba93896c5d57a13c9efa358fc1ab72d091c9ec81 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Sep 2024 17:58:55 +0300 Subject: [PATCH 18/97] * manually reviewed #1537; --- includes/admin/class-admin.php | 2 + includes/admin/templates/dashboard/users.php | 66 ++++++++++---------- includes/ajax/class-secure.php | 2 +- includes/core/class-query.php | 19 ++++-- readme.txt | 29 ++++++++- 5 files changed, 75 insertions(+), 43 deletions(-) diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index c34d913c..2f6f12d3 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -1760,6 +1760,8 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { delete_transient( "um_count_users_{$status}" ); } + delete_transient( 'um_count_users_all' ); + do_action( 'um_flush_user_status_cache' ); $url = add_query_arg( diff --git a/includes/admin/templates/dashboard/users.php b/includes/admin/templates/dashboard/users.php index 5be7fde9..e1bb55a1 100644 --- a/includes/admin/templates/dashboard/users.php +++ b/includes/admin/templates/dashboard/users.php @@ -3,70 +3,70 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } ?> - diff --git a/includes/ajax/class-secure.php b/includes/ajax/class-secure.php index f69fc682..898ab5de 100644 --- a/includes/ajax/class-secure.php +++ b/includes/ajax/class-secure.php @@ -287,7 +287,7 @@ class Secure { $content .= ' ' . esc_html__( 'Click here to lock them now.', 'ultimate-member' ) . ''; $content .= ' ' . esc_html__( 'You can unblock the Register forms later. Just go to Ultimate Member > Settings > Advanced > Security and uncheck the option "Lock All Register Forms".', 'ultimate-member' ); $content .= $br . $br; - $suspicious_accounts_url = admin_url( 'users.php?um_status=inactive' ); + $suspicious_accounts_url = admin_url( 'users.php?um_user_status=inactive' ); if ( $might_affected_users->get_total() > 0 ) { $od = gmdate( 'F d, Y', $oldest_date ); diff --git a/includes/core/class-query.php b/includes/core/class-query.php index 0885cc6c..ba8b7cc7 100644 --- a/includes/core/class-query.php +++ b/includes/core/class-query.php @@ -307,17 +307,24 @@ if ( ! class_exists( 'um\core\Query' ) ) { return $users_count; } - /** * Count all users * - * @return mixed + * @param bool $force Avoid transient. Default false. + * + * @return int */ - function count_users() { - $result = count_users(); - return $result['total_users']; - } + public function count_users( $force = false ) { + $users_count = get_transient( 'um_count_users_all' ); + if ( $force || false === $users_count ) { + $result = count_users(); + $users_count = $result['total_users']; + set_transient( 'um_count_users_all', $users_count, HOUR_IN_SECONDS ); + } + + return $users_count; + } /** * Using wpdb instead of update_post_meta diff --git a/readme.txt b/readme.txt index dce9b041..e0136f4c 100644 --- a/readme.txt +++ b/readme.txt @@ -5,8 +5,8 @@ Contributors: ultimatemember, champsupertramp, nsinelnikov Tags: community, member, membership, user-profile, user-registration Requires PHP: 5.6 Requires at least: 5.5 -Tested up to: 6.5 -Stable tag: 2.8.6 +Tested up to: 6.6 +Stable tag: 2.8.7 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -166,9 +166,29 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -= 2.8.7 2024-06-xx = += 2.8.7 2024-09-26 = +**Enhancements** +* Added: Single user actions on WP Users list table +* Updated: User status filter on WP Users list table +* Updated: User bulk actions on WP Users list table +* Updated: User actions on User Profile and Member Directory card + +**Bugfixes** + +* Fixed: CVE-2024-8520 +* Fixed: CVE-2024-8519 +* Fixed: Performance issue related to Settings > Secure tab +* Fixed: The "Clear All" button in the member directory did not reset all dependent dropdowns + +**Templates required update** + +* login-to-view.php + +**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** + +**Deprecated** = 2.8.6 2024-05-22 = @@ -368,6 +388,9 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI == Upgrade Notice == += 2.8.7 = +This version fixes a security related bug. Upgrade immediately. + = 2.8.5 = This version fixes a security related bug. Upgrade immediately. From 3fbba2dcd5f1820d9d9e9744913d8954841552fd Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Sep 2024 18:07:41 +0300 Subject: [PATCH 19/97] * small changes; * updated readme.txt; --- includes/core/um-filters-fields.php | 7 +++---- readme.txt | 6 ++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 3b890d9a..cfd545b4 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -134,7 +134,6 @@ function um_profile_field_filter_hook__vimeo_video( $value, $data ) { } add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filter_hook__vimeo_video', 99, 2 ); - /** * Outputs a phone link * @@ -144,13 +143,13 @@ add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filte * @return string */ function um_profile_field_filter_hook__phone( $value, $data ) { - if ( empty( trim( str_replace( '+', '', $value ) ) ) ) { + $maybe_empty_phone = trim( str_replace( '+', '', $value ) ); + if ( empty( $maybe_empty_phone ) ) { return ''; } $value = trim( $value ); - $value = '' . esc_html( $value ) . ''; - return $value; + return '' . esc_html( $value ) . ''; } add_filter( 'um_profile_field_filter_hook__tel', 'um_profile_field_filter_hook__phone', 99, 2 ); diff --git a/readme.txt b/readme.txt index e0136f4c..fbb531b2 100644 --- a/readme.txt +++ b/readme.txt @@ -177,10 +177,12 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Bugfixes** -* Fixed: CVE-2024-8520 -* Fixed: CVE-2024-8519 +* Fixed: Single user action on User Profile security vulnerability. CVE ID: CVE-2024-8520 +* Fixed: [um_loggedin] shortcode security vulnerability. CVE ID: CVE-2024-8519 * Fixed: Performance issue related to Settings > Secure tab * Fixed: The "Clear All" button in the member directory did not reset all dependent dropdowns +* Fixed: Telegram and Discord social links in profile header +* Fixed: UM links to empty phone numbers **Templates required update** From 9190d93467e8a5d544ff5086c7dac32d4d0e750e Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 24 Sep 2024 18:21:25 +0300 Subject: [PATCH 20/97] * manually reviewed #1528; * also added 'um_restricted_post_content' hook --- includes/core/class-access.php | 29 +++++++++++++++++++++++++++-- readme.txt | 1 + 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/includes/core/class-access.php b/includes/core/class-access.php index 482abc6d..9f1cc02a 100644 --- a/includes/core/class-access.php +++ b/includes/core/class-access.php @@ -761,6 +761,8 @@ if ( ! class_exists( 'um\core\Access' ) ) { return $content; } + $original_post_content = $content; + if ( $this->is_restricted( $id ) ) { $restriction = $this->get_post_privacy_settings( $id ); @@ -770,8 +772,31 @@ if ( ! class_exists( 'um\core\Access' ) ) { $content = ! empty( $restriction['_um_restrict_custom_message'] ) ? stripslashes( $restriction['_um_restrict_custom_message'] ) : ''; } - // translators: %s: Restricted post message. - $content = sprintf( __( '%s', 'ultimate-member' ), $content ); + // Because we have a late the_content callback priority here we have to apply shortcodes if faced in restricted message. + $content = apply_shortcodes( $content ); + /** + * Filters the restricted post content. + * Can be used for translations when site is multilingual. + * + * @param {string} $content Post content prepared from restricted message. + * @param {int} $post_id Post ID + * @param {string} $original_post_content Original post content. + * + * @return {string} Maybe changed post content prepared from restricted message. + * + * @since 2.8.7 + * @hook um_restricted_post_content + * + * @example + * function my_restricted_post_content( $content, $post_id, $original_post_content ) { + * if ( 111 === $post_id ) { + * $content = trim( $content ); + * } + * return $content; + * } + * add_filter( 'um_restricted_post_content', 'my_restricted_post_content', 10, 3 ); + */ + $content = apply_filters( 'um_restricted_post_content', $content, $id, $original_post_content ); } return $content; diff --git a/readme.txt b/readme.txt index fbb531b2..aeacf87e 100644 --- a/readme.txt +++ b/readme.txt @@ -174,6 +174,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Updated: User status filter on WP Users list table * Updated: User bulk actions on WP Users list table * Updated: User actions on User Profile and Member Directory card +* Added: Applying shortcodes from the post restriction message **Bugfixes** From 4c3f292a5338259b71c115d15691e60f83e5ee47 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 02:04:53 +0300 Subject: [PATCH 21/97] * manually reviewed #1433; * avoid using separate option for this functionality; --- includes/core/um-actions-account.php | 30 +++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index b761a49f..89fcd42b 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -326,7 +326,9 @@ function um_submit_account_details( $args ) { if ( 'single_user_password' === $k || 'user_login' === $k ) { continue; - } elseif ( 'first_name' === $k || 'last_name' === $k || 'user_password' === $k ) { + } + + if ( 'first_name' === $k || 'last_name' === $k || 'user_password' === $k ) { $v = sanitize_text_field( $v ); } elseif ( 'user_email' === $k ) { $v = sanitize_email( $v ); @@ -403,7 +405,7 @@ function um_submit_account_details( $args ) { */ do_action( 'um_account_pre_update_profile', $changes, $user_id ); - if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) || isset( $changes['nickname'] ) ) { + if ( isset( $changes['first_name'] ) || isset( $changes['last_name'] ) || isset( $changes['nickname'] ) || isset( $changes['user_email'] ) ) { $user = get_userdata( $user_id ); if ( ! empty( $user ) && ! is_wp_error( $user ) ) { UM()->user()->previous_data['display_name'] = $user->display_name; @@ -417,6 +419,9 @@ function um_submit_account_details( $args ) { if ( isset( $changes['nickname'] ) ) { UM()->user()->previous_data['nickname'] = $user->nickname; } + if ( isset( $changes['user_email'] ) ) { + UM()->user()->previous_data['user_email'] = $user->user_email; + } } } @@ -474,7 +479,7 @@ function um_submit_account_details( $args ) { $url = add_query_arg( 'updated', 'account', $url ); if ( function_exists( 'icl_get_current_language' ) ) { - if ( icl_get_current_language() != icl_get_default_language() ) { + if ( icl_get_current_language() !== icl_get_default_language() ) { $url = UM()->permalinks()->get_current_url( true ); $url = add_query_arg( 'updated', 'account', $url ); @@ -487,6 +492,25 @@ function um_submit_account_details( $args ) { } add_action( 'um_submit_account_details', 'um_submit_account_details' ); +/** + * Maybe clear all sessions except current after changing email. Because email can be used for login. + * + * @param $user_id + * @param $changes + * + * @return void + */ +function um_maybe_flush_users_session( $user_id, $changes ) { + if ( ! isset( UM()->user()->previous_data['user_email'] ) ) { + return; + } + + if ( UM()->user()->previous_data['user_email'] !== $changes['user_email'] ) { + // Clear all sessions except current after changing email. Because email can be used for login. + wp_destroy_other_sessions(); + } +} +add_action( 'um_after_user_account_updated', 'um_maybe_flush_users_session', 10, 2 ); /** * Hidden inputs for account form From 2295b9f6025ebdc6dfde1a9cc7b7971630a9aa5e Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 02:15:55 +0300 Subject: [PATCH 22/97] * updated readme.txt --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index aeacf87e..a9abac9b 100644 --- a/readme.txt +++ b/readme.txt @@ -184,6 +184,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: The "Clear All" button in the member directory did not reset all dependent dropdowns * Fixed: Telegram and Discord social links in profile header * Fixed: UM links to empty phone numbers +* Fixed: Email changing via User Account flush session. Security enhancement because email can be used for login **Templates required update** From 2aaa4c56e9cd5dac681e4c0f7ff042972e1c23c5 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 02:41:53 +0300 Subject: [PATCH 23/97] * changed hook for sitewide using session destroyer as soon as user email is changed; --- includes/core/um-actions-account.php | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 89fcd42b..eb7fcc8d 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -494,23 +494,29 @@ add_action( 'um_submit_account_details', 'um_submit_account_details' ); /** * Maybe clear all sessions except current after changing email. Because email can be used for login. + * Using a proper hook that triggers on email changed action in WordPress native handlers. + * It starts to work sitewide in UM Account and there wp_update_user with new user_email attribute is used. * - * @param $user_id - * @param $changes + * @since 2.8.7 * - * @return void + * @param bool $send Whether to send the email. + * @param array $user The original user array. + * @param array $userdata The updated user array. + * @return bool */ -function um_maybe_flush_users_session( $user_id, $changes ) { - if ( ! isset( UM()->user()->previous_data['user_email'] ) ) { - return; +function um_maybe_flush_users_session_update_user( $send, $user, $userdata ) { + // Clear all sessions except current after changing email. Because email can be used for login. + if ( get_current_user_id() === $userdata['ID'] ) { + wp_destroy_other_sessions(); + } else { + $sessions_manager = WP_Session_Tokens::get_instance( $userdata['ID'] ); + // Remove all the session data for all users. + $sessions_manager->destroy_all(); } - if ( UM()->user()->previous_data['user_email'] !== $changes['user_email'] ) { - // Clear all sessions except current after changing email. Because email can be used for login. - wp_destroy_other_sessions(); - } + return $send; } -add_action( 'um_after_user_account_updated', 'um_maybe_flush_users_session', 10, 2 ); +add_filter( 'send_email_change_email', 'um_maybe_flush_users_session_update_user', 20, 3 ); /** * Hidden inputs for account form From 4ed16c1be15454094cac0ce3f5a3889257efcd84 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Wed, 25 Sep 2024 11:34:25 +0300 Subject: [PATCH 24/97] - fix um_get_requested_user --- includes/um-short-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index ccd7d589..51e1e287 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -1447,7 +1447,7 @@ function um_set_requested_user( $user_id ) { */ function um_get_requested_user() { if ( ! empty( UM()->user()->target_id ) ) { - return UM()->user()->target_id; + return absint( UM()->user()->target_id ); } return false; From 6967ec6e91dc53f9ecb98a737810ceb03c71d6bb Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 18:44:44 +0300 Subject: [PATCH 25/97] * manually merged https://github.com/ultimatemember/ultimatemember/tree/fix/og_image --- includes/core/um-actions-profile.php | 106 +++++++++++++-------------- readme.txt | 2 + 2 files changed, 52 insertions(+), 56 deletions(-) diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index f5c5dc9b..9d13aa28 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -631,7 +631,6 @@ if ( ! function_exists( 'um_profile_remove_wpseo' ) ) { } add_action( 'get_header', 'um_profile_remove_wpseo', 8 ); - /** * The profile page SEO tags * @@ -641,10 +640,9 @@ add_action( 'get_header', 'um_profile_remove_wpseo', 8 ); */ function um_profile_dynamic_meta_desc() { if ( um_is_core_page( 'user' ) && um_get_requested_user() ) { - $user_id = um_get_requested_user(); - if ( um_user( 'ID' ) !== $user_id) { + if ( um_user( 'ID' ) !== $user_id ) { um_fetch_user( $user_id ); } @@ -674,48 +672,39 @@ function um_profile_dynamic_meta_desc() { $url = um_user_profile_url( $user_id ); /** - * UM hook + * Filters the profile SEO image size. Default 190. Available 'original'. * - * @type filter - * @title um_profile_dynamic_meta_image_size - * @description Change the profile SEO image size. Default 190. Available 'original'. - * @input_vars - * [{"var":"$image_size","type":"int|string","desc":"Image size"}, - * {"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.5.5"] - * @usage add_filter( 'um_profile_dynamic_meta_image_size', 'function_name', 10, 2 ); - * @example - * Change meta image to cover photo `cover_photo`. + * function my_um_profile_dynamic_meta_image_size( $image_size, $user_id ) { + * return 'original'; * } - * ?> + * add_filter( 'um_profile_dynamic_meta_image_size', 'my_um_profile_dynamic_meta_image_size', 10, 2 ); */ $image_size = apply_filters( 'um_profile_dynamic_meta_image_size', 190, $user_id ); - /** - * UM hook + * Filters the profile SEO image type. Default 'profile_photo'. Available 'cover_photo', 'profile_photo'. * - * @type filter - * @title um_profile_dynamic_meta_image_type - * @description Change the profile SEO image type. Default 'profile_photo'. Available 'cover_photo', 'profile_photo', . - * @input_vars - * [{"var":"$image_type","type":"string","desc":"Image type - cover_photo or profile_photo"}, - * {"var":"$user_id","type":"int","desc":"User ID"}] - * @change_log - * ["Since: 2.5.5"] - * @usage add_filter( 'um_profile_dynamic_meta_image_type', 'function_name', 10, 2 ); - * @example - * Change meta image to cover photo `cover_photo`. + * function my_um_profile_dynamic_meta_image_type( $image_type, $user_id ) { + * return 'cover_photo'; * } - * ?> + * add_filter( 'um_profile_dynamic_meta_image_type', 'my_um_profile_dynamic_meta_image_type', 10, 2 ); */ $image_type = apply_filters( 'um_profile_dynamic_meta_image_type', 'profile_photo', $user_id ); @@ -729,20 +718,21 @@ function um_profile_dynamic_meta_desc() { } else { $image = um_get_cover_uri( um_profile( 'cover_photo' ), null ); } - } else { - if ( is_numeric( $image_size ) ) { - $sizes = UM()->options()->get( 'photo_thumb_sizes' ); - if ( is_array( $sizes ) ) { - $image_size = um_closest_num( $sizes, $image_size ); - } - $image = um_get_user_avatar_url( $user_id, $image_size ); - } else { - $image = um_get_user_avatar_url( $user_id, 'original' ); + } elseif ( is_numeric( $image_size ) ) { + $sizes = UM()->options()->get( 'photo_thumb_sizes' ); + if ( is_array( $sizes ) ) { + $image_size = um_closest_num( $sizes, $image_size ); } + $image = um_get_user_avatar_url( $user_id, $image_size ); + } else { + $image = um_get_user_avatar_url( $user_id, 'original' ); } + $image = current( explode( '?', $image ) ); // strip $_GET attributes from photo URL. + $image_info = wp_check_filetype( $image ); + $person = array( - '@context' => 'http://schema.org', + '@context' => 'https://schema.org', '@type' => 'ProfilePage', 'dateCreated' => um_user( 'user_registered' ), 'dateModified' => gmdate( 'Y-m-d H:i:s', um_user( 'last_update' ) ), @@ -757,16 +747,15 @@ function um_profile_dynamic_meta_desc() { ), ), ); - /** - * Filters changing the shema.org of profile's person. + * Filters changing the schema.org of profile's person. * - * @param {array} $person Data of the profile person. + * @param {array} $person Data of the profile person. * @param {int} $user_id User ID. * * @return {array} Changed person's data. * - * @since 2.8.0 + * @since 2.8.7 * @hook um_profile_dynamic_meta_profile_schema * * @example @@ -793,14 +782,20 @@ function um_profile_dynamic_meta_desc() { - - + + + + + + + + - + @@ -816,7 +811,6 @@ function um_profile_dynamic_meta_desc() { } add_action( 'wp_head', 'um_profile_dynamic_meta_desc', 20 ); - /** * Profile header cover * diff --git a/readme.txt b/readme.txt index a9abac9b..f4d9f125 100644 --- a/readme.txt +++ b/readme.txt @@ -175,6 +175,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Updated: User bulk actions on WP Users list table * Updated: User actions on User Profile and Member Directory card * Added: Applying shortcodes from the post restriction message +* Added: ProfilePage Structured Data **Bugfixes** @@ -185,6 +186,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: Telegram and Discord social links in profile header * Fixed: UM links to empty phone numbers * Fixed: Email changing via User Account flush session. Security enhancement because email can be used for login +* Fixed: User Profile image URL in meta tags **Templates required update** From 50b82b1d47c785a8129813b7c54916c46963664c Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 19:03:42 +0300 Subject: [PATCH 26/97] * fixed imagetype --- includes/core/um-actions-profile.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 9d13aa28..97d2c33d 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -729,7 +729,10 @@ function um_profile_dynamic_meta_desc() { } $image = current( explode( '?', $image ) ); // strip $_GET attributes from photo URL. - $image_info = wp_check_filetype( $image ); + $image_url = wp_parse_url( $image ); + $image_name = explode( '/', $image_url['path'] ); + $image_name = end( $image_name ); + $image_info = wp_check_filetype( $image_name ); $person = array( '@context' => 'https://schema.org', From 6d996940457771fbfc3ae3900e85ddeb20fab971 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 22:50:36 +0300 Subject: [PATCH 27/97] * fixed #1540; --- includes/core/class-fields.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index f4912f3e..3c443a0c 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -4299,6 +4299,11 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $data = $this->get_field( $key ); } + // Invalid field data. + if ( ! is_array( $data ) ) { + return ''; + } + //hide if empty type if ( ! array_key_exists( 'type', $data ) || empty( $data['type'] ) ) { return ''; From 3211fb2994bf8804ab34dffa07fbce547cba2977 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 23:12:17 +0300 Subject: [PATCH 28/97] * fixed #1516; --- includes/admin/core/class-admin-settings.php | 4 ++-- includes/core/class-access.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index 2e363783..6fd47efe 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -638,7 +638,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), array( 'id' => 'restricted_block_message', - 'type' => 'textarea', + 'type' => 'wp_editor', 'label' => __( 'Restricted Access Block Message', 'ultimate-member' ), 'description' => __( 'This is the message shown to users that do not have permission to view the block\'s content.', 'ultimate-member' ), 'conditional' => array( 'restricted_blocks', '=', 1 ), @@ -650,7 +650,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'sanitize' => 'bool', ); $settings_map['restricted_block_message'] = array( - 'sanitize' => 'textarea', + 'sanitize' => 'wp_kses', ); } diff --git a/includes/core/class-access.php b/includes/core/class-access.php index 9f1cc02a..5277bc8a 100644 --- a/includes/core/class-access.php +++ b/includes/core/class-access.php @@ -1264,7 +1264,7 @@ if ( ! class_exists( 'um\core\Access' ) ) { return $block_content; } - $default_message = UM()->options()->get( 'restricted_block_message' ); + $default_message = wp_kses_post( UM()->options()->get( 'restricted_block_message' ) ); switch ( $block['attrs']['um_who_access'] ) { case '1': { if ( ! is_user_logged_in() ) { From a3d2781e91491b5088b28b576eabc4efc7c9b233 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 23:17:17 +0300 Subject: [PATCH 29/97] * fixed issue https://github.com/ultimatemember/ultimatemember/tree/fix/popup_on_mobile; --- assets/css/um-responsive.css | 18 ++++++++---------- assets/css/um-responsive.min.css | 2 +- assets/js/um-members.min.js | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/assets/css/um-responsive.css b/assets/css/um-responsive.css index 25ee8081..d72fd838 100644 --- a/assets/css/um-responsive.css +++ b/assets/css/um-responsive.css @@ -186,7 +186,7 @@ div.uimob340 .um-header .um-profile-meta { div.uimob340 .um-header.no-cover .um-profile-meta {padding-top: 0 !important} -div.uimob340 .um-header .um-name { +div.uimob340 .um-header .um-name { float: none !important; margin-right: 0 !important; font-size: 18px; @@ -388,7 +388,7 @@ div.uimob500 .um-header .um-profile-meta { div.uimob500 .um-header.no-cover .um-profile-meta {padding-top: 0 !important} -div.uimob500 .um-header .um-name { +div.uimob500 .um-header .um-name { float: none !important; margin-right: 0 !important; font-size: 21px; @@ -636,7 +636,7 @@ div.uimob960 .um-profile-photo a.um-profile-photo-img { .um-modal.no-photo .um-modal-header { display: none; } - + .ajax-upload-dragdrop span.icon, .ajax-upload-dragdrop span.str { display: none; @@ -645,12 +645,10 @@ div.uimob960 .um-profile-photo a.um-profile-photo-img { } @media screen and (max-width: 600px) { - .um-popup { - width: 96%; - margin-left: 2%; - left: 0; - top: 15px; + width: 96% !important; + margin-left: 2% !important; + left: 0 !important; + top: 15px !important; } - -} \ No newline at end of file +} diff --git a/assets/css/um-responsive.min.css b/assets/css/um-responsive.min.css index acbb8806..f1ade878 100644 --- a/assets/css/um-responsive.min.css +++ b/assets/css/um-responsive.min.css @@ -1 +1 @@ -.uimob340-show,.uimob500-show,.uimob800-show,.uimob960-show{display:none}.um-profile-nav-item a.uimob340-show,.um-profile-nav-item a.uimob500-show,.um-profile-nav-item a.uimob800-show,.um-profile-nav-item a.uimob960-show{display:none}div.uimob340 .uimob340-show,div.uimob500 .uimob500-show,div.uimob800 .uimob800-show,div.uimob960 .uimob960-show{display:block}div.uimob340 .uimob340-hide,div.uimob500 .uimob500-hide,div.uimob800 .uimob800-hide,div.uimob960 .uimob960-hide{display:none}div.uimob340 .um-item-link a{font-size:14px}div.uimob340 .um-item-meta span{font-size:13px}div.uimob340 .um-load-items a{width:100%!important;max-width:100%!important}div.uimob340 .um-profile-nav{padding:0}div.uimob340 .um-profile-nav-item a{padding:10px 16px;margin-left:0;border-radius:0}div.uimob340 .um-profile-nav-item i{display:block;position:static;top:auto;left:auto}div.uimob340 .um-profile-subnav{padding:8px 15px}div.uimob340 .um-profile-subnav a{display:block;text-align:left;font-size:13px;margin:0;padding:6px 0}div.uimob340 .um-profile-subnav span{font-size:12px;padding:1px 6px}div.uimob340 .um-cover-overlay span.um-cover-overlay-t{display:none!important}div.uimob340 .um-cover-overlay{padding:0}div.uimob340 .um-cover-overlay i,div.uimob340 .um-profile-photo-overlay i{margin-bottom:0;font-size:30px}.um-modal.uimob340{width:100%!important;margin:0!important;left:0!important;height:100%;background:#fff}.um-modal.uimob340,.um-modal.uimob340 .um-modal-body,.um-modal.uimob340 .um-modal-header{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.um-modal.uimob340 .um-modal-header{text-align:center}.um-modal.uimob340 .um-modal-footer{position:absolute;bottom:0;left:0;width:100%;box-sizing:border-box;padding:10px;border-top:1px solid #ddd}.um-modal.uimob340 .um-modal-right{width:100%;float:none}.um-modal.uimob340 .um-modal-footer a.um-modal-btn{width:48%;margin:0 1%;float:left;display:block;line-height:44px!important;height:44px}.um-modal.uimob340 .ajax-upload-dragdrop span.icon{font-size:40px;line-height:40px}div.uimob340 .um-profile-body{padding-left:0;padding-right:0}div.uimob340 .um-profile-photo{width:100%!important;text-align:center!important;position:absolute;top:-40px;left:0;margin:0}div.uimob340 .um-header.no-cover .um-profile-photo{position:static;top:auto;left:auto}div.uimob340 .um-profile-photo a.um-profile-photo-img{width:100px!important;height:100px!important;margin:0 auto!important;float:none!important;display:inline-block!important;position:relative!important;top:auto!important;left:auto!important}div.uimob340 .um-header.no-cover .um-profile-photo a.um-profile-photo-img{width:120px!important;height:120px!important}div.uimob340 .um-header .um-profile-meta{padding-left:0!important;padding-right:0!important;text-align:center!important;padding-top:60px!important}div.uimob340 .um-header.no-cover .um-profile-meta{padding-top:0!important}div.uimob340 .um-header .um-name{float:none!important;margin-right:0!important;font-size:18px}div.uimob340 .um-header .um-meta-text{padding:0 20px}div.uimob340 .um-header .um-meta{padding:0 10px;display:inline-block}div.uimob340 .um-col-121,div.uimob340 .um-col-122,div.uimob340 .um-col-131,div.uimob340 .um-col-132,div.uimob340 .um-col-133{float:none;width:100%;margin:0}div.uimob340 .um-field-half{float:none;width:100%}div.uimob340 .um-account-main{float:none;width:100%;padding:0;box-sizing:border-box}div.uimob340 .um-account-tab{padding-bottom:20px;border-bottom:1px solid #eee}div.uimob340 .um-account-meta{margin-bottom:0}.uimob340 .um-half{float:none;width:100%;margin:0 0 10px 0}.uimob340 .um-button.um-btn-auto-width{min-width:auto;max-width:auto;width:100%}.uimob340 .um-col-alt-s{padding-top:0}div.uimob500 .um-profile-nav{padding:0}div.uimob500 .um-profile-nav-item a{padding:10px 16px;margin-left:0;border-radius:0}div.uimob500 .um-profile-nav-item i{display:block;position:static;top:auto;left:auto;font-size:22px;height:22px;line-height:22px}div.uimob500 .um-profile-subnav{padding:8px 15px}div.uimob500 .um-profile-subnav a{display:block;text-align:left;font-size:13px;margin:0;padding:6px 0}div.uimob500 .um-profile-subnav span{font-size:12px;padding:1px 6px}div.uimob500 .um-cover-overlay span.um-cover-overlay-t{display:none!important}div.uimob500 .um-cover-overlay{padding:0}div.uimob500 .um-cover-overlay i,div.uimob500 .um-profile-photo-overlay i{margin-bottom:0;font-size:30px}.um-modal.uimob500{width:100%!important;margin:0!important;left:0!important;height:100%;background:#fff}.um-modal.uimob500,.um-modal.uimob500 .um-modal-body,.um-modal.uimob500 .um-modal-header{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.um-modal.uimob500 .um-modal-header{text-align:center}.um-modal.uimob500 .um-modal-footer{position:absolute;bottom:0;left:0;width:100%;box-sizing:border-box;padding:10px;border-top:1px solid #ddd}.um-modal.uimob500 .um-modal-right{width:100%;float:none}.um-modal.uimob500 .um-modal-footer a.um-modal-btn{width:48%;margin:0 1%;float:left;display:block;line-height:44px!important;height:44px}.um-modal.uimob500 .ajax-upload-dragdrop span.icon{font-size:40px;line-height:40px}div.uimob500 .um-profile-body{padding-left:0;padding-right:0}div.uimob500 .um-profile-photo{width:100%!important;text-align:center!important;position:absolute;top:-40px;left:0;margin:0}div.uimob500 .um-header.no-cover .um-profile-photo{position:static;top:auto;left:auto}div.uimob500 .um-profile-photo a.um-profile-photo-img{width:100px!important;height:100px!important;margin:0 auto!important;float:none!important;display:inline-block!important;position:relative!important;top:auto!important;left:auto!important}div.uimob500 .um-header.no-cover .um-profile-photo a.um-profile-photo-img{width:120px!important;height:120px!important}div.uimob500 .um-header .um-profile-meta{padding-left:0!important;padding-right:0!important;text-align:center!important;padding-top:60px!important}div.uimob500 .um-header.no-cover .um-profile-meta{padding-top:0!important}div.uimob500 .um-header .um-name{float:none!important;margin-right:0!important;font-size:21px}div.uimob500 .um-header .um-meta-text{padding:0 20px}div.uimob500 .um-header .um-meta{padding:0 20px;display:block}div.uimob500 .um-col-121,div.uimob500 .um-col-122,div.uimob500 .um-col-131,div.uimob500 .um-col-132,div.uimob500 .um-col-133{float:none;width:100%;margin:0}div.uimob500 .um-field-half{float:none;width:100%}div.uimob500 .um-account-main{float:none;width:100%;padding:0;box-sizing:border-box}div.uimob500 .um-account-tab{padding-bottom:20px;border-bottom:1px solid #eee}div.uimob500 .um-account-meta{margin-bottom:0}div.uimob800 .um-profile-nav{padding:0}div.uimob800 .um-profile-nav-item a{padding:10px 20px;margin-left:0;border-radius:0}div.uimob800 .um-profile-nav-item i{display:block;position:static;top:auto;left:auto;font-size:26px;height:26px;line-height:26px}div.uimob800 .um-profile-subnav{padding:8px 15px}div.uimob800 .um-profile-subnav a{display:block;text-align:left;font-size:14px;margin:0;padding:6px 0}div.uimob800 .um-profile-subnav span{font-size:12px;padding:2px 8px}div.uimob800 .um-account-main{width:90%;max-width:450px}div.uimob800 .um-account-side{padding:0;width:10%}div.uimob800 .um-account-side ul{border:1px solid #ddd;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.uimob800 .um-account-side li{margin-bottom:0!important;background:0 0}div.uimob800 .um-account-side li a{display:block;padding:0!important;height:44px;line-height:44px;color:#666!important;text-align:center;text-decoration:none!important;background:0 0;transition:all .2s linear}div.uimob800 .um-account-side li:first-child a{-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}div.uimob800 .um-account-side li:last-child a{-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}div.uimob800 .um-account-side li a span.um-account-icontip{display:block;float:left;text-align:center;width:100%;height:100%;font-size:22px;line-height:44px}div.uimob800 .um-account-side li a span.um-account-icontip i{position:relative;text-align:center;width:100%}div.uimob800 .um-account-side li a.current,div.uimob800 .um-account-side li a.current:hover{color:#fff!important}div.uimob800 .um-account-meta a{border:1px solid #ddd}div.uimob800 .um-account-meta a,div.uimob800 .um-account-meta img{display:block;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;max-width:100%;height:auto}div.uimob800 .um-account-meta img{width:100%}div.uimob800 .um-profile-photo{width:150px!important}div.uimob800 .um-profile-photo a.um-profile-photo-img{width:140px!important;height:140px!important;top:-70px!important}div.uimob800 .um-header.no-cover .um-profile-photo a.um-profile-photo-img{top:auto!important}div.uimob800 .um-header .um-profile-meta{padding-left:200px}div.uimob800 .um-cover-overlay{padding:0}div.uimob960 .um-profile-photo{width:200px!important}div.uimob960 .um-profile-photo a.um-profile-photo-img{width:140px!important;height:140px!important;top:-70px!important}@media screen and (max-height:400px){.ajax-upload-dragdrop span.icon{display:none}.um-modal.no-photo{width:100%!important;margin:0!important;left:0!important;height:100%;background:#fff}.um-modal.no-photo,.um-modal.no-photo .um-modal-body,.um-modal.no-photo .um-modal-header{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.um-modal.no-photo .um-modal-header{text-align:center;font-size:14px}.um-modal.no-photo .um-modal-footer{position:absolute;bottom:0;left:0;width:100%;box-sizing:border-box;padding:10px;border-top:1px solid #ddd}.um-modal.no-photo .um-modal-right{width:100%;float:none}.um-modal.no-photo .um-modal-footer a.um-modal-btn{width:48%;margin:0 1%;float:left;display:block;line-height:44px!important;height:44px}}@media screen and (max-height:300px){.um-modal.no-photo .um-modal-header{display:none}.ajax-upload-dragdrop span.icon,.ajax-upload-dragdrop span.str{display:none}}@media screen and (max-width:600px){.um-popup{width:96%;margin-left:2%;left:0;top:15px}} \ No newline at end of file +.uimob340-show,.uimob500-show,.uimob800-show,.uimob960-show{display:none}.um-profile-nav-item a.uimob340-show,.um-profile-nav-item a.uimob500-show,.um-profile-nav-item a.uimob800-show,.um-profile-nav-item a.uimob960-show{display:none}div.uimob340 .uimob340-show,div.uimob500 .uimob500-show,div.uimob800 .uimob800-show,div.uimob960 .uimob960-show{display:block}div.uimob340 .uimob340-hide,div.uimob500 .uimob500-hide,div.uimob800 .uimob800-hide,div.uimob960 .uimob960-hide{display:none}div.uimob340 .um-item-link a{font-size:14px}div.uimob340 .um-item-meta span{font-size:13px}div.uimob340 .um-load-items a{width:100%!important;max-width:100%!important}div.uimob340 .um-profile-nav{padding:0}div.uimob340 .um-profile-nav-item a{padding:10px 16px;margin-left:0;border-radius:0}div.uimob340 .um-profile-nav-item i{display:block;position:static;top:auto;left:auto}div.uimob340 .um-profile-subnav{padding:8px 15px}div.uimob340 .um-profile-subnav a{display:block;text-align:left;font-size:13px;margin:0;padding:6px 0}div.uimob340 .um-profile-subnav span{font-size:12px;padding:1px 6px}div.uimob340 .um-cover-overlay span.um-cover-overlay-t{display:none!important}div.uimob340 .um-cover-overlay{padding:0}div.uimob340 .um-cover-overlay i,div.uimob340 .um-profile-photo-overlay i{margin-bottom:0;font-size:30px}.um-modal.uimob340{width:100%!important;margin:0!important;left:0!important;height:100%;background:#fff}.um-modal.uimob340,.um-modal.uimob340 .um-modal-body,.um-modal.uimob340 .um-modal-header{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.um-modal.uimob340 .um-modal-header{text-align:center}.um-modal.uimob340 .um-modal-footer{position:absolute;bottom:0;left:0;width:100%;box-sizing:border-box;padding:10px;border-top:1px solid #ddd}.um-modal.uimob340 .um-modal-right{width:100%;float:none}.um-modal.uimob340 .um-modal-footer a.um-modal-btn{width:48%;margin:0 1%;float:left;display:block;line-height:44px!important;height:44px}.um-modal.uimob340 .ajax-upload-dragdrop span.icon{font-size:40px;line-height:40px}div.uimob340 .um-profile-body{padding-left:0;padding-right:0}div.uimob340 .um-profile-photo{width:100%!important;text-align:center!important;position:absolute;top:-40px;left:0;margin:0}div.uimob340 .um-header.no-cover .um-profile-photo{position:static;top:auto;left:auto}div.uimob340 .um-profile-photo a.um-profile-photo-img{width:100px!important;height:100px!important;margin:0 auto!important;float:none!important;display:inline-block!important;position:relative!important;top:auto!important;left:auto!important}div.uimob340 .um-header.no-cover .um-profile-photo a.um-profile-photo-img{width:120px!important;height:120px!important}div.uimob340 .um-header .um-profile-meta{padding-left:0!important;padding-right:0!important;text-align:center!important;padding-top:60px!important}div.uimob340 .um-header.no-cover .um-profile-meta{padding-top:0!important}div.uimob340 .um-header .um-name{float:none!important;margin-right:0!important;font-size:18px}div.uimob340 .um-header .um-meta-text{padding:0 20px}div.uimob340 .um-header .um-meta{padding:0 10px;display:inline-block}div.uimob340 .um-col-121,div.uimob340 .um-col-122,div.uimob340 .um-col-131,div.uimob340 .um-col-132,div.uimob340 .um-col-133{float:none;width:100%;margin:0}div.uimob340 .um-field-half{float:none;width:100%}div.uimob340 .um-account-main{float:none;width:100%;padding:0;box-sizing:border-box}div.uimob340 .um-account-tab{padding-bottom:20px;border-bottom:1px solid #eee}div.uimob340 .um-account-meta{margin-bottom:0}.uimob340 .um-half{float:none;width:100%;margin:0 0 10px 0}.uimob340 .um-button.um-btn-auto-width{min-width:auto;max-width:auto;width:100%}.uimob340 .um-col-alt-s{padding-top:0}div.uimob500 .um-profile-nav{padding:0}div.uimob500 .um-profile-nav-item a{padding:10px 16px;margin-left:0;border-radius:0}div.uimob500 .um-profile-nav-item i{display:block;position:static;top:auto;left:auto;font-size:22px;height:22px;line-height:22px}div.uimob500 .um-profile-subnav{padding:8px 15px}div.uimob500 .um-profile-subnav a{display:block;text-align:left;font-size:13px;margin:0;padding:6px 0}div.uimob500 .um-profile-subnav span{font-size:12px;padding:1px 6px}div.uimob500 .um-cover-overlay span.um-cover-overlay-t{display:none!important}div.uimob500 .um-cover-overlay{padding:0}div.uimob500 .um-cover-overlay i,div.uimob500 .um-profile-photo-overlay i{margin-bottom:0;font-size:30px}.um-modal.uimob500{width:100%!important;margin:0!important;left:0!important;height:100%;background:#fff}.um-modal.uimob500,.um-modal.uimob500 .um-modal-body,.um-modal.uimob500 .um-modal-header{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.um-modal.uimob500 .um-modal-header{text-align:center}.um-modal.uimob500 .um-modal-footer{position:absolute;bottom:0;left:0;width:100%;box-sizing:border-box;padding:10px;border-top:1px solid #ddd}.um-modal.uimob500 .um-modal-right{width:100%;float:none}.um-modal.uimob500 .um-modal-footer a.um-modal-btn{width:48%;margin:0 1%;float:left;display:block;line-height:44px!important;height:44px}.um-modal.uimob500 .ajax-upload-dragdrop span.icon{font-size:40px;line-height:40px}div.uimob500 .um-profile-body{padding-left:0;padding-right:0}div.uimob500 .um-profile-photo{width:100%!important;text-align:center!important;position:absolute;top:-40px;left:0;margin:0}div.uimob500 .um-header.no-cover .um-profile-photo{position:static;top:auto;left:auto}div.uimob500 .um-profile-photo a.um-profile-photo-img{width:100px!important;height:100px!important;margin:0 auto!important;float:none!important;display:inline-block!important;position:relative!important;top:auto!important;left:auto!important}div.uimob500 .um-header.no-cover .um-profile-photo a.um-profile-photo-img{width:120px!important;height:120px!important}div.uimob500 .um-header .um-profile-meta{padding-left:0!important;padding-right:0!important;text-align:center!important;padding-top:60px!important}div.uimob500 .um-header.no-cover .um-profile-meta{padding-top:0!important}div.uimob500 .um-header .um-name{float:none!important;margin-right:0!important;font-size:21px}div.uimob500 .um-header .um-meta-text{padding:0 20px}div.uimob500 .um-header .um-meta{padding:0 20px;display:block}div.uimob500 .um-col-121,div.uimob500 .um-col-122,div.uimob500 .um-col-131,div.uimob500 .um-col-132,div.uimob500 .um-col-133{float:none;width:100%;margin:0}div.uimob500 .um-field-half{float:none;width:100%}div.uimob500 .um-account-main{float:none;width:100%;padding:0;box-sizing:border-box}div.uimob500 .um-account-tab{padding-bottom:20px;border-bottom:1px solid #eee}div.uimob500 .um-account-meta{margin-bottom:0}div.uimob800 .um-profile-nav{padding:0}div.uimob800 .um-profile-nav-item a{padding:10px 20px;margin-left:0;border-radius:0}div.uimob800 .um-profile-nav-item i{display:block;position:static;top:auto;left:auto;font-size:26px;height:26px;line-height:26px}div.uimob800 .um-profile-subnav{padding:8px 15px}div.uimob800 .um-profile-subnav a{display:block;text-align:left;font-size:14px;margin:0;padding:6px 0}div.uimob800 .um-profile-subnav span{font-size:12px;padding:2px 8px}div.uimob800 .um-account-main{width:90%;max-width:450px}div.uimob800 .um-account-side{padding:0;width:10%}div.uimob800 .um-account-side ul{border:1px solid #ddd;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.uimob800 .um-account-side li{margin-bottom:0!important;background:0 0}div.uimob800 .um-account-side li a{display:block;padding:0!important;height:44px;line-height:44px;color:#666!important;text-align:center;text-decoration:none!important;background:0 0;transition:all .2s linear}div.uimob800 .um-account-side li:first-child a{-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}div.uimob800 .um-account-side li:last-child a{-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}div.uimob800 .um-account-side li a span.um-account-icontip{display:block;float:left;text-align:center;width:100%;height:100%;font-size:22px;line-height:44px}div.uimob800 .um-account-side li a span.um-account-icontip i{position:relative;text-align:center;width:100%}div.uimob800 .um-account-side li a.current,div.uimob800 .um-account-side li a.current:hover{color:#fff!important}div.uimob800 .um-account-meta a{border:1px solid #ddd}div.uimob800 .um-account-meta a,div.uimob800 .um-account-meta img{display:block;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;max-width:100%;height:auto}div.uimob800 .um-account-meta img{width:100%}div.uimob800 .um-profile-photo{width:150px!important}div.uimob800 .um-profile-photo a.um-profile-photo-img{width:140px!important;height:140px!important;top:-70px!important}div.uimob800 .um-header.no-cover .um-profile-photo a.um-profile-photo-img{top:auto!important}div.uimob800 .um-header .um-profile-meta{padding-left:200px}div.uimob800 .um-cover-overlay{padding:0}div.uimob960 .um-profile-photo{width:200px!important}div.uimob960 .um-profile-photo a.um-profile-photo-img{width:140px!important;height:140px!important;top:-70px!important}@media screen and (max-height:400px){.ajax-upload-dragdrop span.icon{display:none}.um-modal.no-photo{width:100%!important;margin:0!important;left:0!important;height:100%;background:#fff}.um-modal.no-photo,.um-modal.no-photo .um-modal-body,.um-modal.no-photo .um-modal-header{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.um-modal.no-photo .um-modal-header{text-align:center;font-size:14px}.um-modal.no-photo .um-modal-footer{position:absolute;bottom:0;left:0;width:100%;box-sizing:border-box;padding:10px;border-top:1px solid #ddd}.um-modal.no-photo .um-modal-right{width:100%;float:none}.um-modal.no-photo .um-modal-footer a.um-modal-btn{width:48%;margin:0 1%;float:left;display:block;line-height:44px!important;height:44px}}@media screen and (max-height:300px){.um-modal.no-photo .um-modal-header{display:none}.ajax-upload-dragdrop span.icon,.ajax-upload-dragdrop span.str{display:none}}@media screen and (max-width:600px){.um-popup{width:96%!important;margin-left:2%!important;left:0!important;top:15px!important}} \ No newline at end of file diff --git a/assets/js/um-members.min.js b/assets/js/um-members.min.js index a52f7ab5..367efa99 100644 --- a/assets/js/um-members.min.js +++ b/assets/js/um-members.min.js @@ -1 +1 @@ -var um_members_directory_busy=[],um_member_directories=[],um_member_directory_last_data=[];function um_parse_current_url(){var e={},r=window.location.search.substring(1).split("&");return jQuery.each(r,function(t){var a=r[t].split("=");e[a[0]]=a[1]}),e}function um_get_data_for_directory(e,r){var t=um_members_get_hash(e),a={},i=um_parse_current_url();if(jQuery.each(i,function(e){-1!==e.indexOf("_"+t)&&""!==i[e]&&(a[e.replace("_"+t,"")]=i[e])}),!r)return a;if(void 0!==a[r])try{a[r]=decodeURIComponent(a[r])}catch(m){console.error(m)}return a[r]}function um_set_url_from_data(e,r,t){var a=um_members_get_hash(e),i=um_get_data_for_directory(e),m={};Array.isArray(t)?(jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")):jQuery.isNumeric(t)||(t=t.split("||"),jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")),""!==t&&(m[r+"_"+a]=t),jQuery.each(i,function(e){r===e?""!==t&&(m[e+"_"+a]=t):m[e+"_"+a]=i[e]}),jQuery.each(um_member_directories,function(e){var r=um_member_directories[e];if(r!==a){var t=jQuery('.um-directory[data-hash="'+r+'"]'),i=um_get_data_for_directory(t);jQuery.each(i,function(e){m[e+"_"+r]=i[e]})}});var d=[];jQuery.each(m,function(e){d.push(e+"="+m[e])});var s="?"+(d=wp.hooks.applyFilters("um_member_directory_url_attrs",d)).join("&");"?"===s&&(s=""),window.history.pushState("string","UM Member Directory",window.location.origin+window.location.pathname+s)}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){var r=um_members_get_hash(e);return void 0!==um_members_directory_busy[r]&&um_members_directory_busy[r]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t,a,i="",m=e.siblings(".um-slider-range").data("placeholder-s"),d=e.siblings(".um-slider-range").data("placeholder-p");r?(i=r.values[0]===r.values[1]?m.replace("{value}",r.values[0]).replace("{field_label}",e.siblings(".um-slider-range").data("label")):d.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1]).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=r.values[0],a=r.values[1]):(i=e.slider("values",0)===e.slider("values",1)?m.replace("{value}",e.slider("values",0)).replace("{field_label}",e.siblings(".um-slider-range").data("label")):d.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1)).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),a=e.slider("values",1)),e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function um_get_search(e){return e.find(".um-search-line").length?e.find(".um-search-line").val():""}function um_get_sort(e){return e.data("sorting")}function um_get_current_page(e){var r=e.data("page");return r&&void 0!==r||(r=1),r}function um_time_convert(e,r){var t=Math.floor(e/60),a=e%60;return a>=60&&(a=0,(t+=1)>=24&&(t=0)),a<10&&(a="0"+a),t+":"+a}function um_ajax_get_members(e,r){var t=um_members_get_hash(e);if(!wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,t,e)){setTimeout(um_ajax_get_members,600,e,r);return}var a=um_get_current_page(e),i=um_get_search(e),m=um_get_sort(e),d=-new Date().getTimezoneOffset()/60,s={directory_id:t,page:a,search:i,sorting:m,gmt_offset:d,post_refferer:e.data("base-post"),nonce:um_scripts.nonce};e.find(".um-search-filter").length&&e.find(".um-search-filter").each(function(){var r=jQuery(this);if(r.find(".um-slider").length){var t=r.find(".um-slider").data("field_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");(void 0!==a||void 0!==i)&&(s[t]=[a,i])}else if(r.find(".um-datepicker-filter").length){var t=r.find(".um-datepicker-filter").data("filter_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");(void 0!==a||void 0!==i)&&(s[t]=[a,i])}else if(r.find(".um-timepicker-filter").length){var t=r.find(".um-timepicker-filter").data("filter_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");if(void 0!==a){var a=a.split(":"),m=1*a[0];m<10&&(m="0"+m);var d=1*a[1];d<10&&(d="0"+d),a=m+":"+d+":00"}if(void 0!==i){var o=i.split(":"),d=1*o[1],m=1*o[0];m<10&&(m="0"+m),d<10&&(d="0"+d),i=m+":"+d+":59"}(void 0!==a||void 0!==i)&&(s[t]=[a,i])}else if(r.find("select").length){var t=r.find("select").attr("name"),l=um_get_data_for_directory(e,"filter_"+t);void 0!==l&&(l=um_unsanitize_value(l),s[t]=l.split("||"))}else if(r.hasClass("um-text-filter-type")&&r.find('input[type="text"]').length){var t=r.find('input[type="text"]').attr("name"),l=um_get_data_for_directory(e,"filter_"+t);void 0!==l&&(l=um_unsanitize_value(l),s[t]=l)}else s=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",s,r,e)}),s=wp.hooks.applyFilters("um_member_directory_filter_request",s),wp.ajax.send("um_get_members",{data:s,success:function(r){um_member_directory_last_data[t]=r,um_build_template(e,r);var a=wp.template("um-members-pagination");e.find(".um-members-pagination-box").html(a(r)),e.data("total_pages",r.pagination.total_pages),r.pagination.total_pages?(e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled")):(e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",e,r),um_init_new_dropdown(),um_members_hide_preloader(e)},error:function(r){console.log(r),um_members_hide_preloader(e)}})}function um_build_template(e,r){var t=e.data("view_type"),a=wp.template("um-member-"+t+"-"+um_members_get_hash(e));if(jQuery(".um-"+um_members_get_hash(e)).length){e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(a(r.users));var i=wp.template("um-members-header");e.find(".um-members-intro").remove();var m=wp.hooks.applyFilters("um_member_directory_generate_header",!1,e);(void 0!==r.is_search&&r.is_search||m)&&e.find(".um-members-wrapper").prepend(i(r)),e.addClass("um-loaded"),wp.hooks.addAction("um_window_resize","um_members",function(){e.find(".um-members.um-members-grid").length&&UM_Member_Grid(e.find(".um-members.um-members-grid"))}),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize"),UM.common.tipsy.init()}}function UM_Member_Grid(e){e.find(".um-member").length&&e.imagesLoaded(function(){var r=wp.hooks.applyFilters("um_member_directory_grid_masonry_attrs",{itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"},e);e.masonry(r).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}function um_get_filters_data(e){var r=[];return e.find(".um-search-filter").each(function(){var t=jQuery(this);if(t.find("input.um-datepicker-filter").length)d="datepicker",t.find("input.um-datepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var t,a=jQuery(this).data("filter_name"),i=um_get_data_for_directory(e,"filter_"+a+"_from"),m=um_get_data_for_directory(e,"filter_"+a+"_to");if(void 0!==i||void 0!==m){var s=jQuery(this).val(),o=e.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+a+'"]').val();s===o?t=o:""!==s&&""!==o?t=s+" - "+o:""===s?t="before "+o:""===o&&(t="since "+s),r.push({name:a,label:jQuery(this).data("filter-label"),value_label:t,value:[i,m],type:d})}}});else if(t.find("input.um-timepicker-filter").length)d="timepicker",t.find("input.um-timepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var t,a=jQuery(this).data("filter_name"),i=um_get_data_for_directory(e,"filter_"+a+"_from"),m=um_get_data_for_directory(e,"filter_"+a+"_to");if(void 0!==i||void 0!==m){var s=jQuery(this).val(),o=e.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+a+'"]').val();s===o?t=o:""!==s&&""!==o?t=s+" - "+o:""===s?t="before "+o:""===o&&(t="since "+s),r.push({name:a,label:jQuery(this).data("filter-label"),value_label:t,value:[i,m],type:d})}}});else if(t.find("select").length){d="select",i=t.find("select").attr("name"),m=t.find("select").data("placeholder");var a=um_get_data_for_directory(e,"filter_"+i);a=void 0===a?[]:(a=um_unsanitize_value(a)).split("||"),jQuery.each(a,function(e){var s=t.find('select option[value="'+a[e]+'"]').data("value_label");r.push({name:i,label:m,value_label:s,value:a[e],type:d})})}else if(t.hasClass("um-text-filter-type")&&t.find('input[type="text"]').length){d="text",i=t.find('input[type="text"]').attr("name"),m=t.find('input[type="text"]').attr("placeholder");var a=um_get_data_for_directory(e,"filter_"+i);void 0===a&&(a=""),""!=a&&r.push({name:i,label:m,value_label:a,value:a,type:d})}else if(t.find("div.ui-slider").length){d="slider";var i,m,d,s,o=um_get_data_for_directory(e,"filter_"+(i=t.find("div.ui-slider").data("field_name"))+"_from"),l=um_get_data_for_directory(e,"filter_"+i+"_to");if(void 0===o&&void 0===l)return;s=o===l?t.find("div.um-slider-range").data("placeholder-s").replace("{value}",o).replace("{field_label}",t.find("div.um-slider-range").data("label")):t.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",o).replace("{max_range}",l).replace("{field_label}",t.find("div.um-slider-range").data("label")),m=t.find("div.um-slider-range").data("label"),r.push({name:i,label:m,value_label:s,value:[o,l],type:d})}else r=wp.hooks.applyFilters("um_member_directory_get_filter_data",r,e,t)}),r}function um_change_tag(e){var r=um_get_filters_data(e);e.find(".um-members-filter-tag").remove();var t=e.find(".um-filtered-line");if(t.length){var a=wp.template("um-members-filtered-line");t.prepend(a({filters:r})),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible"))}}function um_run_search(e){if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=um_get_data_for_directory(e,"search"),t=um_sanitize_value(e.find(".um-search-line").val());if(t===r||""===t&&void 0===r){um_members_hide_preloader(e);return}e.data("general_search",t),um_set_url_from_data(e,"search",t),e.data("page",1),um_set_url_from_data(e,"page","");var a=!1;if(!(a=wp.hooks.applyFilters("um_member_directory_ignore_after_search",a,e))&&1===e.data("must-search")&&(t=um_get_search(e),0===e.find(".um-members-filter-remove").length&&!t)){e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),um_members_hide_preloader(e);return}e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}function um_slider_filter_init(e){e.find(".um-slider").each(function(){var e=jQuery(this),r=e.parents(".um-directory"),t=e.data("field_name"),a=um_get_data_for_directory(r,"filter_"+t+"_from"),i=um_get_data_for_directory(r,"filter_"+t+"_to");void 0===a&&(a=parseInt(e.data("min"))),void 0===i&&(i=parseInt(e.data("max")));var m=[a,i];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:m,create:function(e,r){},step:1,slide:function(e,r){um_set_range_label(jQuery(this),r)},stop:function(e,a){um_is_directory_busy(r)||(um_members_show_preloader(r),um_set_url_from_data(r,"filter_"+t+"_from",a.values[0]),um_set_url_from_data(r,"filter_"+t+"_to",a.values[1]),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),um_set_range_label(e)})}function um_datepicker_filter_init(e){e.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max")),a=e.pickadate({selectYears:!0,min:r,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(a){if(a.select){var i=e.parents(".um-directory");if(!um_is_directory_busy(i)){um_members_show_preloader(i);var m=e.data("filter_name"),d=e.data("range"),s=um_get_data_for_directory(i,"filter_"+m+"_from"),o=um_get_data_for_directory(i,"filter_"+m+"_to");void 0===s&&(s=r/1e3),void 0===o&&(o=t/1e3);var l=a.select/1e3;e.val(),"from"===d?s=l:"to"===d&&(o=l),um_set_url_from_data(i,"filter_"+m+"_from",s),um_set_url_from_data(i,"filter_"+m+"_to",o),i.data("page",1),um_set_url_from_data(i,"page",""),um_ajax_get_members(i),um_change_tag(i),i.data("searched",1),i.find(".um-member-directory-sorting-options").prop("disabled",!1),i.find(".um-member-directory-view-type").removeClass("um-disabled")}}}}).pickadate("picker"),i=e.data("filter_name"),m=e.data("range"),d=um_get_data_for_directory(e.parents(".um-directory"),"filter_"+i+"_"+m);void 0!==d&&a.set("select",1e3*d)})}function um_timepicker_filter_init(e){e.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.attr("id"),t=e.data("filter_name"),a=e.attr("data-min"),i=e.attr("data-max"),m=a.split(":"),d=i.split(":"),s=e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[m[0],m[1]],max:[d[0],d[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(m){if(m.select){var d=e.parents(".um-directory");if(!um_is_directory_busy(d)){um_members_show_preloader(d);var s=e.data("filter_name"),o=e.data("range"),l=um_get_data_for_directory(d,"filter_"+s+"_from"),u=um_get_data_for_directory(d,"filter_"+s+"_to");if(void 0===l&&(l=a),void 0===u&&(u=i),void 0!==m.select){var n=um_time_convert(m.select,o);"from"===o?l=n:"to"===o&&(u=n)}else"from"===o?l=a:"to"===o&&(u=i);var f=jQuery("#"+r).val();"from"===e.data("range")?jQuery("#"+t+"_to").pickatime("picker").set("min",f):jQuery("#"+t+"_from").pickatime("picker").set("max",f),um_set_url_from_data(d,"filter_"+s+"_from",l),um_set_url_from_data(d,"filter_"+s+"_to",u),d.data("page",1),um_set_url_from_data(d,"page",""),um_ajax_get_members(d),um_change_tag(d),d.data("searched",1),d.find(".um-member-directory-sorting-options").prop("disabled",!1),d.find(".um-member-directory-view-type").removeClass("um-disabled")}}}}).pickatime("picker"),o=e.data("filter_name"),l=e.data("range"),u=um_get_data_for_directory(e.parents(".um-directory"),"filter_"+o+"_"+l);if(void 0!==u){var n=u.split(":");s.set("select",60*n[0]+1*n[1])}})}jQuery(document.body).ready(function(){jQuery(".um-directory .um-search-filter select").each(function(){1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var e=jQuery(this);e.select2("destroy").select2({dropdownParent:e.parent()})}),jQuery(document.body).on("mouseover",".um-directory .um-member-directory-view-type",function(){if(!jQuery(this).hasClass("um-disabled")){var e=jQuery(this).find(".um-member-directory-view-type-a:visible");e.hide(),e.next().length?e.next().show().tipsy("show"):jQuery(this).find(".um-member-directory-view-type-a:first").show().tipsy("show")}}).on("mouseout",".um-directory .um-member-directory-view-type",function(){!jQuery(this).hasClass("um-disabled")&&(jQuery(this).find(".um-member-directory-view-type-a").hide().tipsy("hide"),jQuery(this).find('.um-member-directory-view-type-a[data-type="'+jQuery(this).parents(".um-directory").data("view_type")+'"]').show())}),jQuery(document.body).on("click",".um-directory .um-member-directory-view-type-a",function(){var e=jQuery(this).parents(".um-directory");if(um_is_directory_busy(e))return!1;var r=jQuery(this),t=r.parents(".um-member-directory-view-type");if(!t.hasClass("um-disabled")){um_members_show_preloader(e);var a=t.find(".um-member-directory-view-type-a:visible");a.hide(),a.next().length?a.next().show().tipsy("show"):t.find(".um-member-directory-view-type-a:first").show().tipsy("show");var i=um_member_directory_last_data[um_members_get_hash(e)];if(null!==i){var m=r.data("type");um_set_url_from_data(e,"view_type",m),e.data("view_type",m),um_build_template(e,i),um_init_new_dropdown()}um_members_hide_preloader(e)}}),jQuery(document.body).on("click",".um-directory .um-do-search",function(){var e=jQuery(this).parents(".um-directory");um_run_search(e)}),jQuery(document.body).on("keypress",".um-directory .um-search-line",function(e){if(13===e.which){var r=jQuery(this).parents(".um-directory");um_run_search(r)}}),jQuery(document.body).on("click",'.um-new-dropdown[data-element=".um-member-directory-sorting-a"] li a',function(){if(1!==jQuery(this).data("selected")){var e=jQuery(this).data("directory-hash"),r=jQuery('.um-directory[data-hash="'+e+'"]');if(!um_is_directory_busy(r)){um_members_show_preloader(r);var t=jQuery(this).html(),a=jQuery(this).data("value");r.data("sorting",a),um_set_url_from_data(r,"sort",a),um_ajax_get_members(r),r.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),r.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"] a[data-value="'+a+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),r.find(".um-member-directory-sorting-a").find("> a").html(t)}}}),jQuery(document.body).on("click",".um-directory .pagi:not(.current)",function(){if(!jQuery(this).hasClass("disabled")){var e,r=jQuery(this).parents(".um-directory");!um_is_directory_busy(r)&&(um_members_show_preloader(r),1===(e="first"===jQuery(this).data("page")?1:"prev"===jQuery(this).data("page")?1*r.data("page")-1:"next"===jQuery(this).data("page")?1*r.data("page")+1:"last"===jQuery(this).data("page")?parseInt(r.data("total_pages")):parseInt(jQuery(this).data("page")))?(r.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass("disabled"),r.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled")):e===parseInt(r.data("total_pages"))?(r.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass("disabled"),r.find('.pagi[data-page="first"], .pagi[data-page="prev"]').removeClass("disabled")):(r.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled"),r.find('.pagi[data-page="first"], .pagi[data-page="prev"]').removeClass("disabled")),r.find(".pagi").removeClass("current"),r.find('.pagi[data-page="'+e+'"]').addClass("current"),r.data("page",e),1===e?um_set_url_from_data(r,"page",""):um_set_url_from_data(r,"page",e),um_ajax_get_members(r))}}),jQuery(document.body).on("change",".um-directory .um-members-pagi-dropdown",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=jQuery(this).val();e.find(".pagi").removeClass("current"),e.find('.pagi[data-page="'+r+'"]').addClass("current"),e.data("page",r),1===r?um_set_url_from_data(e,"page",""):um_set_url_from_data(e,"page",r),um_ajax_get_members(e)}}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-more a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member");return r.find(".um-member-more").hide(),r.find(".um-member-meta-main").slideDown(),r.find(".um-member-less").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member");return r.find(".um-member-less").hide(),r.find(".um-member-meta-main").slideUp(),r.find(".um-member-more").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-more a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-more").hide(),r.find(".um-member-meta").slideDown(function(){UM_Member_Grid(t)}),r.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(t)},100),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(t)}),!1}),jQuery(".um-member-directory-filters-a").on("click",function(){var e=jQuery(this),r=e.parents(".um-directory").find(".um-search");r.is(":visible")?r.slideUp(250,function(){e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}):r.slideDown({duration:250,start:function(){jQuery(this).css({display:"grid"}),e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}})}),jQuery(document.body).on("change",".um-directory .um-search-filter select",function(){var e=jQuery(this).val(),r=um_sanitize_value(e);if(""!==r){var t=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(t)){um_members_show_preloader(t);var a=jQuery(this).prop("name"),i=um_get_data_for_directory(t,"filter_"+a);i=void 0===i?[]:i.split("||"),-1===jQuery.inArray(r,i)&&(i.push(r),um_set_url_from_data(t,"filter_"+a,i=i.join("||")),t.data("page",1),um_set_url_from_data(t,"page","")),jQuery(this).find('option[value="'+e+'"]').prop("disabled",!0).hide(),1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var m=jQuery(this);m.select2("destroy").select2({dropdownParent:m.parent()}),m.val("").trigger("change"),um_ajax_get_members(t),um_change_tag(t),t.data("searched",1),t.find(".um-member-directory-sorting-options").prop("disabled",!1),t.find(".um-member-directory-view-type").removeClass("um-disabled")}}}),jQuery(document.body).on("blur",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)){var r=um_sanitize_value(jQuery(this).val()),t=jQuery(this).prop("name"),a=um_get_data_for_directory(e,"filter_"+t);void 0===a&&(a=""),r!==a&&(um_members_show_preloader(e),um_set_url_from_data(e,"filter_"+t,r),e.data("page",1),um_set_url_from_data(e,"page",""),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),jQuery(document.body).on("keypress",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(e){if(13===e.which){var r=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(r)){var t=um_sanitize_value(jQuery(this).val()),a=jQuery(this).prop("name"),i=um_get_data_for_directory(r,"filter_"+a);void 0===i&&(i=""),t!==i&&(um_members_show_preloader(r),um_set_url_from_data(r,"filter_"+a,t),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}}),jQuery(document.body).on("click",".um-directory .um-members-filter-remove",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)&&e){um_members_show_preloader(e);var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type");if("text"===a)um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("");else if("select"===a){var i=um_get_data_for_directory(e,"filter_"+t);i=void 0===i?[]:(i=um_unsanitize_value(i)).split("||"),-1!==jQuery.inArray(r.toString(),i)&&(i=jQuery.grep(i,function(e){return e!==r.toString()})),i.length||(i=""),um_set_url_from_data(e,"filter_"+t,i);var m=jQuery('.um-search-filter select[name="'+t+'"]');m.find('option[value="'+r+'"]').prop("disabled",!1).show(),m.find("option:not(:disabled)").length>1&&m.prop("disabled",!1),m.select2("destroy").select2({dropdownParent:m.parent()}),e.find('.um-search-filter select[data-um-parent="'+t+'"]').length>0&&m.trigger("change")}else if("slider"===a){um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to","");var d=jQuery(".um-search-filter #"+t+"_min").siblings(".um-slider"),s=d.slider("option");d.slider("values",[s.min,s.max]),jQuery(".um-search-filter #"+t+"_min").val(""),jQuery(".um-search-filter #"+t+"_max").val(""),um_set_range_label(d)}else"datepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):"timepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):wp.hooks.doAction("um_member_directory_filter_remove",a,e,t,r);e.data("page",1),um_set_url_from_data(e,"page",""),jQuery(this).tipsy("hide"),jQuery(this).parents(".um-members-filter-tag").remove(),0===e.find(".um-members-filter-remove").length?e.find(".um-clear-filters").hide():e.find(".um-clear-filters").show();var o=!1;if(!(o=wp.hooks.applyFilters("um_member_directory_ignore_after_search",o,e))&&1===e.data("must-search")){var l=um_get_search(e);if(0===e.find(".um-members-filter-remove").length&&!l){e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),um_members_hide_preloader(e);return}}e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}),jQuery(document.body).on("click",".um-directory .um-clear-filters-a",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)){um_members_show_preloader(e),e.find(".um-members-filter-remove").each(function(){var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type");if("text"===a)um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("");else if("select"===a){var i=um_get_data_for_directory(e,"filter_"+t);i=void 0===i?[]:(i=um_unsanitize_value(i)).split("||"),-1!==jQuery.inArray(r.toString(),i)&&(i=jQuery.grep(i,function(e){return e!==r.toString()})),i.length||(i=""),um_set_url_from_data(e,"filter_"+t,i);var m=jQuery('.um-search-filter select[name="'+t+'"]');m.find('option[value="'+r+'"]').prop("disabled",!1).show(),m.find("option:not(:disabled)").length>1&&m.prop("disabled",!1),m.select2("destroy").select2({dropdownParent:m.parent()}),e.find('.um-search-filter select[data-um-parent="'+t+'"]').length>0&&setTimeout(function(){m.trigger("change")},250)}else if("slider"===a){um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to","");var d=jQuery(".um-search-filter #"+t+"_min").siblings(".um-slider"),s=d.slider("option");d.slider("values",[s.min,s.max]),jQuery(".um-search-filter #"+t+"_min").val(""),jQuery(".um-search-filter #"+t+"_max").val(""),um_set_range_label(d)}else"datepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):"timepicker"===a?(um_set_url_from_data(e,"filter_"+t+"_from",""),um_set_url_from_data(e,"filter_"+t+"_to",""),jQuery(".um-search-filter #"+t+"_from").val(""),jQuery(".um-search-filter #"+t+"_to").val("")):wp.hooks.doAction("um_member_directory_clear_filters",a,e,t,r)}),e.data("page",1),um_set_url_from_data(e,"page",""),e.find(".um-members-filter-tag").remove(),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible"));var r=!1;if(!(r=wp.hooks.applyFilters("um_member_directory_ignore_after_search",r,e))&&1===e.data("must-search")&&!um_get_search(e)){e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),um_members_hide_preloader(e);return}e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}),wp.hooks.doAction("um_member_directory_on_first_pages_loading"),jQuery(".um-directory").each(function(){var e=jQuery(this),r=um_members_get_hash(e);um_member_directories.push(r),e.find(".um-search").length&&!e.find(".um-search").is(":visible")&&e.find(".um-search").css({display:"grid"}).slideUp(1),um_slider_filter_init(e),um_datepicker_filter_init(e),um_timepicker_filter_init(e),wp.hooks.doAction("um_member_directory_on_init",e,r);var t=!1;if(!(t=wp.hooks.applyFilters("um_member_directory_ignore_after_search",t,e))&&1===e.data("must-search")){var a=um_get_search(e);if(!um_get_filters_data(e).length&&!a)return}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,e,r)||(um_members_show_preloader(e),um_ajax_get_members(e,{first_load:!0}),um_change_tag(e))}),window.addEventListener("popstate",function(e){jQuery(".um-directory").each(function(){var e=jQuery(this),r=um_members_get_hash(e);if(um_member_directories.push(r),um_members_show_preloader(e),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-search-line").length){var t=um_get_data_for_directory(e,"search");void 0===t&&(t=""),e.data("general_search",t),e.find(".um-search-line").val(t)}var a=um_get_data_for_directory(e,"page");if(void 0===a?a=1:a>e.data("total_pages")&&(a=e.data("total_pages")),e.data("page",a).attr("data-page",a),e.find(".um-member-directory-sorting").length){var i=um_get_data_for_directory(e,"sort");void 0===i&&(i=e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),e.data("sorting",i);var m=e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]');m.find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),m.find('a[data-value="'+i+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),e.find(".um-member-directory-sorting-a").find("> a").html(m.find('a[data-value="'+i+'"]').html())}if(e.find(".um-member-directory-view-type").length){var d=um_get_data_for_directory(e,"view_type");void 0===d&&(d=e.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),e.data("view_type",d),e.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),e.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+d+'"]').show()}e.find(".um-datepicker-filter").each(function(){var r,t=jQuery(this),a=t.pickadate("picker"),i=um_get_data_for_directory(e,"filter_"+t.data("filter_name")+"_"+t.data("range"));void 0!==i?a.set("select",1e3*i):a.clear()}),e.find(".um-slider").each(function(){var r=jQuery(this),t=r.data("field_name"),a=um_get_data_for_directory(e,"filter_"+t+"_from"),i=um_get_data_for_directory(e,"filter_"+t+"_to");void 0===a&&(a=r.data("min")),a=parseInt(a),void 0===i&&(i=r.data("max")),i=parseInt(i),r.slider("values",[a,i]),um_set_range_label(r)}),e.find(".um-timepicker-filter").each(function(){var r,t=jQuery(this),a=t.pickatime("picker"),i=um_get_data_for_directory(e,"filter_"+t.data("filter_name")+"_"+t.data("range"));if(void 0!==i){var m=i.split(":");a.set("select",60*m[0])}else a.clear()});var s=!1;if(!(s=wp.hooks.applyFilters("um_member_directory_ignore_after_search",s,e))&&1===e.data("must-search")){var t=um_get_search(e);if(um_get_filters_data(e).length||t)e.data("searched",1);else{e.data("searched",0),um_members_hide_preloader(e);return}}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,e,r)||(um_ajax_get_members(e),um_change_tag(e))})})}); +var um_members_directory_busy=[],um_member_directories=[],um_member_directory_last_data=[];function um_parse_current_url(){var r={},t=window.location.search.substring(1).split("&");return jQuery.each(t,function(e){e=t[e].split("=");r[e[0]]=e[1]}),r}function um_get_data_for_directory(e,r){var t=um_members_get_hash(e),a={},i=um_parse_current_url();if(jQuery.each(i,function(e){-1!==e.indexOf("_"+t)&&""!==i[e]&&(a[e.replace("_"+t,"")]=i[e])}),r){if(void 0!==a[r])try{a[r]=decodeURIComponent(a[r])}catch(e){console.error(e)}return a[r]}return a}function um_set_url_from_data(e,r,t){var a=um_members_get_hash(e),i=um_get_data_for_directory(e),m={},d=(Array.isArray(t)?(jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")):jQuery.isNumeric(t)||(t=t.split("||"),jQuery.each(t,function(e){t[e]=encodeURIComponent(t[e])}),t=t.join("||")),""!==t&&(m[r+"_"+a]=t),jQuery.each(i,function(e){r===e?""!==t&&(m[e+"_"+a]=t):m[e+"_"+a]=i[e]}),jQuery.each(um_member_directories,function(e){var r,t=um_member_directories[e];t!==a&&(r=um_get_data_for_directory(jQuery('.um-directory[data-hash="'+t+'"]')),jQuery.each(r,function(e){m[e+"_"+t]=r[e]}))}),[]),e=(jQuery.each(m,function(e){d.push(e+"="+m[e])}),"?"+(d=wp.hooks.applyFilters("um_member_directory_url_attrs",d)).join("&"));"?"===e&&(e=""),window.history.pushState("string","UM Member Directory",window.location.origin+window.location.pathname+e)}function um_members_get_hash(e){return e.data("hash")}function um_is_directory_busy(e){e=um_members_get_hash(e);return void 0!==um_members_directory_busy[e]&&um_members_directory_busy[e]}function um_members_show_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!0,e.find(".um-members-overlay").show()}function um_members_hide_preloader(e){um_members_directory_busy[um_members_get_hash(e)]=!1,e.find(".um-members-overlay").hide()}function um_set_range_label(e,r){var t,a="",i=e.siblings(".um-slider-range").data("placeholder-s"),m=e.siblings(".um-slider-range").data("placeholder-p"),r=r?(a=(r.values[0]===r.values[1]?i.replace("{value}",r.values[0]):m.replace("{min_range}",r.values[0]).replace("{max_range}",r.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=r.values[0],r.values[1]):(a=(e.slider("values",0)===e.slider("values",1)?i.replace("{value}",e.slider("values",0)):m.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(a),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(r)}function um_get_search(e){return e.find(".um-search-line").length?e.find(".um-search-line").val():""}function um_get_sort(e){return e.data("sorting")}function um_get_current_page(e){e=e.data("page");return e=e&&void 0!==e?e:1}function um_time_convert(e,r){var t=Math.floor(e/60),e=e%60;return(t=60<=e&&(e=0,24<=(t+=1))?0:t)+":"+(e=e<10?"0"+e:e)}function um_ajax_get_members(_,e){var r,t,a,i,s,m=um_members_get_hash(_);wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,m,_)?(r=um_get_current_page(_),t=um_get_search(_),a=um_get_sort(_),i=-(new Date).getTimezoneOffset()/60,s={directory_id:m,page:r,search:t,sorting:a,gmt_offset:i,post_refferer:_.data("base-post"),nonce:um_scripts.nonce},_.find(".um-search-filter").length&&_.find(".um-search-filter").each(function(){var e,r,t,a,i,m,d,u=jQuery(this);u.find(".um-slider").length?(m=u.find(".um-slider").data("field_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-datepicker-filter").length?(m=u.find(".um-datepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find(".um-timepicker-filter").length?(m=u.find(".um-timepicker-filter").data("filter_name"),r=um_get_data_for_directory(_,"filter_"+m+"_from"),e=um_get_data_for_directory(_,"filter_"+m+"_to"),void 0!==r&&(r=(i=(i=+(r=r.split(":"))[0])<10?"0"+i:i)+":"+(a=(a=+r[1])<10?"0"+a:a)+":00"),void 0!==e&&(a=+(t=e.split(":"))[1],e=(i=(i=+t[0])<10?"0"+i:i)+":"+(a=a<10?"0"+a:a)+":59"),void 0===r&&void 0===e||(s[m]=[r,e])):u.find("select").length?(m=u.find("select").attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d.split("||"))):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(m=u.find('input[type="text"]').attr("name"),void 0!==(d=um_get_data_for_directory(_,"filter_"+m))&&(d=um_unsanitize_value(d),s[m]=d)):s=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",s,u,_)}),s=wp.hooks.applyFilters("um_member_directory_filter_request",s),wp.ajax.send("um_get_members",{data:s,success:function(e){um_member_directory_last_data[m]=e,um_build_template(_,e);var r=wp.template("um-members-pagination");_.find(".um-members-pagination-box").html(r(e)),_.data("total_pages",e.pagination.total_pages),e.pagination.total_pages?(_.find(".um-member-directory-sorting-options").prop("disabled",!1),_.find(".um-member-directory-view-type").removeClass("um-disabled")):(_.find(".um-member-directory-sorting-options").prop("disabled",!0),_.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",_,e),um_init_new_dropdown(),um_members_hide_preloader(_)},error:function(e){console.log(e),um_members_hide_preloader(_)}})):setTimeout(um_ajax_get_members,600,_,e)}function um_build_template(e,r){var t,a=e.data("view_type"),a=wp.template("um-member-"+a+"-"+um_members_get_hash(e));jQuery(".um-"+um_members_get_hash(e)).length&&(e.find(".um-members-grid, .um-members-list").remove(),e.find(".um-members-wrapper").prepend(a(r.users)),a=wp.template("um-members-header"),e.find(".um-members-intro").remove(),t=wp.hooks.applyFilters("um_member_directory_generate_header",!1,e),(void 0!==r.is_search&&r.is_search||t)&&e.find(".um-members-wrapper").prepend(a(r)),e.addClass("um-loaded"),wp.hooks.addAction("um_window_resize","um_members",function(){e.find(".um-members.um-members-grid").length&&UM_Member_Grid(e.find(".um-members.um-members-grid"))}),jQuery(document).trigger("um_build_template",[e,r]),jQuery(window).trigger("resize"),UM.common.tipsy.init())}function UM_Member_Grid(r){r.find(".um-member").length&&r.imagesLoaded(function(){var e=wp.hooks.applyFilters("um_member_directory_grid_masonry_attrs",{itemSelector:".um-member",columnWidth:".um-member",gutter:".um-gutter-sizer"},r);r.masonry(e).on("layoutComplete",function(e,r){jQuery(document).trigger("um_grid_initialized",[e,r])})})}function um_get_filters_data(_){var s=[];return _.find(".um-search-filter").each(function(){var d,t,a,i,e,r,m,u=jQuery(this);u.find("input.um-datepicker-filter").length?(d="datepicker",u.find("input.um-datepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("input.um-timepicker-filter").length?(d="timepicker",u.find("input.um-timepicker-filter").each(function(){var e,r,t,a,i,m;"to"!==jQuery(this).data("range")&&(e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(_,"filter_"+e+"_from"),t=um_get_data_for_directory(_,"filter_"+e+"_to"),void 0!==r||void 0!==t)&&((a=jQuery(this).val())===(i=_.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val())?m=i:""!==a&&""!==i?m=a+" - "+i:""===a?m="before "+i:""===i&&(m="since "+a),s.push({name:e,label:jQuery(this).data("filter-label"),value_label:m,value:[r,t],type:d}))})):u.find("select").length?(d="select",t=u.find("select").attr("name"),a=u.find("select").data("placeholder"),i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?[]:(i=um_unsanitize_value(i)).split("||"),jQuery.each(i,function(e){var r=u.find('select option[value="'+i[e]+'"]').data("value_label");s.push({name:t,label:a,value_label:r,value:i[e],type:d})})):u.hasClass("um-text-filter-type")&&u.find('input[type="text"]').length?(d="text",t=u.find('input[type="text"]').attr("name"),a=u.find('input[type="text"]').attr("placeholder"),""!=(i=void 0===(i=um_get_data_for_directory(_,"filter_"+t))?"":i)&&s.push({name:t,label:a,value_label:i,value:i,type:d})):u.find("div.ui-slider").length?(d="slider",t=u.find("div.ui-slider").data("field_name"),e=um_get_data_for_directory(_,"filter_"+t+"_from"),r=um_get_data_for_directory(_,"filter_"+t+"_to"),void 0===e&&void 0===r||(m=(e===r?u.find("div.um-slider-range").data("placeholder-s").replace("{value}",e):u.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",e).replace("{max_range}",r)).replace("{field_label}",u.find("div.um-slider-range").data("label")),a=u.find("div.um-slider-range").data("label"),s.push({name:t,label:a,value_label:m,value:[e,r],type:d}))):s=wp.hooks.applyFilters("um_member_directory_get_filter_data",s,_,u)}),s}function um_change_tag(e){var r,t=um_get_filters_data(e),a=(e.find(".um-members-filter-tag").remove(),e.find(".um-filtered-line"));a.length&&(r=wp.template("um-members-filtered-line"),a.prepend(r({filters:t})),0===e.find(".um-members-filter-remove").length?(e.find(".um-clear-filters").hide(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").addClass("um-header-row-invisible")):(e.find(".um-clear-filters").show(),e.find(".um-clear-filters").parents(".um-member-directory-header-row").removeClass("um-header-row-invisible")))}function um_run_search(e){if(!um_is_directory_busy(e)){um_members_show_preloader(e);var r=um_get_data_for_directory(e,"search"),t=um_sanitize_value(e.find(".um-search-line").val());if(t===r||""===t&&void 0===r)um_members_hide_preloader(e);else{e.data("general_search",t),um_set_url_from_data(e,"search",t),e.data("page",1),um_set_url_from_data(e,"page","");if(!wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,e)){r=e.data("must-search");if(1===r&&(t=um_get_search(e),0===e.find(".um-members-filter-remove").length)&&!t)return e.data("searched",0),e.find(".um-members-grid, .um-members-list, .um-members-intro").remove(),e.find(".um-member-directory-sorting-options").prop("disabled",!0),e.find(".um-member-directory-view-type").addClass("um-disabled"),wp.hooks.doAction("um_member_directory_clear_not_searched",e),void um_members_hide_preloader(e)}e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"),um_ajax_get_members(e)}}}function um_slider_filter_init(e){e.find(".um-slider").each(function(){var e=jQuery(this),t=e.parents(".um-directory"),a=e.data("field_name"),r=um_get_data_for_directory(t,"filter_"+a+"_from"),i=um_get_data_for_directory(t,"filter_"+a+"_to"),r=[r=void 0===r?parseInt(e.data("min")):r,i=void 0===i?parseInt(e.data("max")):i];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:r,create:function(e,r){},step:1,slide:function(e,r){um_set_range_label(jQuery(this),r)},stop:function(e,r){um_is_directory_busy(t)||(um_members_show_preloader(t),um_set_url_from_data(t,"filter_"+a+"_from",r.values[0]),um_set_url_from_data(t,"filter_"+a+"_to",r.values[1]),t.data("page",1),um_set_url_from_data(t,"page",""),um_ajax_get_members(t),um_change_tag(t),t.data("searched",1),t.find(".um-member-directory-sorting-options").prop("disabled",!1),t.find(".um-member-directory-view-type").removeClass("um-disabled"))}}),um_set_range_label(e)})}function um_datepicker_filter_init(e){e.find(".um-datepicker-filter").each(function(){var d=jQuery(this),u=new Date(1e3*d.data("date_min")),_=new Date(1e3*d.data("date_max")),e=d.pickadate({selectYears:!0,min:u,max:_,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){d.blur()},onClose:function(){d.blur()},onSet:function(e){var r,t,a,i,m;!e.select||um_is_directory_busy(r=d.parents(".um-directory"))||(um_members_show_preloader(r),t=d.data("filter_name"),a=d.data("range"),i=um_get_data_for_directory(r,"filter_"+t+"_from"),m=um_get_data_for_directory(r,"filter_"+t+"_to"),void 0===i&&(i=u/1e3),void 0===m&&(m=_/1e3),e=e.select/1e3,d.val(),"from"===a?i=e:"to"===a&&(m=e),um_set_url_from_data(r,"filter_"+t+"_from",i),um_set_url_from_data(r,"filter_"+t+"_to",m),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}).pickadate("picker"),r=d.data("filter_name"),t=d.data("range"),r=um_get_data_for_directory(d.parents(".um-directory"),"filter_"+r+"_"+t);void 0!==r&&e.set("select",1e3*r)})}function um_timepicker_filter_init(e){e.find(".um-timepicker-filter").each(function(){var d=jQuery(this),u=d.attr("id"),_=d.data("filter_name"),s=d.attr("data-min"),o=d.attr("data-max"),e=s.split(":"),r=o.split(":"),e=d.pickatime({format:d.data("format"),interval:parseInt(d.data("intervals")),min:[e[0],e[1]],max:[r[0],r[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){d.blur()},onClose:function(){d.blur()},onSet:function(e){var r,t,a,i,m;!e.select||um_is_directory_busy(r=d.parents(".um-directory"))||(um_members_show_preloader(r),t=d.data("filter_name"),a=d.data("range"),i=um_get_data_for_directory(r,"filter_"+t+"_from"),m=um_get_data_for_directory(r,"filter_"+t+"_to"),void 0===i&&(i=s),void 0===m&&(m=o),void 0!==e.select?(e=um_time_convert(e.select,a),"from"===a?i=e:"to"===a&&(m=e)):"from"===a?i=s:"to"===a&&(m=o),e=jQuery("#"+u).val(),"from"===d.data("range")?jQuery("#"+_+"_to").pickatime("picker").set("min",e):jQuery("#"+_+"_from").pickatime("picker").set("max",e),um_set_url_from_data(r,"filter_"+t+"_from",i),um_set_url_from_data(r,"filter_"+t+"_to",m),r.data("page",1),um_set_url_from_data(r,"page",""),um_ajax_get_members(r),um_change_tag(r),r.data("searched",1),r.find(".um-member-directory-sorting-options").prop("disabled",!1),r.find(".um-member-directory-view-type").removeClass("um-disabled"))}}).pickatime("picker"),r=d.data("filter_name"),t=d.data("range"),r=um_get_data_for_directory(d.parents(".um-directory"),"filter_"+r+"_"+t);void 0!==r&&(t=r.split(":"),e.set("select",60*t[0]+ +t[1]))})}jQuery(document.body).ready(function(){jQuery(".um-directory .um-search-filter select").each(function(){1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0);var e=jQuery(this);e.select2("destroy").select2({dropdownParent:e.parent()})}),jQuery(document.body).on("mouseover",".um-directory .um-member-directory-view-type",function(){var e;jQuery(this).hasClass("um-disabled")||((e=jQuery(this).find(".um-member-directory-view-type-a:visible")).hide(),(e.next().length?e.next():jQuery(this).find(".um-member-directory-view-type-a:first")).show().tipsy("show"))}).on("mouseout",".um-directory .um-member-directory-view-type",function(){jQuery(this).hasClass("um-disabled")||(jQuery(this).find(".um-member-directory-view-type-a").hide().tipsy("hide"),jQuery(this).find('.um-member-directory-view-type-a[data-type="'+jQuery(this).parents(".um-directory").data("view_type")+'"]').show())}),jQuery(document.body).on("click",".um-directory .um-member-directory-view-type-a",function(){var e=jQuery(this).parents(".um-directory");if(um_is_directory_busy(e))return!1;var r,t=jQuery(this),a=t.parents(".um-member-directory-view-type");a.hasClass("um-disabled")||(um_members_show_preloader(e),(r=a.find(".um-member-directory-view-type-a:visible")).hide(),(r.next().length?r.next():a.find(".um-member-directory-view-type-a:first")).show().tipsy("show"),null!==(r=um_member_directory_last_data[um_members_get_hash(e)])&&(um_set_url_from_data(e,"view_type",a=t.data("type")),e.data("view_type",a),um_build_template(e,r),um_init_new_dropdown()),um_members_hide_preloader(e))}),jQuery(document.body).on("click",".um-directory .um-do-search",function(){um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("keypress",".um-directory .um-search-line",function(e){13===e.which&&um_run_search(jQuery(this).parents(".um-directory"))}),jQuery(document.body).on("click",'.um-new-dropdown[data-element=".um-member-directory-sorting-a"] li a',function(){var e,r,t;1===jQuery(this).data("selected")||(e=jQuery(this).data("directory-hash"),um_is_directory_busy(e=jQuery('.um-directory[data-hash="'+e+'"]')))||(um_members_show_preloader(e),r=jQuery(this).html(),t=jQuery(this).data("value"),e.data("sorting",t),um_set_url_from_data(e,"sort",t),um_ajax_get_members(e),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"] a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),e.find(".um-member-directory-sorting-a").find("> a").html(r))}),jQuery(document.body).on("click",".um-directory .pagi:not(.current)",function(){var e,r;jQuery(this).hasClass("disabled")||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),(1===(r="first"===jQuery(this).data("page")?1:"prev"===jQuery(this).data("page")?+e.data("page")-1:"next"===jQuery(this).data("page")?+e.data("page")+1:"last"===jQuery(this).data("page")?parseInt(e.data("total_pages")):parseInt(jQuery(this).data("page")))?(e.find('.pagi[data-page="first"], .pagi[data-page="prev"]').addClass("disabled"),e.find('.pagi[data-page="prev"], .pagi[data-page="last"]')):(r===parseInt(e.data("total_pages"))?e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').addClass("disabled"):e.find('.pagi[data-page="prev"], .pagi[data-page="last"]').removeClass("disabled"),e.find('.pagi[data-page="first"], .pagi[data-page="prev"]'))).removeClass("disabled"),e.find(".pagi").removeClass("current"),e.find('.pagi[data-page="'+r+'"]').addClass("current"),e.data("page",r),um_set_url_from_data(e,"page",1===r?"":r),um_ajax_get_members(e))}),jQuery(document.body).on("change",".um-directory .um-members-pagi-dropdown",function(){var e,r=jQuery(this).parents(".um-directory");um_is_directory_busy(r)||(um_members_show_preloader(r),e=jQuery(this).val(),r.find(".pagi").removeClass("current"),r.find('.pagi[data-page="'+e+'"]').addClass("current"),r.data("page",e),um_set_url_from_data(r,"page",1===e?"":e),um_ajax_get_members(r))}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-more a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-more").hide(),e.find(".um-member-meta-main").slideDown(),e.find(".um-member-less").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-list .um-member-less a",function(e){e.preventDefault();e=jQuery(this).parents(".um-member");return e.find(".um-member-less").hide(),e.find(".um-member-meta-main").slideUp(),e.find(".um-member-more").fadeIn(),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-more a",function(e){e.preventDefault();var e=jQuery(this).parents(".um-member"),r=jQuery(this).parents(".um-members");return e.find(".um-member-more").hide(),e.find(".um-member-meta").slideDown(function(){UM_Member_Grid(r)}),e.find(".um-member-less").fadeIn(),setTimeout(function(){UM_Member_Grid(r)},100),!1}),jQuery(document.body).on("click",".um-directory .um-members.um-members-grid .um-member-less a",function(e){e.preventDefault();var r=jQuery(this).parents(".um-member"),t=jQuery(this).parents(".um-members");return r.find(".um-member-less").hide(),r.find(".um-member-meta").slideUp(function(){r.find(".um-member-more").fadeIn(),UM_Member_Grid(t)}),!1}),jQuery(".um-member-directory-filters-a").on("click",function(){var e=jQuery(this),r=e.parents(".um-directory").find(".um-search");r.is(":visible")?r.slideUp(250,function(){e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}):r.slideDown({duration:250,start:function(){jQuery(this).css({display:"grid"}),e.toggleClass("um-member-directory-filters-visible"),r.parents(".um-member-directory-header-row").toggleClass("um-header-row-invisible")}})}),jQuery(document.body).on("change",".um-directory .um-search-filter select",function(){var e,r,t,a=jQuery(this).val(),i=um_sanitize_value(a);""===i||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(um_members_show_preloader(e),t=void 0===(t=um_get_data_for_directory(e,"filter_"+(r=jQuery(this).prop("name"))))?[]:t.split("||"),-1===jQuery.inArray(i,t)&&(t.push(i),um_set_url_from_data(e,"filter_"+r,t=t.join("||")),e.data("page",1),um_set_url_from_data(e,"page","")),jQuery(this).find('option[value="'+a+'"]').prop("disabled",!0).hide(),1===jQuery(this).find("option:not(:disabled)").length&&jQuery(this).prop("disabled",!0),(i=jQuery(this)).select2("destroy").select2({dropdownParent:i.parent()}),i.val("").trigger("change"),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("blur",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(){var e,r,t,a=jQuery(this).parents(".um-directory");um_is_directory_busy(a)||(e=um_sanitize_value(jQuery(this).val()))!==(t=void 0===(t=um_get_data_for_directory(a,"filter_"+(r=jQuery(this).prop("name"))))?"":t)&&(um_members_show_preloader(a),um_set_url_from_data(a,"filter_"+r,e),a.data("page",1),um_set_url_from_data(a,"page",""),um_ajax_get_members(a),um_change_tag(a),a.data("searched",1),a.find(".um-member-directory-sorting-options").prop("disabled",!1),a.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("keypress",'.um-directory .um-search-filter.um-text-filter-type input[type="text"]',function(e){var r,t,a;13!==e.which||um_is_directory_busy(e=jQuery(this).parents(".um-directory"))||(r=um_sanitize_value(jQuery(this).val()))!==(a=void 0===(a=um_get_data_for_directory(e,"filter_"+(t=jQuery(this).prop("name"))))?"":a)&&(um_members_show_preloader(e),um_set_url_from_data(e,"filter_"+t,r),e.data("page",1),um_set_url_from_data(e,"page",""),um_ajax_get_members(e),um_change_tag(e),e.data("searched",1),e.find(".um-member-directory-sorting-options").prop("disabled",!1),e.find(".um-member-directory-view-type").removeClass("um-disabled"))}),jQuery(document.body).on("click",".um-directory .um-members-filter-remove",function(){var e=jQuery(this).parents(".um-directory");if(!um_is_directory_busy(e)&&e){um_members_show_preloader(e);var r=jQuery(this).data("value"),t=jQuery(this).data("name"),a=jQuery(this).data("type"),i=("text"===a?(um_set_url_from_data(e,"filter_"+t,""),jQuery('.um-search-filter input[name="'+t+'"]').val("")):"select"===a?(m=void 0===(m=um_get_data_for_directory(e,"filter_"+t))?[]:(m=um_unsanitize_value(m)).split("||"),um_set_url_from_data(e,"filter_"+t,m=(m=-1!==jQuery.inArray(r.toString(),m)?jQuery.grep(m,function(e){return e!==r.toString()}):m).length?m:""),(m=jQuery('.um-search-filter select[name="'+t+'"]')).find('option[value="'+r+'"]').prop("disabled",!1).show(),1a.data("total_pages")&&(t=a.data("total_pages")),a.data("page",t).attr("data-page",t),a.find(".um-member-directory-sorting").length&&(void 0===(t=um_get_data_for_directory(a,"sort"))&&(t=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),a.data("sorting",t),(e=a.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]')).find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),e.find('a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),a.find(".um-member-directory-sorting-a").find("> a").html(e.find('a[data-value="'+t+'"]').html())),a.find(".um-member-directory-view-type").length&&(void 0===(e=um_get_data_for_directory(a,"view_type"))&&(e=a.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),a.data("view_type",e),a.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),a.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+e+'"]').show()),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=e.pickadate("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?r.set("select",1e3*t):r.clear()}),a.find(".um-slider").each(function(){var e=jQuery(this),r=e.data("field_name"),t=um_get_data_for_directory(a,"filter_"+r+"_from"),r=um_get_data_for_directory(a,"filter_"+r+"_to");void 0===t&&(t=e.data("min")),t=parseInt(t),void 0===r&&(r=e.data("max")),r=parseInt(r),e.slider("values",[t,r]),um_set_range_label(e)}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.pickatime("picker"),t=e.data("filter_name"),e=e.data("range"),t=um_get_data_for_directory(a,"filter_"+t+"_"+e);void 0!==t?(e=t.split(":"),r.set("select",60*e[0])):r.clear()}),wp.hooks.applyFilters("um_member_directory_ignore_after_search",!1,a));if(!t&&1===a.data("must-search")){var i=um_get_search(a);if(!um_get_filters_data(a).length&&!i)return a.data("searched",0),void um_members_hide_preloader(a);a.data("searched",1)}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,a,r)||(um_ajax_get_members(a),um_change_tag(a))})})}); \ No newline at end of file From c17b44ca5ef3edfc2dd190f44b6a37e5d8e0ae6d Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 23:24:55 +0300 Subject: [PATCH 30/97] * fixed #1531; --- includes/admin/templates/role/admin-permissions.php | 4 ++-- includes/admin/templates/role/profile.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/admin/templates/role/admin-permissions.php b/includes/admin/templates/role/admin-permissions.php index 524ca8b5..0ca00b4d 100644 --- a/includes/admin/templates/role/admin-permissions.php +++ b/includes/admin/templates/role/admin-permissions.php @@ -33,7 +33,7 @@ 'id' => '_um_can_edit_roles', 'type' => 'select', 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), - 'tooltip' => __( 'Which roles that role can edit, choose none to allow role to edit all member roles', 'ultimate-member' ), + 'tooltip' => __( 'Multiple selections of which roles this role can edit, none selected to allow this role to edit all member roles.', 'ultimate-member' ), 'options' => UM()->roles()->get_roles(), 'multi' => true, 'value' => ! empty( $role['_um_can_edit_roles'] ) ? $role['_um_can_edit_roles'] : array(), @@ -50,7 +50,7 @@ 'id' => '_um_can_delete_roles', 'type' => 'select', 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), - 'tooltip' => __( 'Which roles that role can edit, choose none to allow role to edit all member roles', 'ultimate-member' ), + 'tooltip' => __( 'Multiple selections of which roles this role can delete, none selected to allow this role to delete all member roles', 'ultimate-member' ), 'options' => UM()->roles()->get_roles(), 'multi' => true, 'value' => ! empty( $role['_um_can_delete_roles'] ) ? $role['_um_can_delete_roles'] : array(), diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php index b5c95bdb..79769c35 100644 --- a/includes/admin/templates/role/profile.php +++ b/includes/admin/templates/role/profile.php @@ -19,7 +19,7 @@ 'id' => '_um_can_view_roles', 'type' => 'select', 'label' => __( 'Can view these user roles only', 'ultimate-member' ), - 'tooltip' => __( 'Which roles that role can view, choose none to allow role to view all member roles', 'ultimate-member' ), + 'tooltip' => __( 'Multiple selections of which roles this role can view, none selected to allow this role to view all member roles.', 'ultimate-member' ), 'options' => UM()->roles()->get_roles(), 'multi' => true, 'value' => ! empty( $role['_um_can_view_roles'] ) ? $role['_um_can_view_roles'] : array(), @@ -58,4 +58,4 @@ ) ) )->render_form(); ?> - \ No newline at end of file + From f6c02931af712a29718649f8212c3b9ba7ec7604 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 23:28:43 +0300 Subject: [PATCH 31/97] * fixed #1531; * WPCS; --- .../templates/role/admin-permissions.php | 119 +++++++++--------- includes/admin/templates/role/profile.php | 118 ++++++++--------- 2 files changed, 123 insertions(+), 114 deletions(-) diff --git a/includes/admin/templates/role/admin-permissions.php b/includes/admin/templates/role/admin-permissions.php index 0ca00b4d..553ed177 100644 --- a/includes/admin/templates/role/admin-permissions.php +++ b/includes/admin/templates/role/admin-permissions.php @@ -1,61 +1,66 @@ - - - +
- admin_forms( array( - 'class' => 'um-role-admin um-half-column', - 'prefix_id' => 'role', - 'fields' => array( - array( - 'id' => '_um_can_access_wpadmin', - 'type' => 'checkbox', - 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), - 'tooltip' => __( 'The core admin role must always have access to wp-admin / WordPress backend', 'ultimate-member' ), - 'value' => ! empty( $role['_um_can_access_wpadmin'] ) ? $role['_um_can_access_wpadmin'] : 0, + admin_forms( + array( + 'class' => 'um-role-admin um-half-column', + 'prefix_id' => 'role', + 'fields' => array( + array( + 'id' => '_um_can_access_wpadmin', + 'type' => 'checkbox', + 'label' => __( 'Can access wp-admin?', 'ultimate-member' ), + 'tooltip' => __( 'The core admin role must always have access to wp-admin / WordPress backend', 'ultimate-member' ), + 'value' => ! empty( $role['_um_can_access_wpadmin'] ) ? $role['_um_can_access_wpadmin'] : 0, + ), + array( + 'id' => '_um_can_not_see_adminbar', + 'type' => 'checkbox', + 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), + 'tooltip' => __( 'Mark this option if you need to hide the adminbar on frontend for this role', 'ultimate-member' ), + 'value' => isset( $role['_um_can_not_see_adminbar'] ) ? $role['_um_can_not_see_adminbar'] : 1, + ), + array( + 'id' => '_um_can_edit_everyone', + 'type' => 'checkbox', + 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), + 'tooltip' => __( 'Allow this role to edit accounts of other members', 'ultimate-member' ), + 'value' => ! empty( $role['_um_can_edit_everyone'] ) ? $role['_um_can_edit_everyone'] : 0, + ), + array( + 'id' => '_um_can_edit_roles', + 'type' => 'select', + 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), + 'tooltip' => __( 'Multiple selections of which roles this role can edit, none selected to allow this role to edit all member roles.', 'ultimate-member' ), + 'options' => UM()->roles()->get_roles(), + 'multi' => true, + 'value' => ! empty( $role['_um_can_edit_roles'] ) ? $role['_um_can_edit_roles'] : array(), + 'conditional' => array( '_um_can_edit_everyone', '=', '1' ) + ), + array( + 'id' => '_um_can_delete_everyone', + 'type' => 'checkbox', + 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), + 'tooltip' => __( 'Allow this role to delete other user accounts.', 'ultimate-member' ), + 'value' => ! empty( $role['_um_can_delete_everyone'] ) ? $role['_um_can_delete_everyone'] : 0, + ), + array( + 'id' => '_um_can_delete_roles', + 'type' => 'select', + 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), + 'tooltip' => __( 'Multiple selections of which roles this role can delete, none selected to allow this role to delete all member roles', 'ultimate-member' ), + 'options' => UM()->roles()->get_roles(), + 'multi' => true, + 'value' => ! empty( $role['_um_can_delete_roles'] ) ? $role['_um_can_delete_roles'] : array(), + 'conditional' => array( '_um_can_delete_everyone', '=', '1' ) + ) ), - array( - 'id' => '_um_can_not_see_adminbar', - 'type' => 'checkbox', - 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ), - 'tooltip' => __( 'Mark this option if you need to hide the adminbar on frontend for this role', 'ultimate-member' ), - 'value' => isset( $role['_um_can_not_see_adminbar'] ) ? $role['_um_can_not_see_adminbar'] : 1, - ), - array( - 'id' => '_um_can_edit_everyone', - 'type' => 'checkbox', - 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ), - 'tooltip' => __( 'Allow this role to edit accounts of other members', 'ultimate-member' ), - 'value' => ! empty( $role['_um_can_edit_everyone'] ) ? $role['_um_can_edit_everyone'] : 0, - ), - array( - 'id' => '_um_can_edit_roles', - 'type' => 'select', - 'label' => __( 'Can edit these user roles only', 'ultimate-member' ), - 'tooltip' => __( 'Multiple selections of which roles this role can edit, none selected to allow this role to edit all member roles.', 'ultimate-member' ), - 'options' => UM()->roles()->get_roles(), - 'multi' => true, - 'value' => ! empty( $role['_um_can_edit_roles'] ) ? $role['_um_can_edit_roles'] : array(), - 'conditional' => array( '_um_can_edit_everyone', '=', '1' ) - ), - array( - 'id' => '_um_can_delete_everyone', - 'type' => 'checkbox', - 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), - 'tooltip' => __( 'Allow this role to delete other user accounts.', 'ultimate-member' ), - 'value' => ! empty( $role['_um_can_delete_everyone'] ) ? $role['_um_can_delete_everyone'] : 0, - ), - array( - 'id' => '_um_can_delete_roles', - 'type' => 'select', - 'label' => __( 'Can delete these user roles only', 'ultimate-member' ), - 'tooltip' => __( 'Multiple selections of which roles this role can delete, none selected to allow this role to delete all member roles', 'ultimate-member' ), - 'options' => UM()->roles()->get_roles(), - 'multi' => true, - 'value' => ! empty( $role['_um_can_delete_roles'] ) ? $role['_um_can_delete_roles'] : array(), - 'conditional' => array( '_um_can_delete_everyone', '=', '1' ) - ) ) - ) )->render_form(); ?> + )->render_form(); + ?>
diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php index 79769c35..4a7440be 100644 --- a/includes/admin/templates/role/profile.php +++ b/includes/admin/templates/role/profile.php @@ -1,61 +1,65 @@ - - - +
- admin_forms( array( - 'class' => 'um-role-profile um-half-column', - 'prefix_id' => 'role', - 'fields' => array( - array( - 'id' => '_um_can_view_all', - 'type' => 'checkbox', - 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), - 'tooltip' => __( 'Can this role view all member profiles?', 'ultimate-member' ), - 'value' => ! empty( $role['_um_can_view_all'] ) ? $role['_um_can_view_all'] : 0, + admin_forms( + array( + 'class' => 'um-role-profile um-half-column', + 'prefix_id' => 'role', + 'fields' => array( + array( + 'id' => '_um_can_view_all', + 'type' => 'checkbox', + 'label' => __( 'Can view other member profiles?', 'ultimate-member' ), + 'tooltip' => __( 'Can this role view all member profiles?', 'ultimate-member' ), + 'value' => ! empty( $role['_um_can_view_all'] ) ? $role['_um_can_view_all'] : 0, + ), + array( + 'id' => '_um_can_view_roles', + 'type' => 'select', + 'label' => __( 'Can view these user roles only', 'ultimate-member' ), + 'tooltip' => __( 'Multiple selections of which roles this role can view, none selected to allow this role to view all member roles.', 'ultimate-member' ), + 'options' => UM()->roles()->get_roles(), + 'multi' => true, + 'value' => ! empty( $role['_um_can_view_roles'] ) ? $role['_um_can_view_roles'] : array(), + 'conditional' => array( '_um_can_view_all', '=', '1' ) + ), + array( + 'id' => '_um_can_make_private_profile', + 'type' => 'checkbox', + 'name' => '_um_can_make_private_profile', + 'label' => __( 'Can make their profile private?', 'ultimate-member' ), + 'tooltip' => __( 'Can this role make their profile private?', 'ultimate-member' ), + 'value' => ! empty( $role['_um_can_make_private_profile'] ) ? $role['_um_can_make_private_profile'] : 0, + ), + array( + 'id' => '_um_can_access_private_profile', + 'type' => 'checkbox', + 'name' => '_um_can_access_private_profile', + 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), + 'tooltip' => __( 'Can this role view private profiles?', 'ultimate-member' ), + 'value' => ! empty( $role['_um_can_access_private_profile'] ) ? $role['_um_can_access_private_profile'] : 0, + ), + array( + 'id' => '_um_profile_noindex', + 'type' => 'select', + 'size' => 'medium', + 'name' => '_um_profile_noindex', + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'tooltip' => __( 'Hides the profile page for robots. The default value depends on the General > Users setting.', 'ultimate-member' ), + 'options' => array( + '' => __( 'Default', 'ultimate-member' ), + '0' => __( 'No', 'ultimate-member' ), + '1' => __( 'Yes', 'ultimate-member' ), + ), + 'value' => array_key_exists( '_um_profile_noindex', $role ) ? $role['_um_profile_noindex'] : '', + ), ), - array( - 'id' => '_um_can_view_roles', - 'type' => 'select', - 'label' => __( 'Can view these user roles only', 'ultimate-member' ), - 'tooltip' => __( 'Multiple selections of which roles this role can view, none selected to allow this role to view all member roles.', 'ultimate-member' ), - 'options' => UM()->roles()->get_roles(), - 'multi' => true, - 'value' => ! empty( $role['_um_can_view_roles'] ) ? $role['_um_can_view_roles'] : array(), - 'conditional' => array( '_um_can_view_all', '=', '1' ) - ), - array( - 'id' => '_um_can_make_private_profile', - 'type' => 'checkbox', - 'name' => '_um_can_make_private_profile', - 'label' => __( 'Can make their profile private?', 'ultimate-member' ), - 'tooltip' => __( 'Can this role make their profile private?', 'ultimate-member' ), - 'value' => ! empty( $role['_um_can_make_private_profile'] ) ? $role['_um_can_make_private_profile'] : 0, - ), - array( - 'id' => '_um_can_access_private_profile', - 'type' => 'checkbox', - 'name' => '_um_can_access_private_profile', - 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ), - 'tooltip' => __( 'Can this role view private profiles?', 'ultimate-member' ), - 'value' => ! empty( $role['_um_can_access_private_profile'] ) ? $role['_um_can_access_private_profile'] : 0, - ), - array( - 'id' => '_um_profile_noindex', - 'type' => 'select', - 'size' => 'medium', - 'name' => '_um_profile_noindex', - 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), - 'tooltip' => __( 'Hides the profile page for robots. The default value depends on the General > Users setting.', 'ultimate-member' ), - 'options' => [ - '' => __( 'Default', 'ultimate-member' ), - '0' => __( 'No', 'ultimate-member' ), - '1' => __( 'Yes', 'ultimate-member' ), - ], - 'value' => array_key_exists( '_um_profile_noindex', $role ) ? $role['_um_profile_noindex'] : '', - ) ) - ) )->render_form(); ?> - + )->render_form(); + ?>
From 28103de201b6c324c7d089fcdf17516cf9d4e639 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 25 Sep 2024 23:30:08 +0300 Subject: [PATCH 32/97] * fixed #1531; * WPCS; --- includes/admin/templates/role/admin-permissions.php | 4 ++-- includes/admin/templates/role/profile.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/admin/templates/role/admin-permissions.php b/includes/admin/templates/role/admin-permissions.php index 553ed177..c38ebd92 100644 --- a/includes/admin/templates/role/admin-permissions.php +++ b/includes/admin/templates/role/admin-permissions.php @@ -40,7 +40,7 @@ $role = $object['data']; 'options' => UM()->roles()->get_roles(), 'multi' => true, 'value' => ! empty( $role['_um_can_edit_roles'] ) ? $role['_um_can_edit_roles'] : array(), - 'conditional' => array( '_um_can_edit_everyone', '=', '1' ) + 'conditional' => array( '_um_can_edit_everyone', '=', '1' ), ), array( 'id' => '_um_can_delete_everyone', @@ -57,7 +57,7 @@ $role = $object['data']; 'options' => UM()->roles()->get_roles(), 'multi' => true, 'value' => ! empty( $role['_um_can_delete_roles'] ) ? $role['_um_can_delete_roles'] : array(), - 'conditional' => array( '_um_can_delete_everyone', '=', '1' ) + 'conditional' => array( '_um_can_delete_everyone', '=', '1' ), ) ), ) diff --git a/includes/admin/templates/role/profile.php b/includes/admin/templates/role/profile.php index 4a7440be..ee2c3378 100644 --- a/includes/admin/templates/role/profile.php +++ b/includes/admin/templates/role/profile.php @@ -26,7 +26,7 @@ $role = $object['data']; 'options' => UM()->roles()->get_roles(), 'multi' => true, 'value' => ! empty( $role['_um_can_view_roles'] ) ? $role['_um_can_view_roles'] : array(), - 'conditional' => array( '_um_can_view_all', '=', '1' ) + 'conditional' => array( '_um_can_view_all', '=', '1' ), ), array( 'id' => '_um_can_make_private_profile', From e9a3bcc9fafd9456bd8287ebbf0d0734625423a2 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 26 Sep 2024 12:08:16 +0300 Subject: [PATCH 33/97] * fixed #1541; --- includes/common/class-theme.php | 6 ++++-- readme.txt | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/includes/common/class-theme.php b/includes/common/class-theme.php index 896627ef..d81bf084 100644 --- a/includes/common/class-theme.php +++ b/includes/common/class-theme.php @@ -106,6 +106,8 @@ class Theme { $scan_files = self::get_all_templates(); foreach ( $scan_files as $key => $files ) { foreach ( $files as $file ) { + $file = wp_normalize_path( $file ); // for not a Linux hosting. + if ( false === strpos( $file, 'email/' ) ) { /** * Filters an array of the template files for scanning versions based on $key. @@ -133,8 +135,8 @@ class Theme { 'profile/comments-single.php', 'profile/posts.php', 'profile/posts-single.php', - 'modal/um_upload_single.php', - 'modal/um_view_photo.php', + 'modal/upload-single.php', + 'modal/view-photo.php', ); $theme_file = false; diff --git a/readme.txt b/readme.txt index f4d9f125..f9f1fd71 100644 --- a/readme.txt +++ b/readme.txt @@ -166,7 +166,7 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -= 2.8.7 2024-09-26 = += 2.8.7 2024-09-30 = **Enhancements** @@ -174,8 +174,10 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Updated: User status filter on WP Users list table * Updated: User bulk actions on WP Users list table * Updated: User actions on User Profile and Member Directory card -* Added: Applying shortcodes from the post restriction message +* Added: Applying shortcodes in the post restriction message * Added: ProfilePage Structured Data +* Added: Ability to use HTML tags (allowed in `wp_kses_post`) in the global block restriction message +* Changed: Some wp-admin fields descriptions **Bugfixes** @@ -187,6 +189,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: UM links to empty phone numbers * Fixed: Email changing via User Account flush session. Security enhancement because email can be used for login * Fixed: User Profile image URL in meta tags +* Fixed: Empty User Profile and PHP Fatal error when cannot get profile field data **Templates required update** From 6bf75f412da2ed095b86d7ae04348c18b018c860 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 26 Sep 2024 12:20:26 +0300 Subject: [PATCH 34/97] * fixed #1436; --- includes/core/class-shortcodes.php | 16 ++++++++++++++++ readme.txt | 2 ++ 2 files changed, 18 insertions(+) diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php index 89ff081e..d34a789f 100644 --- a/includes/core/class-shortcodes.php +++ b/includes/core/class-shortcodes.php @@ -672,6 +672,22 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) { $args['form_id'] = ! empty( $args['form_id'] ) ? absint( $args['form_id'] ) : ''; $args['is_block'] = (bool) $args['is_block']; + $form_post = get_post( $args['form_id'] ); + // Invalid post ID. Maybe post doesn't exist. + if ( empty( $form_post ) ) { + return ''; + } + + // Invalid post type. It can be only `um_form` or `um_directory` + $post_types = array( 'um_form' ); + if ( UM()->options()->get( 'members_page' ) ) { + $post_types[] = 'um_directory'; + } + + if ( ! in_array( $form_post->post_type, $post_types, true ) ) { + return ''; + } + /** * Filters variable for enable singleton shortcode loading on the same page. * Note: Set it to `false` if you don't need to render the same form twice or more on the same page. diff --git a/readme.txt b/readme.txt index f9f1fd71..1ff20ae1 100644 --- a/readme.txt +++ b/readme.txt @@ -190,6 +190,8 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: Email changing via User Account flush session. Security enhancement because email can be used for login * Fixed: User Profile image URL in meta tags * Fixed: Empty User Profile and PHP Fatal error when cannot get profile field data +* Fixed: Parsing /modal/ templates and parsing templates on the Windows hosting +* Fixed: Validation `form_id` attribute in the `ultimatemember` shortcode **Templates required update** From 592b4e6ecd2bd48d0e26613fc0da19b3be30698d Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 26 Sep 2024 17:39:57 +0300 Subject: [PATCH 35/97] * fixed #1434; --- includes/core/class-form.php | 4 ++++ includes/core/um-actions-profile.php | 4 ++-- includes/core/um-actions-save-profile.php | 6 ++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/includes/core/class-form.php b/includes/core/class-form.php index eecc1eec..780cccb8 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -758,6 +758,10 @@ if ( ! class_exists( 'um\core\Form' ) ) { break; case 'textarea': if ( ! empty( $field['html'] ) || ( UM()->profile()->get_show_bio_key( $form ) === $k && UM()->options()->get( 'profile_show_html_bio' ) ) ) { + $form[ $k ] = html_entity_decode( $form[ $k ] ); // required because WP_Editor send sometimes encoded content. + preg_match('/^

(.*?)<\/p>$/', $form[ $k ], $match ); + $form[ $k ] = $match[1]; // required because WP_Editor send content wrapped to

+ $allowed_html = UM()->get_allowed_html( 'templates' ); if ( empty( $allowed_html['iframe'] ) ) { $allowed_html['iframe'] = array( diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 97d2c33d..05a1a43b 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -306,7 +306,7 @@ function um_user_edit_profile( $args, $form_data ) { //validation of correct values from options in wp-admin $stripslashes = ''; if ( isset( $args['submitted'][ $key ] ) && is_string( $args['submitted'][ $key ] ) ) { - $stripslashes = stripslashes( $args['submitted'][ $key ] ); + $stripslashes = wp_unslash( $args['submitted'][ $key ] ); } if ( 'select' === $array['type'] ) { @@ -361,7 +361,7 @@ function um_user_edit_profile( $args, $form_data ) { // translators: %s: title. $args['submitted'][ $key ] = sprintf( __( 'Your choosed %s', 'ultimate-member' ), $array['title'] ); } else { - if ( isset( $userinfo[ $key ] ) && $args['submitted'][ $key ] != $userinfo[ $key ] ) { + if ( isset( $userinfo[ $key ] ) && $args['submitted'][ $key ] !== $userinfo[ $key ] ) { $to_update[ $key ] = $args['submitted'][ $key ]; } elseif ( '' !== $args['submitted'][ $key ] ) { $to_update[ $key ] = $args['submitted'][ $key ]; diff --git a/includes/core/um-actions-save-profile.php b/includes/core/um-actions-save-profile.php index fb2775d6..07d53b55 100644 --- a/includes/core/um-actions-save-profile.php +++ b/includes/core/um-actions-save-profile.php @@ -1,5 +1,7 @@ - Date: Thu, 26 Sep 2024 18:14:11 +0300 Subject: [PATCH 36/97] * fixed #1546 via wrapping custom HTML in iframe block; --- assets/css/um-styles.css | 11 +++++++++++ assets/css/um-styles.min.css | 2 +- includes/core/um-filters-fields.php | 2 +- readme.txt | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/assets/css/um-styles.css b/assets/css/um-styles.css index a9129ecf..64b299e6 100644 --- a/assets/css/um-styles.css +++ b/assets/css/um-styles.css @@ -1148,3 +1148,14 @@ small.um-max-filesize span{ float: none; height: auto; } + +.um-textarea-html-value { + border: none; + width: 100%; + max-width: none; + margin: 0; + padding: 0; + overflow: auto; + max-height: none; + height: auto; +} diff --git a/assets/css/um-styles.min.css b/assets/css/um-styles.min.css index 23f68472..87e26bf9 100644 --- a/assets/css/um-styles.min.css +++ b/assets/css/um-styles.min.css @@ -1 +1 @@ -.um:not(.um-admin){width:100%;text-align:left;box-sizing:border-box;color:#666;font-size:15px;margin-bottom:30px!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;opacity:0}.um-s1,.um-s2{display:none}.um:not(.um-admin) :after,.um:not(.um-admin) :before{box-sizing:content-box}.um-account-side li a,.um-cover a,.um-field-value a,.um-header a,.um-member-less a,.um-member-more a,.um-member-name a,.um-member-photo a,.um-members a,.um-members-pagi a,.um-members-pagi span{border-bottom:0!important}.um-modal a:focus,.um:not(.um-admin) a:focus{outline:0!important}.um:not(.um-admin) a .image-overlay,.um:not(.um-admin) a:hover .image-overlay,.um:not(.um-admin) a:hover .image-overlay *{display:none!important;width:0!important;height:0!important;position:static!important}.um.um-in-admin{padding-top:0}.um.um-in-admin .um-tip{display:none!important}.um:not(.um-admin):not(.um-directory) input,.um:not(.um-admin):not(.um-directory) select,.um:not(.um-admin):not(.um-directory) textarea{font-size:15px}.um:not(.um-admin) *{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.um-left{float:left}.um-right{float:right}.um-clear{clear:both}.um-center{text-align:center}.um-center .um-button{display:inline-block!important;width:auto!important;min-width:250px!important}.um-half{width:48%}.um-field-half{width:48%;float:left}.um-field-half.right{float:right}.um-field-tri{width:30%;float:left;margin-right:3%}.um img{box-shadow:none!important}.um-col{padding-bottom:20px}.um-col-alt{margin:15px 0 5px 0}.um-col-alt-s{padding-top:10px}.um-col-alt-b{padding-top:20px}.um-col-121{float:left;width:48%}.um-col-122{float:right;width:48%}.um-col-131{float:left;width:30%}.um-col-132{float:left;width:30%;margin:0 5%}.um-col-133{float:left;width:30%}.um-raty i{font-size:26px}.um-field-half .um-raty i{font-size:21px}.um-field-tri .um-raty i{font-size:21px}.um-button i{font-size:22px;width:22px;height:12px!important;display:inline-block;line-height:12px!important;vertical-align:middle!important;position:relative;top:-6px;margin-right:8px}.um-row-heading{padding:5px 0;font-size:16px}.um-row-heading i{font-size:24px;height:24px;line-height:24px;margin:0 12px 0 0;display:inline-block;width:30px;text-align:center}.um-row-heading i:before{vertical-align:middle!important}p.um-notice{width:auto;color:#fff;box-sizing:border-box;font-size:15px;padding:12px!important;margin:12px 0 0 0!important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative}p.um-notice a{color:#fff;text-decoration:underline}p.um-notice i{position:absolute;right:14px;font-size:36px;cursor:pointer;top:7px;display:block;height:30px;line-height:30px}p.um-notice.success{background:#7acf58}p.um-notice.err{background:#c74a4a}p.um-notice.warning{background:#f9f9d1;color:#666;border:1px solid #efe4a2;padding:8px 15px!important}p.um-notice.warning a{color:#666;text-decoration:underline}.um-field-error{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:12px 0 0 0}.um-field-error a{color:#fff!important;text-decoration:underline!important}.um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#c74a4a;font-size:28px;line-height:1em!important}.um-error-block{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-field-notice{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:5px 0 0 0}.um-field-notice a{color:#fff!important;text-decoration:underline!important}.um-field-notice .um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#497bc7!important;font-size:28px;line-height:1em!important}.um-notice-block{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-tip{margin:0 0 0 8px;cursor:pointer;display:inline-block;position:relative;top:3px}.um-tip i{font-size:22px;height:22px;line-height:22px;display:block;position:relative}.um-tip-text{display:block;font-size:13px;line-height:15px;color:#999}.um-form button::-moz-focus-inner,.um-form input::-moz-focus-inner{border:0!important;padding:0!important}.um-field{position:relative;padding:15px 0 0 0}.um-field-b,.um-field-c{padding-top:0!important}.um-field-label{display:block;margin:0 0 8px 0}.um-field-label .um-field-label-icon{float:left;margin:0 8px 0 0;height:22px;line-height:18px;display:inline-block;width:24px;text-align:center}.um-field-label .um-field-label-icon i{font-size:22px;position:relative;top:1px}.um-field-label label{font-size:15px!important;line-height:22px!important;font-weight:700;font-weight:600}.um-field-area{position:relative;word-wrap:break-word}.um-field-area-password{position:relative}.um-toggle-password{cursor:pointer;display:block;position:absolute;right:0;top:0;height:100%;width:40px;text-align:center;box-sizing:border-box;font-size:20px;line-height:2}.um-toggle-password i{transition:all .2s linear}.um-toggle-password:hover i{color:#44b0ec}.um-field-value p{margin:0 0 6px 0!important;padding:0}.um-field-block{color:#777;font-size:17px}.um-field-spacing{width:100%}.um-field-divider{width:100%;margin:0 0 12px 0;height:24px;position:relative}.um-field-divider-text{position:absolute;width:100%;text-align:center;bottom:-24px;left:0;font-size:16px;padding:10px 0}.um-field-divider-text span{background:#fff;color:#555;display:inline-block;padding:0 15px}.um-field-icon{position:absolute;cursor:default;text-align:center!important;top:2px;left:0;width:44px;font-size:22px;line-height:1.7em;z-index:1}.um-form input[type=number],.um-form input[type=password],.um-form input[type=search],.um-form input[type=tel],.um-form input[type=text]{padding:0 12px!important;width:100%;display:block!important;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;outline:0!important;cursor:text!important;font-size:15px!important;height:40px!important;box-sizing:border-box!important;box-shadow:none!important;margin:0!important;position:static}.um-form .um-field-area-password input[type=password]{padding-right:40px!important}.um-form input[type=number]{width:auto;padding:0 0 0 5px!important;height:30px!important}.um-form input[type=number]:focus,.um-form input[type=password]:focus,.um-form input[type=search]:focus,.um-form input[type=tel]:focus,.um-form input[type=text]:focus,.um-form textarea:focus{box-shadow:none!important;outline:0!important}.um-form input[type=password].um-iconed,.um-form input[type=tel].um-iconed,.um-form input[type=text].um-iconed{padding-left:44px!important}.um-form input[type=password].um-error,.um-form input[type=tel].um-error,.um-form input[type=text].um-error{border-color:#c74a4a!important}.um-form textarea{width:100%;padding:8px 12px!important;display:block;font-size:15px!important;line-height:22px!important;background:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;box-sizing:border-box;min-height:80px!important;box-shadow:none;outline:0!important}.um-form .um-meta-text textarea{max-width:100%}.um-form .wp-editor-container{border:1px solid #ddd}.um-form .wp-editor-container textarea{background:#ddd!important;color:#222!important;border-radius:0}.um-field-c .um-field-checkbox{margin-bottom:14px;margin-top:0!important;position:relative}.um-field-checkbox:not(.um-field),.um-field-radio:not(.um-field){display:block;margin:8px 0;position:relative}.um-profile.um-editing .um-field-checkbox,.um-profile.um-editing .um-field-radio{cursor:pointer!important}.um-field-checkbox:hover i,.um-field-radio:hover i{color:#666}.um-field-checkbox input,.um-field-radio input{opacity:0!important;display:inline!important;width:0!important;float:left}.um-field-checkbox-state,.um-field-radio-state{position:absolute;top:0;left:1px;width:24px;height:24px}.um-field-checkbox-state i,.um-field-radio-state i{font-size:24px;line-height:24px;height:24px;color:#aaa;transition:all .2s linear}.um-field-checkbox-option,.um-field-radio-option{margin:0 0 0 36px;line-height:24px;color:#888!important;display:block}.um-field-group{margin-top:20px}.um-field-group-head{cursor:pointer;color:#fff;font-size:16px;line-height:22px;padding:10px 20px;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;border-top:1px solid transparent!important;border-bottom:2px solid rgba(0,0,0,.1)!important}.um-field-group-head i{font-size:20px;margin:0 8px 0 0}.um-field-group-head i:before{vertical-align:middle!important}.um-field-group-body{display:none;margin:15px 0 0 0;padding:15px 20px 5px 20px;background:#f9f9f9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative;box-sizing:border-box;width:100%}.um-field-group-body div.um-field{padding:0 0 15px 0}.um-field-group-cancel{font-size:18px;position:absolute;z-index:800;right:8px;top:8px;color:#ccc!important;text-decoration:none!important}.um-field-group-cancel:hover{color:#777!important}.um div.disabled,.um input[type=number]:disabled,.um input[type=submit]:disabled,.um input[type=text]:disabled,.um-disabled{opacity:.6!important;cursor:no-drop!important}input[type=submit].um-button,input[type=submit].um-button:focus{vertical-align:middle!important;height:auto!important;font-size:15px;cursor:pointer!important;width:100%;box-shadow:none;text-shadow:none;font-family:inherit;outline:0!important;margin:0;opacity:1;-webkit-appearance:none}input[type=submit].um-button:hover{opacity:1}.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button:hover{-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.um-button.um-btn-auto-width{width:auto;display:inline-block;padding:14px 20px!important;min-width:200px;max-width:450px}a.um-link-alt{line-height:22px;color:#888!important;display:block!important;text-decoration:none!important;font-weight:400;text-align:center;border-bottom:none!important}a.um-link-alt:hover{text-decoration:underline!important}.um-dropdown{position:absolute;height:auto;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;z-index:55;display:none;border:1px solid #e5e5e5;box-sizing:border-box;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 1px rgba(0,0,0,.1)}.um-dropdown li,.um-dropdown ul{list-style-type:none!important;padding:0!important;margin:0!important}.um-dropdown ul{background:#fff;position:relative;z-index:16}.um-dropdown li a{display:block;padding:8px 12px;color:#666;font-size:14px;line-height:18px}.um-dropdown li:last-child a{border-top:1px solid #e5e5e5;padding:12px}.um-dropdown-b{position:relative}.um-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-dropdown-arr *{display:block!important;width:24px!important;height:24px!important;vertical-align:bottom!important;overflow:hidden!important;line-height:24px!important}div.um-photo{margin:20px auto 0 auto;text-align:center;box-sizing:border-box;max-width:100%}div.um-photo,div.um-photo a,div.um-photo img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.um-photo a{border:1px solid #e5e5e5;padding:5px;box-sizing:border-box;display:inline-block;box-shadow:0 1px 1px #eee;margin:0 auto;max-width:100%}div.um-photo img{max-height:300px;max-width:100%}span.um-req{margin:0 0 0 8px;font-size:14px;display:inline-block}small.um-max-filesize{display:block;color:#999;padding-top:5px}small.um-max-filesize span{font-size:12px}.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus{border-color:#db2929!important}.um-form .um-field .um-field-area input.um-searching-username{background-image:url(../img/loading.gif);background-position:right center;background-repeat:no-repeat;background-size:24px 24px}.um-search-area{position:relative;max-width:300px}.um-search-area .um-search-field{width:100%;margin:0;padding-left:25px}.rtl .um-search-area .um-search-field{padding-right:25px;padding-left:initial}.um-search-area .um-search-icon{position:absolute;height:100%;left:6px;top:0}.rtl .um-search-area .um-search-icon{right:6px;left:initial}.um-faicon-search:before{display:flex;align-items:center;justify-content:center;height:100%}.um-field .select2-container.select2-container--open,.um-search-filter .select2-container.select2-container--open{z-index:9999999}.um-field .select2.select2-container .select2-selection,.um-search-filter .select2.select2-container .select2-selection{display:block!important;height:40px;padding:0 0 0 12px!important;overflow:hidden!important;position:relative!important;white-space:nowrap!important;line-height:35px!important;color:#666!important;font-size:15px!important;-moz-border-radius:2px!important;-webkit-border-radius:2px!important;border-radius:2px!important;background-clip:padding-box!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff!important;border:1px solid #ddd!important}.rtl .um-field .select2.select2-container .select2-selection,.rtl .um-search-filter .select2.select2-container .select2-selection{padding:0 12px 0 0!important}.um-field .select2.select2-container .select2-selection .select2-selection__arrow,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{display:inline-block!important;width:34px!important;height:100%!important;position:absolute;right:0;top:0;text-align:center;background:0 0!important;border:none!important}.rtl .um-field .select2.select2-container .select2-selection .select2-selection__arrow,.rtl .um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{right:initial;left:0}.um-field .select2.select2-container .select2-selection .select2-selection__arrow:before,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow:before{content:"\f3d0"!important;font-size:28px!important;font-family:Ionicons!important;display:block;height:100%;line-height:40px;min-width:1em;text-align:center;color:#aaa}.um-field .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation],.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation]{display:none}.um-field .select2-container.select2-container--open .select2-dropdown,.um-search-filter .select2-container.select2-container--open .select2-dropdown{border:1px solid #ddd!important;border-radius:0}.um-field .select2-container.select2-container--open .select2-dropdown .select2-results li,.um-search-filter .select2-container.select2-container--open .select2-dropdown .select2-results li{list-style:none;display:list-item;background:0 0;font-size:15px;margin:5px!important;color:#666!important;padding:3px 7px 4px!important;cursor:pointer;min-height:1em}.um-field .select2.select2-container .select2-selection.select2-selection--multiple,.um-search-filter .select2.select2-container .select2-selection.select2-selection--multiple{height:auto!important;line-height:.8!important;min-height:40px;padding-bottom:4px!important}.um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:37px;padding-left:0;padding-right:24px}.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:24px;padding-right:0}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{line-height:37px;box-sizing:border-box;list-style:none;margin:0;padding-left:0;padding-right:30px;width:100%;font-size:13px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:30px;padding-right:0}.um-field .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted,.um-search-filter .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted{background:#f4f4f4;color:#666}.um-field .select2-dropdown .select2-results li.select2-results__option[aria-selected=true],.um-search-filter .select2-dropdown .select2-results li.select2-results__option[aria-selected=true]{background-color:#ddd}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-field .select2-container--default .select2-selection--single .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{color:#aaa;font-size:28px;font-weight:400;line-height:34px;margin:0!important;right:0;text-align:center;width:1em}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{left:0;right:initial}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear{position:absolute}.um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 5px 0 0;max-height:28px;padding:3px 3px 3px 5px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 0 0 5px;padding:3px 5px 3px 3px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 5px 0 0;padding:0}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 0 0 5px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input{border:none!important;padding:0!important;max-height:28px}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered li,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered li{overflow-x:hidden;text-overflow:ellipsis;max-width:100%;box-sizing:border-box;line-height:20px}.um-field-multiselect .um-field-area .um-field-icon,.um-field-select .um-field-area .um-field-icon{z-index:99999999}.um-field-select .um-field-area.um-field-area-has-icon .select2-selection__rendered{text-indent:20px}.um-field-multiselect .um-field-area.um-field-area-has-icon ul:first-child{margin-left:30px!important}.um-field-area .wp-switch-editor{float:none;height:auto} \ No newline at end of file +.um:not(.um-admin){width:100%;text-align:left;box-sizing:border-box;color:#666;font-size:15px;margin-bottom:30px!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;opacity:0}.um-s1,.um-s2{display:none}.um:not(.um-admin) :after,.um:not(.um-admin) :before{box-sizing:content-box}.um-account-side li a,.um-cover a,.um-field-value a,.um-header a,.um-member-less a,.um-member-more a,.um-member-name a,.um-member-photo a,.um-members a,.um-members-pagi a,.um-members-pagi span{border-bottom:0!important}.um-modal a:focus,.um:not(.um-admin) a:focus{outline:0!important}.um:not(.um-admin) a .image-overlay,.um:not(.um-admin) a:hover .image-overlay,.um:not(.um-admin) a:hover .image-overlay *{display:none!important;width:0!important;height:0!important;position:static!important}.um.um-in-admin{padding-top:0}.um.um-in-admin .um-tip{display:none!important}.um:not(.um-admin):not(.um-directory) input,.um:not(.um-admin):not(.um-directory) select,.um:not(.um-admin):not(.um-directory) textarea{font-size:15px}.um:not(.um-admin) *{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.um-left{float:left}.um-right{float:right}.um-clear{clear:both}.um-center{text-align:center}.um-center .um-button{display:inline-block!important;width:auto!important;min-width:250px!important}.um-half{width:48%}.um-field-half{width:48%;float:left}.um-field-half.right{float:right}.um-field-tri{width:30%;float:left;margin-right:3%}.um img{box-shadow:none!important}.um-col{padding-bottom:20px}.um-col-alt{margin:15px 0 5px 0}.um-col-alt-s{padding-top:10px}.um-col-alt-b{padding-top:20px}.um-col-121{float:left;width:48%}.um-col-122{float:right;width:48%}.um-col-131{float:left;width:30%}.um-col-132{float:left;width:30%;margin:0 5%}.um-col-133{float:left;width:30%}.um-raty i{font-size:26px}.um-field-half .um-raty i{font-size:21px}.um-field-tri .um-raty i{font-size:21px}.um-button i{font-size:22px;width:22px;height:12px!important;display:inline-block;line-height:12px!important;vertical-align:middle!important;position:relative;top:-6px;margin-right:8px}.um-row-heading{padding:5px 0;font-size:16px}.um-row-heading i{font-size:24px;height:24px;line-height:24px;margin:0 12px 0 0;display:inline-block;width:30px;text-align:center}.um-row-heading i:before{vertical-align:middle!important}p.um-notice{width:auto;color:#fff;box-sizing:border-box;font-size:15px;padding:12px!important;margin:12px 0 0 0!important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative}p.um-notice a{color:#fff;text-decoration:underline}p.um-notice i{position:absolute;right:14px;font-size:36px;cursor:pointer;top:7px;display:block;height:30px;line-height:30px}p.um-notice.success{background:#7acf58}p.um-notice.err{background:#c74a4a}p.um-notice.warning{background:#f9f9d1;color:#666;border:1px solid #efe4a2;padding:8px 15px!important}p.um-notice.warning a{color:#666;text-decoration:underline}.um-field-error{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:12px 0 0 0}.um-field-error a{color:#fff!important;text-decoration:underline!important}.um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#c74a4a;font-size:28px;line-height:1em!important}.um-error-block{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-field-notice{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:5px 0 0 0}.um-field-notice a{color:#fff!important;text-decoration:underline!important}.um-field-notice .um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#497bc7!important;font-size:28px;line-height:1em!important}.um-notice-block{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-tip{margin:0 0 0 8px;cursor:pointer;display:inline-block;position:relative;top:3px}.um-tip i{font-size:22px;height:22px;line-height:22px;display:block;position:relative}.um-tip-text{display:block;font-size:13px;line-height:15px;color:#999}.um-form button::-moz-focus-inner,.um-form input::-moz-focus-inner{border:0!important;padding:0!important}.um-field{position:relative;padding:15px 0 0 0}.um-field-b,.um-field-c{padding-top:0!important}.um-field-label{display:block;margin:0 0 8px 0}.um-field-label .um-field-label-icon{float:left;margin:0 8px 0 0;height:22px;line-height:18px;display:inline-block;width:24px;text-align:center}.um-field-label .um-field-label-icon i{font-size:22px;position:relative;top:1px}.um-field-label label{font-size:15px!important;line-height:22px!important;font-weight:700;font-weight:600}.um-field-area{position:relative;word-wrap:break-word}.um-field-area-password{position:relative}.um-toggle-password{cursor:pointer;display:block;position:absolute;right:0;top:0;height:100%;width:40px;text-align:center;box-sizing:border-box;font-size:20px;line-height:2}.um-toggle-password i{transition:all .2s linear}.um-toggle-password:hover i{color:#44b0ec}.um-field-value p{margin:0 0 6px 0!important;padding:0}.um-field-block{color:#777;font-size:17px}.um-field-spacing{width:100%}.um-field-divider{width:100%;margin:0 0 12px 0;height:24px;position:relative}.um-field-divider-text{position:absolute;width:100%;text-align:center;bottom:-24px;left:0;font-size:16px;padding:10px 0}.um-field-divider-text span{background:#fff;color:#555;display:inline-block;padding:0 15px}.um-field-icon{position:absolute;cursor:default;text-align:center!important;top:2px;left:0;width:44px;font-size:22px;line-height:1.7em;z-index:1}.um-form input[type=number],.um-form input[type=password],.um-form input[type=search],.um-form input[type=tel],.um-form input[type=text]{padding:0 12px!important;width:100%;display:block!important;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;outline:0!important;cursor:text!important;font-size:15px!important;height:40px!important;box-sizing:border-box!important;box-shadow:none!important;margin:0!important;position:static}.um-form .um-field-area-password input[type=password]{padding-right:40px!important}.um-form input[type=number]{width:auto;padding:0 0 0 5px!important;height:30px!important}.um-form input[type=number]:focus,.um-form input[type=password]:focus,.um-form input[type=search]:focus,.um-form input[type=tel]:focus,.um-form input[type=text]:focus,.um-form textarea:focus{box-shadow:none!important;outline:0!important}.um-form input[type=password].um-iconed,.um-form input[type=tel].um-iconed,.um-form input[type=text].um-iconed{padding-left:44px!important}.um-form input[type=password].um-error,.um-form input[type=tel].um-error,.um-form input[type=text].um-error{border-color:#c74a4a!important}.um-form textarea{width:100%;padding:8px 12px!important;display:block;font-size:15px!important;line-height:22px!important;background:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;box-sizing:border-box;min-height:80px!important;box-shadow:none;outline:0!important}.um-form .um-meta-text textarea{max-width:100%}.um-form .wp-editor-container{border:1px solid #ddd}.um-form .wp-editor-container textarea{background:#ddd!important;color:#222!important;border-radius:0}.um-field-c .um-field-checkbox{margin-bottom:14px;margin-top:0!important;position:relative}.um-field-checkbox:not(.um-field),.um-field-radio:not(.um-field){display:block;margin:8px 0;position:relative}.um-profile.um-editing .um-field-checkbox,.um-profile.um-editing .um-field-radio{cursor:pointer!important}.um-field-checkbox:hover i,.um-field-radio:hover i{color:#666}.um-field-checkbox input,.um-field-radio input{opacity:0!important;display:inline!important;width:0!important;float:left}.um-field-checkbox-state,.um-field-radio-state{position:absolute;top:0;left:1px;width:24px;height:24px}.um-field-checkbox-state i,.um-field-radio-state i{font-size:24px;line-height:24px;height:24px;color:#aaa;transition:all .2s linear}.um-field-checkbox-option,.um-field-radio-option{margin:0 0 0 36px;line-height:24px;color:#888!important;display:block}.um-field-group{margin-top:20px}.um-field-group-head{cursor:pointer;color:#fff;font-size:16px;line-height:22px;padding:10px 20px;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;border-top:1px solid transparent!important;border-bottom:2px solid rgba(0,0,0,.1)!important}.um-field-group-head i{font-size:20px;margin:0 8px 0 0}.um-field-group-head i:before{vertical-align:middle!important}.um-field-group-body{display:none;margin:15px 0 0 0;padding:15px 20px 5px 20px;background:#f9f9f9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative;box-sizing:border-box;width:100%}.um-field-group-body div.um-field{padding:0 0 15px 0}.um-field-group-cancel{font-size:18px;position:absolute;z-index:800;right:8px;top:8px;color:#ccc!important;text-decoration:none!important}.um-field-group-cancel:hover{color:#777!important}.um div.disabled,.um input[type=number]:disabled,.um input[type=submit]:disabled,.um input[type=text]:disabled,.um-disabled{opacity:.6!important;cursor:no-drop!important}input[type=submit].um-button,input[type=submit].um-button:focus{vertical-align:middle!important;height:auto!important;font-size:15px;cursor:pointer!important;width:100%;box-shadow:none;text-shadow:none;font-family:inherit;outline:0!important;margin:0;opacity:1;-webkit-appearance:none}input[type=submit].um-button:hover{opacity:1}.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button:hover{-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.um-button.um-btn-auto-width{width:auto;display:inline-block;padding:14px 20px!important;min-width:200px;max-width:450px}a.um-link-alt{line-height:22px;color:#888!important;display:block!important;text-decoration:none!important;font-weight:400;text-align:center;border-bottom:none!important}a.um-link-alt:hover{text-decoration:underline!important}.um-dropdown{position:absolute;height:auto;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;z-index:55;display:none;border:1px solid #e5e5e5;box-sizing:border-box;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 1px rgba(0,0,0,.1)}.um-dropdown li,.um-dropdown ul{list-style-type:none!important;padding:0!important;margin:0!important}.um-dropdown ul{background:#fff;position:relative;z-index:16}.um-dropdown li a{display:block;padding:8px 12px;color:#666;font-size:14px;line-height:18px}.um-dropdown li:last-child a{border-top:1px solid #e5e5e5;padding:12px}.um-dropdown-b{position:relative}.um-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-dropdown-arr *{display:block!important;width:24px!important;height:24px!important;vertical-align:bottom!important;overflow:hidden!important;line-height:24px!important}div.um-photo{margin:20px auto 0 auto;text-align:center;box-sizing:border-box;max-width:100%}div.um-photo,div.um-photo a,div.um-photo img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.um-photo a{border:1px solid #e5e5e5;padding:5px;box-sizing:border-box;display:inline-block;box-shadow:0 1px 1px #eee;margin:0 auto;max-width:100%}div.um-photo img{max-height:300px;max-width:100%}span.um-req{margin:0 0 0 8px;font-size:14px;display:inline-block}small.um-max-filesize{display:block;color:#999;padding-top:5px}small.um-max-filesize span{font-size:12px}.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus{border-color:#db2929!important}.um-form .um-field .um-field-area input.um-searching-username{background-image:url(../img/loading.gif);background-position:right center;background-repeat:no-repeat;background-size:24px 24px}.um-search-area{position:relative;max-width:300px}.um-search-area .um-search-field{width:100%;margin:0;padding-left:25px}.rtl .um-search-area .um-search-field{padding-right:25px;padding-left:initial}.um-search-area .um-search-icon{position:absolute;height:100%;left:6px;top:0}.rtl .um-search-area .um-search-icon{right:6px;left:initial}.um-faicon-search:before{display:flex;align-items:center;justify-content:center;height:100%}.um-field .select2-container.select2-container--open,.um-search-filter .select2-container.select2-container--open{z-index:9999999}.um-field .select2.select2-container .select2-selection,.um-search-filter .select2.select2-container .select2-selection{display:block!important;height:40px;padding:0 0 0 12px!important;overflow:hidden!important;position:relative!important;white-space:nowrap!important;line-height:35px!important;color:#666!important;font-size:15px!important;-moz-border-radius:2px!important;-webkit-border-radius:2px!important;border-radius:2px!important;background-clip:padding-box!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff!important;border:1px solid #ddd!important}.rtl .um-field .select2.select2-container .select2-selection,.rtl .um-search-filter .select2.select2-container .select2-selection{padding:0 12px 0 0!important}.um-field .select2.select2-container .select2-selection .select2-selection__arrow,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{display:inline-block!important;width:34px!important;height:100%!important;position:absolute;right:0;top:0;text-align:center;background:0 0!important;border:none!important}.rtl .um-field .select2.select2-container .select2-selection .select2-selection__arrow,.rtl .um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{right:initial;left:0}.um-field .select2.select2-container .select2-selection .select2-selection__arrow:before,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow:before{content:"\f3d0"!important;font-size:28px!important;font-family:Ionicons!important;display:block;height:100%;line-height:40px;min-width:1em;text-align:center;color:#aaa}.um-field .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation],.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation]{display:none}.um-field .select2-container.select2-container--open .select2-dropdown,.um-search-filter .select2-container.select2-container--open .select2-dropdown{border:1px solid #ddd!important;border-radius:0}.um-field .select2-container.select2-container--open .select2-dropdown .select2-results li,.um-search-filter .select2-container.select2-container--open .select2-dropdown .select2-results li{list-style:none;display:list-item;background:0 0;font-size:15px;margin:5px!important;color:#666!important;padding:3px 7px 4px!important;cursor:pointer;min-height:1em}.um-field .select2.select2-container .select2-selection.select2-selection--multiple,.um-search-filter .select2.select2-container .select2-selection.select2-selection--multiple{height:auto!important;line-height:.8!important;min-height:40px;padding-bottom:4px!important}.um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:37px;padding-left:0;padding-right:24px}.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:24px;padding-right:0}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{line-height:37px;box-sizing:border-box;list-style:none;margin:0;padding-left:0;padding-right:30px;width:100%;font-size:13px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:30px;padding-right:0}.um-field .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted,.um-search-filter .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted{background:#f4f4f4;color:#666}.um-field .select2-dropdown .select2-results li.select2-results__option[aria-selected=true],.um-search-filter .select2-dropdown .select2-results li.select2-results__option[aria-selected=true]{background-color:#ddd}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-field .select2-container--default .select2-selection--single .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{color:#aaa;font-size:28px;font-weight:400;line-height:34px;margin:0!important;right:0;text-align:center;width:1em}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{left:0;right:initial}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear{position:absolute}.um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 5px 0 0;max-height:28px;padding:3px 3px 3px 5px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 0 0 5px;padding:3px 5px 3px 3px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 5px 0 0;padding:0}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 0 0 5px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input{border:none!important;padding:0!important;max-height:28px}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered li,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered li{overflow-x:hidden;text-overflow:ellipsis;max-width:100%;box-sizing:border-box;line-height:20px}.um-field-multiselect .um-field-area .um-field-icon,.um-field-select .um-field-area .um-field-icon{z-index:99999999}.um-field-select .um-field-area.um-field-area-has-icon .select2-selection__rendered{text-indent:20px}.um-field-multiselect .um-field-area.um-field-area-has-icon ul:first-child{margin-left:30px!important}.um-field-area .wp-switch-editor{float:none;height:auto}.um-textarea-html-value{border:none;width:100%;max-width:none;margin:0;padding:0;overflow:auto;max-height:none;height:auto} \ No newline at end of file diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index cfd545b4..6d5d2bc9 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -260,7 +260,7 @@ function um_profile_field_filter_hook__textarea( $value, $data ) { return ''; } if ( ! empty( $data['html'] ) ) { - return $value; + return ''; } $description_key = UM()->profile()->get_show_bio_key( UM()->fields()->global_args ); diff --git a/readme.txt b/readme.txt index 1ff20ae1..68b71757 100644 --- a/readme.txt +++ b/readme.txt @@ -224,6 +224,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Fixed: Sorting by last login value when "Hide my last login" is set * Fixed: PHP errors while uploading files * Fixed: Parsing error on the license activation +* Fixed: Saving field value when type is textarea and using HTML is enabled **Templates required update** From 5e7018e9f2bdb2b8490eb6c95a6d5ca8646729b0 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 14:48:23 +0300 Subject: [PATCH 37/97] * checking not empty $match; --- includes/core/class-form.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/includes/core/class-form.php b/includes/core/class-form.php index 780cccb8..c7a89c42 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -759,8 +759,10 @@ if ( ! class_exists( 'um\core\Form' ) ) { case 'textarea': if ( ! empty( $field['html'] ) || ( UM()->profile()->get_show_bio_key( $form ) === $k && UM()->options()->get( 'profile_show_html_bio' ) ) ) { $form[ $k ] = html_entity_decode( $form[ $k ] ); // required because WP_Editor send sometimes encoded content. - preg_match('/^

(.*?)<\/p>$/', $form[ $k ], $match ); - $form[ $k ] = $match[1]; // required because WP_Editor send content wrapped to

+ preg_match( '/^

(.*?)<\/p>$/', $form[ $k ], $match ); // required because WP_Editor send content wrapped to

+ if ( ! empty( $match[1] ) ) { + $form[ $k ] = $match[1]; + } $allowed_html = UM()->get_allowed_html( 'templates' ); if ( empty( $allowed_html['iframe'] ) ) { From 35e3727bcab622fc8babd64fbac05b078ccac01f Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 15:41:01 +0300 Subject: [PATCH 38/97] * added force attribute to change user status actions for ignore current user condition in some cases; --- includes/admin/class-actions-listener.php | 48 +++- includes/common/class-users.php | 298 +++++++++++----------- includes/core/class-permalinks.php | 8 +- includes/core/class-user.php | 2 +- includes/core/um-actions-register.php | 6 +- 5 files changed, 203 insertions(+), 159 deletions(-) diff --git a/includes/admin/class-actions-listener.php b/includes/admin/class-actions-listener.php index 81442364..3877e4ad 100644 --- a/includes/admin/class-actions-listener.php +++ b/includes/admin/class-actions-listener.php @@ -47,7 +47,13 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { $result = UM()->common()->users()->approve( $user_id ); if ( $result ) { - $redirect = add_query_arg( array( 'update' => 'um_approved', 'approved_count' => 1 ), $redirect ); + $redirect = add_query_arg( + array( + 'update' => 'um_approved', + 'approved_count' => 1, + ), + $redirect + ); } } @@ -66,7 +72,13 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { $result = UM()->common()->users()->reactivate( $user_id ); if ( $result ) { - $redirect = add_query_arg( array( 'update' => 'um_reactivated', 'reactivated_count' => 1 ), $redirect ); + $redirect = add_query_arg( + array( + 'update' => 'um_reactivated', + 'reactivated_count' => 1, + ), + $redirect + ); } } wp_safe_redirect( $redirect ); @@ -84,7 +96,13 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { $result = UM()->common()->users()->set_as_pending( $user_id ); if ( $result ) { - $redirect = add_query_arg( array( 'update' => 'um_pending', 'pending_count' => 1 ), $redirect ); + $redirect = add_query_arg( + array( + 'update' => 'um_pending', + 'pending_count' => 1, + ), + $redirect + ); } } wp_safe_redirect( $redirect ); @@ -102,7 +120,13 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { $result = UM()->common()->users()->send_activation( $user_id ); if ( $result ) { - $redirect = add_query_arg( array( 'update' => 'um_resend_activation', 'resend_activation_count' => 1 ), $redirect ); + $redirect = add_query_arg( + array( + 'update' => 'um_resend_activation', + 'resend_activation_count' => 1, + ), + $redirect + ); } } wp_safe_redirect( $redirect ); @@ -120,7 +144,13 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { $result = UM()->common()->users()->reject( $user_id ); if ( $result ) { - $redirect = add_query_arg( array( 'update' => 'um_rejected', 'rejected_count' => 1 ), $redirect ); + $redirect = add_query_arg( + array( + 'update' => 'um_rejected', + 'rejected_count' => 1, + ), + $redirect + ); } } wp_safe_redirect( $redirect ); @@ -138,7 +168,13 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { $result = UM()->common()->users()->deactivate( $user_id ); if ( $result ) { - $redirect = add_query_arg( array( 'update' => 'um_deactivate', 'deactivated_count' => 1 ), $redirect ); + $redirect = add_query_arg( + array( + 'update' => 'um_deactivate', + 'deactivated_count' => 1, + ), + $redirect + ); } } wp_safe_redirect( $redirect ); diff --git a/includes/common/class-users.php b/includes/common/class-users.php index f8a8b512..f889b27d 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -30,8 +30,8 @@ class Users { * @param array $args { * Arguments that accompany the requested capability check. * - * @type string $0 Requested capability. - * @type int $1 Concerned user ID. + * @type string $0 Requested capability. + * @type int $1 Concerned user ID. * @type mixed ...$2 Optional second and further parameters, typically object ID. * } * @@ -290,6 +290,11 @@ class Users { return get_password_reset_key( $userdata ); } + /** + * @param int $user_id + * + * @return bool + */ public function can_current_user_edit_user( $user_id ) { $current_user_id = get_current_user_id(); if ( $current_user_id === $user_id ) { @@ -315,30 +320,36 @@ class Users { return true; } - public function can_activation_send( $user_id ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; + /** + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. + * + * @return bool + */ + public function can_activation_send( $user_id, $force = false ) { + if ( ! $force ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; + } } -// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); -// $role = get_role( $rolename ); -// -// if ( null === $role ) { -// return false; -// } -// -// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. -// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { -// return false; -// } + /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { + return false; + }*/ $status = $this->get_status( $user_id ); return 'awaiting_admin_review' !== $status; } - public function send_activation( $user_id ) { - if ( ! $this->can_activation_send( $user_id ) ) { + /** + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. + * + * @return bool + */ + public function send_activation( $user_id, $force = false ) { + if ( ! $this->can_activation_send( $user_id, $force ) ) { return false; } @@ -356,9 +367,8 @@ class Users { // It's `false` on failure or if the user already has rejected status. if ( false !== $result ) { - //clear all sessions for email confirmation pending users - $user = WP_Session_Tokens::get_instance( $user_id ); - $user->destroy_all(); + // Clear all sessions for email confirmation pending users + self::destroy_all_sessions( $user_id ); // Set activation link hash. $this->assign_secretkey( $user_id ); @@ -386,27 +396,22 @@ class Users { } /** - * @param $user_id + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_deactivated( $user_id ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; + public function can_be_deactivated( $user_id, $force = false ) { + if ( ! $force ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; + } } -// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); -// $role = get_role( $rolename ); -// -// if ( null === $role ) { -// return false; -// } -// -// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. -// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { -// return false; -// } + /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { + return false; + }*/ $status = $this->get_status( $user_id ); if ( 'inactive' === $status ) { @@ -423,12 +428,13 @@ class Users { } /** - * @param $user_id + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function deactivate( $user_id ) { - if ( ! $this->can_be_deactivated( $user_id ) ) { + public function deactivate( $user_id, $force = false ) { + if ( ! $this->can_be_deactivated( $user_id, $force ) ) { return false; } @@ -447,8 +453,7 @@ class Users { // It's `false` on failure or if the user already has approved status. if ( false !== $result ) { // Clear all sessions for inactive users - $user = WP_Session_Tokens::get_instance( $user_id ); - $user->destroy_all(); + self::destroy_all_sessions( $user_id ); $userdata = get_userdata( $user_id ); UM()->mail()->send( $userdata->user_email, 'inactive_email' ); @@ -469,27 +474,22 @@ class Users { } /** - * @param $user_id + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_rejected( $user_id ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; + public function can_be_rejected( $user_id, $force = false ) { + if ( ! $force ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; + } } -// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); -// $role = get_role( $rolename ); -// -// if ( null === $role ) { -// return false; -// } -// -// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. -// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { -// return false; -// } + /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { + return false; + }*/ $status = $this->get_status( $user_id ); if ( 'rejected' === $status ) { @@ -506,12 +506,15 @@ class Users { } /** - * @param $user_id + * Reject user membership. + * + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function reject( $user_id ) { - if ( ! $this->can_be_rejected( $user_id ) ) { + public function reject( $user_id, $force = false ) { + if ( ! $this->can_be_rejected( $user_id, $force ) ) { return false; } @@ -530,8 +533,7 @@ class Users { // It's `false` on failure or if the user already has rejected status. if ( false !== $result ) { // Clear all sessions for rejected users - $user = WP_Session_Tokens::get_instance( $user_id ); - $user->destroy_all(); + self::destroy_all_sessions( $user_id ); $userdata = get_userdata( $user_id ); UM()->mail()->send( $userdata->user_email, 'rejected_email' ); @@ -552,39 +554,39 @@ class Users { } /** - * @param int $user_id + * Check if the user can be set as pending admin review. + * + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_set_as_pending( $user_id ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; + public function can_be_set_as_pending( $user_id, $force = false ) { + if ( ! $force ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; + } } -// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); -// $role = get_role( $rolename ); -// -// if ( null === $role ) { -// return false; -// } -// -// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. -// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { -// return false; -// } + /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { + return false; + }*/ $status = $this->get_status( $user_id ); return 'awaiting_admin_review' !== $status; } /** - * @param int $user_id + * Set user as pending admin review. + * + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function set_as_pending( $user_id ) { - if ( ! $this->can_be_set_as_pending( $user_id ) ) { + public function set_as_pending( $user_id, $force = false ) { + if ( ! $this->can_be_set_as_pending( $user_id, $force ) ) { return false; } @@ -603,8 +605,7 @@ class Users { // It's `false` on failure or if the user already has rejected status. if ( false !== $result ) { // Clear all sessions for awaiting admin confirmation users - $user = WP_Session_Tokens::get_instance( $user_id ); - $user->destroy_all(); + self::destroy_all_sessions( $user_id ); $userdata = get_userdata( $user_id ); UM()->mail()->send( $userdata->user_email, 'pending_email' ); @@ -627,63 +628,38 @@ class Users { /** * Check if the user can be approved. * - * @param int $user_id User ID + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_approved( $user_id ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; + public function can_be_approved( $user_id, $force = false ) { + if ( ! $force ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; + } } -// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); -// $role = get_role( $rolename ); -// -// if ( null === $role ) { -// return false; -// } -// -// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. -// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { -// return false; -// } + /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { + return false; + }*/ $status = $this->get_status( $user_id ); return 'approved' !== $status; } - /** - * @param int $user_id - * - * @return bool - */ - public static function user_exists( $user_id ) { - /** - * @var bool[] $search_results - */ - static $search_results = array(); - - if ( array_key_exists( $user_id, $search_results ) ) { - return $search_results[ $user_id ]; - } - - $user = get_userdata( $user_id ); - - $search_results[ $user_id ] = false !== $user; - return $search_results[ $user_id ]; - } - /** * Approve user. * - * @param int $user_id User ID. + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool `true` if the user has been approved * `false` on failure or if the user already has approved status. */ - public function approve( $user_id ) { - if ( ! $this->can_be_approved( $user_id ) ) { + public function approve( $user_id, $force = false ) { + if ( ! $this->can_be_approved( $user_id, $force ) ) { return false; } @@ -734,39 +710,38 @@ class Users { } /** - * @param int $user_id + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_reactivated( $user_id ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; + public function can_be_reactivated( $user_id, $force = false ) { + if ( ! $force ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; + } } -// $rolename = UM()->roles()->get_priority_user_role( $current_user_id ); -// $role = get_role( $rolename ); -// -// if ( null === $role ) { -// return false; -// } -// -// // Make Ultimate Member bulk actions only when the current user has 'edit_users' capability. -// if ( ! current_user_can( 'edit_users' ) && ! $role->has_cap( 'edit_users' ) ) { -// return false; -// } + /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { + return false; + }*/ $status = $this->get_status( $user_id ); return 'inactive' === $status; } /** - * @param int $user_id + * Reactivate user. * - * @return bool + * @param int $user_id User ID. + * @param bool $force If true - ignore current user condition. + * + * @return bool `true` if the user has been reactivated + * `false` on failure or if the user already has approved status. */ - public function reactivate( $user_id ) { - if ( ! $this->can_be_reactivated( $user_id ) ) { + public function reactivate( $user_id, $force = false ) { + if ( ! $this->can_be_reactivated( $user_id, $force ) ) { return false; } @@ -808,4 +783,37 @@ class Users { return false; } + + /** + * @param int $user_id + * + * @return bool + */ + public static function user_exists( $user_id ) { + /** + * @var bool[] $search_results + */ + static $search_results = array(); + + if ( array_key_exists( $user_id, $search_results ) ) { + return $search_results[ $user_id ]; + } + + $user = get_userdata( $user_id ); + + $search_results[ $user_id ] = false !== $user; + return $search_results[ $user_id ]; + } + + /** + * Clear all sessions for user ID. + * + * @param int $user_id User ID. + * + * @return void + */ + public static function destroy_all_sessions( $user_id ) { + $user = WP_Session_Tokens::get_instance( $user_id ); + $user->destroy_all(); + } } diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php index 3f04ffac..3e494d16 100644 --- a/includes/core/class-permalinks.php +++ b/includes/core/class-permalinks.php @@ -117,25 +117,25 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { $account_secret_hash = get_user_meta( $user_id, 'account_secret_hash', true ); if ( empty( $account_secret_hash ) || strtolower( sanitize_text_field( $_REQUEST['hash'] ) ) !== strtolower( $account_secret_hash ) ) { - wp_die( __( 'This activation link is expired or have already been used.', 'ultimate-member' ) ); + wp_die( esc_html__( 'This activation link is expired or have already been used.', 'ultimate-member' ) ); } $account_secret_hash_expiry = get_user_meta( $user_id, 'account_secret_hash_expiry', true ); if ( ! empty( $account_secret_hash_expiry ) && time() > $account_secret_hash_expiry ) { - wp_die( __( 'This activation link is expired.', 'ultimate-member' ) ); + wp_die( esc_html__( 'This activation link is expired.', 'ultimate-member' ) ); } $redirect = um_get_core_page( 'login', 'account_active' ); $set_password_required = get_user_meta( $user_id, 'um_set_password_required', true ); um_fetch_user( $user_id ); - UM()->common()->users()->approve( $user_id ); + UM()->common()->users()->approve( $user_id, true ); if ( ! empty( $set_password_required ) ) { $redirect = um_user( 'password_reset_link' ); } um_reset_user(); - $user_role = UM()->roles()->get_priority_user_role( $user_id ); + $user_role = UM()->roles()->get_priority_user_role( $user_id ); $user_role_data = UM()->roles()->role_data( $user_role ); // log in automatically diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 68f53dd9..56a7bc8f 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -1570,7 +1570,7 @@ if ( ! class_exists( 'um\core\User' ) ) { */ public function approve( $repeat = true ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found -- deprecated function _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->approve()' ); - UM()->common()->users()->approve( um_user( 'ID' ) ); + UM()->common()->users()->approve( um_user( 'ID' ), $repeat ); } /** diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index f2c65e92..f920a42f 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -11,7 +11,7 @@ if ( ! defined( 'ABSPATH' ) ) { function um_post_registration_approved_hook( $user_id ) { um_fetch_user( $user_id ); - UM()->common()->users()->approve( $user_id ); + UM()->common()->users()->approve( $user_id, true ); } add_action( 'um_post_registration_approved_hook', 'um_post_registration_approved_hook' ); @@ -23,7 +23,7 @@ add_action( 'um_post_registration_approved_hook', 'um_post_registration_approved function um_post_registration_checkmail_hook( $user_id ) { um_fetch_user( $user_id ); - UM()->common()->users()->send_activation( $user_id ); + UM()->common()->users()->send_activation( $user_id, true ); } add_action( 'um_post_registration_checkmail_hook', 'um_post_registration_checkmail_hook' ); @@ -35,7 +35,7 @@ add_action( 'um_post_registration_checkmail_hook', 'um_post_registration_checkma function um_post_registration_pending_hook( $user_id ) { um_fetch_user( $user_id ); - UM()->common()->users()->set_as_pending( $user_id ); + UM()->common()->users()->set_as_pending( $user_id, true ); } add_action( 'um_post_registration_pending_hook', 'um_post_registration_pending_hook' ); From d0aafed9a20d7862766c75769e15bf27d44e242e Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 17:16:33 +0300 Subject: [PATCH 39/97] * prepared to release; --- README.md | 2 +- changelog.txt | 54 ++++++++++++++++++++++++++++++++++-- includes/core/class-user.php | 2 ++ readme.txt | 21 ++++++++++++++ 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 49b3d058..0f703e18 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.8.6](https://github.com/ultimatemember/ultimatemember/releases/tag/2.8.6). +[Official Release Version: 2.8.7](https://github.com/ultimatemember/ultimatemember/releases/tag/2.8.7). ## Changelog diff --git a/changelog.txt b/changelog.txt index 0d4e2755..01cf476e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,10 +1,60 @@ == Changelog == -= 2.8.7 Aug 19, 2024 = += 2.8.7 September 30, 2024 = + +* Enhancements: + + - Added: Single user actions on WP Users list table + - Updated: User status filter on WP Users list table + - Updated: User bulk actions on WP Users list table + - Updated: User actions on User Profile and Member Directory card + - Added: Applying shortcodes in the post restriction message + - Added: ProfilePage Structured Data + - Added: Ability to use HTML tags (allowed in `wp_kses_post`) in the global block restriction message + - Changed: Some wp-admin fields descriptions + - Updated: Data format in `um_admin_bulk_user_actions_hook` hook. Changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` + - Added: `$old_status` param to `um_after_user_status_is_changed` hook + - Added: `$user_id` param to `um_before_user_hash_is_changed` hook + - Added: `$user_id, $hash, $expiration` params to `um_after_user_hash_is_changed` hook + - Added: `um_restricted_post_content` hook + - Added: `um_loggedin_inner_content` hook + - Added: `um_profile_dynamic_meta_profile_schema` hook * Bugfixes: - - Fixed: The "Clear All" button in the member directory did not reset all dependent dropdowns. + - Fixed: Single user action on User Profile security vulnerability. CVE ID: CVE-2024-8520 + - Fixed: [um_loggedin] shortcode security vulnerability. CVE ID: CVE-2024-8519 + - Fixed: Performance issue related to Settings > Secure tab + - Fixed: The "Clear All" button in the member directory did not reset all dependent dropdowns + - Fixed: Telegram and Discord social links in profile header + - Fixed: UM links to empty phone numbers + - Fixed: Email changing via User Account flush session. Security enhancement because email can be used for login + - Fixed: User Profile image URL in meta tags + - Fixed: Empty User Profile and PHP Fatal error when cannot get profile field data + - Fixed: Parsing /modal/ templates and parsing templates on the Windows hosting + - Fixed: Validation `form_id` attribute in the `ultimatemember` shortcode + +* Templates required update: + + - login-to-view.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + +* Deprecated: + + - Hook: `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. + - Hook: `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. + - Hook: `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Hook: `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Hook: `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. + - Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. + - Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. + - Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. + - Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. + - Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. + - Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. + - Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. = 2.8.6 May 22, 2024 = diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 56a7bc8f..7512e920 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -1514,6 +1514,8 @@ if ( ! class_exists( 'um\core\User' ) ) { /** * Set user's hash + * + * @deprecated 2.8.7 */ public function assign_secretkey() { _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->assign_secretkey()' ); diff --git a/readme.txt b/readme.txt index 68b71757..9ac7991b 100644 --- a/readme.txt +++ b/readme.txt @@ -178,6 +178,13 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Added: ProfilePage Structured Data * Added: Ability to use HTML tags (allowed in `wp_kses_post`) in the global block restriction message * Changed: Some wp-admin fields descriptions +* Updated: Data format in `um_admin_bulk_user_actions_hook` hook. Changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` +* Added: `$old_status` param to `um_after_user_status_is_changed` hook +* Added: `$user_id` param to `um_before_user_hash_is_changed` hook +* Added: `$user_id, $hash, $expiration` params to `um_after_user_hash_is_changed` hook +* Added: `um_restricted_post_content` hook +* Added: `um_loggedin_inner_content` hook +* Added: `um_profile_dynamic_meta_profile_schema` hook **Bugfixes** @@ -201,6 +208,20 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Deprecated** +Hook: `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. +Hook: `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. +Hook: `um_admin_user_action_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +Hook: `um_admin_user_action_{$bulk_action}_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +Hook: `um_admin_custom_hook_{$action}`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. +Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. +Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. +Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. +Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. +Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. +Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. +Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. + = 2.8.6 2024-05-22 = **Enhancements** From 6d183cc98347f16b672441ce0ff8c65c7384660e Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 17:34:47 +0300 Subject: [PATCH 40/97] * added UM()->common()->filesystem() class from new UI version; * prepared to release; --- changelog.txt | 1 + includes/common/class-filesystem.php | 293 +++++++++++++++++++++++++++ includes/common/class-init.php | 12 ++ includes/core/class-files.php | 17 +- readme.txt | 1 + 5 files changed, 311 insertions(+), 13 deletions(-) create mode 100644 includes/common/class-filesystem.php diff --git a/changelog.txt b/changelog.txt index 01cf476e..7582eee6 100644 --- a/changelog.txt +++ b/changelog.txt @@ -55,6 +55,7 @@ - Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. - Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. - Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. + - Function: `UM()->files()->format_bytes( $size )`. Use function `UM()->common()->filesystem()::format_bytes( $size )` instead. = 2.8.6 May 22, 2024 = diff --git a/includes/common/class-filesystem.php b/includes/common/class-filesystem.php new file mode 100644 index 00000000..b5b092d0 --- /dev/null +++ b/includes/common/class-filesystem.php @@ -0,0 +1,293 @@ +init_paths(); + } + + /** + * Init uploading URL and directory + * + * @since 2.8.7 + */ + public function init_paths() { + $this->temp_upload_dir = $this->get_upload_dir( 'ultimatemember/temp' ); + $this->temp_upload_url = $this->get_upload_url( 'ultimatemember/temp' ); + } + + public function files_age() { + /** + * Filters the maximum file age in the temp folder. By default, it's 24 hours. + * + * @since 2.8.7 + * @hook um_filesystem_max_file_age + * + * @param {int} $file_age Temp file age in seconds. + * + * @return {int} Temp file age in seconds. + */ + return apply_filters( 'um_filesystem_max_file_age', 24 * HOUR_IN_SECONDS ); // Temp file age in seconds + } + + public static function image_mimes( $context = 'list' ) { + $mimes = array(); + + static $allowed_for_user = null; + if ( empty( $allowed_for_user ) ) { + $allowed_for_user = get_allowed_mime_types(); + } + + if ( empty( $allowed_for_user ) ) { + return $mimes; + } + + if ( 'list' === $context ) { + $all_mimes = wp_get_ext_types(); + $mimes = array_key_exists( 'image', $all_mimes ) ? $all_mimes['image'] : array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'bmp', 'tif', 'tiff', 'ico', 'heic', 'webp', 'avif' ); + + $all_extensions = array(); + foreach ( $allowed_for_user as $extensions => $mime ) { + $all_extensions[] = explode( '|', $extensions ); + } + $all_extensions = array_merge( ...$all_extensions ); + $mimes = array_intersect( $mimes, $all_extensions ); + + /** + * Filters the MIME-types of the images that can be uploaded as Company Logo. + * + * @since 2.8.7 + * @hook um_upload_image_mimes_list + * + * @param {array} $mime_types MIME types. + * + * @return {array} MIME types. + */ + $mimes = apply_filters( 'um_upload_image_mimes_list', $mimes ); + } elseif ( 'allowed' === $context ) { + $mimes = array( + 'jpg|jpeg|jpe' => 'image/jpeg', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'bmp' => 'image/bmp', + 'tiff|tif' => 'image/tiff', + 'webp' => 'image/webp', + 'avif' => 'image/avif', + 'ico' => 'image/x-icon', + 'heic' => 'image/heic', + ); + + $mimes = array_intersect( $mimes, $allowed_for_user ); + + /** + * Filters the MIME-types of the images that can be uploaded via UM uploader + * + * @since 2.8.7 + * @hook um_upload_allowed_image_mimes + * + * @param {array} $mime_types MIME types. + * + * @return {array} MIME types. + */ + $mimes = apply_filters( 'um_upload_allowed_image_mimes', $mimes ); + } + + return $mimes; + } + + /** + * Remove all files, which are older than 24 hours + * + * Can duplicate this function functionality `remove_old_files` + * + * @since 2.8.7 + */ + public function clear_temp_dir() { + global $wp_filesystem; + + if ( ! $wp_filesystem instanceof WP_Filesystem_Base ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + + $credentials = request_filesystem_credentials( site_url() ); + WP_Filesystem( $credentials ); + } + + if ( ! $wp_filesystem->is_dir( $this->temp_upload_dir ) ) { + return; + } + + // phpcs:disable WordPress.PHP.NoSilencedErrors.Discouraged + $dir = @opendir( $this->temp_upload_dir ); + if ( ! $dir ) { + return; + } + + // phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition -- reading folder's content here + while ( false !== ( $file = readdir( $dir ) ) ) { + if ( '.' === $file || '..' === $file ) { + continue; + } + + $filepath = wp_normalize_path( $this->temp_upload_dir . DIRECTORY_SEPARATOR . $file ); + + // Remove temp file if it is older than the max age and is not the current file + if ( $wp_filesystem->mtime( $filepath ) < time() - $this->files_age() ) { + $wp_filesystem->delete( $filepath ); + } + } + + @closedir( $dir ); + // phpcs:enable WordPress.PHP.NoSilencedErrors.Discouraged + } + + /** + * Get upload dir of plugin + * + * @param string $dir + * @param int|null $blog_id + * + * @return string + * + * @since 2.8.7 + */ + public function get_upload_dir( $dir = '', $blog_id = null ) { + // Please add define('FS_METHOD', 'direct'); to avoid question about FTP. + global $wp_filesystem; + + if ( ! $wp_filesystem instanceof WP_Filesystem_Base ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + + $credentials = request_filesystem_credentials( site_url() ); + WP_Filesystem( $credentials ); + } + + if ( ! $blog_id ) { + $blog_id = get_current_blog_id(); + } elseif ( is_multisite() ) { + switch_to_blog( $blog_id ); + } + + if ( empty( $this->upload_dir[ $blog_id ] ) ) { + $uploads = wp_upload_dir(); + if ( ! empty( $uploads['error'] ) ) { + return ''; + } + $this->upload_dir[ $blog_id ] = $uploads['basedir']; + } + + $upload_dir = wp_normalize_path( trailingslashit( $this->upload_dir[ $blog_id ] ) . untrailingslashit( $dir ) ); + + if ( ! $wp_filesystem->is_dir( $upload_dir ) ) { + wp_mkdir_p( $upload_dir ); + } + + if ( is_multisite() ) { + restore_current_blog(); + } + + //return dir path + return $upload_dir; + } + + /** + * Get upload url of plugin + * + * @param string $url + * @param int|null $blog_id + * + * @return string + * + * @since 2.8.7 + */ + public function get_upload_url( $url = '', $blog_id = null ) { + if ( ! $blog_id ) { + $blog_id = get_current_blog_id(); + } elseif ( is_multisite() ) { + switch_to_blog( $blog_id ); + } + + if ( empty( $this->upload_url[ $blog_id ] ) ) { + $uploads = wp_upload_dir(); + if ( ! empty( $uploads['error'] ) ) { + return ''; + } + $this->upload_url[ $blog_id ] = $uploads['baseurl']; + } + + $upload_url = trailingslashit( $this->upload_url[ $blog_id ] ) . untrailingslashit( $url ); + + if ( is_multisite() ) { + restore_current_blog(); + } + + //return dir path + return $upload_url; + } + + /** + * Format Bytes + * + * @param int $size + * @param int $precision + * + * @return string + * + * @since 2.8.7 + */ + public static function format_bytes( $size, $precision = 1 ) { + if ( is_numeric( $size ) ) { + $base = log( $size, 1024 ); + $suffixes = array( '', 'kb', 'MB', 'GB', 'TB' ); + + $computed_size = round( 1024 ** ( $base - floor( $base ) ), $precision ); + $unit = $suffixes[ absint( floor( $base ) ) ]; + + return $computed_size . ' ' . $unit; + } + + return ''; + } +} diff --git a/includes/common/class-init.php b/includes/common/class-init.php index 41ad1b2a..63540a46 100644 --- a/includes/common/class-init.php +++ b/includes/common/class-init.php @@ -40,6 +40,18 @@ if ( ! class_exists( 'um\common\Init' ) ) { return UM()->classes['um\common\cpt']; } + /** + * @since 2.8.7 + * + * @return Filesystem + */ + public function filesystem() { + if ( empty( UM()->classes['um\common\filesystem'] ) ) { + UM()->classes['um\common\filesystem'] = new Filesystem(); + } + return UM()->classes['um\common\filesystem']; + } + /** * @since 2.6.8 * diff --git a/includes/core/class-files.php b/includes/core/class-files.php index eb8d3297..53cfdc57 100644 --- a/includes/core/class-files.php +++ b/includes/core/class-files.php @@ -1244,29 +1244,20 @@ if ( ! class_exists( 'um\core\Files' ) ) { return $removed_files; } - /** * Format Bytes * + * @deprecated 2.8.7 * @param $size * @param int $precision * * @return string */ - function format_bytes( $size, $precision = 1 ) { - if ( is_numeric( $size ) ) { - $base = log( $size, 1024 ); - $suffixes = array( '', 'kb', 'MB', 'GB', 'TB' ); - $computed_size = round( pow( 1024, $base - floor( $base ) ), $precision ); - $unit = $suffixes[ floor( $base ) ]; - - return $computed_size.' '.$unit; - } - - return ''; + public function format_bytes( $size, $precision = 1 ) { + _deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->filesystem()->format_bytes()' ); + return UM()->common()->filesystem()::format_bytes( $size, $precision ); } - /** * Get the list of profile/cover sizes * diff --git a/readme.txt b/readme.txt index 9ac7991b..87e51e92 100644 --- a/readme.txt +++ b/readme.txt @@ -221,6 +221,7 @@ Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_ Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. +Function: `UM()->files()->format_bytes( $size )`. Use function `UM()->common()->filesystem()::format_bytes( $size )` instead. = 2.8.6 2024-05-22 = From cccce6ebc3e8211ccc1177c3113de5244b7e8bbb Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 17:55:44 +0300 Subject: [PATCH 41/97] * fixed running `UM()->fields()->get_restricted_fields_for_edit()` function in the fields loop; --- includes/core/class-fields.php | 1 - includes/core/class-form.php | 7 ++++++- includes/core/um-actions-form.php | 12 +++++++----- includes/core/um-actions-profile.php | 5 +++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 3c443a0c..872dd5e2 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -2110,7 +2110,6 @@ if ( ! class_exists( 'um\core\Fields' ) ) { return apply_filters( 'um_field_non_utf8_value', $option_value ); } - /** * Getting the fields that need to be disabled in edit mode (profile) * diff --git a/includes/core/class-form.php b/includes/core/class-form.php index c7a89c42..7a39efbf 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -448,6 +448,11 @@ if ( ! class_exists( 'um\core\Form' ) ) { $ignore_keys = array(); + $arr_restricted_fields = array(); + if ( 'profile' === $this->form_data['mode'] ) { + $arr_restricted_fields = UM()->fields()->get_restricted_fields_for_edit(); + } + $field_types_without_metakey = UM()->builtin()->get_fields_without_metakey(); foreach ( $custom_fields as $cf_k => $cf_data ) { if ( ! array_key_exists( 'type', $cf_data ) || in_array( $cf_data['type'], $field_types_without_metakey, true ) ) { @@ -493,7 +498,7 @@ if ( ! class_exists( 'um\core\Form' ) ) { // Column names from wp_users table. $cf_metakeys = array_values( array_diff( $cf_metakeys, array( 'user_login' ) ) ); // Hidden for edit fields - $cf_metakeys = array_values( array_diff( $cf_metakeys, UM()->fields()->get_restricted_fields_for_edit() ) ); + $cf_metakeys = array_values( array_diff( $cf_metakeys, $arr_restricted_fields ) ); $cf_metakeys[] = 'profile_photo'; $cf_metakeys[] = 'cover_photo'; diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index d3f60a98..bf3560be 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -417,13 +417,15 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { um_reset_user(); } + $restricted_fields = array(); + if ( 'profile' === $mode ) { + $restricted_fields = UM()->fields()->get_restricted_fields_for_edit(); + } + foreach ( $fields as $key => $array ) { - if ( 'profile' === $mode ) { - $restricted_fields = UM()->fields()->get_restricted_fields_for_edit(); - if ( is_array( $restricted_fields ) && in_array( $key, $restricted_fields, true ) ) { - continue; - } + if ( 'profile' === $mode && is_array( $restricted_fields ) && in_array( $key, $restricted_fields, true ) ) { + continue; } $can_view = true; diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 05a1a43b..e60e5ac8 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -226,6 +226,8 @@ function um_user_edit_profile( $args, $form_data ) { // loop through fields if ( ! empty( $fields ) ) { + $arr_restricted_fields = UM()->fields()->get_restricted_fields_for_edit( $user_id ); + foreach ( $fields as $key => $array ) { if ( ! isset( $array['type'] ) ) { continue; @@ -253,8 +255,7 @@ function um_user_edit_profile( $args, $form_data ) { } // fields that need to be disabled in edit mode (profile) (email, username, etc.) - $arr_restricted_fields = UM()->fields()->get_restricted_fields_for_edit( $user_id ); - if ( in_array( $key, $arr_restricted_fields, true ) ) { + if ( is_array( $arr_restricted_fields ) && in_array( $key, $arr_restricted_fields, true ) ) { continue; } From d3d1591f2dacc14bb6a67017740137d1a165440c Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 18:01:58 +0300 Subject: [PATCH 42/97] * fixed deprecated function --- includes/core/um-filters-profile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/core/um-filters-profile.php b/includes/core/um-filters-profile.php index 95515724..3e994bf1 100644 --- a/includes/core/um-filters-profile.php +++ b/includes/core/um-filters-profile.php @@ -127,7 +127,7 @@ add_filter( 'get_canonical_url', 'um_get_canonical_url', 20, 2 ); * @return array */ function um_change_profile_cover_photo_label( $fields ) { - $max_size = UM()->files()->format_bytes( $fields['cover_photo']['max_size'] ); + $max_size = UM()->common()->filesystem()::format_bytes( $fields['cover_photo']['max_size'] ); if ( ! empty( $max_size ) ) { list( $file_size, $unit ) = explode( ' ', $max_size ); @@ -148,7 +148,7 @@ add_filter( 'um_predefined_fields_hook', 'um_change_profile_cover_photo_label', * @return array */ function um_change_profile_photo_label( $fields ) { - $max_size = UM()->files()->format_bytes( $fields['profile_photo']['max_size'] ); + $max_size = UM()->common()->filesystem()::format_bytes( $fields['profile_photo']['max_size'] ); if ( ! empty( $max_size ) ) { list( $file_size, $unit ) = explode( ' ', $max_size ); From f64e1b98f081bcea5eab21fb4154a24b56e58bf7 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:05:42 +0000 Subject: [PATCH 43/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2054 +++++++++++++++++---------------- 1 file changed, 1077 insertions(+), 977 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 69bf5c6c..8024ef10 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -2,24 +2,25 @@ # This file is distributed under the same license as the Ultimate Member plugin. msgid "" msgstr "" -"Project-Id-Version: Ultimate Member 2.8.6\n" +"Project-Id-Version: Ultimate Member 2.8.7\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-member\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-05-20T11:04:53+00:00\n" +"POT-Creation-Date: 2024-09-27T15:05:38+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.10.0\n" +"X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" #. Plugin Name of the plugin #. Author of the plugin #: ultimate-member.php #: includes/admin/class-site-health.php:292 +#: includes/admin/class-users-columns.php:311 #: includes/admin/core/class-admin-menu.php:183 -#: includes/core/class-user.php:1061 +#: includes/core/class-user.php:1060 msgid "Ultimate Member" msgstr "" @@ -34,83 +35,92 @@ msgstr "" msgid "The easiest way to create powerful online communities and beautiful user profiles with WordPress" msgstr "" +#: includes/admin/class-actions-listener.php:39 +#: includes/admin/class-actions-listener.php:64 +#: includes/admin/class-actions-listener.php:88 +#: includes/admin/class-actions-listener.php:112 +#: includes/admin/class-actions-listener.php:136 +#: includes/admin/class-actions-listener.php:160 +msgid "Invalid user ID" +msgstr "" + #: includes/admin/class-admin-functions.php:26 #: includes/class-functions.php:55 msgid "Wrong Nonce" msgstr "" -#: includes/admin/class-admin.php:843 +#: includes/admin/class-admin.php:844 #: includes/admin/class-site-health.php:2003 #: includes/admin/templates/directory/sorting.php:68 #: includes/core/class-member-directory.php:426 msgid "Other (Custom Field)" msgstr "" -#: includes/admin/class-admin.php:1797 +#: includes/admin/class-admin.php:1800 #: includes/admin/class-secure.php:96 #: includes/admin/class-secure.php:133 msgid "Security check" msgstr "" -#: includes/admin/class-admin.php:1801 +#: includes/admin/class-admin.php:1804 msgid "Wrong ID" msgstr "" #. translators: %s - Form title -#: includes/admin/class-admin.php:1809 +#: includes/admin/class-admin.php:1812 msgid "Duplicate of %s" msgstr "" -#: includes/admin/class-admin.php:1932 +#: includes/admin/class-admin.php:1872 msgid "Docs" msgstr "" -#: includes/admin/class-admin.php:1933 +#: includes/admin/class-admin.php:1873 #: includes/admin/core/class-admin-menu.php:195 msgid "Settings" msgstr "" -#: includes/admin/class-admin.php:1957 -#: includes/admin/core/class-admin-notices.php:1033 +#: includes/admin/class-admin.php:1896 +#: includes/admin/core/class-admin-notices.php:1060 #: includes/admin/core/class-admin-settings.php:2520 #: includes/ajax/class-secure.php:34 msgid "Security Check" msgstr "" -#: includes/admin/class-admin.php:2019 -#: includes/admin/class-admin.php:2022 +#: includes/admin/class-admin.php:1958 +#: includes/admin/class-admin.php:1961 msgid "Form updated." msgstr "" -#: includes/admin/class-admin.php:2020 +#: includes/admin/class-admin.php:1959 msgid "Custom field updated." msgstr "" -#: includes/admin/class-admin.php:2021 +#: includes/admin/class-admin.php:1960 msgid "Custom field deleted." msgstr "" -#: includes/admin/class-admin.php:2023 +#: includes/admin/class-admin.php:1962 msgid "Form restored to revision." msgstr "" -#: includes/admin/class-admin.php:2024 +#: includes/admin/class-admin.php:1963 msgid "Form created." msgstr "" -#: includes/admin/class-admin.php:2025 +#: includes/admin/class-admin.php:1964 msgid "Form saved." msgstr "" -#: includes/admin/class-admin.php:2026 +#: includes/admin/class-admin.php:1965 msgid "Form submitted." msgstr "" -#: includes/admin/class-admin.php:2027 +#: includes/admin/class-admin.php:1966 msgid "Form scheduled." msgstr "" -#: includes/admin/class-admin.php:2028 +#: includes/admin/class-admin.php:1967 msgid "Form draft updated." msgstr "" @@ -128,12 +138,12 @@ msgstr "" #: includes/class-config.php:394 #: includes/core/class-builtin.php:796 #: includes/core/class-builtin.php:799 -#: includes/core/class-builtin.php:1380 -#: includes/core/class-builtin.php:1383 -#: includes/core/um-actions-account.php:660 -#: includes/core/um-actions-account.php:664 -#: includes/core/um-actions-account.php:748 -#: includes/core/um-actions-account.php:752 +#: includes/core/class-builtin.php:1384 +#: includes/core/class-builtin.php:1387 +#: includes/core/um-actions-account.php:690 +#: includes/core/um-actions-account.php:694 +#: includes/core/um-actions-account.php:778 +#: includes/core/um-actions-account.php:782 msgid "Password" msgstr "" @@ -172,7 +182,7 @@ msgid "Last scan:" msgstr "" #: includes/admin/class-secure.php:202 -#: includes/admin/class-secure.php:336 +#: includes/admin/class-secure.php:339 msgid "ago" msgstr "" @@ -228,95 +238,95 @@ msgstr "" msgid "Enforces users to reset their passwords (one-time) and prevent from entering old password." msgstr "" -#: includes/admin/class-secure.php:253 +#: includes/admin/class-secure.php:256 msgid "Expire All Users Sessions" msgstr "" #. translators: %d is the users count. -#: includes/admin/class-secure.php:255 +#: includes/admin/class-secure.php:258 msgid "Are you sure that you want to make all users sessions expired?" msgstr "" #. translators: %d is the users count. -#: includes/admin/class-secure.php:255 +#: includes/admin/class-secure.php:258 msgid "Logout Users (%d)" msgstr "" -#: includes/admin/class-secure.php:256 +#: includes/admin/class-secure.php:259 msgid "This will log out all users on your site and forces them to reset passwords
when \"Display Login form notice to reset passwords\" is enabled/checked." msgstr "" -#: includes/admin/class-secure.php:266 +#: includes/admin/class-secure.php:269 msgid "Administrative capabilities ban" msgstr "" -#: includes/admin/class-secure.php:267 +#: includes/admin/class-secure.php:270 #: includes/admin/class-site-health.php:1124 msgid "Enable ban for administrative capabilities" msgstr "" -#: includes/admin/class-secure.php:268 +#: includes/admin/class-secure.php:271 msgid " When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be banned." msgstr "" -#: includes/admin/class-secure.php:273 +#: includes/admin/class-secure.php:276 #: includes/admin/class-site-health.php:1132 msgid "Notify Administrators" msgstr "" -#: includes/admin/class-secure.php:274 +#: includes/admin/class-secure.php:277 msgid "Enable notification" msgstr "" -#: includes/admin/class-secure.php:275 +#: includes/admin/class-secure.php:278 msgid "When enabled, All administrators will be notified when someone has suspicious activities in the Account, Profile & Register forms." msgstr "" -#: includes/admin/class-secure.php:282 +#: includes/admin/class-secure.php:285 #: includes/admin/class-site-health.php:1137 msgid "Send Immediately" msgstr "" -#: includes/admin/class-secure.php:283 +#: includes/admin/class-secure.php:286 #: includes/admin/class-site-health.php:1138 msgid "Hourly" msgstr "" -#: includes/admin/class-secure.php:284 +#: includes/admin/class-secure.php:287 #: includes/admin/class-site-health.php:1139 msgid "Daily" msgstr "" -#: includes/admin/class-secure.php:286 +#: includes/admin/class-secure.php:289 #: includes/admin/class-site-health.php:1143 msgid "Notification Schedule" msgstr "" -#: includes/admin/class-secure.php:292 +#: includes/admin/class-secure.php:295 msgid "Allowed hosts for safe redirect (one host per line)" msgstr "" -#: includes/admin/class-secure.php:293 +#: includes/admin/class-secure.php:296 msgid "Extend allowed hosts for frontend pages redirects." msgstr "" -#: includes/admin/class-secure.php:303 +#: includes/admin/class-secure.php:306 msgid "Security" msgstr "" -#: includes/admin/class-secure.php:304 +#: includes/admin/class-secure.php:307 msgid "This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed." msgstr "" -#: includes/admin/class-secure.php:331 +#: includes/admin/class-secure.php:334 msgid "Blocked Due to Suspicious Activity" msgstr "" -#: includes/admin/class-secure.php:334 +#: includes/admin/class-secure.php:337 msgid "Are you sure that you want to restore this account after getting flagged for suspicious activity?" msgstr "" -#: includes/admin/class-secure.php:334 +#: includes/admin/class-secure.php:337 msgid "Restore Account" msgstr "" @@ -385,8 +395,8 @@ msgid "Field: " msgstr "" #: includes/admin/class-site-health.php:284 -#: includes/admin/core/class-admin-columns.php:197 -#: includes/admin/core/class-admin-columns.php:230 +#: includes/admin/core/class-admin-columns.php:161 +#: includes/admin/core/class-admin-columns.php:194 #: includes/admin/core/class-admin-settings.php:1239 #: includes/admin/core/class-admin-settings.php:1347 #: includes/admin/core/list-tables/roles-list-table.php:435 @@ -408,20 +418,20 @@ msgstr "" #: includes/admin/templates/form/register_customize.php:34 #: includes/admin/templates/form/register_customize.php:90 #: includes/admin/templates/form/register_gdpr.php:32 -#: includes/admin/templates/role/profile.php:54 -#: includes/core/class-builtin.php:1320 -#: includes/core/class-builtin.php:1339 -#: includes/core/class-builtin.php:1357 -#: includes/core/class-builtin.php:1373 +#: includes/admin/templates/role/profile.php:57 +#: includes/core/class-builtin.php:1324 +#: includes/core/class-builtin.php:1343 +#: includes/core/class-builtin.php:1361 +#: includes/core/class-builtin.php:1377 +#: includes/core/class-user.php:531 #: includes/core/class-user.php:532 -#: includes/core/class-user.php:533 -#: includes/core/um-actions-account.php:342 +#: includes/core/um-actions-account.php:344 msgid "Yes" msgstr "" #: includes/admin/class-site-health.php:285 -#: includes/admin/core/class-admin-columns.php:197 -#: includes/admin/core/class-admin-columns.php:230 +#: includes/admin/core/class-admin-columns.php:161 +#: includes/admin/core/class-admin-columns.php:194 #: includes/admin/core/class-admin-settings.php:1238 #: includes/admin/core/class-admin-settings.php:1346 #: includes/admin/core/list-tables/roles-list-table.php:435 @@ -441,19 +451,17 @@ msgstr "" #: includes/admin/templates/form/register_customize.php:33 #: includes/admin/templates/form/register_customize.php:89 #: includes/admin/templates/form/register_gdpr.php:31 -#: includes/admin/templates/role/profile.php:53 -#: includes/core/class-builtin.php:1319 -#: includes/core/class-builtin.php:1338 -#: includes/core/class-builtin.php:1356 -#: includes/core/class-builtin.php:1371 -#: includes/core/class-builtin.php:1374 -#: includes/core/um-actions-account.php:347 +#: includes/admin/templates/role/profile.php:56 +#: includes/core/class-builtin.php:1323 +#: includes/core/class-builtin.php:1342 +#: includes/core/class-builtin.php:1360 +#: includes/core/class-builtin.php:1375 +#: includes/core/class-builtin.php:1378 +#: includes/core/um-actions-account.php:349 msgid "No" msgstr "" #: includes/admin/class-site-health.php:286 -#: includes/admin/core/class-admin-users.php:402 -#: includes/admin/core/class-admin-users.php:404 #: includes/blocks/um-account/build/index.js:1 #: includes/blocks/um-account/src/index.js:14 msgid "All" @@ -464,14 +472,14 @@ msgstr "" #: includes/admin/class-site-health.php:1004 #: includes/admin/class-site-health.php:1388 #: includes/admin/class-site-health.php:1822 -#: includes/admin/core/class-admin-columns.php:145 -#: includes/admin/core/class-admin-columns.php:164 +#: includes/admin/core/class-admin-columns.php:109 +#: includes/admin/core/class-admin-columns.php:128 #: includes/admin/core/class-admin-settings.php:1090 #: includes/admin/core/class-admin-settings.php:1155 #: includes/admin/templates/form/login_settings.php:19 #: includes/admin/templates/form/register_customize.php:9 #: includes/admin/templates/form/register_customize.php:42 -#: includes/admin/templates/role/profile.php:52 +#: includes/admin/templates/role/profile.php:55 msgid "Default" msgstr "" @@ -527,7 +535,7 @@ msgstr "" #: includes/admin/class-site-health.php:364 #: includes/admin/class-site-health.php:1424 #: includes/admin/core/class-admin-settings.php:1235 -#: includes/admin/templates/role/profile.php:49 +#: includes/admin/templates/role/profile.php:52 msgid "Avoid indexing profile by search engines" msgstr "" @@ -1227,32 +1235,32 @@ msgid "This debug information about user role." msgstr "" #: includes/admin/class-site-health.php:1240 -#: includes/admin/templates/role/admin-permissions.php:14 +#: includes/admin/templates/role/admin-permissions.php:17 msgid "Can access wp-admin?" msgstr "" #: includes/admin/class-site-health.php:1252 -#: includes/admin/templates/role/admin-permissions.php:21 +#: includes/admin/templates/role/admin-permissions.php:24 msgid "Force hiding adminbar in frontend?" msgstr "" #: includes/admin/class-site-health.php:1264 -#: includes/admin/templates/role/admin-permissions.php:28 +#: includes/admin/templates/role/admin-permissions.php:31 msgid "Can edit other member accounts?" msgstr "" #: includes/admin/class-site-health.php:1286 -#: includes/admin/templates/role/admin-permissions.php:35 +#: includes/admin/templates/role/admin-permissions.php:38 msgid "Can edit these user roles only" msgstr "" #: includes/admin/class-site-health.php:1298 -#: includes/admin/templates/role/admin-permissions.php:45 +#: includes/admin/templates/role/admin-permissions.php:48 msgid "Can delete other member accounts?" msgstr "" #: includes/admin/class-site-health.php:1320 -#: includes/admin/templates/role/admin-permissions.php:52 +#: includes/admin/templates/role/admin-permissions.php:55 msgid "Can delete these user roles only" msgstr "" @@ -1267,12 +1275,12 @@ msgid "Can delete their account?" msgstr "" #: includes/admin/class-site-health.php:1356 -#: includes/admin/templates/role/profile.php:14 +#: includes/admin/templates/role/profile.php:17 msgid "Can view other member profiles?" msgstr "" #: includes/admin/class-site-health.php:1378 -#: includes/admin/templates/role/profile.php:21 +#: includes/admin/templates/role/profile.php:24 msgid "Can view these user roles only" msgstr "" @@ -1281,12 +1289,12 @@ msgid "No such option" msgstr "" #: includes/admin/class-site-health.php:1401 -#: includes/admin/templates/role/profile.php:32 +#: includes/admin/templates/role/profile.php:35 msgid "Can make their profile private?" msgstr "" #: includes/admin/class-site-health.php:1413 -#: includes/admin/templates/role/profile.php:40 +#: includes/admin/templates/role/profile.php:43 msgid "Can view/access private profiles?" msgstr "" @@ -1461,15 +1469,15 @@ msgstr "" #: includes/admin/class-site-health.php:1744 #: includes/admin/class-site-health.php:2032 -#: includes/admin/core/class-admin-columns.php:146 -#: includes/admin/core/class-admin-columns.php:165 +#: includes/admin/core/class-admin-columns.php:110 +#: includes/admin/core/class-admin-columns.php:129 #: includes/admin/core/class-admin-metabox.php:864 #: includes/admin/core/class-admin-metabox.php:1031 msgid "Shortcode" msgstr "" #: includes/admin/class-site-health.php:1748 -#: includes/admin/core/class-admin-columns.php:144 +#: includes/admin/core/class-admin-columns.php:108 msgid "Type" msgstr "" @@ -1595,7 +1603,7 @@ msgid "Gender" msgstr "" #: includes/admin/class-site-health.php:1974 -#: includes/core/class-builtin.php:1213 +#: includes/core/class-builtin.php:1217 #: includes/core/class-member-directory.php:435 msgid "Languages" msgstr "" @@ -1610,8 +1618,8 @@ msgstr "" #: includes/admin/class-site-health.php:1976 #: includes/core/class-member-directory.php:437 -#: includes/core/um-filters-fields.php:1001 -#: includes/core/um-filters-fields.php:1018 +#: includes/core/um-filters-fields.php:1005 +#: includes/core/um-filters-fields.php:1022 msgid "Age" msgstr "" @@ -1669,27 +1677,27 @@ msgid "Biography" msgstr "" #: includes/admin/class-site-health.php:1984 -#: includes/core/class-builtin.php:1225 -#: includes/core/class-builtin.php:1228 -#: includes/core/class-builtin.php:1584 +#: includes/core/class-builtin.php:1229 +#: includes/core/class-builtin.php:1232 +#: includes/core/class-builtin.php:1588 #: includes/core/class-member-directory.php:445 msgid "Phone Number" msgstr "" #: includes/admin/class-site-health.php:1985 -#: includes/core/class-builtin.php:1237 -#: includes/core/class-builtin.php:1240 +#: includes/core/class-builtin.php:1241 +#: includes/core/class-builtin.php:1244 #: includes/core/class-member-directory.php:446 msgid "Mobile Number" msgstr "" #: includes/admin/class-site-health.php:1986 -#: includes/core/class-builtin.php:1190 +#: includes/core/class-builtin.php:1194 msgid "Roles (Dropdown)" msgstr "" #: includes/admin/class-site-health.php:1987 -#: includes/core/class-builtin.php:1202 +#: includes/core/class-builtin.php:1206 msgid "Roles (Radio)" msgstr "" @@ -1719,7 +1727,7 @@ msgstr "" #: includes/admin/class-site-health.php:1992 #: includes/core/class-builtin.php:1022 #: includes/core/class-builtin.php:1025 -#: includes/core/class-builtin.php:1585 +#: includes/core/class-builtin.php:1589 msgid "Skype ID" msgstr "" @@ -1730,8 +1738,8 @@ msgid "Telegram" msgstr "" #: includes/admin/class-site-health.php:1994 -#: includes/core/class-builtin.php:1081 -#: includes/core/class-builtin.php:1090 +#: includes/core/class-builtin.php:1083 +#: includes/core/class-builtin.php:1092 msgid "Discord" msgstr "" @@ -1740,8 +1748,8 @@ msgid "Youtube" msgstr "" #: includes/admin/class-site-health.php:1996 -#: includes/core/class-builtin.php:1172 -#: includes/core/class-builtin.php:1175 +#: includes/core/class-builtin.php:1176 +#: includes/core/class-builtin.php:1179 msgid "SoundCloud" msgstr "" @@ -1982,6 +1990,87 @@ msgstr "" msgid "Custom text if no users were found" msgstr "" +#: includes/admin/class-users-columns.php:49 +#: includes/admin/core/list-tables/version-template-list-table.php:212 +msgid "Status" +msgstr "" + +#: includes/admin/class-users-columns.php:87 +msgid "Approve" +msgstr "" + +#: includes/admin/class-users-columns.php:98 +#: includes/admin/class-users-columns.php:270 +msgid "Reactivate" +msgstr "" + +#: includes/admin/class-users-columns.php:109 +msgid "Put as pending" +msgstr "" + +#: includes/admin/class-users-columns.php:120 +msgid "Resend activation email" +msgstr "" + +#: includes/admin/class-users-columns.php:131 +msgid "Are you sure you want to reject this user membership?" +msgstr "" + +#: includes/admin/class-users-columns.php:131 +msgid "Reject" +msgstr "" + +#: includes/admin/class-users-columns.php:142 +msgid "Are you sure you want to deactivate this user?" +msgstr "" + +#: includes/admin/class-users-columns.php:142 +#: includes/admin/class-users-columns.php:269 +msgid "Deactivate" +msgstr "" + +#: includes/admin/class-users-columns.php:226 +#: templates/account.php:61 +#: templates/account.php:102 +msgid "View profile" +msgstr "" + +#: includes/admin/class-users-columns.php:232 +msgid "Info" +msgstr "" + +#: includes/admin/class-users-columns.php:265 +#: includes/frontend/class-users.php:34 +msgid "Approve Membership" +msgstr "" + +#: includes/admin/class-users-columns.php:266 +#: includes/frontend/class-users.php:46 +msgid "Reject Membership" +msgstr "" + +#: includes/admin/class-users-columns.php:267 +#: includes/frontend/class-users.php:40 +msgid "Put as Pending Review" +msgstr "" + +#: includes/admin/class-users-columns.php:268 +msgid "Resend Activation E-mail" +msgstr "" + +#: includes/admin/class-users-columns.php:353 +#: includes/admin/class-users-columns.php:355 +msgid "All Statuses" +msgstr "" + +#: includes/admin/class-users-columns.php:365 +msgid "Filter" +msgstr "" + +#: includes/admin/class-users-columns.php:398 +msgid "You do not have enough permissions to do that." +msgstr "" + #: includes/admin/core/class-admin-builder.php:238 #: includes/admin/core/class-admin-builder.php:240 msgid "Here you can setup conditional logic to show/hide this field based on specific fields value or conditions" @@ -2049,7 +2138,7 @@ msgid "Edit" msgstr "" #: includes/admin/core/class-admin-builder.php:553 -#: includes/admin/core/class-admin-columns.php:107 +#: includes/admin/core/class-admin-columns.php:71 msgid "Duplicate" msgstr "" @@ -2075,7 +2164,7 @@ msgid "Predefined Fields" msgstr "" #: includes/admin/core/class-admin-builder.php:871 -#: includes/core/class-builtin.php:1575 +#: includes/core/class-builtin.php:1579 msgid "None" msgstr "" @@ -2106,9 +2195,9 @@ msgstr "" #: includes/core/class-form.php:154 #: includes/core/class-form.php:161 #: includes/core/class-form.php:243 -#: includes/core/class-form.php:608 +#: includes/core/class-form.php:613 #: includes/core/class-password.php:480 -#: includes/core/um-actions-profile.php:550 +#: includes/core/um-actions-profile.php:551 msgid "This is not possible for security reasons." msgstr "" @@ -2116,26 +2205,21 @@ msgstr "" msgid "This is not possible for security reasons. Don't use internal PHP functions." msgstr "" -#: includes/admin/core/class-admin-columns.php:50 -#: includes/admin/core/list-tables/version-template-list-table.php:212 -msgid "Status" -msgstr "" - -#: includes/admin/core/class-admin-columns.php:142 -#: includes/admin/core/class-admin-columns.php:162 +#: includes/admin/core/class-admin-columns.php:106 +#: includes/admin/core/class-admin-columns.php:126 #: includes/admin/core/class-admin-metabox.php:2260 #: includes/admin/templates/role/role-edit.php:246 #: includes/widgets/class-um-search-widget.php:94 msgid "Title" msgstr "" -#: includes/admin/core/class-admin-columns.php:143 -#: includes/admin/core/class-admin-columns.php:163 +#: includes/admin/core/class-admin-columns.php:107 +#: includes/admin/core/class-admin-columns.php:127 msgid "ID" msgstr "" -#: includes/admin/core/class-admin-columns.php:147 -#: includes/admin/core/class-admin-columns.php:166 +#: includes/admin/core/class-admin-columns.php:111 +#: includes/admin/core/class-admin-columns.php:130 msgid "Date" msgstr "" @@ -2184,7 +2268,7 @@ msgstr "" #: includes/admin/core/class-admin-forms.php:1673 #: includes/admin/core/class-admin-forms.php:1789 #: includes/admin/core/class-admin-forms.php:1818 -#: includes/core/um-actions-profile.php:846 +#: includes/core/um-actions-profile.php:871 #: assets/js/admin/forms.js:353 #: assets/js/admin/forms.js:427 #: assets/js/admin/forms.js:716 @@ -3188,10 +3272,10 @@ msgid "The text that appears on the button. e.g. Upload" msgstr "" #: includes/admin/core/class-admin-metabox.php:2104 -#: includes/core/class-fields.php:1957 -#: includes/core/class-fields.php:1998 -#: includes/core/class-fields.php:2949 -#: includes/core/class-fields.php:3052 +#: includes/core/class-fields.php:1955 +#: includes/core/class-fields.php:1996 +#: includes/core/class-fields.php:2948 +#: includes/core/class-fields.php:3051 msgid "Upload" msgstr "" @@ -3586,127 +3670,159 @@ msgid "Settings have been saved successfully." msgstr "" #: includes/admin/core/class-admin-notices.php:494 -msgid "User has been updated." -msgstr "" - -#: includes/admin/core/class-admin-notices.php:497 msgid "Users have been updated." msgstr "" -#: includes/admin/core/class-admin-notices.php:500 +#: includes/admin/core/class-admin-notices.php:497 msgid "All users sessions have been successfully destroyed." msgstr "" -#: includes/admin/core/class-admin-notices.php:503 +#: includes/admin/core/class-admin-notices.php:500 msgid "Account has been successfully restored." msgstr "" +#: includes/admin/core/class-admin-notices.php:505 +msgid "%s user has been approved." +msgid_plural "%s users have been approved." +msgstr[0] "" +msgstr[1] "" + +#: includes/admin/core/class-admin-notices.php:510 +msgid "%s user has been reactivated." +msgid_plural "%s users have been reactivated." +msgstr[0] "" +msgstr[1] "" + +#: includes/admin/core/class-admin-notices.php:515 +msgid "%s user has been rejected." +msgid_plural "%s users have been rejected." +msgstr[0] "" +msgstr[1] "" + +#: includes/admin/core/class-admin-notices.php:520 +msgid "%s user has been deactivated." +msgid_plural "%s users have been deactivated." +msgstr[0] "" +msgstr[1] "" + +#: includes/admin/core/class-admin-notices.php:525 +msgid "%s user has been set as pending admin review." +msgid_plural "%s users have been set as pending admin review." +msgstr[0] "" +msgstr[1] "" + +#: includes/admin/core/class-admin-notices.php:530 +msgid "Activation email for %s user has been sent." +msgid_plural "Activation emails for %s users have been sent." +msgstr[0] "" +msgstr[1] "" + #. translators: %s: Plugin name. -#: includes/admin/core/class-admin-notices.php:572 +#: includes/admin/core/class-admin-notices.php:599 msgid "You have installed %s with wrong folder name. Correct folder name is \"ultimate-member\"." msgstr "" #. translators: %1$s is an inactive license number; %2$s is a plugin name; %3$s is a store link. -#: includes/admin/core/class-admin-notices.php:607 +#: includes/admin/core/class-admin-notices.php:634 msgid "There are %1$s inactive %2$s license keys for this site. This site is not authorized to get plugin updates. You can active this site on www.ultimatemember.com." msgstr "" #. translators: %1$s is an invalid license; %2$s is a plugin name; %3$s is a license link. -#: includes/admin/core/class-admin-notices.php:627 +#: includes/admin/core/class-admin-notices.php:654 msgid "You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue." msgstr "" -#: includes/admin/core/class-admin-notices.php:644 +#: includes/admin/core/class-admin-notices.php:671 msgid "version needs to be updated to work correctly." msgstr "" -#: includes/admin/core/class-admin-notices.php:646 +#: includes/admin/core/class-admin-notices.php:673 msgid "It is necessary to update the structure of the database and options that are associated with current version" msgstr "" -#: includes/admin/core/class-admin-notices.php:648 +#: includes/admin/core/class-admin-notices.php:675 msgid "Please run the upgrade process on this " msgstr "" -#: includes/admin/core/class-admin-notices.php:648 +#: includes/admin/core/class-admin-notices.php:675 msgid "page" msgstr "" -#: includes/admin/core/class-admin-notices.php:652 +#: includes/admin/core/class-admin-notices.php:679 msgid "Visit Upgrade Page" msgstr "" -#: includes/admin/core/class-admin-notices.php:667 +#: includes/admin/core/class-admin-notices.php:694 msgid "Settings successfully upgraded" msgstr "" #. translators: %1$s is a plugin name title; %2$s is a plugin version. -#: includes/admin/core/class-admin-notices.php:675 +#: includes/admin/core/class-admin-notices.php:702 msgid "%1$s %2$s Successfully Upgraded" msgstr "" #. translators: %s: plugin name. -#: includes/admin/core/class-admin-notices.php:706 +#: includes/admin/core/class-admin-notices.php:733 msgid "Hey there! It's been one month since you installed %s. How have you found the plugin so far?" msgstr "" -#: includes/admin/core/class-admin-notices.php:710 +#: includes/admin/core/class-admin-notices.php:737 msgid "I love it!" msgstr "" -#: includes/admin/core/class-admin-notices.php:711 +#: includes/admin/core/class-admin-notices.php:738 msgid "It's good but could be better" msgstr "" -#: includes/admin/core/class-admin-notices.php:712 +#: includes/admin/core/class-admin-notices.php:739 msgid "I don't like the plugin" msgstr "" -#: includes/admin/core/class-admin-notices.php:721 +#: includes/admin/core/class-admin-notices.php:748 msgid "Leave Review" msgstr "" -#: includes/admin/core/class-admin-notices.php:730 -#: includes/admin/core/class-admin-notices.php:739 +#: includes/admin/core/class-admin-notices.php:757 +#: includes/admin/core/class-admin-notices.php:766 msgid "Provide Feedback" msgstr "" #. translators: %1$s is a plugin name; %2$s is a #. -#: includes/admin/core/class-admin-notices.php:763 +#: includes/admin/core/class-admin-notices.php:790 msgid "%1$s future plans! Detailed future list is here" msgstr "" #. translators: %s child-theme article link. -#: includes/admin/core/class-admin-notices.php:790 +#: includes/admin/core/class-admin-notices.php:817 msgid "We recommend using a child-theme for Ultimate Member customization. Unlike official theme repositories, child themes don't have dependencies that could lead to your custom files being overwritten during a theme upgrade.
Without a child theme, your customization files may be deleted after every theme update." msgstr "" -#: includes/admin/core/class-admin-notices.php:813 +#: includes/admin/core/class-admin-notices.php:840 msgid "Your Register forms are now locked. You can unlock them in Ultimate Member > Settings > Advanced > Security > Lock All Register Forms." msgstr "" -#: includes/admin/core/class-admin-notices.php:832 +#: includes/admin/core/class-admin-notices.php:859 msgid "Mandatory password changes has been enabled. You can disable them in Ultimate Member > Settings > Advanced > Security > Display Login form notice to reset passwords." msgstr "" -#: includes/admin/core/class-admin-notices.php:851 +#: includes/admin/core/class-admin-notices.php:878 msgid "Ban for administrative capabilities is enabled. You can disable them in Ultimate Member > Settings > Advanced > Security > Enable ban for administrative capabilities." msgstr "" -#: includes/admin/core/class-admin-notices.php:884 +#: includes/admin/core/class-admin-notices.php:911 msgid "The role selected in WordPress native \"Settings > New User Default Role\" setting has Administrative capabilities." msgstr "" -#: includes/admin/core/class-admin-notices.php:910 +#: includes/admin/core/class-admin-notices.php:937 msgid "The role selected in \"Ultimate Member > Settings > Appearance > Registration Form > Registration Default Role\" setting has Administrative capabilities." msgstr "" #. translators: %s are link(s) to the forms. -#: includes/admin/core/class-admin-notices.php:978 +#: includes/admin/core/class-admin-notices.php:1005 msgid "Register forms have Administrative roles, we recommend that you assign a non-admin roles to secure the forms. %s" msgstr "" -#: includes/admin/core/class-admin-notices.php:997 +#: includes/admin/core/class-admin-notices.php:1024 msgid "Wrong Data" msgstr "" @@ -3915,7 +4031,7 @@ msgstr "" #: includes/admin/core/class-admin-settings.php:1078 #: includes/admin/core/class-admin-settings.php:1081 -#: includes/admin/templates/dashboard/users.php:15 +#: includes/admin/templates/dashboard/users.php:14 msgid "Users" msgstr "" @@ -4257,8 +4373,8 @@ msgstr "" #: includes/admin/core/class-admin-settings.php:1431 #: includes/admin/core/class-admin-settings.php:1629 -#: includes/core/um-actions-profile.php:767 -#: includes/core/um-actions-profile.php:781 +#: includes/core/um-actions-profile.php:787 +#: includes/core/um-actions-profile.php:807 msgid "Profile photo" msgstr "" @@ -4422,7 +4538,7 @@ msgid "Appearance" msgstr "" #: includes/admin/core/class-admin-settings.php:1595 -#: includes/core/class-form.php:992 +#: includes/core/class-form.php:1004 msgid "Profile" msgstr "" @@ -5045,87 +5161,6 @@ msgstr "" msgid "Upgrade Log" msgstr "" -#: includes/admin/core/class-admin-users.php:177 -msgid "This action is not allowed in backend." -msgstr "" - -#: includes/admin/core/class-admin-users.php:192 -#: includes/admin/core/class-admin-users.php:195 -msgid "UM Action" -msgstr "" - -#: includes/admin/core/class-admin-users.php:199 -#: includes/core/class-fields.php:3033 -msgid "Apply" -msgstr "" - -#: includes/admin/core/class-admin-users.php:241 -#: includes/core/um-filters-user.php:24 -#: includes/core/um-filters-user.php:29 -msgid "Approve Membership" -msgstr "" - -#: includes/admin/core/class-admin-users.php:244 -#: includes/core/um-filters-user.php:25 -msgid "Reject Membership" -msgstr "" - -#: includes/admin/core/class-admin-users.php:247 -#: includes/core/um-filters-user.php:33 -msgid "Put as Pending Review" -msgstr "" - -#: includes/admin/core/class-admin-users.php:250 -#: includes/core/um-filters-user.php:37 -msgid "Resend Activation Email" -msgstr "" - -#: includes/admin/core/class-admin-users.php:253 -msgid "Deactivate" -msgstr "" - -#: includes/admin/core/class-admin-users.php:256 -msgid "Reactivate" -msgstr "" - -#: includes/admin/core/class-admin-users.php:277 -#: templates/account.php:61 -#: templates/account.php:102 -msgid "View profile" -msgstr "" - -#: includes/admin/core/class-admin-users.php:282 -msgid "Info" -msgstr "" - -#: includes/admin/core/class-admin-users.php:408 -#: includes/admin/templates/dashboard/users.php:37 -#: includes/core/class-user.php:1300 -msgid "Approved" -msgstr "" - -#: includes/admin/core/class-admin-users.php:409 -msgid "Pending review" -msgstr "" - -#: includes/admin/core/class-admin-users.php:410 -msgid "Waiting email confirmation" -msgstr "" - -#: includes/admin/core/class-admin-users.php:411 -#: includes/admin/templates/dashboard/users.php:68 -msgid "Inactive" -msgstr "" - -#: includes/admin/core/class-admin-users.php:412 -#: includes/admin/templates/dashboard/users.php:59 -msgid "Rejected" -msgstr "" - -#: includes/admin/core/class-admin-users.php:488 -msgid "You do not have enough permissions to do that." -msgstr "" - #: includes/admin/core/list-tables/emails-list-table.php:70 #: includes/admin/core/list-tables/roles-list-table.php:221 #: includes/admin/core/list-tables/version-template-list-table.php:30 @@ -5700,16 +5735,30 @@ msgstr "" msgid "Get latest versions" msgstr "" -#: includes/admin/templates/dashboard/users.php:25 -#: includes/core/class-user.php:1308 +#: includes/admin/templates/dashboard/users.php:24 +#: includes/core/class-user.php:1307 msgid "Pending Review" msgstr "" -#: includes/admin/templates/dashboard/users.php:47 -#: includes/core/class-user.php:1304 +#: includes/admin/templates/dashboard/users.php:36 +#: includes/common/class-users.php:105 +#: includes/core/class-user.php:1299 +msgid "Approved" +msgstr "" + +#: includes/admin/templates/dashboard/users.php:46 +#: includes/core/class-user.php:1303 msgid "Awaiting Email Confirmation" msgstr "" +#: includes/admin/templates/dashboard/users.php:58 +msgid "Rejected" +msgstr "" + +#: includes/admin/templates/dashboard/users.php:68 +msgid "Inactive" +msgstr "" + #: includes/admin/templates/directory/general.php:47 msgid "View type(s)" msgstr "" @@ -6131,14 +6180,14 @@ msgstr "" #: includes/admin/templates/modal/forms/fonticons.php:26 #: includes/admin/templates/role/publish.php:33 #: includes/class-config.php:231 -#: includes/core/class-fields.php:3034 -#: includes/core/class-fields.php:3159 -#: includes/core/um-actions-profile.php:847 -#: includes/core/um-actions-profile.php:859 -#: includes/core/um-actions-profile.php:1047 -#: includes/core/um-actions-profile.php:1080 -#: includes/core/um-actions-profile.php:1472 -#: includes/core/um-actions-profile.php:1479 +#: includes/core/class-fields.php:3033 +#: includes/core/class-fields.php:3158 +#: includes/core/um-actions-profile.php:872 +#: includes/core/um-actions-profile.php:884 +#: includes/core/um-actions-profile.php:1072 +#: includes/core/um-actions-profile.php:1105 +#: includes/core/um-actions-profile.php:1497 +#: includes/core/um-actions-profile.php:1504 msgid "Cancel" msgstr "" @@ -6185,27 +6234,30 @@ msgstr "" msgid "Finish" msgstr "" -#: includes/admin/templates/role/admin-permissions.php:15 +#: includes/admin/templates/role/admin-permissions.php:18 msgid "The core admin role must always have access to wp-admin / WordPress backend" msgstr "" -#: includes/admin/templates/role/admin-permissions.php:22 +#: includes/admin/templates/role/admin-permissions.php:25 msgid "Mark this option if you need to hide the adminbar on frontend for this role" msgstr "" -#: includes/admin/templates/role/admin-permissions.php:29 +#: includes/admin/templates/role/admin-permissions.php:32 msgid "Allow this role to edit accounts of other members" msgstr "" -#: includes/admin/templates/role/admin-permissions.php:36 -#: includes/admin/templates/role/admin-permissions.php:53 -msgid "Which roles that role can edit, choose none to allow role to edit all member roles" +#: includes/admin/templates/role/admin-permissions.php:39 +msgid "Multiple selections of which roles this role can edit, none selected to allow this role to edit all member roles." msgstr "" -#: includes/admin/templates/role/admin-permissions.php:46 +#: includes/admin/templates/role/admin-permissions.php:49 msgid "Allow this role to delete other user accounts." msgstr "" +#: includes/admin/templates/role/admin-permissions.php:56 +msgid "Multiple selections of which roles this role can delete, none selected to allow this role to delete all member roles" +msgstr "" + #: includes/admin/templates/role/delete.php:16 msgid "Select what happens when a user with this role deletes their own account" msgstr "" @@ -6246,23 +6298,23 @@ msgstr "" msgid "Set a url to redirect this user role to after they logout from site" msgstr "" -#: includes/admin/templates/role/profile.php:15 +#: includes/admin/templates/role/profile.php:18 msgid "Can this role view all member profiles?" msgstr "" -#: includes/admin/templates/role/profile.php:22 -msgid "Which roles that role can view, choose none to allow role to view all member roles" +#: includes/admin/templates/role/profile.php:25 +msgid "Multiple selections of which roles this role can view, none selected to allow this role to view all member roles." msgstr "" -#: includes/admin/templates/role/profile.php:33 +#: includes/admin/templates/role/profile.php:36 msgid "Can this role make their profile private?" msgstr "" -#: includes/admin/templates/role/profile.php:41 +#: includes/admin/templates/role/profile.php:44 msgid "Can this role view private profiles?" msgstr "" -#: includes/admin/templates/role/profile.php:50 +#: includes/admin/templates/role/profile.php:53 msgid "Hides the profile page for robots. The default value depends on the General > Users setting." msgstr "" @@ -6709,7 +6761,7 @@ msgstr "" #: includes/class-config.php:249 #: includes/class-config.php:932 #: includes/class-config.php:993 -#: includes/core/class-form.php:989 +#: includes/core/class-form.php:1001 msgid "Login" msgstr "" @@ -6718,15 +6770,15 @@ msgstr "" #: includes/class-config.php:253 #: includes/class-config.php:935 #: includes/class-config.php:997 -#: includes/core/class-form.php:995 +#: includes/core/class-form.php:1007 msgid "Register" msgstr "" #: includes/class-config.php:134 #: includes/class-config.php:941 #: includes/class-config.php:1005 -#: includes/core/class-member-directory.php:2664 -#: includes/core/um-actions-profile.php:1478 +#: includes/core/class-member-directory.php:2645 +#: includes/core/um-actions-profile.php:1503 #: includes/core/um-actions-user.php:19 msgid "Logout" msgstr "" @@ -6986,8 +7038,8 @@ msgid "Cheatin’ huh?" msgstr "" #: includes/common/class-cpt.php:33 -#: includes/um-short-functions.php:691 -#: includes/um-short-functions.php:706 +#: includes/um-short-functions.php:690 +#: includes/um-short-functions.php:705 msgid "Form" msgstr "" @@ -7036,29 +7088,36 @@ msgstr "" msgid "Ultimate Member Scanner" msgstr "" -#: includes/common/class-theme.php:212 +#: includes/common/class-theme.php:214 msgid "Theme version up to date" msgstr "" -#: includes/common/class-theme.php:216 +#: includes/common/class-theme.php:218 msgid "Theme version is empty" msgstr "" -#: includes/common/class-theme.php:219 +#: includes/common/class-theme.php:221 msgid "Theme version is out of date" msgstr "" -#. translators: %s: Restricted post message. -#. translators: %s: The message after registration process based on a role data and user status after registration -#. translators: %s: Restricted blog page message. -#. translators: %s: Restricted taxonomy message. -#: includes/core/class-access.php:774 -#: includes/core/class-fields.php:1561 -#: includes/core/um-actions-account.php:517 -#: templates/message.php:23 -#: templates/restricted-blog.php:41 -#: templates/restricted-taxonomy.php:59 -msgid "%s" +#: includes/common/class-users.php:106 +msgid "Pending administrator review" +msgstr "" + +#: includes/common/class-users.php:107 +msgid "Waiting email confirmation" +msgstr "" + +#: includes/common/class-users.php:108 +msgid "Membership inactive" +msgstr "" + +#: includes/common/class-users.php:109 +msgid "Membership rejected" +msgstr "" + +#: includes/common/class-users.php:198 +msgid "Undefined" msgstr "" #: includes/core/class-account.php:90 @@ -7083,8 +7142,8 @@ msgstr "" #: includes/core/class-account.php:118 #: includes/core/class-account.php:119 -#: includes/core/class-builtin.php:1363 -#: includes/core/class-builtin.php:1366 +#: includes/core/class-builtin.php:1367 +#: includes/core/class-builtin.php:1370 msgid "Delete Account" msgstr "" @@ -7194,7 +7253,7 @@ msgid "You must add a shortcode to the content area" msgstr "" #: includes/core/class-builtin.php:654 -#: includes/core/class-builtin.php:1596 +#: includes/core/class-builtin.php:1600 msgid "Spotify URL" msgstr "" @@ -7203,13 +7262,13 @@ msgid "oEmbed" msgstr "" #: includes/core/class-builtin.php:761 -#: includes/core/class-user.php:2084 +#: includes/core/class-user.php:1819 msgid "Only me" msgstr "" #: includes/core/class-builtin.php:785 #: includes/core/class-builtin.php:788 -#: includes/core/class-builtin.php:1280 +#: includes/core/class-builtin.php:1284 msgid "Username or Email" msgstr "" @@ -7219,7 +7278,7 @@ msgstr "" #: includes/core/class-builtin.php:841 #: includes/core/class-builtin.php:844 -#: includes/core/class-builtin.php:1593 +#: includes/core/class-builtin.php:1597 msgid "Website URL" msgstr "" @@ -7272,1921 +7331,1921 @@ msgstr "" msgid "Join chat" msgstr "" -#: includes/core/class-builtin.php:1084 -#: includes/core/class-builtin.php:1598 +#: includes/core/class-builtin.php:1086 +#: includes/core/class-builtin.php:1602 msgid "Discord ID" msgstr "" -#: includes/core/class-builtin.php:1097 -#: includes/core/class-builtin.php:1100 +#: includes/core/class-builtin.php:1101 +#: includes/core/class-builtin.php:1104 msgid "TikTok" msgstr "" -#: includes/core/class-builtin.php:1115 -#: includes/core/class-builtin.php:1118 +#: includes/core/class-builtin.php:1119 +#: includes/core/class-builtin.php:1122 msgid "Twitch" msgstr "" -#: includes/core/class-builtin.php:1133 -#: includes/core/class-builtin.php:1136 +#: includes/core/class-builtin.php:1137 +#: includes/core/class-builtin.php:1140 msgid "Reddit" msgstr "" -#: includes/core/class-builtin.php:1151 -#: includes/core/class-builtin.php:1154 -#: includes/core/class-builtin.php:1162 +#: includes/core/class-builtin.php:1155 +#: includes/core/class-builtin.php:1158 +#: includes/core/class-builtin.php:1166 msgid "YouTube" msgstr "" -#: includes/core/class-builtin.php:1193 -#: includes/core/class-builtin.php:1205 +#: includes/core/class-builtin.php:1197 +#: includes/core/class-builtin.php:1209 msgid "Account Type" msgstr "" -#: includes/core/class-builtin.php:1194 +#: includes/core/class-builtin.php:1198 msgid "Choose account type" msgstr "" -#: includes/core/class-builtin.php:1216 +#: includes/core/class-builtin.php:1220 msgid "Languages Spoken" msgstr "" -#: includes/core/class-builtin.php:1217 +#: includes/core/class-builtin.php:1221 msgid "Select languages" msgstr "" -#: includes/core/class-builtin.php:1251 +#: includes/core/class-builtin.php:1255 msgid "Profile Photo" msgstr "" -#: includes/core/class-builtin.php:1254 +#: includes/core/class-builtin.php:1258 msgid "Change your profile photo" msgstr "" -#: includes/core/class-builtin.php:1255 +#: includes/core/class-builtin.php:1259 msgid "Upload your photo here" msgstr "" -#: includes/core/class-builtin.php:1265 +#: includes/core/class-builtin.php:1269 msgid "Cover Photo" msgstr "" -#: includes/core/class-builtin.php:1268 -#: includes/core/um-actions-profile.php:807 +#: includes/core/class-builtin.php:1272 +#: includes/core/um-actions-profile.php:832 msgid "Change your cover photo" msgstr "" -#: includes/core/class-builtin.php:1269 +#: includes/core/class-builtin.php:1273 msgid "Upload profile cover here" msgstr "" -#: includes/core/class-builtin.php:1283 +#: includes/core/class-builtin.php:1287 msgid "Enter your username or email" msgstr "" -#: includes/core/class-builtin.php:1293 -#: includes/core/class-builtin.php:1296 +#: includes/core/class-builtin.php:1297 +#: includes/core/class-builtin.php:1300 msgid "Profile Privacy" msgstr "" -#: includes/core/class-builtin.php:1297 +#: includes/core/class-builtin.php:1301 msgid "Who can see your public profile?" msgstr "" -#: includes/core/class-builtin.php:1309 -#: includes/core/class-builtin.php:1312 +#: includes/core/class-builtin.php:1313 +#: includes/core/class-builtin.php:1316 msgid "Avoid indexing my profile by search engines" msgstr "" -#: includes/core/class-builtin.php:1313 +#: includes/core/class-builtin.php:1317 msgid "Hide my profile for robots?" msgstr "" -#: includes/core/class-builtin.php:1328 -#: includes/core/class-builtin.php:1331 +#: includes/core/class-builtin.php:1332 +#: includes/core/class-builtin.php:1335 msgid "Hide my profile from directory" msgstr "" -#: includes/core/class-builtin.php:1332 +#: includes/core/class-builtin.php:1336 msgid "Here you can hide yourself from appearing in public directory" msgstr "" -#: includes/core/class-builtin.php:1346 -#: includes/core/class-builtin.php:1349 +#: includes/core/class-builtin.php:1350 +#: includes/core/class-builtin.php:1353 msgid "Show my last login?" msgstr "" -#: includes/core/class-builtin.php:1350 +#: includes/core/class-builtin.php:1354 msgid "Here you can hide last login field on profile page and card in member directory" msgstr "" -#: includes/core/class-builtin.php:1367 +#: includes/core/class-builtin.php:1371 msgid "If you confirm, everything related to your profile will be deleted permanently from the site" msgstr "" -#: includes/core/class-builtin.php:1576 +#: includes/core/class-builtin.php:1580 msgid "Alphabetic value only" msgstr "" -#: includes/core/class-builtin.php:1577 +#: includes/core/class-builtin.php:1581 msgid "Alpha-numeric value" msgstr "" -#: includes/core/class-builtin.php:1578 +#: includes/core/class-builtin.php:1582 msgid "English letters only" msgstr "" -#: includes/core/class-builtin.php:1579 +#: includes/core/class-builtin.php:1583 msgid "Facebook URL" msgstr "" -#: includes/core/class-builtin.php:1580 +#: includes/core/class-builtin.php:1584 msgid "Instagram URL" msgstr "" -#: includes/core/class-builtin.php:1581 +#: includes/core/class-builtin.php:1585 msgid "LinkedIn URL" msgstr "" -#: includes/core/class-builtin.php:1582 +#: includes/core/class-builtin.php:1586 msgid "Lowercase only" msgstr "" -#: includes/core/class-builtin.php:1583 +#: includes/core/class-builtin.php:1587 msgid "Numeric value only" msgstr "" -#: includes/core/class-builtin.php:1586 +#: includes/core/class-builtin.php:1590 msgid "SoundCloud Profile" msgstr "" -#: includes/core/class-builtin.php:1587 +#: includes/core/class-builtin.php:1591 msgid "X (formerly Twitter) URL" msgstr "" -#: includes/core/class-builtin.php:1588 +#: includes/core/class-builtin.php:1592 msgid "Email( Not Unique )" msgstr "" -#: includes/core/class-builtin.php:1589 +#: includes/core/class-builtin.php:1593 msgid "Unique Email" msgstr "" -#: includes/core/class-builtin.php:1590 +#: includes/core/class-builtin.php:1594 msgid "Unique Metakey value" msgstr "" -#: includes/core/class-builtin.php:1591 +#: includes/core/class-builtin.php:1595 msgid "Unique Username" msgstr "" -#: includes/core/class-builtin.php:1592 +#: includes/core/class-builtin.php:1596 msgid "Unique Username/Email" msgstr "" -#: includes/core/class-builtin.php:1594 +#: includes/core/class-builtin.php:1598 msgid "YouTube Profile" msgstr "" -#: includes/core/class-builtin.php:1595 +#: includes/core/class-builtin.php:1599 msgid "YouTube Video" msgstr "" -#: includes/core/class-builtin.php:1597 +#: includes/core/class-builtin.php:1601 msgid "Telegram URL" msgstr "" -#: includes/core/class-builtin.php:1599 +#: includes/core/class-builtin.php:1603 msgid "TikTok URL" msgstr "" -#: includes/core/class-builtin.php:1600 +#: includes/core/class-builtin.php:1604 msgid "Twitch URL" msgstr "" -#: includes/core/class-builtin.php:1601 +#: includes/core/class-builtin.php:1605 msgid "Reddit URL" msgstr "" -#: includes/core/class-builtin.php:1602 +#: includes/core/class-builtin.php:1606 msgid "Custom Validation" msgstr "" -#: includes/core/class-builtin.php:1641 +#: includes/core/class-builtin.php:1645 msgid "Afar" msgstr "" -#: includes/core/class-builtin.php:1642 +#: includes/core/class-builtin.php:1646 msgid "Abkhazian" msgstr "" -#: includes/core/class-builtin.php:1643 +#: includes/core/class-builtin.php:1647 msgid "Avestan" msgstr "" -#: includes/core/class-builtin.php:1644 +#: includes/core/class-builtin.php:1648 msgid "Afrikaans" msgstr "" -#: includes/core/class-builtin.php:1645 +#: includes/core/class-builtin.php:1649 msgid "Akan" msgstr "" -#: includes/core/class-builtin.php:1646 +#: includes/core/class-builtin.php:1650 msgid "Amharic" msgstr "" -#: includes/core/class-builtin.php:1647 +#: includes/core/class-builtin.php:1651 msgid "Aragonese" msgstr "" -#: includes/core/class-builtin.php:1648 +#: includes/core/class-builtin.php:1652 msgid "Arabic" msgstr "" -#: includes/core/class-builtin.php:1649 +#: includes/core/class-builtin.php:1653 msgid "Assamese" msgstr "" -#: includes/core/class-builtin.php:1650 +#: includes/core/class-builtin.php:1654 msgid "Avaric" msgstr "" -#: includes/core/class-builtin.php:1651 +#: includes/core/class-builtin.php:1655 msgid "Aymara" msgstr "" -#: includes/core/class-builtin.php:1652 +#: includes/core/class-builtin.php:1656 msgid "Azerbaijani" msgstr "" -#: includes/core/class-builtin.php:1653 +#: includes/core/class-builtin.php:1657 msgid "Bashkir" msgstr "" -#: includes/core/class-builtin.php:1654 +#: includes/core/class-builtin.php:1658 msgid "Belarusian" msgstr "" -#: includes/core/class-builtin.php:1655 +#: includes/core/class-builtin.php:1659 msgid "Bulgarian" msgstr "" -#: includes/core/class-builtin.php:1656 +#: includes/core/class-builtin.php:1660 msgid "Bihari" msgstr "" -#: includes/core/class-builtin.php:1657 +#: includes/core/class-builtin.php:1661 msgid "Bislama" msgstr "" -#: includes/core/class-builtin.php:1658 +#: includes/core/class-builtin.php:1662 msgid "Bambara" msgstr "" -#: includes/core/class-builtin.php:1659 +#: includes/core/class-builtin.php:1663 msgid "Bengali" msgstr "" -#: includes/core/class-builtin.php:1660 +#: includes/core/class-builtin.php:1664 msgid "Tibetan" msgstr "" -#: includes/core/class-builtin.php:1661 +#: includes/core/class-builtin.php:1665 msgid "Breton" msgstr "" -#: includes/core/class-builtin.php:1662 +#: includes/core/class-builtin.php:1666 msgid "Bosnian" msgstr "" -#: includes/core/class-builtin.php:1663 +#: includes/core/class-builtin.php:1667 msgid "Catalan" msgstr "" -#: includes/core/class-builtin.php:1664 +#: includes/core/class-builtin.php:1668 msgid "Chechen" msgstr "" -#: includes/core/class-builtin.php:1665 +#: includes/core/class-builtin.php:1669 msgid "Chamorro" msgstr "" -#: includes/core/class-builtin.php:1666 +#: includes/core/class-builtin.php:1670 msgid "Corsican" msgstr "" -#: includes/core/class-builtin.php:1667 +#: includes/core/class-builtin.php:1671 msgid "Cree" msgstr "" -#: includes/core/class-builtin.php:1668 +#: includes/core/class-builtin.php:1672 msgid "Czech" msgstr "" -#: includes/core/class-builtin.php:1669 +#: includes/core/class-builtin.php:1673 msgid "Church Slavic" msgstr "" -#: includes/core/class-builtin.php:1670 +#: includes/core/class-builtin.php:1674 msgid "Chuvash" msgstr "" -#: includes/core/class-builtin.php:1671 +#: includes/core/class-builtin.php:1675 msgid "Welsh" msgstr "" -#: includes/core/class-builtin.php:1672 +#: includes/core/class-builtin.php:1676 msgid "Danish" msgstr "" -#: includes/core/class-builtin.php:1673 +#: includes/core/class-builtin.php:1677 msgid "German" msgstr "" -#: includes/core/class-builtin.php:1674 +#: includes/core/class-builtin.php:1678 msgid "Divehi" msgstr "" -#: includes/core/class-builtin.php:1675 +#: includes/core/class-builtin.php:1679 msgid "Dzongkha" msgstr "" -#: includes/core/class-builtin.php:1676 +#: includes/core/class-builtin.php:1680 msgid "Ewe" msgstr "" -#: includes/core/class-builtin.php:1677 +#: includes/core/class-builtin.php:1681 msgid "Greek" msgstr "" -#: includes/core/class-builtin.php:1678 +#: includes/core/class-builtin.php:1682 msgid "English" msgstr "" -#: includes/core/class-builtin.php:1679 +#: includes/core/class-builtin.php:1683 msgid "Esperanto" msgstr "" -#: includes/core/class-builtin.php:1680 +#: includes/core/class-builtin.php:1684 msgid "Spanish" msgstr "" -#: includes/core/class-builtin.php:1681 +#: includes/core/class-builtin.php:1685 msgid "Estonian" msgstr "" -#: includes/core/class-builtin.php:1682 +#: includes/core/class-builtin.php:1686 msgid "Basque" msgstr "" -#: includes/core/class-builtin.php:1683 +#: includes/core/class-builtin.php:1687 msgid "Persian" msgstr "" -#: includes/core/class-builtin.php:1684 +#: includes/core/class-builtin.php:1688 msgid "Fulah" msgstr "" -#: includes/core/class-builtin.php:1685 +#: includes/core/class-builtin.php:1689 msgid "Finnish" msgstr "" -#: includes/core/class-builtin.php:1686 +#: includes/core/class-builtin.php:1690 msgid "Fijian" msgstr "" -#: includes/core/class-builtin.php:1687 +#: includes/core/class-builtin.php:1691 msgid "Faroese" msgstr "" -#: includes/core/class-builtin.php:1688 +#: includes/core/class-builtin.php:1692 msgid "French" msgstr "" -#: includes/core/class-builtin.php:1689 +#: includes/core/class-builtin.php:1693 msgid "Western Frisian" msgstr "" -#: includes/core/class-builtin.php:1690 +#: includes/core/class-builtin.php:1694 msgid "Irish" msgstr "" -#: includes/core/class-builtin.php:1691 +#: includes/core/class-builtin.php:1695 msgid "Scottish Gaelic" msgstr "" -#: includes/core/class-builtin.php:1692 +#: includes/core/class-builtin.php:1696 msgid "Galician" msgstr "" -#: includes/core/class-builtin.php:1693 +#: includes/core/class-builtin.php:1697 msgid "Guarani" msgstr "" -#: includes/core/class-builtin.php:1694 +#: includes/core/class-builtin.php:1698 msgid "Gujarati" msgstr "" -#: includes/core/class-builtin.php:1695 +#: includes/core/class-builtin.php:1699 msgid "Manx" msgstr "" -#: includes/core/class-builtin.php:1696 +#: includes/core/class-builtin.php:1700 msgid "Hausa" msgstr "" -#: includes/core/class-builtin.php:1697 +#: includes/core/class-builtin.php:1701 msgid "Hebrew" msgstr "" -#: includes/core/class-builtin.php:1698 +#: includes/core/class-builtin.php:1702 msgid "Hindi" msgstr "" -#: includes/core/class-builtin.php:1699 +#: includes/core/class-builtin.php:1703 msgid "Hiri Motu" msgstr "" -#: includes/core/class-builtin.php:1700 +#: includes/core/class-builtin.php:1704 msgid "Croatian" msgstr "" -#: includes/core/class-builtin.php:1701 +#: includes/core/class-builtin.php:1705 msgid "Haitian" msgstr "" -#: includes/core/class-builtin.php:1702 +#: includes/core/class-builtin.php:1706 msgid "Hungarian" msgstr "" -#: includes/core/class-builtin.php:1703 +#: includes/core/class-builtin.php:1707 msgid "Armenian" msgstr "" -#: includes/core/class-builtin.php:1704 +#: includes/core/class-builtin.php:1708 msgid "Herero" msgstr "" -#: includes/core/class-builtin.php:1705 +#: includes/core/class-builtin.php:1709 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" -#: includes/core/class-builtin.php:1706 +#: includes/core/class-builtin.php:1710 msgid "Indonesian" msgstr "" -#: includes/core/class-builtin.php:1707 +#: includes/core/class-builtin.php:1711 msgid "Interlingue" msgstr "" -#: includes/core/class-builtin.php:1708 +#: includes/core/class-builtin.php:1712 msgid "Igbo" msgstr "" -#: includes/core/class-builtin.php:1709 +#: includes/core/class-builtin.php:1713 msgid "Sichuan Yi" msgstr "" -#: includes/core/class-builtin.php:1710 +#: includes/core/class-builtin.php:1714 msgid "Inupiaq" msgstr "" -#: includes/core/class-builtin.php:1711 +#: includes/core/class-builtin.php:1715 msgid "Ido" msgstr "" -#: includes/core/class-builtin.php:1712 +#: includes/core/class-builtin.php:1716 msgid "Icelandic" msgstr "" -#: includes/core/class-builtin.php:1713 +#: includes/core/class-builtin.php:1717 msgid "Italian" msgstr "" -#: includes/core/class-builtin.php:1714 +#: includes/core/class-builtin.php:1718 msgid "Inuktitut" msgstr "" -#: includes/core/class-builtin.php:1715 +#: includes/core/class-builtin.php:1719 msgid "Japanese" msgstr "" -#: includes/core/class-builtin.php:1716 +#: includes/core/class-builtin.php:1720 msgid "Javanese" msgstr "" -#: includes/core/class-builtin.php:1717 +#: includes/core/class-builtin.php:1721 msgid "Kartuli" msgstr "" -#: includes/core/class-builtin.php:1718 +#: includes/core/class-builtin.php:1722 msgid "Kongo" msgstr "" -#: includes/core/class-builtin.php:1719 +#: includes/core/class-builtin.php:1723 msgid "Kikuyu" msgstr "" -#: includes/core/class-builtin.php:1720 +#: includes/core/class-builtin.php:1724 msgid "Kwanyama" msgstr "" -#: includes/core/class-builtin.php:1721 +#: includes/core/class-builtin.php:1725 msgid "Kazakh" msgstr "" -#: includes/core/class-builtin.php:1722 +#: includes/core/class-builtin.php:1726 msgid "Kalaallisut" msgstr "" -#: includes/core/class-builtin.php:1723 +#: includes/core/class-builtin.php:1727 msgid "Khmer" msgstr "" -#: includes/core/class-builtin.php:1724 +#: includes/core/class-builtin.php:1728 msgid "Kannada" msgstr "" -#: includes/core/class-builtin.php:1725 +#: includes/core/class-builtin.php:1729 msgid "Korean" msgstr "" -#: includes/core/class-builtin.php:1726 +#: includes/core/class-builtin.php:1730 msgid "Kanuri" msgstr "" -#: includes/core/class-builtin.php:1727 +#: includes/core/class-builtin.php:1731 msgid "Kashmiri" msgstr "" -#: includes/core/class-builtin.php:1728 +#: includes/core/class-builtin.php:1732 msgid "Kurdish" msgstr "" -#: includes/core/class-builtin.php:1729 +#: includes/core/class-builtin.php:1733 msgid "Komi" msgstr "" -#: includes/core/class-builtin.php:1730 +#: includes/core/class-builtin.php:1734 msgid "Cornish" msgstr "" -#: includes/core/class-builtin.php:1731 +#: includes/core/class-builtin.php:1735 msgid "Kirghiz" msgstr "" -#: includes/core/class-builtin.php:1732 +#: includes/core/class-builtin.php:1736 msgid "Latin" msgstr "" -#: includes/core/class-builtin.php:1733 +#: includes/core/class-builtin.php:1737 msgid "Luxembourgish" msgstr "" -#: includes/core/class-builtin.php:1734 +#: includes/core/class-builtin.php:1738 msgid "Ganda" msgstr "" -#: includes/core/class-builtin.php:1735 +#: includes/core/class-builtin.php:1739 msgid "Limburgish" msgstr "" -#: includes/core/class-builtin.php:1736 +#: includes/core/class-builtin.php:1740 msgid "Lingala" msgstr "" -#: includes/core/class-builtin.php:1737 +#: includes/core/class-builtin.php:1741 msgid "Lao" msgstr "" -#: includes/core/class-builtin.php:1738 +#: includes/core/class-builtin.php:1742 msgid "Lithuanian" msgstr "" -#: includes/core/class-builtin.php:1739 +#: includes/core/class-builtin.php:1743 msgid "Luba-Katanga" msgstr "" -#: includes/core/class-builtin.php:1740 +#: includes/core/class-builtin.php:1744 msgid "Latvian" msgstr "" -#: includes/core/class-builtin.php:1741 +#: includes/core/class-builtin.php:1745 msgid "Malagasy" msgstr "" -#: includes/core/class-builtin.php:1742 +#: includes/core/class-builtin.php:1746 msgid "Marshallese" msgstr "" -#: includes/core/class-builtin.php:1743 +#: includes/core/class-builtin.php:1747 msgid "Maori" msgstr "" -#: includes/core/class-builtin.php:1744 +#: includes/core/class-builtin.php:1748 msgid "Macedonian" msgstr "" -#: includes/core/class-builtin.php:1745 +#: includes/core/class-builtin.php:1749 msgid "Malayalam" msgstr "" -#: includes/core/class-builtin.php:1746 +#: includes/core/class-builtin.php:1750 msgid "Mongolian" msgstr "" -#: includes/core/class-builtin.php:1747 +#: includes/core/class-builtin.php:1751 msgid "Marathi" msgstr "" -#: includes/core/class-builtin.php:1748 +#: includes/core/class-builtin.php:1752 msgid "Malay" msgstr "" -#: includes/core/class-builtin.php:1749 +#: includes/core/class-builtin.php:1753 msgid "Maltese" msgstr "" -#: includes/core/class-builtin.php:1750 +#: includes/core/class-builtin.php:1754 msgid "Burmese" msgstr "" -#: includes/core/class-builtin.php:1751 -#: includes/core/class-builtin.php:1982 +#: includes/core/class-builtin.php:1755 +#: includes/core/class-builtin.php:1986 msgid "Nauru" msgstr "" -#: includes/core/class-builtin.php:1752 +#: includes/core/class-builtin.php:1756 msgid "Norwegian Bokmal" msgstr "" -#: includes/core/class-builtin.php:1753 +#: includes/core/class-builtin.php:1757 msgid "North Ndebele" msgstr "" -#: includes/core/class-builtin.php:1754 +#: includes/core/class-builtin.php:1758 msgid "Nepali" msgstr "" -#: includes/core/class-builtin.php:1755 +#: includes/core/class-builtin.php:1759 msgid "Ndonga" msgstr "" -#: includes/core/class-builtin.php:1756 +#: includes/core/class-builtin.php:1760 msgid "Dutch" msgstr "" -#: includes/core/class-builtin.php:1757 +#: includes/core/class-builtin.php:1761 msgid "Norwegian Nynorsk" msgstr "" -#: includes/core/class-builtin.php:1758 +#: includes/core/class-builtin.php:1762 msgid "Norwegian" msgstr "" -#: includes/core/class-builtin.php:1759 +#: includes/core/class-builtin.php:1763 msgid "South Ndebele" msgstr "" -#: includes/core/class-builtin.php:1760 +#: includes/core/class-builtin.php:1764 msgid "Navajo" msgstr "" -#: includes/core/class-builtin.php:1761 +#: includes/core/class-builtin.php:1765 msgid "Chichewa" msgstr "" -#: includes/core/class-builtin.php:1762 +#: includes/core/class-builtin.php:1766 msgid "Occitan" msgstr "" -#: includes/core/class-builtin.php:1763 +#: includes/core/class-builtin.php:1767 msgid "Ojibwa" msgstr "" -#: includes/core/class-builtin.php:1764 +#: includes/core/class-builtin.php:1768 msgid "Oromo" msgstr "" -#: includes/core/class-builtin.php:1765 +#: includes/core/class-builtin.php:1769 msgid "Oriya" msgstr "" -#: includes/core/class-builtin.php:1766 +#: includes/core/class-builtin.php:1770 msgid "Ossetian" msgstr "" -#: includes/core/class-builtin.php:1767 +#: includes/core/class-builtin.php:1771 msgid "Panjabi" msgstr "" -#: includes/core/class-builtin.php:1768 +#: includes/core/class-builtin.php:1772 msgid "Pali" msgstr "" -#: includes/core/class-builtin.php:1769 +#: includes/core/class-builtin.php:1773 msgid "Polish" msgstr "" -#: includes/core/class-builtin.php:1770 +#: includes/core/class-builtin.php:1774 msgid "Pashto" msgstr "" -#: includes/core/class-builtin.php:1771 +#: includes/core/class-builtin.php:1775 msgid "Portuguese" msgstr "" -#: includes/core/class-builtin.php:1772 +#: includes/core/class-builtin.php:1776 msgid "Quechua" msgstr "" -#: includes/core/class-builtin.php:1773 +#: includes/core/class-builtin.php:1777 msgid "Raeto-Romance" msgstr "" -#: includes/core/class-builtin.php:1774 +#: includes/core/class-builtin.php:1778 msgid "Kirundi" msgstr "" -#: includes/core/class-builtin.php:1775 +#: includes/core/class-builtin.php:1779 msgid "Romanian" msgstr "" -#: includes/core/class-builtin.php:1776 +#: includes/core/class-builtin.php:1780 msgid "Russian" msgstr "" -#: includes/core/class-builtin.php:1777 +#: includes/core/class-builtin.php:1781 msgid "Kinyarwanda" msgstr "" -#: includes/core/class-builtin.php:1778 +#: includes/core/class-builtin.php:1782 msgid "Sanskrit" msgstr "" -#: includes/core/class-builtin.php:1779 +#: includes/core/class-builtin.php:1783 msgid "Sardinian" msgstr "" -#: includes/core/class-builtin.php:1780 +#: includes/core/class-builtin.php:1784 msgid "Sindhi" msgstr "" -#: includes/core/class-builtin.php:1781 +#: includes/core/class-builtin.php:1785 msgid "Northern Sami" msgstr "" -#: includes/core/class-builtin.php:1782 +#: includes/core/class-builtin.php:1786 msgid "Sango" msgstr "" -#: includes/core/class-builtin.php:1783 +#: includes/core/class-builtin.php:1787 msgid "Sinhala" msgstr "" -#: includes/core/class-builtin.php:1784 +#: includes/core/class-builtin.php:1788 msgid "Slovak" msgstr "" -#: includes/core/class-builtin.php:1785 +#: includes/core/class-builtin.php:1789 msgid "Slovenian" msgstr "" -#: includes/core/class-builtin.php:1786 +#: includes/core/class-builtin.php:1790 msgid "Samoan" msgstr "" -#: includes/core/class-builtin.php:1787 +#: includes/core/class-builtin.php:1791 msgid "Shona" msgstr "" -#: includes/core/class-builtin.php:1788 +#: includes/core/class-builtin.php:1792 msgid "Somali" msgstr "" -#: includes/core/class-builtin.php:1789 +#: includes/core/class-builtin.php:1793 msgid "Albanian" msgstr "" -#: includes/core/class-builtin.php:1790 +#: includes/core/class-builtin.php:1794 msgid "Serbian" msgstr "" -#: includes/core/class-builtin.php:1791 +#: includes/core/class-builtin.php:1795 msgid "Swati" msgstr "" -#: includes/core/class-builtin.php:1792 +#: includes/core/class-builtin.php:1796 msgid "Southern Sotho" msgstr "" -#: includes/core/class-builtin.php:1793 +#: includes/core/class-builtin.php:1797 msgid "Sundanese" msgstr "" -#: includes/core/class-builtin.php:1794 +#: includes/core/class-builtin.php:1798 msgid "Swedish" msgstr "" -#: includes/core/class-builtin.php:1795 +#: includes/core/class-builtin.php:1799 msgid "Swahili" msgstr "" -#: includes/core/class-builtin.php:1796 +#: includes/core/class-builtin.php:1800 msgid "Tamil" msgstr "" -#: includes/core/class-builtin.php:1797 +#: includes/core/class-builtin.php:1801 msgid "Telugu" msgstr "" -#: includes/core/class-builtin.php:1798 +#: includes/core/class-builtin.php:1802 msgid "Tajik" msgstr "" -#: includes/core/class-builtin.php:1799 +#: includes/core/class-builtin.php:1803 msgid "Thai" msgstr "" -#: includes/core/class-builtin.php:1800 +#: includes/core/class-builtin.php:1804 msgid "Tigrinya" msgstr "" -#: includes/core/class-builtin.php:1801 +#: includes/core/class-builtin.php:1805 msgid "Turkmen" msgstr "" -#: includes/core/class-builtin.php:1802 +#: includes/core/class-builtin.php:1806 msgid "Tagalog" msgstr "" -#: includes/core/class-builtin.php:1803 +#: includes/core/class-builtin.php:1807 msgid "Tswana" msgstr "" -#: includes/core/class-builtin.php:1804 -#: includes/core/class-builtin.php:2052 +#: includes/core/class-builtin.php:1808 +#: includes/core/class-builtin.php:2056 msgid "Tonga" msgstr "" -#: includes/core/class-builtin.php:1805 +#: includes/core/class-builtin.php:1809 msgid "Turkish" msgstr "" -#: includes/core/class-builtin.php:1806 +#: includes/core/class-builtin.php:1810 msgid "Tsonga" msgstr "" -#: includes/core/class-builtin.php:1807 +#: includes/core/class-builtin.php:1811 msgid "Tatar" msgstr "" -#: includes/core/class-builtin.php:1808 +#: includes/core/class-builtin.php:1812 msgid "Twi" msgstr "" -#: includes/core/class-builtin.php:1809 +#: includes/core/class-builtin.php:1813 msgid "Tahitian" msgstr "" -#: includes/core/class-builtin.php:1810 +#: includes/core/class-builtin.php:1814 msgid "Uighur" msgstr "" -#: includes/core/class-builtin.php:1811 +#: includes/core/class-builtin.php:1815 msgid "Ukrainian" msgstr "" -#: includes/core/class-builtin.php:1812 +#: includes/core/class-builtin.php:1816 msgid "Urdu" msgstr "" -#: includes/core/class-builtin.php:1813 +#: includes/core/class-builtin.php:1817 msgid "Uzbek" msgstr "" -#: includes/core/class-builtin.php:1814 +#: includes/core/class-builtin.php:1818 msgid "Venda" msgstr "" -#: includes/core/class-builtin.php:1815 +#: includes/core/class-builtin.php:1819 msgid "Vietnamese" msgstr "" -#: includes/core/class-builtin.php:1816 +#: includes/core/class-builtin.php:1820 msgid "Volapuk" msgstr "" -#: includes/core/class-builtin.php:1817 +#: includes/core/class-builtin.php:1821 msgid "Walloon" msgstr "" -#: includes/core/class-builtin.php:1818 +#: includes/core/class-builtin.php:1822 msgid "Wolof" msgstr "" -#: includes/core/class-builtin.php:1819 +#: includes/core/class-builtin.php:1823 msgid "Xhosa" msgstr "" -#: includes/core/class-builtin.php:1820 +#: includes/core/class-builtin.php:1824 msgid "Yiddish" msgstr "" -#: includes/core/class-builtin.php:1821 +#: includes/core/class-builtin.php:1825 msgid "Yoruba" msgstr "" -#: includes/core/class-builtin.php:1822 +#: includes/core/class-builtin.php:1826 msgid "Zhuang" msgstr "" -#: includes/core/class-builtin.php:1823 +#: includes/core/class-builtin.php:1827 msgid "Chinese" msgstr "" -#: includes/core/class-builtin.php:1824 +#: includes/core/class-builtin.php:1828 msgid "Zulu" msgstr "" -#: includes/core/class-builtin.php:1830 +#: includes/core/class-builtin.php:1834 msgid "Afghanistan" msgstr "" -#: includes/core/class-builtin.php:1831 +#: includes/core/class-builtin.php:1835 msgid "Åland Islands" msgstr "" -#: includes/core/class-builtin.php:1832 +#: includes/core/class-builtin.php:1836 msgid "Albania" msgstr "" -#: includes/core/class-builtin.php:1833 +#: includes/core/class-builtin.php:1837 msgid "Algeria" msgstr "" -#: includes/core/class-builtin.php:1834 +#: includes/core/class-builtin.php:1838 msgid "American Samoa" msgstr "" -#: includes/core/class-builtin.php:1835 +#: includes/core/class-builtin.php:1839 msgid "Andorra" msgstr "" -#: includes/core/class-builtin.php:1836 +#: includes/core/class-builtin.php:1840 msgid "Angola" msgstr "" -#: includes/core/class-builtin.php:1837 +#: includes/core/class-builtin.php:1841 msgid "Anguilla" msgstr "" -#: includes/core/class-builtin.php:1838 +#: includes/core/class-builtin.php:1842 msgid "Antarctica" msgstr "" -#: includes/core/class-builtin.php:1839 +#: includes/core/class-builtin.php:1843 msgid "Antigua and Barbuda" msgstr "" -#: includes/core/class-builtin.php:1840 +#: includes/core/class-builtin.php:1844 msgid "Argentina" msgstr "" -#: includes/core/class-builtin.php:1841 +#: includes/core/class-builtin.php:1845 msgid "Armenia" msgstr "" -#: includes/core/class-builtin.php:1842 +#: includes/core/class-builtin.php:1846 msgid "Aruba" msgstr "" -#: includes/core/class-builtin.php:1843 +#: includes/core/class-builtin.php:1847 msgid "Australia" msgstr "" -#: includes/core/class-builtin.php:1844 +#: includes/core/class-builtin.php:1848 msgid "Austria" msgstr "" -#: includes/core/class-builtin.php:1845 +#: includes/core/class-builtin.php:1849 msgid "Azerbaijan" msgstr "" -#: includes/core/class-builtin.php:1846 +#: includes/core/class-builtin.php:1850 msgid "Bahamas" msgstr "" -#: includes/core/class-builtin.php:1847 +#: includes/core/class-builtin.php:1851 msgid "Bahrain" msgstr "" -#: includes/core/class-builtin.php:1848 +#: includes/core/class-builtin.php:1852 msgid "Bangladesh" msgstr "" -#: includes/core/class-builtin.php:1849 +#: includes/core/class-builtin.php:1853 msgid "Barbados" msgstr "" -#: includes/core/class-builtin.php:1850 +#: includes/core/class-builtin.php:1854 msgid "Belarus" msgstr "" -#: includes/core/class-builtin.php:1851 +#: includes/core/class-builtin.php:1855 msgid "Belgium" msgstr "" -#: includes/core/class-builtin.php:1852 +#: includes/core/class-builtin.php:1856 msgid "Belize" msgstr "" -#: includes/core/class-builtin.php:1853 +#: includes/core/class-builtin.php:1857 msgid "Benin" msgstr "" -#: includes/core/class-builtin.php:1854 +#: includes/core/class-builtin.php:1858 msgid "Bermuda" msgstr "" -#: includes/core/class-builtin.php:1855 +#: includes/core/class-builtin.php:1859 msgid "Bhutan" msgstr "" -#: includes/core/class-builtin.php:1856 +#: includes/core/class-builtin.php:1860 msgid "Bolivia, Plurinational State of" msgstr "" -#: includes/core/class-builtin.php:1857 +#: includes/core/class-builtin.php:1861 msgid "Bosnia and Herzegovina" msgstr "" -#: includes/core/class-builtin.php:1858 +#: includes/core/class-builtin.php:1862 msgid "Botswana" msgstr "" -#: includes/core/class-builtin.php:1859 +#: includes/core/class-builtin.php:1863 msgid "Bouvet Island" msgstr "" -#: includes/core/class-builtin.php:1860 +#: includes/core/class-builtin.php:1864 msgid "Brazil" msgstr "" -#: includes/core/class-builtin.php:1861 +#: includes/core/class-builtin.php:1865 msgid "British Indian Ocean Territory" msgstr "" -#: includes/core/class-builtin.php:1862 +#: includes/core/class-builtin.php:1866 msgid "Brunei Darussalam" msgstr "" -#: includes/core/class-builtin.php:1863 +#: includes/core/class-builtin.php:1867 msgid "Bulgaria" msgstr "" -#: includes/core/class-builtin.php:1864 +#: includes/core/class-builtin.php:1868 msgid "Burkina Faso" msgstr "" -#: includes/core/class-builtin.php:1865 +#: includes/core/class-builtin.php:1869 msgid "Burundi" msgstr "" -#: includes/core/class-builtin.php:1866 +#: includes/core/class-builtin.php:1870 msgid "Cambodia" msgstr "" -#: includes/core/class-builtin.php:1867 +#: includes/core/class-builtin.php:1871 msgid "Cameroon" msgstr "" -#: includes/core/class-builtin.php:1868 +#: includes/core/class-builtin.php:1872 msgid "Canada" msgstr "" -#: includes/core/class-builtin.php:1869 +#: includes/core/class-builtin.php:1873 msgid "Cape Verde" msgstr "" -#: includes/core/class-builtin.php:1870 +#: includes/core/class-builtin.php:1874 msgid "Cayman Islands" msgstr "" -#: includes/core/class-builtin.php:1871 +#: includes/core/class-builtin.php:1875 msgid "Central African Republic" msgstr "" -#: includes/core/class-builtin.php:1872 +#: includes/core/class-builtin.php:1876 msgid "Chad" msgstr "" -#: includes/core/class-builtin.php:1873 +#: includes/core/class-builtin.php:1877 msgid "Chile" msgstr "" -#: includes/core/class-builtin.php:1874 +#: includes/core/class-builtin.php:1878 msgid "China" msgstr "" -#: includes/core/class-builtin.php:1875 +#: includes/core/class-builtin.php:1879 msgid "Christmas Island" msgstr "" -#: includes/core/class-builtin.php:1876 +#: includes/core/class-builtin.php:1880 msgid "Cocos (Keeling) Islands" msgstr "" -#: includes/core/class-builtin.php:1877 +#: includes/core/class-builtin.php:1881 msgid "Colombia" msgstr "" -#: includes/core/class-builtin.php:1878 +#: includes/core/class-builtin.php:1882 msgid "Comoros" msgstr "" -#: includes/core/class-builtin.php:1879 +#: includes/core/class-builtin.php:1883 msgid "Congo" msgstr "" -#: includes/core/class-builtin.php:1880 +#: includes/core/class-builtin.php:1884 msgid "Congo, the Democratic Republic of the" msgstr "" -#: includes/core/class-builtin.php:1881 +#: includes/core/class-builtin.php:1885 msgid "Cook Islands" msgstr "" -#: includes/core/class-builtin.php:1882 +#: includes/core/class-builtin.php:1886 msgid "Costa Rica" msgstr "" -#: includes/core/class-builtin.php:1883 +#: includes/core/class-builtin.php:1887 msgid "Côte d'Ivoire" msgstr "" -#: includes/core/class-builtin.php:1884 +#: includes/core/class-builtin.php:1888 msgid "Croatia" msgstr "" -#: includes/core/class-builtin.php:1885 +#: includes/core/class-builtin.php:1889 msgid "Cuba" msgstr "" -#: includes/core/class-builtin.php:1886 +#: includes/core/class-builtin.php:1890 msgid "Cyprus" msgstr "" -#: includes/core/class-builtin.php:1887 +#: includes/core/class-builtin.php:1891 msgid "Czech Republic" msgstr "" -#: includes/core/class-builtin.php:1888 +#: includes/core/class-builtin.php:1892 msgid "Denmark" msgstr "" -#: includes/core/class-builtin.php:1889 +#: includes/core/class-builtin.php:1893 msgid "Djibouti" msgstr "" -#: includes/core/class-builtin.php:1890 +#: includes/core/class-builtin.php:1894 msgid "Dominica" msgstr "" -#: includes/core/class-builtin.php:1891 +#: includes/core/class-builtin.php:1895 msgid "Dominican Republic" msgstr "" -#: includes/core/class-builtin.php:1892 +#: includes/core/class-builtin.php:1896 msgid "Ecuador" msgstr "" -#: includes/core/class-builtin.php:1893 +#: includes/core/class-builtin.php:1897 msgid "Egypt" msgstr "" -#: includes/core/class-builtin.php:1894 +#: includes/core/class-builtin.php:1898 msgid "El Salvador" msgstr "" -#: includes/core/class-builtin.php:1895 +#: includes/core/class-builtin.php:1899 msgid "Equatorial Guinea" msgstr "" -#: includes/core/class-builtin.php:1896 +#: includes/core/class-builtin.php:1900 msgid "Eritrea" msgstr "" -#: includes/core/class-builtin.php:1897 +#: includes/core/class-builtin.php:1901 msgid "Estonia" msgstr "" -#: includes/core/class-builtin.php:1898 +#: includes/core/class-builtin.php:1902 msgid "Ethiopia" msgstr "" -#: includes/core/class-builtin.php:1899 +#: includes/core/class-builtin.php:1903 msgid "Falkland Islands (Malvinas)" msgstr "" -#: includes/core/class-builtin.php:1900 +#: includes/core/class-builtin.php:1904 msgid "Faroe Islands" msgstr "" -#: includes/core/class-builtin.php:1901 +#: includes/core/class-builtin.php:1905 msgid "Fiji" msgstr "" -#: includes/core/class-builtin.php:1902 +#: includes/core/class-builtin.php:1906 msgid "Finland" msgstr "" -#: includes/core/class-builtin.php:1903 +#: includes/core/class-builtin.php:1907 msgid "France" msgstr "" -#: includes/core/class-builtin.php:1904 +#: includes/core/class-builtin.php:1908 msgid "French Guiana" msgstr "" -#: includes/core/class-builtin.php:1905 +#: includes/core/class-builtin.php:1909 msgid "French Polynesia" msgstr "" -#: includes/core/class-builtin.php:1906 +#: includes/core/class-builtin.php:1910 msgid "French Southern Territories" msgstr "" -#: includes/core/class-builtin.php:1907 +#: includes/core/class-builtin.php:1911 msgid "Gabon" msgstr "" -#: includes/core/class-builtin.php:1908 +#: includes/core/class-builtin.php:1912 msgid "Gambia" msgstr "" -#: includes/core/class-builtin.php:1909 +#: includes/core/class-builtin.php:1913 msgid "Sakartvelo" msgstr "" -#: includes/core/class-builtin.php:1910 +#: includes/core/class-builtin.php:1914 msgid "Germany" msgstr "" -#: includes/core/class-builtin.php:1911 +#: includes/core/class-builtin.php:1915 msgid "Ghana" msgstr "" -#: includes/core/class-builtin.php:1912 +#: includes/core/class-builtin.php:1916 msgid "Gibraltar" msgstr "" -#: includes/core/class-builtin.php:1913 +#: includes/core/class-builtin.php:1917 msgid "Greece" msgstr "" -#: includes/core/class-builtin.php:1914 +#: includes/core/class-builtin.php:1918 msgid "Greenland" msgstr "" -#: includes/core/class-builtin.php:1915 +#: includes/core/class-builtin.php:1919 msgid "Grenada" msgstr "" -#: includes/core/class-builtin.php:1916 +#: includes/core/class-builtin.php:1920 msgid "Guadeloupe" msgstr "" -#: includes/core/class-builtin.php:1917 +#: includes/core/class-builtin.php:1921 msgid "Guam" msgstr "" -#: includes/core/class-builtin.php:1918 +#: includes/core/class-builtin.php:1922 msgid "Guatemala" msgstr "" -#: includes/core/class-builtin.php:1919 +#: includes/core/class-builtin.php:1923 msgid "Guernsey" msgstr "" -#: includes/core/class-builtin.php:1920 +#: includes/core/class-builtin.php:1924 msgid "Guinea" msgstr "" -#: includes/core/class-builtin.php:1921 +#: includes/core/class-builtin.php:1925 msgid "Guinea-Bissau" msgstr "" -#: includes/core/class-builtin.php:1922 +#: includes/core/class-builtin.php:1926 msgid "Guyana" msgstr "" -#: includes/core/class-builtin.php:1923 +#: includes/core/class-builtin.php:1927 msgid "Haiti" msgstr "" -#: includes/core/class-builtin.php:1924 +#: includes/core/class-builtin.php:1928 msgid "Heard Island and McDonald Islands" msgstr "" -#: includes/core/class-builtin.php:1925 +#: includes/core/class-builtin.php:1929 msgid "Holy See (Vatican City State)" msgstr "" -#: includes/core/class-builtin.php:1926 +#: includes/core/class-builtin.php:1930 msgid "Honduras" msgstr "" -#: includes/core/class-builtin.php:1927 +#: includes/core/class-builtin.php:1931 msgid "Hong Kong" msgstr "" -#: includes/core/class-builtin.php:1928 +#: includes/core/class-builtin.php:1932 msgid "Hungary" msgstr "" -#: includes/core/class-builtin.php:1929 +#: includes/core/class-builtin.php:1933 msgid "Iceland" msgstr "" -#: includes/core/class-builtin.php:1930 +#: includes/core/class-builtin.php:1934 msgid "India" msgstr "" -#: includes/core/class-builtin.php:1931 +#: includes/core/class-builtin.php:1935 msgid "Indonesia" msgstr "" -#: includes/core/class-builtin.php:1932 +#: includes/core/class-builtin.php:1936 msgid "Iran, Islamic Republic of" msgstr "" -#: includes/core/class-builtin.php:1933 +#: includes/core/class-builtin.php:1937 msgid "Iraq" msgstr "" -#: includes/core/class-builtin.php:1934 +#: includes/core/class-builtin.php:1938 msgid "Ireland" msgstr "" -#: includes/core/class-builtin.php:1935 +#: includes/core/class-builtin.php:1939 msgid "Isle of Man" msgstr "" -#: includes/core/class-builtin.php:1936 +#: includes/core/class-builtin.php:1940 msgid "Israel" msgstr "" -#: includes/core/class-builtin.php:1937 +#: includes/core/class-builtin.php:1941 msgid "Italy" msgstr "" -#: includes/core/class-builtin.php:1938 +#: includes/core/class-builtin.php:1942 msgid "Jamaica" msgstr "" -#: includes/core/class-builtin.php:1939 +#: includes/core/class-builtin.php:1943 msgid "Japan" msgstr "" -#: includes/core/class-builtin.php:1940 +#: includes/core/class-builtin.php:1944 msgid "Jersey" msgstr "" -#: includes/core/class-builtin.php:1941 +#: includes/core/class-builtin.php:1945 msgid "Jordan" msgstr "" -#: includes/core/class-builtin.php:1942 +#: includes/core/class-builtin.php:1946 msgid "Kazakhstan" msgstr "" -#: includes/core/class-builtin.php:1943 +#: includes/core/class-builtin.php:1947 msgid "Kenya" msgstr "" -#: includes/core/class-builtin.php:1944 +#: includes/core/class-builtin.php:1948 msgid "Kiribati" msgstr "" -#: includes/core/class-builtin.php:1945 +#: includes/core/class-builtin.php:1949 msgid "Korea, Democratic People's Republic of" msgstr "" -#: includes/core/class-builtin.php:1946 +#: includes/core/class-builtin.php:1950 msgid "Korea, Republic of" msgstr "" -#: includes/core/class-builtin.php:1947 +#: includes/core/class-builtin.php:1951 msgid "Kuwait" msgstr "" -#: includes/core/class-builtin.php:1948 +#: includes/core/class-builtin.php:1952 msgid "Kyrgyzstan" msgstr "" -#: includes/core/class-builtin.php:1949 +#: includes/core/class-builtin.php:1953 msgid "Lao People's Democratic Republic" msgstr "" -#: includes/core/class-builtin.php:1950 +#: includes/core/class-builtin.php:1954 msgid "Latvia" msgstr "" -#: includes/core/class-builtin.php:1951 +#: includes/core/class-builtin.php:1955 msgid "Lebanon" msgstr "" -#: includes/core/class-builtin.php:1952 +#: includes/core/class-builtin.php:1956 msgid "Lesotho" msgstr "" -#: includes/core/class-builtin.php:1953 +#: includes/core/class-builtin.php:1957 msgid "Liberia" msgstr "" -#: includes/core/class-builtin.php:1954 +#: includes/core/class-builtin.php:1958 msgid "Libyan Arab Jamahiriya" msgstr "" -#: includes/core/class-builtin.php:1955 +#: includes/core/class-builtin.php:1959 msgid "Liechtenstein" msgstr "" -#: includes/core/class-builtin.php:1956 +#: includes/core/class-builtin.php:1960 msgid "Lithuania" msgstr "" -#: includes/core/class-builtin.php:1957 +#: includes/core/class-builtin.php:1961 msgid "Luxembourg" msgstr "" -#: includes/core/class-builtin.php:1958 +#: includes/core/class-builtin.php:1962 msgid "Macao" msgstr "" -#: includes/core/class-builtin.php:1959 +#: includes/core/class-builtin.php:1963 msgid "Macedonia, the former Yugoslav Republic of" msgstr "" -#: includes/core/class-builtin.php:1960 +#: includes/core/class-builtin.php:1964 msgid "Madagascar" msgstr "" -#: includes/core/class-builtin.php:1961 +#: includes/core/class-builtin.php:1965 msgid "Malawi" msgstr "" -#: includes/core/class-builtin.php:1962 +#: includes/core/class-builtin.php:1966 msgid "Malaysia" msgstr "" -#: includes/core/class-builtin.php:1963 +#: includes/core/class-builtin.php:1967 msgid "Maldives" msgstr "" -#: includes/core/class-builtin.php:1964 +#: includes/core/class-builtin.php:1968 msgid "Mali" msgstr "" -#: includes/core/class-builtin.php:1965 +#: includes/core/class-builtin.php:1969 msgid "Malta" msgstr "" -#: includes/core/class-builtin.php:1966 +#: includes/core/class-builtin.php:1970 msgid "Marshall Islands" msgstr "" -#: includes/core/class-builtin.php:1967 +#: includes/core/class-builtin.php:1971 msgid "Martinique" msgstr "" -#: includes/core/class-builtin.php:1968 +#: includes/core/class-builtin.php:1972 msgid "Mauritania" msgstr "" -#: includes/core/class-builtin.php:1969 +#: includes/core/class-builtin.php:1973 msgid "Mauritius" msgstr "" -#: includes/core/class-builtin.php:1970 +#: includes/core/class-builtin.php:1974 msgid "Mayotte" msgstr "" -#: includes/core/class-builtin.php:1971 +#: includes/core/class-builtin.php:1975 msgid "Mexico" msgstr "" -#: includes/core/class-builtin.php:1972 +#: includes/core/class-builtin.php:1976 msgid "Micronesia, Federated States of" msgstr "" -#: includes/core/class-builtin.php:1973 +#: includes/core/class-builtin.php:1977 msgid "Moldova, Republic of" msgstr "" -#: includes/core/class-builtin.php:1974 +#: includes/core/class-builtin.php:1978 msgid "Monaco" msgstr "" -#: includes/core/class-builtin.php:1975 +#: includes/core/class-builtin.php:1979 msgid "Mongolia" msgstr "" -#: includes/core/class-builtin.php:1976 +#: includes/core/class-builtin.php:1980 msgid "Montenegro" msgstr "" -#: includes/core/class-builtin.php:1977 +#: includes/core/class-builtin.php:1981 msgid "Montserrat" msgstr "" -#: includes/core/class-builtin.php:1978 +#: includes/core/class-builtin.php:1982 msgid "Morocco" msgstr "" -#: includes/core/class-builtin.php:1979 +#: includes/core/class-builtin.php:1983 msgid "Mozambique" msgstr "" -#: includes/core/class-builtin.php:1980 +#: includes/core/class-builtin.php:1984 msgid "Myanmar" msgstr "" -#: includes/core/class-builtin.php:1981 +#: includes/core/class-builtin.php:1985 msgid "Namibia" msgstr "" -#: includes/core/class-builtin.php:1983 +#: includes/core/class-builtin.php:1987 msgid "Nepal" msgstr "" -#: includes/core/class-builtin.php:1984 +#: includes/core/class-builtin.php:1988 msgid "Netherlands" msgstr "" -#: includes/core/class-builtin.php:1985 +#: includes/core/class-builtin.php:1989 msgid "Netherlands Antilles" msgstr "" -#: includes/core/class-builtin.php:1986 +#: includes/core/class-builtin.php:1990 msgid "New Caledonia" msgstr "" -#: includes/core/class-builtin.php:1987 +#: includes/core/class-builtin.php:1991 msgid "New Zealand" msgstr "" -#: includes/core/class-builtin.php:1988 +#: includes/core/class-builtin.php:1992 msgid "Nicaragua" msgstr "" -#: includes/core/class-builtin.php:1989 +#: includes/core/class-builtin.php:1993 msgid "Niger" msgstr "" -#: includes/core/class-builtin.php:1990 +#: includes/core/class-builtin.php:1994 msgid "Nigeria" msgstr "" -#: includes/core/class-builtin.php:1991 +#: includes/core/class-builtin.php:1995 msgid "Niue" msgstr "" -#: includes/core/class-builtin.php:1992 +#: includes/core/class-builtin.php:1996 msgid "Norfolk Island" msgstr "" -#: includes/core/class-builtin.php:1993 +#: includes/core/class-builtin.php:1997 msgid "Northern Mariana Islands" msgstr "" -#: includes/core/class-builtin.php:1994 +#: includes/core/class-builtin.php:1998 msgid "Norway" msgstr "" -#: includes/core/class-builtin.php:1995 +#: includes/core/class-builtin.php:1999 msgid "Oman" msgstr "" -#: includes/core/class-builtin.php:1996 +#: includes/core/class-builtin.php:2000 msgid "Pakistan" msgstr "" -#: includes/core/class-builtin.php:1997 +#: includes/core/class-builtin.php:2001 msgid "Palau" msgstr "" -#: includes/core/class-builtin.php:1998 +#: includes/core/class-builtin.php:2002 msgid "Palestine" msgstr "" -#: includes/core/class-builtin.php:1999 +#: includes/core/class-builtin.php:2003 msgid "Panama" msgstr "" -#: includes/core/class-builtin.php:2000 +#: includes/core/class-builtin.php:2004 msgid "Papua New Guinea" msgstr "" -#: includes/core/class-builtin.php:2001 +#: includes/core/class-builtin.php:2005 msgid "Paraguay" msgstr "" -#: includes/core/class-builtin.php:2002 +#: includes/core/class-builtin.php:2006 msgid "Peru" msgstr "" -#: includes/core/class-builtin.php:2003 +#: includes/core/class-builtin.php:2007 msgid "Philippines" msgstr "" -#: includes/core/class-builtin.php:2004 +#: includes/core/class-builtin.php:2008 msgid "Pitcairn" msgstr "" -#: includes/core/class-builtin.php:2005 +#: includes/core/class-builtin.php:2009 msgid "Poland" msgstr "" -#: includes/core/class-builtin.php:2006 +#: includes/core/class-builtin.php:2010 msgid "Portugal" msgstr "" -#: includes/core/class-builtin.php:2007 +#: includes/core/class-builtin.php:2011 msgid "Puerto Rico" msgstr "" -#: includes/core/class-builtin.php:2008 +#: includes/core/class-builtin.php:2012 msgid "Qatar" msgstr "" -#: includes/core/class-builtin.php:2009 +#: includes/core/class-builtin.php:2013 msgid "Réunion" msgstr "" -#: includes/core/class-builtin.php:2010 +#: includes/core/class-builtin.php:2014 msgid "Romania" msgstr "" -#: includes/core/class-builtin.php:2011 +#: includes/core/class-builtin.php:2015 msgid "Russian Federation" msgstr "" -#: includes/core/class-builtin.php:2012 +#: includes/core/class-builtin.php:2016 msgid "Rwanda" msgstr "" -#: includes/core/class-builtin.php:2013 +#: includes/core/class-builtin.php:2017 msgid "Saint Barthélemy" msgstr "" -#: includes/core/class-builtin.php:2014 +#: includes/core/class-builtin.php:2018 msgid "Saint Helena" msgstr "" -#: includes/core/class-builtin.php:2015 +#: includes/core/class-builtin.php:2019 msgid "Saint Kitts and Nevis" msgstr "" -#: includes/core/class-builtin.php:2016 +#: includes/core/class-builtin.php:2020 msgid "Saint Lucia" msgstr "" -#: includes/core/class-builtin.php:2017 +#: includes/core/class-builtin.php:2021 msgid "Saint Martin (French part)" msgstr "" -#: includes/core/class-builtin.php:2018 +#: includes/core/class-builtin.php:2022 msgid "Saint Pierre and Miquelon" msgstr "" -#: includes/core/class-builtin.php:2019 +#: includes/core/class-builtin.php:2023 msgid "Saint Vincent and the Grenadines" msgstr "" -#: includes/core/class-builtin.php:2020 +#: includes/core/class-builtin.php:2024 msgid "Samoa" msgstr "" -#: includes/core/class-builtin.php:2021 +#: includes/core/class-builtin.php:2025 msgid "San Marino" msgstr "" -#: includes/core/class-builtin.php:2022 +#: includes/core/class-builtin.php:2026 msgid "Sao Tome and Principe" msgstr "" -#: includes/core/class-builtin.php:2023 +#: includes/core/class-builtin.php:2027 msgid "Saudi Arabia" msgstr "" -#: includes/core/class-builtin.php:2024 +#: includes/core/class-builtin.php:2028 msgid "Senegal" msgstr "" -#: includes/core/class-builtin.php:2025 +#: includes/core/class-builtin.php:2029 msgid "Serbia" msgstr "" -#: includes/core/class-builtin.php:2026 +#: includes/core/class-builtin.php:2030 msgid "Seychelles" msgstr "" -#: includes/core/class-builtin.php:2027 +#: includes/core/class-builtin.php:2031 msgid "Sierra Leone" msgstr "" -#: includes/core/class-builtin.php:2028 +#: includes/core/class-builtin.php:2032 msgid "Singapore" msgstr "" -#: includes/core/class-builtin.php:2029 +#: includes/core/class-builtin.php:2033 msgid "Slovakia" msgstr "" -#: includes/core/class-builtin.php:2030 +#: includes/core/class-builtin.php:2034 msgid "Slovenia" msgstr "" -#: includes/core/class-builtin.php:2031 +#: includes/core/class-builtin.php:2035 msgid "Solomon Islands" msgstr "" -#: includes/core/class-builtin.php:2032 +#: includes/core/class-builtin.php:2036 msgid "Somalia" msgstr "" -#: includes/core/class-builtin.php:2033 +#: includes/core/class-builtin.php:2037 msgid "South Africa" msgstr "" -#: includes/core/class-builtin.php:2034 +#: includes/core/class-builtin.php:2038 msgid "South Georgia and the South Sandwich Islands" msgstr "" -#: includes/core/class-builtin.php:2035 +#: includes/core/class-builtin.php:2039 msgid "South Sudan" msgstr "" -#: includes/core/class-builtin.php:2036 +#: includes/core/class-builtin.php:2040 msgid "Spain" msgstr "" -#: includes/core/class-builtin.php:2037 +#: includes/core/class-builtin.php:2041 msgid "Sri Lanka" msgstr "" -#: includes/core/class-builtin.php:2038 +#: includes/core/class-builtin.php:2042 msgid "Sudan" msgstr "" -#: includes/core/class-builtin.php:2039 +#: includes/core/class-builtin.php:2043 msgid "Suriname" msgstr "" -#: includes/core/class-builtin.php:2040 +#: includes/core/class-builtin.php:2044 msgid "Svalbard and Jan Mayen" msgstr "" -#: includes/core/class-builtin.php:2041 +#: includes/core/class-builtin.php:2045 msgid "Eswatini" msgstr "" -#: includes/core/class-builtin.php:2042 +#: includes/core/class-builtin.php:2046 msgid "Sweden" msgstr "" -#: includes/core/class-builtin.php:2043 +#: includes/core/class-builtin.php:2047 msgid "Switzerland" msgstr "" -#: includes/core/class-builtin.php:2044 +#: includes/core/class-builtin.php:2048 msgid "Syrian Arab Republic" msgstr "" -#: includes/core/class-builtin.php:2045 +#: includes/core/class-builtin.php:2049 msgid "Taiwan, Province of China" msgstr "" -#: includes/core/class-builtin.php:2046 +#: includes/core/class-builtin.php:2050 msgid "Tajikistan" msgstr "" -#: includes/core/class-builtin.php:2047 +#: includes/core/class-builtin.php:2051 msgid "Tanzania, United Republic of" msgstr "" -#: includes/core/class-builtin.php:2048 +#: includes/core/class-builtin.php:2052 msgid "Thailand" msgstr "" -#: includes/core/class-builtin.php:2049 +#: includes/core/class-builtin.php:2053 msgid "Timor-Leste" msgstr "" -#: includes/core/class-builtin.php:2050 +#: includes/core/class-builtin.php:2054 msgid "Togo" msgstr "" -#: includes/core/class-builtin.php:2051 +#: includes/core/class-builtin.php:2055 msgid "Tokelau" msgstr "" -#: includes/core/class-builtin.php:2053 +#: includes/core/class-builtin.php:2057 msgid "Trinidad and Tobago" msgstr "" -#: includes/core/class-builtin.php:2054 +#: includes/core/class-builtin.php:2058 msgid "Tunisia" msgstr "" -#: includes/core/class-builtin.php:2055 +#: includes/core/class-builtin.php:2059 msgid "Turkey" msgstr "" -#: includes/core/class-builtin.php:2056 +#: includes/core/class-builtin.php:2060 msgid "Turkmenistan" msgstr "" -#: includes/core/class-builtin.php:2057 +#: includes/core/class-builtin.php:2061 msgid "Turks and Caicos Islands" msgstr "" -#: includes/core/class-builtin.php:2058 +#: includes/core/class-builtin.php:2062 msgid "Tuvalu" msgstr "" -#: includes/core/class-builtin.php:2059 +#: includes/core/class-builtin.php:2063 msgid "Uganda" msgstr "" -#: includes/core/class-builtin.php:2060 +#: includes/core/class-builtin.php:2064 msgid "Ukraine" msgstr "" -#: includes/core/class-builtin.php:2061 +#: includes/core/class-builtin.php:2065 msgid "United Arab Emirates" msgstr "" -#: includes/core/class-builtin.php:2062 +#: includes/core/class-builtin.php:2066 msgid "United Kingdom" msgstr "" -#: includes/core/class-builtin.php:2063 +#: includes/core/class-builtin.php:2067 msgid "United States" msgstr "" -#: includes/core/class-builtin.php:2064 +#: includes/core/class-builtin.php:2068 msgid "United States Minor Outlying Islands" msgstr "" -#: includes/core/class-builtin.php:2065 +#: includes/core/class-builtin.php:2069 msgid "Uruguay" msgstr "" -#: includes/core/class-builtin.php:2066 +#: includes/core/class-builtin.php:2070 msgid "Uzbekistan" msgstr "" -#: includes/core/class-builtin.php:2067 +#: includes/core/class-builtin.php:2071 msgid "Vanuatu" msgstr "" -#: includes/core/class-builtin.php:2068 +#: includes/core/class-builtin.php:2072 msgid "Venezuela, Bolivarian Republic of" msgstr "" -#: includes/core/class-builtin.php:2069 +#: includes/core/class-builtin.php:2073 msgid "Viet Nam" msgstr "" -#: includes/core/class-builtin.php:2070 +#: includes/core/class-builtin.php:2074 msgid "Virgin Islands, British" msgstr "" -#: includes/core/class-builtin.php:2071 +#: includes/core/class-builtin.php:2075 msgid "Virgin Islands, U.S." msgstr "" -#: includes/core/class-builtin.php:2072 +#: includes/core/class-builtin.php:2076 msgid "Wallis and Futuna" msgstr "" -#: includes/core/class-builtin.php:2073 +#: includes/core/class-builtin.php:2077 msgid "Western Sahara" msgstr "" -#: includes/core/class-builtin.php:2074 +#: includes/core/class-builtin.php:2078 msgid "Yemen" msgstr "" -#: includes/core/class-builtin.php:2075 +#: includes/core/class-builtin.php:2079 msgid "Zambia" msgstr "" -#: includes/core/class-builtin.php:2076 +#: includes/core/class-builtin.php:2080 msgid "Zimbabwe" msgstr "" @@ -9236,109 +9295,124 @@ msgid_plural "%s years old" msgstr[0] "" msgstr[1] "" -#: includes/core/class-fields.php:1582 +#. translators: %s: The message after registration process based on a role data and user status after registration +#. translators: %s: Restricted blog page message. +#. translators: %s: Restricted taxonomy message. +#: includes/core/class-fields.php:1561 +#: includes/core/um-actions-account.php:547 +#: templates/message.php:23 +#: templates/restricted-blog.php:41 +#: templates/restricted-taxonomy.php:59 +msgid "%s" +msgstr "" + +#: includes/core/class-fields.php:1580 msgid "Custom Field" msgstr "" -#: includes/core/class-fields.php:1946 +#: includes/core/class-fields.php:1944 msgid "Please upload a valid image!" msgstr "" -#: includes/core/class-fields.php:1960 +#: includes/core/class-fields.php:1958 msgid "Sorry this is not a valid image." msgstr "" -#: includes/core/class-fields.php:1963 +#: includes/core/class-fields.php:1961 msgid "This image is too large!" msgstr "" -#: includes/core/class-fields.php:1966 +#: includes/core/class-fields.php:1964 msgid "This image is too small!" msgstr "" -#: includes/core/class-fields.php:1969 +#: includes/core/class-fields.php:1967 msgid "You can only upload one image" msgstr "" -#: includes/core/class-fields.php:2001 +#: includes/core/class-fields.php:1999 msgid "Sorry this is not a valid file." msgstr "" -#: includes/core/class-fields.php:2004 +#: includes/core/class-fields.php:2002 msgid "This file is too large!" msgstr "" -#: includes/core/class-fields.php:2007 +#: includes/core/class-fields.php:2005 msgid "This file is too small!" msgstr "" -#: includes/core/class-fields.php:2010 +#: includes/core/class-fields.php:2008 msgid "You can only upload one file" msgstr "" -#: includes/core/class-fields.php:2539 +#: includes/core/class-fields.php:2536 msgid "Current Password" msgstr "" -#: includes/core/class-fields.php:2579 +#: includes/core/class-fields.php:2576 msgid "New Password" msgstr "" #. translators: %s: label. #. translators: %s: placeholder. -#: includes/core/class-fields.php:2630 +#: includes/core/class-fields.php:2627 +#: includes/core/class-fields.php:2645 #: includes/core/class-fields.php:2648 -#: includes/core/class-fields.php:2651 msgid "Confirm %s" msgstr "" -#: includes/core/class-fields.php:2962 +#: includes/core/class-fields.php:2961 msgid "Upload Photo" msgstr "" -#: includes/core/class-fields.php:2989 -#: includes/core/class-fields.php:3033 -#: includes/core/um-actions-profile.php:1078 +#: includes/core/class-fields.php:2988 +#: includes/core/class-fields.php:3032 +#: includes/core/um-actions-profile.php:1103 msgid "Change photo" msgstr "" -#: includes/core/class-fields.php:3033 -#: includes/core/class-fields.php:3158 +#: includes/core/class-fields.php:3032 +#: includes/core/class-fields.php:3157 msgid "Processing..." msgstr "" -#: includes/core/class-fields.php:3061 +#: includes/core/class-fields.php:3032 +msgid "Apply" +msgstr "" + +#: includes/core/class-fields.php:3060 msgid "Upload File" msgstr "" -#: includes/core/class-fields.php:3106 -#: includes/core/um-filters-fields.php:368 +#: includes/core/class-fields.php:3105 +#: includes/core/um-filters-fields.php:372 msgid "This file has been removed." msgstr "" -#: includes/core/class-fields.php:3110 -#: includes/core/class-fields.php:3158 +#: includes/core/class-fields.php:3109 +#: includes/core/class-fields.php:3157 msgid "Change file" msgstr "" -#: includes/core/class-fields.php:3158 +#: includes/core/class-fields.php:3157 msgid "Save" msgstr "" #. translators: %s: edit user link. -#: includes/core/class-fields.php:4678 +#: includes/core/class-fields.php:4682 msgid "Your profile is looking a little empty. Why not add some information!" msgstr "" -#: includes/core/class-fields.php:4680 +#: includes/core/class-fields.php:4684 msgid "This user has not added any information to their profile yet." msgstr "" -#: includes/core/class-fields.php:4946 +#: includes/core/class-fields.php:4950 msgid "Please login as administrator." msgstr "" -#: includes/core/class-fields.php:4950 +#: includes/core/class-fields.php:4954 msgid "Invalid action." msgstr "" @@ -9381,7 +9455,7 @@ msgstr "" msgid "A theme or plugin compatibility issue" msgstr "" -#: includes/core/class-files.php:1294 +#: includes/core/class-files.php:1285 msgid "Original size" msgstr "" @@ -9398,7 +9472,7 @@ msgstr "" msgid "Wrong callback." msgstr "" -#: includes/core/class-form.php:577 +#: includes/core/class-form.php:582 #: includes/core/class-password.php:396 #: includes/core/class-password.php:474 msgid "Hello, spam bot!" @@ -9409,7 +9483,7 @@ msgid "Please agree privacy policy." msgstr "" #: includes/core/class-gdpr.php:90 -#: includes/um-short-functions.php:694 +#: includes/um-short-functions.php:693 msgid "GDPR Applied" msgstr "" @@ -9429,8 +9503,8 @@ msgstr "" #: includes/core/class-member-directory-meta.php:603 #: includes/core/class-member-directory-meta.php:608 -#: includes/core/class-member-directory.php:2859 -#: includes/core/class-member-directory.php:2865 +#: includes/core/class-member-directory.php:2838 +#: includes/core/class-member-directory.php:2844 msgid "Wrong member directory data" msgstr "" @@ -9528,15 +9602,15 @@ msgstr "" msgid "Age: {min_range} - {max_range} years old" msgstr "" -#: includes/core/class-member-directory.php:2609 -#: includes/core/class-member-directory.php:2653 -#: includes/core/um-actions-profile.php:1445 -#: includes/core/um-actions-profile.php:1476 +#: includes/core/class-member-directory.php:2606 +#: includes/core/class-member-directory.php:2634 +#: includes/core/um-actions-profile.php:1470 +#: includes/core/um-actions-profile.php:1501 msgid "Edit Profile" msgstr "" -#: includes/core/class-member-directory.php:2659 -#: includes/core/um-actions-profile.php:1477 +#: includes/core/class-member-directory.php:2640 +#: includes/core/um-actions-profile.php:1502 msgid "My Account" msgstr "" @@ -9558,7 +9632,7 @@ msgstr "" #: includes/core/class-password.php:511 #: includes/core/um-actions-account.php:67 -#: includes/core/um-actions-register.php:322 +#: includes/core/um-actions-register.php:323 msgid "Passwords may not contain the character \"\\\"." msgstr "" @@ -9576,19 +9650,19 @@ msgstr "" #: includes/core/class-password.php:545 #: includes/core/um-actions-account.php:112 -#: includes/core/um-actions-form.php:636 +#: includes/core/um-actions-form.php:638 msgid "Your password cannot contain the part of your username" msgstr "" #: includes/core/class-password.php:549 #: includes/core/um-actions-account.php:116 -#: includes/core/um-actions-form.php:640 +#: includes/core/um-actions-form.php:642 msgid "Your password cannot contain the part of your email address" msgstr "" #: includes/core/class-password.php:553 #: includes/core/um-actions-account.php:120 -#: includes/core/um-actions-form.php:644 +#: includes/core/um-actions-form.php:646 msgid "Your password must contain at least one lowercase letter, one capital letter and one number" msgstr "" @@ -9597,7 +9671,7 @@ msgid "You must confirm your new password" msgstr "" #: includes/core/class-password.php:562 -#: includes/core/um-actions-form.php:656 +#: includes/core/um-actions-form.php:658 msgid "Your passwords do not match" msgstr "" @@ -9651,20 +9725,20 @@ msgstr "" msgid "The \"unassigned\" $status has been removed. Use `UM()->setup()->set_default_user_status()` for setting up default user account status." msgstr "" -#: includes/core/class-shortcodes.php:409 -msgid "This content has been restricted to logged in users only. Please login to view this content." +#: includes/core/class-shortcodes.php:406 +msgid "This content has been restricted to logged-in users only. Please login to view this content." msgstr "" -#: includes/core/class-shortcodes.php:494 -#: includes/core/class-shortcodes.php:515 +#: includes/core/class-shortcodes.php:493 +#: includes/core/class-shortcodes.php:514 msgid "Go to profile" msgstr "" -#: includes/core/class-shortcodes.php:837 +#: includes/core/class-shortcodes.php:852 msgid "You are already registered." msgstr "" -#: includes/core/class-shortcodes.php:1096 +#: includes/core/class-shortcodes.php:1111 msgid "Default Template" msgstr "" @@ -9702,28 +9776,28 @@ msgstr "" msgid "Unable to crop image file: %s" msgstr "" -#: includes/core/class-user.php:1123 +#: includes/core/class-user.php:1122 msgid "Ultimate Member Role" msgstr "" -#: includes/core/class-user.php:1126 +#: includes/core/class-user.php:1125 msgid "— No role for Ultimate Member —" msgstr "" -#: includes/core/class-user.php:1312 +#: includes/core/class-user.php:1311 msgid "Membership Rejected" msgstr "" -#: includes/core/class-user.php:1316 +#: includes/core/class-user.php:1315 msgid "Membership Inactive" msgstr "" #: includes/core/rest/class-api-v1.php:220 -#: includes/core/rest/class-api-v1.php:276 -#: includes/core/rest/class-api-v1.php:308 +#: includes/core/rest/class-api-v1.php:277 +#: includes/core/rest/class-api-v1.php:309 #: includes/core/rest/class-api-v2.php:202 -#: includes/core/rest/class-api-v2.php:258 -#: includes/core/rest/class-api-v2.php:290 +#: includes/core/rest/class-api-v2.php:259 +#: includes/core/rest/class-api-v2.php:291 msgid "You must provide a user ID" msgstr "" @@ -9737,30 +9811,30 @@ msgstr "" msgid "You need to provide value to update" msgstr "" -#: includes/core/rest/class-api-v1.php:243 -#: includes/core/rest/class-api-v2.php:225 +#: includes/core/rest/class-api-v1.php:244 +#: includes/core/rest/class-api-v2.php:226 msgid "User status has been changed." msgstr "" -#: includes/core/rest/class-api-v1.php:253 -#: includes/core/rest/class-api-v2.php:235 +#: includes/core/rest/class-api-v1.php:254 +#: includes/core/rest/class-api-v2.php:236 msgid "User role has been changed." msgstr "" -#: includes/core/rest/class-api-v1.php:257 -#: includes/core/rest/class-api-v2.php:239 +#: includes/core/rest/class-api-v1.php:258 +#: includes/core/rest/class-api-v2.php:240 msgid "User meta has been changed." msgstr "" -#: includes/core/rest/class-api-v1.php:284 -#: includes/core/rest/class-api-v1.php:315 -#: includes/core/rest/class-api-v2.php:266 -#: includes/core/rest/class-api-v2.php:297 +#: includes/core/rest/class-api-v1.php:285 +#: includes/core/rest/class-api-v1.php:316 +#: includes/core/rest/class-api-v2.php:267 +#: includes/core/rest/class-api-v2.php:298 msgid "Invalid user specified" msgstr "" -#: includes/core/rest/class-api-v1.php:291 -#: includes/core/rest/class-api-v2.php:273 +#: includes/core/rest/class-api-v1.php:292 +#: includes/core/rest/class-api-v2.php:274 msgid "User has been successfully deleted." msgstr "" @@ -9817,7 +9891,7 @@ msgid "You must provide your last name" msgstr "" #: includes/core/um-actions-account.php:160 -#: includes/core/um-actions-form.php:924 +#: includes/core/um-actions-form.php:926 msgid "You must provide your email" msgstr "" @@ -9826,119 +9900,103 @@ msgstr "" msgid "Please provide a valid email" msgstr "" -#: includes/core/um-actions-account.php:532 +#: includes/core/um-actions-account.php:562 msgid "Select what email notifications you want to receive" msgstr "" -#: includes/core/um-actions-account.php:599 +#: includes/core/um-actions-account.php:629 msgid "Download your data" msgstr "" -#: includes/core/um-actions-account.php:601 +#: includes/core/um-actions-account.php:631 msgid "You can request a file with the information that we believe is most relevant and useful to you." msgstr "" -#: includes/core/um-actions-account.php:626 +#: includes/core/um-actions-account.php:656 msgid "You could download your previous data:" msgstr "" -#: includes/core/um-actions-account.php:627 +#: includes/core/um-actions-account.php:657 msgid "Download Personal Data" msgstr "" -#: includes/core/um-actions-account.php:628 +#: includes/core/um-actions-account.php:658 msgid "You could send a new request for an export of personal your data." msgstr "" -#: includes/core/um-actions-account.php:648 -#: includes/core/um-actions-account.php:824 +#: includes/core/um-actions-account.php:678 +#: includes/core/um-actions-account.php:854 msgid "A confirmation email has been sent to your email. Click the link within the email to confirm your export request." msgstr "" -#: includes/core/um-actions-account.php:650 +#: includes/core/um-actions-account.php:680 msgid "The administrator has not yet approved downloading the data. Please expect an email with a link to your data." msgstr "" -#: includes/core/um-actions-account.php:655 +#: includes/core/um-actions-account.php:685 msgid "Enter your current password to confirm a new export of your personal data." msgstr "" -#: includes/core/um-actions-account.php:667 -#: includes/core/um-actions-account.php:755 +#: includes/core/um-actions-account.php:697 +#: includes/core/um-actions-account.php:785 msgid "You must enter a password" msgstr "" -#: includes/core/um-actions-account.php:675 +#: includes/core/um-actions-account.php:705 msgid "To export of your personal data, click the button below." msgstr "" -#: includes/core/um-actions-account.php:682 +#: includes/core/um-actions-account.php:712 msgid "Request data" msgstr "" -#: includes/core/um-actions-account.php:691 +#: includes/core/um-actions-account.php:721 msgid "Erase of your data" msgstr "" -#: includes/core/um-actions-account.php:693 +#: includes/core/um-actions-account.php:723 msgid "You can request erasing of the data that we have about you." msgstr "" -#: includes/core/um-actions-account.php:717 +#: includes/core/um-actions-account.php:747 msgid "Your personal data has been deleted." msgstr "" -#: includes/core/um-actions-account.php:718 +#: includes/core/um-actions-account.php:748 msgid "You could send a new request for deleting your personal data." msgstr "" -#: includes/core/um-actions-account.php:738 -#: includes/core/um-actions-account.php:826 +#: includes/core/um-actions-account.php:768 +#: includes/core/um-actions-account.php:856 msgid "A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request." msgstr "" -#: includes/core/um-actions-account.php:740 +#: includes/core/um-actions-account.php:770 msgid "The administrator has not yet approved deleting your data. Please expect an email with a link to your data." msgstr "" -#: includes/core/um-actions-account.php:745 +#: includes/core/um-actions-account.php:775 msgid "Enter your current password to confirm the erasure of your personal data." msgstr "" -#: includes/core/um-actions-account.php:763 +#: includes/core/um-actions-account.php:793 msgid "Require erasure of your personal data, click on the button below." msgstr "" -#: includes/core/um-actions-account.php:770 +#: includes/core/um-actions-account.php:800 msgid "Request data erase" msgstr "" -#: includes/core/um-actions-account.php:784 -#: includes/core/um-actions-account.php:816 +#: includes/core/um-actions-account.php:814 +#: includes/core/um-actions-account.php:846 msgid "Wrong request." msgstr "" -#: includes/core/um-actions-account.php:796 -#: includes/core/um-actions-account.php:803 +#: includes/core/um-actions-account.php:826 +#: includes/core/um-actions-account.php:833 msgid "The password you entered is incorrect." msgstr "" -#: includes/core/um-actions-core.php:34 -msgid "Super administrators can not be modified." -msgstr "" - -#: includes/core/um-actions-core.php:89 -#: includes/core/um-actions-core.php:100 -#: includes/core/um-actions-core.php:114 -#: includes/core/um-actions-core.php:124 -#: includes/core/um-actions-core.php:137 -msgid "You do not have permission to make this action." -msgstr "" - -#: includes/core/um-actions-core.php:147 -msgid "You do not have permission to delete this user." -msgstr "" - #: includes/core/um-actions-form.php:98 msgid "You are not allowed to use this word as your username." msgstr "" @@ -9948,189 +10006,189 @@ msgid "Profile Photo is required." msgstr "" #. translators: %s: title. -#: includes/core/um-actions-form.php:507 #: includes/core/um-actions-form.php:509 +#: includes/core/um-actions-form.php:511 msgid "%s - wrong conditions." msgstr "" #. translators: %s: title. -#: includes/core/um-actions-form.php:519 -#: includes/core/um-actions-form.php:524 -#: includes/core/um-actions-form.php:529 -#: includes/core/um-actions-form.php:534 +#: includes/core/um-actions-form.php:521 +#: includes/core/um-actions-form.php:526 +#: includes/core/um-actions-form.php:531 +#: includes/core/um-actions-form.php:536 msgid "%s is required." msgstr "" -#: includes/core/um-actions-form.php:539 +#: includes/core/um-actions-form.php:541 msgid "Please specify account type." msgstr "" -#: includes/core/um-actions-form.php:569 +#: includes/core/um-actions-form.php:571 msgid "This field is required" msgstr "" #. translators: %s: title. -#: includes/core/um-actions-form.php:572 +#: includes/core/um-actions-form.php:574 msgid "%s is required" msgstr "" #. translators: %s: max words. -#: includes/core/um-actions-form.php:591 +#: includes/core/um-actions-form.php:593 msgid "You are only allowed to enter a maximum of %s words" msgstr "" #. translators: %s: min chars. -#: includes/core/um-actions-form.php:599 +#: includes/core/um-actions-form.php:601 msgid "This field must contain at least %s characters" msgstr "" #. translators: %1$s is a label; %2$s is a min chars. -#: includes/core/um-actions-form.php:602 +#: includes/core/um-actions-form.php:604 msgid "Your %1$s must contain at least %2$s characters" msgstr "" #. translators: %s: max chars. -#: includes/core/um-actions-form.php:618 +#: includes/core/um-actions-form.php:620 msgid "This field must contain less than %s characters" msgstr "" #. translators: %1$s is a label; %2$s is a max chars. -#: includes/core/um-actions-form.php:621 +#: includes/core/um-actions-form.php:623 msgid "Your %1$s must contain less than %2$s characters" msgstr "" -#: includes/core/um-actions-form.php:629 +#: includes/core/um-actions-form.php:631 msgid "You can not use HTML tags here" msgstr "" -#: includes/core/um-actions-form.php:650 -#: includes/core/um-actions-form.php:653 +#: includes/core/um-actions-form.php:652 +#: includes/core/um-actions-form.php:655 msgid "Please confirm your password" msgstr "" #. translators: %s: min selections. -#: includes/core/um-actions-form.php:664 +#: includes/core/um-actions-form.php:666 msgid "Please select at least %s choices" msgstr "" #. translators: %s: max selections. -#: includes/core/um-actions-form.php:671 +#: includes/core/um-actions-form.php:673 msgid "You can only select up to %s choices" msgstr "" #. translators: %s: min limit. -#: includes/core/um-actions-form.php:678 +#: includes/core/um-actions-form.php:680 msgid "Minimum number limit is %s" msgstr "" #. translators: %s: max limit. -#: includes/core/um-actions-form.php:685 +#: includes/core/um-actions-form.php:687 msgid "Maximum number limit is %s" msgstr "" #. translators: %s: max chars. -#: includes/core/um-actions-form.php:745 -#: includes/core/um-actions-form.php:1059 +#: includes/core/um-actions-form.php:747 +#: includes/core/um-actions-form.php:1061 msgid "Your user description must contain less than %s characters" msgstr "" -#: includes/core/um-actions-form.php:783 +#: includes/core/um-actions-form.php:785 msgid "Please enter numbers only in this field" msgstr "" -#: includes/core/um-actions-form.php:789 +#: includes/core/um-actions-form.php:791 msgid "Please enter a valid phone number" msgstr "" #. translators: %s: label. -#: includes/core/um-actions-form.php:796 -#: includes/core/um-actions-form.php:817 -#: includes/core/um-actions-form.php:824 -#: includes/core/um-actions-form.php:831 -#: includes/core/um-actions-form.php:838 -#: includes/core/um-actions-form.php:852 +#: includes/core/um-actions-form.php:798 +#: includes/core/um-actions-form.php:819 +#: includes/core/um-actions-form.php:826 +#: includes/core/um-actions-form.php:833 +#: includes/core/um-actions-form.php:840 +#: includes/core/um-actions-form.php:854 msgid "Please enter a valid %s username or profile URL" msgstr "" #. translators: %s: label. -#: includes/core/um-actions-form.php:803 -#: includes/core/um-actions-form.php:810 +#: includes/core/um-actions-form.php:805 +#: includes/core/um-actions-form.php:812 msgid "Please enter a valid %s URL" msgstr "" #. translators: %s: label. -#: includes/core/um-actions-form.php:845 -#: includes/core/um-actions-form.php:865 -#: includes/core/um-actions-form.php:872 -#: includes/core/um-actions-form.php:879 +#: includes/core/um-actions-form.php:847 +#: includes/core/um-actions-form.php:867 +#: includes/core/um-actions-form.php:874 +#: includes/core/um-actions-form.php:881 msgid "Please enter a valid %s profile URL" msgstr "" -#: includes/core/um-actions-form.php:858 +#: includes/core/um-actions-form.php:860 msgid "Please enter a valid Discord ID" msgstr "" -#: includes/core/um-actions-form.php:885 +#: includes/core/um-actions-form.php:887 msgid "Please enter a valid URL" msgstr "" -#: includes/core/um-actions-form.php:891 +#: includes/core/um-actions-form.php:893 msgid "You must provide a username" msgstr "" -#: includes/core/um-actions-form.php:893 -#: includes/core/um-actions-form.php:905 +#: includes/core/um-actions-form.php:895 +#: includes/core/um-actions-form.php:907 msgid "The username you entered is incorrect" msgstr "" -#: includes/core/um-actions-form.php:895 +#: includes/core/um-actions-form.php:897 msgid "Username cannot be an email" msgstr "" -#: includes/core/um-actions-form.php:897 -#: includes/core/um-actions-form.php:909 +#: includes/core/um-actions-form.php:899 +#: includes/core/um-actions-form.php:911 msgid "Your username contains invalid characters" msgstr "" -#: includes/core/um-actions-form.php:903 +#: includes/core/um-actions-form.php:905 msgid "You must provide a username or email" msgstr "" -#: includes/core/um-actions-form.php:907 -#: includes/core/um-actions-form.php:926 +#: includes/core/um-actions-form.php:909 #: includes/core/um-actions-form.php:928 #: includes/core/um-actions-form.php:930 -#: includes/core/um-actions-form.php:937 +#: includes/core/um-actions-form.php:932 #: includes/core/um-actions-form.php:939 -#: includes/core/um-actions-form.php:946 +#: includes/core/um-actions-form.php:941 +#: includes/core/um-actions-form.php:948 msgid "The email you entered is incorrect" msgstr "" -#: includes/core/um-actions-form.php:932 +#: includes/core/um-actions-form.php:934 msgid "Your email contains invalid characters" msgstr "" -#: includes/core/um-actions-form.php:956 +#: includes/core/um-actions-form.php:958 msgid "This is not a valid email" msgstr "" -#: includes/core/um-actions-form.php:977 +#: includes/core/um-actions-form.php:979 msgid "You must provide a unique value" msgstr "" -#: includes/core/um-actions-form.php:985 +#: includes/core/um-actions-form.php:987 msgid "You must provide alphabetic letters" msgstr "" -#: includes/core/um-actions-form.php:993 +#: includes/core/um-actions-form.php:995 msgid "You must provide alphabetic letters or numbers" msgstr "" -#: includes/core/um-actions-form.php:1001 +#: includes/core/um-actions-form.php:1003 msgid "You must provide lowercase letters." msgstr "" -#: includes/core/um-actions-form.php:1009 +#: includes/core/um-actions-form.php:1011 msgid "You must provide English letters." msgstr "" @@ -10231,34 +10289,34 @@ msgid "You are not allowed to edit this user." msgstr "" #. translators: %s: title. -#: includes/core/um-actions-profile.php:362 +#: includes/core/um-actions-profile.php:363 msgid "Your choosed %s" msgstr "" -#: includes/core/um-actions-profile.php:842 -#: includes/core/um-actions-profile.php:858 -#: includes/core/um-actions-profile.php:929 +#: includes/core/um-actions-profile.php:867 +#: includes/core/um-actions-profile.php:883 +#: includes/core/um-actions-profile.php:954 msgid "Upload a cover photo" msgstr "" -#: includes/core/um-actions-profile.php:842 +#: includes/core/um-actions-profile.php:867 msgid "Change cover photo" msgstr "" -#: includes/core/um-actions-profile.php:1046 +#: includes/core/um-actions-profile.php:1071 msgid "Upload photo" msgstr "" -#: includes/core/um-actions-profile.php:1079 +#: includes/core/um-actions-profile.php:1104 msgid "Remove photo" msgstr "" -#: includes/core/um-actions-profile.php:1280 +#: includes/core/um-actions-profile.php:1305 msgid "Tell us a bit about yourself..." msgstr "" #. translators: %s: profile status. -#: includes/core/um-actions-profile.php:1300 +#: includes/core/um-actions-profile.php:1325 msgid "This user account status is %s" msgstr "" @@ -10275,16 +10333,16 @@ msgid "Invalid Spotify URL" msgstr "" #. translators: %s: date. -#: includes/core/um-filters-fields.php:221 +#: includes/core/um-filters-fields.php:225 msgid "Joined %s" msgstr "" -#: includes/core/um-filters-fields.php:402 +#: includes/core/um-filters-fields.php:406 msgid "Untitled photo" msgstr "" #. translators: %s: link. -#: includes/core/um-filters-fields.php:521 +#: includes/core/um-filters-fields.php:525 msgid "This link leads to a 3rd-party website. Make sure the link is safe and you really want to go to this website: '%s'" msgstr "" @@ -10293,20 +10351,42 @@ msgstr "" msgid "max" msgstr "" -#: includes/core/um-filters-user.php:41 -msgid "Deactivate this account" +#: includes/frontend/class-actions-listener.php:52 +#: includes/frontend/class-user-profile.php:53 +msgid "Super administrators can not be modified." msgstr "" -#: includes/core/um-filters-user.php:45 -msgid "Reactivate this account" +#: includes/frontend/class-actions-listener.php:60 +#: includes/frontend/class-actions-listener.php:76 +#: includes/frontend/class-actions-listener.php:92 +#: includes/frontend/class-actions-listener.php:108 +#: includes/frontend/class-actions-listener.php:124 +#: includes/frontend/class-actions-listener.php:140 +#: includes/frontend/class-actions-listener.php:160 +#: includes/frontend/class-actions-listener.php:169 +msgid "The link you followed has expired." msgstr "" -#: includes/core/um-filters-user.php:50 -msgid "Delete this user" +#: includes/frontend/class-actions-listener.php:64 +#: includes/frontend/class-actions-listener.php:80 +#: includes/frontend/class-actions-listener.php:96 +#: includes/frontend/class-actions-listener.php:112 +#: includes/frontend/class-actions-listener.php:128 +#: includes/frontend/class-actions-listener.php:144 +msgid "You do not have permission to edit this user." msgstr "" -#: includes/core/um-filters-user.php:54 -msgid "Login as this user" +#: includes/frontend/class-actions-listener.php:69 +#: includes/frontend/class-actions-listener.php:85 +#: includes/frontend/class-actions-listener.php:101 +#: includes/frontend/class-actions-listener.php:117 +#: includes/frontend/class-actions-listener.php:133 +#: includes/frontend/class-actions-listener.php:149 +msgid "Something went wrong." +msgstr "" + +#: includes/frontend/class-actions-listener.php:173 +msgid "You do not have permission to delete this user." msgstr "" #. translators: One-time change requires you to reset your password @@ -10323,22 +10403,42 @@ msgstr "" msgid "Your new password cannot be same as old password." msgstr "" +#: includes/frontend/class-users.php:37 +msgid "Reactivate this account" +msgstr "" + +#: includes/frontend/class-users.php:43 +msgid "Resend Activation Email" +msgstr "" + +#: includes/frontend/class-users.php:49 +msgid "Deactivate this account" +msgstr "" + +#: includes/frontend/class-users.php:54 +msgid "Delete this user" +msgstr "" + +#: includes/frontend/class-users.php:58 +msgid "Login as this user" +msgstr "" + #: includes/um-deprecated-functions.php:667 msgid "date submitted" msgstr "" #: includes/um-deprecated-functions.php:673 -#: includes/um-short-functions.php:854 -#: includes/um-short-functions.php:915 +#: includes/um-short-functions.php:853 +#: includes/um-short-functions.php:914 msgid "(empty)" msgstr "" -#: includes/um-short-functions.php:689 +#: includes/um-short-functions.php:688 msgid "User registered date" msgstr "" #. translators: %1$s is a form title; %2$s is a form ID. -#: includes/um-short-functions.php:837 +#: includes/um-short-functions.php:836 msgid "%1$s - Form ID#: %2$s" msgstr "" From 5171a50d5166f23153528f28f993de54a79f4a33 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Fri, 27 Sep 2024 18:17:54 +0300 Subject: [PATCH 44/97] * updated readme.txt --- changelog.txt | 1 + readme.txt | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/changelog.txt b/changelog.txt index 7582eee6..b9c33335 100644 --- a/changelog.txt +++ b/changelog.txt @@ -19,6 +19,7 @@ - Added: `um_restricted_post_content` hook - Added: `um_loggedin_inner_content` hook - Added: `um_profile_dynamic_meta_profile_schema` hook + - Removed: `UM()->fields()->get_restricted_fields_for_edit()` function from a fields loop * Bugfixes: diff --git a/readme.txt b/readme.txt index 87e51e92..0bb3f454 100644 --- a/readme.txt +++ b/readme.txt @@ -185,6 +185,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Added: `um_restricted_post_content` hook * Added: `um_loggedin_inner_content` hook * Added: `um_profile_dynamic_meta_profile_schema` hook +* Removed: `UM()->fields()->get_restricted_fields_for_edit()` function from a fields loop **Bugfixes** @@ -208,20 +209,20 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Deprecated** -Hook: `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. -Hook: `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. -Hook: `um_admin_user_action_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. -Hook: `um_admin_user_action_{$bulk_action}_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. -Hook: `um_admin_custom_hook_{$action}`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. -Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. -Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. -Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. -Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. -Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. -Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. -Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. -Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. -Function: `UM()->files()->format_bytes( $size )`. Use function `UM()->common()->filesystem()::format_bytes( $size )` instead. +* Hook: `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. +* Hook: `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. +* Hook: `um_admin_user_action_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Hook: `um_admin_user_action_{$bulk_action}_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Hook: `um_admin_custom_hook_{$action}`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. +* Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. +* Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. +* Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. +* Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. +* Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. +* Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. +* Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. +* Function: `UM()->files()->format_bytes( $size )`. Use function `UM()->common()->filesystem()::format_bytes( $size )` instead. = 2.8.6 2024-05-22 = From 94ad99892b659c628bcd93e00c23a09c7d51ae03 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:18:24 +0000 Subject: [PATCH 45/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 8024ef10..be2fe5ee 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-27T15:05:38+00:00\n" +"POT-Creation-Date: 2024-09-27T15:18:22+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From 7d69fa50849e4e20ae35801cd29e889030d707da Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 15:32:07 +0300 Subject: [PATCH 46/97] * fixed #1552; --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 0bb3f454..ab511c66 100644 --- a/readme.txt +++ b/readme.txt @@ -217,7 +217,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. * Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. * Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. -* Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. +* Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->send_activation( $user_id, $force )` instead. * Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. * Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. * Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. From d499f1f5d29e2bc46b387765ea68be054e431de4 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:32:30 +0000 Subject: [PATCH 47/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index be2fe5ee..da84f6ee 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-27T15:18:22+00:00\n" +"POT-Creation-Date: 2024-09-30T12:32:27+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From ea316d04748630783f84ef4290ad989ca12a615c Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 17:37:04 +0300 Subject: [PATCH 48/97] * fixed #1553; --- changelog.txt | 6 +- includes/admin/class-actions-listener.php | 2 +- includes/admin/class-users-columns.php | 30 +++-- includes/common/class-users.php | 113 +++++++++---------- includes/frontend/class-actions-listener.php | 2 +- readme.txt | 4 +- 6 files changed, 79 insertions(+), 78 deletions(-) diff --git a/changelog.txt b/changelog.txt index b9c33335..d00d94ef 100644 --- a/changelog.txt +++ b/changelog.txt @@ -51,10 +51,10 @@ - Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. - Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. - Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. - - Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. + - Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->send_activation( $user_id, $force )` instead. - Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. - - Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. - - Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. + - Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id )` instead. + - Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id )` instead. - Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. - Function: `UM()->files()->format_bytes( $size )`. Use function `UM()->common()->filesystem()::format_bytes( $size )` instead. diff --git a/includes/admin/class-actions-listener.php b/includes/admin/class-actions-listener.php index 3877e4ad..fa25877d 100644 --- a/includes/admin/class-actions-listener.php +++ b/includes/admin/class-actions-listener.php @@ -118,7 +118,7 @@ if ( ! class_exists( 'um\admin\Actions_Listener' ) ) { $redirect = wp_get_referer(); if ( UM()->common()->users()->can_current_user_edit_user( $user_id ) ) { - $result = UM()->common()->users()->send_activation( $user_id ); + $result = UM()->common()->users()->send_activation( $user_id, true ); if ( $result ) { $redirect = add_query_arg( array( diff --git a/includes/admin/class-users-columns.php b/includes/admin/class-users-columns.php index 76989262..994fd77f 100644 --- a/includes/admin/class-users-columns.php +++ b/includes/admin/class-users-columns.php @@ -84,8 +84,21 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { ), admin_url( 'users.php' ) ); + $row_actions[] = '' . esc_html__( 'Approve', 'ultimate-member' ) . ''; } + if ( UM()->common()->users()->can_be_rejected( $user_id ) ) { + $url = add_query_arg( + array( + 'um_adm_action' => 'reject_user', + 'uid' => $user_id, + '_wpnonce' => wp_create_nonce( 'reject_user' . $user_id ), + ), + admin_url( 'users.php' ) + ); + + $row_actions[] = '' . esc_html__( 'Reject', 'ultimate-member' ) . ''; + } if ( UM()->common()->users()->can_be_reactivated( $user_id ) ) { $url = add_query_arg( array( @@ -95,6 +108,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { ), admin_url( 'users.php' ) ); + $row_actions[] = '' . esc_html__( 'Reactivate', 'ultimate-member' ) . ''; } if ( UM()->common()->users()->can_be_set_as_pending( $user_id ) ) { @@ -106,6 +120,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { ), admin_url( 'users.php' ) ); + $row_actions[] = '' . esc_html__( 'Put as pending', 'ultimate-member' ) . ''; } if ( UM()->common()->users()->can_activation_send( $user_id ) ) { @@ -117,19 +132,9 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { ), admin_url( 'users.php' ) ); + $row_actions[] = '' . esc_html__( 'Resend activation email', 'ultimate-member' ) . ''; } - if ( UM()->common()->users()->can_be_rejected( $user_id ) ) { - $url = add_query_arg( - array( - 'um_adm_action' => 'reject_user', - 'uid' => $user_id, - '_wpnonce' => wp_create_nonce( 'reject_user' . $user_id ), - ), - admin_url( 'users.php' ) - ); - $row_actions[] = '' . esc_html__( 'Reject', 'ultimate-member' ) . ''; - } if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) { $url = add_query_arg( array( @@ -139,6 +144,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { ), admin_url( 'users.php' ) ); + $row_actions[] = '' . esc_html__( 'Deactivate', 'ultimate-member' ) . ''; } @@ -495,7 +501,7 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { case 'um_resend_activation': $email_pending_count = 0; foreach ( $users as $user_id ) { - $res = UM()->common()->users()->send_activation( $user_id ); + $res = UM()->common()->users()->send_activation( $user_id, true ); if ( $res ) { ++$email_pending_count; } diff --git a/includes/common/class-users.php b/includes/common/class-users.php index f889b27d..c3a7988c 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -321,6 +321,8 @@ class Users { } /** + * Activation can be sent everytime for every user. Even force for current user. + * * @param int $user_id User ID. * @param bool $force If true - ignore current user condition. * @@ -338,8 +340,7 @@ class Users { return false; }*/ - $status = $this->get_status( $user_id ); - return 'awaiting_admin_review' !== $status; + return true; } /** @@ -365,8 +366,8 @@ class Users { $result = $this->set_status( $user_id, 'awaiting_email_confirmation' ); - // It's `false` on failure or if the user already has rejected status. - if ( false !== $result ) { + // It's `false` on failure or if `$force` and the user already has `awaiting_email_confirmation` status. + if ( false !== $result || ( $force && $this->has_status( $user_id, 'awaiting_email_confirmation' ) ) ) { // Clear all sessions for email confirmation pending users self::destroy_all_sessions( $user_id ); @@ -375,11 +376,15 @@ class Users { $userdata = get_userdata( $user_id ); + $current_user_id = get_current_user_id(); + um_fetch_user( $user_id ); + add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) ); add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) ); UM()->mail()->send( $userdata->user_email, 'checkmail_email' ); + um_fetch_user( $current_user_id ); /** * Fires after User has been set as pending email confirmation. * @@ -397,16 +402,13 @@ class Users { /** * @param int $user_id User ID. - * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_deactivated( $user_id, $force = false ) { - if ( ! $force ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; - } + public function can_be_deactivated( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; } /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { @@ -414,27 +416,17 @@ class Users { }*/ $status = $this->get_status( $user_id ); - if ( 'inactive' === $status ) { - // Break if the user already approved - return false; - } - - if ( 'approved' !== $status ) { - // Break if the user already doesn't approved yet - return false; - } - - return true; + // Break only if the user already approved + return 'inactive' !== $status; } /** * @param int $user_id User ID. - * @param bool $force If true - ignore current user condition. * * @return bool */ - public function deactivate( $user_id, $force = false ) { - if ( ! $this->can_be_deactivated( $user_id, $force ) ) { + public function deactivate( $user_id ) { + if ( ! $this->can_be_deactivated( $user_id ) ) { return false; } @@ -455,6 +447,8 @@ class Users { // Clear all sessions for inactive users self::destroy_all_sessions( $user_id ); + $this->reset_activation_link( $user_id ); + $userdata = get_userdata( $user_id ); UM()->mail()->send( $userdata->user_email, 'inactive_email' ); @@ -474,17 +468,16 @@ class Users { } /** - * @param int $user_id User ID. - * @param bool $force If true - ignore current user condition. + * User can be rejected only after awaiting admin review status. + * + * @param int $user_id User ID. * * @return bool */ - public function can_be_rejected( $user_id, $force = false ) { - if ( ! $force ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; - } + public function can_be_rejected( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; } /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { @@ -492,29 +485,20 @@ class Users { }*/ $status = $this->get_status( $user_id ); - if ( 'rejected' === $status ) { - // Break if the user already rejected - return false; - } - if ( 'approved' !== $status ) { - // Break if the user already doesn't approved yet - return false; - } - - return true; + // User can be rejected only after awaiting admin review status + return 'awaiting_admin_review' === $status; } /** * Reject user membership. * * @param int $user_id User ID. - * @param bool $force If true - ignore current user condition. * * @return bool */ - public function reject( $user_id, $force = false ) { - if ( ! $this->can_be_rejected( $user_id, $force ) ) { + public function reject( $user_id ) { + if ( ! $this->can_be_rejected( $user_id ) ) { return false; } @@ -535,6 +519,8 @@ class Users { // Clear all sessions for rejected users self::destroy_all_sessions( $user_id ); + $this->reset_activation_link( $user_id ); + $userdata = get_userdata( $user_id ); UM()->mail()->send( $userdata->user_email, 'rejected_email' ); @@ -554,7 +540,7 @@ class Users { } /** - * Check if the user can be set as pending admin review. + * Check if the user can be set as pending admin review. Cannot set the same status but any user can be set to pending admin review. * * @param int $user_id User ID. * @param bool $force If true - ignore current user condition. @@ -607,6 +593,8 @@ class Users { // Clear all sessions for awaiting admin confirmation users self::destroy_all_sessions( $user_id ); + $this->reset_activation_link( $user_id ); + $userdata = get_userdata( $user_id ); UM()->mail()->send( $userdata->user_email, 'pending_email' ); @@ -626,7 +614,7 @@ class Users { } /** - * Check if the user can be approved. + * Check if the user can be approved. Any user with status that isn't equal to `approved` can be approved. * * @param int $user_id User ID. * @param bool $force If true - ignore current user condition. @@ -689,11 +677,15 @@ class Users { $this->maybe_generate_password_reset_key( $userdata ); } + $current_user_id = get_current_user_id(); + um_fetch_user( $user_id ); + add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); UM()->mail()->send( $userdata->user_email, $email_slug ); + um_fetch_user( $current_user_id ); /** * Fires after User has been approved. * @@ -710,17 +702,16 @@ class Users { } /** + * Reactivated can be only `inactive` user. + * * @param int $user_id User ID. - * @param bool $force If true - ignore current user condition. * * @return bool */ - public function can_be_reactivated( $user_id, $force = false ) { - if ( ! $force ) { - $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { - return false; - } + public function can_be_reactivated( $user_id ) { + $current_user_id = get_current_user_id(); + if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + return false; } /*if ( ! $this->can_current_user_edit_user( $user_id ) ) { @@ -734,14 +725,13 @@ class Users { /** * Reactivate user. * - * @param int $user_id User ID. - * @param bool $force If true - ignore current user condition. + * @param int $user_id User ID. * * @return bool `true` if the user has been reactivated * `false` on failure or if the user already has approved status. */ - public function reactivate( $user_id, $force = false ) { - if ( ! $this->can_be_reactivated( $user_id, $force ) ) { + public function reactivate( $user_id ) { + if ( ! $this->can_be_reactivated( $user_id ) ) { return false; } @@ -764,11 +754,16 @@ class Users { $userdata = get_userdata( $user_id ); + $current_user_id = get_current_user_id(); + um_fetch_user( $user_id ); + add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) ); add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) ); UM()->mail()->send( $userdata->user_email, 'welcome_email' ); + um_fetch_user( $current_user_id ); + /** * Fires after User has been reactivated. * diff --git a/includes/frontend/class-actions-listener.php b/includes/frontend/class-actions-listener.php index 389f7a21..3094259f 100644 --- a/includes/frontend/class-actions-listener.php +++ b/includes/frontend/class-actions-listener.php @@ -112,7 +112,7 @@ if ( ! class_exists( 'um\frontend\Actions_Listener' ) ) { wp_die( esc_html__( 'You do not have permission to edit this user.', 'ultimate-member' ) ); } - $result = UM()->common()->users()->send_activation( $user_id ); + $result = UM()->common()->users()->send_activation( $user_id, true ); if ( ! $result ) { wp_die( esc_html__( 'Something went wrong.', 'ultimate-member' ) ); } diff --git a/readme.txt b/readme.txt index ab511c66..5249b73b 100644 --- a/readme.txt +++ b/readme.txt @@ -219,8 +219,8 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. * Function: `UM()->user()->email_pending()`. Use function `UM()->common()->users()->send_activation( $user_id, $force )` instead. * Function: `UM()->user()->pending()`. Use function `UM()->common()->users()->set_as_pending( $user_id, $force )` instead. -* Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id, $force )` instead. -* Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id, $force )` instead. +* Function: `UM()->user()->reject()`. Use function `UM()->common()->users()->reject( $user_id )` instead. +* Function: `UM()->user()->deactivate()`. Use function `UM()->common()->users()->deactivate( $user_id )` instead. * Function: `UM()->user()->user_exists_by_id( $user_id )`. Use function `UM()->common()->users()::user_exists( $user_id )` instead. * Function: `UM()->files()->format_bytes( $size )`. Use function `UM()->common()->filesystem()::format_bytes( $size )` instead. From 158f1a1193a610c77b23f74ac824772c0099793e Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:38:13 +0000 Subject: [PATCH 49/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 62 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index da84f6ee..0b056081 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T12:32:27+00:00\n" +"POT-Creation-Date: 2024-09-30T14:38:10+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" @@ -18,7 +18,7 @@ msgstr "" #. Author of the plugin #: ultimate-member.php #: includes/admin/class-site-health.php:292 -#: includes/admin/class-users-columns.php:311 +#: includes/admin/class-users-columns.php:317 #: includes/admin/core/class-admin-menu.php:183 #: includes/core/class-user.php:1060 msgid "Ultimate Member" @@ -1995,79 +1995,79 @@ msgstr "" msgid "Status" msgstr "" -#: includes/admin/class-users-columns.php:87 +#: includes/admin/class-users-columns.php:88 msgid "Approve" msgstr "" -#: includes/admin/class-users-columns.php:98 -#: includes/admin/class-users-columns.php:270 -msgid "Reactivate" -msgstr "" - -#: includes/admin/class-users-columns.php:109 -msgid "Put as pending" -msgstr "" - -#: includes/admin/class-users-columns.php:120 -msgid "Resend activation email" -msgstr "" - -#: includes/admin/class-users-columns.php:131 +#: includes/admin/class-users-columns.php:100 msgid "Are you sure you want to reject this user membership?" msgstr "" -#: includes/admin/class-users-columns.php:131 +#: includes/admin/class-users-columns.php:100 msgid "Reject" msgstr "" -#: includes/admin/class-users-columns.php:142 +#: includes/admin/class-users-columns.php:112 +#: includes/admin/class-users-columns.php:276 +msgid "Reactivate" +msgstr "" + +#: includes/admin/class-users-columns.php:124 +msgid "Put as pending" +msgstr "" + +#: includes/admin/class-users-columns.php:136 +msgid "Resend activation email" +msgstr "" + +#: includes/admin/class-users-columns.php:148 msgid "Are you sure you want to deactivate this user?" msgstr "" -#: includes/admin/class-users-columns.php:142 -#: includes/admin/class-users-columns.php:269 +#: includes/admin/class-users-columns.php:148 +#: includes/admin/class-users-columns.php:275 msgid "Deactivate" msgstr "" -#: includes/admin/class-users-columns.php:226 +#: includes/admin/class-users-columns.php:232 #: templates/account.php:61 #: templates/account.php:102 msgid "View profile" msgstr "" -#: includes/admin/class-users-columns.php:232 +#: includes/admin/class-users-columns.php:238 msgid "Info" msgstr "" -#: includes/admin/class-users-columns.php:265 +#: includes/admin/class-users-columns.php:271 #: includes/frontend/class-users.php:34 msgid "Approve Membership" msgstr "" -#: includes/admin/class-users-columns.php:266 +#: includes/admin/class-users-columns.php:272 #: includes/frontend/class-users.php:46 msgid "Reject Membership" msgstr "" -#: includes/admin/class-users-columns.php:267 +#: includes/admin/class-users-columns.php:273 #: includes/frontend/class-users.php:40 msgid "Put as Pending Review" msgstr "" -#: includes/admin/class-users-columns.php:268 +#: includes/admin/class-users-columns.php:274 msgid "Resend Activation E-mail" msgstr "" -#: includes/admin/class-users-columns.php:353 -#: includes/admin/class-users-columns.php:355 +#: includes/admin/class-users-columns.php:359 +#: includes/admin/class-users-columns.php:361 msgid "All Statuses" msgstr "" -#: includes/admin/class-users-columns.php:365 +#: includes/admin/class-users-columns.php:371 msgid "Filter" msgstr "" -#: includes/admin/class-users-columns.php:398 +#: includes/admin/class-users-columns.php:404 msgid "You do not have enough permissions to do that." msgstr "" From 5791a1712500a10aea5d6483266ee565d7c399ad Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 17:44:38 +0300 Subject: [PATCH 50/97] * updated changelog.txt; * updated readme.txt; --- changelog.txt | 24 ++++++++++++------------ readme.txt | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/changelog.txt b/changelog.txt index d00d94ef..6bd8a13e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -12,13 +12,13 @@ - Added: ProfilePage Structured Data - Added: Ability to use HTML tags (allowed in `wp_kses_post`) in the global block restriction message - Changed: Some wp-admin fields descriptions - - Updated: Data format in `um_admin_bulk_user_actions_hook` hook. Changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` - - Added: `$old_status` param to `um_after_user_status_is_changed` hook - - Added: `$user_id` param to `um_before_user_hash_is_changed` hook - - Added: `$user_id, $hash, $expiration` params to `um_after_user_hash_is_changed` hook - - Added: `um_restricted_post_content` hook - - Added: `um_loggedin_inner_content` hook - - Added: `um_profile_dynamic_meta_profile_schema` hook + - Updated: Data format in `um_admin_bulk_user_actions_hook` filter hook. Changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` + - Added: `$old_status` param to `um_after_user_status_is_changed` action hook + - Added: `$user_id` param to `um_before_user_hash_is_changed` action hook + - Added: `$user_id, $hash, $expiration` params to `um_after_user_hash_is_changed` action hook + - Added: `um_restricted_post_content` filter hook + - Added: `um_loggedin_inner_content` filter hook + - Added: `um_profile_dynamic_meta_profile_schema` filter hook - Removed: `UM()->fields()->get_restricted_fields_for_edit()` function from a fields loop * Bugfixes: @@ -43,11 +43,11 @@ * Deprecated: - - Hook: `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. - - Hook: `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. - - Hook: `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - - Hook: `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - - Hook: `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Hook: Action hook `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. + - Hook: Action hook `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. + - Hook: Action hook `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Hook: Action hook `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Hook: Action hook `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. - Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. - Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. diff --git a/readme.txt b/readme.txt index 5249b73b..72548329 100644 --- a/readme.txt +++ b/readme.txt @@ -178,13 +178,13 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Added: ProfilePage Structured Data * Added: Ability to use HTML tags (allowed in `wp_kses_post`) in the global block restriction message * Changed: Some wp-admin fields descriptions -* Updated: Data format in `um_admin_bulk_user_actions_hook` hook. Changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` -* Added: `$old_status` param to `um_after_user_status_is_changed` hook -* Added: `$user_id` param to `um_before_user_hash_is_changed` hook -* Added: `$user_id, $hash, $expiration` params to `um_after_user_hash_is_changed` hook -* Added: `um_restricted_post_content` hook -* Added: `um_loggedin_inner_content` hook -* Added: `um_profile_dynamic_meta_profile_schema` hook +* Updated: Data format in `um_admin_bulk_user_actions_hook` filter hook. Changed format from `$action_slug => array( 'label' => $action_title )` to `$action_slug => $action_title` +* Added: `$old_status` param to `um_after_user_status_is_changed` action hook +* Added: `$user_id` param to `um_before_user_hash_is_changed` action hook +* Added: `$user_id, $hash, $expiration` params to `um_after_user_hash_is_changed` action hook +* Added: `um_restricted_post_content` filter hook +* Added: `um_loggedin_inner_content` filter hook +* Added: `um_profile_dynamic_meta_profile_schema` filter hook * Removed: `UM()->fields()->get_restricted_fields_for_edit()` function from a fields loop **Bugfixes** @@ -209,11 +209,11 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI **Deprecated** -* Hook: `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. -* Hook: `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. -* Hook: `um_admin_user_action_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. -* Hook: `um_admin_user_action_{$bulk_action}_hook`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. -* Hook: `um_admin_custom_hook_{$action}`. Use action hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Hook: Action hook `um_after_user_status_is_changed_hook`. Use action hook `um_after_user_status_is_changed` instead. +* Hook: Action hook `um_when_status_is_set`. Use action hook `um_before_user_status_is_set` instead. +* Hook: Action hook `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Hook: Action hook `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Hook: Action hook `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. * Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. * Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. * Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. From 6dfe9cc044a5853aa7bdc2e405de1126017d4793 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:49:09 +0000 Subject: [PATCH 51/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 0b056081..929f51d6 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T14:38:10+00:00\n" +"POT-Creation-Date: 2024-09-30T14:49:07+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From e5bfdc2dae12e40de631a4602e51515284e01c35 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 17:54:20 +0300 Subject: [PATCH 52/97] * small fix for CSS of multi-checkbox fields in wp-admin; --- assets/css/admin/forms.css | 6 ++++++ assets/css/admin/forms.min.css | 2 +- assets/css/admin/forms.sass | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/assets/css/admin/forms.css b/assets/css/admin/forms.css index 6001b47d..57d170d1 100644 --- a/assets/css/admin/forms.css +++ b/assets/css/admin/forms.css @@ -307,6 +307,12 @@ input[type=number].um-forms-field { } .um-form-fields-section { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; + row-gap: 4px; float: left; clear: none; margin: 0; diff --git a/assets/css/admin/forms.min.css b/assets/css/admin/forms.min.css index 38a45e6c..5e095bd0 100644 --- a/assets/css/admin/forms.min.css +++ b/assets/css/admin/forms.min.css @@ -1 +1 @@ -.um-form-table .um-forms-line[data-conditional]{display:none}.um-form-table .um-forms-line label .um-req{color:#a00;margin:0 0 0 3px;font-weight:400}.um-form-table .um-forms-line .um-text-delete{color:#a00;float:left}.um-form-table .um-forms-line .um-text-delete:hover{color:red}.um-form-table .um-forms-line .um-multi-text-add-option{margin-bottom:14px}.um-form-table .um-forms-line .icon_preview{display:none;max-width:200px;max-height:200px;padding:5px;cursor:pointer;border:1px solid #e3e3e3;background:#f7f7f7;border-radius:3px;height:auto;width:auto!important}.um-form-table .um-forms-line td .um-same-page-update-wrapper{display:none;margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update{margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log{margin:7px 0 0 0;width:100%;height:150px;overflow:auto;border:1px solid #a1a1a1}.um-form-table .um-forms-line[data-field_type=same_page_update]{vertical-align:baseline}.um-form-table .um-forms-line[data-field_type=same_page_update] td,.um-form-table .um-forms-line[data-field_type=same_page_update] th{vertical-align:baseline}.um-form-table.um-third-column .um-forms-line th{width:33%}.um-form-table.um-half-column .um-forms-line th{width:50%}.um-form-table.um-two-thirds-column .um-forms-line th{width:83%}.um-form-table.um-top-label .um-forms-line td{padding:0 0 15px 0}.um-form-table.um-top-label .um-forms-line td label{margin:0 0 5px 0;display:inline-block}.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label{width:100%;display:block;margin:0 0 5px 0}.um-external-link-icon{width:1em;height:1em;margin:0;vertical-align:middle;fill:currentcolor}.um_admin_fonticon_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um_admin_fonticon_wrapper .um-admin-icon-value{line-height:1}.um_admin_fonticon_wrapper .um-admin-icon-value i{top:0}input[type=date].um-forms-field,input[type=number].um-forms-field,input[type=password].um-forms-field,input[type=text].um-forms-field,input[type=time].um-forms-field,input[type=url].um-forms-field,select.um-forms-field,textarea.um-forms-field{box-sizing:border-box}input[type=date].um-forms-field.um-long-field,input[type=number].um-forms-field.um-long-field,input[type=password].um-forms-field.um-long-field,input[type=text].um-forms-field.um-long-field,input[type=time].um-forms-field.um-long-field,input[type=url].um-forms-field.um-long-field,select.um-forms-field.um-long-field,textarea.um-forms-field.um-long-field{width:100%!important}input[type=date].um-forms-field.um-medium-field,input[type=number].um-forms-field.um-medium-field,input[type=password].um-forms-field.um-medium-field,input[type=text].um-forms-field.um-medium-field,input[type=time].um-forms-field.um-medium-field,input[type=url].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:50%!important}input[type=date].um-forms-field.um-small-field,input[type=number].um-forms-field.um-small-field,input[type=password].um-forms-field.um-small-field,input[type=text].um-forms-field.um-small-field,input[type=time].um-forms-field.um-small-field,input[type=url].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:25%!important}input[type=number].um-forms-field{padding-right:0}.um-md-default-filters-list,.um-multi-selects-list,.um-multi-text-list{float:left;width:100%;margin:0 0 10px 0}.um-hidden-md-default-filters,.um-hidden-multi-selects,.um-hidden-multi-text{display:none!important}.um-md-default-filters-option-line{float:left;width:100%;clear:both;border-bottom:1px solid #eee;padding:0 0 5px 0;margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2.um{margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-md-default-filters-option-line .um-field-wrapper2>select{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter{width:calc(50% - 7px)!important;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter:first-child,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter:first-child{margin-right:11px}.um-md-default-filters-option-line .um-field-wrapper2 .um-slider{margin:5px 9px 0 9px;width:calc(100% - 18px);box-sizing:border-box;display:block}.um-md-default-filters-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-selects-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-selects-option-line.um-admin-drag-fld{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;background:0 0;border:none}.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper{width:calc(100% - 90px)}.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon{float:left;width:20px;text-align:left;line-height:30px}.um-multi-selects-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields{margin:5px 0 0 0}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label{float:left;width:100%;line-height:30px;box-sizing:border-box;margin:0!important;padding:0!important;font-weight:700;display:flex;flex-direction:row;justify-content:space-beetween;align-items:baseline;flex-wrap:nowrap}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text],.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select{width:auto;display:inline;font-weight:400;max-width:70%;flex:.9}.um-multi-selects-option-line .um-field-wrapper input,.um-multi-selects-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-selects-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-text-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-text-option-line .um-field-wrapper{float:left;width:calc(100% - 90px);line-height:30px;box-sizing:border-box}.um-multi-text-option-line .um-field-wrapper input,.um-multi-text-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-text-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-form-fields-section{float:left;clear:none;margin:0;padding:0 10px 0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-form-fields-section label{float:left;width:100%;margin:0;padding:0}.um-form-fields-section label input{float:left;margin-top:0}.um-form-fields-section label span{float:left;width:calc(100% - 20px)}@media screen and (max-width:782px){input[type=text].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:100%!important}input[type=text].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:50%!important}.um-form-fields-section{width:100%!important}.um-admin-metabox .um-form-fields-section label{line-height:22px!important;margin:0 0 12px 0!important}.um-admin-metabox .um-form-fields-section label span{width:calc(100% - 30px)}.um-multi-selects-option-line,.um-multi-text-option-line{margin:0 0 6px 0}.um-forms-line label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line th,.um-form-table.um-third-column .um-forms-line th,.um-form-table.um-two-thirds-column .um-forms-line th{float:left;width:100%;margin-bottom:5px}.um-form-table.um-half-column .um-forms-line th label,.um-form-table.um-third-column .um-forms-line th label,.um-form-table.um-two-thirds-column .um-forms-line th label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line td,.um-form-table.um-third-column .um-forms-line td,.um-form-table.um-two-thirds-column .um-forms-line td{float:left;width:100%}}.um-sortable-items-field .um-sortable-item{cursor:move!important;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:1px solid #7e8993;border-radius:4px;-moz-border-radius:4px;background:#fff;height:42px;line-height:28px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-sortable-items-field .um-sortable-item.um-hidden-item{display:none}.um-sortable-items-field .um-sortable-item .um-field-icon{width:20px;text-align:left;margin:0 10px 0 0}.wp-picker-container input.wp-color-picker[type=text]{width:68px!important;float:left!important;padding:2px 4px!important;border-width:1px!important}span.um-admin-icon-value{margin:0 10px;font-size:13px}span.um-admin-icon-value i{font-size:28px;color:#0085ba;position:relative;top:5px}span.um-admin-icon-clear{display:none;cursor:pointer;position:relative;color:#ccc}span.um-admin-icon-clear.show{display:inline-block}span.um-admin-icon-clear:hover{color:#777}span.um-admin-icon-clear i{font-size:20px;vertical-align:middle} \ No newline at end of file +.um-form-table .um-forms-line[data-conditional]{display:none}.um-form-table .um-forms-line label .um-req{color:#a00;margin:0 0 0 3px;font-weight:400}.um-form-table .um-forms-line .um-text-delete{color:#a00;float:left}.um-form-table .um-forms-line .um-text-delete:hover{color:red}.um-form-table .um-forms-line .um-multi-text-add-option{margin-bottom:14px}.um-form-table .um-forms-line .icon_preview{display:none;max-width:200px;max-height:200px;padding:5px;cursor:pointer;border:1px solid #e3e3e3;background:#f7f7f7;border-radius:3px;height:auto;width:auto!important}.um-form-table .um-forms-line td .um-same-page-update-wrapper{display:none;margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update{margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log{margin:7px 0 0 0;width:100%;height:150px;overflow:auto;border:1px solid #a1a1a1}.um-form-table .um-forms-line[data-field_type=same_page_update]{vertical-align:baseline}.um-form-table .um-forms-line[data-field_type=same_page_update] td,.um-form-table .um-forms-line[data-field_type=same_page_update] th{vertical-align:baseline}.um-form-table.um-third-column .um-forms-line th{width:33%}.um-form-table.um-half-column .um-forms-line th{width:50%}.um-form-table.um-two-thirds-column .um-forms-line th{width:83%}.um-form-table.um-top-label .um-forms-line td{padding:0 0 15px 0}.um-form-table.um-top-label .um-forms-line td label{margin:0 0 5px 0;display:inline-block}.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label{width:100%;display:block;margin:0 0 5px 0}.um-external-link-icon{width:1em;height:1em;margin:0;vertical-align:middle;fill:currentcolor}.um_admin_fonticon_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um_admin_fonticon_wrapper .um-admin-icon-value{line-height:1}.um_admin_fonticon_wrapper .um-admin-icon-value i{top:0}input[type=date].um-forms-field,input[type=number].um-forms-field,input[type=password].um-forms-field,input[type=text].um-forms-field,input[type=time].um-forms-field,input[type=url].um-forms-field,select.um-forms-field,textarea.um-forms-field{box-sizing:border-box}input[type=date].um-forms-field.um-long-field,input[type=number].um-forms-field.um-long-field,input[type=password].um-forms-field.um-long-field,input[type=text].um-forms-field.um-long-field,input[type=time].um-forms-field.um-long-field,input[type=url].um-forms-field.um-long-field,select.um-forms-field.um-long-field,textarea.um-forms-field.um-long-field{width:100%!important}input[type=date].um-forms-field.um-medium-field,input[type=number].um-forms-field.um-medium-field,input[type=password].um-forms-field.um-medium-field,input[type=text].um-forms-field.um-medium-field,input[type=time].um-forms-field.um-medium-field,input[type=url].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:50%!important}input[type=date].um-forms-field.um-small-field,input[type=number].um-forms-field.um-small-field,input[type=password].um-forms-field.um-small-field,input[type=text].um-forms-field.um-small-field,input[type=time].um-forms-field.um-small-field,input[type=url].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:25%!important}input[type=number].um-forms-field{padding-right:0}.um-md-default-filters-list,.um-multi-selects-list,.um-multi-text-list{float:left;width:100%;margin:0 0 10px 0}.um-hidden-md-default-filters,.um-hidden-multi-selects,.um-hidden-multi-text{display:none!important}.um-md-default-filters-option-line{float:left;width:100%;clear:both;border-bottom:1px solid #eee;padding:0 0 5px 0;margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2.um{margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-md-default-filters-option-line .um-field-wrapper2>select{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter{width:calc(50% - 7px)!important;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter:first-child,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter:first-child{margin-right:11px}.um-md-default-filters-option-line .um-field-wrapper2 .um-slider{margin:5px 9px 0 9px;width:calc(100% - 18px);box-sizing:border-box;display:block}.um-md-default-filters-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-selects-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-selects-option-line.um-admin-drag-fld{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;background:0 0;border:none}.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper{width:calc(100% - 90px)}.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon{float:left;width:20px;text-align:left;line-height:30px}.um-multi-selects-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields{margin:5px 0 0 0}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label{float:left;width:100%;line-height:30px;box-sizing:border-box;margin:0!important;padding:0!important;font-weight:700;display:flex;flex-direction:row;justify-content:space-beetween;align-items:baseline;flex-wrap:nowrap}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text],.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select{width:auto;display:inline;font-weight:400;max-width:70%;flex:.9}.um-multi-selects-option-line .um-field-wrapper input,.um-multi-selects-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-selects-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-text-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-text-option-line .um-field-wrapper{float:left;width:calc(100% - 90px);line-height:30px;box-sizing:border-box}.um-multi-text-option-line .um-field-wrapper input,.um-multi-text-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-text-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-form-fields-section{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;row-gap:4px;float:left;clear:none;margin:0;padding:0 10px 0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-form-fields-section label{float:left;width:100%;margin:0;padding:0}.um-form-fields-section label input{float:left;margin-top:0}.um-form-fields-section label span{float:left;width:calc(100% - 20px)}@media screen and (max-width:782px){input[type=text].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:100%!important}input[type=text].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:50%!important}.um-form-fields-section{width:100%!important}.um-admin-metabox .um-form-fields-section label{line-height:22px!important;margin:0 0 12px 0!important}.um-admin-metabox .um-form-fields-section label span{width:calc(100% - 30px)}.um-multi-selects-option-line,.um-multi-text-option-line{margin:0 0 6px 0}.um-forms-line label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line th,.um-form-table.um-third-column .um-forms-line th,.um-form-table.um-two-thirds-column .um-forms-line th{float:left;width:100%;margin-bottom:5px}.um-form-table.um-half-column .um-forms-line th label,.um-form-table.um-third-column .um-forms-line th label,.um-form-table.um-two-thirds-column .um-forms-line th label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line td,.um-form-table.um-third-column .um-forms-line td,.um-form-table.um-two-thirds-column .um-forms-line td{float:left;width:100%}}.um-sortable-items-field .um-sortable-item{cursor:move!important;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:1px solid #7e8993;border-radius:4px;-moz-border-radius:4px;background:#fff;height:42px;line-height:28px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-sortable-items-field .um-sortable-item.um-hidden-item{display:none}.um-sortable-items-field .um-sortable-item .um-field-icon{width:20px;text-align:left;margin:0 10px 0 0}.wp-picker-container input.wp-color-picker[type=text]{width:68px!important;float:left!important;padding:2px 4px!important;border-width:1px!important}span.um-admin-icon-value{margin:0 10px;font-size:13px}span.um-admin-icon-value i{font-size:28px;color:#0085ba;position:relative;top:5px}span.um-admin-icon-clear{display:none;cursor:pointer;position:relative;color:#ccc}span.um-admin-icon-clear.show{display:inline-block}span.um-admin-icon-clear:hover{color:#777}span.um-admin-icon-clear i{font-size:20px;vertical-align:middle} \ No newline at end of file diff --git a/assets/css/admin/forms.sass b/assets/css/admin/forms.sass index b74f1ef5..3eec9d02 100644 --- a/assets/css/admin/forms.sass +++ b/assets/css/admin/forms.sass @@ -278,6 +278,8 @@ input[type="number"] .#{$prefix}form-fields-section + +flex( column, flex-start, stretch, nowrap ) + row-gap: 4px float: left clear: none margin: 0 From 88aaf5efd8a947f40d795ade15d7ca910fb38752 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 14:55:27 +0000 Subject: [PATCH 53/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 929f51d6..883c682c 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T14:49:07+00:00\n" +"POT-Creation-Date: 2024-09-30T14:55:24+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From 09bc57ee57bdd5040fe2258a699a84761d8bbce7 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 18:01:07 +0300 Subject: [PATCH 54/97] * changed the place of reject link in the User Profile page dropdown; --- includes/frontend/class-users.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/frontend/class-users.php b/includes/frontend/class-users.php index 585cbcd9..b9257d94 100644 --- a/includes/frontend/class-users.php +++ b/includes/frontend/class-users.php @@ -33,6 +33,9 @@ class Users { if ( UM()->common()->users()->can_be_approved( $user_id ) ) { $actions['approve_user'] = array( 'label' => __( 'Approve Membership', 'ultimate-member' ) ); } + if ( UM()->common()->users()->can_be_rejected( $user_id ) ) { + $actions['reject_user'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); + } if ( UM()->common()->users()->can_be_reactivated( $user_id ) ) { $actions['reactivate_user'] = array( 'label' => __( 'Reactivate this account', 'ultimate-member' ) ); } @@ -42,9 +45,6 @@ class Users { if ( UM()->common()->users()->can_activation_send( $user_id ) ) { $actions['resend_user_activation'] = array( 'label' => __( 'Resend Activation Email', 'ultimate-member' ) ); } - if ( UM()->common()->users()->can_be_rejected( $user_id ) ) { - $actions['reject_user'] = array( 'label' => __( 'Reject Membership', 'ultimate-member' ) ); - } if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) { $actions['deactivate_user'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) ); } From 67ea63168115efd009f62f1c40c913304a4d78eb Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 15:02:01 +0000 Subject: [PATCH 55/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 883c682c..626e9706 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T14:55:24+00:00\n" +"POT-Creation-Date: 2024-09-30T15:01:59+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" @@ -2045,12 +2045,12 @@ msgid "Approve Membership" msgstr "" #: includes/admin/class-users-columns.php:272 -#: includes/frontend/class-users.php:46 +#: includes/frontend/class-users.php:37 msgid "Reject Membership" msgstr "" #: includes/admin/class-users-columns.php:273 -#: includes/frontend/class-users.php:40 +#: includes/frontend/class-users.php:43 msgid "Put as Pending Review" msgstr "" @@ -10403,11 +10403,11 @@ msgstr "" msgid "Your new password cannot be same as old password." msgstr "" -#: includes/frontend/class-users.php:37 +#: includes/frontend/class-users.php:40 msgid "Reactivate this account" msgstr "" -#: includes/frontend/class-users.php:43 +#: includes/frontend/class-users.php:46 msgid "Resend Activation Email" msgstr "" From 6f9be57495f793511e6616da9a13a7dfc6a482ab Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 23:10:15 +0300 Subject: [PATCH 56/97] * updated statuses logic; --- includes/admin/class-users-columns.php | 7 ++++++- includes/common/class-users.php | 2 +- includes/frontend/class-users.php | 6 +++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/includes/admin/class-users-columns.php b/includes/admin/class-users-columns.php index 994fd77f..d6d3c22b 100644 --- a/includes/admin/class-users-columns.php +++ b/includes/admin/class-users-columns.php @@ -133,7 +133,12 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { admin_url( 'users.php' ) ); - $row_actions[] = '' . esc_html__( 'Resend activation email', 'ultimate-member' ) . ''; + $title = __( 'Send activation email', 'ultimate-member' ); + if ( UM()->common()->users()->has_status( $user_id, 'awaiting_email_confirmation' ) ) { + $title = __( 'Resend activation email', 'ultimate-member' ); + } + + $row_actions[] = '' . esc_html( $title ) . ''; } if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) { $url = add_query_arg( diff --git a/includes/common/class-users.php b/includes/common/class-users.php index c3a7988c..ef97d5a1 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -634,7 +634,7 @@ class Users { }*/ $status = $this->get_status( $user_id ); - return 'approved' !== $status; + return 'approved' !== $status && 'inactive' !== $status; // inactive can be only reactivated } /** diff --git a/includes/frontend/class-users.php b/includes/frontend/class-users.php index b9257d94..58c93dcd 100644 --- a/includes/frontend/class-users.php +++ b/includes/frontend/class-users.php @@ -43,7 +43,11 @@ class Users { $actions['put_user_as_pending'] = array( 'label' => __( 'Put as Pending Review', 'ultimate-member' ) ); } if ( UM()->common()->users()->can_activation_send( $user_id ) ) { - $actions['resend_user_activation'] = array( 'label' => __( 'Resend Activation Email', 'ultimate-member' ) ); + $title = __( 'Send activation email', 'ultimate-member' ); + if ( UM()->common()->users()->has_status( $user_id, 'awaiting_email_confirmation' ) ) { + $title = __( 'Resend activation email', 'ultimate-member' ); + } + $actions['resend_user_activation'] = array( 'label' => $title ); } if ( UM()->common()->users()->can_be_deactivated( $user_id ) ) { $actions['deactivate_user'] = array( 'label' => __( 'Deactivate this account', 'ultimate-member' ) ); From b767e046186d5c6b3549f04929c2ae73b5971053 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:11:37 +0000 Subject: [PATCH 57/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 48 ++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 626e9706..f6315d20 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T15:01:59+00:00\n" +"POT-Creation-Date: 2024-09-30T20:11:34+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" @@ -18,7 +18,7 @@ msgstr "" #. Author of the plugin #: ultimate-member.php #: includes/admin/class-site-health.php:292 -#: includes/admin/class-users-columns.php:317 +#: includes/admin/class-users-columns.php:322 #: includes/admin/core/class-admin-menu.php:183 #: includes/core/class-user.php:1060 msgid "Ultimate Member" @@ -2008,7 +2008,7 @@ msgid "Reject" msgstr "" #: includes/admin/class-users-columns.php:112 -#: includes/admin/class-users-columns.php:276 +#: includes/admin/class-users-columns.php:281 msgid "Reactivate" msgstr "" @@ -2017,57 +2017,63 @@ msgid "Put as pending" msgstr "" #: includes/admin/class-users-columns.php:136 +#: includes/frontend/class-users.php:46 +msgid "Send activation email" +msgstr "" + +#: includes/admin/class-users-columns.php:138 +#: includes/frontend/class-users.php:48 msgid "Resend activation email" msgstr "" -#: includes/admin/class-users-columns.php:148 +#: includes/admin/class-users-columns.php:153 msgid "Are you sure you want to deactivate this user?" msgstr "" -#: includes/admin/class-users-columns.php:148 -#: includes/admin/class-users-columns.php:275 +#: includes/admin/class-users-columns.php:153 +#: includes/admin/class-users-columns.php:280 msgid "Deactivate" msgstr "" -#: includes/admin/class-users-columns.php:232 +#: includes/admin/class-users-columns.php:237 #: templates/account.php:61 #: templates/account.php:102 msgid "View profile" msgstr "" -#: includes/admin/class-users-columns.php:238 +#: includes/admin/class-users-columns.php:243 msgid "Info" msgstr "" -#: includes/admin/class-users-columns.php:271 +#: includes/admin/class-users-columns.php:276 #: includes/frontend/class-users.php:34 msgid "Approve Membership" msgstr "" -#: includes/admin/class-users-columns.php:272 +#: includes/admin/class-users-columns.php:277 #: includes/frontend/class-users.php:37 msgid "Reject Membership" msgstr "" -#: includes/admin/class-users-columns.php:273 +#: includes/admin/class-users-columns.php:278 #: includes/frontend/class-users.php:43 msgid "Put as Pending Review" msgstr "" -#: includes/admin/class-users-columns.php:274 +#: includes/admin/class-users-columns.php:279 msgid "Resend Activation E-mail" msgstr "" -#: includes/admin/class-users-columns.php:359 -#: includes/admin/class-users-columns.php:361 +#: includes/admin/class-users-columns.php:364 +#: includes/admin/class-users-columns.php:366 msgid "All Statuses" msgstr "" -#: includes/admin/class-users-columns.php:371 +#: includes/admin/class-users-columns.php:376 msgid "Filter" msgstr "" -#: includes/admin/class-users-columns.php:404 +#: includes/admin/class-users-columns.php:409 msgid "You do not have enough permissions to do that." msgstr "" @@ -10407,19 +10413,15 @@ msgstr "" msgid "Reactivate this account" msgstr "" -#: includes/frontend/class-users.php:46 -msgid "Resend Activation Email" -msgstr "" - -#: includes/frontend/class-users.php:49 +#: includes/frontend/class-users.php:53 msgid "Deactivate this account" msgstr "" -#: includes/frontend/class-users.php:54 +#: includes/frontend/class-users.php:58 msgid "Delete this user" msgstr "" -#: includes/frontend/class-users.php:58 +#: includes/frontend/class-users.php:62 msgid "Login as this user" msgstr "" From 49b99f10db496fd8dcce619a4296ce231276c3a7 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Mon, 30 Sep 2024 23:48:18 +0300 Subject: [PATCH 58/97] * fixed #1554; * updated changelog.txt; * updated readme.txt; * clean comments; --- changelog.txt | 3 ++- includes/admin/class-secure.php | 1 - includes/class-init.php | 1 - includes/common/class-secure.php | 2 -- includes/core/rest/class-api-v1.php | 1 - includes/core/rest/class-api-v2.php | 1 - includes/core/um-actions-register.php | 2 +- includes/um-deprecated-hooks.php | 14 ++++++++++++++ readme.txt | 3 ++- 9 files changed, 19 insertions(+), 9 deletions(-) diff --git a/changelog.txt b/changelog.txt index 6bd8a13e..6c78bf65 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ == Changelog == -= 2.8.7 September 30, 2024 = += 2.8.7 October 01, 2024 = * Enhancements: @@ -48,6 +48,7 @@ - Hook: Action hook `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - Hook: Action hook `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - Hook: Action hook `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. + - Hook: Filter hook `um_admin_views_users`. Use 'um_user_statuses_admin_filter_options' hook instead. - Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. - Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. - Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. diff --git a/includes/admin/class-secure.php b/includes/admin/class-secure.php index 772891ec..a3f173de 100644 --- a/includes/admin/class-secure.php +++ b/includes/admin/class-secure.php @@ -150,7 +150,6 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { } // Restore Account Status. if ( isset( $metadata['account_status'] ) ) { - // UM()->user()->set_status( $metadata['account_status'] ); UM()->common()->users()->set_status( $user_id, $metadata['account_status'] ); } diff --git a/includes/class-init.php b/includes/class-init.php index 9c8f811b..81b19416 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -1451,7 +1451,6 @@ if ( ! class_exists( 'UM' ) ) { require_once 'core/um-actions-form.php'; require_once 'core/um-actions-access.php'; require_once 'core/um-actions-wpadmin.php'; -// require_once 'core/um-actions-core.php'; require_once 'core/um-actions-ajax.php'; require_once 'core/um-actions-login.php'; require_once 'core/um-actions-register.php'; diff --git a/includes/common/class-secure.php b/includes/common/class-secure.php index 6fd084fa..141ef494 100644 --- a/includes/common/class-secure.php +++ b/includes/common/class-secure.php @@ -229,10 +229,8 @@ if ( ! class_exists( 'um\common\Secure' ) ) { $user->update_user_level_from_caps(); if ( is_user_logged_in() ) { - //UM()->user()->set_status( 'inactive' ); UM()->common()->users()->set_status( $user->ID, 'inactive' ); } else { - //UM()->user()->set_status( 'rejected' ); UM()->common()->users()->set_status( $user->ID, 'rejected' ); } um_reset_user(); diff --git a/includes/core/rest/class-api-v1.php b/includes/core/rest/class-api-v1.php index 40a0df97..f999a3d5 100644 --- a/includes/core/rest/class-api-v1.php +++ b/includes/core/rest/class-api-v1.php @@ -239,7 +239,6 @@ if ( ! class_exists( 'um\core\rest\API_v1' ) ) { switch ( $data ) { case 'status': - //UM()->user()->set_status( $value ); UM()->common()->users()->set_status( $id, $value ); $response['success'] = __( 'User status has been changed.', 'ultimate-member' ); break; diff --git a/includes/core/rest/class-api-v2.php b/includes/core/rest/class-api-v2.php index 68cc382c..6163e683 100644 --- a/includes/core/rest/class-api-v2.php +++ b/includes/core/rest/class-api-v2.php @@ -221,7 +221,6 @@ if ( ! class_exists( 'um\core\rest\API_v2' ) ) { switch ( $data ) { case 'status': - // UM()->user()->set_status( $value ); UM()->common()->users()->set_status( $id, $value ); $response['success'] = __( 'User status has been changed.', 'ultimate-member' ); break; diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index f920a42f..47569a60 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -64,7 +64,7 @@ function um_after_insert_user( $user_id, $args, $form_data = null ) { um_fetch_user( $user_id ); $status = um_user( 'status' ); } - // UM()->user()->set_status( $status ); + UM()->common()->users()->set_status( $user_id, $status ); // Create user uploads directory. diff --git a/includes/um-deprecated-hooks.php b/includes/um-deprecated-hooks.php index 3231ab27..0892766b 100644 --- a/includes/um-deprecated-hooks.php +++ b/includes/um-deprecated-hooks.php @@ -95,3 +95,17 @@ if ( ! defined( 'ABSPATH' ) ) { * * @param {int} $user_id User ID. */ + +/** + * Filters the WP Users list table views. + * + * Fully deprecated. Please use 'um_user_statuses_admin_filter_options' hook instead since 2.8.7. + * + * @param {array} $views List table filter views. + * + * @return {array} List table filter views. + * + * @since 1.3.x + * @depecated 2.8.7 Fully deprecated because there is used dropdown with statuses instead of list table views. + * @hook um_admin_views_users + */ diff --git a/readme.txt b/readme.txt index 72548329..ad93a574 100644 --- a/readme.txt +++ b/readme.txt @@ -166,7 +166,7 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -= 2.8.7 2024-09-30 = += 2.8.7 2024-10-01 = **Enhancements** @@ -214,6 +214,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Hook: Action hook `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. * Hook: Action hook `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. * Hook: Action hook `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. +* Hook: Filter hook `um_admin_views_users`. Use 'um_user_statuses_admin_filter_options' hook instead. * Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. * Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. * Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. From 8e3f4e68aadcddebc0232dcd23b7699f7cc75bd8 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 20:48:46 +0000 Subject: [PATCH 59/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 108 +++++++++++++++++----------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index f6315d20..6db00b3e 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T20:11:34+00:00\n" +"POT-Creation-Date: 2024-09-30T20:48:43+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" @@ -173,160 +173,160 @@ msgstr "" msgid "Invalid user." msgstr "" -#: includes/admin/class-secure.php:196 +#: includes/admin/class-secure.php:195 msgid "Scan Now" msgstr "" -#: includes/admin/class-secure.php:198 +#: includes/admin/class-secure.php:197 msgid "Last scan:" msgstr "" -#: includes/admin/class-secure.php:202 -#: includes/admin/class-secure.php:339 +#: includes/admin/class-secure.php:201 +#: includes/admin/class-secure.php:338 msgid "ago" msgstr "" -#: includes/admin/class-secure.php:204 +#: includes/admin/class-secure.php:203 msgid "Not Completed." msgstr "" -#: includes/admin/class-secure.php:207 +#: includes/admin/class-secure.php:206 msgid "Not Scanned yet." msgstr "" -#: includes/admin/class-secure.php:221 +#: includes/admin/class-secure.php:220 #: includes/admin/class-site-health.php:1112 msgid "Banned Administrative Capabilities" msgstr "" #. translators: %s are disabled default capabilities that are enabled by default. -#: includes/admin/class-secure.php:223 +#: includes/admin/class-secure.php:222 msgid "All the above are default Administrator & Super Admin capabilities. When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be flagged with this option. The %s capabilities are locked to ensure no users will be created with these capabilities." msgstr "" -#: includes/admin/class-secure.php:228 +#: includes/admin/class-secure.php:227 msgid "Scanner" msgstr "" -#: includes/admin/class-secure.php:230 +#: includes/admin/class-secure.php:229 msgid "Scan your site to check for vulnerabilities prior to Ultimate Member version 2.6.7 and get recommendations to secure your site." msgstr "" -#: includes/admin/class-secure.php:235 +#: includes/admin/class-secure.php:234 #: includes/admin/class-site-health.php:1116 msgid "Lock All Register Forms" msgstr "" -#: includes/admin/class-secure.php:236 +#: includes/admin/class-secure.php:235 msgid "Lock Forms" msgstr "" -#: includes/admin/class-secure.php:237 +#: includes/admin/class-secure.php:236 msgid "This prevents all users from registering with Ultimate Member on your site." msgstr "" -#: includes/admin/class-secure.php:242 +#: includes/admin/class-secure.php:241 #: includes/admin/class-site-health.php:1120 msgid "Display Login form notice to reset passwords" msgstr "" -#: includes/admin/class-secure.php:243 +#: includes/admin/class-secure.php:242 msgid "Enable Login form notice" msgstr "" -#: includes/admin/class-secure.php:244 +#: includes/admin/class-secure.php:243 msgid "Enforces users to reset their passwords (one-time) and prevent from entering old password." msgstr "" -#: includes/admin/class-secure.php:256 +#: includes/admin/class-secure.php:255 msgid "Expire All Users Sessions" msgstr "" #. translators: %d is the users count. -#: includes/admin/class-secure.php:258 +#: includes/admin/class-secure.php:257 msgid "Are you sure that you want to make all users sessions expired?" msgstr "" #. translators: %d is the users count. -#: includes/admin/class-secure.php:258 +#: includes/admin/class-secure.php:257 msgid "Logout Users (%d)" msgstr "" -#: includes/admin/class-secure.php:259 +#: includes/admin/class-secure.php:258 msgid "This will log out all users on your site and forces them to reset passwords
when \"Display Login form notice to reset passwords\" is enabled/checked." msgstr "" -#: includes/admin/class-secure.php:269 +#: includes/admin/class-secure.php:268 msgid "Administrative capabilities ban" msgstr "" -#: includes/admin/class-secure.php:270 +#: includes/admin/class-secure.php:269 #: includes/admin/class-site-health.php:1124 msgid "Enable ban for administrative capabilities" msgstr "" -#: includes/admin/class-secure.php:271 +#: includes/admin/class-secure.php:270 msgid " When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be banned." msgstr "" -#: includes/admin/class-secure.php:276 +#: includes/admin/class-secure.php:275 #: includes/admin/class-site-health.php:1132 msgid "Notify Administrators" msgstr "" -#: includes/admin/class-secure.php:277 +#: includes/admin/class-secure.php:276 msgid "Enable notification" msgstr "" -#: includes/admin/class-secure.php:278 +#: includes/admin/class-secure.php:277 msgid "When enabled, All administrators will be notified when someone has suspicious activities in the Account, Profile & Register forms." msgstr "" -#: includes/admin/class-secure.php:285 +#: includes/admin/class-secure.php:284 #: includes/admin/class-site-health.php:1137 msgid "Send Immediately" msgstr "" -#: includes/admin/class-secure.php:286 +#: includes/admin/class-secure.php:285 #: includes/admin/class-site-health.php:1138 msgid "Hourly" msgstr "" -#: includes/admin/class-secure.php:287 +#: includes/admin/class-secure.php:286 #: includes/admin/class-site-health.php:1139 msgid "Daily" msgstr "" -#: includes/admin/class-secure.php:289 +#: includes/admin/class-secure.php:288 #: includes/admin/class-site-health.php:1143 msgid "Notification Schedule" msgstr "" -#: includes/admin/class-secure.php:295 +#: includes/admin/class-secure.php:294 msgid "Allowed hosts for safe redirect (one host per line)" msgstr "" -#: includes/admin/class-secure.php:296 +#: includes/admin/class-secure.php:295 msgid "Extend allowed hosts for frontend pages redirects." msgstr "" -#: includes/admin/class-secure.php:306 +#: includes/admin/class-secure.php:305 msgid "Security" msgstr "" -#: includes/admin/class-secure.php:307 +#: includes/admin/class-secure.php:306 msgid "This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed." msgstr "" -#: includes/admin/class-secure.php:334 +#: includes/admin/class-secure.php:333 msgid "Blocked Due to Suspicious Activity" msgstr "" -#: includes/admin/class-secure.php:337 +#: includes/admin/class-secure.php:336 msgid "Are you sure that you want to restore this account after getting flagged for suspicious activity?" msgstr "" -#: includes/admin/class-secure.php:337 +#: includes/admin/class-secure.php:336 msgid "Restore Account" msgstr "" @@ -9799,11 +9799,11 @@ msgid "Membership Inactive" msgstr "" #: includes/core/rest/class-api-v1.php:220 -#: includes/core/rest/class-api-v1.php:277 -#: includes/core/rest/class-api-v1.php:309 +#: includes/core/rest/class-api-v1.php:276 +#: includes/core/rest/class-api-v1.php:308 #: includes/core/rest/class-api-v2.php:202 -#: includes/core/rest/class-api-v2.php:259 -#: includes/core/rest/class-api-v2.php:291 +#: includes/core/rest/class-api-v2.php:258 +#: includes/core/rest/class-api-v2.php:290 msgid "You must provide a user ID" msgstr "" @@ -9817,30 +9817,30 @@ msgstr "" msgid "You need to provide value to update" msgstr "" -#: includes/core/rest/class-api-v1.php:244 -#: includes/core/rest/class-api-v2.php:226 +#: includes/core/rest/class-api-v1.php:243 +#: includes/core/rest/class-api-v2.php:225 msgid "User status has been changed." msgstr "" -#: includes/core/rest/class-api-v1.php:254 -#: includes/core/rest/class-api-v2.php:236 +#: includes/core/rest/class-api-v1.php:253 +#: includes/core/rest/class-api-v2.php:235 msgid "User role has been changed." msgstr "" -#: includes/core/rest/class-api-v1.php:258 -#: includes/core/rest/class-api-v2.php:240 +#: includes/core/rest/class-api-v1.php:257 +#: includes/core/rest/class-api-v2.php:239 msgid "User meta has been changed." msgstr "" -#: includes/core/rest/class-api-v1.php:285 -#: includes/core/rest/class-api-v1.php:316 -#: includes/core/rest/class-api-v2.php:267 -#: includes/core/rest/class-api-v2.php:298 +#: includes/core/rest/class-api-v1.php:284 +#: includes/core/rest/class-api-v1.php:315 +#: includes/core/rest/class-api-v2.php:266 +#: includes/core/rest/class-api-v2.php:297 msgid "Invalid user specified" msgstr "" -#: includes/core/rest/class-api-v1.php:292 -#: includes/core/rest/class-api-v2.php:274 +#: includes/core/rest/class-api-v1.php:291 +#: includes/core/rest/class-api-v2.php:273 msgid "User has been successfully deleted." msgstr "" From 0a445a8236fec19c02f4a5c1034cdf3590a127a2 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 1 Oct 2024 00:35:29 +0300 Subject: [PATCH 60/97] * updated changelog.txt; * updated readme.txt; --- changelog.txt | 2 +- includes/um-deprecated-hooks.php | 2 +- readme.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/changelog.txt b/changelog.txt index 6c78bf65..d6c30d89 100644 --- a/changelog.txt +++ b/changelog.txt @@ -48,7 +48,7 @@ - Hook: Action hook `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - Hook: Action hook `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - Hook: Action hook `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. - - Hook: Filter hook `um_admin_views_users`. Use 'um_user_statuses_admin_filter_options' hook instead. + - Hook: Filter hook `um_admin_views_users`. Use filter 'um_user_statuses_admin_filter_options' hook instead. - Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. - Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. - Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. diff --git a/includes/um-deprecated-hooks.php b/includes/um-deprecated-hooks.php index 0892766b..a41bd2f1 100644 --- a/includes/um-deprecated-hooks.php +++ b/includes/um-deprecated-hooks.php @@ -99,7 +99,7 @@ if ( ! defined( 'ABSPATH' ) ) { /** * Filters the WP Users list table views. * - * Fully deprecated. Please use 'um_user_statuses_admin_filter_options' hook instead since 2.8.7. + * Fully deprecated. Please use filter 'um_user_statuses_admin_filter_options' hook instead since 2.8.7. * * @param {array} $views List table filter views. * diff --git a/readme.txt b/readme.txt index ad93a574..45824423 100644 --- a/readme.txt +++ b/readme.txt @@ -214,7 +214,7 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI * Hook: Action hook `um_admin_user_action_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. * Hook: Action hook `um_admin_user_action_{$bulk_action}_hook`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. * Hook: Action hook `um_admin_custom_hook_{$action}`. Use filter hook `um_handle_bulk_actions-users-{$current_action}` for custom user bulk actions instead. -* Hook: Filter hook `um_admin_views_users`. Use 'um_user_statuses_admin_filter_options' hook instead. +* Hook: Filter hook `um_admin_views_users`. Use filter 'um_user_statuses_admin_filter_options' hook instead. * Function: `UM()->user()->set_status( $status )`. Use function `UM()->common()->users()->set_status( $status, $user_id )` instead. * Function: `UM()->user()->assign_secretkey()`. Use function `UM()->common()->users()->assign_secretkey( $user_id )` instead. * Function: `UM()->user()->approve( $repeat )`. Use function `UM()->common()->users()->approve( $user_id, $force )` instead. From 1c83f214ae1825ee277d762bc898c31abe439620 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 21:36:46 +0000 Subject: [PATCH 61/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 6db00b3e..c2cae145 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T20:48:43+00:00\n" +"POT-Creation-Date: 2024-09-30T21:36:43+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From b9704ad28b0f1e3062f5523a9c45e8746a252157 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 1 Oct 2024 12:08:52 +0300 Subject: [PATCH 62/97] * fixed $force arguments and not existed user; --- includes/common/class-users.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/includes/common/class-users.php b/includes/common/class-users.php index ef97d5a1..4bde40df 100644 --- a/includes/common/class-users.php +++ b/includes/common/class-users.php @@ -329,9 +329,13 @@ class Users { * @return bool */ public function can_activation_send( $user_id, $force = false ) { + if ( ! self::user_exists( $user_id ) ) { + return false; + } + if ( ! $force ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + if ( $current_user_id === $user_id ) { return false; } } @@ -548,9 +552,13 @@ class Users { * @return bool */ public function can_be_set_as_pending( $user_id, $force = false ) { + if ( ! self::user_exists( $user_id ) ) { + return false; + } + if ( ! $force ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + if ( $current_user_id === $user_id ) { return false; } } @@ -622,9 +630,13 @@ class Users { * @return bool */ public function can_be_approved( $user_id, $force = false ) { + if ( ! self::user_exists( $user_id ) ) { + return false; + } + if ( ! $force ) { $current_user_id = get_current_user_id(); - if ( $current_user_id === $user_id || ! self::user_exists( $user_id ) ) { + if ( $current_user_id === $user_id ) { return false; } } From 5c5784b6ede11a9cdb63119242c83be99619c47b Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:09:20 +0000 Subject: [PATCH 63/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index c2cae145..fae44447 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-09-30T21:36:43+00:00\n" +"POT-Creation-Date: 2024-10-01T09:09:17+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From 3ec1f47ed65ce3b86b53cecdfecde1d38e854776 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 1 Oct 2024 12:27:01 +0300 Subject: [PATCH 64/97] * wpcs; --- includes/frontend/class-users.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/frontend/class-users.php b/includes/frontend/class-users.php index 58c93dcd..6047cbd7 100644 --- a/includes/frontend/class-users.php +++ b/includes/frontend/class-users.php @@ -26,7 +26,7 @@ class Users { um_fetch_user( $user_id ); $priority_role = UM()->roles()->get_priority_user_role( get_current_user_id() ); - $role = get_role( $priority_role ); + $role = get_role( $priority_role ); $can_edit_users = null !== $role && current_user_can( 'edit_users' ) && $role->has_cap( 'edit_users' ); if ( $can_edit_users ) { From cdeaf08beb655d80d069516e586d726405dabdda Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:28:05 +0000 Subject: [PATCH 65/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index fae44447..0e8cdc10 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-10-01T09:09:17+00:00\n" +"POT-Creation-Date: 2024-10-01T09:28:02+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From 682c4929ce1b6ac9f3e63a817135d24621f3ede3 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 1 Oct 2024 17:06:43 +0300 Subject: [PATCH 66/97] * additional fix for #1551; --- includes/core/class-fields.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 872dd5e2..07a4b1d3 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -2118,6 +2118,13 @@ if ( ! class_exists( 'um\core\Fields' ) ) { * @return array */ public function get_restricted_fields_for_edit( $_um_profile_id = false ) { + static $cache = array(); + + $cache_key = absint( $_um_profile_id ); + if ( array_key_exists( $cache_key, $cache ) ) { + return $cache[ $cache_key ]; + } + // fields that need to be disabled in edit mode (profile) $arr_restricted_fields = array( 'user_email', 'username', 'user_login', 'user_password', '_um_last_login', 'user_registered' ); /** @@ -2140,7 +2147,9 @@ if ( ! class_exists( 'um\core\Fields' ) ) { * } * add_filter( 'um_user_profile_restricted_edit_fields', 'my_make_email_editable', 10, 2 ); */ - return apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id ); + $cache[ $cache_key ] = apply_filters( 'um_user_profile_restricted_edit_fields', $arr_restricted_fields, $_um_profile_id ); + + return $cache[ $cache_key ]; } /** From 524c10a191043ae080450fe6749875b9b7f93dd5 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:07:08 +0000 Subject: [PATCH 67/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 50 +++++++++++++++++------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index 0e8cdc10..c00b7006 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-10-01T09:28:02+00:00\n" +"POT-Creation-Date: 2024-10-01T14:07:05+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" @@ -3280,8 +3280,8 @@ msgstr "" #: includes/admin/core/class-admin-metabox.php:2104 #: includes/core/class-fields.php:1955 #: includes/core/class-fields.php:1996 -#: includes/core/class-fields.php:2948 -#: includes/core/class-fields.php:3051 +#: includes/core/class-fields.php:2957 +#: includes/core/class-fields.php:3060 msgid "Upload" msgstr "" @@ -6186,8 +6186,8 @@ msgstr "" #: includes/admin/templates/modal/forms/fonticons.php:26 #: includes/admin/templates/role/publish.php:33 #: includes/class-config.php:231 -#: includes/core/class-fields.php:3033 -#: includes/core/class-fields.php:3158 +#: includes/core/class-fields.php:3042 +#: includes/core/class-fields.php:3167 #: includes/core/um-actions-profile.php:872 #: includes/core/um-actions-profile.php:884 #: includes/core/um-actions-profile.php:1072 @@ -9352,73 +9352,73 @@ msgstr "" msgid "You can only upload one file" msgstr "" -#: includes/core/class-fields.php:2536 +#: includes/core/class-fields.php:2545 msgid "Current Password" msgstr "" -#: includes/core/class-fields.php:2576 +#: includes/core/class-fields.php:2585 msgid "New Password" msgstr "" #. translators: %s: label. #. translators: %s: placeholder. -#: includes/core/class-fields.php:2627 -#: includes/core/class-fields.php:2645 -#: includes/core/class-fields.php:2648 +#: includes/core/class-fields.php:2636 +#: includes/core/class-fields.php:2654 +#: includes/core/class-fields.php:2657 msgid "Confirm %s" msgstr "" -#: includes/core/class-fields.php:2961 +#: includes/core/class-fields.php:2970 msgid "Upload Photo" msgstr "" -#: includes/core/class-fields.php:2988 -#: includes/core/class-fields.php:3032 +#: includes/core/class-fields.php:2997 +#: includes/core/class-fields.php:3041 #: includes/core/um-actions-profile.php:1103 msgid "Change photo" msgstr "" -#: includes/core/class-fields.php:3032 -#: includes/core/class-fields.php:3157 +#: includes/core/class-fields.php:3041 +#: includes/core/class-fields.php:3166 msgid "Processing..." msgstr "" -#: includes/core/class-fields.php:3032 +#: includes/core/class-fields.php:3041 msgid "Apply" msgstr "" -#: includes/core/class-fields.php:3060 +#: includes/core/class-fields.php:3069 msgid "Upload File" msgstr "" -#: includes/core/class-fields.php:3105 +#: includes/core/class-fields.php:3114 #: includes/core/um-filters-fields.php:372 msgid "This file has been removed." msgstr "" -#: includes/core/class-fields.php:3109 -#: includes/core/class-fields.php:3157 +#: includes/core/class-fields.php:3118 +#: includes/core/class-fields.php:3166 msgid "Change file" msgstr "" -#: includes/core/class-fields.php:3157 +#: includes/core/class-fields.php:3166 msgid "Save" msgstr "" #. translators: %s: edit user link. -#: includes/core/class-fields.php:4682 +#: includes/core/class-fields.php:4691 msgid "Your profile is looking a little empty. Why not add some information!" msgstr "" -#: includes/core/class-fields.php:4684 +#: includes/core/class-fields.php:4693 msgid "This user has not added any information to their profile yet." msgstr "" -#: includes/core/class-fields.php:4950 +#: includes/core/class-fields.php:4959 msgid "Please login as administrator." msgstr "" -#: includes/core/class-fields.php:4954 +#: includes/core/class-fields.php:4963 msgid "Invalid action." msgstr "" From 0a52f2ebd98327af68b73a30e3c0ac86ad2bf922 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 1 Oct 2024 17:25:58 +0300 Subject: [PATCH 68/97] * added deploy to wp.org GH action; --- .gitattributes | 26 ++++++++++++++++++++++++++ .github/workflows/deploy.yml | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/workflows/deploy.yml diff --git a/.gitattributes b/.gitattributes index 412eeda7..71b1dede 100644 --- a/.gitattributes +++ b/.gitattributes @@ -20,3 +20,29 @@ *.PDF diff=astextplain *.rtf diff=astextplain *.RTF diff=astextplain + +# Directories +/.wordpress-org export-ignore +/.github export-ignore +/assets/sass export-ignore +/assets/libs/fontawesome/scss export-ignore +/docs export-ignore +/tests export-ignore + +# Files +/.bowerrc export-ignore +/.editorconfig export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.jshintrc export-ignore +/.travis.yml export-ignore +/bower.json export-ignore +/composer.json export-ignore +/gulpfile.js export-ignore +/hookdoc-conf.json export-ignore +/manifest.json export-ignore +/package.json export-ignore +/phpcs.xml export-ignore +/phpdoc.dist.xml export-ignore +/README.md export-ignore +*.sass export-ignore diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..c0128e9d --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,32 @@ +name: Deploy to WordPress.org +on: + release: + types: [released] +jobs: + tag: + name: New release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Build + run: | + npm install + npm run build + - name: WordPress Plugin Deploy + id: deploy + uses: 10up/action-wordpress-plugin-deploy@stable + with: + generate-zip: true + env: + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + - name: Upload release asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ github.event.release.upload_url }} + asset_path: ${{ steps.deploy.outputs.zip-path }} + asset_name: ${{ github.event.repository.name }}.zip + asset_content_type: application/zip From ca33bb1d0b7e18d1d48facdda52f86c5e4fbf588 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:26:24 +0000 Subject: [PATCH 69/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index c00b7006..b5443fc4 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-10-01T14:07:05+00:00\n" +"POT-Creation-Date: 2024-10-01T14:26:21+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From 71405b0250244fc00ecebc6149d2d54396a696ee Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Tue, 1 Oct 2024 17:46:32 +0300 Subject: [PATCH 70/97] * fixed deploy to wp.org; --- .github/workflows/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c0128e9d..d96438a5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,6 +21,7 @@ jobs: env: SVN_USERNAME: ${{ secrets.SVN_USERNAME }} SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + SLUG: ultimate-member - name: Upload release asset uses: actions/upload-release-asset@v1 env: From f6818efbc23bf7206229fb739b2d2f6d34852267 Mon Sep 17 00:00:00 2001 From: "WordPress .pot File Generator" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:46:56 +0000 Subject: [PATCH 71/97] =?UTF-8?q?=F0=9F=94=84=20Generated=20POT=20File?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/ultimate-member.pot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index b5443fc4..8743328a 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -9,7 +9,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-10-01T14:26:21+00:00\n" +"POT-Creation-Date: 2024-10-01T14:46:53+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.11.0\n" "X-Domain: ultimate-member\n" From 73365aeea440342e2a2ced82de733017aec4488a Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 2 Oct 2024 13:47:42 +0300 Subject: [PATCH 72/97] * maybe fix for init download routing; --- includes/class-init.php | 3 ++- includes/core/class-files.php | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/class-init.php b/includes/class-init.php index 81b19416..471886dc 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -550,6 +550,7 @@ if ( ! class_exists( 'UM' ) ) { $this->user(); $this->profile(); $this->builtin(); + $this->files(); $this->form()->hooks(); $this->permalinks(); $this->cron(); @@ -1273,7 +1274,7 @@ if ( ! class_exists( 'UM' ) ) { * * @return um\core\Files */ - function files() { + public function files() { if ( empty( $this->classes['files'] ) ) { $this->classes['files'] = new um\core\Files(); } diff --git a/includes/core/class-files.php b/includes/core/class-files.php index 53cfdc57..200849e5 100644 --- a/includes/core/class-files.php +++ b/includes/core/class-files.php @@ -80,7 +80,6 @@ if ( ! class_exists( 'um\core\Files' ) ) { ); } - /** * File download link generate * From f79f2a7d2babbf0d99fc9c16b6df4028a056a71f Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Wed, 2 Oct 2024 14:22:38 +0300 Subject: [PATCH 73/97] * updated version; --- .wordpress-org/blueprints/blueprint.json | 2 +- README.md | 2 +- readme.txt | 8 +++++++- ultimate-member.php | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.wordpress-org/blueprints/blueprint.json b/.wordpress-org/blueprints/blueprint.json index ef1c589b..828f7a16 100644 --- a/.wordpress-org/blueprints/blueprint.json +++ b/.wordpress-org/blueprints/blueprint.json @@ -15,7 +15,7 @@ "step": "installPlugin", "pluginZipFile": { "resource": "url", - "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.8.6.zip" + "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.8.8.zip" }, "options": { "activate": true diff --git a/README.md b/README.md index 0f703e18..645138d2 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.8.7](https://github.com/ultimatemember/ultimatemember/releases/tag/2.8.7). +[Official Release Version: 2.8.8](https://github.com/ultimatemember/ultimatemember/releases/tag/2.8.8). ## Changelog diff --git a/readme.txt b/readme.txt index 45824423..520a3694 100644 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: community, member, membership, user-profile, user-registration Requires PHP: 5.6 Requires at least: 5.5 Tested up to: 6.6 -Stable tag: 2.8.7 +Stable tag: 2.8.8 License: GPLv3 License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -166,6 +166,12 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION += 2.8.8 2024-10-03 = + +**Bugfixes** + +* Fixed: Download routing initialization + = 2.8.7 2024-10-01 = **Enhancements** diff --git a/ultimate-member.php b/ultimate-member.php index c24ef586..13ad4d03 100644 --- a/ultimate-member.php +++ b/ultimate-member.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: 2.8.7 + * Version: 2.8.8 * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * Text Domain: ultimate-member From a69435f15adf77164ab19fb809b1b5c6d0bca3f1 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Thu, 3 Oct 2024 11:56:36 +0300 Subject: [PATCH 74/97] - fix min-height and height of html textarea --- assets/js/um-profile.js | 13 +++++++++++++ includes/core/um-filters-fields.php | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/assets/js/um-profile.js b/assets/js/um-profile.js index f3232353..f145bd8d 100644 --- a/assets/js/um-profile.js +++ b/assets/js/um-profile.js @@ -139,4 +139,17 @@ jQuery(document).ready(function() { jQuery( '.um-profile-nav a' ).on( 'touchend', function(e) { jQuery( e.currentTarget).trigger( "click" ); }); + + let textarea_iframe = jQuery('iframe.um-textarea-html-value, .mce-edit-area iframe'); + textarea_iframe.each(function() { + jQuery(this).onload = function() { + resizeIframe(iframe); + }; + }); }); + +function resizeIframe(obj, height) { + let dataHeight = obj.getAttribute('data-height'); + obj.style.minHeight = obj.contentWindow.document.documentElement.scrollHeight + 'px'; + obj.style.height = dataHeight + 'px'; +} diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 6d5d2bc9..582016e8 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -259,8 +259,10 @@ function um_profile_field_filter_hook__textarea( $value, $data ) { if ( ! $value ) { return ''; } + if ( ! empty( $data['html'] ) ) { - return ''; + $height = isset( $data['height'] ) && absint( $data['height'] ) > 0 ? absint( $data['height'] ) : ''; + return ''; } $description_key = UM()->profile()->get_show_bio_key( UM()->fields()->global_args ); From 19b7ef92b210557ab5403507fd0aac295f3a8f42 Mon Sep 17 00:00:00 2001 From: ashubawork Date: Thu, 3 Oct 2024 12:23:11 +0300 Subject: [PATCH 75/97] - fix attrs in tags for html textarea --- includes/core/um-filters-fields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 582016e8..481b12b8 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -262,7 +262,7 @@ function um_profile_field_filter_hook__textarea( $value, $data ) { if ( ! empty( $data['html'] ) ) { $height = isset( $data['height'] ) && absint( $data['height'] ) > 0 ? absint( $data['height'] ) : ''; - return ''; + return ''; } $description_key = UM()->profile()->get_show_bio_key( UM()->fields()->global_args ); From ae1af55fde388c00699fd7ad7ab361a8f5ded6fe Mon Sep 17 00:00:00 2001 From: ashubawork Date: Thu, 3 Oct 2024 12:24:55 +0300 Subject: [PATCH 76/97] - remove wrong code --- assets/js/um-profile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/um-profile.js b/assets/js/um-profile.js index f145bd8d..3b78d19d 100644 --- a/assets/js/um-profile.js +++ b/assets/js/um-profile.js @@ -140,7 +140,7 @@ jQuery(document).ready(function() { jQuery( e.currentTarget).trigger( "click" ); }); - let textarea_iframe = jQuery('iframe.um-textarea-html-value, .mce-edit-area iframe'); + let textarea_iframe = jQuery('iframe.um-textarea-html-value'); textarea_iframe.each(function() { jQuery(this).onload = function() { resizeIframe(iframe); From b4a221837e08a184d916af012af15eca4804319c Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 3 Oct 2024 13:04:20 +0300 Subject: [PATCH 77/97] * fixed first install scripts; --- includes/common/class-cpt.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/includes/common/class-cpt.php b/includes/common/class-cpt.php index f5751226..022fee00 100644 --- a/includes/common/class-cpt.php +++ b/includes/common/class-cpt.php @@ -159,7 +159,16 @@ if ( ! class_exists( 'um\common\CPT' ) ) { $mode = 'members'; if ( 'um_form' === $post->post_type ) { $meta_value_mode = get_post_meta( $post_id, '_um_mode', true ); - $mode = ! empty( $meta_value_mode ) ? $meta_value_mode : sanitize_key( $_POST['form']['_um_mode'] ); // phpcs:ignore WordPress.Security.NonceVerification -- already verified here + if ( ! empty( $meta_value_mode ) ) { + $mode = $meta_value_mode; + } elseif ( ! empty( $_POST['form']['_um_mode'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification -- already verified here + $mode = sanitize_key( $_POST['form']['_um_mode'] ); // phpcs:ignore WordPress.Security.NonceVerification -- already verified here + } + } + + // $mode can be empty on the first installation + if ( empty( $mode ) ) { + return; } // Set current published form or member directory as predefined in the case when old default doesn't exist or hasn't a `publish` status. From 90413c32e56376da21005bdb16e7e235d889d82a Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 3 Oct 2024 14:38:51 +0300 Subject: [PATCH 78/97] * reviewed and fixed iframe height when HTML formatted textarea is used; --- assets/js/common-frontend.js | 12 ++++++++++++ assets/js/common-frontend.min.js | 2 +- assets/js/um-profile.js | 11 +++-------- assets/js/um-profile.min.js | 2 +- includes/core/class-fields.php | 2 +- includes/core/um-filters-fields.php | 3 +-- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/assets/js/common-frontend.js b/assets/js/common-frontend.js index fef49375..4a989853 100644 --- a/assets/js/common-frontend.js +++ b/assets/js/common-frontend.js @@ -96,6 +96,18 @@ UM.frontend = { UM.frontend.cropper.obj = null; // flush our own object } } + }, + iframe: { + resize: function(obj) { + let newHeight; + // 150 is default height of the iframe in web-browser + if ( obj.contentWindow.document.documentElement.scrollHeight > 150 && obj.contentWindow.document.documentElement.scrollHeight > obj.contentWindow.document.documentElement.offsetHeight ) { + newHeight = obj.contentWindow.document.documentElement.scrollHeight; + } else { + newHeight = obj.contentWindow.document.documentElement.offsetHeight; + } + obj.style.height = newHeight + 'px'; + } } } diff --git a/assets/js/common-frontend.min.js b/assets/js/common-frontend.min.js index aae402d3..bb253c84 100644 --- a/assets/js/common-frontend.min.js +++ b/assets/js/common-frontend.min.js @@ -1 +1 @@ -"object"!=typeof window.UM&&(window.UM={}),"object"!=typeof UM.frontend&&(UM.frontend={}),UM.frontend={cropper:{obj:null,init:function(){var o=jQuery(".um-modal .um-single-image-preview img").first();if(o.length&&""!==o.attr("src")){UM.frontend.cropper.obj&&UM.frontend.cropper.destroy();var t=jQuery(".um-modal .um-single-image-preview"),r=o.parent().data("crop"),n=o.parent().data("min_width"),i=o.parent().data("min_height"),a=o.parent().data("ratio"),d=jQuery(".um-modal").find("#um_upload_single").data("ratio"),d=(d&&(a=d.split(":")[0]),jQuery(window).height()-(jQuery(".um-modal-footer a").height()+20)-50-jQuery(".um-modal-header:visible").height());o.css({height:"auto"}),t.css({height:"auto"}),jQuery(window).height()<=400?(t.css({height:d+"px","max-height":d+"px"}),o.css({height:"auto"})):(o.css({height:"auto","max-height":d+"px"}),t.css({height:o.height(),"max-height":d+"px"}));let e;"square"===r?e={minWidth:n,minHeight:i,dragCrop:!1,aspectRatio:1,zoomable:!1,rotatable:!1,dashed:!1}:"cover"===r?(0e.contentWindow.document.documentElement.offsetHeight?e.contentWindow.document.documentElement.scrollHeight:e.contentWindow.document.documentElement.offsetHeight,e.style.height=o+"px"}}},wp.hooks.addAction("um_remove_modal","um_common_frontend",function(){UM.frontend.cropper.destroy()}),wp.hooks.addAction("um_after_removing_preview","um_common_frontend",function(){UM.frontend.cropper.destroy()}),wp.hooks.addAction("um_window_resize","um_common_frontend",function(){UM.frontend.cropper.destroy()}); \ No newline at end of file diff --git a/assets/js/um-profile.js b/assets/js/um-profile.js index 3b78d19d..38ab46d4 100644 --- a/assets/js/um-profile.js +++ b/assets/js/um-profile.js @@ -142,14 +142,9 @@ jQuery(document).ready(function() { let textarea_iframe = jQuery('iframe.um-textarea-html-value'); textarea_iframe.each(function() { - jQuery(this).onload = function() { - resizeIframe(iframe); + let obj = jQuery(this); + obj.onload = function() { + UM.frontend.iframe.resize(obj[0]); }; }); }); - -function resizeIframe(obj, height) { - let dataHeight = obj.getAttribute('data-height'); - obj.style.minHeight = obj.contentWindow.document.documentElement.scrollHeight + 'px'; - obj.style.height = dataHeight + 'px'; -} diff --git a/assets/js/um-profile.min.js b/assets/js/um-profile.min.js index c2e401fc..dcb528d6 100644 --- a/assets/js/um-profile.min.js +++ b/assets/js/um-profile.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){jQuery(".um-profile.um-viewing .um-profile-body .um-row").each(function(){var e=jQuery(this);0==e.find(".um-field").length&&(e.prev(".um-row-heading").remove(),e.remove())}),jQuery(".um-profile.um-viewing .um-profile-body").length&&0==jQuery(".um-profile.um-viewing .um-profile-body").find(".um-field").length&&(jQuery(".um-profile.um-viewing .um-profile-body").find(".um-row-heading,.um-row").remove(),jQuery(".um-profile-note").show()),jQuery(document.body).on("click",".um-profile-save",function(e){return e.preventDefault(),jQuery(this).parents(".um.um-profile.um-editing").find("form").trigger("submit"),!1}),jQuery(document.body).on("click",".um-profile-edit-a",function(e){jQuery(this).addClass("active")}),jQuery(document.body).on("click",".um-cover a.um-cover-add, .um-photo a",function(e){e.preventDefault()}),jQuery(document.body).on("click",".um-photo-modal",function(e){e.preventDefault();e=jQuery(this).attr("data-src");return um_new_modal("um_view_photo","fit",!0,e),!1}),jQuery(document.body).on("click",".um-reset-profile-photo",function(e){return jQuery(".um-profile-photo-img img").attr("src",jQuery(this).attr("data-default_src")),user_id=jQuery(this).attr("data-user_id"),metakey="profile_photo",UM.dropdown.hideAll(),jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_profile_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce}}),jQuery(this).parents("li").hide(),!1}),jQuery(document.body).on("click",".um-reset-cover-photo",function(e){var t=jQuery(this);return jQuery(".um-cover-overlay").hide(),jQuery(".um-cover-e").html(''),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_cover_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce},success:function(e){t.hide()}}),UM.dropdown.hideAll(),!1}),jQuery(document.body).on("change keyup","#um-meta-bio",function(){if(void 0!==jQuery(this).val()){var t=jQuery(this).data("character-limit"),r=jQuery(this).data("html");let e=t-jQuery(this).val().length;e=(e=1===parseInt(r)?t-jQuery(this).val().replace(/(<([^>]+)>)/gi,"").length:e)<0?0:e,jQuery("span.um-meta-bio-character span.um-bio-limit").text(e);r=e<5?"red":"";jQuery("span.um-meta-bio-character").css("color",r)}}),jQuery("#um-meta-bio").trigger("change"),jQuery(".um-profile form").each(function(){let t=jQuery(this).data("description_key");jQuery(this).find('textarea[name="'+t+'"]').length&&jQuery(document.body).on("change input",'textarea[name="'+t+'"]',function(e){jQuery(this).parents("form").find('textarea[name="'+t+'"]').each(function(){jQuery(this).val(e.currentTarget.value),jQuery("#um-meta-bio")[0]!==e.currentTarget&&jQuery("#um-meta-bio")[0]===jQuery(this)[0]&&jQuery(this).trigger("change")})})}),jQuery(".um-profile-edit a.um_delete-item").on("click",function(e){if(e.preventDefault(),!confirm(wp.i18n.__("Are you sure that you want to delete this user?","ultimate-member")))return!1}),jQuery(".um-profile-nav a").on("touchend",function(e){jQuery(e.currentTarget).trigger("click")})}); \ No newline at end of file +jQuery(document).ready(function(){jQuery(".um-profile.um-viewing .um-profile-body .um-row").each(function(){var e=jQuery(this);0==e.find(".um-field").length&&(e.prev(".um-row-heading").remove(),e.remove())}),jQuery(".um-profile.um-viewing .um-profile-body").length&&0==jQuery(".um-profile.um-viewing .um-profile-body").find(".um-field").length&&(jQuery(".um-profile.um-viewing .um-profile-body").find(".um-row-heading,.um-row").remove(),jQuery(".um-profile-note").show()),jQuery(document.body).on("click",".um-profile-save",function(e){return e.preventDefault(),jQuery(this).parents(".um.um-profile.um-editing").find("form").trigger("submit"),!1}),jQuery(document.body).on("click",".um-profile-edit-a",function(e){jQuery(this).addClass("active")}),jQuery(document.body).on("click",".um-cover a.um-cover-add, .um-photo a",function(e){e.preventDefault()}),jQuery(document.body).on("click",".um-photo-modal",function(e){e.preventDefault();e=jQuery(this).attr("data-src");return um_new_modal("um_view_photo","fit",!0,e),!1}),jQuery(document.body).on("click",".um-reset-profile-photo",function(e){return jQuery(".um-profile-photo-img img").attr("src",jQuery(this).attr("data-default_src")),user_id=jQuery(this).attr("data-user_id"),metakey="profile_photo",UM.dropdown.hideAll(),jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_profile_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce}}),jQuery(this).parents("li").hide(),!1}),jQuery(document.body).on("click",".um-reset-cover-photo",function(e){var t=jQuery(this);return jQuery(".um-cover-overlay").hide(),jQuery(".um-cover-e").html(''),um_responsive(),user_id=jQuery(this).attr("data-user_id"),metakey="cover_photo",jQuery.ajax({url:wp.ajax.settings.url,type:"post",data:{action:"um_delete_cover_photo",metakey:metakey,user_id:user_id,nonce:um_scripts.nonce},success:function(e){t.hide()}}),UM.dropdown.hideAll(),!1}),jQuery(document.body).on("change keyup","#um-meta-bio",function(){if(void 0!==jQuery(this).val()){var t=jQuery(this).data("character-limit"),r=jQuery(this).data("html");let e=t-jQuery(this).val().length;e=(e=1===parseInt(r)?t-jQuery(this).val().replace(/(<([^>]+)>)/gi,"").length:e)<0?0:e,jQuery("span.um-meta-bio-character span.um-bio-limit").text(e);r=e<5?"red":"";jQuery("span.um-meta-bio-character").css("color",r)}}),jQuery("#um-meta-bio").trigger("change"),jQuery(".um-profile form").each(function(){let t=jQuery(this).data("description_key");jQuery(this).find('textarea[name="'+t+'"]').length&&jQuery(document.body).on("change input",'textarea[name="'+t+'"]',function(e){jQuery(this).parents("form").find('textarea[name="'+t+'"]').each(function(){jQuery(this).val(e.currentTarget.value),jQuery("#um-meta-bio")[0]!==e.currentTarget&&jQuery("#um-meta-bio")[0]===jQuery(this)[0]&&jQuery(this).trigger("change")})})}),jQuery(".um-profile-edit a.um_delete-item").on("click",function(e){if(e.preventDefault(),!confirm(wp.i18n.__("Are you sure that you want to delete this user?","ultimate-member")))return!1}),jQuery(".um-profile-nav a").on("touchend",function(e){jQuery(e.currentTarget).trigger("click")}),jQuery("iframe.um-textarea-html-value").each(function(){let e=jQuery(this);e.onload=function(){UM.frontend.iframe.resize(e[0])}})}); \ No newline at end of file diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 07a4b1d3..b781b30d 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -2805,7 +2805,7 @@ if ( ! class_exists( 'um\core\Fields' ) ) { 'media_buttons' => false, 'wpautop' => false, 'editor_class' => $this->get_class( $key, $data ), - 'editor_height' => $data['height'], + 'editor_height' => absint( $data['height'] ), 'tinymce' => array( 'toolbar1' => 'formatselect,bullist,numlist,bold,italic,underline,forecolor,blockquote,hr,removeformat,link,unlink,undo,redo', 'toolbar2' => '', diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 481b12b8..bcd73142 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -261,8 +261,7 @@ function um_profile_field_filter_hook__textarea( $value, $data ) { } if ( ! empty( $data['html'] ) ) { - $height = isset( $data['height'] ) && absint( $data['height'] ) > 0 ? absint( $data['height'] ) : ''; - return ''; + return ''; } $description_key = UM()->profile()->get_show_bio_key( UM()->fields()->global_args ); From eb400bf31e04be49a039b86dd7acb658c0d9b7c8 Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 3 Oct 2024 14:58:52 +0300 Subject: [PATCH 79/97] * manual merge of https://github.com/ultimatemember/ultimatemember/tree/fix/after_registration --- includes/core/um-actions-register.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index 47569a60..286ccf99 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -253,6 +253,8 @@ function um_check_user_status( $user_id, $args, $form_data = null ) { exit; } } else { + um_fetch_user( $user_id ); // required because there can be empty um_user. + if ( 'redirect_url' === um_user( $status . '_action' ) && '' !== um_user( $status . '_url' ) ) { /** * Filters the redirect URL for pending user after registration. From c89e8a6820a68f767ad5d73c8373a44dc0817b9f Mon Sep 17 00:00:00 2001 From: Mykyta Synelnikov Date: Thu, 3 Oct 2024 15:04:14 +0300 Subject: [PATCH 80/97] * updated changelog.txt, readme.txt; --- changelog.txt | 8 ++++++++ readme.txt | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index d6c30d89..8b7f015e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,13 @@ == Changelog == += 2.8.8 October 04, 2024 = + +* Bugfixes: + + - Fixed: Download routing initialization + - Fixed: Textarea height and HTML formatted textarea field height isolated via `'; + return wp_kses_post( $value ); } $description_key = UM()->profile()->get_show_bio_key( UM()->fields()->global_args ); diff --git a/readme.txt b/readme.txt index aedb8e36..881e389c 100644 --- a/readme.txt +++ b/readme.txt @@ -166,6 +166,18 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION += 2.8.9 2024-10-14 = + +**Enhancements** + +* Added: Using PHP tidy extension (if it's active) to make HTML textarea value clear +* Added: `um_tidy_config` filter hook for setting PHP tidy config + +**Bugfixes** + +* Fixed: UM tipsy removing inside .um-page selector (e.g. tipsy init from um-modal) +* Fixed: Rollback using `
- query()->count_users(); ?> + query()->count_users() ); ?> - + - - query()->count_users_by_status( 'awaiting_admin_review' ); ?> - - - - + + query()->count_users_by_status( 'awaiting_admin_review' ) ); ?> + + + +
- - query()->count_users_by_status( 'approved' ); ?> - - - - + + query()->count_users_by_status( 'approved' ) ); ?> + + + + - - query()->count_users_by_status( 'awaiting_email_confirmation' ); ?> - - - - + + query()->count_users_by_status( 'awaiting_email_confirmation' ) ); ?> + + + +
- - query()->count_users_by_status( 'rejected' ); ?> - - - - + + query()->count_users_by_status( 'rejected' ) ); ?> + + + + + - - query()->count_users_by_status( 'inactive' ); ?> - - - - + + query()->count_users_by_status( 'inactive' ) ); ?> + + + +
Trim restriction message if post_id = 111.Change name of person.