").append(e.siblings(".um-hidden-multi-selects").clone()).html()+'
'+wp.i18n.__("Remove","ultimate-member")+" ",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker").set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.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 a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var r,u;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(u=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),r=[],jQuery.each(m,function(e){r.push(jQuery("#"+l+"_"+m[e]))}),void 0!==r[0].parents(".um-forms-line").data("conditional")&&(n=i(r[0].parents(".um-forms-line")))):"><"===t&&void 0!==(u=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,h,g;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(h=u.prop("tagName").toLowerCase())?(g=u.attr("type"),d="checkbox"==g?"1"==s?u.is(":checked"):!u.is(":checked"):Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s):"select"==h&&(d=Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(h=u.prop("tagName").toLowerCase())?(g=u.attr("type"),d="checkbox"==g?"1"==s?!u.is(":checked"):u.is(":checked"):u.val()!=s):"select"==h&&(d=u.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return h=u.prop("tagName").toLowerCase(),(d="input"==h&&"checkbox"==(g=u.attr("type"))?u.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)
").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append(''+t+' '+wp.i18n.__("Remove","ultimate-member")+' '),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append(''+t+' '+wp.i18n.__("Remove","ultimate-member")+" "),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this),t=a.siblings(".um-forms-field").data("default");a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0 '+a.text+"");else{let e;t=(e=void 0!==a.element&&void 0!==a.element.attributes["data-img"]?a.element.attributes["data-img"].value:e)?jQuery(' '+a.text+""):jQuery(""+a.text+" ")}return t}var a,t;jQuery(".um-user-select-field:visible:not(.um-select2-inited)").length&&(a={ajax:{url:wp.ajax.settings.url,dataType:"json",delay:250,data:function(e){var a={action:"um_get_users",search:e.term,page:e.page||1,nonce:um_admin_scripts.nonce};return jQuery.each(jQuery(this)[0].attributes,function(){var e;this.specified&&-1!==this.name.indexOf("data-ajax-args-")&&(e=this.name.replace("data-ajax-args-","").trim(),a[e]=this.value)}),a},processResults:function(e,a){a.page=a.page||1;var t=[];return e.data.users&&jQuery.each(e.data.users,function(e,a){void 0!==a.img?t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")",img:a.img}):t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")"})}),{results:t,pagination:{more:20*a.page ")}function um_same_page_wrong_ajax(e){um_add_same_page_log(e,wp.i18n.__("Wrong AJAX response...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}function um_same_page_something_wrong(e){um_add_same_page_log(e,wp.i18n.__("Something went wrong with AJAX request...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}jQuery(document).ready(function(){um_admin_init_users_select(),um_admin_init_pages_select(),jQuery(document.body).on("click",".um-forms-field[data-log-object]",function(){var e=jQuery(this).data("log-object");jQuery(this).is(":checked")?jQuery(this).parents("label").siblings(".um-same-page-update-"+e).show():jQuery(this).parents("label").siblings(".um-same-page-update-"+e).hide()}),jQuery(document.body).on("click",".um-admin-form-same-page-update",function(){var t,a,i,s=jQuery(this).data("upgrade_cb");jQuery(this).prop("disabled",!0),um_add_same_page_log(s,wp.i18n.__("Upgrade Process Started...","ultimate-member")),"sync_metatable"===s?(t=0,a=500,jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_usermeta_fields",nonce:um_admin_scripts.nonce},success:function(e){i=1,um_add_same_page_log(s,wp.i18n.__("Getting metadata","ultimate-member")),jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_get_metadata",nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data.count?(um_add_same_page_log(s,wp.i18n.__("There are ","ultimate-member")+e.data.count+wp.i18n.__(" metadata rows...","ultimate-member")),um_add_same_page_log(s,wp.i18n.__("Start metadata upgrading...","ultimate-member")),t=Math.ceil(e.data.count/a),function a(){i<=t?jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_update_metadata_per_page",page:i,nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data?(um_add_same_page_log(s,e.data.message),i++,a()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}}):window.location=um_forms_data.successfully_redirect}()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}})},error:function(){um_same_page_something_wrong(s)}})):wp.hooks.doAction("um_same_page_upgrade",s)}),jQuery(".um-sortable-items-field").sortable({items:".um-sortable-item",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0,update:function(e,a){var t=[];jQuery(this).find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||t.push(jQuery(this).data("tab-id"))}),jQuery(this).siblings(".um-sortable-items-value").val(t.join(","))}}),jQuery(".um-multi-selects-list.um-sortable-multi-selects").sortable({items:".um-admin-drag-fld",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0}),jQuery('.um-multi-selects-list[data-field_id="_um_sorting_fields"] li').each(function(){"other"===jQuery(this).find(".um-field-wrapper:not(.um-custom-order-fields) select").val()?jQuery(this).find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery('.um-forms-line[data-field_type="md_sorting_fields"] .um-multi-selects-add-option').on("click",function(){var e=jQuery(this).siblings("ul.um-multi-selects-list"),a=e.hasClass("um-sortable-multi-selects"),t=(e.data("field_id"),0),i=(0").append(e.siblings(".um-hidden-multi-selects").clone()).html()),s='';a&&(s+=' ');let l="";jQuery.each(um_forms_data.md_sorting_data_types,function(e,a){l+=''+a+" "}),s+=''+i+' '+wp.i18n.__("Remove","ultimate-member")+' '+wp.i18n.__("Meta key","ultimate-member")+': '+wp.i18n.__("Data type","ultimate-member")+': '+l+' '+wp.i18n.__("Order","ultimate-member")+': '+wp.i18n.__("ASC","ultimate-member")+' '+wp.i18n.__("DESC","ultimate-member")+' '+wp.i18n.__("Label","ultimate-member")+': ',e.append(s),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t).trigger("change"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="meta_key"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][meta_key]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="label"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][label]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="data_type"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][data_type]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="order"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][order]")}),jQuery(document.body).on("change",'.um-multi-selects-list[data-field_id="_um_sorting_fields"] .um-field-wrapper:not(.um-custom-order-fields) select',function(){"other"===jQuery(this).val()?jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery(document.body).on("click",".um-multi-selects-option-line .um-select-delete",function(){jQuery(this).parents("li.um-multi-selects-option-line").remove()}),jQuery(document.body).on("click",".um-md-default-filters-option-line .um-select-delete",function(){jQuery(this).parents("li.um-md-default-filters-option-line").remove()}),jQuery(".um-multi-selects-add-option").on("click",function(){var e,a,t,i;jQuery(this).parents('.um-forms-line[data-field_type="md_sorting_fields"]').length||(a=(e=jQuery(this).siblings("ul.um-multi-selects-list")).hasClass("um-sortable-multi-selects"),e.data("field_id"),(t=0)',a&&(i+=' '),i+=''+jQuery("").append(e.siblings(".um-hidden-multi-selects").clone()).html()+'
'+wp.i18n.__("Remove","ultimate-member")+" ",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker").set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.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 a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var r,u;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(u=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),r=[],jQuery.each(m,function(e){r.push(jQuery("#"+l+"_"+m[e]))}),void 0!==r[0].parents(".um-forms-line").data("conditional")&&(n=i(r[0].parents(".um-forms-line")))):"><"===t&&void 0!==(u=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,g,h;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?u.is(":checked"):!u.is(":checked"):Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s):"select"==g&&(d=Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?!u.is(":checked"):u.is(":checked"):u.val()!=s):"select"==g&&(d=u.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return g=u.prop("tagName").toLowerCase(),(d="input"==g&&"checkbox"==(h=u.attr("type"))?u.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)
").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append(''+t+' '+wp.i18n.__("Remove","ultimate-member")+' '),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append(''+t+' '+wp.i18n.__("Remove","ultimate-member")+" "),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this),t=a.siblings(".um-forms-field").data("default");a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0 'um_options',
- 'tab' => 'override_templates',
+ 'page' => 'um_options',
+ 'tab' => 'advanced',
+ 'section' => 'override_templates',
),
admin_url( 'admin.php' )
);
diff --git a/includes/admin/class-enqueue.php b/includes/admin/class-enqueue.php
index 604933af..dba671c6 100644
--- a/includes/admin/class-enqueue.php
+++ b/includes/admin/class-enqueue.php
@@ -351,9 +351,10 @@ final class Enqueue extends \um\common\Enqueue {
$forms_data = array(
'successfully_redirect' => add_query_arg(
array(
- 'page' => 'um_options',
- 'tab' => 'misc',
- 'msg' => 'updated',
+ 'page' => 'um_options',
+ 'tab' => 'advanced',
+ 'section' => 'features',
+ 'msg' => 'updated',
),
admin_url( 'admin.php' )
),
@@ -583,12 +584,18 @@ final class Enqueue extends \um\common\Enqueue {
wp_enqueue_style( 'um_admin_roles' );
} elseif ( 'ultimate-member_page_um_options' === $hook ) {
// phpcs:ignore WordPress.Security.NonceVerification
- if ( isset( $_GET['tab'] ) && 'secure' === $_GET['tab'] ) {
+ if ( isset( $_GET['tab'], $_GET['section'] ) && 'advanced' === $_GET['tab'] && 'secure' === $_GET['section'] ) {
wp_register_script( 'um_admin_secure', $js_url . 'admin/secure' . $suffix . '.js', array( 'jquery', 'wp-i18n' ), UM_VERSION, true );
wp_set_script_translations( 'um_admin_secure', 'ultimate-member' );
wp_enqueue_script( 'um_admin_secure' );
}
+ // phpcs:ignore WordPress.Security.NonceVerification
+ if ( isset( $_GET['tab'] ) && 'appearance' === $_GET['tab'] && empty( $_GET['section'] ) ) {
+ // Init WP Media Uploader on the UM > Settings > Appearance > Profile screen.
+ wp_enqueue_media();
+ }
+
wp_register_style( 'um_admin_settings', $css_url . 'admin/settings' . $suffix . '.css', array(), UM_VERSION );
wp_enqueue_style( 'um_admin_settings' );
diff --git a/includes/admin/class-secure.php b/includes/admin/class-secure.php
index 09a65790..2830bd85 100644
--- a/includes/admin/class-secure.php
+++ b/includes/admin/class-secure.php
@@ -91,8 +91,7 @@ if ( ! class_exists( 'um\admin\Secure' ) ) {
public function admin_init() {
global $wpdb;
// Dismiss admin notice after the first visit to Secure settings page.
- if ( isset( $_REQUEST['page'] ) && isset( $_REQUEST['tab'] ) &&
- 'um_options' === sanitize_key( $_REQUEST['page'] ) && 'secure' === sanitize_key( $_REQUEST['tab'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
+ if ( isset( $_REQUEST['page'], $_REQUEST['tab'], $_REQUEST['section'] ) && 'um_options' === sanitize_key( $_REQUEST['page'] ) && 'advanced' === sanitize_key( $_REQUEST['tab'] ) && 'secure' === sanitize_key( $_REQUEST['section'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
UM()->admin()->notices()->dismiss( 'secure_settings' );
}
@@ -236,16 +235,18 @@ if ( ! class_exists( 'um\admin\Secure' ) ) {
'description' => __( 'Scan your site to check for vulnerabilities prior to Ultimate Member version 2.6.7 and get recommendations to secure your site.', 'ultimate-member' ),
),
array(
- 'id' => 'lock_register_forms',
- 'type' => 'checkbox',
- 'label' => __( 'Lock All Register Forms', 'ultimate-member' ),
- 'description' => __( 'This prevents all users from registering with Ultimate Member on your site.', 'ultimate-member' ),
+ 'id' => 'lock_register_forms',
+ 'type' => 'checkbox',
+ 'label' => __( 'Lock All Register Forms', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Lock Forms', 'ultimate-member' ),
+ 'description' => __( 'This prevents all users from registering with Ultimate Member on your site.', 'ultimate-member' ),
),
array(
- 'id' => 'display_login_form_notice',
- 'type' => 'checkbox',
- 'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ),
- 'description' => __( 'Enforces users to reset their passwords( one-time ) and prevent from entering old password.', 'ultimate-member' ),
+ 'id' => 'display_login_form_notice',
+ 'type' => 'checkbox',
+ 'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable Login form notice', 'ultimate-member' ),
+ 'description' => __( 'Enforces users to reset their passwords (one-time) and prevent from entering old password.', 'ultimate-member' ),
),
);
@@ -265,17 +266,19 @@ if ( ! class_exists( 'um\admin\Secure' ) ) {
$secure_fields,
array(
array(
- 'id' => 'secure_ban_admins_accounts',
- 'type' => 'checkbox',
- 'label' => __( 'Enable ban for administrative capabilities', 'ultimate-member' ),
- 'description' => __( ' When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be banned.', 'ultimate-member' ),
+ 'id' => 'secure_ban_admins_accounts',
+ 'type' => 'checkbox',
+ 'label' => __( 'Administrative capabilities ban', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable ban for administrative capabilities', 'ultimate-member' ),
+ 'description' => __( ' When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be banned.', 'ultimate-member' ),
),
array(
- 'id' => 'secure_notify_admins_banned_accounts',
- 'type' => 'checkbox',
- 'label' => __( 'Notify Administrators', 'ultimate-member' ),
- 'description' => __( 'When enabled, All administrators will be notified when someone has suspicious activities in the Account, Profile & Register forms.', 'ultimate-member' ),
- 'conditional' => array( 'secure_ban_admins_accounts', '=', 1 ),
+ 'id' => 'secure_notify_admins_banned_accounts',
+ 'type' => 'checkbox',
+ 'label' => __( 'Notify Administrators', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable notification', 'ultimate-member' ),
+ 'description' => __( 'When enabled, All administrators will be notified when someone has suspicious activities in the Account, Profile & Register forms.', 'ultimate-member' ),
+ 'conditional' => array( 'secure_ban_admins_accounts', '=', 1 ),
),
array(
'id' => 'secure_notify_admins_banned_accounts__interval',
@@ -292,14 +295,15 @@ if ( ! class_exists( 'um\admin\Secure' ) ) {
'id' => 'secure_allowed_redirect_hosts',
'type' => 'textarea',
'label' => __( 'Allowed hosts for safe redirect (one host per line)', 'ultimate-member' ),
- 'description' => __( 'Extend allowed hosts for frontend pages redirects', 'ultimate-member' ),
+ 'description' => __( 'Extend allowed hosts for frontend pages redirects.', 'ultimate-member' ),
),
)
);
- $settings['secure'] = array(
- 'title' => __( 'Secure', 'ultimate-member' ),
- 'fields' => $secure_fields,
+ $settings['advanced']['sections']['secure'] = array(
+ 'title' => __( 'Secure', 'ultimate-member' ),
+ 'description' => __( 'This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed.', 'ultimate-member' ),
+ 'fields' => $secure_fields,
);
return $settings;
diff --git a/includes/admin/core/class-admin-forms-settings.php b/includes/admin/core/class-admin-forms-settings.php
index ba52b817..37ad481f 100644
--- a/includes/admin/core/class-admin-forms-settings.php
+++ b/includes/admin/core/class-admin-forms-settings.php
@@ -1,12 +1,12 @@
options()->get_default( $field_data['id' . $i] );
+ public function get_field_value( $field_data, $i = '' ) {
+ $default_key = 'default' . $i;
+ $value_key = 'value' . $i;
+ $id_key = 'id' . $i;
- if ( $field_data['type'] == 'checkbox' || $field_data['type'] == 'multi_checkbox' ) {
- if ( isset( $field_data['value' . $i] ) ) {
- return $field_data['value' . $i];
- } else {
- $value = UM()->options()->get( $field_data['id' . $i] );
- $value = is_string( $value ) ? stripslashes( $value ) : $value;
- return '' !== $value ? $value : $default;
- }
- } else {
- if ( isset( $field_data['value' . $i] ) ) {
- return $field_data['value'. $i];
- } else {
- $value = UM()->options()->get( $field_data['id' . $i] );
- $value = is_string( $value ) ? stripslashes( $value ) : $value;
- return isset( $value ) ? $value : $default;
+ $default = isset( $field_data[ $default_key ] ) ? $field_data[ $default_key ] : UM()->options()->get_default( $field_data[ $id_key ] );
+
+ if ( in_array( $field_data['type'], array( 'checkbox', 'multi_checkbox' ), true ) ) {
+ if ( isset( $field_data[ $value_key ] ) ) {
+ return $field_data[ $value_key ];
}
+
+ $value = UM()->options()->get( $field_data[ $id_key ] );
+ $value = is_string( $value ) ? stripslashes( $value ) : $value;
+ return '' !== $value ? $value : $default;
}
- }
+ if ( isset( $field_data[ $value_key ] ) ) {
+ return $field_data[ $value_key ];
+ }
+
+ $value = UM()->options()->get( $field_data[ $id_key ] );
+ $value = is_string( $value ) ? stripslashes( $value ) : $value;
+ return isset( $value ) ? $value : $default;
+ }
}
}
diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php
index f2194200..10def99d 100644
--- a/includes/admin/core/class-admin-forms.php
+++ b/includes/admin/core/class-admin-forms.php
@@ -52,7 +52,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
* @param bool $echo
* @return string
*/
- function render_form( $echo = true ) {
+ public function render_form( $echo = true ) {
if ( empty( $this->form_data['fields'] ) ) {
return '';
@@ -64,7 +64,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
ob_start();
foreach ( $this->form_data['fields'] as $field_data ) {
- if ( isset( $field_data['type'] ) && 'hidden' == $field_data['type'] ) {
+ if ( isset( $field_data['type'] ) && 'hidden' === $field_data['type'] ) {
echo $this->render_form_row( $field_data );
}
}
@@ -97,19 +97,18 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
}
-
/**
* @param array $data
*
* @return string
*/
- function render_form_row( $data ) {
+ public function render_form_row( $data ) {
if ( empty( $data['type'] ) ) {
return '';
}
- if ( !empty( $data['value'] ) && $data['type'] != 'email_template' ) {
+ if ( ! empty( $data['value'] ) && $data['type'] != 'email_template' ) {
$data['value'] = wp_unslash( $data['value'] );
/*for multi_text*/
@@ -169,8 +168,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
- if ( ! empty( $data['description'] ) )
+ if ( ! empty( $data['description'] ) ) {
$html .= '' . $data['description'] . '
';
+ }
$html .= ' ';
@@ -190,8 +190,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
- if ( ! empty( $data['description'] ) )
+ if ( ! empty( $data['description'] ) ) {
$html .= '' . $data['description'] . '
';
+ }
$html .= ' ';
@@ -209,8 +210,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
- if ( ! empty( $data['description'] ) )
+ if ( ! empty( $data['description'] ) ) {
$html .= '' . $data['description'] . '
';
+ }
$html .= '';
@@ -233,8 +235,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
- if ( ! empty( $data['description'] ) )
+ if ( ! empty( $data['description'] ) ) {
$html .= '' . $data['description'] . '
';
+ }
$html .= '';
@@ -255,8 +258,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
- if ( ! empty( $data['description'] ) )
+ if ( ! empty( $data['description'] ) ) {
$html .= '' . $data['description'] . '
';
+ }
$html .= '';
@@ -276,15 +280,14 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
}
- if ( ! empty( $data['description'] ) )
+ if ( ! empty( $data['description'] ) ) {
$html .= '' . $data['description'] . '
';
+ }
$html .= '';
-
}
}
}
-
} else {
$html .= $this->render_hidden( $data );
}
@@ -927,10 +930,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
*
* @return bool|string
*/
- function render_checkbox( $field_data ) {
+ public function render_checkbox( $field_data ) {
- if ( empty( $field_data['id'] ) )
+ if ( empty( $field_data['id'] ) ) {
return false;
+ }
$id = ( ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] : '' ) . '_' . $field_data['id'];
$id_attr = ' id="' . esc_attr( $id ) . '" ';
@@ -941,7 +945,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
$class_attr = ' class="um-forms-field ' . esc_attr( $class ) . '" ';
$data = array(
- 'field_id' => $field_data['id']
+ 'field_id' => $field_data['id'],
);
if ( ! empty( $field_data['data'] ) ) {
@@ -959,20 +963,22 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
$value = $this->get_field_value( $field_data );
- $html = "' . $field_data['upgrade_description'] . '
@@ -1020,7 +1031,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
return $html;
}
-
/**
* @param $field_data
*
@@ -1083,6 +1093,79 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
return $html;
}
+ /**
+ * @param $field_data
+ *
+ * @since 2.8.3
+ *
+ * @return bool|string
+ */
+ public function render_page_select( $field_data ) {
+ if ( empty( $field_data['id'] ) ) {
+ return false;
+ }
+
+ $multiple = ! empty( $field_data['multi'] ) ? 'multiple' : '';
+
+ $id = ( ! empty( $this->form_data['prefix_id'] ) ? sanitize_title( $this->form_data['prefix_id'] ) : '' ) . '_' . $field_data['id'];
+ $id_attr = ' id="' . esc_attr( $id ) . '" ';
+
+ $class = ! empty( $field_data['class'] ) ? $field_data['class'] . ' ' : ' ';
+ $class .= ! empty( $field_data['size'] ) ? 'um-' . $field_data['size'] . '-field' : 'um-long-field';
+ $class_attr = ' class="um-forms-field um-pages-select2 ' . esc_attr( $class ) . '" ';
+
+ $data = array(
+ 'field_id' => $field_data['id'],
+ );
+
+ if ( ! empty( $field_data['placeholder'] ) ) {
+ $data['placeholder'] = $field_data['placeholder'];
+ }
+
+ $data_attr = '';
+ foreach ( $data as $key => $value ) {
+ $data_attr .= ' data-' . $key . '="' . esc_attr( $value ) . '" ';
+ }
+
+ $name = $field_data['id'];
+ $name = ! empty( $this->form_data['prefix_id'] ) ? $this->form_data['prefix_id'] . '[' . $name . ']' : $name;
+ $hidden_name_attr = ' name="' . $name . '" ';
+ $name = $name . ( ! empty( $field_data['multi'] ) ? '[]' : '' );
+ $name_attr = ' name="' . $name . '" ';
+
+ $value = $this->get_field_value( $field_data );
+
+ $options = '
' . esc_html( $data['placeholder'] ) . ' ';
+ if ( ! empty( $field_data['options'] ) ) {
+ foreach ( $field_data['options'] as $key => $option ) {
+ if ( ! empty( $field_data['multi'] ) ) {
+
+ if ( ! is_array( $value ) || empty( $value ) ) {
+ $value = array();
+ }
+
+ $options .= '
' . esc_html( $option ) . ' ';
+ } else {
+ $options .= '
' . esc_html( $option ) . ' ';
+ }
+ }
+ }
+
+ $hidden = '';
+ if ( ! empty( $multiple ) ) {
+ $hidden = "
";
+ }
+
+ $button = '';
+ $slug = str_replace( 'core_', '', $field_data['id'] );
+ if ( ! um_get_predefined_page_id( $slug ) || 'publish' !== get_post_status( um_get_predefined_page_id( $slug ) ) ) {
+ $button = '
' . esc_html__( 'Create Default', 'ultimate-member' ) . ' ';
+ }
+
+ $html = "$hidden
$options $button";
+
+ return $html;
+ }
/**
* @param $field_data
@@ -1739,7 +1822,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) {
return $html;
}
-
/**
* Get field value
*
diff --git a/includes/admin/core/class-admin-menu.php b/includes/admin/core/class-admin-menu.php
index d7bb773f..e0a018b1 100644
--- a/includes/admin/core/class-admin-menu.php
+++ b/includes/admin/core/class-admin-menu.php
@@ -16,18 +16,16 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) {
*/
class Admin_Menu {
-
/**
* @var string
*/
var $pagehook;
var $slug = 'ultimatemember';
-
/**
* Admin_Menu constructor.
*/
- function __construct() {
+ public function __construct() {
add_action( 'admin_menu', array( &$this, 'primary_admin_menu' ), 0 );
add_action( 'admin_menu', array( &$this, 'secondary_menu_items' ), 1000 );
add_action( 'admin_menu', array( &$this, 'extension_menu' ), 9999 );
@@ -35,8 +33,46 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) {
add_action( 'admin_head', array( $this, 'menu_order_count' ) );
add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1000 );
+
+ add_action( 'load-ultimate-member_page_um_options', array( &$this, 'maybe_settings_redirect' ) );
}
+ /**
+ * Trigger redirect on the Settings screen if there is a wrong tab or section.
+ *
+ * @since 2.8.2
+ */
+ public function maybe_settings_redirect() {
+ $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] );
+ $current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] );
+
+ $settings_struct = UM()->admin_settings()->settings_structure[ $current_tab ];
+
+ // Remove not option hidden fields.
+ if ( ! empty( $settings_struct['fields'] ) ) {
+ foreach ( $settings_struct['fields'] as $field_key => $field_options ) {
+ if ( isset( $field_options['is_option'] ) && false === $field_options['is_option'] ) {
+ unset( $settings_struct['fields'][ $field_key ] );
+ }
+ }
+ }
+
+ if ( empty( $settings_struct['fields'] ) && empty( $settings_struct['sections'] ) && empty( $settings_struct['form_sections'] ) ) {
+ wp_safe_redirect( add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ) );
+ exit;
+ }
+
+ if ( ! empty( $settings_struct['sections'] ) ) {
+ if ( empty( $settings_struct['sections'][ $current_subtab ] ) ) {
+ $args = array( 'page' => 'um_options' );
+ if ( ! empty( $current_tab ) ) {
+ $args['tab'] = $current_tab;
+ }
+ wp_safe_redirect( add_query_arg( $args, admin_url( 'admin.php' ) ) );
+ exit;
+ }
+ }
+ }
/**
* Change the admin footer text on UM admin pages
@@ -143,8 +179,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) {
/**
* Setup admin menu
*/
- function primary_admin_menu() {
- $this->pagehook = add_menu_page( __( 'Ultimate Member', 'ultimate-member' ), __( 'Ultimate Member', 'ultimate-member' ), 'manage_options', $this->slug, array( &$this, 'admin_page' ), 'dashicons-admin-users', '42.78578');
+ public function primary_admin_menu() {
+ $this->pagehook = add_menu_page( __( 'Ultimate Member', 'ultimate-member' ), __( 'Ultimate Member', 'ultimate-member' ), 'manage_options', $this->slug, array( &$this, 'admin_page' ), 'dashicons-admin-users', '42.78578' );
add_action( 'load-' . $this->pagehook, array( &$this, 'on_load_page' ) );
@@ -155,7 +191,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Menu' ) ) {
/**
* Secondary admin menu (after settings)
*/
- function secondary_menu_items() {
+ public function secondary_menu_items() {
+ add_submenu_page( $this->slug, __( 'Settings', 'ultimate-member' ), __( 'Settings', 'ultimate-member' ), 'manage_options', 'um_options', array( UM()->admin_settings(), 'settings_page' ) );
+
add_submenu_page( $this->slug, __( 'Forms', 'ultimate-member' ), __( 'Forms', 'ultimate-member' ), 'manage_options', 'edit.php?post_type=um_form', '' );
add_submenu_page( $this->slug, __( 'User Roles', 'ultimate-member' ), __( 'User Roles', 'ultimate-member' ), 'manage_options', 'um_roles', array( &$this, 'um_roles_pages' ) );
diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php
index dde627d1..9a251f81 100644
--- a/includes/admin/core/class-admin-notices.php
+++ b/includes/admin/core/class-admin-notices.php
@@ -780,7 +780,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {
*/
public function template_version() {
if ( true === (bool) get_option( 'um_override_templates_outdated' ) ) {
- $link = admin_url( 'admin.php?page=um_options&tab=override_templates' );
+ $link = admin_url( 'admin.php?page=um_options&tab=advanced§ion=override_templates' );
ob_start();
?>
@@ -849,7 +849,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {
-
+
admin()->check_ajax_nonce();
@@ -260,37 +253,131 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
),
);
- $core_pages = UM()->config()->core_pages;
-
- foreach ( $core_pages as $page_s => $page ) {
- $have_pages = UM()->query()->wp_pages();
- $page_id = UM()->options()->get_core_page_id( $page_s );
+// $core_pages = UM()->config()->core_pages;
+//
+// foreach ( $core_pages as $page_s => $page ) {
+// $have_pages = UM()->query()->wp_pages();
+// $page_id = UM()->options()->get_core_page_id( $page_s );
+//
+// $page_title = ! empty( $page['title'] ) ? $page['title'] : '';
+//
+// if ( 'reached_maximum_limit' === $have_pages ) {
+// $general_pages_fields[] = array(
+// 'id' => $page_id,
+// 'type' => 'text',
+// // translators: %s: Page title
+// 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
+// 'placeholder' => __( 'Add page ID', 'ultimate-member' ),
+// 'compiler' => true,
+// 'size' => 'small',
+// );
+// } else {
+// $general_pages_fields[] = array(
+// 'id' => $page_id,
+// 'type' => 'select',
+// // translators: %s: Page title
+// 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
+// 'options' => UM()->query()->wp_pages(),
+// 'placeholder' => __( 'Choose a page...', 'ultimate-member' ),
+// 'compiler' => true,
+// 'size' => 'small',
+// );
+// }
+//
+// $settings_map[ $page_id ] = array(
+// 'sanitize' => 'absint',
+// );
+// }
+ foreach ( UM()->config()->get( 'predefined_pages' ) as $slug => $page ) {
+ $page_id = UM()->options()->get_predefined_page_option_key( $slug );
$page_title = ! empty( $page['title'] ) ? $page['title'] : '';
- if ( 'reached_maximum_limit' === $have_pages ) {
- $general_pages_fields[] = array(
- 'id' => $page_id,
- 'type' => 'text',
- // translators: %s: Page title
- 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
- 'placeholder' => __( 'Add page ID', 'ultimate-member' ),
- 'compiler' => true,
- 'size' => 'small',
- );
+ $options = array();
+ $page_value = '';
+
+ $pre_result = apply_filters( 'um_admin_settings_pages_list_value', false, $page_id );
+ if ( false === $pre_result ) {
+ if ( ! empty( $opt_value = UM()->options()->get( $page_id ) ) ) {
+ if ( 'publish' === get_post_status( $opt_value ) ) {
+ $title = get_the_title( $opt_value );
+ $title = ( mb_strlen( $title ) > 50 ) ? mb_substr( $title, 0, 49 ) . '...' : $title;
+ $title = sprintf( __( '%s (ID: %s)', 'ultimate-member' ), $title, $opt_value );
+
+ $options = array( $opt_value => $title );
+ $page_value = $opt_value;
+ }
+ }
} else {
- $general_pages_fields[] = array(
- 'id' => $page_id,
- 'type' => 'select',
- // translators: %s: Page title
- 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
- 'options' => UM()->query()->wp_pages(),
- 'placeholder' => __( 'Choose a page...', 'ultimate-member' ),
- 'compiler' => true,
- 'size' => 'small',
- );
+ // `page_value` variable that we transfer from 3rd-party hook for getting filtered option value also
+ $page_value = $pre_result['page_value'];
+ unset( $pre_result['page_value'] );
+
+ $options = $pre_result;
}
+ $page_setting_description = '';
+ if ( ! empty( $page_value ) ) {
+ $content = get_the_content( null, false, $page_value );
+ switch ( $slug ) {
+ case 'account':
+ if ( $page_value === um_get_predefined_page_id( 'user' ) ) {
+ $page_setting_description = __( '
Warning: Account page and User page must be separate pages.', 'ultimate-member' );
+ } elseif ( ! has_shortcode( $content, 'ultimatemember_account' ) ) {
+ $page_setting_description = __( '
Warning: Account page must contain shortcode
[ultimatemember_account].', 'ultimate-member' );
+ } elseif ( function_exists( 'wc_get_page_id' ) && wc_get_page_id( 'myaccount' ) === um_get_predefined_page_id( 'account' ) ) {
+ $page_setting_description = __( '
Warning: Account page and WooCommerce "My account" page should be separate pages.', 'ultimate-member' );
+ }
+ break;
+ case 'login':
+ if ( $page_value === um_get_predefined_page_id( 'logout' ) ) {
+ $page_setting_description = __( '
Warning: Login page and Logout page must be separate pages.', 'ultimate-member' );
+ } elseif ( ! has_shortcode( $content, 'ultimatemember' ) ) {
+ $page_setting_description = __( '
Warning: Login page must contain a login form shortcode. You can get existing shortcode or create a new one
here .', 'ultimate-member' );
+ }
+ break;
+ case 'logout':
+ if ( $page_value === (int) get_option( 'page_on_front' ) ) {
+ $page_setting_description = __( '
Warning: Home page and Logout page must be separate pages.', 'ultimate-member' );
+ } elseif ( $page_value === um_get_predefined_page_id( 'login' ) ) {
+ $page_setting_description = __( '
Warning: Login page and Logout page must be separate pages.', 'ultimate-member' );
+ }
+ break;
+ case 'password-reset':
+ if ( ! has_shortcode( $content, 'ultimatemember_password' ) ) {
+ $page_setting_description = __( '
Warning: Password Reset page must contain shortcode
[ultimatemember_password].', 'ultimate-member' );
+ }
+ break;
+ case 'register':
+ if ( ! has_shortcode( $content, 'ultimatemember' ) ) {
+ $page_setting_description = __( '
Warning: Register page must contain a registration form shortcode. You can get existing shortcode or create a new one
here .', 'ultimate-member' );
+ }
+ break;
+ case 'user':
+ if ( $page_value === um_get_predefined_page_id( 'account' ) ) {
+ $description = __( '
Warning: Account page and User page must be separate pages.', 'ultimate-member' );
+ } elseif ( ! has_shortcode( $content, 'ultimatemember' ) ) {
+ $page_setting_description = __( '
Warning: User page must contain a profile form shortcode. You can get existing shortcode or create a new one
here .', 'ultimate-member' );
+ }
+ break;
+ default:
+ $page_setting_description = apply_filters( 'um_pages_settings_description', $page_setting_description, $content, $slug );
+ break;
+ }
+ }
+
+ $general_pages_fields[] = array(
+ 'id' => $page_id,
+ 'type' => 'page_select',
+ // translators: %s: Page title
+ 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ),
+ 'options' => $options,
+ 'value' => $page_value,
+ 'placeholder' => __( 'Choose a page...', 'ultimate-member' ),
+ 'size' => 'small',
+ 'description' => $page_setting_description,
+ );
+
$settings_map[ $page_id ] = array(
'sanitize' => 'absint',
);
@@ -431,7 +518,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
$duplicates = array();
$taxonomies_options = array();
$exclude_taxonomies = UM()->excluded_taxonomies();
- $all_taxonomies = get_taxonomies( array( 'public' => true, 'show_ui' => true ), 'objects' );
+ $all_taxonomies = get_taxonomies(
+ array(
+ 'public' => true,
+ 'show_ui' => true,
+ ),
+ 'objects'
+ );
foreach ( $all_taxonomies as $key => $taxonomy ) {
if ( in_array( $key, $exclude_taxonomies, true ) ) {
continue;
@@ -457,7 +550,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
}
}
-
$restricted_access_taxonomy_metabox_value = array();
$restricted_access_taxonomy_metabox = UM()->options()->get( 'restricted_access_taxonomy_metabox' );
if ( ! empty( $restricted_access_taxonomy_metabox ) && is_array( $restricted_access_taxonomy_metabox ) ) {
@@ -639,10 +731,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
$latest_truncate = get_option( 'um_member_directory_truncated', false );
$same_page_update = array(
- 'id' => 'member_directory_own_table',
- 'type' => 'same_page_update',
- 'label' => __( 'Enable custom table for usermeta', 'ultimate-member' ),
- 'tooltip' => __( 'Check this box if you would like to enable the use of a custom table for user metadata. Improved performance for member directory searches.', 'ultimate-member' ),
+ 'id' => 'member_directory_own_table',
+ 'type' => 'same_page_update',
+ 'label' => __( 'Custom usermeta table', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable custom table for usermeta', 'ultimate-member' ),
+ 'description' => __( 'Check this box if you would like to enable the use of a custom table for user metadata. Improved performance for member directory searches.', 'ultimate-member' ),
);
if ( empty( $latest_update ) || ( ! empty( $latest_truncate ) && $latest_truncate > $latest_update ) ) {
@@ -1103,135 +1196,178 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'fields' => $general_pages_fields,
),
'users' => array(
- 'title' => __( 'Users', 'ultimate-member' ),
- 'fields' => array(
- array(
- 'id' => 'permalink_base',
- 'type' => 'select',
- 'size' => 'small',
- 'label' => __( 'Profile Permalink Base', 'ultimate-member' ),
- // translators: %s: Profile page URL
- 'tooltip' => sprintf( __( 'Here you can control the permalink structure of the user profile URL globally e.g. %s
username /', 'ultimate-member' ), trailingslashit( um_get_core_page( 'user' ) ) ),
- 'options' => UM()->config()->permalink_base_options,
- 'placeholder' => __( 'Select...', 'ultimate-member' ),
- ),
- array(
- 'id' => 'permalink_base_custom_meta',
- 'type' => 'text',
- 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ),
- 'tooltip' => __( 'Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique.', 'ultimate-member' ),
- 'conditional' => array( 'permalink_base', '=', 'custom_meta' ),
- 'size' => 'medium',
- ),
- array(
- 'id' => 'display_name',
- 'type' => 'select',
- 'size' => 'medium',
- 'label' => __( 'User Display Name', 'ultimate-member' ),
- 'tooltip' => __( 'This is the name that will be displayed for users on the front end of your site. Default setting uses first/last name as display name if it exists', 'ultimate-member' ),
- 'options' => UM()->config()->display_name_options,
- 'placeholder' => __( 'Select...', 'ultimate-member' ),
- ),
- array(
- 'id' => 'display_name_field',
- 'type' => 'text',
- 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ),
- 'tooltip' => __( 'Specify the custom field meta key or custom fields seperated by comma that you want to use to display users name on the frontend of your site', 'ultimate-member' ),
- 'conditional' => array( 'display_name', '=', 'field' ),
- 'size' => 'medium',
- ),
- array(
- 'id' => 'author_redirect',
- 'type' => 'checkbox',
- 'label' => __( 'Automatically redirect author page to their profile?', 'ultimate-member' ),
- 'tooltip' => __( 'If enabled, author pages will automatically redirect to the user\'s profile page', 'ultimate-member' ),
- ),
- array(
- 'id' => 'members_page',
- 'type' => 'checkbox',
- 'label' => __( 'Enable Members Directory', 'ultimate-member' ),
- 'tooltip' => __( 'Control whether to enable or disable member directories on this site', 'ultimate-member' ),
- ),
- array(
- 'id' => 'use_gravatars',
- 'type' => 'checkbox',
- 'label' => __( 'Use Gravatars?', 'ultimate-member' ),
- 'tooltip' => __( 'Do you want to use gravatars instead of the default plugin profile photo (If the user did not upload a custom profile photo / avatar)', 'ultimate-member' ),
- ),
- array(
- 'id' => 'use_um_gravatar_default_builtin_image',
- 'type' => 'select',
- 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ),
- 'tooltip' => __( 'Gravatar has a number of built in options which you can also use as defaults', 'ultimate-member' ),
- 'options' => array(
- 'default' => __( 'Default', 'ultimate-member' ),
- '404' => __( '404 ( File Not Found response )', 'ultimate-member' ),
- 'mm' => __( 'Mystery Man', 'ultimate-member' ),
- 'identicon' => __( 'Identicon', 'ultimate-member' ),
- 'monsterid' => __( 'Monsterid', 'ultimate-member' ),
- 'wavatar' => __( 'Wavatar', 'ultimate-member' ),
- 'retro' => __( 'Retro', 'ultimate-member' ),
- 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ),
- ),
- 'conditional' => array( 'use_gravatars', '=', 1 ),
- 'size' => 'medium',
- ),
- array(
- 'id' => 'use_um_gravatar_default_image',
- 'type' => 'checkbox',
- 'label' => __( 'Use Default plugin avatar as Gravatar\'s Default avatar', 'ultimate-member' ),
- 'tooltip' => __( 'Do you want to use the plugin default avatar instead of the gravatar default photo (If the user did not upload a custom profile photo / avatar)', 'ultimate-member' ),
- 'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ),
- ),
- array(
- 'id' => 'toggle_password',
- 'type' => 'checkbox',
- 'label' => __( 'Show/hide password button', 'ultimate-member' ),
- 'tooltip' => __( 'Enable visibility for show/hide password button for the password field-type.', 'ultimate-member' ),
- ),
- array(
- 'id' => 'require_strongpass',
- 'type' => 'checkbox',
- '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',
- 'type' => 'number',
- 'label' => __( 'Password minimum length', 'ultimate-member' ),
- 'tooltip' => __( 'If you want to enable a minimum number of characters to be in password. User password field in the UM forms has own settings for that. Leave empty to use default value 8', 'ultimate-member' ),
- 'size' => 'small',
- ),
- array(
- 'id' => 'password_max_chars',
- 'type' => 'number',
- 'label' => __( 'Password maximum length', 'ultimate-member' ),
- 'tooltip' => __( 'If you want to enable a maximum number of characters to be in password. User password field in the UM forms has own settings for that. Leave empty to use default value 30', 'ultimate-member' ),
- 'size' => 'small',
- ),
- array(
- 'id' => 'profile_noindex',
- 'type' => 'select',
- 'size' => 'small',
- 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
- 'tooltip' => __( 'Hides the profile page for robots. This setting can be overridden by individual role settings.', 'ultimate-member' ),
- 'options' => array(
- '0' => __( 'No', 'ultimate-member' ),
- '1' => __( 'Yes', 'ultimate-member' ),
+ 'title' => __( 'Users', 'ultimate-member' ),
+ 'form_sections' => array(
+ 'users' => array(
+ 'title' => __( 'Users', 'ultimate-member' ),
+ 'description' => __( 'General users settings.', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'permalink_base',
+ 'type' => 'select',
+ 'size' => 'small',
+ 'label' => __( 'Profile Permalink Base', 'ultimate-member' ),
+ // translators: %s: Profile page URL
+ 'description' => sprintf( __( 'Here you can control the permalink structure of the user profile URL globally e.g. %s
username /.', 'ultimate-member' ), trailingslashit( um_get_core_page( 'user' ) ) ),
+ 'options' => UM()->config()->permalink_base_options,
+ 'placeholder' => __( 'Select...', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'permalink_base_custom_meta',
+ 'type' => 'text',
+ 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ),
+ 'description' => __( 'Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique.', 'ultimate-member' ),
+ 'conditional' => array( 'permalink_base', '=', 'custom_meta' ),
+ 'size' => 'medium',
+ ),
+ array(
+ 'id' => 'display_name',
+ 'type' => 'select',
+ 'size' => 'medium',
+ 'label' => __( 'User Display Name', 'ultimate-member' ),
+ 'description' => __( 'This is the name that will be displayed for users on the front end of your site. Default setting uses first/last name as display name if it exists.', 'ultimate-member' ),
+ 'options' => UM()->config()->display_name_options,
+ 'placeholder' => __( 'Select...', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'display_name_field',
+ 'type' => 'text',
+ 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ),
+ 'description' => __( 'Specify the custom field meta key or custom fields seperated by comma that you want to use to display users name on the frontend of your site.', 'ultimate-member' ),
+ 'conditional' => array( 'display_name', '=', 'field' ),
+ 'size' => 'medium',
+ ),
+ array(
+ 'id' => 'author_redirect',
+ 'type' => 'checkbox',
+ 'label' => __( 'Hide author pages', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable automatically redirect author page to their profile', 'ultimate-member' ),
+ 'description' => __( 'If enabled, author pages will automatically redirect to the user\'s profile page', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'members_page',
+ 'type' => 'checkbox',
+ 'label' => __( 'Members Directory', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable Members Directory', 'ultimate-member' ),
+ 'description' => __( 'Control whether to enable or disable member directories on this site', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'use_gravatars',
+ 'type' => 'checkbox',
+ 'label' => __( 'Use Gravatar', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable Gravatar', 'ultimate-member' ),
+ 'description' => __( 'Do you want to use Gravatar instead of the default plugin profile photo (If the user did not upload a custom profile photo/avatar)?', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'use_um_gravatar_default_builtin_image',
+ 'type' => 'select',
+ 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ),
+ 'description' => __( 'Gravatar has a number of built in options which you can also use as defaults', 'ultimate-member' ),
+ 'options' => array(
+ 'default' => __( 'Default', 'ultimate-member' ),
+ '404' => __( '404 ( File Not Found response )', 'ultimate-member' ),
+ 'mm' => __( 'Mystery Man', 'ultimate-member' ),
+ 'identicon' => __( 'Identicon', 'ultimate-member' ),
+ 'monsterid' => __( 'Monsterid', 'ultimate-member' ),
+ 'wavatar' => __( 'Wavatar', 'ultimate-member' ),
+ 'retro' => __( 'Retro', 'ultimate-member' ),
+ 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ),
+ ),
+ 'conditional' => array( 'use_gravatars', '=', 1 ),
+ 'size' => 'medium',
+ ),
+ array(
+ 'id' => 'use_um_gravatar_default_image',
+ 'type' => 'checkbox',
+ 'label' => __( 'Replace Gravatar\'s Default avatar', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Set Default plugin avatar as Gravatar\'s Default avatar', 'ultimate-member' ),
+ 'description' => __( 'Do you want to use the plugin default avatar instead of the gravatar default photo (If the user did not upload a custom profile photo/avatar)', 'ultimate-member' ),
+ 'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ),
+ ),
+ array(
+ 'id' => 'delete_comments',
+ 'type' => 'checkbox',
+ 'label' => __( 'Delete user comments', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable deleting user comments after deleting a user', 'ultimate-member' ),
+ 'description' => __( 'Do you want to delete a user\'s comments when that user deletes themself or is removed from the admin dashboard from the site?', 'ultimate-member' ),
+ ),
),
),
- array(
- 'id' => 'activation_link_expiry_time',
- 'type' => 'number',
- 'label' => __( 'Activation link lifetime', 'ultimate-member' ),
- 'tooltip' => __( 'How long does an activation link live in seconds? Leave empty for endless links.', 'ultimate-member' ),
- 'size' => 'small',
+ 'password' => array(
+ 'title' => __( 'Password', 'ultimate-member' ),
+ 'description' => __( 'Password & Security settings.', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'toggle_password',
+ 'type' => 'checkbox',
+ 'label' => __( 'Toggle Password Visibility', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable password show/hide button', 'ultimate-member' ),
+ 'description' => __( 'Enable visibility for show/hide password button for the password field-type.', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'require_strongpass',
+ 'type' => 'checkbox',
+ 'label' => __( 'Require Strong Passwords', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable strong passwords', 'ultimate-member' ),
+ 'description' => __( 'Enable this option to apply strong password rules to all password fields (user registration, password reset and password change).', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'password_min_chars',
+ 'type' => 'number',
+ 'label' => __( 'Password minimum length', 'ultimate-member' ),
+ 'description' => __( 'Enter the minimum number of characters a user must use for their password. The default minimum characters is 8.', 'ultimate-member' ),
+ 'size' => 'small',
+ 'conditional' => array( 'require_strongpass', '=', '1' ),
+ ),
+ array(
+ 'id' => 'password_max_chars',
+ 'type' => 'number',
+ 'label' => __( 'Password maximum length', 'ultimate-member' ),
+ 'description' => __( 'Enter the maximum number of characters a user can use for their password. The default maximum characters is 30.', 'ultimate-member' ),
+ 'size' => 'small',
+ 'conditional' => array( 'require_strongpass', '=', '1' ),
+ ),
+ array(
+ 'id' => 'activation_link_expiry_time',
+ 'type' => 'number',
+ 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ),
+ 'description' => __( 'For user registrations that require an email link to be clicked to confirm account. How long would you like the activation link to be active for before it expires? If this field is left blank the activation link will not expire.', 'ultimate-member' ),
+ 'size' => 'small',
+ ),
+ ),
),
- array(
- 'id' => 'delete_comments',
- 'type' => 'checkbox',
- 'label' => __( 'Deleting user comments after deleting a user', 'ultimate-member' ),
- 'tooltip' => __( 'Do you want to delete a user\'s comments when that user deletes themself or is removed from the admin dashboard from the site?', 'ultimate-member' ),
+ 'seo' => array(
+ 'title' => __( 'SEO', 'ultimate-member' ),
+ 'description' => __( 'SEO settings for the User Profiles.', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'profile_noindex',
+ 'type' => 'select',
+ 'size' => 'small',
+ 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
+ 'description' => __( 'Hides the profile page for robots. This setting can be overridden by individual role settings.', 'ultimate-member' ),
+ 'options' => array(
+ '0' => __( 'No', 'ultimate-member' ),
+ '1' => __( 'Yes', 'ultimate-member' ),
+ ),
+ ),
+ array(
+ 'id' => 'profile_title',
+ 'type' => 'text',
+ 'label' => __( 'User Profile Title', 'ultimate-member' ),
+ 'description' => __( 'This is the title that is displayed on a specific user profile.', 'ultimate-member' ),
+ 'size' => 'medium',
+ ),
+ array(
+ 'id' => 'profile_desc',
+ 'type' => 'textarea',
+ 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ),
+ 'description' => __( 'This will be used in the meta description that is available for search-engines.', 'ultimate-member' ),
+ 'args' => array(
+ 'textarea_rows' => 6,
+ ),
+ ),
+ ),
),
),
),
@@ -1368,31 +1504,44 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
),
),
'email' => array(
- 'title' => __( 'Email', 'ultimate-member' ),
- 'fields' => array(
- array(
- 'id' => 'admin_email',
- 'type' => 'text',
- 'label' => __( 'Admin E-mail Address', 'ultimate-member' ),
- 'tooltip' => __( 'e.g. admin@companyname.com', 'ultimate-member' ),
+ 'title' => __( 'Emails', 'ultimate-member' ),
+ 'form_sections' => array(
+ 'email_sender' => array(
+ 'title' => __( 'Email sender options', 'ultimate-member' ),
+ 'description' => __( 'How the sender appears in outgoing Ultimate Member emails.', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'admin_email',
+ 'type' => 'text',
+ 'label' => __( 'Admin E-mail Address', 'ultimate-member' ),
+ 'description' => __( 'e.g. admin@companyname.com', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'mail_from',
+ 'type' => 'text',
+ 'label' => __( 'Mail appears from', 'ultimate-member' ),
+ 'description' => __( 'e.g. Site Name', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'mail_from_addr',
+ 'type' => 'text',
+ 'label' => __( 'Mail appears from address', 'ultimate-member' ),
+ 'description' => __( 'e.g. admin@companyname.com', 'ultimate-member' ),
+ ),
+ ),
),
- array(
- 'id' => 'mail_from',
- 'type' => 'text',
- 'label' => __( 'Mail appears from', 'ultimate-member' ),
- 'tooltip' => __( 'e.g. Site Name', 'ultimate-member' ),
- ),
- array(
- 'id' => 'mail_from_addr',
- 'type' => 'text',
- 'label' => __( 'Mail appears from address', 'ultimate-member' ),
- 'tooltip' => __( 'e.g. admin@companyname.com', 'ultimate-member' ),
- ),
- array(
- 'id' => 'email_html',
- 'type' => 'checkbox',
- 'label' => __( 'Use HTML for E-mails?', 'ultimate-member' ),
- 'tooltip' => __( 'If you plan use e-mails with HTML, please make sure that this option is enabled. Otherwise, HTML will be displayed as plain text.', 'ultimate-member' ),
+ 'email_template' => array(
+ 'title' => __( 'Email template', 'ultimate-member' ),
+ 'description' => __( 'Section to customize email templates settings.', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'email_html',
+ 'type' => 'checkbox',
+ 'label' => __( 'Content type', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable HTML for E-mails', 'ultimate-member' ),
+ 'description' => __( 'If you plan use e-mails with HTML, please make sure that this option is enabled. Otherwise, HTML will be displayed as plain text.', 'ultimate-member' ),
+ ),
+ ),
),
),
),
@@ -1800,66 +1949,106 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'licenses' => array(
'title' => __( 'Licenses', 'ultimate-member' ),
),
- 'misc' => array(
- 'title' => __( 'Misc', 'ultimate-member' ),
- 'fields' => array(
- array(
- 'id' => 'form_asterisk',
- 'type' => 'checkbox',
- 'label' => __( 'Show an asterisk for required fields', 'ultimate-member' ),
- ),
- array(
- 'id' => 'profile_title',
- 'type' => 'text',
- 'label' => __( 'User Profile Title', 'ultimate-member' ),
- 'tooltip' => __( 'This is the title that is displayed on a specific user profile', 'ultimate-member' ),
- 'size' => 'medium',
- ),
- array(
- 'id' => 'profile_desc',
- 'type' => 'textarea',
- 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ),
- 'tooltip' => __( 'This will be used in the meta description that is available for search-engines.', 'ultimate-member' ),
- 'args' => array(
- 'textarea_rows' => 6,
+ 'advanced' => array(
+ 'title' => __( 'Advanced', 'ultimate-member' ),
+ 'sections' => array(
+ '' => array(
+ 'title' => __( 'General', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'form_asterisk',
+ 'type' => 'checkbox',
+ 'label' => __( 'Required fields\' asterisk', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Show an asterisk for required fields', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'um_profile_object_cache_stop',
+ 'type' => 'checkbox',
+ 'label' => __( 'Cache User Profile', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Disable user data cache', 'ultimate-member' ),
+ 'description' => __( 'Check this box if you would like to disable Ultimate Member user\'s cache.', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => 'rest_api_version',
+ 'type' => 'select',
+ 'label' => __( 'REST API version', 'ultimate-member' ),
+ 'description' => __( 'This controls the REST API version, we recommend to use the last version', 'ultimate-member' ),
+ 'options' => array(
+ '1.0' => __( '1.0 version', 'ultimate-member' ),
+ '2.0' => __( '2.0 version', 'ultimate-member' ),
+ ),
+ ),
+ array(
+ 'id' => 'uninstall_on_delete',
+ 'type' => 'checkbox',
+ 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable flushing data', 'ultimate-member' ),
+ 'description' => __( 'Check this box if you would like Ultimate Member to completely remove all of its data when the plugin/extensions are deleted.', 'ultimate-member' ),
+ ),
),
),
- array(
- 'id' => 'um_profile_object_cache_stop',
- 'type' => 'checkbox',
- 'label' => __( 'Disable Cache User Profile', 'ultimate-member' ),
- 'tooltip' => __( 'Check this box if you would like to disable Ultimate Member user\'s cache.', 'ultimate-member' ),
- ),
- array(
- 'id' => 'enable_blocks',
- 'type' => 'checkbox',
- 'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ),
- 'tooltip' => __( 'Check this box if you would like to use Ultimate Member blocks in Gutenberg editor. Important some themes have the conflicts with Gutenberg editor.', 'ultimate-member' ),
- ),
- array(
- 'id' => 'rest_api_version',
- 'type' => 'select',
- 'label' => __( 'REST API version', 'ultimate-member' ),
- 'tooltip' => __( 'This controls the REST API version, we recommend to use the last version', 'ultimate-member' ),
- 'options' => array(
- '1.0' => __( '1.0 version', 'ultimate-member' ),
- '2.0' => __( '2.0 version', 'ultimate-member' ),
+ 'override_templates' => array(
+ 'title' => __( 'Override templates', 'ultimate-member' ),
+ 'form_sections' => array(
+ 'override_templates' => array(
+ 'title' => __( 'Override templates', 'ultimate-member' ),
+ // translators: %s: Link to the docs article.
+ 'description' => sprintf( __( 'You can find a list of template file changes with each release. You can check the latest templates and their statuses, and see if they\'re outdated or updated. You may get more details about overriding templates
here .', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1516-templates-map' ), /** @noinspection HtmlUnknownTarget */
+ 'fields' => array(
+ array(
+ 'id' => 'override_templates_list_table',
+ 'type' => 'override_templates_list_table',
+ ),
+ ),
+ ),
),
),
- // backward compatibility option leave it disabled for better security and ability to exclude posts/terms pre-query
- // otherwise we filtering only results and restricted posts/terms can be visible
- array(
- 'id' => 'disable_restriction_pre_queries',
- 'type' => 'checkbox',
- 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ),
- 'tooltip' => __( 'Please enable this option only in the cases when you have big or unnecessary queries on your site with active restriction logic. If you want to exclude posts only from the results queries instead of pre_get_posts and fully-hidden post logic also please enable this option. It activates the restriction content logic until 2.2.x version without latest security enhancements', 'ultimate-member' ),
- ),
- $same_page_update,
- array(
- 'id' => 'uninstall_on_delete',
- 'type' => 'checkbox',
- 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ),
- 'tooltip' => __( 'Check this box if you would like Ultimate Member to completely remove all of its data when the plugin/extensions are deleted.', 'ultimate-member' ),
+ 'features' => array(
+ 'title' => __( 'Features', 'ultimate-member' ),
+ 'form_sections' => array(
+ 'features' => array(
+ 'title' => __( 'Features', 'ultimate-member' ),
+ 'description' => __( 'Start using new features that are being progressively rolled out to improve the users management experience.', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'enable_blocks',
+ 'type' => 'checkbox',
+ 'label' => __( 'Gutenberg Blocks', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ),
+ 'description' => __( 'Check this box if you would like to use Ultimate Member blocks in Gutenberg editor. Important some themes have the conflicts with Gutenberg editor.', 'ultimate-member' ),
+ ),
+ $same_page_update,
+ ),
+ ),
+ 'beta_features' => array(
+ 'title' => __( 'Experimental features', 'ultimate-member' ),
+ 'description' => __( 'These features are either experimental or incomplete, enable them at your own risk!', 'ultimate-member' ),
+ 'fields' => array(
+ array(
+ 'id' => 'disable_legacy_fonicons',
+ 'type' => 'checkbox',
+ 'label' => __( 'Legacy fonticons', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Disable legacy fonticons', 'ultimate-member' ),
+ 'description' => __( 'Check this box if you would like to disable legacy Ultimate Member fonticons used outdated versions of FontAwesome and Ionicons libraries.', 'ultimate-member' ),
+ ),
+ ),
+ ),
+ 'legacy_features' => array(
+ 'title' => __( 'Legacy features', 'ultimate-member' ),
+ 'description' => __( 'These features are related to the legacy logic or functionality. Please enable them only for the backward compatibility.', 'ultimate-member' ),
+ 'fields' => array(
+ // backward compatibility option leave it disabled for better security and ability to exclude posts/terms pre-query
+ // otherwise we're filtering only results and restricted posts/terms can be visible
+ array(
+ 'id' => 'disable_restriction_pre_queries',
+ 'type' => 'checkbox',
+ 'label' => __( 'Restriction content pre-queries', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Disable pre-queries for restriction content logic', 'ultimate-member' ),
+ 'description' => __( 'Please enable this option only in the cases when you have big or unnecessary queries on your site with active restriction logic. If you want to exclude posts only from the results queries instead of pre_get_posts and fully-hidden post logic also please enable this option. It activates the restriction content logic until 2.2.x version without latest security enhancements.', 'ultimate-member' ),
+ ),
+ ),
+ ),
+ ),
),
),
),
@@ -1870,21 +2059,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'type' => 'install_info',
),
),
- ),
- 'override_templates' => array(
- 'title' => __( 'Override templates', 'ultimate-member' ),
- 'fields' => array(
- array(
- 'type' => 'override_templates',
- ),
- ),
- ),
+ ), // @todo remove since 2.9.0
)
);
-
}
-
/**
* @param array $settings
*
@@ -1922,71 +2101,66 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
return $settings;
}
-
/**
* @param $tab
* @param $section
*
* @return array
*/
- function get_section_fields( $tab, $section ) {
+ public function get_section_fields( $tab, $section ) {
+ $custom_section_fields = apply_filters( 'um_settings_section_custom_fields', false, $tab, $section );
+ if ( false !== $custom_section_fields ) {
+ return $custom_section_fields;
+ }
if ( empty( $this->settings_structure[ $tab ] ) ) {
return array();
}
+ if ( ! empty( $this->settings_structure[ $tab ]['sections'][ $section ]['form_sections'] ) ) {
+ return array( 'form_sections' => $this->settings_structure[ $tab ]['sections'][ $section ]['form_sections'] );
+ }
+
if ( ! empty( $this->settings_structure[ $tab ]['sections'][ $section ]['fields'] ) ) {
return $this->settings_structure[ $tab ]['sections'][ $section ]['fields'];
- } elseif ( ! empty( $this->settings_structure[ $tab ]['fields'] ) ) {
+ }
+
+ if ( ! empty( $this->settings_structure[ $tab ]['form_sections'] ) ) {
+ return array( 'form_sections' => $this->settings_structure[ $tab ]['form_sections'] );
+ }
+
+ if ( ! empty( $this->settings_structure[ $tab ]['fields'] ) ) {
return $this->settings_structure[ $tab ]['fields'];
}
return array();
}
-
/**
- * Setup admin menu
+ * Settings page callback.
*/
- function primary_admin_menu() {
- add_submenu_page( 'ultimatemember', __( 'Settings', 'ultimate-member' ), __( 'Settings', 'ultimate-member' ), 'manage_options', 'um_options', array( &$this, 'settings_page' ) );
- }
-
-
- /**
- * Settings page callback
- */
- function settings_page() {
- $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] );
+ public function settings_page() {
+ $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] );
$current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] );
- $settings_struct = $this->settings_structure[ $current_tab ];
+ $temp_structure = $this->settings_structure; // Don't remove this temp variable. Internal workaround for Email Tab integration.
- //remove not option hidden fields
- if ( ! empty( $settings_struct['fields'] ) ) {
- foreach ( $settings_struct['fields'] as $field_key => $field_options ) {
+ $custom_content = apply_filters( 'um_settings_section_' . $current_tab . '_' . $current_subtab . '_custom_content', false, $current_tab, $current_subtab );
- if ( isset( $field_options['is_option'] ) && $field_options['is_option'] === false ) {
- unset( $settings_struct['fields'][ $field_key ] );
- }
-
- }
+ if ( false === $custom_content ) {
+ $section_fields = $this->get_section_fields( $current_tab, $current_subtab );
+ $settings_section = $this->render_settings_section( $section_fields, $current_tab, $current_subtab );
+ } else {
+ $settings_section = $custom_content;
}
- if ( empty( $settings_struct['fields'] ) && empty( $settings_struct['sections'] ) ) {
- um_js_redirect( add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ) );
- }
+ $this->settings_structure = $temp_structure; // Don't remove this temp variable. Internal workaround for Email Tab integration.
- if ( ! empty( $settings_struct['sections'] ) ) {
- if ( empty( $settings_struct['sections'][ $current_subtab ] ) ) {
- um_js_redirect( add_query_arg( array( 'page' => 'um_options', 'tab' => $current_tab ), admin_url( 'admin.php' ) ) );
- }
- }
-
- echo '
' . __( 'Ultimate Member - Settings', 'ultimate-member' ) . ' ';
+ echo '
' . esc_html__( 'Ultimate Member - Settings', 'ultimate-member' ) . ' ';
echo $this->generate_tabs_menu() . $this->generate_subtabs_menu( $current_tab );
+ echo '
';
/**
* UM hook
*
@@ -2004,158 +2178,93 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
* }
* ?>
*/
- do_action( "um_settings_page_before_" . $current_tab . "_" . $current_subtab . "_content" );
-
- if ( in_array( $current_tab, apply_filters('um_settings_custom_tabs', array( 'licenses', 'install_info', 'override_templates' ) ) ) || in_array( $current_subtab, apply_filters( 'um_settings_custom_subtabs', array(), $current_tab ) ) ) {
-
- /**
- * UM hook
- *
- * @type action
- * @title um_settings_page_{$current_tab}_{$current_subtab}_before_section
- * @description Show some content before section content at settings page
- * @change_log
- * ["Since: 2.0"]
- * @usage add_action( 'um_settings_page_{$current_tab}_{$current_subtab}_before_section', 'function_name', 10 );
- * @example
- *
- */
- do_action( "um_settings_page_" . $current_tab . "_" . $current_subtab . "_before_section" );
-
- $section_fields = $this->get_section_fields( $current_tab, $current_subtab );
- $settings_section = $this->render_settings_section( $section_fields, $current_tab, $current_subtab );
-
- /**
- * UM hook
- *
- * @type filter
- * @title um_settings_section_{$current_tab}_{$current_subtab}_content
- *
- * @description Render settings section
- * @input_vars
- * [{"var":"$content","type":"string","desc":"Section content"},
- * {"var":"$section_fields","type":"array","desc":"Section Fields"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage add_filter( 'um_settings_section_{$current_tab}_{$current_subtab}_content', 'function_name', 10, 2 );
- * @example
- *
- */
- echo apply_filters( 'um_settings_section_' . $current_tab . '_' . $current_subtab . '_content',
- $settings_section,
- $section_fields
- );
-
- } else { ?>
+ do_action( "um_settings_page_before_{$current_tab}_{$current_subtab}_content" );
+ $form_wrapper = true;
+ if ( in_array( $current_tab, array( 'licenses', 'install_info' ), true ) ) {
+ $form_wrapper = false;
+ }
+ if ( 'advanced' === $current_tab && 'override_templates' === $current_subtab ) {
+ $form_wrapper = false;
+ }
+ $form_wrapper = apply_filters( 'um_settings_default_form_wrapper', $form_wrapper, $current_tab, $current_subtab );
+ if ( $form_wrapper ) {
+ ?>
-
- ';
- $tabs = '
';
-
- switch( $page ) {
+ switch ( $page ) {
case 'settings':
$menu_tabs = array();
foreach ( $this->settings_structure as $slug => $tab ) {
if ( ! empty( $tab['fields'] ) ) {
foreach ( $tab['fields'] as $field_key => $field_options ) {
- if ( isset( $field_options['is_option'] ) && $field_options['is_option'] === false ) {
+ if ( isset( $field_options['is_option'] ) && false === $field_options['is_option'] ) {
unset( $tab['fields'][ $field_key ] );
}
}
}
- if ( ! empty( $tab['fields'] ) || ! empty( $tab['sections'] ) ) {
+ if ( ! empty( $tab['fields'] ) || ! empty( $tab['sections'] ) || ! empty( $tab['form_sections'] ) ) {
$menu_tabs[ $slug ] = $tab['title'];
}
}
$current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] );
foreach ( $menu_tabs as $name => $label ) {
- $active = ( $current_tab == $name ) ? 'nav-tab-active' : '';
- $tabs .= '' .
- $label .
- ' ';
+ $active = $current_tab === $name ? 'nav-tab-active' : '';
+
+ $args = array( 'page' => 'um_options' );
+ if ( ! empty( $name ) ) {
+ $args['tab'] = $name;
+ }
+ $tab_url = add_query_arg( $args, admin_url( 'admin.php' ) );
+ $tabs .= '' . esc_html( $label ) . ' ';
}
break;
@@ -2184,39 +2293,49 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
break;
}
- return $tabs . ' ';
+ return $tabs . '';
}
-
/**
* @param string $tab
*
* @return string
*/
- function generate_subtabs_menu( $tab = '' ) {
+ private function generate_subtabs_menu( $tab = '' ) {
if ( empty( $this->settings_structure[ $tab ]['sections'] ) ) {
return '';
}
+ $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] );
+ $current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] );
+
$menu_subtabs = array();
foreach ( $this->settings_structure[ $tab ]['sections'] as $slug => $subtab ) {
$menu_subtabs[ $slug ] = $subtab['title'];
}
- $subtabs = '
';
-
- $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] );
- $current_subtab = empty( $_GET['section'] ) ? '' : sanitize_key( $_GET['section'] );
+ $subtabs = array();
foreach ( $menu_subtabs as $name => $label ) {
- $active = ( $current_subtab == $name ) ? 'current' : '';
- $subtabs .= ''
- . $label .
- ' | ';
+ $active = $current_subtab === $name ? 'current' : '';
+
+ $args = array( 'page' => 'um_options' );
+ if ( ! empty( $current_tab ) ) {
+ $args['tab'] = $current_tab;
+ }
+ if ( ! empty( $name ) ) {
+ $args['section'] = $name;
+ }
+ $tab_url = add_query_arg( $args, admin_url( 'admin.php' ) );
+
+ $subtabs[] = '' . esc_html( $label ) . ' ';
}
- return substr( $subtabs, 0, -3 ) . ' ';
- }
+ if ( empty( $subtabs ) ) {
+ return '';
+ }
+ return '
' . implode( ' | ', $subtabs ) . ' ';
+ }
/**
* Handler for settings forms
@@ -2318,8 +2437,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
}
}
-
- function set_default_if_empty( $settings ) {
+ public function set_default_if_empty( $settings ) {
$tab = '';
if ( ! empty( $_GET['tab'] ) ) {
$tab = sanitize_key( $_GET['tab'] );
@@ -2330,7 +2448,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
$section = sanitize_key( $_GET['section'] );
}
-
if ( 'access' === $tab && empty( $section ) ) {
if ( ! array_key_exists( 'access_exclude_uris', $settings ) ) {
$settings['access_exclude_uris'] = array();
@@ -2340,14 +2457,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
return $settings;
}
-
/**
- * Remove empty values from multi text fields
+ * Remove empty values from multi text fields.
*
- * @param $settings
+ * @param array $settings
* @return array
*/
- function remove_empty_values( $settings ) {
+ public function remove_empty_values( $settings ) {
$tab = '';
if ( ! empty( $_GET['tab'] ) ) {
$tab = sanitize_key( $_GET['tab'] );
@@ -2358,9 +2474,25 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
$section = sanitize_key( $_GET['section'] );
}
- if ( isset( $this->settings_structure[ $tab ]['sections'][ $section ]['fields'] ) ) {
+ if ( ! empty( $this->settings_structure[ $tab ]['sections'][ $section ]['form_sections'] ) ) {
+ $fields = array();
+ foreach ( $this->settings_structure[ $tab ]['sections'][ $section ]['form_sections'] as $section_key => $section_data ) {
+ if ( ! empty( $section_data['fields'] ) ) {
+ $fields[] = $section_data['fields'];
+ }
+ }
+ $fields = array_merge( ...$fields );
+ } elseif ( ! empty( $this->settings_structure[ $tab ]['sections'][ $section ]['fields'] ) ) {
$fields = $this->settings_structure[ $tab ]['sections'][ $section ]['fields'];
- } else {
+ } elseif ( ! empty( $this->settings_structure[ $tab ]['form_sections'] ) ) {
+ $fields = array();
+ foreach ( $this->settings_structure[ $tab ]['form_sections'] as $section_key => $section_data ) {
+ if ( ! empty( $section_data['fields'] ) ) {
+ $fields[] = $section_data['fields'];
+ }
+ }
+ $fields = array_merge( ...$fields );
+ } elseif ( ! empty( $this->settings_structure[ $tab ]['fields'] ) ) {
$fields = $this->settings_structure[ $tab ]['fields'];
}
@@ -2368,15 +2500,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
return $settings;
}
-
$filtered_settings = array();
foreach ( $settings as $key => $value ) {
-
$filtered_settings[ $key ] = $value;
foreach ( $fields as $field ) {
- if ( $field['id'] == $key && isset( $field['type'] ) && $field['type'] == 'multi_text' ) {
- $filtered_settings[ $key ] = array_filter( $settings[ $key ] );
+ if ( $field['id'] === $key && array_key_exists( 'type', $field ) && 'multi_text' === $field['type'] ) {
+ $filtered_settings[ $key ] = array_filter( $value );
}
}
}
@@ -2384,7 +2514,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
return $filtered_settings;
}
-
/**
*
*/
@@ -2541,12 +2670,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
}
}
}
-
}
}
}
-
/**
*
*/
@@ -2560,7 +2687,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
}
}
-
/**
*
*/
@@ -2591,13 +2717,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
}
$item_name = false;
- $version = false;
- $author = false;
+ $version = false;
+ $author = false;
foreach ( $this->settings_structure['licenses']['fields'] as $field_data ) {
if ( $field_data['id'] == $key ) {
$item_name = ! empty( $field_data['item_name'] ) ? $field_data['item_name'] : false;
- $version = ! empty( $field_data['version'] ) ? $field_data['version'] : false;
- $author = ! empty( $field_data['author'] ) ? $field_data['author'] : false;
+ $version = ! empty( $field_data['version'] ) ? $field_data['version'] : false;
+ $author = ! empty( $field_data['author'] ) ? $field_data['author'] : false;
}
}
@@ -2615,7 +2741,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
array(
'timeout' => UM()->request_timeout,
'sslverify' => false,
- 'body' => $api_params
+ 'body' => $api_params,
)
);
@@ -2627,7 +2753,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
array(
'timeout' => UM()->request_timeout,
'sslverify' => true,
- 'body' => $api_params
+ 'body' => $api_params,
)
);
@@ -2638,44 +2764,86 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
$request = ( $request ) ? maybe_unserialize( $request ) : false;
- if ( $edd_action == 'activate_license' || $edd_action == 'check_license' ) {
+ if ( in_array( $edd_action, array( 'activate_license', 'check_license' ), true ) ) {
update_option( "{$key}_edd_answer", $request );
} else {
delete_option( "{$key}_edd_answer" );
}
-
}
}
-
/**
- *
+ * Adds email notifications list table before the email options list.
*/
- function settings_before_email_tab() {
+ public function settings_before_email_tab() {
$email_key = empty( $_GET['email'] ) ? '' : sanitize_key( $_GET['email'] );
- $emails = UM()->config()->email_notifications;
+ $emails = UM()->config()->email_notifications;
if ( empty( $email_key ) || empty( $emails[ $email_key ] ) ) {
include_once UM_PATH . 'includes/admin/core/list-tables/emails-list-table.php';
}
}
-
/**
- * @param $section
+ * Set settings field per email notification.
*
- * @return string
+ * @param bool|array $section_fields
+ * @param string $tab
+ *
+ * @return bool|array
*/
- function settings_email_tab( $section ) {
+ public function email_section_custom_fields( $section_fields, $tab ) {
+ if ( 'email' !== $tab ) {
+ return $section_fields;
+ }
+
$email_key = empty( $_GET['email'] ) ? '' : sanitize_key( $_GET['email'] );
- $emails = UM()->config()->email_notifications;
+ $emails = UM()->config()->email_notifications;
if ( empty( $email_key ) || empty( $emails[ $email_key ] ) ) {
- return $section;
+ return $section_fields;
}
$in_theme = UM()->mail()->template_in_theme( $email_key );
+ $back_link = add_query_arg(
+ array(
+ 'page' => 'um_options',
+ 'tab' => 'email',
+ ),
+ admin_url( 'admin.php' )
+ );
+
+ $this->settings_structure['email']['title'] = '
← ' . $emails[ $email_key ]['title'];
+ $this->settings_structure['email']['description'] = $emails[ $email_key ]['description'];
+
+ $section_fields = array(
+ array(
+ 'id' => 'um_email_template',
+ 'type' => 'hidden',
+ 'value' => $email_key,
+ ),
+ array(
+ 'id' => $email_key . '_on',
+ 'type' => 'checkbox',
+ 'label' => __( 'Enable/Disable', 'ultimate-member' ),
+ 'checkbox_label' => __( 'Enable this email notification', 'ultimate-member' ),
+ ),
+ array(
+ 'id' => $email_key . '_sub',
+ 'type' => 'text',
+ 'label' => __( 'Subject', 'ultimate-member' ),
+ 'conditional' => array( $email_key . '_on', '=', 1 ),
+ ),
+ array(
+ 'id' => $email_key,
+ 'type' => 'email_template',
+ 'label' => __( 'Email Content', 'ultimate-member' ),
+ 'conditional' => array( $email_key . '_on', '=', 1 ),
+ 'value' => UM()->mail()->get_email_template( $email_key ),
+ 'in_theme' => $in_theme,
+ ),
+ );
/**
* UM hook
*
@@ -2697,67 +2865,32 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
* }
* ?>
*/
- $section_fields = apply_filters( 'um_admin_settings_email_section_fields', array(
- array(
- 'id' => 'um_email_template',
- 'type' => 'hidden',
- 'value' => $email_key,
- ),
- array(
- 'id' => $email_key . '_on',
- 'type' => 'checkbox',
- 'label' => $emails[ $email_key ]['title'],
- 'tooltip' => $emails[ $email_key ]['description'],
- ),
- array(
- 'id' => $email_key . '_sub',
- 'type' => 'text',
- 'label' => __( 'Subject Line', 'ultimate-member' ),
- 'conditional' => array( $email_key . '_on', '=', 1 ),
- 'tooltip' => __( 'This is the subject line of the e-mail', 'ultimate-member' ),
- ),
- array(
- 'id' => $email_key,
- 'type' => 'email_template',
- 'label' => __( 'Message Body', 'ultimate-member' ),
- 'conditional' => array( $email_key . '_on', '=', 1 ),
- 'tooltip' => __( 'This is the content of the e-mail', 'ultimate-member' ),
- 'value' => UM()->mail()->get_email_template( $email_key ),
- 'in_theme' => $in_theme
- ),
- ), $email_key );
-
- return $this->render_settings_section( $section_fields, 'email', $email_key );
+ return apply_filters( 'um_admin_settings_email_section_fields', $section_fields, $email_key );
}
-
/**
+ * @param bool $html
+ * @param string $current_tab
+ * @param string $current_subtab
*
+ * @return bool|string
*/
- function settings_appearance_profile_tab() {
- wp_enqueue_media();
- }
-
-
- /**
- * @param $html
- * @param $section_fields
- *
- * @return string
- */
- function settings_licenses_tab( $html, $section_fields ) {
- ob_start(); ?>
+ public function settings_licenses_tab( $html, $current_tab, $current_subtab ) {
+ $section_fields = $this->get_section_fields( $current_tab, $current_subtab );
+ if ( empty( $section_fields ) ) {
+ return $html;
+ }
+ $um_settings_nonce = wp_create_nonce( 'um-settings-nonce' );
+ ob_start();
+ ?>