diff --git a/.gitignore b/.gitignore index 8af93ce6..492d3a80 100644 --- a/.gitignore +++ b/.gitignore @@ -218,5 +218,7 @@ pip-log.txt node_modules/ assets/vendor/ +/vendor/ package-lock.json -.idea \ No newline at end of file +.idea/ +composer.lock diff --git a/assets/js/um-account.js b/assets/js/um-account.js index eb8eef0d..7985f12f 100644 --- a/assets/js/um-account.js +++ b/assets/js/um-account.js @@ -4,8 +4,8 @@ jQuery(document).ready(function() { if ( current_tab ) { jQuery('.um-account-tab[data-tab="'+current_tab+'"]').show(); - jQuery('.um-account-tab:not(:visible)').find( 'input, select, textarea' ).not( ':disabled' ).addClass('um_account_inactive').prop( 'disabled', true ).attr( 'disabled', true ); + wp.hooks.doAction( 'um_account_active_tab_inited', current_tab ); } jQuery( document.body ).on( 'click', '.um-account-side li a', function(e) { @@ -103,4 +103,4 @@ jQuery(document).ready(function() { }); -}); \ No newline at end of file +}); diff --git a/assets/js/um-account.min.js b/assets/js/um-account.min.js index 3c9d18d0..37641fa7 100644 --- a/assets/js/um-account.min.js +++ b/assets/js/um-account.min.js @@ -1 +1 @@ -jQuery(document).ready(function(){var a=jQuery(".um-account-main").attr("data-current_tab");a&&(jQuery('.um-account-tab[data-tab="'+a+'"]').show(),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0)),jQuery(document.body).on("click",".um-account-side li a",function(a){a.preventDefault();var e=jQuery(this);e.parents("ul").find("li a").removeClass("current"),e.addClass("current");var t=jQuery(this).attr("href"),u=jQuery(this).attr("data-tab");return jQuery('input[id="_um_account_tab"]:hidden').val(u),window.history.pushState("","",t),jQuery(".um-account-tab").hide(),jQuery('.um-account-tab[data-tab="'+u+'"]').fadeIn(),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-nav a").removeClass("current"),jQuery('.um-account-nav a[data-tab="'+u+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",u),!1}),jQuery(document.body).on("click",".um-account-nav a",function(a){a.preventDefault();var e=jQuery(this).attr("data-tab"),t=jQuery(this).parents("div"),u=jQuery(this);return jQuery('input[id="_um_account_tab"]:hidden').val(e),jQuery(".um-account-tab").hide(),u.hasClass("current")?(t.next(".um-account-tab").slideUp(),u.removeClass("current")):(t.next(".um-account-tab").slideDown(),u.parents("div").find("a").removeClass("current"),u.addClass("current")),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-side li a").removeClass("current"),jQuery('.um-account-side li a[data-tab="'+e+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",e),!1}),jQuery(document.body).on("click",".um-request-button",function(a){a.preventDefault();var e=jQuery(this).data("action"),t=jQuery("#"+e).val();if(jQuery(".um-field-area-response."+e).hide(),jQuery("#"+e).length&&""===t)jQuery(".um-field-error."+e).show();else{jQuery(".um-field-error."+e).hide();var u={request_action:e,nonce:um_scripts.nonce};jQuery("#"+e).length&&(u.password=t),wp.ajax.send("um_request_user_data",{data:u,success:function(a){jQuery(".um-field-area-response."+e).text(a.answer).show()},error:function(a){console.log(a)}})}})}); \ No newline at end of file +jQuery(document).ready(function(){var a=jQuery(".um-account-main").attr("data-current_tab");a&&(jQuery('.um-account-tab[data-tab="'+a+'"]').show(),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),wp.hooks.doAction("um_account_active_tab_inited",a)),jQuery(document.body).on("click",".um-account-side li a",function(a){a.preventDefault();var t=jQuery(this);t.parents("ul").find("li a").removeClass("current"),t.addClass("current");var e=jQuery(this).attr("href"),u=jQuery(this).attr("data-tab");return jQuery('input[id="_um_account_tab"]:hidden').val(u),window.history.pushState("","",e),jQuery(".um-account-tab").hide(),jQuery('.um-account-tab[data-tab="'+u+'"]').fadeIn(),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-nav a").removeClass("current"),jQuery('.um-account-nav a[data-tab="'+u+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",u),!1}),jQuery(document.body).on("click",".um-account-nav a",function(a){a.preventDefault();var t=jQuery(this).attr("data-tab"),e=jQuery(this).parents("div"),u=jQuery(this);return jQuery('input[id="_um_account_tab"]:hidden').val(t),jQuery(".um-account-tab").hide(),u.hasClass("current")?(e.next(".um-account-tab").slideUp(),u.removeClass("current")):(e.next(".um-account-tab").slideDown(),u.parents("div").find("a").removeClass("current"),u.addClass("current")),jQuery(".um-account-tab:visible").find("input, select, textarea").filter(".um_account_inactive:disabled").removeClass("um_account_inactive").prop("disabled",!1).attr("disabled",!1),jQuery(".um-account-tab:not(:visible)").find("input, select, textarea").not(":disabled").addClass("um_account_inactive").prop("disabled",!0).attr("disabled",!0),jQuery(".um-account-side li a").removeClass("current"),jQuery('.um-account-side li a[data-tab="'+t+'"]').addClass("current"),wp.hooks.doAction("um_after_account_tab_changed",t),!1}),jQuery(document.body).on("click",".um-request-button",function(a){a.preventDefault();var t=jQuery(this).data("action"),e=jQuery("#"+t).val();if(jQuery(".um-field-area-response."+t).hide(),jQuery("#"+t).length&&""===e)jQuery(".um-field-error."+t).show();else{jQuery(".um-field-error."+t).hide();var u={request_action:t,nonce:um_scripts.nonce};jQuery("#"+t).length&&(u.password=e),wp.ajax.send("um_request_user_data",{data:u,success:function(a){jQuery(".um-field-area-response."+t).text(a.answer).show()},error:function(a){console.log(a)}})}})}); \ No newline at end of file diff --git a/assets/js/um-members.js b/assets/js/um-members.js index 3f1ea365..9bf7d053 100644 --- a/assets/js/um-members.js +++ b/assets/js/um-members.js @@ -1253,6 +1253,7 @@ jQuery(document.body).ready( function() { if ( typeof current_value == 'undefined' ) { current_value = []; } else { + current_value = um_unsanitize_value( current_value ); current_value = current_value.split( '||' ); } diff --git a/assets/js/um-members.min.js b/assets/js/um-members.min.js index 021d973b..fb639e69 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 t={},a=window.location.search.substring(1).split("&");return jQuery.each(a,function(e){var r=a[e].split("=");t[r[0]]=r[1]}),t}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={};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=um_get_data_for_directory(jQuery('.um-directory[data-hash="'+r+'"]'));jQuery.each(t,function(e){m[e+"_"+r]=t[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");a=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],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),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 60<=a&&(a=0,24<=(t+=1)&&(t=0)),a<10&&(a="0"+a),t+":"+a}function um_ajax_get_members(u,e){var t=um_members_get_hash(u);if(wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,t,u)){var r=um_get_current_page(u),a=um_get_search(u),i=um_get_sort(u),m=-(new Date).getTimezoneOffset()/60,_={directory_id:t,page:r,search:a,sorting:i,gmt_offset:m,post_refferer:u.data("base-post"),nonce:um_scripts.nonce};u.find(".um-search-filter").length&&u.find(".um-search-filter").each(function(){var e=jQuery(this);if(e.find(".um-slider").length){var r=e.find(".um-slider").data("field_name"),t=um_get_data_for_directory(u,"filter_"+r+"_from"),a=um_get_data_for_directory(u,"filter_"+r+"_to");void 0===t&&void 0===a||(_[r]=[t,a])}else if(e.find(".um-datepicker-filter").length){r=e.find(".um-datepicker-filter").data("filter_name"),t=um_get_data_for_directory(u,"filter_"+r+"_from"),a=um_get_data_for_directory(u,"filter_"+r+"_to");void 0===t&&void 0===a||(_[r]=[t,a])}else if(e.find(".um-timepicker-filter").length){r=e.find(".um-timepicker-filter").data("filter_name"),t=um_get_data_for_directory(u,"filter_"+r+"_from"),a=um_get_data_for_directory(u,"filter_"+r+"_to");if(void 0!==t)(i=1*(t=t.split(":"))[0])<10&&(i="0"+i),(d=1*t[1])<10&&(d="0"+d),t=i+":"+d+":00";if(void 0!==a){var i,m=a.split(":"),d=1*m[1];(i=1*m[0])<10&&(i="0"+i),d<10&&(d="0"+d),a=i+":"+d+":59"}void 0===t&&void 0===a||(_[r]=[t,a])}else if(e.find("select").length){r=e.find("select").attr("name");void 0!==(s=um_get_data_for_directory(u,"filter_"+r))&&(s=um_unsanitize_value(s),_[r]=s.split("||"))}else if(e.hasClass("um-text-filter-type")&&e.find('input[type="text"]').length){var s;r=e.find('input[type="text"]').attr("name");void 0!==(s=um_get_data_for_directory(u,"filter_"+r))&&(s=um_unsanitize_value(s),_[r]=s)}else _=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",_,e,u)}),_=wp.hooks.applyFilters("um_member_directory_filter_request",_),wp.ajax.send("um_get_members",{data:_,success:function(e){um_member_directory_last_data[t]=e,um_build_template(u,e);var r=wp.template("um-members-pagination");u.find(".um-members-pagination-box").html(r(e)),u.data("total_pages",e.pagination.total_pages),e.pagination.total_pages?(u.find(".um-member-directory-sorting-options").prop("disabled",!1),u.find(".um-member-directory-view-type").removeClass("um-disabled")):(u.find(".um-member-directory-sorting-options").prop("disabled",!0),u.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",u,e),um_init_new_dropdown(),um_members_hide_preloader(u)},error:function(e){console.log(e),um_members_hide_preloader(u)}})}else setTimeout(um_ajax_get_members,600,u,e)}function um_build_template(e,r){var t=e.data("view_type"),a=wp.template("um-member-"+t+"-"+um_members_get_hash(e));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"),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"),init_tipsy()}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(u){var _=[];return u.find(".um-search-filter").each(function(){var t,a,d,i=jQuery(this);if(i.find("input.um-datepicker-filter").length)d="datepicker",i.find("input.um-datepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(u,"filter_"+e+"_from"),t=um_get_data_for_directory(u,"filter_"+e+"_to");if(void 0!==r||void 0!==t){var a,i=jQuery(this).val(),m=u.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val();i===m?a=m:""!==i&&""!==m?a=i+" - "+m:""===i?a="before "+m:""===m&&(a="since "+i),_.push({name:e,label:jQuery(this).data("filter-label"),value_label:a,value:[r,t],type:d})}}});else if(i.find("input.um-timepicker-filter").length)d="timepicker",i.find("input.um-timepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(u,"filter_"+e+"_from"),t=um_get_data_for_directory(u,"filter_"+e+"_to");if(void 0!==r||void 0!==t){var a,i=jQuery(this).val(),m=u.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val();i===m?a=m:""!==i&&""!==m?a=i+" - "+m:""===i?a="before "+m:""===m&&(a="since "+i),_.push({name:e,label:jQuery(this).data("filter-label"),value_label:a,value:[r,t],type:d})}}});else if(i.find("select").length){d="select",t=i.find("select").attr("name"),a=i.find("select").data("placeholder"),m=void 0===(m=um_get_data_for_directory(u,"filter_"+t))?[]:(m=um_unsanitize_value(m)).split("||"),jQuery.each(m,function(e){var r=i.find('select option[value="'+m[e]+'"]').data("value_label");_.push({name:t,label:a,value_label:r,value:m[e],type:d})})}else if(i.hasClass("um-text-filter-type")&&i.find('input[type="text"]').length){var m;d="text",t=i.find('input[type="text"]').attr("name"),a=i.find('input[type="text"]').attr("placeholder"),void 0===(m=um_get_data_for_directory(u,"filter_"+t))&&(m=""),""!=m&&_.push({name:t,label:a,value_label:m,value:m,type:d})}else if(i.find("div.ui-slider").length){d="slider",t=i.find("div.ui-slider").data("field_name");var e,r=um_get_data_for_directory(u,"filter_"+t+"_from"),s=um_get_data_for_directory(u,"filter_"+t+"_to");if(void 0===r&&void 0===s)return;e=r===s?i.find("div.um-slider-range").data("placeholder-s").replace("{value}",r).replace("{field_label}",i.find("div.um-slider-range").data("label")):i.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",r).replace("{max_range}",s).replace("{field_label}",i.find("div.um-slider-range").data("label")),a=i.find("div.um-slider-range").data("label"),_.push({name:t,label:a,value_label:e,value:[r,s],type:d})}else _=wp.hooks.applyFilters("um_member_directory_get_filter_data",_,u,i)}),_}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);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","");var a=!1;if(!(a=wp.hooks.applyFilters("um_member_directory_ignore_after_search",a,e)))if(1===e.data("must-search")&&(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)}}}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(){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(){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");if(!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="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),um_set_url_from_data(r,"page",1===e?"":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),um_set_url_from_data(e,"page",1===r?"":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))return;var t=um_sanitize_value(jQuery(this).val()),a=jQuery(this).prop("name"),i=um_get_data_for_directory(r,"filter_"+a);if(void 0===i&&(i=""),t===i)return;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(),1d.data("total_pages")&&(r=d.data("total_pages")),d.data("page",r).attr("data-page",r),d.find(".um-member-directory-sorting").length){var t=um_get_data_for_directory(d,"sort");void 0===t&&(t=d.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),d.data("sorting",t);var a=d.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]');a.find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),a.find('a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),d.find(".um-member-directory-sorting-a").find("> a").html(a.find('a[data-value="'+t+'"]').html())}if(d.find(".um-member-directory-view-type").length){var i=um_get_data_for_directory(d,"view_type");void 0===i&&(i=d.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),d.data("view_type",i),d.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),d.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+i+'"]').show()}d.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=e.pickadate("picker"),t=e.data("filter_name"),a=e.data("range"),i=um_get_data_for_directory(d,"filter_"+t+"_"+a);void 0!==i?r.set("select",1e3*i):r.clear()}),d.find(".um-slider").each(function(){var e=jQuery(this),r=e.data("field_name"),t=um_get_data_for_directory(d,"filter_"+r+"_from"),a=um_get_data_for_directory(d,"filter_"+r+"_to");void 0===t&&(t=e.data("min")),t=parseInt(t),void 0===a&&(a=e.data("max")),a=parseInt(a),e.slider("values",[t,a]),um_set_range_label(e)}),d.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.pickatime("picker"),t=e.data("filter_name"),a=e.data("range"),i=um_get_data_for_directory(d,"filter_"+t+"_"+a);if(void 0!==i){var m=i.split(":");r.set("select",60*m[0])}else r.clear()});var m=!1;if(!(m=wp.hooks.applyFilters("um_member_directory_ignore_after_search",m,d))&&1===d.data("must-search")){var s=um_get_search(d);if(!um_get_filters_data(d).length&&!s)return d.data("searched",0),void um_members_hide_preloader(d);d.data("searched",1)}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,d,e)||(um_ajax_get_members(d),um_change_tag(d))})})}); \ 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 t={},a=window.location.search.substring(1).split("&");return jQuery.each(a,function(e){var r=a[e].split("=");t[r[0]]=r[1]}),t}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={};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=um_get_data_for_directory(jQuery('.um-directory[data-hash="'+r+'"]'));jQuery.each(t,function(e){m[e+"_"+r]=t[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");a=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],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),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 60<=a&&(a=0,24<=(t+=1)&&(t=0)),a<10&&(a="0"+a),t+":"+a}function um_ajax_get_members(u,e){var t=um_members_get_hash(u);if(wp.hooks.applyFilters("um_member_directory_get_members_allow",!0,t,u)){var r=um_get_current_page(u),a=um_get_search(u),i=um_get_sort(u),m=-(new Date).getTimezoneOffset()/60,_={directory_id:t,page:r,search:a,sorting:i,gmt_offset:m,post_refferer:u.data("base-post"),nonce:um_scripts.nonce};u.find(".um-search-filter").length&&u.find(".um-search-filter").each(function(){var e=jQuery(this);if(e.find(".um-slider").length){var r=e.find(".um-slider").data("field_name"),t=um_get_data_for_directory(u,"filter_"+r+"_from"),a=um_get_data_for_directory(u,"filter_"+r+"_to");void 0===t&&void 0===a||(_[r]=[t,a])}else if(e.find(".um-datepicker-filter").length){r=e.find(".um-datepicker-filter").data("filter_name"),t=um_get_data_for_directory(u,"filter_"+r+"_from"),a=um_get_data_for_directory(u,"filter_"+r+"_to");void 0===t&&void 0===a||(_[r]=[t,a])}else if(e.find(".um-timepicker-filter").length){r=e.find(".um-timepicker-filter").data("filter_name"),t=um_get_data_for_directory(u,"filter_"+r+"_from"),a=um_get_data_for_directory(u,"filter_"+r+"_to");if(void 0!==t)(i=1*(t=t.split(":"))[0])<10&&(i="0"+i),(d=1*t[1])<10&&(d="0"+d),t=i+":"+d+":00";if(void 0!==a){var i,m=a.split(":"),d=1*m[1];(i=1*m[0])<10&&(i="0"+i),d<10&&(d="0"+d),a=i+":"+d+":59"}void 0===t&&void 0===a||(_[r]=[t,a])}else if(e.find("select").length){r=e.find("select").attr("name");void 0!==(s=um_get_data_for_directory(u,"filter_"+r))&&(s=um_unsanitize_value(s),_[r]=s.split("||"))}else if(e.hasClass("um-text-filter-type")&&e.find('input[type="text"]').length){var s;r=e.find('input[type="text"]').attr("name");void 0!==(s=um_get_data_for_directory(u,"filter_"+r))&&(s=um_unsanitize_value(s),_[r]=s)}else _=wp.hooks.applyFilters("um_member_directory_custom_filter_handler",_,e,u)}),_=wp.hooks.applyFilters("um_member_directory_filter_request",_),wp.ajax.send("um_get_members",{data:_,success:function(e){um_member_directory_last_data[t]=e,um_build_template(u,e);var r=wp.template("um-members-pagination");u.find(".um-members-pagination-box").html(r(e)),u.data("total_pages",e.pagination.total_pages),e.pagination.total_pages?(u.find(".um-member-directory-sorting-options").prop("disabled",!1),u.find(".um-member-directory-view-type").removeClass("um-disabled")):(u.find(".um-member-directory-sorting-options").prop("disabled",!0),u.find(".um-member-directory-view-type").addClass("um-disabled")),wp.hooks.doAction("um_member_directory_loaded",u,e),um_init_new_dropdown(),um_members_hide_preloader(u)},error:function(e){console.log(e),um_members_hide_preloader(u)}})}else setTimeout(um_ajax_get_members,600,u,e)}function um_build_template(e,r){var t=e.data("view_type"),a=wp.template("um-member-"+t+"-"+um_members_get_hash(e));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"),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"),init_tipsy()}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(u){var _=[];return u.find(".um-search-filter").each(function(){var t,a,d,i=jQuery(this);if(i.find("input.um-datepicker-filter").length)d="datepicker",i.find("input.um-datepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(u,"filter_"+e+"_from"),t=um_get_data_for_directory(u,"filter_"+e+"_to");if(void 0!==r||void 0!==t){var a,i=jQuery(this).val(),m=u.find('input.um-datepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val();i===m?a=m:""!==i&&""!==m?a=i+" - "+m:""===i?a="before "+m:""===m&&(a="since "+i),_.push({name:e,label:jQuery(this).data("filter-label"),value_label:a,value:[r,t],type:d})}}});else if(i.find("input.um-timepicker-filter").length)d="timepicker",i.find("input.um-timepicker-filter").each(function(){if("to"!==jQuery(this).data("range")){var e=jQuery(this).data("filter_name"),r=um_get_data_for_directory(u,"filter_"+e+"_from"),t=um_get_data_for_directory(u,"filter_"+e+"_to");if(void 0!==r||void 0!==t){var a,i=jQuery(this).val(),m=u.find('input.um-timepicker-filter[data-range="to"][data-filter_name="'+e+'"]').val();i===m?a=m:""!==i&&""!==m?a=i+" - "+m:""===i?a="before "+m:""===m&&(a="since "+i),_.push({name:e,label:jQuery(this).data("filter-label"),value_label:a,value:[r,t],type:d})}}});else if(i.find("select").length){d="select",t=i.find("select").attr("name"),a=i.find("select").data("placeholder"),m=void 0===(m=um_get_data_for_directory(u,"filter_"+t))?[]:(m=um_unsanitize_value(m)).split("||"),jQuery.each(m,function(e){var r=i.find('select option[value="'+m[e]+'"]').data("value_label");_.push({name:t,label:a,value_label:r,value:m[e],type:d})})}else if(i.hasClass("um-text-filter-type")&&i.find('input[type="text"]').length){var m;d="text",t=i.find('input[type="text"]').attr("name"),a=i.find('input[type="text"]').attr("placeholder"),void 0===(m=um_get_data_for_directory(u,"filter_"+t))&&(m=""),""!=m&&_.push({name:t,label:a,value_label:m,value:m,type:d})}else if(i.find("div.ui-slider").length){d="slider",t=i.find("div.ui-slider").data("field_name");var e,r=um_get_data_for_directory(u,"filter_"+t+"_from"),s=um_get_data_for_directory(u,"filter_"+t+"_to");if(void 0===r&&void 0===s)return;e=r===s?i.find("div.um-slider-range").data("placeholder-s").replace("{value}",r).replace("{field_label}",i.find("div.um-slider-range").data("label")):i.find("div.um-slider-range").data("placeholder-p").replace("{min_range}",r).replace("{max_range}",s).replace("{field_label}",i.find("div.um-slider-range").data("label")),a=i.find("div.um-slider-range").data("label"),_.push({name:t,label:a,value_label:e,value:[r,s],type:d})}else _=wp.hooks.applyFilters("um_member_directory_get_filter_data",_,u,i)}),_}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);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","");var a=!1;if(!(a=wp.hooks.applyFilters("um_member_directory_ignore_after_search",a,e)))if(1===e.data("must-search")&&(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)}}}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(){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(){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");if(!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="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),um_set_url_from_data(r,"page",1===e?"":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),um_set_url_from_data(e,"page",1===r?"":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))return;var t=um_sanitize_value(jQuery(this).val()),a=jQuery(this).prop("name"),i=um_get_data_for_directory(r,"filter_"+a);if(void 0===i&&(i=""),t===i)return;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(),1d.data("total_pages")&&(r=d.data("total_pages")),d.data("page",r).attr("data-page",r),d.find(".um-member-directory-sorting").length){var t=um_get_data_for_directory(d,"sort");void 0===t&&(t=d.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]').find('a[data-default="1"]').data("value")),d.data("sorting",t);var a=d.find('.um-new-dropdown[data-element=".um-member-directory-sorting-a"]');a.find("a").data("selected",0).prop("data-selected",0).attr("data-selected",0),a.find('a[data-value="'+t+'"]').data("selected",1).prop("data-selected",1).attr("data-selected",1),d.find(".um-member-directory-sorting-a").find("> a").html(a.find('a[data-value="'+t+'"]').html())}if(d.find(".um-member-directory-view-type").length){var i=um_get_data_for_directory(d,"view_type");void 0===i&&(i=d.find('.um-member-directory-view-type-a[data-default="1"]').data("type")),d.data("view_type",i),d.find(".um-member-directory-view-type .um-member-directory-view-type-a").hide(),d.find('.um-member-directory-view-type .um-member-directory-view-type-a[data-type="'+i+'"]').show()}d.find(".um-datepicker-filter").each(function(){var e=jQuery(this),r=e.pickadate("picker"),t=e.data("filter_name"),a=e.data("range"),i=um_get_data_for_directory(d,"filter_"+t+"_"+a);void 0!==i?r.set("select",1e3*i):r.clear()}),d.find(".um-slider").each(function(){var e=jQuery(this),r=e.data("field_name"),t=um_get_data_for_directory(d,"filter_"+r+"_from"),a=um_get_data_for_directory(d,"filter_"+r+"_to");void 0===t&&(t=e.data("min")),t=parseInt(t),void 0===a&&(a=e.data("max")),a=parseInt(a),e.slider("values",[t,a]),um_set_range_label(e)}),d.find(".um-timepicker-filter").each(function(){var e=jQuery(this),r=e.pickatime("picker"),t=e.data("filter_name"),a=e.data("range"),i=um_get_data_for_directory(d,"filter_"+t+"_"+a);if(void 0!==i){var m=i.split(":");r.set("select",60*m[0])}else r.clear()});var m=!1;if(!(m=wp.hooks.applyFilters("um_member_directory_ignore_after_search",m,d))&&1===d.data("must-search")){var s=um_get_search(d);if(!um_get_filters_data(d).length&&!s)return d.data("searched",0),void um_members_hide_preloader(d);d.data("searched",1)}wp.hooks.applyFilters("um_member_directory_prevent_default_first_loading",!1,d,e)||(um_ajax_get_members(d),um_change_tag(d))})})}); \ No newline at end of file diff --git a/assets/js/um-scripts.js b/assets/js/um-scripts.js index e75713e0..08cb66dd 100644 --- a/assets/js/um-scripts.js +++ b/assets/js/um-scripts.js @@ -167,11 +167,21 @@ jQuery(document).ready(function() { jQuery(".um-s2").each( function( e ) { var obj = jQuery(this); - obj.select2({ - allowClear: false, - minimumResultsForSearch: 10, - dropdownParent: obj.parent() - }).on( 'change', unselectEmptyOption ); + // fix https://github.com/ultimatemember/ultimatemember/issues/941 + // using .um-custom-shortcode-tab class as temporarily solution + var atts = {}; + if ( obj.parents('.um-custom-shortcode-tab').length ) { + atts = { + allowClear: false + }; + } else { + atts = { + allowClear: false, + minimumResultsForSearch: 10, + dropdownParent: obj.parent() + }; + } + obj.select2( atts ).on( 'change', unselectEmptyOption ); } ); jQuery(".um-s3").each( function( e ) { diff --git a/assets/js/um-scripts.min.js b/assets/js/um-scripts.min.js index 1c765efa..a9fdc619 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");a.innerText=e;var i=a.innerHTML;return t&&jQuery(t).val(i),i}function um_unsanitize_value(e){var t=document.createElement("textarea");return t.innerHTML=e,0===t.childNodes.length?"":t.childNodes[0].nodeValue}function um_init_datetimepicker(){jQuery(".um-datepicker:not(.picker__input)").each(function(){var e=jQuery(this),t=!1;void 0!==e.attr("data-disabled_weekdays")&&""!==e.attr("data-disabled_weekdays")&&(t=JSON.parse(e.attr("data-disabled_weekdays")));var a=null;void 0!==e.attr("data-years")&&(a=e.attr("data-years"));var i=e.attr("data-date_min"),r=e.attr("data-date_max"),n=[],u=[];void 0!==i&&(n=i.split(",")),void 0!==r&&(u=r.split(","));var o=n.length?new Date(n):null,d=n.length?new Date(u):null;if(o&&"Invalid Date"==o.toString()&&3==n.length){var s=n[1]+"/"+n[2]+"/"+n[0];o=new Date(Date.parse(s))}if(d&&"Invalid Date"==d.toString()&&3==u.length){var l=u[1]+"/"+u[2]+"/"+u[0];d=new Date(Date.parse(l))}var c={disable:t,format:e.attr("data-format"),formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()}};null!==a&&(c.selectYears=a),null!==o&&(c.min=o),null!==d&&(c.max=d),e.pickadate(c)}),jQuery(".um-timepicker:not(.picker__input)").each(function(){var e=jQuery(this);e.pickatime({format:e.attr("data-format"),interval:parseInt(e.attr("data-intervals")),formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()}})})}function init_tipsy(){"function"==typeof jQuery.fn.tipsy&&(jQuery(".um-tip-n").tipsy({gravity:"n",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-w").tipsy({gravity:"w",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-e").tipsy({gravity:"e",opacity:1,live:"a.live",offset:3}),jQuery(".um-tip-s").tipsy({gravity:"s",opacity:1,live:"a.live",offset:3}))}jQuery(document).ready(function(){function a(e){var a=jQuery(e.currentTarget),t=a.find(":selected");1

- edit_mode_value ) ? $this->edit_mode_value : 0 ) ?> /> + edit_mode_value ) ? $this->edit_mode_value : UM()->options()->get( 'require_strongpass' ) ) ?> />

array( 'sanitize' => 'bool', ), - 'reset_require_strongpass' => array( + 'require_strongpass' => array( 'sanitize' => 'bool', ), 'password_min_chars' => array( @@ -721,9 +721,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'account_general_password' => array( 'sanitize' => 'bool', ), - 'account_require_strongpass' => array( - 'sanitize' => 'bool', - ), 'account_hide_in_directory' => array( 'sanitize' => 'bool', ), @@ -1049,10 +1046,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ), ), array( - 'id' => 'reset_require_strongpass', + 'id' => 'require_strongpass', 'type' => 'checkbox', - 'label' => __( 'Require a strong password? (when user resets password only)', 'ultimate-member' ), - 'tooltip' => __( 'Enable or disable a strong password rules on password reset and change procedure', 'ultimate-member' ), + 'label' => __( 'Require a strong password?', 'ultimate-member' ), + 'tooltip' => __( 'Enable or disable a strong password rules common for all Ultimate Member forms.', 'ultimate-member' ), ), array( 'id' => 'password_min_chars', @@ -1165,12 +1162,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'label' => __( 'Password is required?', 'ultimate-member' ), 'tooltip' => __( 'Password is required to save account data.', 'ultimate-member' ), ), - array( - 'id' => 'account_require_strongpass', - 'type' => 'checkbox', - 'label' => __( 'Require a strong password?', 'ultimate-member' ), - 'tooltip' => __( 'Enable or disable a strong password rules on account page / change password tab', 'ultimate-member' ), - ), array( 'id' => 'account_hide_in_directory', 'type' => 'checkbox', @@ -3172,7 +3163,7 @@ Enable Members Directory: info_value( UM()->options()->get('me Use Gravatars: info_value( UM()->options()->get('use_gravatars'), 'yesno', true ); ?> options()->get('use_gravatars') ): ?>Gravatar builtin image: options()->get('use_um_gravatar_default_builtin_image') . "\n"; ?> UM Avatar as blank Gravatar: info_value( UM()->options()->get('use_um_gravatar_default_image'), 'yesno', true ); ?> -Require a strong password: info_value( UM()->options()->get('reset_require_strongpass'), 'onoff', true ); ?> +Require a strong password: info_value( UM()->options()->get('require_strongpass'), 'onoff', true ); ?> --- UM Access Configuration --- diff --git a/includes/admin/core/packages/2.3.0/functions.php b/includes/admin/core/packages/2.3.0/functions.php new file mode 100644 index 00000000..51f0b60d --- /dev/null +++ b/includes/admin/core/packages/2.3.0/functions.php @@ -0,0 +1,152 @@ +admin()->check_ajax_nonce(); + + um_maybe_unset_time_limit(); + + $forms_query = new WP_Query; + $forms = $forms_query->query( array( + 'post_type' => 'um_form', + 'posts_per_page' => -1, + 'fields' => 'ids' + ) ); + + $fields_for_upgrade = array(); + + foreach ( $forms as $form_id ) { + $forms_fields = get_post_meta( $form_id, '_um_custom_fields', true ); + + $changed = false; + foreach ( $forms_fields as $key => &$field ) { + if ( isset( $field['validate'] ) && 'skype' === $field['validate'] ) { + if ( isset( $field['type'] ) && 'url' === $field['type'] ) { + $field['type'] = 'text'; + $changed = true; + + $fields_for_upgrade[] = $field['metakey']; + } + } + } + + if ( $changed ) { + update_post_meta( $form_id, '_um_custom_fields', $forms_fields ); + } + } + + $changed = false; + $custom_fields = get_option( 'um_fields', array() ); + foreach ( $custom_fields as &$custom_field ) { + if ( isset( $custom_field['validate'] ) && 'skype' === $custom_field['validate'] ) { + if ( isset( $custom_field['type'] ) && 'url' === $custom_field['type'] ) { + $custom_field['type'] = 'text'; + $changed = true; + + $fields_for_upgrade[] = $custom_field['metakey']; + } + } + } + if ( $changed ) { + update_option( 'um_fields', $custom_fields ); + } + + $fields_for_upgrade = array_unique( $fields_for_upgrade ); + + if ( ! empty( $fields_for_upgrade ) ) { + update_option( 'um_upgrade_230_skype_fields_for_upgrade', $fields_for_upgrade ); + wp_send_json_success( array( 'message' => __( 'SkypeID fields have been updated successfully', 'ultimate-member' ), 'count' => count( $fields_for_upgrade ) ) ); + } else { + wp_send_json_success( array( 'message' => __( 'Database has been updated successfully', 'ultimate-member' ), 'count' => 0 ) ); + } +} + + +function um_upgrade_usermeta_count230() { + UM()->admin()->check_ajax_nonce(); + + um_maybe_unset_time_limit(); + + $fields_for_upgrade = get_option( 'um_upgrade_230_skype_fields_for_upgrade', array() ); + + if ( ! empty( $fields_for_upgrade ) ) { + global $wpdb; + $count = $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->usermeta} WHERE meta_key IN( '" . implode( "','", $fields_for_upgrade ) . "' )" ); + } else { + $count = 0; + } + + wp_send_json_success( array( 'count' => $count ) ); +} + + +function um_upgrade_usermeta_part230() { + UM()->admin()->check_ajax_nonce(); + + um_maybe_unset_time_limit(); + + if ( empty( $_POST['page'] ) ) { + wp_send_json_error( __( 'Wrong data', 'ultimate-member' ) ); + } + + $fields_for_upgrade = get_option( 'um_upgrade_230_skype_fields_for_upgrade', array() ); + if ( empty( $fields_for_upgrade ) ) { + wp_send_json_success( array( 'message' => __( 'Database has been updated successfully', 'ultimate-member' ) ) ); + } + + $per_page = 100; + + // avoid 'https://', 'http://' at the start of the Skype field is there is nickname but not https://join.skype.com/ + // change only links with nickname skip https://join.skype.com/ + global $wpdb; + $usermetas = $wpdb->get_results( + $wpdb->prepare( + "SELECT user_id, + meta_key, + meta_value + FROM {$wpdb->usermeta} + WHERE meta_key IN( '" . implode( "','", $fields_for_upgrade ) . "' ) + LIMIT %d, %d", + ( absint( $_POST['page'] ) - 1 ) * $per_page, + $per_page + ), + ARRAY_A + ); + + if ( ! empty( $usermetas ) ) { + foreach ( $usermetas as $usermeta ) { + if ( false !== strstr( $usermeta['meta_value'], 'https://' ) || false !== strstr( $usermeta['meta_value'], 'http://' ) ) { + if ( false === strstr( $usermeta['meta_value'], 'join.skype.com/' ) ) { + $usermeta['meta_value'] = str_replace( array( 'https://', 'http://' ), '', $usermeta['meta_value'] ); + update_user_meta( $usermeta['user_id'], $usermeta['meta_key'], $usermeta['meta_value'] ); + + delete_option( "um_cache_userdata_{$usermeta['user_id']}" ); + } + } + } + } + + $from = ( absint( $_POST['page'] ) * $per_page ) - $per_page + 1; + $to = absint( $_POST['page'] ) * $per_page; + + wp_send_json_success( array( 'message' => sprintf( __( 'Metadata from %s to %s row were upgraded successfully...', 'ultimate-member' ), $from, $to ) ) ); +} + + +function um_upgrade_reset_password230() { + UM()->admin()->check_ajax_nonce(); + + um_maybe_unset_time_limit(); + + $require_strongpass = UM()->options()->get( 'account_require_strongpass' ) || UM()->options()->get( 'reset_require_strongpass' ); + + UM()->options()->update( 'require_strongpass', $require_strongpass ); + UM()->options()->remove( 'account_require_strongpass' ); + UM()->options()->remove( 'reset_require_strongpass' ); + + // delete temporarily option for fields upgrade + delete_option( 'um_upgrade_230_skype_fields_for_upgrade' ); + update_option( 'um_last_version_upgrade', '2.3.0' ); + + wp_send_json_success( array( 'message' => __( 'Reset Password options have been updated successfully.', 'ultimate-member' ) ) ); +} diff --git a/includes/admin/core/packages/2.3.0/hooks.php b/includes/admin/core/packages/2.3.0/hooks.php new file mode 100644 index 00000000..6535c2c0 --- /dev/null +++ b/includes/admin/core/packages/2.3.0/hooks.php @@ -0,0 +1,8 @@ + 'skypeid_fields230', + 'usermeta_count230' => 'usermeta_count230', + 'usermeta_part230' => 'usermeta_part230', + 'reset_password230' => 'reset_password230', +); diff --git a/includes/admin/core/packages/2.3.0/init.php b/includes/admin/core/packages/2.3.0/init.php new file mode 100644 index 00000000..3c620efe --- /dev/null +++ b/includes/admin/core/packages/2.3.0/init.php @@ -0,0 +1,133 @@ + + + + diff --git a/includes/class-config.php b/includes/class-config.php index ab3fa770..2c968714 100644 --- a/includes/class-config.php +++ b/includes/class-config.php @@ -522,7 +522,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'use_gravatars' => 0, 'use_um_gravatar_default_builtin_image' => 'default', 'use_um_gravatar_default_image' => 0, - 'reset_require_strongpass' => 0, + 'require_strongpass' => 0, 'password_min_chars' => 8, 'password_max_chars' => 30, 'account_tab_password' => 1, @@ -538,7 +538,6 @@ if ( ! class_exists( 'um\Config' ) ) { 'account_general_password' => 0, 'account_hide_in_directory' => 1, 'account_hide_in_directory_default' => 'No', - 'account_require_strongpass' => 0, 'photo_thumb_sizes' => array( 40, 80, 190 ), 'cover_thumb_sizes' => array( 300, 600 ), 'accessible' => 0, diff --git a/includes/class-functions.php b/includes/class-functions.php index 3a770725..1c75d127 100644 --- a/includes/class-functions.php +++ b/includes/class-functions.php @@ -387,7 +387,7 @@ if ( ! class_exists( 'UM_Functions' ) ) { if ( is_array( $var ) ) { return array_map( array( $this, 'clean_array' ), $var ); } else { - return is_scalar( $var ) ? sanitize_text_field( $var ) : $var; + return ! is_scalar( $var ) ? sanitize_text_field( $var ) : $var; } } diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php index 3d30bfd0..62f6c395 100644 --- a/includes/core/class-builtin.php +++ b/includes/core/class-builtin.php @@ -930,7 +930,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'url_text' => 'LinkedIn', 'advanced' => 'social', 'color' => '#0976b4', - 'match' => 'https://linkedin.com/in/', + 'match' => 'https://linkedin.com/', ), 'googleplus' => array( @@ -972,7 +972,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'skype' => array( 'title' => __('Skype ID','ultimate-member'), 'metakey' => 'skype', - 'type' => 'url', + 'type' => 'text', 'label' => __('Skype ID','ultimate-member'), 'required' => 0, 'public' => 1, @@ -981,7 +981,64 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'url_rel' => 'nofollow', 'icon' => 'um-faicon-skype', 'validate' => 'skype', - 'url_text' => 'Skype', + 'url_text' => __( 'Join chat', 'ultimate-member' ), + ), + + 'viber' => array( + 'title' => __('Viber number','ultimate-member'), + 'metakey' => 'viber', + 'type' => 'text', + 'label' => __('Viber number','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-icon-ios-telephone', + 'validate' => 'phone_number', + ), + + 'whatsapp' => array( + 'title' => __('WhatsApp number','ultimate-member'), + 'metakey' => 'whatsapp', + 'type' => 'text', + 'label' => __('WhatsApp number','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-icon-social-whatsapp', + 'validate' => 'phone_number', + ), + + 'telegram' => array( + 'title' => __('Telegram','ultimate-member'), + 'metakey' => 'telegram', + 'type' => 'url', + 'label' => __('Telegram','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'icon' => 'um-faicon-paper-plane', + 'validate' => 'telegram_url', + 'url_text' => 'Telegram', + 'match' => 'https://t.me/', + ), + + 'discord' => array( + 'title' => __('Discord','ultimate-member'), + 'metakey' => 'discord', + 'type' => 'text', + 'label' => __('Discord ID','ultimate-member'), + 'required' => 0, + 'public' => 1, + 'editable' => 1, + 'url_target' => '_blank', + 'url_rel' => 'nofollow', + 'validate' => 'discord', ), 'youtube' => array( @@ -1409,6 +1466,8 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { $array['unique_username_or_email'] = __('Unique Username/E-mail','ultimate-member'); $array['url'] = __('Website URL','ultimate-member'); $array['youtube_url'] = __('YouTube Profile','ultimate-member'); + $array['telegram_url'] = __('Telegram URL','ultimate-member'); + $array['discord'] = __('Discord ID','ultimate-member'); $array['custom'] = __('Custom Validation','ultimate-member'); /** @@ -1524,7 +1583,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { "iu" => __("Inuktitut",'ultimate-member'), "ja" => __("Japanese",'ultimate-member'), "jv" => __("Javanese",'ultimate-member'), - "ka" => __("Georgian",'ultimate-member'), + "ka" => __("Kartuli",'ultimate-member'), "kg" => __("Kongo",'ultimate-member'), "ki" => __("Kikuyu",'ultimate-member'), "kj" => __("Kwanyama",'ultimate-member'), @@ -1716,7 +1775,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'TF' => __('French Southern Territories','ultimate-member'), 'GA' => __('Gabon','ultimate-member'), 'GM' => __('Gambia','ultimate-member'), - 'GE' => __('Georgia','ultimate-member'), + 'GE' => __('Sakartvelo','ultimate-member'), 'DE' => __('Germany','ultimate-member'), 'GH' => __('Ghana','ultimate-member'), 'GI' => __('Gibraltar','ultimate-member'), diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 7d37106f..0e6343b1 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -264,6 +264,51 @@ if ( ! class_exists( 'um\core\Fields' ) ) { unset( $form_fields[ $id ] ); update_post_meta( $form_id, '_um_custom_fields', $form_fields ); } + + $directories = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'um_directory'" ); + foreach ( $directories as $directory_id ) { + // Frontend filters + $directory_search_fields = get_post_meta( $directory_id, '_um_search_fields', true ); + $directory_search_fields = array_values( array_diff( $directory_search_fields, array( $id ) ) ); + update_post_meta( $directory_id, '_um_search_fields', $directory_search_fields ); + + // Admin filtering + $directory_search_filters = get_post_meta( $directory_id, '_um_search_filters', true ); + unset( $directory_search_filters[ $id ] ); + update_post_meta( $directory_id, '_um_search_filters', $directory_search_filters ); + + // display in tagline + $directory_reveal_fields = get_post_meta( $directory_id, '_um_reveal_fields', true ); + $directory_reveal_fields = array_values( array_diff( $directory_reveal_fields, array( $id ) ) ); + update_post_meta( $directory_id, '_um_reveal_fields', $directory_reveal_fields ); + + // extra user information section + $directory_tagline_fields = get_post_meta( $directory_id, '_um_tagline_fields', true ); + $directory_tagline_fields = array_values( array_diff( $directory_tagline_fields, array( $id ) ) ); + update_post_meta( $directory_id, '_um_tagline_fields', $directory_tagline_fields ); + + // Custom fields selected in "Choose field(s) to enable in sorting" + $directory_sorting_fields = get_post_meta( $directory_id, '_um_sorting_fields', true ); + foreach ( $directory_sorting_fields as $key => $sorting_data ) { + if ( is_array( $sorting_data ) && array_key_exists( $id, $sorting_data ) ) { + unset( $directory_sorting_fields[ $key ] ); + } + } + $directory_sorting_fields = array_values( $directory_sorting_fields ); + update_post_meta( $directory_id, '_um_sorting_fields', $directory_sorting_fields ); + + // If "Default sort users by" = "Other (Custom Field)" is selected when delete this custom field and set default sorting + $directory_sortby_custom = get_post_meta( $directory_id, '_um_sortby_custom', true ); + if ( $directory_sortby_custom === $id ) { + $directory_sortby = get_post_meta( $directory_id, '_um_sortby', true ); + if ( 'other' === $directory_sortby ) { + update_post_meta( $directory_id, '_um_sortby', 'user_registered_desc' ); + } + update_post_meta( $directory_id, '_um_sortby_custom', '' ); + update_post_meta( $directory_id, '_um_sortby_custom_label', '' ); + } + } + } } diff --git a/includes/core/class-form.php b/includes/core/class-form.php index 4d7dfa5b..4d4efb96 100644 --- a/includes/core/class-form.php +++ b/includes/core/class-form.php @@ -114,7 +114,9 @@ if ( ! class_exists( 'um\core\Form' ) ) { $arr_options['status'] = 'success'; $arr_options['post'] = $_POST; - UM()->fields()->set_id = absint( $_POST['form_id'] ); + if ( isset( $_POST['form_id'] ) ) { + UM()->fields()->set_id = absint( $_POST['form_id'] ); + } UM()->fields()->set_mode = 'profile'; $form_fields = UM()->fields()->get_fields(); $arr_options['fields'] = $form_fields; @@ -122,8 +124,6 @@ if ( ! class_exists( 'um\core\Form' ) ) { if ( isset( $arr_options['post']['members_directory'] ) && 'yes' === $arr_options['post']['members_directory'] ) { $ajax_source_func = $_POST['child_callback']; if ( function_exists( $ajax_source_func ) ) { - $arr_options['items'] = call_user_func( $ajax_source_func, $arr_options['field']['parent_dropdown_relationship'] ); - global $wpdb; $values_array = $wpdb->get_col( @@ -137,7 +137,16 @@ if ( ! class_exists( 'um\core\Form' ) ) { ); if ( ! empty( $values_array ) ) { - $arr_options['items'] = array_intersect( $arr_options['items'], $values_array ); + $parent_dropdown = isset( $arr_options['field']['parent_dropdown_relationship'] ) ? $arr_options['field']['parent_dropdown_relationship'] : ''; + $arr_options['items'] = call_user_func( $ajax_source_func, $parent_dropdown ); + + if ( array_keys( $arr_options['items'] ) !== range( 0, count( $arr_options['items'] ) - 1 ) ) { + // array with dropdown items is associative + $arr_options['items'] = array_intersect_key( array_map( 'trim', $arr_options['items'] ), array_flip( $values_array ) ); + } else { + // array with dropdown items has sequential numeric keys, starting from 0 and there are intersected values with $values_array + $arr_options['items'] = array_intersect( $arr_options['items'], $values_array ); + } } else { $arr_options['items'] = array(); } diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index 470410d7..7f21d69e 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -876,7 +876,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { function slider_range_placeholder( $filter, $attrs ) { switch ( $filter ) { default: { - $label = ucwords( str_replace( array( 'um_', '_' ), array( '', ' ' ), $filter ) ); + $label = ! empty( $attrs['label'] ) ? $attrs['label'] : $filter; + $label = ucwords( str_replace( array( 'um_', '_' ), array( '', ' ' ), $label ) ); $placeholders = apply_filters( 'um_member_directory_filter_slider_range_placeholder', false, $filter ); if ( ! $placeholders ) { diff --git a/includes/core/class-password.php b/includes/core/class-password.php index b6e0605b..03754389 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -457,10 +457,7 @@ if ( ! class_exists( 'um\core\Password' ) ) { UM()->form()->add_error( 'username_b', __( 'Please provide your username or email', 'ultimate-member' ) ); } - if ( ( ! is_email( $user ) && ! username_exists( $user ) ) || ( is_email( $user ) && ! email_exists( $user ) ) ) { - UM()->form()->add_error( 'username_b', __( 'We can\'t find an account registered with that address or username', 'ultimate-member' ) ); - } else { - + if ( ( ! is_email( $user ) && username_exists( $user ) ) || ( is_email( $user ) && email_exists( $user ) ) ) { if ( is_email( $user ) ) { $user_id = email_exists( $user ); } else { @@ -507,9 +504,10 @@ if ( ! class_exists( 'um\core\Password' ) ) { $data = get_user_by( 'email', $user ); } - um_fetch_user( $data->ID ); - - UM()->user()->password_reset(); + if ( isset( $data ) && is_a( $data, '\WP_User' ) ) { + um_fetch_user( $data->ID ); + UM()->user()->password_reset(); + } exit( wp_redirect( um_get_core_page('password-reset', 'checkemail' ) ) ); } @@ -541,7 +539,7 @@ if ( ! class_exists( 'um\core\Password' ) ) { $args['confirm_user_password'] = sanitize_text_field( $args['confirm_user_password'] ); } - if ( UM()->options()->get( 'reset_require_strongpass' ) ) { + if ( UM()->options()->get( 'require_strongpass' ) ) { $min_length = UM()->options()->get( 'password_min_chars' ); $min_length = ! empty( $min_length ) ? $min_length : 8; diff --git a/includes/core/class-roles-capabilities.php b/includes/core/class-roles-capabilities.php index d0ad7dc9..29338c66 100644 --- a/includes/core/class-roles-capabilities.php +++ b/includes/core/class-roles-capabilities.php @@ -21,6 +21,23 @@ if ( ! class_exists( 'um\core\Roles_Capabilities' ) ) { function __construct() { add_action( 'wp_roles_init', array( &$this, 'um_roles_init' ), 99999 ); add_action( 'update_option', array( &$this, 'um_on_roles_update' ), 10, 3 ); + add_action( 'set_user_role', array( &$this, 'remove_user_cache' ), 10, 1 ); + } + + + /** + * Flush the Cache User Profile on set new user role(s) + * + * @param int $user_id + */ + function remove_user_cache( $user_id ) { + $user = get_userdata( $user_id ); + + if ( ! is_a( $user, '\WP_User' ) ) { + return; + } + + UM()->user()->remove_cache( $user_id ); } diff --git a/includes/core/class-validation.php b/includes/core/class-validation.php index a070a331..3589e691 100644 --- a/includes/core/class-validation.php +++ b/includes/core/class-validation.php @@ -284,6 +284,27 @@ if ( ! class_exists( 'um\core\Validation' ) ) { } + /** + * Is Discord ID? + * + * @param $string + * + * @return bool + */ + public function is_discord_id( $string ) { + if ( ! $string ) { + return true; + } + if ( substr_count( $string, '#' ) > 1 ) { + return false; + } + if ( ! preg_match( '/^(.+)#(\d+)$/', trim( $string ) ) ) { + return false; + } + return true; + } + + /** * Is url * @@ -396,4 +417,4 @@ if ( ! class_exists( 'um\core\Validation' ) ) { } } -} \ No newline at end of file +} diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 93126416..0f5043e9 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -81,7 +81,7 @@ function um_submit_account_errors_hook( $args ) { return; } - if ( UM()->options()->get( 'account_require_strongpass' ) ) { + if ( UM()->options()->get( 'require_strongpass' ) ) { $min_length = UM()->options()->get( 'password_min_chars' ); $min_length = ! empty( $min_length ) ? $min_length : 8; $max_length = UM()->options()->get( 'password_max_chars' ); @@ -144,7 +144,7 @@ function um_submit_account_errors_hook( $args ) { } if ( email_exists( $args['user_email'] ) && email_exists( $args['user_email'] ) !== get_current_user_id() ) { - UM()->form()->add_error( 'user_email', __( 'Email already linked to another account', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_email', __( 'Please provide a valid e-mail', 'ultimate-member' ) ); } } @@ -678,7 +678,7 @@ function um_after_account_privacy( $args ) { ARRAY_A ); if ( ! empty( $pending ) && $pending['post_status'] == 'request-pending' ) { - echo '

' . esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' ) . '

'; + echo '

' . esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request.', 'ultimate-member' ) . '

'; } elseif ( ! empty( $pending ) && $pending['post_status'] == 'request-confirmed' ) { echo '

' . esc_html__( 'The administrator has not yet approved deleting your data. Please expect an email with a link to your data.', 'ultimate-member' ) . '

'; } else { @@ -756,7 +756,11 @@ function um_request_user_data() { $answer = esc_html( $request_id->get_error_message() ); } else { wp_send_user_request( $request_id ); - $answer = esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' ); + if ( 'um-export-data' === $request_action ) { + $answer = esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your export request.', 'ultimate-member' ); + } elseif ( 'um-erase-data' === $request_action ) { + $answer = esc_html__( 'A confirmation email has been sent to your email. Click the link within the email to confirm your deletion request.', 'ultimate-member' ); + } } wp_send_json_success( array( 'answer' => $answer ) ); diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index ac20fdcf..f3a0fe49 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -709,6 +709,12 @@ function um_submit_form_errors_hook_( $args ) { } break; + case 'telegram_url': + if ( ! UM()->validation()->is_url( $args[ $key ], 't.me' ) ) { + UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s username or profile URL', 'ultimate-member' ), $array['label'] ) ); + } + break; + case 'soundcloud_url': if ( ! UM()->validation()->is_url( $args[ $key ], 'soundcloud.com' ) ) { UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s username or profile URL','ultimate-member'), $array['label'] ) ); @@ -752,6 +758,12 @@ function um_submit_form_errors_hook_( $args ) { } break; + case 'discord': + if ( ! UM()->validation()->is_discord_id( $args[ $key ] ) ) { + UM()->form()->add_error( $key, __( 'Please enter a valid Discord ID', 'ultimate-member' ) ); + } + break; + case 'url': if ( ! UM()->validation()->is_url( $args[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Please enter a valid URL', 'ultimate-member' ) ); @@ -763,7 +775,7 @@ function um_submit_form_errors_hook_( $args ) { if ( $args[ $key ] == '' ) { UM()->form()->add_error( $key, __( 'You must provide a username', 'ultimate-member' ) ); } elseif ( $mode == 'register' && username_exists( sanitize_user( $args[ $key ] ) ) ) { - UM()->form()->add_error( $key, __( 'Your username is already taken', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The username you entered is incorrect', 'ultimate-member' ) ); } elseif ( is_email( $args[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Username cannot be an email', 'ultimate-member' ) ); } elseif ( ! UM()->validation()->safe_username( $args[ $key ] ) ) { @@ -775,11 +787,11 @@ function um_submit_form_errors_hook_( $args ) { case 'unique_username_or_email': if ( $args[ $key ] == '' ) { - UM()->form()->add_error( $key, __( 'You must provide a username', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'You must provide a username or email', 'ultimate-member' ) ); } elseif ( $mode == 'register' && username_exists( sanitize_user( $args[ $key ] ) ) ) { - UM()->form()->add_error( $key, __( 'Your username is already taken', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The username you entered is incorrect', 'ultimate-member' ) ); } elseif ( $mode == 'register' && email_exists( $args[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( ! UM()->validation()->safe_username( $args[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Your username contains invalid characters', 'ultimate-member' ) ); } @@ -801,11 +813,11 @@ function um_submit_form_errors_hook_( $args ) { if ( $args[ $key ] == '' && in_array( $key, array( 'user_email' ) ) ) { UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) ); } elseif ( in_array( $mode, array( 'register' ) ) && $email_exists ) { - UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( in_array( $mode, array( 'profile' ) ) && $email_exists && $email_exists != $args['user_id'] ) { - UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) ); - } elseif ( !is_email( $args[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'This is not a valid email', 'ultimate-member') ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); + } elseif ( ! is_email( $args[ $key ] ) ) { + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member') ); } elseif ( ! UM()->validation()->safe_username( $args[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Your email contains invalid characters', 'ultimate-member' ) ); } @@ -813,16 +825,16 @@ function um_submit_form_errors_hook_( $args ) { } else { if ( $args[ $key ] != '' && ! is_email( $args[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'This is not a valid email', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( $args[ $key ] != '' && email_exists( $args[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( $args[ $key ] != '' ) { $users = get_users( 'meta_value=' . $args[ $key ] ); foreach ( $users as $user ) { if ( $user->ID != $args['user_id'] ) { - UM()->form()->add_error( $key, __( 'This email is already linked to an existing account', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } } diff --git a/includes/core/um-actions-login.php b/includes/core/um-actions-login.php index 3f6ce611..ce83d2b3 100644 --- a/includes/core/um-actions-login.php +++ b/includes/core/um-actions-login.php @@ -65,12 +65,12 @@ function um_submit_form_errors_hook_login( $args ) { $user = apply_filters( 'authenticate', null, $authenticate, $args['user_password'] ); if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes ) ) { - UM()->form()->add_error( $user->get_error_code(), __( $user->get_error_message(), 'ultimate-member' ) ); + UM()->form()->add_error( $user->get_error_code(), __( 'Password is incorrect. Please try again.', 'ultimate-member' ) ); } $user = apply_filters( 'wp_authenticate_user', $user, $args['user_password'] ); if ( is_wp_error( $user ) && ! in_array( $user->get_error_code(), $ignore_codes ) ) { - UM()->form()->add_error( $user->get_error_code(), __( $user->get_error_message(), 'ultimate-member' ) ); + UM()->form()->add_error( $user->get_error_code(), __( 'Password is incorrect. Please try again.', 'ultimate-member' ) ); } // if there is an error notify wp diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 25bb9b18..12d06e13 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -721,7 +721,11 @@ function um_profile_dynamic_meta_desc() { $locale = get_user_locale( $user_id ); $site_name = get_bloginfo( 'name' ); - $twitter_site = '@' . sanitize_title( $site_name ); + + $twitter = (string) um_user( 'twitter' ); + if ( ! empty( $twitter ) ) { + $twitter = trim( str_replace( 'https://twitter.com/', '', $twitter ), "/ \n\r\t\v\0" ); + } $title = trim( um_user( 'display_name' ) ); $description = um_convert_tags( UM()->options()->get( 'profile_desc' ) ); @@ -763,7 +767,9 @@ function um_profile_dynamic_meta_desc() { - + + + diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 35761200..2589a3b3 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -99,6 +99,38 @@ 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 viber link + * + * @param $value + * @param $data + * + * @return int|string + */ +function um_profile_field_filter_hook__viber( $value, $data ) { + $value = str_replace('+', '', $value); + $value = '' . esc_html( $value ) . ''; + return $value; +} +add_filter( 'um_profile_field_filter_hook__viber', 'um_profile_field_filter_hook__viber', 99, 2 ); + + +/** + * Outputs a whatsapp link + * + * @param $value + * @param $data + * + * @return int|string + */ +function um_profile_field_filter_hook__whatsapp( $value, $data ) { + $value = str_replace('+', '', $value); + $value = '' . esc_html( $value ) . ''; + return $value; +} +add_filter( 'um_profile_field_filter_hook__whatsapp', 'um_profile_field_filter_hook__whatsapp', 99, 2 ); + + /** * Outputs a google map * @@ -353,48 +385,45 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) { return ''; } - if ( ( isset( $data['validate'] ) && $data['validate'] !== '' && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && $data['type'] == 'url' ) ) { - $alt = ( isset( $data['url_text'] ) && !empty( $data['url_text'] ) ) ? $data['url_text'] : $value; + if ( isset( $data['type'] ) && 'text' === $data['type'] && isset( $data['validate'] ) && 'skype' === $data['validate'] ) { + $alt = ! empty( $data['url_text'] ) ? $data['url_text'] : $value; $url_rel = ( isset( $data['url_rel'] ) && $data['url_rel'] == 'nofollow' ) ? 'rel="nofollow"' : ''; - if ( ! strstr( $value, 'http' ) - && !strstr( $value, '://' ) - && !strstr( $value, 'www.' ) - && !strstr( $value, '.com' ) - && !strstr( $value, '.net' ) - && !strstr( $value, '.org' ) - ) { - if ( $data['validate'] == 'soundcloud_url' ) $value = 'https://soundcloud.com/' . $value; - if ( $data['validate'] == 'youtube_url' ) $value = 'https://youtube.com/user/' . $value; - if ( $data['validate'] == 'facebook_url' ) $value = 'https://facebook.com/' . $value; - if ( $data['validate'] == 'twitter_url' ) $value = 'https://twitter.com/' . $value; - if ( $data['validate'] == 'linkedin_url' ) $value = 'https://linkedin.com/' . $value; - if ( $data['validate'] == 'skype' ) $value = 'skype:'.$value.'?chat'; - if ( $data['validate'] == 'googleplus_url' ) $value = 'https://plus.google.com/' . $value; - if ( $data['validate'] == 'instagram_url' ) $value = 'https://instagram.com/' . $value; - if ( $data['validate'] == 'vk_url' ) $value = 'https://vk.com/' . $value; + $data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank'; + + if ( false === strstr( $value, 'join.skype.com' ) ) { + $value = 'skype:' . $value . '?chat'; } - - if ( ! ( isset( $data['validate'] ) && $data['validate'] == 'skype' ) ) { + $value = '' . esc_html( $alt ) . ''; + } else { + if ( ( isset( $data['validate'] ) && $data['validate'] !== '' && strstr( $data['validate'], 'url' ) ) || ( isset( $data['type'] ) && $data['type'] == 'url' ) ) { + $alt = ( isset( $data['url_text'] ) && !empty( $data['url_text'] ) ) ? $data['url_text'] : $value; + $url_rel = ( isset( $data['url_rel'] ) && $data['url_rel'] == 'nofollow' ) ? 'rel="nofollow"' : ''; + if ( ! strstr( $value, 'http' ) + && !strstr( $value, '://' ) + && !strstr( $value, 'www.' ) + && !strstr( $value, '.com' ) + && !strstr( $value, '.net' ) + && !strstr( $value, '.org' ) + && !strstr( $value, '.me' ) + ) { + if ( $data['validate'] == 'soundcloud_url' ) $value = 'https://soundcloud.com/' . $value; + if ( $data['validate'] == 'youtube_url' ) $value = 'https://youtube.com/user/' . $value; + if ( $data['validate'] == 'telegram_url' ) $value = 'https://t.me/' . $value; + if ( $data['validate'] == 'facebook_url' ) $value = 'https://facebook.com/' . $value; + if ( $data['validate'] == 'twitter_url' ) $value = 'https://twitter.com/' . $value; + if ( $data['validate'] == 'linkedin_url' ) $value = 'https://linkedin.com/' . $value; + if ( $data['validate'] == 'googleplus_url' ) $value = 'https://plus.google.com/' . $value; + if ( $data['validate'] == 'instagram_url' ) $value = 'https://instagram.com/' . $value; + if ( $data['validate'] == 'vk_url' ) $value = 'https://vk.com/' . $value; + } if ( strpos( $value, 'http://' ) !== 0 ) { $value = 'http://' . $value; } $data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank'; $value = ''.$alt.''; - } - - } - - if ( isset( $data['validate'] ) && $data['validate'] == 'skype' ) { - - $value = str_replace('https://','',$value ); - $value = str_replace('http://','',$value ); - - $data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank'; - $value = ''.$value.''; - } if ( ! is_array( $value ) ) { diff --git a/includes/core/um-filters-navmenu.php b/includes/core/um-filters-navmenu.php index 7eb5912b..137ba0dc 100644 --- a/includes/core/um-filters-navmenu.php +++ b/includes/core/um-filters-navmenu.php @@ -1,30 +1,42 @@ shortcodes()->convert_user_tags( $items ); - return $items; - } - - um_fetch_user( get_current_user_id() ); - $items = UM()->shortcodes()->convert_user_tags( $items ); - um_reset_user(); - - return $items; -} -add_filter( 'wp_nav_menu_items', 'um_add_custom_message_to_menu', 10, 2 ); - - if ( ! is_admin() ) { + /** + * Add dynamic profile headers + * + * @param array $sorted_menu_items + * @param \stdClass $args + * + * @return array + */ + function um_add_custom_message_to_menu( $sorted_menu_items, $args ) { + + if ( is_user_logged_in() ) { + um_fetch_user( get_current_user_id() ); + } + + foreach ( $sorted_menu_items as &$menu_item ) { + if ( $menu_item->title ) { + $menu_item->title = UM()->shortcodes()->convert_user_tags( $menu_item->title ); + } + if ( $menu_item->attr_title ) { + $menu_item->attr_title = UM()->shortcodes()->convert_user_tags( $menu_item->attr_title ); + } + if ( $menu_item->description ) { + $menu_item->description = UM()->shortcodes()->convert_user_tags( $menu_item->description ); + } + } + + if ( is_user_logged_in() ) { + um_reset_user(); + } + + return $sorted_menu_items; + } + add_filter( 'wp_nav_menu_objects', 'um_add_custom_message_to_menu', 9999, 2 ); + + /** * Conditional menu items * @@ -141,4 +153,4 @@ if ( ! is_admin() ) { return um_conditional_nav_menu( $items, $args ); } add_filter( 'wp_get_nav_menu_items', 'um_get_nav_menu_items', 9999, 3 ); -} \ No newline at end of file +} diff --git a/includes/core/um-filters-profile.php b/includes/core/um-filters-profile.php index 94a30568..f6b6d869 100644 --- a/includes/core/um-filters-profile.php +++ b/includes/core/um-filters-profile.php @@ -79,7 +79,7 @@ add_filter( 'the_title', 'um_dynamic_user_profile_title', 100000, 2 ); * @return string|false The canonical URL, or false if current URL is canonical. */ function um_get_canonical_url( $canonical_url, $post ) { - if ( UM()->config()->permalinks['user'] == $post->ID ) { + if ( UM()->config()->permalinks['user'] == $post->ID || ( UM()->external_integrations()->is_wpml_active() && UM()->config()->permalinks['user'] == wpml_object_id_filter( $post->ID, 'page', true, icl_get_default_language() ) ) ) { /** * UM hook diff --git a/readme.txt b/readme.txt index 88e4c82d..87ab6464 100644 --- a/readme.txt +++ b/readme.txt @@ -7,7 +7,7 @@ Tags: community, member, membership, user-profile, user-registration Requires PHP: 5.6 Requires at least: 5.0 Tested up to: 5.8 -Stable tag: 2.2.5 +Stable tag: 2.3.0 License: GNU Version 2 or Any Later Version License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -155,6 +155,39 @@ The plugin works with popular caching plugins by automatically excluding Ultimat * To learn more about version 2.1 please see this [docs](https://docs.ultimatemember.com/article/1512-upgrade-2-1-0) * UM2.1+ is a significant update to the Member Directories' code base from 2.0.x. Please make sure you take a full-site backup with restore point before updating the plugin += 2.3.0: December 16, 2021 = + +* Enhancements: + + - Added: WhatsApp, Telegram, Discord, Viber messengers predefined fields. + - Added: Callback for deleting the custom field data from member direcroty settings when this custom field has been deleted in Form Builder. + - Added: 'um_account_active_tab_inited' JS hook. + - Updated: Require a strong password option (`Ultimate Member > Settings > General > Users > Require a strong password?`) to make it common for all Ultimate Member forms. Renamed option key from `reset_require_strongpass` to `require_strongpass`. + - Updated: Form errors texts on the login/password reset forms. Made them secure. + - Deprecated: `Ultimate Member > Settings > General > Account > Require a strong password?` option and merged with `Ultimate Member > Settings > General > Users > Require a strong password?` option. + +* Bugfixes: + + - Fixed: "Clear All" button for the filters with "&" symbol in the label. + - Fixed: Uninstall process when delete UM data. Avoid the issue when 3rd-party pages that had been selected as UM page are removed on UM uninstall. + - Fixed: Header meta for the Twitter Card. If the user has twitter field filled then will be filled by this value. + - Fixed: Member directory a slider filter's label displaying. It uses the filled label for now. + - Fixed: SkypeID field validation. Also all SkypeID fields on your forms changed type from `url` to `text`. SkypeID supports nicknames or https://join.skype.com/{hash} links. + - Fixed: Typos in Account > Privacy tab texts related to Download/Erase the user data. + - Fixed: Some typos in the fields' labels. + - Fixed: "false" display name in the member directory. It displays empty for now if the user hasn't display name. + - Fixed: `UM()->clean_array()` function. + - Fixed: LinkedIn field URL. Added ability to display the organization URL. + - Fixed: Canonical link of the user profile if WPML plugin is active. + - Fixed: Replacing placeholders in nav menus. Used an earlier hook for filtering items before generating HTML and avoided issues with raw, not-escaped HTML inside tags' attributes. + +* Templates required update: + - members-grid.php + - members-list.php + - password-reset.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + = 2.2.5: September 22, 2021 = * Enhancements: diff --git a/templates/members-grid.php b/templates/members-grid.php index 94bb5576..125e1564 100644 --- a/templates/members-grid.php +++ b/templates/members-grid.php @@ -18,7 +18,7 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
@@ -27,7 +27,7 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?> if ( $profile_photo ) { ?>
- + {{{user.avatar}}} @@ -37,11 +37,13 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
- + <# if ( user.display_name_html ) { #> + + <# } #> 100 @@ -148,4 +150,4 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
- \ No newline at end of file + diff --git a/templates/members-list.php b/templates/members-list.php index 1355fa24..09ab2d75 100644 --- a/templates/members-list.php +++ b/templates/members-list.php @@ -15,7 +15,7 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
- + {{{user.avatar}}} @@ -27,11 +27,13 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?>
- + <# if ( user.display_name_html ) { #> + + <# } #> {{{user.hook_just_after_name}}} @@ -148,4 +150,4 @@ $unique_hash = substr( md5( $args['form_id'] ), 10, 5 ); ?> <# } #>
- \ No newline at end of file + diff --git a/templates/password-reset.php b/templates/password-reset.php index 437fa184..384da0be 100644 --- a/templates/password-reset.php +++ b/templates/password-reset.php @@ -9,7 +9,7 @@
- +
@@ -44,9 +44,9 @@
@@ -55,7 +55,7 @@
- +
diff --git a/ultimate-member.php b/ultimate-member.php index 57f6df21..de72c967 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.2.5 +Version: 2.3.0 Author: Ultimate Member Author URI: http://ultimatemember.com/ Text Domain: ultimate-member diff --git a/uninstall.php b/uninstall.php index b87c6086..c322f44a 100644 --- a/uninstall.php +++ b/uninstall.php @@ -5,16 +5,21 @@ */ // Exit if accessed directly. -if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) exit; +if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) { + exit; +} -if ( ! defined( 'um_path' ) ) +if ( ! defined( 'um_path' ) ) { define( 'um_path', plugin_dir_path( __FILE__ ) ); +} -if ( ! defined( 'um_url' ) ) +if ( ! defined( 'um_url' ) ) { define( 'um_url', plugin_dir_url( __FILE__ ) ); +} -if ( ! defined( 'um_plugin' ) ) +if ( ! defined( 'um_plugin' ) ) { define( 'um_plugin', plugin_basename( __FILE__ ) ); +} //for delete Email options only for Core email notifications remove_all_filters( 'um_email_notifications' ); @@ -31,13 +36,6 @@ if ( ! empty( $delete_options ) ) { $upl_folder = UM()->files()->upload_basedir; UM()->files()->remove_dir( $upl_folder ); - //remove core pages - foreach ( UM()->config()->core_pages as $page_key => $page_value ) { - $page_id = UM()->options()->get( UM()->options()->get_core_page_id( $page_key ) ); - if ( ! empty( $page_id ) ) - wp_delete_post( $page_id, true ); - } - //remove core settings $settings_defaults = UM()->config()->settings_defaults; foreach ( $settings_defaults as $k => $v ) { @@ -45,24 +43,26 @@ if ( ! empty( $delete_options ) ) { } //delete UM Custom Post Types posts - $um_posts = get_posts( array( - 'post_type' => array( - 'um_form', - 'um_directory', - 'um_role', - 'um_private_content', - 'um_mailchimp', - 'um_profile_tabs', - 'um_social_login', - 'um_review', - 'um_frontend_posting', - 'um_notice' - ), - 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), - 'numberposts' => -1 - ) ); + $um_posts = get_posts( + array( + 'post_type' => array( + 'um_form', + 'um_directory', + 'um_role', + 'um_private_content', + 'um_mailchimp', + 'um_profile_tabs', + 'um_social_login', + 'um_review', + 'um_frontend_posting', + 'um_notice', + ), + 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), + 'numberposts' => -1, + ) + ); - foreach ( $um_posts as $um_post ){ + foreach ( $um_posts as $um_post ) { delete_option( 'um_existing_rows_' . $um_post->ID ); delete_option( 'um_form_rowdata_' . $um_post->ID ); wp_delete_post( $um_post->ID, 1 ); @@ -84,17 +84,6 @@ if ( ! empty( $delete_options ) ) { global $wpdb; - //remove extensions core pages - $ext_pages = $wpdb->get_results( " - SELECT post_id - FROM {$wpdb->postmeta} - WHERE meta_key = '_um_core' - ", ARRAY_A ); - - foreach ( $ext_pages as $page_id ) { - wp_delete_post( $page_id['post_id'], 1 ); - } - $wpdb->query( "DELETE FROM {$wpdb->usermeta} @@ -132,12 +121,12 @@ if ( ! empty( $delete_options ) ) { //remove all tables from extensions $all_tables = "SHOW TABLES LIKE '{$wpdb->prefix}um\_%'"; - $results = $wpdb->get_results( $all_tables ); - if( $results ){ - foreach( $results as $index => $value ) { - foreach( $value as $table_name ) { - $um_groups_members = $wpdb->prefix.'um_groups_members'; - if( $table_name == $um_groups_members ){ + $results = $wpdb->get_results( $all_tables ); + if ( $results ) { + foreach ( $results as $index => $value ) { + foreach ( $value as $table_name ) { + $um_groups_members = $wpdb->prefix . 'um_groups_members'; + if ( $table_name === $um_groups_members ) { $wpdb->query( " DELETE posts, term_rel, pmeta, terms, tax, commetns FROM {$wpdb->posts} posts @@ -154,6 +143,7 @@ if ( ! empty( $delete_options ) ) { WHERE posts.post_type = 'um_groups' OR posts.post_type = 'um_groups_discussion'" ); } + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $table_name is static variable $wpdb->query( "DROP TABLE IF EXISTS $table_name" ); } } @@ -161,14 +151,16 @@ if ( ! empty( $delete_options ) ) { //remove options from extensions //user photos - $um_user_photos = get_posts( array( - 'post_type' => array( - 'um_user_photos' - ), - 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), - 'numberposts' => -1 - ) ); - if( $um_user_photos ) { + $um_user_photos = get_posts( + array( + 'post_type' => array( + 'um_user_photos', + ), + 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), + 'numberposts' => -1, + ) + ); + if ( $um_user_photos ) { foreach ( $um_user_photos as $um_user_photo ) { $attachments = get_attached_media( 'image', $um_user_photo->ID ); foreach ( $attachments as $attachment ) { @@ -179,17 +171,19 @@ if ( ! empty( $delete_options ) ) { } //user notes - $um_notes = get_posts( array( - 'post_type' => array( - 'um_notes' - ), - 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), - 'numberposts' => -1 - ) ); - if( $um_notes ){ - foreach ( $um_notes as $um_note ){ + $um_notes = get_posts( + array( + 'post_type' => array( + 'um_notes', + ), + 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), + 'numberposts' => -1, + ) + ); + if ( $um_notes ) { + foreach ( $um_notes as $um_note ) { $attachments = get_attached_media( 'image', $um_note->ID ); - foreach ( $attachments as $attachment ){ + foreach ( $attachments as $attachment ) { wp_delete_attachment( $attachment->ID, 1 ); } wp_delete_post( $um_note->ID, 1 ); @@ -219,22 +213,24 @@ if ( ! empty( $delete_options ) ) { option_name LIKE 'widget_um%' OR option_name LIKE 'ultimatemember_%'" ); - foreach( $um_options as $um_option ) { + foreach ( $um_options as $um_option ) { delete_option( $um_option->option_name ); } //social activity - $um_activities = get_posts( array( - 'post_type' => array( - 'um_activity' - ), - 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), - 'numberposts' => -1 - ) ); + $um_activities = get_posts( + array( + 'post_type' => array( + 'um_activity', + ), + 'post_status' => array( 'publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash' ), + 'numberposts' => -1, + ) + ); foreach ( $um_activities as $um_activity ) { $image = get_post_meta( $um_activity->ID, '_photo', true ); - if( $image ){ - $user_id = get_post_meta( $um_activity->ID, '_user_id', true ); + if ( $image ) { + $user_id = get_post_meta( $um_activity->ID, '_user_id', true ); $upload_dir = wp_upload_dir(); $image_path = $upload_dir['basedir'] . '/ultimatemember/' . $user_id . '/' . $image; if ( file_exists( $image_path ) ) { @@ -243,4 +239,4 @@ if ( ! empty( $delete_options ) ) { } wp_delete_post( $um_activity->ID, 1 ); } -} \ No newline at end of file +}