diff --git a/.wordpress-org/blueprints/blueprint.json b/.wordpress-org/blueprints/blueprint.json
index 617fcdfc..9b356790 100644
--- a/.wordpress-org/blueprints/blueprint.json
+++ b/.wordpress-org/blueprints/blueprint.json
@@ -15,7 +15,7 @@
"step": "installPlugin",
"pluginZipFile": {
"resource": "url",
- "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.4.zip"
+ "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.5.zip"
},
"options": {
"activate": true
diff --git a/README.md b/README.md
index a7a83c83..c475cff6 100644
--- a/README.md
+++ b/README.md
@@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version
### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION
-[Official Release Version: 2.10.4](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.4).
+[Official Release Version: 2.10.5](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.5).
## Changelog
diff --git a/assets/css/um-members.css b/assets/css/um-members.css
index 076cf73b..1a03453e 100644
--- a/assets/css/um-members.css
+++ b/assets/css/um-members.css
@@ -1249,4 +1249,4 @@ body #content .um-directory a:hover, body #content .um-directory a:focus {
.select2-container .select2-results li.select2-results__option[aria-disabled=true] {
display: none;
-}
+}
\ No newline at end of file
diff --git a/assets/css/um-members.min.css b/assets/css/um-members.min.css
index 5659a061..9eaf0679 100644
--- a/assets/css/um-members.min.css
+++ b/assets/css/um-members.min.css
@@ -1 +1 @@
-@-webkit-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.um-new-dropdown{font-size:16px;margin:0;position:absolute;height:auto;background:#fff;z-index:10;display:none;border:1px solid #ddd;box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);-webkit-box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px}.um-new-dropdown ul{margin:0;padding:0}.um-new-dropdown ul li{list-style-type:none;padding:0;margin:0}.um-new-dropdown ul li a{display:block;padding:8px 12px;line-height:1}.um-new-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-new-dropdown-arr *{display:block;width:24px;height:24px;vertical-align:bottom;overflow:hidden;line-height:24px}body #content .um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}body #content .um-directory a:focus,body #content .um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;position:relative}.um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory a:focus,.um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory .select2-container--disabled{opacity:.6}.um-directory .um-members-overlay{display:none;position:absolute;width:100%;top:0;bottom:0;background:0 0;z-index:2}.um-directory .um-members-overlay .um-ajax-loading{-webkit-transition:.1s opacity;-moz-transition:.1s opacity;-ms-transition:.1s opacity;-o-transition:.1s opacity;transition:.1s opacity;color:#c6c6c6!important;-webkit-animation:um-ajax-spinning 1.1s infinite linear;animation:um-ajax-spinning 1.1s infinite linear;border-top:.2em solid rgba(198,198,198,.2);border-right:.2em solid rgba(198,198,198,.2);border-bottom:.2em solid rgba(198,198,198,.2);border-left:.2em solid #c6c6c6;font-size:1.75em;position:absolute;left:calc(50% - 1.75em);top:calc(50% - 1.75em);-ms-transform:translateZ(0);transform:translateZ(0);border-radius:50%;display:block;width:2.5em;height:2.5em;margin:0;outline:0;padding:0;vertical-align:baseline}.um-directory .um-member-directory-header{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-filters-bar{padding:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row:not(.um-member-directory-filters-bar){display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-header-row-invisible{margin:0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-end}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;width:60%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label{flex:1;margin:0 10px 0 0;min-width:90px;max-width:85%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label span{display:none;margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label .um-search-line{-webkit-appearance:textfield;width:100%;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line .um-do-search{min-width:15%;width:auto}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{display:flex;flex-direction:row;justify-content:space-between;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{font-size:30px;line-height:30px;margin:0 10px 0 0;width:30px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type .um-member-directory-view-type-a{color:#ddd;display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled a{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:hover{color:#ccc}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:focus{color:#ddd}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;flex:5}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;position:relative;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown{top:24px;width:200px;left:-12px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown li a[data-selected="1"]{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{display:flex;flex-direction:row;justify-content:flex-end;align-items:baseline;flex-wrap:nowrap;flex:2;text-align:right}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search{margin:0;width:100%;display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(3,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(3,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:100%;position:relative}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .select2-container{float:left;width:100%!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .um-s1{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-text-filter-type input{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type{flex-direction:column;align-items:stretch}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider{width:calc(100% - 16px)}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider.ui-slider.ui-slider-horizontal{border:1px solid #ddd!important;box-sizing:border-box;margin:4px 8px 0 8px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider-range{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:6px 0 0 8px;font-size:.8em}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input{width:calc(50% - 5px);margin:0 5px 0 0!important;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even),.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even){margin:0 0 0 5px!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search[style*="overflow: hidden;"] .um-search-filter{pointer-events:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search.um-search-invisible{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;margin:0;padding:0;box-sizing:border-box;border:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;margin:0 10px 5px 0;padding:0 10px;border-radius:3px;cursor:default;background:#f1f1f1;font-size:13px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child{margin-left:0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove{float:right;display:inline-block;margin-left:10px;cursor:pointer;font-weight:700;font-size:20px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove:hover{color:#a00}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters a{padding:3px 10px;margin:0 10px}.um-directory .um-members-wrapper{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0;position:relative;height:300px}.um-directory .um-members-wrapper .um-members-intro{text-align:center;margin:0 0 10px 0}.um-directory .um-members-wrapper .um-members-total{font-size:20px;font-weight:300}.um-directory .um-members-wrapper .um-members{width:100%;margin:0;padding:0;-ms-word-break:break-all;word-break:break-word;word-wrap:break-word}.um-directory .um-members-wrapper .um-members .um-member{border:1px solid #ddd;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1 a img{-moz-border-radius:999px!important;-webkit-border-radius:999px!important;border-radius:999px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-2 a img{-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-3 a img{-moz-border-radius:0!important;-webkit-border-radius:0!important;border-radius:0!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name a{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members img{display:block;overflow:hidden;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;margin:0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:5%}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member{float:left;width:30%;background:#fff;text-align:center;margin-bottom:40px;position:relative}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.rejected{display:block;position:absolute;top:0;left:0;width:100%;padding:7px 15px;color:#fff;z-index:10;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo{padding:40px 0 20px 0;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a{text-decoration:none;box-shadow:none!important;display:inline!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a img{display:inline!important;border:5px solid #fff;background:#fff;width:140px;height:140px;float:none!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.rejected{opacity:.7}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo{padding-top:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo a img{width:90px;height:90px;position:relative;top:-35px;margin-bottom:-45px;float:none;opacity:1}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover{background-color:#eee;box-sizing:border-box;position:relative}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio]{overflow-y:hidden}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e{text-align:center;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e img{width:100%!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card{padding-bottom:15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card.no-photo{padding-top:30px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name{margin:0 0 4px 0;justify-content:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn{margin:2px 0;height:40px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn{padding:10px 15px!important;transition:none!important;display:inline-block!important;margin:0 auto!important;min-width:110px;width:auto;text-align:center;font-size:13px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before{font-family:FontAwesome;margin-right:8px;width:14px;text-align:left;display:inline-block;font-size:16px;position:relative;left:0;top:1px;content:"\f013"}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-tagline{font-size:13px;line-height:22px;color:#999;padding:0 15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta{display:none;margin:20px 15px 0 15px;padding:15px 0;border-top:1px solid #e5e5e5}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline{font-size:13px;padding:12px 0 0 0;line-height:16px;vertical-align:middle}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline strong{display:block;clear:both}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline span{display:block;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect{padding-top:20px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less{display:none}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-list{display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(1,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(1,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;padding:15px;margin:0;background:#fff;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.rejected{display:block;width:100%;padding:7px 15px;margin-bottom:10px;color:#fff;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo{width:100px;margin:0 15px 0 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a{width:100px;height:100px;display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a img{width:100px;height:100px;position:relative;top:0;margin:0;margin-bottom:0;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:calc(100% - 115px);padding:0;margin:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card.no-photo{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 30px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name{margin:0 0 4px 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-tagline{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;width:100%;font-size:13px;color:#999;padding:0;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main{width:100%;padding:0;box-sizing:border-box;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta{float:left;width:100%;display:block;margin:10px 0 0 0;box-sizing:border-box;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-metaline{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:wrap;font-size:13px;padding:12px 0 0 0;line-height:16px;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect{padding-top:10px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;flex-wrap:nowrap;width:20px;text-align:right;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog{position:relative}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a{line-height:1;display:block;color:#666}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a i{display:block;font-size:20px;line-height:1}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown{width:180px;right:0;text-align:left}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions a{box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:calc(100% - 145px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons>:not(:last-child){margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons{width:20px;text-align:right}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo.no-reveal .um-member-card-footer-buttons{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo:not(.no-reveal) .um-member-card-footer-buttons{width:calc(100% - 30px)}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 125px)}.um-directory .um-members-wrapper .um-members .um-members-none{text-align:center;font-size:18px}.um-directory .um-members-pagination-box{width:100%;float:left;margin:0 0 10px 0;padding:0}.um-directory .um-members-pagination-box .um-members-pagi{display:flex;flex-direction:row;justify-content:center;align-items:baseline;flex-wrap:nowrap;width:100%;margin:0;padding:0;font-size:15px}.um-directory .um-members-pagination-box .um-members-pagi .pagi{cursor:pointer;display:inline-block;width:auto;height:34px;line-height:34px;transition:all .2s linear;padding:0 14px;color:#666!important;font-weight:400}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow{line-height:38px}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow i:before{font-size:20px;vertical-align:middle!important;height:34px;line-height:34px;top:-2px;position:relative}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current{cursor:default;color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current:hover{color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.disabled{cursor:default;opacity:.4}.um-directory .um-members-pagination-box .um-members-pagi .pagi.none{color:#aaa!important}.um-directory .um-members-pagination-box .um-members-pagidrop{width:100%;float:left;margin:0;text-align:center;padding:5px 0;font-size:15px}.um-directory.um-loaded .um-members-wrapper{height:auto}.um-directory[data-view_type=list] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=list]{display:block}.um-directory[data-view_type=grid] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=grid]{display:block}.um-directory[data-view_type=map] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=map]{display:block}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{flex-wrap:wrap}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 2px 0 0}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{width:calc(100% - 25px);justify-content:flex-end}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown{right:0;left:auto}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{flex:none;width:100%}.um-directory.uimob340 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob340 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member{padding:10px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:50px;margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 60px)}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 90px);margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 0 5px 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper a.um-button{width:100%!important}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 70px)}.um-directory.uimob340 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 5px 0 0}.um-directory.uimob500 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob500 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:70px;margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 80px)}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 110px);margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 90px)}.um-directory.uimob500 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob800 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob800 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:80px;margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 90px)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 120px);margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 100px)}.um-directory.uimob960 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.select2-container .select2-results li.select2-results__option[aria-disabled=true]{display:none}
\ No newline at end of file
+@-webkit-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.um-new-dropdown{font-size:16px;margin:0;position:absolute;height:auto;background:#fff;z-index:10;display:none;border:1px solid #ddd;box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);-webkit-box-shadow:0 7px 14px 0 rgba(50,50,93,.1),0 3px 6px 0 rgba(0,0,0,.07);box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px}.um-new-dropdown ul{margin:0;padding:0}.um-new-dropdown ul li{list-style-type:none;padding:0;margin:0}.um-new-dropdown ul li a{display:block;padding:8px 12px;line-height:1}.um-new-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-new-dropdown-arr *{display:block;width:24px;height:24px;vertical-align:bottom;overflow:hidden;line-height:24px}body #content .um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}body #content .um-directory a:focus,body #content .um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;position:relative}.um-directory a{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory a:focus,.um-directory a:hover{text-decoration:none;border-bottom:none;box-shadow:none}.um-directory .select2-container--disabled{opacity:.6}.um-directory .um-members-overlay{display:none;position:absolute;width:100%;top:0;bottom:0;background:0 0;z-index:2}.um-directory .um-members-overlay .um-ajax-loading{-webkit-transition:.1s opacity;-moz-transition:.1s opacity;-ms-transition:.1s opacity;-o-transition:.1s opacity;transition:.1s opacity;color:#c6c6c6!important;-webkit-animation:um-ajax-spinning 1.1s infinite linear;animation:um-ajax-spinning 1.1s infinite linear;border-top:.2em solid rgba(198,198,198,.2);border-right:.2em solid rgba(198,198,198,.2);border-bottom:.2em solid rgba(198,198,198,.2);border-left:.2em solid #c6c6c6;font-size:1.75em;position:absolute;left:calc(50% - 1.75em);top:calc(50% - 1.75em);-ms-transform:translateZ(0);transform:translateZ(0);border-radius:50%;display:block;width:2.5em;height:2.5em;margin:0;outline:0;padding:0;vertical-align:baseline}.um-directory .um-member-directory-header{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-filters-bar{padding:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row:not(.um-member-directory-filters-bar){display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0 0 10px 0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-header-row-invisible{margin:0}.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-end}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;width:60%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label{flex:1;margin:0 10px 0 0;min-width:90px;max-width:85%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label span{display:none;margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label .um-search-line{-webkit-appearance:textfield;width:100%;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line .um-do-search{min-width:15%;width:auto}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{display:flex;flex-direction:row;justify-content:space-between;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{font-size:30px;line-height:30px;margin:0 10px 0 0;width:30px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type .um-member-directory-view-type-a{color:#ddd;display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled a{cursor:default}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:hover{color:#ccc}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:focus{color:#ddd}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;flex:5}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;position:relative;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown{top:24px;width:200px;left:-12px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown li a[data-selected="1"]{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{display:flex;flex-direction:row;justify-content:flex-end;align-items:baseline;flex-wrap:nowrap;flex:2;text-align:right}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;cursor:pointer}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a{margin:0 5px 0 0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-down{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-up{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-down{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-up{display:inline}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search{margin:0;width:100%;display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(3,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(3,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:100%;position:relative}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .select2-container{float:left;width:100%!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .um-s1{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-text-filter-type input{width:100%}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type{flex-direction:column;align-items:stretch}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider{width:calc(100% - 16px)}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider.ui-slider.ui-slider-horizontal{border:1px solid #ddd!important;box-sizing:border-box;margin:4px 8px 0 8px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider-range{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:6px 0 0 8px;font-size:.8em}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input,.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input{width:calc(50% - 5px);margin:0 5px 0 0!important;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even),.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even){margin:0 0 0 5px!important}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search[style*="overflow: hidden;"] .um-search-filter{pointer-events:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-search.um-search-invisible{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;margin:0;padding:0;box-sizing:border-box;border:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;margin:0 10px 5px 0;padding:0 10px;border-radius:3px;cursor:default;background:#f1f1f1;font-size:13px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child{margin-left:0}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove{float:right;display:inline-block;margin-left:10px;cursor:pointer;font-weight:700;font-size:20px}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove:hover{color:#a00}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters{display:none}.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters a{padding:3px 10px;margin:0 10px}.um-directory .um-members-wrapper{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0;position:relative;height:300px}.um-directory .um-members-wrapper .um-members-intro{text-align:center;margin:0 0 10px 0}.um-directory .um-members-wrapper .um-members-total{font-size:20px;font-weight:300}.um-directory .um-members-wrapper .um-members{width:100%;margin:0;padding:0;-ms-word-break:break-all;word-break:break-word;word-wrap:break-word}.um-directory .um-members-wrapper .um-members .um-member{border:1px solid #ddd;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1 a img{-moz-border-radius:999px!important;-webkit-border-radius:999px!important;border-radius:999px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-2 a img{-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-3 a img{-moz-border-radius:0!important;-webkit-border-radius:0!important;border-radius:0!important}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name a{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members img{display:block;overflow:hidden;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;margin:0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:5%}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member{float:left;width:30%;background:#fff;text-align:center;margin-bottom:40px;position:relative}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.rejected{display:block;position:absolute;top:0;left:0;width:100%;padding:7px 15px;color:#fff;z-index:10;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo{padding:40px 0 20px 0;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a{text-decoration:none;box-shadow:none!important;display:inline!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a img{display:inline!important;border:5px solid #fff;background:#fff;width:140px;height:140px;float:none!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.inactive,.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.rejected{opacity:.7}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo{padding-top:0}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo a img{width:90px;height:90px;position:relative;top:-35px;margin-bottom:-45px;float:none;opacity:1}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover{background-color:#eee;box-sizing:border-box;position:relative;min-height:50px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio]{overflow-y:hidden}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e{text-align:center;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e img{width:100%!important}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card{padding-bottom:15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card.no-photo{padding-top:30px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name{margin:0 0 4px 0;justify-content:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn{margin:2px 0;height:40px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn{padding:10px 15px!important;transition:none!important;display:inline-block!important;margin:0 auto!important;min-width:110px;width:auto;text-align:center;font-size:13px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before{font-family:FontAwesome;margin-right:8px;width:14px;text-align:left;display:inline-block;font-size:16px;position:relative;left:0;top:1px;content:"\f013"}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-tagline{font-size:13px;line-height:22px;color:#999;padding:0 15px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta{display:none;margin:20px 15px 0 15px;padding:15px 0;border-top:1px solid #e5e5e5}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline{font-size:13px;padding:12px 0 0 0;line-height:16px;vertical-align:middle}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline strong{display:block;clear:both}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline span{display:block;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect{padding-top:20px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less{display:none}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a i{display:block;font-size:32px;height:32px;line-height:32px}.um-directory .um-members-wrapper .um-members.um-members-list{display:grid;grid-template-rows:auto 1fr;grid-template-columns:repeat(1,1fr);grid-gap:10px;grid-auto-rows:minmax(max-content,auto);-ms-grid-template-rows:auto 1fr;-ms-grid-template-columns:repeat(1,1fr);-ms-grid-gap:10px;-ms-grid-auto-rows:minmax(max-content,auto);align-items:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:100%;padding:15px;margin:0;background:#fff;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status{display:none;background:#999}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.inactive,.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.rejected{display:block;width:100%;padding:7px 15px;margin-bottom:10px;color:#fff;font-size:13px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review{background:#c74a4a}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:100%;margin:0 0 10px 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo{width:100px;margin:0 15px 0 0;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a{width:100px;height:100px;display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a img{width:100px;height:100px;position:relative;top:0;margin:0;margin-bottom:0;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;flex-wrap:nowrap;width:calc(100% - 115px);padding:0;margin:0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card.no-photo{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 30px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name{margin:0 0 4px 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name a{font-size:16px;line-height:26px;color:#444;font-weight:700}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-tagline{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:wrap;width:100%;font-size:13px;color:#999;padding:0;box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main{width:100%;padding:0;box-sizing:border-box;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main.no-animate{display:block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta{float:left;width:100%;display:block;margin:10px 0 0 0;box-sizing:border-box;border:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-metaline{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:wrap;font-size:13px;padding:12px 0 0 0;line-height:16px;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect{padding-top:10px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a{display:inline-block;width:40px;line-height:40px;height:40px;-moz-border-radius:999px;-webkit-border-radius:999px;border-radius:999px;color:#fff!important;opacity:.85;margin:0 1px;font-size:22px;transition:.25s;text-align:center}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a:hover{opacity:1;color:#fff}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-end;flex-wrap:nowrap;width:20px;text-align:right;padding:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog{position:relative}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a{line-height:1;display:block;color:#666}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a i{display:block;font-size:20px;line-height:1}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown{width:180px;right:0;text-align:left}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions a{box-sizing:border-box}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:nowrap;width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;width:calc(100% - 145px);margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;margin:0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons>:not(:last-child){margin:0 10px 0 0}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons{width:20px;text-align:right}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less{display:flex;flex-direction:column;justify-content:flex-start;align-items:baseline;flex-wrap:nowrap;display:none}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a{color:#666;display:inline-block}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a i{display:block;font-size:28px;height:28px;line-height:28px}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo.no-reveal .um-member-card-footer-buttons{width:100%}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo:not(.no-reveal) .um-member-card-footer-buttons{width:calc(100% - 30px)}.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 125px)}.um-directory .um-members-wrapper .um-members .um-members-none{text-align:center;font-size:18px}.um-directory .um-members-pagination-box{width:100%;float:left;margin:0 0 10px 0;padding:0}.um-directory .um-members-pagination-box .um-members-pagi{display:flex;flex-direction:row;justify-content:center;align-items:baseline;flex-wrap:nowrap;width:100%;margin:0;padding:0;font-size:15px}.um-directory .um-members-pagination-box .um-members-pagi .pagi{cursor:pointer;display:inline-block;width:auto;height:34px;line-height:34px;transition:all .2s linear;padding:0 14px;color:#666!important;font-weight:400}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow{line-height:38px}.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow i:before{font-size:20px;vertical-align:middle!important;height:34px;line-height:34px;top:-2px;position:relative}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current{cursor:default;color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.current:hover{color:#fff!important}.um-directory .um-members-pagination-box .um-members-pagi .pagi.disabled{cursor:default;opacity:.4}.um-directory .um-members-pagination-box .um-members-pagi .pagi.none{color:#aaa!important}.um-directory .um-members-pagination-box .um-members-pagidrop{width:100%;float:left;margin:0;text-align:center;padding:5px 0;font-size:15px}.um-directory.um-loaded .um-members-wrapper{height:auto}.um-directory[data-view_type=list] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=list]{display:block}.um-directory[data-view_type=grid] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=grid]{display:block}.um-directory[data-view_type=map] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=map]{display:block}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line{flex-wrap:wrap}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 2px 0 0}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting{width:calc(100% - 25px);justify-content:flex-end}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown{right:0;left:auto}.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters{flex:none;width:100%}.um-directory.uimob340 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob340 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member{padding:10px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:50px;margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:50px;height:50px}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 60px)}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;width:calc(100% - 90px);margin:0 10px 0 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 0 5px 0}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper a.um-button{width:100%!important}.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 70px)}.um-directory.uimob340 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row{justify-content:flex-start}.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type{width:20px;font-size:20px;line-height:20px;margin:0 5px 0 0}.um-directory.uimob500 .um-member-directory-header .um-search{grid-template-columns:repeat(1,1fr)}.um-directory.uimob500 .um-members-wrapper .um-members .um-member{width:100%}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:70px;margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:70px;height:70px}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 80px)}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 110px);margin:0 10px 0 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 90px)}.um-directory.uimob500 .um-members-pagination-box .um-members-pagi{display:none}.um-directory.uimob800 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line{width:100%}.um-directory.uimob800 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo{width:80px;margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img{width:80px;height:80px}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card{width:calc(100% - 90px)}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer{align-items:flex-start}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons{flex-wrap:wrap;width:calc(100% - 120px);margin:0 10px 0 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper{margin:0 10px 5px 0}.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons{width:calc(100% - 100px)}.um-directory.uimob960 .um-member-directory-header .um-search{grid-template-columns:repeat(2,1fr)}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer{width:4%}.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-member{width:48%}.select2-container .select2-results li.select2-results__option[aria-disabled=true]{display:none}
\ No newline at end of file
diff --git a/assets/js/admin/block-restrictions.js b/assets/js/admin/block-restrictions.js
index 2f3ec381..04067f60 100644
--- a/assets/js/admin/block-restrictions.js
+++ b/assets/js/admin/block-restrictions.js
@@ -8,6 +8,40 @@ var um_components = wp.components,
function um_admin_blocks_custom_fields( um_condition_fields, props ) {
return wp.hooks.applyFilters( 'um_admin_blocks_custom_fields', [], um_condition_fields, props );
}
+function um_add_restriction_attributes( settings, name ) {
+ // add attributes for all blocks
+ const restrictionAttributes = {
+ um_is_restrict: {
+ type: 'boolean',
+ default: false,
+ },
+ um_who_access: {
+ type: 'string',
+ default: '0',
+ },
+ um_roles_access: {
+ type: 'array',
+ default: [],
+ },
+ um_message_type: {
+ type: 'string',
+ default: '0',
+ },
+ um_message_content: {
+ type: 'string',
+ default: '',
+ },
+ };
+
+ settings.attributes = Object.assign( settings.attributes, restrictionAttributes );
+ return settings;
+}
+
+wp.hooks.addFilter(
+ 'blocks.registerBlockType',
+ 'um-block/add-restriction-attributes',
+ um_add_restriction_attributes
+);
var um_block_restriction = wp.compose.createHigherOrderComponent(
function( BlockEdit ) {
diff --git a/assets/js/admin/block-restrictions.min.js b/assets/js/admin/block-restrictions.min.js
index 203ca795..becb5ed6 100644
--- a/assets/js/admin/block-restrictions.min.js
+++ b/assets/js/admin/block-restrictions.min.js
@@ -1 +1 @@
-var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction);
\ No newline at end of file
+var um_components=wp.components,umSelectControl=um_components.SelectControl,umTextareaControl=um_components.TextareaControl;function um_admin_blocks_custom_fields(e,t){return wp.hooks.applyFilters("um_admin_blocks_custom_fields",[],e,t)}function um_add_restriction_attributes(e,t){return e.attributes=Object.assign(e.attributes,{um_is_restrict:{type:"boolean",default:!1},um_who_access:{type:"string",default:"0"},um_roles_access:{type:"array",default:[]},um_message_type:{type:"string",default:"0"},um_message_content:{type:"string",default:""}}),e}wp.hooks.addFilter("blocks.registerBlockType","um-block/add-restriction-attributes",um_add_restriction_attributes);var um_block_restriction=wp.compose.createHigherOrderComponent(function(s){var _={um_who_access:"um_block_settings_hide",um_roles_access:"um_block_settings_hide",um_message_type:"um_block_settings_hide",um_message_content:"um_block_settings_hide"},_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_default",_);return function(t){var e=void 0!==t.attributes.um_is_restrict&&t.attributes.um_is_restrict;return!0!==t.attributes.um_is_restrict?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(_.um_who_access="",0===parseInt(t.attributes.um_who_access)||void 0===t.attributes.um_who_access?(_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):(1===parseInt(t.attributes.um_who_access)&&(_.um_roles_access=""),_.um_message_type="",2===parseInt(t.attributes.um_message_type)?_.um_message_content="":_.um_message_content="um_block_settings_hide")),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields",_,t),wp.element.createElement(wp.element.Fragment,{},wp.element.createElement(s,t),wp.element.createElement(wp.blockEditor.InspectorControls,{},wp.element.createElement(wp.components.PanelBody,{title:wp.i18n.__("Ultimate Member: Content Restriction","ultimate-member"),className:"um_block_settings"},wp.element.createElement(wp.components.ToggleControl,{label:wp.i18n.__("Restrict access?","ultimate-member"),checked:e,onChange:function(e){t.setAttributes({um_is_restrict:e}),!1===e?(_.um_who_access="um_block_settings_hide",_.um_roles_access="um_block_settings_hide",_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide"):_.um_who_access="",_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_is_restrict",e)}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_who_access,label:wp.i18n.__("Who can access this block?","ultimate-member"),value:t.attributes.um_who_access,options:[{label:wp.i18n.__("Everyone","ultimate-member"),value:0},{label:wp.i18n.__("Logged in users","ultimate-member"),value:1},{label:wp.i18n.__("Logged out users","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_who_access:e}),0===parseInt(e)?(_.um_message_type="um_block_settings_hide",_.um_message_content="um_block_settings_hide",_.um_roles_access="um_block_settings_hide"):1===parseInt(e)?(_.um_message_type="",_.um_roles_access=""):(_.um_message_type="",_.um_roles_access="um_block_settings_hide"),_=wp.hooks.applyFilters("um_admin_blocks_condition_fields_on_change",_,"um_who_access",e)}}),wp.element.createElement(umSelectControl,{multiple:!0,className:_.um_roles_access,label:wp.i18n.__("What roles can access this block?","ultimate-member"),value:t.attributes.um_roles_access,options:um_restrict_roles,onChange:function(e){t.setAttributes({um_roles_access:e})}}),wp.element.createElement(umSelectControl,{type:"number",className:_.um_message_type,label:wp.i18n.__("Restriction action","ultimate-member"),value:t.attributes.um_message_type,options:[{label:wp.i18n.__("Hide block","ultimate-member"),value:0},{label:wp.i18n.__("Show global default message","ultimate-member"),value:1},{label:wp.i18n.__("Show custom message","ultimate-member"),value:2}],onChange:function(e){t.setAttributes({um_message_type:e}),2===parseInt(e)?_.um_message_content="":_.um_message_content="um_block_settings_hide"}}),wp.element.createElement(umTextareaControl,{type:"number",className:_.um_message_content,label:wp.i18n.__("Custom restricted access message","ultimate-member"),value:t.attributes.um_message_content,onChange:function(e){t.setAttributes({um_message_content:e})}}),um_admin_blocks_custom_fields(_,t))))}},"um_block_restriction");wp.hooks.addFilter("editor.BlockEdit","um-block/um_block_restriction",um_block_restriction);
\ No newline at end of file
diff --git a/changelog.txt b/changelog.txt
index 888d7c1b..2127063c 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,30 @@
== Changelog ==
+= 2.10.5 June 25, 2025 =
+
+* Enhancements:
+
+ - Added: Filter hooks for primary button classes in UM forms.
+ - Tweak: Refactored Site Health data, added hooks for 3rd-party integration.
+
+* Bugfixes:
+
+ - Fixed: Stripped shortcodes in the user data during the Account, Registration and Profile forms submission. (Thanks to [MissVeronica](https://github.com/MissVeronica))
+ - Fixed: Email placeholders values.
+ - Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions.
+ - Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version.
+ - Fixed: Secondary email field validation.
+ - Fixed: Action Scheduler batch actions with users who have Undefined status.
+ - Fixed: Restrictions for 3rd-party Gutenberg Blocks.
+ - Fixed: Date/time picker filter-types range query on Member Directories.
+ - Fixed: Renamed "Macedonia, the former Yugoslav Republic of" to the official "North Macedonia".
+
+* Templates required update:
+
+ - password-reset.php
+
+* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade *
+
= 2.10.4 May 15, 2025 =
* Bugfixes:
diff --git a/composer.json b/composer.json
index 8f581ee0..16f2034c 100644
--- a/composer.json
+++ b/composer.json
@@ -24,7 +24,7 @@
"ext-iconv": "*",
"ext-tidy": "*",
"composer/installers": "^2.3",
- "woocommerce/action-scheduler": "3.9.0"
+ "woocommerce/action-scheduler": "3.9.2"
},
"require-dev": {
"wp-cli/wp-cli": "*",
diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php
index 45ceec2d..027e3502 100644
--- a/includes/admin/class-site-health.php
+++ b/includes/admin/class-site-health.php
@@ -1,8 +1,6 @@
common()->theme()->get_custom_templates_list();
+ /**
+ * Return labels array with translations.
+ *
+ * @return array Labels array containing translations.
+ */
+ public static function get_labels() {
+ if ( empty( self::$labels ) ) {
+ self::$labels = array(
+ 'yes' => __( 'Yes', 'ultimate-member' ),
+ 'no' => __( 'No', 'ultimate-member' ),
+ 'all' => __( 'All', 'ultimate-member' ),
+ 'default' => __( 'Default', 'ultimate-member' ),
+ 'nopages' => __( 'No predefined page', 'ultimate-member' ),
+ 'empty' => __( 'Empty', 'ultimate-member' ),
+ );
+ }
+ return self::$labels;
+ }
+
+ /**
+ * Register site status tests.
+ *
+ * @param array $tests The array of site status tests.
+ *
+ * @return array The modified array of site status tests.
+ */
+ public function register_site_status_tests( $tests ) {
+ // Searching for custom templates and outdated versions.
+ $custom_templates = UM()->common()->theme()->get_custom_templates_list();
if ( ! empty( $custom_templates ) ) {
$tests['direct']['um_override_templates'] = array(
'label' => esc_html__( 'Are the Ultimate Member templates out of date?', 'ultimate-member' ),
@@ -42,6 +76,7 @@ class Site_Health {
);
}
+ // Searching for outdated icons.
$first_activation_date = get_option( 'um_first_activation_date', false );
if ( ! empty( $first_activation_date ) && $first_activation_date < 1716336000 ) {
$tests['direct']['um_outdated_icons'] = array(
@@ -67,6 +102,11 @@ class Site_Health {
return $tests;
}
+ /**
+ * Calculates the status of custom Ultimate Member templates and provides a detailed result array.
+ *
+ * @return array Result array containing details about the custom templates status.
+ */
public function override_templates_test() {
$result = array(
'label' => __( 'You have the most recent version of custom Ultimate Member templates', 'ultimate-member' ),
@@ -102,7 +142,9 @@ class Site_Health {
}
/**
- * @return bool|array
+ * Retrieves outdated icons in Ultimate Member forms and provides details and actions for updating.
+ *
+ * @return array|bool Returns an array with description and actions for updating outdated icons, or null if nothing needs updating.
*/
private function get_outdated_icons() {
$result = array(
@@ -181,6 +223,17 @@ class Site_Health {
);
}
+ /**
+ * Filters the site health test information about outdated icons.
+ *
+ * @hook um_get_outdated_icons_result
+ *
+ * @since 2.8.6
+ *
+ * @param {array} $result The site health test information about outdated icons.
+ *
+ * @return {array} The site health test information about outdated icons.
+ */
$result = apply_filters( 'um_get_outdated_icons_result', $result, $old_icons );
if ( ! empty( $result['description'] ) ) {
@@ -197,6 +250,11 @@ class Site_Health {
return false;
}
+ /**
+ * Retrieve information about outdated icons in Ultimate Member forms and settings.
+ *
+ * @return array Information about the status of icons, including label, status, badge, description, actions, and test name.
+ */
public function outdated_icons_test() {
$result = array(
'label' => __( 'You have the most recent version of icons in Ultimate Member forms and settings', 'ultimate-member' ),
@@ -226,10 +284,22 @@ class Site_Health {
return $result;
}
+ /**
+ * Check if a specific field is banned for a user based on the meta key.
+ *
+ * @param string $metakey The meta key to check if it's banned.
+ *
+ * @return bool True if the field is banned, false otherwise.
+ */
private static function field_is_banned( $metakey ) {
return UM()->user()->is_metakey_banned( $metakey ) || in_array( strtolower( $metakey ), UM()->builtin()->blacklist_fields, true );
}
+ /**
+ * Retrieve information about banned fields in Ultimate Member forms.
+ *
+ * @return bool|array Information about banned fields, including description, actions, and form data.
+ */
public function get_banned_fields() {
$result = array(
'description' => '',
@@ -287,11 +357,13 @@ class Site_Health {
foreach ( $break_forms as $form_id => $form_data ) {
$fields = array();
foreach ( $form_data['fields'] as $metakey => $field_title ) {
- $fields[] = sprintf( __( '%s (%s)', 'ultimate-member' ), $field_title, $metakey );
+ // translators: %1$s is the field title, %2$s is the field metakey
+ $fields[] = sprintf( __( '%1$s (%2$s)', 'ultimate-member' ), $field_title, $metakey );
}
$forms_description[] = '
' . sprintf(
- __( 'Fields in %s (#ID: %s):', 'ultimate-member' ),
+ // translators: %1$s is the form link, %2$s is the form title, %3$s is the form ID
+ __( 'Fields in %2$s (#ID: %3$s):', 'ultimate-member' ),
esc_url( $form_data['link'] ),
esc_html( $form_data['title'] ),
esc_html( $form_id )
@@ -308,6 +380,17 @@ class Site_Health {
);
}
+ /**
+ * Filters the site health test information about banned fields.
+ *
+ * @hook um_get_banned_fields_result
+ *
+ * @since 2.10.3
+ *
+ * @param {array} $result The site health test information about banned fields.
+ *
+ * @return {array} The site health test information about banned fields.
+ */
$result = apply_filters( 'um_get_banned_fields_result', $result );
if ( ! empty( $result['description'] ) ) {
@@ -324,6 +407,11 @@ class Site_Health {
return false;
}
+ /**
+ * Retrieve information about banned fields in Ultimate Member forms.
+ *
+ * @return array Information about the status of banned fields, including label, status, badge, description, actions, and test name.
+ */
public function banned_fields_test() {
$result = array(
'label' => __( 'You have correct Ultimate Member fields', 'ultimate-member' ),
@@ -352,64 +440,46 @@ class Site_Health {
return $result;
}
- private function get_roles() {
- return UM()->roles()->get_roles();
+ /**
+ * Retrieve role metadata by slug.
+ *
+ * @todo replace with UM()->roles()->role_data( $slug );
+ *
+ * @param string $slug The slug of the role.
+ *
+ * @return mixed|false Role metadata if found, false if not found.
+ */
+ private function get_role_meta( $slug ) {
+ return get_option( "um_role_{$slug}_meta", false );
}
- private function get_forms() {
- $forms_data = get_posts(
- array(
- 'post_type' => 'um_form',
- 'posts_per_page' => -1,
- )
+ /**
+ * Retrieve field data based on the field key and field configuration.
+ *
+ * @param string $field_key The key of the field.
+ * @param array $field The configuration of the field.
+ *
+ * @return array Field data including label and value.
+ */
+ private function get_field_data( $field_key, $field ) {
+ $row = array_key_exists( 'type', $field ) && 'row' === $field['type'];
+ $title = $row ? __( 'Row: ', 'ultimate-member' ) . $field['id'] : __( 'Field: ', 'ultimate-member' ) . $field['metakey'];
+ $field = array_map(
+ function ( $item ) {
+ if ( is_array( $item ) ) {
+ $item = maybe_serialize( $item );
+ }
+ return $item;
+ },
+ $field
);
- $forms = array();
- foreach ( $forms_data as $form ) {
- $forms[ 'ID#' . $form->ID ] = $form->post_title;
- }
- return $forms;
- }
- private function get_role_meta( $key ) {
- return get_option( "um_role_{$key}_meta", false );
- }
-
- public function array_map( $item ) {
- if ( is_array( $item ) ) {
- $item = maybe_serialize( $item );
- }
- return $item;
- }
-
- private function get_field_data( $info, $key, $field_key, $field ) {
- $row = array_key_exists( 'type', $field ) && 'row' === $field['type'];
- $title = $row ? __( 'Row: ', 'ultimate-member' ) . $field['id'] : __( 'Field: ', 'ultimate-member' ) . $field['metakey'];
- $field = array_map( array( &$this, 'array_map' ), $field );
- $field_info = array(
- 'um-field_' . $field_key => array(
+ return array(
+ 'field_' . $field_key => array(
'label' => $title,
'value' => $field,
),
);
-
- return $field_info;
- }
-
- private function get_member_directories() {
- $query = new WP_Query();
- $member_directories = $query->query(
- array(
- 'post_type' => 'um_directory',
- 'posts_per_page' => -1,
- )
- );
-
- $directories = array();
- foreach ( $member_directories as $directory ) {
- $directories[ 'ID#' . $directory->ID ] = $directory->post_title;
- }
-
- return $directories;
}
/**
@@ -422,19 +492,71 @@ class Site_Health {
* @return array The updated Site Health information.
*/
public function debug_information( $info ) {
- $labels = array(
- 'yes' => __( 'Yes', 'ultimate-member' ),
- 'no' => __( 'No', 'ultimate-member' ),
- 'all' => __( 'All', 'ultimate-member' ),
- 'default' => __( 'Default', 'ultimate-member' ),
- 'nopages' => __( 'No predefined page', 'ultimate-member' ),
+ $info['ultimate-member'] = array(
+ 'label' => __( 'Ultimate Member Settings', 'ultimate-member' ),
+ 'description' => __( 'This debug information for your Ultimate Member installation can assist you in getting support.', 'ultimate-member' ),
+ 'fields' => $this->settings_debug_information(),
);
- $info['ultimate-member'] = array(
- 'label' => __( 'Ultimate Member', 'ultimate-member' ),
- 'description' => __( 'This debug information for your Ultimate Member installation can assist you in getting support.', 'ultimate-member' ),
- 'fields' => array(),
- );
+ // User roles settings
+ $info = $this->roles_debug_information( $info );
+
+ // Forms settings
+ $info = $this->forms_debug_information( $info );
+
+ // Members directory
+ if ( UM()->options()->get( 'members_page' ) ) {
+ $info = $this->member_directories_debug_information( $info );
+ }
+
+ /**
+ * Filters the site health information.
+ *
+ * @hook um_site_health_extend
+ *
+ * @since 2.10.3
+ *
+ * @param {array} $info The site health info to be filtered.
+ *
+ * @return {array} The filtered site health info.
+ */
+ return apply_filters( 'um_site_health_extend', $info );
+ }
+
+ /**
+ * Retrieve debug information for various settings in the application.
+ *
+ * @return array Debug information for general, access, emails, appearance, advanced, and license settings.
+ */
+ public function settings_debug_information() {
+ // General settings
+ $general = $this->general_settings_debug_information();
+
+ // Access settings
+ $access = $this->access_settings_debug_information();
+
+ // Emails settings
+ $emails = $this->emails_settings_debug_information();
+
+ // Appearance settings
+ $appearance = $this->appearance_settings_debug_information();
+
+ // Advanced settings
+ $advanced = $this->advanced_settings_debug_information();
+
+ // License settings
+ $license = $this->license_settings_debug_information();
+
+ return array_merge( $general, $access, $emails, $appearance, $advanced, $license );
+ }
+
+ /**
+ * Retrieve debug information about general settings in Ultimate Member.
+ *
+ * @return array Information about the general settings including pages, user settings, and related options.
+ */
+ public function general_settings_debug_information() {
+ $labels = self::get_labels();
// Pages settings.
$pages = array();
@@ -456,10 +578,12 @@ class Site_Health {
$pages[ $page_title ] = sprintf( __( '%1$s (ID#%2$d) | %3$s', 'ultimate-member' ), get_the_title( $predefined_page_id ), $predefined_page_id, get_permalink( $predefined_page_id ) );
}
- $pages = apply_filters( 'um_debug_information_pages', $pages );
-
$pages_settings = array(
- 'um-pages' => array(
+ 'pages_separator' => array(
+ 'label' => __( 'General > Pages', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'pages' => array(
'label' => __( 'Pages', 'ultimate-member' ),
'value' => $pages,
),
@@ -470,86 +594,57 @@ class Site_Health {
$display_name = UM()->config()->display_name_options;
$user_settings = array(
- 'um-permalink_base' => array(
+ 'user_separator' => array(
+ 'label' => __( 'General > Users', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'register_role' => array(
+ 'label' => __( 'Registration Default Role', 'ultimate-member' ),
+ 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ),
+ ),
+ 'permalink_base' => array(
'label' => __( 'Profile Permalink Base', 'ultimate-member' ),
'value' => isset( $permalink_base[ UM()->options()->get( 'permalink_base' ) ] ) ? $permalink_base[ UM()->options()->get( 'permalink_base' ) ] : $labels['no'],
),
- 'um-display_name' => array(
- 'label' => __( 'User Display Name', 'ultimate-member' ),
- 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'],
- ),
- 'um-author_redirect' => array(
- 'label' => __( 'Automatically redirect author page to their profile?', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-members_page' => array(
- 'label' => __( 'Enable Members Directory', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-toggle_password' => array(
- 'label' => __( 'Show/hide password button', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-require_strongpass' => array(
- 'label' => __( 'Require Strong Passwords', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-password_min_chars' => array(
- 'label' => __( 'Require Strong Passwords', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'password_min_chars' ),
- ),
- 'um-password_max_chars' => array(
- 'label' => __( 'Require Strong Passwords', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'password_max_chars' ),
- ),
- 'um-profile_noindex' => array(
- 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-activation_link_expiry_time' => array(
- 'label' => __( 'Activation link lifetime', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'activation_link_expiry_time' ),
- ),
- 'um-use_gravatars' => array(
- 'label' => __( 'Use Gravatars?', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-admin_ignore_user_status' => array(
- 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-delete_comments' => array(
- 'label' => __( 'Deleting user comments after deleting a user', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'],
- ),
);
if ( 'custom_meta' === UM()->options()->get( 'permalink_base' ) ) {
- $user_settings = UM()->array_insert_before(
- $user_settings,
- 'um-display_name',
- array(
- 'um-permalink_base_custom_meta' => array(
- 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'permalink_base_custom_meta' ),
- ),
- )
+ $user_settings['permalink_base_custom_meta'] = array(
+ 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'permalink_base_custom_meta' ),
);
}
+ $user_settings['display_name'] = array(
+ 'label' => __( 'User Display Name', 'ultimate-member' ),
+ 'value' => isset( $display_name[ UM()->options()->get( 'display_name' ) ] ) ? $display_name[ UM()->options()->get( 'display_name' ) ] : $labels['no'],
+ );
+
if ( 'field' === UM()->options()->get( 'display_name' ) ) {
- $user_settings = UM()->array_insert_before(
- $user_settings,
- 'um-author_redirect',
- array(
- 'um-display_name_field' => array(
- 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'display_name_field' ),
- ),
- )
+ $user_settings['display_name_field'] = array(
+ 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'display_name_field' ),
);
}
+ $user_settings = array_merge(
+ $user_settings,
+ array(
+ 'author_redirect' => array(
+ 'label' => __( 'Hide author pages (enable author page redirect to user profile)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'author_redirect' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'members_page' => array(
+ 'label' => __( 'Enable Members Directory', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'members_page' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'use_gravatars' => array(
+ 'label' => __( 'Use Gravatars?', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'],
+ ),
+ )
+ );
+
if ( UM()->options()->get( 'use_gravatars' ) ) {
$gravatar_options = array(
'default' => __( 'Default', 'ultimate-member' ),
@@ -562,32 +657,139 @@ class Site_Health {
'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ),
);
- $user_settings['um-use_um_gravatar_default_builtin_image'] = array(
+ $user_settings['use_um_gravatar_default_builtin_image'] = array(
'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ),
'value' => $gravatar_options[ UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ],
);
if ( 'default' === UM()->options()->get( 'use_um_gravatar_default_builtin_image' ) ) {
- $user_settings['um-use_um_gravatar_default_image'] = array(
- 'label' => __( 'Use Default plugin avatar as Gravatar\'s Default avatar', 'ultimate-member' ),
+ $user_settings['use_um_gravatar_default_image'] = array(
+ 'label' => __( 'Replace Gravatar\'s Default avatar (Set Default plugin avatar as Gravatar\'s Default avatar)', 'ultimate-member' ),
'value' => UM()->options()->get( 'use_um_gravatar_default_image' ) ? $labels['yes'] : $labels['no'],
);
}
}
+ $user_settings = array_merge(
+ $user_settings,
+ array(
+ 'admin_ignore_user_status' => array(
+ 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'delete_comments' => array(
+ 'label' => __( 'Delete user comments (enable deleting user comments after deleting a user)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'toggle_password' => array(
+ 'label' => __( 'Toggle Password Visibility (enable password show/hide icon on password field)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'toggle_password' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'require_strongpass' => array(
+ 'label' => __( 'Require Strong Passwords', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'require_strongpass' ) ? $labels['yes'] : $labels['no'],
+ ),
+ )
+ );
+
+ if ( UM()->options()->get( 'require_strongpass' ) ) {
+ $user_settings = array_merge(
+ $user_settings,
+ array(
+ 'password_min_chars' => array(
+ 'label' => __( 'Password minimum length', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'password_min_chars' ),
+ ),
+ 'password_max_chars' => array(
+ 'label' => __( 'Password maximum length', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'password_max_chars' ),
+ ),
+ )
+ );
+ }
+
+ $user_settings = array_merge(
+ $user_settings,
+ array(
+ 'activation_link_expiry_time' => array(
+ 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'activation_link_expiry_time' ) ? UM()->options()->get( 'activation_link_expiry_time' ) : __( 'Not expired', 'ultimate-member' ),
+ ),
+ 'profile_noindex' => array(
+ 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_noindex' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'profile_title' => array(
+ 'label' => __( 'User Profile Title', 'ultimate-member' ),
+ 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ),
+ ),
+ 'profile_desc' => array(
+ 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ),
+ 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ),
+ ),
+ )
+ );
+
// Account settings
$account_settings = array(
- 'um-account_tab_password' => array(
+ 'account_separator' => array(
+ 'label' => __( 'General > Account', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'account_name' => array(
+ 'label' => __( 'Display First & Last name fields (enable to display First & Last name fields)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'account_email' => array(
+ 'label' => __( 'Allow users to change email (enable changing email via the account page)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'account_general_password' => array(
+ 'label' => __( 'Require password to update account (enable required password)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'account_tab_password' => array(
'label' => __( 'Password Account Tab', 'ultimate-member' ),
'value' => UM()->options()->get( 'account_tab_password' ) ? $labels['yes'] : $labels['no'],
),
- 'um-account_tab_privacy' => array(
+ 'account_tab_privacy' => array(
'label' => __( 'Privacy Account Tab', 'ultimate-member' ),
'value' => UM()->options()->get( 'account_tab_privacy' ) ? $labels['yes'] : $labels['no'],
),
);
+ if ( UM()->options()->get( 'account_name' ) ) {
+ $account_settings = UM()->array_insert_before(
+ $account_settings,
+ 'account_email',
+ array(
+ 'account_name_disable' => array(
+ 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'account_name_require' => array(
+ 'label' => __( 'Require First & Last Name', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'],
+ ),
+ )
+ );
+ }
+
+ if ( UM()->options()->get( 'account_tab_privacy' ) ) {
+ $account_settings['account_hide_in_directory'] = array(
+ 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'],
+ );
+
+ if ( UM()->options()->get( 'account_hide_in_directory' ) ) {
+ $account_settings['account_hide_in_directory_default'] = array(
+ 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'account_hide_in_directory_default' ),
+ );
+ }
+ }
+
if ( false !== UM()->account()->is_notifications_tab_visible() ) {
- $account_settings['um-account_tab_notifications'] = array(
+ $account_settings['account_tab_notifications'] = array(
'label' => __( 'Notifications Account Tab', 'ultimate-member' ),
'value' => UM()->options()->get( 'account_tab_notifications' ) ? $labels['yes'] : $labels['no'],
);
@@ -596,56 +798,25 @@ class Site_Health {
$account_settings = array_merge(
$account_settings,
array(
- 'um-account_tab_delete' => array(
+ 'account_tab_delete' => array(
'label' => __( 'Delete Account Tab', 'ultimate-member' ),
'value' => UM()->options()->get( 'account_tab_delete' ) ? $labels['yes'] : $labels['no'],
),
- 'um-delete_account_text' => array(
- 'label' => __( 'Account Deletion Custom Text', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'delete_account_text' ),
- ),
- 'um-delete_account_no_pass_required_text' => array(
- 'label' => __( 'Account Deletion without password Custom Text', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ),
- ),
- 'um-account_name' => array(
- 'label' => __( 'Add a First & Last Name fields', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_name' ) ? $labels['yes'] : $labels['no'],
- ),
)
);
- if ( UM()->options()->get( 'account_name' ) ) {
- $account_settings['um-account_name_disable'] = array(
- 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_name_disable' ) ? $labels['yes'] : $labels['no'],
- );
- $account_settings['um-account_name_require'] = array(
- 'label' => __( 'Require First & Last Name', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_name_require' ) ? $labels['yes'] : $labels['no'],
- );
- }
-
- $account_settings['um-account_email'] = array(
- 'label' => __( 'Allow users to change email', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'],
- );
-
- $account_settings['um-account_general_password'] = array(
- 'label' => __( 'Password is required?', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_general_password' ) ? $labels['yes'] : $labels['no'],
- );
-
- $account_settings['um-account_hide_in_directory'] = array(
- 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_hide_in_directory' ) ? $labels['yes'] : $labels['no'],
- );
-
- if ( UM()->options()->get( 'account_hide_in_directory' ) ) {
- $account_settings['um-account_hide_in_directory_default'] = array(
- 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'account_hide_in_directory_default' ),
- );
+ if ( UM()->options()->get( 'account_tab_delete' ) ) {
+ if ( UM()->account()->current_password_is_required( 'delete' ) ) {
+ $account_settings['delete_account_text'] = array(
+ 'label' => __( 'Account Deletion Text', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'delete_account_text' ),
+ );
+ } else {
+ $account_settings['delete_account_no_pass_required_text'] = array(
+ 'label' => __( 'Account Deletion without password Text', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'delete_account_no_pass_required_text' ),
+ );
+ }
}
// Uploads settings
@@ -664,40 +835,55 @@ class Site_Health {
}
}
$uploads_settings = array(
- 'um-profile_photo_max_size' => array(
- 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_photo_max_size' ),
+ 'uploads_separator' => array(
+ 'label' => __( 'General > Uploads', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
),
- 'um-cover_photo_max_size' => array(
- 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'cover_photo_max_size' ),
- ),
- 'um-photo_thumb_sizes' => array(
- 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ),
- 'value' => $profile_sizes_list,
- ),
- 'um-cover_thumb_sizes' => array(
- 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ),
- 'value' => $cover_sizes_list,
- ),
- 'um-image_orientation_by_exif' => array(
+ 'image_orientation_by_exif' => array(
'label' => __( 'Change image orientation', 'ultimate-member' ),
'value' => UM()->options()->get( 'image_orientation_by_exif' ) ? $labels['yes'] : $labels['no'],
),
- 'um-image_compression' => array(
+ 'image_compression' => array(
'label' => __( 'Image Quality', 'ultimate-member' ),
'value' => UM()->options()->get( 'image_compression' ),
),
- 'um-image_max_width' => array(
+ 'image_max_width' => array(
'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ),
'value' => UM()->options()->get( 'image_max_width' ),
),
- 'um-cover_min_width' => array(
+ 'profile_photo_max_size' => array(
+ 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_photo_max_size' ),
+ ),
+ 'photo_thumb_sizes' => array(
+ 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ),
+ 'value' => $profile_sizes_list,
+ ),
+ 'cover_photo_max_size' => array(
+ 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'cover_photo_max_size' ),
+ ),
+ 'cover_min_width' => array(
'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ),
'value' => UM()->options()->get( 'cover_min_width' ),
),
+ 'cover_thumb_sizes' => array(
+ 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ),
+ 'value' => $cover_sizes_list,
+ ),
);
+ return array_merge( $pages_settings, $user_settings, $account_settings, $uploads_settings );
+ }
+
+ /**
+ * Retrieve debug information related to access settings in Ultimate Member.
+ *
+ * @return array Debug information about access settings, including restrictions, accessible options, and other settings.
+ */
+ public function access_settings_debug_information() {
+ $labels = self::get_labels();
+
// Content Restriction settings
$restricted_posts = UM()->options()->get( 'restricted_access_post_metabox' );
$restricted_posts_list = '';
@@ -717,7 +903,11 @@ class Site_Health {
$accessible = absint( UM()->options()->get( 'accessible' ) );
$restrict_settings = array(
- 'um-accessible' => array(
+ 'access_separator' => array(
+ 'label' => __( 'Access > Restriction Content', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'accessible' => array(
'label' => __( 'Global Site Access', 'ultimate-member' ),
'value' => 0 === $accessible ? __( 'Site accessible to Everyone', 'ultimate-member' ) : __( 'Site accessible to Logged In Users', 'ultimate-member' ),
),
@@ -729,115 +919,125 @@ class Site_Health {
if ( ! empty( $exclude_uris ) ) {
$exclude_uris_list = implode( ', ', $exclude_uris );
}
- $restrict_settings['um-access_redirect'] = array(
+ $restrict_settings['access_redirect'] = array(
'label' => __( 'Custom Redirect URL', 'ultimate-member' ),
'value' => UM()->options()->get( 'access_redirect' ),
);
- $restrict_settings['um-access_exclude_uris'] = array(
+ $restrict_settings['access_exclude_uris'] = array(
'label' => __( 'Exclude the following URLs', 'ultimate-member' ),
'value' => $exclude_uris_list,
);
- $restrict_settings['um-home_page_accessible'] = array(
+ $restrict_settings['home_page_accessible'] = array(
'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ),
'value' => UM()->options()->get( 'home_page_accessible' ) ? $labels['yes'] : $labels['no'],
);
- $restrict_settings['um-category_page_accessible'] = array(
+ $restrict_settings['category_page_accessible'] = array(
'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ),
'value' => UM()->options()->get( 'category_page_accessible' ) ? $labels['yes'] : $labels['no'],
);
}
- $restrict_settings['um-restricted_post_title_replace'] = array(
- 'label' => __( 'Restricted Content Titles', 'ultimate-member' ),
+ $restrict_settings['restricted_post_title_replace'] = array(
+ 'label' => __( 'Restricted Post Title', 'ultimate-member' ),
'value' => UM()->options()->get( 'restricted_post_title_replace' ) ? $labels['yes'] : $labels['no'],
);
if ( UM()->options()->get( 'restricted_post_title_replace' ) ) {
- $restrict_settings['um-restricted_access_post_title'] = array(
- 'label' => __( 'Restricted Content Title Text', 'ultimate-member' ),
+ $restrict_settings['restricted_access_post_title'] = array(
+ 'label' => __( 'Restricted Access Post Title', 'ultimate-member' ),
'value' => stripslashes( UM()->options()->get( 'restricted_access_post_title' ) ),
);
}
- $restrict_settings['um-restricted_access_message'] = array(
+ $restrict_settings['restricted_access_message'] = array(
'label' => __( 'Restricted Access Message', 'ultimate-member' ),
'value' => stripslashes( UM()->options()->get( 'restricted_access_message' ) ),
);
- $restrict_settings['um-restricted_blocks'] = array(
- 'label' => __( 'Enable the "Content Restriction" settings for the Gutenberg Blocks', 'ultimate-member' ),
+ $restrict_settings['restricted_blocks'] = array(
+ 'label' => __( 'Restricted Gutenberg Blocks (enable the "Content Restriction" settings for the Gutenberg Blocks)', 'ultimate-member' ),
'value' => UM()->options()->get( 'restricted_blocks' ) ? $labels['yes'] : $labels['no'],
);
if ( UM()->options()->get( 'restricted_blocks' ) ) {
- $restrict_settings['um-restricted_block_message'] = array(
+ $restrict_settings['restricted_block_message'] = array(
'label' => __( 'Restricted Access Block Message', 'ultimate-member' ),
'value' => stripslashes( UM()->options()->get( 'restricted_block_message' ) ),
);
}
- $restrict_settings['um-restricted_access_post_metabox'] = array(
+ $restrict_settings['restricted_access_post_metabox'] = array(
'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ),
'value' => $restricted_posts_list,
);
- $restrict_settings['um-restricted_access_taxonomy_metabox'] = array(
+ $restrict_settings['restricted_access_taxonomy_metabox'] = array(
'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ),
'value' => $restricted_taxonomy_list,
);
// Access other settings
- $blocked_emails = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_emails' ) ) );
- $blocked_words = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_words' ) ) );
- $allowed_callbacks = str_replace( '
', ', ', nl2br( UM()->options()->get( 'allowed_choice_callbacks' ) ) );
+ $blocked_emails = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_emails' ) ) );
+ $blocked_words = str_replace( '
', ', ', nl2br( UM()->options()->get( 'blocked_words' ) ) );
$access_other_settings = array(
- 'um-enable_reset_password_limit' => array(
+ 'access_other_separator' => array(
+ 'label' => __( 'Access > Other', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'enable_reset_password_limit' => array(
'label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ),
'value' => UM()->options()->get( 'enable_reset_password_limit' ) ? $labels['yes'] : $labels['no'],
),
);
if ( UM()->options()->get( 'enable_reset_password_limit' ) ) {
- $access_other_settings['um-reset_password_limit_number'] = array(
- 'label' => __( 'Reset Password Limit ', 'ultimate-member' ),
+ $access_other_settings['reset_password_limit_number'] = array(
+ 'label' => __( 'Password Limit (maximum reset password limit)', 'ultimate-member' ),
'value' => UM()->options()->get( 'reset_password_limit_number' ),
);
}
- $access_other_settings['um-change_password_request_limit'] = array(
+ $access_other_settings['change_password_request_limit'] = array(
'label' => __( 'Change Password request limit ', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'change_password_request_limit' ),
+ 'value' => UM()->options()->get( 'change_password_request_limit' ) ? $labels['yes'] : $labels['no'],
);
- $access_other_settings['um-only_approved_user_reset_password'] = array(
+ $access_other_settings['only_approved_user_reset_password'] = array(
'label' => __( 'Only approved user Reset Password', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'only_approved_user_reset_password' ),
+ 'value' => UM()->options()->get( 'only_approved_user_reset_password' ) ? $labels['yes'] : $labels['no'],
);
- $access_other_settings['um-blocked_emails'] = array(
+ $access_other_settings['blocked_emails'] = array(
'label' => __( 'Blocked Email Addresses', 'ultimate-member' ),
'value' => stripslashes( $blocked_emails ),
);
- $access_other_settings['um-blocked_words'] = array(
+ $access_other_settings['blocked_words'] = array(
'label' => __( 'Blacklist Words', 'ultimate-member' ),
'value' => stripslashes( $blocked_words ),
);
- $access_other_settings['um-allowed_choice_callbacks'] = array(
- 'label' => __( 'Allowed Choice Callbacks', 'ultimate-member' ),
- 'value' => stripslashes( $allowed_callbacks ),
- );
- $access_other_settings['um-allow_url_redirect_confirm'] = array(
- 'label' => __( 'Allow external link redirect confirm ', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'allow_url_redirect_confirm' ) ? $labels['yes'] : $labels['no'],
- );
+
+ return array_merge( $restrict_settings, $access_other_settings );
+ }
+
+ /**
+ * Retrieve debug information about the email settings in Ultimate Member.
+ *
+ * @return array Information about the email settings, including labels, values, and template status.
+ */
+ public function emails_settings_debug_information() {
+ $labels = self::get_labels();
// Email settings
$email_settings = array(
- 'um-admin_email' => array(
+ 'email_separator' => array(
+ 'label' => __( 'Emails', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'admin_email' => array(
'label' => __( 'Admin Email Address', 'ultimate-member' ),
'value' => UM()->options()->get( 'admin_email' ),
),
- 'um-mail_from' => array(
+ 'mail_from' => array(
'label' => __( 'Mail appears from', 'ultimate-member' ),
'value' => UM()->options()->get( 'mail_from' ),
),
- 'um-mail_from_addr' => array(
+ 'mail_from_addr' => array(
'label' => __( 'Mail appears from address', 'ultimate-member' ),
'value' => UM()->options()->get( 'mail_from_addr' ),
),
- 'um-email_html' => array(
+ 'email_html' => array(
'label' => __( 'Use HTML for Emails?', 'ultimate-member' ),
'value' => UM()->options()->get( 'email_html' ) ? $labels['yes'] : $labels['no'],
),
@@ -845,14 +1045,20 @@ class Site_Health {
$emails = UM()->config()->email_notifications;
foreach ( $emails as $key => $email ) {
+ $email_settings[ $key . '-enabled' ] = array(
+ // translators: %s is email template title.
+ 'label' => sprintf( __( 'Email "%s" Enabled', 'ultimate-member' ), $email['title'] ),
+ 'value' => UM()->options()->get( $key . '_on' ) ? $labels['yes'] : $labels['no'],
+ );
+
if ( UM()->options()->get( $key . '_on' ) ) {
- $email_settings[ 'um-' . $key ] = array(
+ $email_settings[ $key . '-subject' ] = array(
// translators: %s is email template title.
'label' => sprintf( __( '"%s" Subject', 'ultimate-member' ), $email['title'] ),
'value' => UM()->options()->get( $key . '_sub' ),
);
- $email_settings[ 'um-theme_' . $key ] = array(
+ $email_settings[ $key . '-in-theme' ] = array(
// translators: %s is email template title.
'label' => sprintf( __( 'Template "%s" in theme?', 'ultimate-member' ), $email['title'] ),
'value' => '' !== locate_template( array( 'ultimate-member/emails/' . $key . '.php' ) ) ? $labels['yes'] : $labels['no'],
@@ -860,7 +1066,17 @@ class Site_Health {
}
}
- // Appearance settings.
+ return $email_settings;
+ }
+
+ /**
+ * Retrieve debug information related to appearance settings in Ultimate Member.
+ *
+ * @return array Debug information about appearance settings, including profile template, profile photo settings, cover photo settings, and more.
+ */
+ public function appearance_settings_debug_information() {
+ $labels = self::get_labels();
+
// > Profile section.
$icons_display_options = array(
'field' => __( 'Show inside text field', 'ultimate-member' ),
@@ -878,108 +1094,134 @@ class Site_Health {
$profile_secondary_btn = UM()->options()->get( 'profile_secondary_btn' );
$profile_cover_enabled = UM()->options()->get( 'profile_cover_enabled' );
$profile_empty_text = UM()->options()->get( 'profile_empty_text' );
+ $default_avatar = UM()->options()->get( 'default_avatar' );
+ $default_cover = UM()->options()->get( 'default_cover' );
$appearance_settings = array(
- 'um-profile_template' => array(
+ 'appearance_separator' => array(
+ 'label' => __( 'Appearance > Profile', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'profile_template' => array(
'label' => __( 'Profile Default Template', 'ultimate-member' ),
// translators: %1$s - profile template name, %2$s - profile template filename
'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $profile_template_title, $profile_template_key ),
),
- 'um-profile_max_width' => array(
+ 'profile_max_width' => array(
'label' => __( 'Profile Maximum Width', 'ultimate-member' ),
'value' => UM()->options()->get( 'profile_max_width' ),
),
- 'um-profile_area_max_width' => array(
+ 'profile_area_max_width' => array(
'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ),
'value' => UM()->options()->get( 'profile_area_max_width' ),
),
- 'um-profile_icons' => array(
- 'label' => __( 'Profile Field Icons', 'ultimate-member' ),
- 'value' => $icons_display_options[ UM()->options()->get( 'profile_icons' ) ],
+ 'default_avatar' => array(
+ 'label' => __( 'Default Profile Photo', 'ultimate-member' ),
+ 'value' => ! empty( $default_avatar['url'] ) ? $default_avatar['url'] : '',
),
- 'um-profile_primary_btn_word' => array(
- 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_primary_btn_word' ),
+ 'disable_profile_photo_upload' => array(
+ 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'disable_profile_photo_upload' ) ? $labels['yes'] : $labels['no'],
),
- 'um-profile_secondary_btn' => array(
- 'label' => __( 'Profile Secondary Button', 'ultimate-member' ),
- 'value' => $profile_secondary_btn ? $labels['yes'] : $labels['no'],
+ 'profile_photosize' => array(
+ 'label' => __( 'Profile Photo Size', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_photosize' ) . 'x' . UM()->options()->get( 'profile_photosize' ) . 'px',
+ ),
+ 'default_cover' => array(
+ 'label' => __( 'Default Cover Photo', 'ultimate-member' ),
+ 'value' => ! empty( $default_cover['url'] ) ? $default_cover['url'] : '',
+ ),
+ 'profile_cover_enabled' => array(
+ 'label' => __( 'Profile Cover Photos', 'ultimate-member' ),
+ 'value' => $profile_cover_enabled ? $labels['yes'] : $labels['no'],
),
);
+
+ if ( ! empty( $profile_cover_enabled ) ) {
+ $appearance_settings['profile_coversize'] = array(
+ 'label' => __( 'Profile Cover Size', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_coversize' ) . 'px',
+ );
+ $appearance_settings['profile_cover_ratio'] = array(
+ 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_cover_ratio' ),
+ );
+ }
+
+ $appearance_settings = array_merge(
+ $appearance_settings,
+ array(
+ 'profile_show_metaicon' => array(
+ 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_show_metaicon' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'profile_show_name' => array(
+ 'label' => __( 'Show display name in profile header', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_show_name' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'profile_show_social_links' => array(
+ 'label' => __( 'Show social links in profile header', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_show_social_links' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'profile_show_bio' => array(
+ 'label' => __( 'Show user description in profile header', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_show_bio' ) ? $labels['yes'] : $labels['no'],
+ ),
+ )
+ );
+
+ if ( UM()->options()->get( 'profile_show_bio' ) ) {
+ $appearance_settings['profile_bio_maxchars'] = array(
+ 'label' => __( 'User description maximum chars', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_bio_maxchars' ),
+ );
+ }
+
+ $appearance_settings = array_merge(
+ $appearance_settings,
+ array(
+ 'profile_show_html_bio' => array(
+ 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_show_html_bio' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'profile_header_menu' => array(
+ 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ),
+ 'value' => $profile_header_menu_options[ UM()->options()->get( 'profile_header_menu' ) ],
+ ),
+ 'profile_primary_btn_word' => array(
+ 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'profile_primary_btn_word' ),
+ ),
+ 'profile_secondary_btn' => array(
+ 'label' => __( 'Profile Secondary Button', 'ultimate-member' ),
+ 'value' => $profile_secondary_btn ? $labels['yes'] : $labels['no'],
+ ),
+ )
+ );
+
if ( ! empty( $profile_secondary_btn ) ) {
- $appearance_settings['um-profile_secondary_btn_word'] = array(
+ $appearance_settings['profile_secondary_btn_word'] = array(
'label' => __( 'Profile Secondary Button Text ', 'ultimate-member' ),
'value' => UM()->options()->get( 'profile_secondary_btn_word' ),
);
}
- $default_avatar = UM()->options()->get( 'default_avatar' );
- $default_cover = UM()->options()->get( 'default_cover' );
+ $appearance_settings = array_merge(
+ $appearance_settings,
+ array(
+ 'profile_icons' => array(
+ 'label' => __( 'Profile Field Icons', 'ultimate-member' ),
+ 'value' => $icons_display_options[ UM()->options()->get( 'profile_icons' ) ],
+ ),
+ 'profile_empty_text' => array(
+ 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ),
+ 'value' => $profile_empty_text ? $labels['yes'] : $labels['no'],
+ ),
+ )
+ );
- $appearance_settings['um-default_avatar'] = array(
- 'label' => __( 'Default Profile Photo', 'ultimate-member' ),
- 'value' => ! empty( $default_avatar['url'] ) ? $default_avatar['url'] : '',
- );
- $appearance_settings['um-default_cover'] = array(
- 'label' => __( 'Default Cover Photo', 'ultimate-member' ),
- 'value' => ! empty( $default_cover['url'] ) ? $default_cover['url'] : '',
- );
- $appearance_settings['um-disable_profile_photo_upload'] = array(
- 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'disable_profile_photo_upload' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-profile_photosize'] = array(
- 'label' => __( 'Profile Photo Size', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_photosize' ) . 'x' . UM()->options()->get( 'profile_photosize' ) . 'px',
- );
- $appearance_settings['um-profile_cover_enabled'] = array(
- 'label' => __( 'Profile Cover Photos', 'ultimate-member' ),
- 'value' => $profile_cover_enabled ? $labels['yes'] : $labels['no'],
- );
- if ( ! empty( $profile_cover_enabled ) ) {
- $appearance_settings['um-profile_coversize'] = array(
- 'label' => __( 'Profile Cover Size', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_coversize' ) . 'px',
- );
- $appearance_settings['um-profile_cover_ratio'] = array(
- 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_cover_ratio' ),
- );
- }
- $appearance_settings['um-profile_show_metaicon'] = array(
- 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_show_metaicon' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-profile_show_name'] = array(
- 'label' => __( 'Show display name in profile header', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_show_name' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-profile_show_social_links'] = array(
- 'label' => __( 'Show social links in profile header', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_show_social_links' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-profile_show_bio'] = array(
- 'label' => __( 'Show user description in header', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_show_bio' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-profile_show_html_bio'] = array(
- 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_show_html_bio' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-profile_bio_maxchars'] = array(
- 'label' => __( 'User description maximum chars', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'profile_bio_maxchars' ),
- );
- $appearance_settings['um-profile_header_menu'] = array(
- 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ),
- 'value' => $profile_header_menu_options[ UM()->options()->get( 'profile_header_menu' ) ],
- );
- $appearance_settings['um-profile_empty_text'] = array(
- 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ),
- 'value' => $profile_empty_text ? $labels['yes'] : $labels['no'],
- );
if ( ! empty( $profile_empty_text ) ) {
- $appearance_settings['um-profile_empty_text_emo'] = array(
+ $appearance_settings['profile_empty_text_emo'] = array(
'label' => __( 'Show the emoticon', 'ultimate-member' ),
'value' => UM()->options()->get( 'profile_empty_text_emo' ) ? $labels['yes'] : $labels['no'],
);
@@ -988,29 +1230,17 @@ class Site_Health {
// > Profile Menu section.
$profile_menu = UM()->options()->get( 'profile_menu' );
- $appearance_settings['um-profile_menu'] = array(
+ $appearance_settings['appearance_profile_menu_separator'] = array(
+ 'label' => __( 'Appearance > Profile Menu', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ );
+
+ $appearance_settings['profile_menu'] = array(
'label' => __( 'Enable profile menu', 'ultimate-member' ),
'value' => $profile_menu ? $labels['yes'] : $labels['no'],
);
if ( ! empty( $profile_menu ) ) {
- /**
- * Filters a privacy list extend.
- *
- * @since 2.7.0
- * @hook um_profile_tabs_privacy_list
- *
- * @param {array} $privacy_option Add options for profile tabs' privacy.
- *
- * @return {array} Options for profile tabs' privacy.
- *
- * @example Add options for profile tabs' privacy.
- * function um_profile_menu_link_attrs( $privacy_option ) {
- * // your code here
- * return $privacy_option;
- * }
- * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 );
- */
$privacy_option = UM()->profile()->tabs_privacy();
$tabs = UM()->profile()->tabs();
@@ -1021,7 +1251,7 @@ class Site_Health {
$tab_enabled = UM()->options()->get( 'profile_tab_' . $id );
- $appearance_settings[ 'um-profile_tab_' . $id ] = array(
+ $appearance_settings[ 'profile_tab_' . $id ] = array(
// translators: %s Profile Tab Title
'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ),
'value' => $tab_enabled ? $labels['yes'] : $labels['no'],
@@ -1030,7 +1260,7 @@ class Site_Health {
if ( ! isset( $tab['default_privacy'] ) && ! empty( $tab_enabled ) ) {
$privacy = UM()->options()->get( 'profile_tab_' . $id . '_privacy' );
if ( is_numeric( $privacy ) ) {
- $appearance_settings[ 'um-profile_tab_' . $id . '_privacy' ] = array(
+ $appearance_settings[ 'profile_tab_' . $id . '_privacy' ] = array(
// translators: %s Profile Tab Title
'label' => sprintf( __( 'Who can see %s Tab?', 'ultimate-member' ), $tab['name'] ),
'value' => $privacy_option[ UM()->options()->get( 'profile_tab_' . $id . '_privacy' ) ],
@@ -1057,46 +1287,11 @@ class Site_Health {
*/
$appearance_settings = apply_filters( 'um_profile_tabs_site_health', $appearance_settings );
- /**
- * Filters user profile tabs
- *
- * @since 2.7.0
- * @hook um_profile_tabs
- *
- * @param {array} $tabs tabs list.
- *
- * @return {array} tabs list.
- *
- * @example Add options for profile tabs' privacy.
- * function um_profile_tabs( $tabs ) {
- * // your code here
- * return $tabs;
- * }
- * add_filter( 'um_profile_tabs', 'um_profile_tabs', 10, 1 );
- */
- $tabs_options = apply_filters(
- 'um_profile_tabs',
- array(
- 'main' => array(
- 'name' => __( 'About', 'ultimate-member' ),
- 'icon' => 'um-faicon-user',
- ),
- 'posts' => array(
- 'name' => __( 'Posts', 'ultimate-member' ),
- 'icon' => 'um-faicon-pencil',
- ),
- 'comments' => array(
- 'name' => __( 'Comments', 'ultimate-member' ),
- 'icon' => 'um-faicon-comment',
- ),
- )
- );
-
- $appearance_settings['um-profile_menu_default_tab'] = array(
+ $appearance_settings['profile_menu_default_tab'] = array(
'label' => __( 'Profile menu default tab', 'ultimate-member' ),
- 'value' => $tabs_options[ UM()->options()->get( 'profile_menu_default_tab' ) ],
+ 'value' => isset( $tabs[ UM()->options()->get( 'profile_menu_default_tab' ) ]['name'] ) ? $tabs[ UM()->options()->get( 'profile_menu_default_tab' ) ]['name'] : '',
);
- $appearance_settings['um-profile_menu_icons'] = array(
+ $appearance_settings['profile_menu_icons'] = array(
'label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ),
'value' => UM()->options()->get( 'profile_menu_icons' ) ? $labels['yes'] : $labels['no'],
);
@@ -1114,44 +1309,51 @@ class Site_Health {
'right' => __( 'Right aligned', 'ultimate-member' ),
);
- $appearance_settings['um-register_template'] = array(
- 'label' => __( 'Registration Default Template', 'ultimate-member' ),
- // translators: %1$s - register template name, %2$s - register template filename
- 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $register_template_title, $register_template_key ),
- );
- $appearance_settings['um-register_max_width'] = array(
- 'label' => __( 'Registration Maximum Width', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'register_max_width' ),
- );
- $appearance_settings['um-register_align'] = array(
- 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ),
- 'value' => $form_align_options[ UM()->options()->get( 'register_align' ) ],
- );
- $appearance_settings['um-register_icons'] = array(
- 'label' => __( 'Registration Field Icons', 'ultimate-member' ),
- 'value' => $icons_display_options[ UM()->options()->get( 'register_icons' ) ],
- );
- $appearance_settings['um-register_primary_btn_word'] = array(
- 'label' => __( 'Registration Primary Button Text ', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'register_primary_btn_word' ),
- );
- $appearance_settings['um-register_secondary_btn'] = array(
- 'label' => __( 'Registration Secondary Button', 'ultimate-member' ),
- 'value' => $register_secondary_btn ? $labels['yes'] : $labels['no'],
+ $appearance_settings = array_merge(
+ $appearance_settings,
+ array(
+ 'appearance_register_separator' => array(
+ 'label' => __( 'Appearance > Registration Form', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'register_template' => array(
+ 'label' => __( 'Registration Default Template', 'ultimate-member' ),
+ // translators: %1$s - register template name, %2$s - register template filename
+ 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $register_template_title, $register_template_key ),
+ ),
+ 'register_max_width' => array(
+ 'label' => __( 'Registration Maximum Width', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'register_max_width' ),
+ ),
+ 'register_align' => array(
+ 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ),
+ 'value' => $form_align_options[ UM()->options()->get( 'register_align' ) ],
+ ),
+ 'register_primary_btn_word' => array(
+ 'label' => __( 'Registration Primary Button Text ', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'register_primary_btn_word' ),
+ ),
+ 'register_secondary_btn' => array(
+ 'label' => __( 'Registration Secondary Button', 'ultimate-member' ),
+ 'value' => $register_secondary_btn ? $labels['yes'] : $labels['no'],
+ ),
+ )
);
+
if ( ! empty( $register_secondary_btn ) ) {
- $appearance_settings['um-register_secondary_btn_word'] = array(
+ $appearance_settings['register_secondary_btn_word'] = array(
'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ),
'value' => UM()->options()->get( 'register_secondary_btn_word' ),
);
- $appearance_settings['um-register_secondary_btn_url'] = array(
+ $appearance_settings['register_secondary_btn_url'] = array(
'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ),
'value' => UM()->options()->get( 'register_secondary_btn_url' ),
);
}
- $appearance_settings['um-register_role'] = array(
- 'label' => __( 'Registration Default Role', 'ultimate-member' ),
- 'value' => ! empty( UM()->options()->get( 'register_role' ) ) ? UM()->options()->get( 'register_role' ) : __( 'Default', 'ultimate-member' ),
+
+ $appearance_settings['register_icons'] = array(
+ 'label' => __( 'Registration Field Icons', 'ultimate-member' ),
+ 'value' => $icons_display_options[ UM()->options()->get( 'register_icons' ) ],
);
// > Login Form section.
@@ -1160,91 +1362,116 @@ class Site_Health {
$login_template_title = array_key_exists( $login_template_key, $login_templates ) ? $login_templates[ $login_template_key ] : __( 'No template name', 'ultimate-member' );
$login_secondary_btn = UM()->options()->get( 'login_secondary_btn' );
- $appearance_settings['um-login_template'] = array(
- 'label' => __( 'Login Default Template', 'ultimate-member' ),
- // translators: %1$s - login template name, %2$s - login template filename
- 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ),
- );
- $appearance_settings['um-login_max_width'] = array(
- 'label' => __( 'Login Maximum Width', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'login_max_width' ),
- );
- $appearance_settings['um-login_align'] = array(
- 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ),
- 'value' => $form_align_options[ UM()->options()->get( 'login_align' ) ],
- );
- $appearance_settings['um-login_icons'] = array(
- 'label' => __( 'Login Field Icons', 'ultimate-member' ),
- 'value' => $icons_display_options[ UM()->options()->get( 'login_icons' ) ],
- );
- $appearance_settings['um-login_primary_btn_word'] = array(
- 'label' => __( 'Login Primary Button Text', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'login_primary_btn_word' ),
- );
- $appearance_settings['um-login_secondary_btn'] = array(
- 'label' => __( 'Login Secondary Button', 'ultimate-member' ),
- 'value' => $login_secondary_btn ? $labels['yes'] : $labels['no'],
+ $appearance_settings = array_merge(
+ $appearance_settings,
+ array(
+ 'appearance_login_separator' => array(
+ 'label' => __( 'Appearance > Login Form', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'login_template' => array(
+ 'label' => __( 'Login Default Template', 'ultimate-member' ),
+ // translators: %1$s - login template name, %2$s - login template filename
+ 'value' => sprintf( __( '%1$s (filename: %2$s.php)', 'ultimate-member' ), $login_template_title, $login_template_key ),
+ ),
+ 'login_max_width' => array(
+ 'label' => __( 'Login Maximum Width', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'login_max_width' ),
+ ),
+ 'login_align' => array(
+ 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ),
+ 'value' => $form_align_options[ UM()->options()->get( 'login_align' ) ],
+ ),
+ 'login_primary_btn_word' => array(
+ 'label' => __( 'Login Primary Button Text', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'login_primary_btn_word' ),
+ ),
+ 'login_secondary_btn' => array(
+ 'label' => __( 'Login Secondary Button', 'ultimate-member' ),
+ 'value' => $login_secondary_btn ? $labels['yes'] : $labels['no'],
+ ),
+ )
);
+
if ( ! empty( $login_secondary_btn ) ) {
- $appearance_settings['um-login_secondary_btn_word'] = array(
+ $appearance_settings['login_secondary_btn_word'] = array(
'label' => __( 'Login Secondary Button Text', 'ultimate-member' ),
'value' => UM()->options()->get( 'login_secondary_btn_word' ),
);
- $appearance_settings['um-login_secondary_btn_url'] = array(
+ $appearance_settings['login_secondary_btn_url'] = array(
'label' => __( 'Login Secondary Button URL', 'ultimate-member' ),
'value' => UM()->options()->get( 'login_secondary_btn_url' ),
);
}
- $appearance_settings['um-login_forgot_pass_link'] = array(
- 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'login_forgot_pass_link' ) ? $labels['yes'] : $labels['no'],
- );
- $appearance_settings['um-login_show_rememberme'] = array(
- 'label' => __( 'Show "Remember Me"', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'login_show_rememberme' ) ? $labels['yes'] : $labels['no'],
+
+ $appearance_settings = array_merge(
+ $appearance_settings,
+ array(
+ 'login_forgot_pass_link' => array(
+ 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'login_forgot_pass_link' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'login_show_rememberme' => array(
+ 'label' => __( 'Show "Remember Me" checkbox', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'login_show_rememberme' ),
+ ),
+ 'login_icons' => array(
+ 'label' => __( 'Login Field Icons', 'ultimate-member' ),
+ 'value' => $icons_display_options[ UM()->options()->get( 'login_icons' ) ],
+ ),
+ )
);
- // Misc settings.
- $misc_settings = array(
- 'um-form_asterisk' => array(
- 'label' => __( 'Show an asterisk for required fields', 'ultimate-member' ),
+ return $appearance_settings;
+ }
+
+ /**
+ * Retrieve advanced settings debug information for Ultimate Member.
+ *
+ * @return array An array containing detailed information about various advanced settings, including labels and values.
+ */
+ public function advanced_settings_debug_information() {
+ $labels = self::get_labels();
+
+ $general = array(
+ 'advanced_separator' => array(
+ 'label' => __( 'Advanced > General', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'form_asterisk' => array(
+ 'label' => __( 'Required fields\' asterisk (Show an asterisk for required fields)', 'ultimate-member' ),
'value' => UM()->options()->get( 'form_asterisk' ) ? $labels['yes'] : $labels['no'],
),
- 'um-profile_title' => array(
- 'label' => __( 'User Profile Title', 'ultimate-member' ),
- 'value' => stripslashes( UM()->options()->get( 'profile_title' ) ),
- ),
- 'um-profile_desc' => array(
- 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ),
- 'value' => stripslashes( UM()->options()->get( 'profile_desc' ) ),
- ),
- 'um-um_profile_object_cache_stop' => array(
+ 'profile_object_cache_stop' => array(
'label' => __( 'Disable Cache User Profile', 'ultimate-member' ),
'value' => UM()->options()->get( 'um_profile_object_cache_stop' ) ? $labels['yes'] : $labels['no'],
),
- 'um-enable_blocks' => array(
+ 'uninstall_on_delete' => array(
+ 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'uninstall_on_delete' ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ $feature = array(
+ 'advanced_features_separator' => array(
+ 'label' => __( 'Advanced > Features', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'enable_blocks' => array(
'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ),
'value' => UM()->options()->get( 'enable_blocks' ) ? $labels['yes'] : $labels['no'],
),
- 'um-enable_as_email_sending' => array(
- 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'enable_as_email_sending' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-rest_api_version' => array(
- 'label' => __( 'REST API version', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'rest_api_version' ),
- ),
- 'um-disable_restriction_pre_queries' => array(
- 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'disable_restriction_pre_queries' ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-member_directory_own_table' => array(
+ 'member_directory_own_table' => array(
'label' => __( 'Enable custom table for usermeta', 'ultimate-member' ),
'value' => UM()->options()->get( 'member_directory_own_table' ) ? $labels['yes'] : $labels['no'],
),
- 'um-uninstall_on_delete' => array(
- 'label' => __( 'Remove Data on Uninstall?', 'ultimate-member' ),
- 'value' => UM()->options()->get( 'uninstall_on_delete' ) ? $labels['yes'] : $labels['no'],
+ 'enable_as_email_sending' => array(
+ 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'enable_as_email_sending' ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'disable_restriction_pre_queries' => array(
+ 'label' => __( 'Disable pre-queries for restriction content logic (advanced)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'disable_restriction_pre_queries' ) ? $labels['yes'] : $labels['no'],
),
);
@@ -1262,27 +1489,31 @@ class Site_Health {
}
$secure_settings = array(
- 'um-banned_capabilities' => array(
+ 'advanced_security_separator' => array(
+ 'label' => __( 'Advanced > Security', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'banned_capabilities' => array(
'label' => __( 'Banned Administrative Capabilities', 'ultimate-member' ),
'value' => ! empty( $banned_capabilities ) ? implode( ', ', $banned_capabilities ) : '',
),
- 'um-lock_register_forms' => array(
+ 'lock_register_forms' => array(
'label' => __( 'Lock All Register Forms', 'ultimate-member' ),
'value' => UM()->options()->get( 'lock_register_forms' ) ? $labels['yes'] : $labels['no'],
),
- 'um-display_login_form_notice' => array(
+ 'display_login_form_notice' => array(
'label' => __( 'Display Login form notice to reset passwords', 'ultimate-member' ),
'value' => UM()->options()->get( 'display_login_form_notice' ) ? $labels['yes'] : $labels['no'],
),
- 'um-secure_ban_admins_accounts' => array(
- 'label' => __( 'Enable ban for administrative capabilities', 'ultimate-member' ),
+ 'secure_ban_admins_accounts' => array(
+ 'label' => __( 'Administrative capabilities ban (enable ban for administrative capabilities)', 'ultimate-member' ),
'value' => $secure_ban_admins_accounts ? $labels['yes'] : $labels['no'],
),
);
if ( ! empty( $secure_ban_admins_accounts ) ) {
$secure_notify_admins_banned_accounts = UM()->options()->get( 'secure_notify_admins_banned_accounts' );
- $secure_settings['um-secure_notify_admins_banned_accounts'] = array(
+ $secure_settings['secure_notify_admins_banned_accounts'] = array(
'label' => __( 'Notify Administrators', 'ultimate-member' ),
'value' => $secure_notify_admins_banned_accounts ? $labels['yes'] : $labels['no'],
);
@@ -1293,7 +1524,7 @@ class Site_Health {
'daily' => __( 'Daily', 'ultimate-member' ),
);
- $secure_settings['um-secure_notify_admins_banned_accounts__interval'] = array(
+ $secure_settings['secure_notify_admins_banned_accounts__interval'] = array(
'label' => __( 'Notification Schedule', 'ultimate-member' ),
'value' => $secure_notify_admins_banned_accounts_options[ UM()->options()->get( 'secure_notify_admins_banned_accounts__interval' ) ],
);
@@ -1303,14 +1534,42 @@ class Site_Health {
$secure_allowed_redirect_hosts = UM()->options()->get( 'secure_allowed_redirect_hosts' );
$secure_allowed_redirect_hosts = explode( PHP_EOL, $secure_allowed_redirect_hosts );
- $secure_settings['um-secure_allowed_redirect_hosts'] = array(
+ $secure_settings['secure_allowed_redirect_hosts'] = array(
'label' => __( 'Allowed hosts for safe redirect', 'ultimate-member' ),
'value' => $secure_allowed_redirect_hosts,
);
+ $developers = array(
+ 'advanced_developers_separator' => array(
+ 'label' => __( 'Advanced > Developers', 'ultimate-member' ),
+ 'value' => '---------------------------------------------------------------------',
+ ),
+ 'allowed_choice_callbacks' => array(
+ 'label' => __( 'Allowed Choice Callbacks', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'allowed_choice_callbacks' ),
+ ),
+ 'rest_api_version' => array(
+ 'label' => __( 'REST API version', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'rest_api_version' ),
+ ),
+ 'allow_url_redirect_confirm' => array(
+ 'label' => __( 'Allow external link redirect confirm (enable JS.confirm for external links)', 'ultimate-member' ),
+ 'value' => UM()->options()->get( 'allow_url_redirect_confirm' ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ return array_merge( $general, $feature, $secure_settings, $developers );
+ }
+
+ /**
+ * Retrieve license settings debug information for Ultimate Member.
+ *
+ * @return array License settings for Site Health, including label and value.
+ */
+ public function license_settings_debug_information() {
// Licenses settings.
$license_settings = array(
- 'um-licenses' => array(
+ 'licenses' => array(
'label' => __( 'Licenses', 'ultimate-member' ),
'value' => array(),
),
@@ -1333,17 +1592,28 @@ class Site_Health {
* }
* add_filter( 'um_licenses_site_health', 'um_licenses_site_health', 10, 1 );
*/
- $license_settings = apply_filters( 'um_licenses_site_health', $license_settings );
+ return apply_filters( 'um_licenses_site_health', $license_settings );
+ }
- $info['ultimate-member']['fields'] = array_merge( $info['ultimate-member']['fields'], $pages_settings, $user_settings, $account_settings, $uploads_settings, $restrict_settings, $access_other_settings, $email_settings, $appearance_settings, $misc_settings, $secure_settings, $license_settings );
+ /**
+ * Retrieve information about roles and role settings in the site health check.
+ *
+ * @param array $info The existing site health information array.
+ *
+ * @return array Updated site health information including user roles and their settings.
+ */
+ public function roles_debug_information( $info ) {
+ $labels = self::get_labels();
+
+ $all_roles = UM()->roles()->get_roles();
// User roles settings
$roles_array = array();
- foreach ( $this->get_roles() as $key => $role ) {
- if ( strpos( $key, 'um_' ) === 0 ) {
- $key = substr( $key, 3 );
+ foreach ( $all_roles as $slug => $role ) {
+ if ( strpos( $slug, 'um_' ) === 0 ) {
+ $slug = substr( $slug, 3 );
}
- $rolemeta = $this->get_role_meta( $key );
+ $rolemeta = $this->get_role_meta( $slug );
if ( false === $rolemeta ) {
continue;
}
@@ -1356,69 +1626,56 @@ class Site_Health {
}
$info['ultimate-member-user-roles'] = array(
- 'label' => __( 'User roles', 'ultimate-member' ),
+ 'label' => __( 'Ultimate Member User Roles', 'ultimate-member' ),
'description' => __( 'This debug information about user roles.', 'ultimate-member' ),
'fields' => array(
- 'um-roles' => array(
+ 'roles' => array(
'label' => __( 'User Roles (priority)', 'ultimate-member' ),
'value' => implode( ', ', $roles_array ),
),
- 'um-register_role' => array(
+ 'register_role' => array(
'label' => __( 'WordPress Default New User Role', 'ultimate-member' ),
- 'value' => get_option( 'default_role' ),
+ 'value' => $all_roles[ get_option( 'default_role' ) ],
),
),
);
- foreach ( $this->get_roles() as $key => $role ) {
- if ( strpos( $key, 'um_' ) === 0 ) {
- $key = substr( $key, 3 );
+ foreach ( $all_roles as $slug => $role ) {
+ if ( strpos( $slug, 'um_' ) === 0 ) {
+ $slug = substr( $slug, 3 );
}
- $rolemeta = $this->get_role_meta( $key );
+ $rolemeta = $this->get_role_meta( $slug );
if ( false === $rolemeta ) {
continue;
}
- $info[ 'ultimate-member-' . $key ] = array(
- 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ),
- 'description' => __( 'This debug information about user role.', 'ultimate-member' ),
- 'fields' => array(),
- );
+ $debug_info = array();
if ( array_key_exists( '_um_can_access_wpadmin', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_access_wpadmin' => array(
- 'label' => __( 'Can access wp-admin?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_access_wpadmin' => array(
+ 'label' => __( 'Can access wp-admin?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_access_wpadmin'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
if ( array_key_exists( '_um_can_not_see_adminbar', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_not_see_adminbar' => array(
- 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_not_see_adminbar' => array(
+ 'label' => __( 'Force hiding adminbar in frontend?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_not_see_adminbar'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
if ( array_key_exists( '_um_can_edit_everyone', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_edit_everyone' => array(
- 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_edit_everyone' => array(
+ 'label' => __( 'Can edit other member accounts?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_edit_everyone'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
@@ -1433,26 +1690,20 @@ class Site_Health {
}
}
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_edit_roles' => array(
- 'label' => __( 'Can edit these user roles only', 'ultimate-member' ),
- 'value' => ! empty( $can_edit_roles ) ? implode( ', ', $can_edit_roles ) : $labels['all'],
- ),
- )
+ $debug_info[] = array(
+ 'can_edit_roles' => array(
+ 'label' => __( 'Can edit these user roles only', 'ultimate-member' ),
+ 'value' => ! empty( $can_edit_roles ) ? implode( ', ', $can_edit_roles ) : $labels['all'],
+ ),
);
}
if ( array_key_exists( '_um_can_delete_everyone', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_delete_everyone' => array(
- 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_delete_everyone' => array(
+ 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_delete_everyone'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
@@ -1467,50 +1718,38 @@ class Site_Health {
}
}
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_delete_roles' => array(
- 'label' => __( 'Can delete these user roles only', 'ultimate-member' ),
- 'value' => ! empty( $can_delete_roles ) ? implode( ', ', $can_delete_roles ) : $labels['all'],
- ),
- )
+ $debug_info[] = array(
+ 'can_delete_roles' => array(
+ 'label' => __( 'Can delete these user roles only', 'ultimate-member' ),
+ 'value' => ! empty( $can_delete_roles ) ? implode( ', ', $can_delete_roles ) : $labels['all'],
+ ),
);
}
if ( array_key_exists( '_um_can_edit_profile', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_edit_profile' => array(
- 'label' => __( 'Can edit their profile?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_edit_profile' => array(
+ 'label' => __( 'Can edit their profile?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_edit_profile'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
if ( array_key_exists( '_um_can_delete_profile', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_delete_profile' => array(
- 'label' => __( 'Can delete their account?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_delete_profile' => array(
+ 'label' => __( 'Can delete their account?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_delete_profile'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
if ( array_key_exists( '_um_can_view_all', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_view_all' => array(
- 'label' => __( 'Can view other member profiles?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'can_view_all' => array(
+ 'label' => __( 'Can view other member profiles?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_view_all'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
@@ -1525,14 +1764,29 @@ class Site_Health {
}
}
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_view_roles' => array(
- 'label' => __( 'Can view these user roles only', 'ultimate-member' ),
- 'value' => ! empty( $can_view_roles ) ? implode( ', ', $can_view_roles ) : $labels['all'],
- ),
- )
+ $debug_info[] = array(
+ 'can_view_roles' => array(
+ 'label' => __( 'Can view these user roles only', 'ultimate-member' ),
+ 'value' => ! empty( $can_view_roles ) ? implode( ', ', $can_view_roles ) : $labels['all'],
+ ),
+ );
+ }
+
+ if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) {
+ $debug_info[] = array(
+ 'can_make_private_profile' => array(
+ 'label' => __( 'Can make their profile private?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'],
+ ),
+ );
+ }
+
+ if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) {
+ $debug_info[] = array(
+ 'can_access_private_profile' => array(
+ 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
@@ -1547,53 +1801,23 @@ class Site_Health {
$default_homepage = __( 'No such option', 'ultimate-member' );
}
- if ( array_key_exists( '_um_can_make_private_profile', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_make_private_profile' => array(
- 'label' => __( 'Can make their profile private?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_make_private_profile'] ? $labels['yes'] : $labels['no'],
- ),
- )
- );
- }
-
- if ( array_key_exists( '_um_can_access_private_profile', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-can_access_private_profile' => array(
- 'label' => __( 'Can view/access private profiles?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_can_access_private_profile'] ? $labels['yes'] : $labels['no'],
- ),
- )
- );
- }
-
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-profile_noindex' => array(
- 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
- 'value' => $profile_noindex,
- ),
- 'um-default_homepage' => array(
- 'label' => __( 'Can view default homepage?', 'ultimate-member' ),
- 'value' => $default_homepage,
- ),
- )
+ $debug_info[] = array(
+ 'profile_noindex' => array(
+ 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ),
+ 'value' => $profile_noindex,
+ ),
+ 'default_homepage' => array(
+ 'label' => __( 'Can view default homepage?', 'ultimate-member' ),
+ 'value' => $default_homepage,
+ ),
);
if ( isset( $rolemeta['_um_default_homepage'] ) && 0 === absint( $rolemeta['_um_default_homepage'] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-redirect_homepage' => array(
- 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ),
- 'value' => $rolemeta['_um_redirect_homepage'],
- ),
- )
+ $debug_info[] = array(
+ 'redirect_homepage' => array(
+ 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_redirect_homepage'],
+ ),
);
}
@@ -1604,14 +1828,11 @@ class Site_Health {
);
if ( array_key_exists( '_um_status', $rolemeta ) && isset( $status_options[ $rolemeta['_um_status'] ] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-status' => array(
- 'label' => __( 'Registration Status', 'ultimate-member' ),
- 'value' => $status_options[ $rolemeta['_um_status'] ],
- ),
- )
+ $debug_info[] = array(
+ 'status' => array(
+ 'label' => __( 'Registration Status', 'ultimate-member' ),
+ 'value' => $status_options[ $rolemeta['_um_status'] ],
+ ),
);
}
@@ -1622,141 +1843,103 @@ class Site_Health {
);
if ( isset( $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-auto_approve_act' => array(
- 'label' => __( 'Custom Homepage Redirect', 'ultimate-member' ),
- 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ],
- ),
- )
+ $debug_info[] = array(
+ 'auto_approve_act' => array(
+ 'label' => __( 'Auto-approve action', 'ultimate-member' ),
+ 'value' => $auto_approve_act[ $rolemeta['_um_auto_approve_act'] ],
+ ),
);
}
if ( 'redirect_url' === $rolemeta['_um_auto_approve_act'] && array_key_exists( '_um_auto_approve_url', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-auto_approve_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => $rolemeta['_um_auto_approve_url'],
- ),
- )
+ $debug_info[] = array(
+ 'auto_approve_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_auto_approve_url'],
+ ),
);
}
- }
-
- if ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) {
+ } elseif ( array_key_exists( '_um_status', $rolemeta ) && 'checkmail' === $rolemeta['_um_status'] ) {
$checkmail_action = array(
'show_message' => __( 'Show custom message', 'ultimate-member' ),
'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
);
if ( array_key_exists( '_um_login_email_activate', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-login_email_activate' => array(
- 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ),
- 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'login_email_activate' => array(
+ 'label' => __( 'Login user after validating the activation link?', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_login_email_activate'] ? $labels['yes'] : $labels['no'],
+ ),
);
}
if ( isset( $checkmail_action[ $rolemeta['_um_checkmail_action'] ] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-checkmail_action' => array(
- 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
- 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ],
- ),
- )
+ $debug_info[] = array(
+ 'checkmail_action' => array(
+ 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
+ 'value' => $checkmail_action[ $rolemeta['_um_checkmail_action'] ],
+ ),
);
}
if ( 'show_message' === $rolemeta['_um_checkmail_action'] ) {
if ( array_key_exists( '_um_checkmail_message', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-checkmail_message' => array(
- 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
- 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ),
- ),
- )
- );
- }
- } else {
- if ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-checkmail_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => $rolemeta['_um_checkmail_url'],
- ),
- )
+ $debug_info[] = array(
+ 'checkmail_message' => array(
+ 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
+ 'value' => stripslashes( $rolemeta['_um_checkmail_message'] ),
+ ),
);
}
+ } elseif ( array_key_exists( '_um_checkmail_url', $rolemeta ) ) {
+ $debug_info[] = array(
+ 'checkmail_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_checkmail_url'],
+ ),
+ );
}
if ( array_key_exists( '_um_url_email_activate', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-url_email_activate' => array(
- 'label' => __( 'URL redirect after email activation', 'ultimate-member' ),
- 'value' => $rolemeta['_um_url_email_activate'],
- ),
- )
+ $debug_info[] = array(
+ 'url_email_activate' => array(
+ 'label' => __( 'URL redirect after email activation', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_url_email_activate'],
+ ),
);
}
- }
-
- if ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) {
+ } elseif ( array_key_exists( '_um_status', $rolemeta ) && 'pending' === $rolemeta['_um_status'] ) {
$pending_action = array(
'show_message' => __( 'Show custom message', 'ultimate-member' ),
'redirect_url' => __( 'Redirect to URL', 'ultimate-member' ),
);
if ( array_key_exists( '_um_pending_action', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-pending_action' => array(
- 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
- 'value' => $pending_action[ $rolemeta['_um_pending_action'] ],
- ),
- )
+ $debug_info[] = array(
+ 'pending_action' => array(
+ 'label' => __( 'Action to be taken after registration', 'ultimate-member' ),
+ 'value' => $pending_action[ $rolemeta['_um_pending_action'] ],
+ ),
);
}
if ( 'show_message' === $rolemeta['_um_pending_action'] ) {
if ( array_key_exists( '_um_pending_message', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-pending_message' => array(
- 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
- 'value' => stripslashes( $rolemeta['_um_pending_message'] ),
- ),
- )
- );
- }
- } else {
- if ( array_key_exists( '_um_pending_url', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-pending_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => $rolemeta['_um_pending_url'],
- ),
- )
+ $debug_info[] = array(
+ 'pending_message' => array(
+ 'label' => __( 'Personalize the custom message', 'ultimate-member' ),
+ 'value' => stripslashes( $rolemeta['_um_pending_message'] ),
+ ),
);
}
+ } elseif ( array_key_exists( '_um_pending_url', $rolemeta ) ) {
+ $debug_info[] = array(
+ 'pending_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_pending_url'],
+ ),
+ );
}
}
@@ -1768,25 +1951,19 @@ class Site_Health {
);
if ( array_key_exists( '_um_after_login', $rolemeta ) && isset( $after_login_options[ $rolemeta['_um_after_login'] ] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-after_login' => array(
- 'label' => __( 'Action to be taken after login', 'ultimate-member' ),
- 'value' => $after_login_options[ $rolemeta['_um_after_login'] ],
- ),
- )
+ $debug_info[] = array(
+ 'after_login' => array(
+ 'label' => __( 'Action to be taken after login', 'ultimate-member' ),
+ 'value' => $after_login_options[ $rolemeta['_um_after_login'] ],
+ ),
);
if ( 'redirect_url' === $rolemeta['_um_after_login'] && array_key_exists( '_um_login_redirect_url', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-login_redirect_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => $rolemeta['_um_login_redirect_url'],
- ),
- )
+ $debug_info[] = array(
+ 'login_redirect_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_login_redirect_url'],
+ ),
);
}
}
@@ -1799,25 +1976,19 @@ class Site_Health {
$rolemeta['_um_after_logout'] = 'redirect_home';
}
if ( array_key_exists( '_um_after_logout', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_logout'] ] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-after_logout' => array(
- 'label' => __( 'Action to be taken after logout', 'ultimate-member' ),
- 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ],
- ),
- )
+ $debug_info[] = array(
+ 'after_logout' => array(
+ 'label' => __( 'Action to be taken after logout', 'ultimate-member' ),
+ 'value' => $redirect_options[ $rolemeta['_um_after_logout'] ],
+ ),
);
if ( 'redirect_url' === $rolemeta['_um_after_logout'] && array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-logout_redirect_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => $rolemeta['_um_logout_redirect_url'],
- ),
- )
+ $debug_info[] = array(
+ 'logout_redirect_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_logout_redirect_url'],
+ ),
);
}
}
@@ -1826,144 +1997,203 @@ class Site_Health {
$rolemeta['_um_after_delete'] = 'redirect_home';
}
if ( array_key_exists( '_um_after_delete', $rolemeta ) && isset( $redirect_options[ $rolemeta['_um_after_delete'] ] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-after_delete' => array(
- 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ),
- 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ],
- ),
- )
+ $debug_info[] = array(
+ 'after_delete' => array(
+ 'label' => __( 'Action to be taken after account is deleted', 'ultimate-member' ),
+ 'value' => $redirect_options[ $rolemeta['_um_after_delete'] ],
+ ),
);
if ( 'redirect_url' === $rolemeta['_um_after_delete'] && array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-delete_redirect_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => $rolemeta['_um_delete_redirect_url'],
- ),
- )
+ $debug_info[] = array(
+ 'delete_redirect_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => $rolemeta['_um_delete_redirect_url'],
+ ),
);
}
}
if ( ! empty( $rolemeta['wp_capabilities'] ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-wp_capabilities' => array(
- 'label' => __( 'WP Capabilities', 'ultimate-member' ),
- 'value' => $rolemeta['wp_capabilities'],
- ),
- )
+ $debug_info[] = array(
+ 'wp_capabilities' => array(
+ 'label' => __( 'WP Capabilities', 'ultimate-member' ),
+ 'value' => $rolemeta['wp_capabilities'],
+ ),
);
}
- $info = apply_filters( 'um_debug_information_user_role', $info, $key );
+ /**
+ * Filters user role settings for Site Health.
+ *
+ * @since 2.10.5
+ * @hook um_debug_information_user_role
+ *
+ * @param {array} $debug_info User Role settings for Site Health.
+ * @param {array} $rolemeta User Role metadata.
+ * @param {string} $slug User Role slug.
+ *
+ * @return {array} User Role settings for Site Health.
+ *
+ * @example Extend User Role settings for Site Health.
+ * function um_debug_information_user_role( $debug_info, $rolemeta, $slug ) {
+ * // your code here
+ * return $debug_info;
+ * }
+ * add_filter( 'um_debug_information_user_role', 'um_debug_information_user_role', 10, 3 );
+ */
+ $debug_info = apply_filters( 'um_debug_information_user_role', $debug_info, $rolemeta, $slug );
+
+ $debug_info = array_merge( ...$debug_info );
+
+ $info[ 'ultimate-member-role-' . $slug ] = array(
+ 'label' => ' - ' . $role . __( ' role settings', 'ultimate-member' ),
+ 'description' => __( 'This debug information about user role.', 'ultimate-member' ),
+ 'fields' => $debug_info,
+ );
}
- // Forms settings
- if ( ! empty( $this->get_forms() ) ) {
- $info['ultimate-member-forms'] = array(
- 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ),
- 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ),
- 'fields' => array(
- 'um-forms' => array(
- 'label' => __( 'UM Forms', 'ultimate-member' ),
- 'value' => $this->get_forms(),
- ),
+ return $info;
+ }
+
+ /**
+ * Retrieve debug information about Ultimate Member forms.
+ *
+ * @param array $info Information array containing debug information.
+ *
+ * @return array Information about Ultimate Member forms including form IDs, titles, settings, and labels.
+ */
+ public function forms_debug_information( $info ) {
+ $all_forms = get_posts(
+ array(
+ 'post_type' => 'um_form',
+ 'posts_per_page' => -1,
+ 'fields' => 'ids',
+ )
+ );
+
+ $forms_formatted = array();
+ if ( ! empty( $all_forms ) ) {
+ foreach ( $all_forms as $form_id ) {
+ $forms_formatted[ 'ID#' . $form_id ] = get_the_title( $form_id );
+ }
+ }
+
+ $info['ultimate-member-forms'] = array(
+ 'label' => __( 'Ultimate Member Forms', 'ultimate-member' ),
+ 'description' => __( 'This debug information for your Ultimate Member forms.', 'ultimate-member' ),
+ 'fields' => array(
+ 'forms' => array(
+ 'label' => __( 'UM Forms', 'ultimate-member' ),
+ 'value' => ! empty( $forms_formatted ) ? $forms_formatted : __( 'No Ultimate Member Forms', 'ultimate-member' ),
),
+ ),
+ );
+
+ if ( ! empty( $all_forms ) ) {
+ $labels = self::get_labels();
+
+ $icons_display_options = array(
+ 'field' => __( 'Show inside text field', 'ultimate-member' ),
+ 'label' => __( 'Show with label', 'ultimate-member' ),
+ 'off' => __( 'Turn off', 'ultimate-member' ),
);
- foreach ( $this->get_forms() as $key => $form ) {
- if ( strpos( $key, 'ID#' ) === 0 ) {
- $key = substr( $key, 3 );
- }
-
- $info[ 'ultimate-member-' . $key ] = array(
- 'label' => ' - ' . $form . __( ' form settings', 'ultimate-member' ),
- 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ),
- 'fields' => array(
- 'um-form-shortcode' => array(
+ foreach ( $all_forms as $form_id ) {
+ $form_mode = get_post_meta( $form_id, '_um_mode', true );
+ $debug_info = array(
+ array(
+ 'form-shortcode' => array(
'label' => __( 'Shortcode', 'ultimate-member' ),
- 'value' => '[ultimatemember form_id="' . $key . '"]',
+ 'value' => '[ultimatemember form_id="' . $form_id . '"]',
),
- 'um-mode' => array(
+ 'mode' => array(
'label' => __( 'Type', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_mode', true ),
+ 'value' => $form_mode,
),
),
);
- if ( 'register' === get_post_meta( $key, '_um_mode', true ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-register_role' => array(
- 'label' => __( 'User registration role', 'ultimate-member' ),
- 'value' => 0 === absint( get_post_meta( $key, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_role', true ),
- ),
- 'um-register_template' => array(
- 'label' => __( 'Template', 'ultimate-member' ),
- 'value' => 0 === absint( get_post_meta( $key, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_register_template', true ),
- ),
- 'um-register_primary_btn_word' => array(
- 'label' => __( 'Primary Button Text', 'ultimate-member' ),
- 'value' => ! get_post_meta( $key, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_register_primary_btn_word', true ),
- ),
- 'um-register_use_gdpr' => array(
- 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
+ if ( 'register' === $form_mode ) {
+ $debug_info[] = array(
+ 'use_custom_settings' => array(
+ 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_use_custom_settings', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
- if ( 1 === absint( get_post_meta( $key, '_um_register_use_gdpr', true ) ) ) {
- $gdpr_content_id = get_post_meta( $key, '_um_register_use_gdpr_content_id', true );
-
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-register_use_gdpr_content_id' => array(
- 'label' => __( 'Privacy policy content', 'ultimate-member' ),
- 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . '(' . $gdpr_content_id . ')' . get_the_permalink( $gdpr_content_id ) : '',
- ),
- 'um-register_use_gdpr_toggle_show' => array(
- 'label' => __( 'Toggle Show text', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_show', true ),
- ),
- 'um-register_use_gdpr_toggle_hide' => array(
- 'label' => __( 'Toggle Hide text', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_register_use_gdpr_toggle_hide', true ),
- ),
- 'um-register_use_gdpr_agreement' => array(
- 'label' => __( 'Checkbox agreement description', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_register_use_gdpr_agreement', true ),
- ),
- 'um-register_use_gdpr_error_text' => array(
- 'label' => __( 'Error Text', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_register_use_gdpr_error_text', true ),
- ),
- )
+ if ( get_post_meta( $form_id, '_um_register_use_custom_settings', true ) ) {
+ $debug_info[] = array(
+ 'role' => array(
+ 'label' => __( 'User registration role', 'ultimate-member' ),
+ 'value' => 0 === absint( get_post_meta( $form_id, '_um_register_role', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_register_role', true ),
+ ),
+ 'template' => array(
+ 'label' => __( 'Template', 'ultimate-member' ),
+ 'value' => 0 === absint( get_post_meta( $form_id, '_um_register_template', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_register_template', true ),
+ ),
+ 'max_width' => array(
+ 'label' => __( 'Max. Width (px)', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_max_width', true ),
+ ),
+ 'icons' => array(
+ 'label' => __( 'Field Icons', 'ultimate-member' ),
+ 'value' => $icons_display_options[ get_post_meta( $form_id, '_um_register_icons', true ) ],
+ ),
+ 'primary_btn_word' => array(
+ 'label' => __( 'Primary Button Text', 'ultimate-member' ),
+ 'value' => ! get_post_meta( $form_id, '_um_register_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $form_id, '_um_register_primary_btn_word', true ),
+ ),
+ 'secondary_btn' => array(
+ 'label' => __( 'Show Secondary Button', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_secondary_btn', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
- }
- $info = apply_filters( 'um_debug_information_register_form', $info, $key );
-
- $fields = get_post_meta( $key, '_um_custom_fields', true );
- if ( ! empty( $fields ) && is_array( $fields ) ) {
- foreach ( $fields as $field_key => $field ) {
- $field_info = $this->get_field_data( $info, $key, $field_key, $field );
-
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- $field_info
+ if ( get_post_meta( $form_id, '_um_register_secondary_btn', true ) ) {
+ $debug_info[] = array(
+ 'secondary_btn_word' => array(
+ 'label' => __( 'Secondary Button Text', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_secondary_btn_word', true ),
+ ),
);
}
}
- } elseif ( 'login' === get_post_meta( $key, '_um_mode', true ) ) {
+
+ $debug_info[] = array(
+ 'use_gdpr' => array(
+ 'label' => __( 'Enable privacy policy agreement', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_use_gdpr', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( get_post_meta( $form_id, '_um_register_use_gdpr', true ) ) {
+ $gdpr_content_id = get_post_meta( $form_id, '_um_register_use_gdpr_content_id', true );
+
+ $debug_info[] = array(
+ 'use_gdpr_content_id' => array(
+ 'label' => __( 'Privacy policy content', 'ultimate-member' ),
+ 'value' => $gdpr_content_id ? get_the_title( $gdpr_content_id ) . ' (ID#' . $gdpr_content_id . ') ' . get_the_permalink( $gdpr_content_id ) : '',
+ ),
+ 'use_gdpr_toggle_show' => array(
+ 'label' => __( 'Toggle Show text', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_toggle_show', true ),
+ ),
+ 'use_gdpr_toggle_hide' => array(
+ 'label' => __( 'Toggle Hide text', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_toggle_hide', true ),
+ ),
+ 'use_gdpr_agreement' => array(
+ 'label' => __( 'Checkbox agreement description', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_agreement', true ),
+ ),
+ 'use_gdpr_error_text' => array(
+ 'label' => __( 'Error Text', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_register_use_gdpr_error_text', true ),
+ ),
+ );
+ }
+ } elseif ( 'login' === $form_mode ) {
$login_redirect_options = array(
'0' => __( 'Default', 'ultimate-member' ),
'redirect_profile' => __( 'Redirect to profile', 'ultimate-member' ),
@@ -1972,234 +2202,302 @@ class Site_Health {
'redirect_admin' => __( 'Redirect to WordPress Admin', 'ultimate-member' ),
);
- $login_after_login = get_post_meta( $key, '_um_login_after_login', true );
+ $login_after_login = get_post_meta( $form_id, '_um_login_after_login', true );
$login_after_login = '' === $login_after_login ? '0' : $login_after_login;
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-login_template' => array(
+ $debug_info[] = array(
+ 'use_custom_settings' => array(
+ 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_login_use_custom_settings', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( get_post_meta( $form_id, '_um_login_use_custom_settings', true ) ) {
+ $debug_info[] = array(
+ 'template' => array(
'label' => __( 'Template', 'ultimate-member' ),
- 'value' => 0 === absint( get_post_meta( $key, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_login_template', true ),
+ 'value' => 0 === absint( get_post_meta( $form_id, '_um_login_template', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_login_template', true ),
),
- 'um-login_primary_btn_word' => array(
+ 'max_width' => array(
+ 'label' => __( 'Max. Width (px)', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_login_max_width', true ),
+ ),
+ 'icons' => array(
+ 'label' => __( 'Field Icons', 'ultimate-member' ),
+ 'value' => $icons_display_options[ get_post_meta( $form_id, '_um_login_icons', true ) ],
+ ),
+ 'primary_btn_word' => array(
'label' => __( 'Primary Button Text', 'ultimate-member' ),
- 'value' => ! get_post_meta( $key, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_login_primary_btn_word', true ),
+ 'value' => ! get_post_meta( $form_id, '_um_login_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $form_id, '_um_login_primary_btn_word', true ),
),
- 'um-login_forgot_pass_link' => array(
+ 'secondary_btn' => array(
+ 'label' => __( 'Show Secondary Button', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_login_secondary_btn', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( get_post_meta( $form_id, '_um_login_secondary_btn', true ) ) {
+ $debug_info[] = array(
+ 'secondary_btn_word' => array(
+ 'label' => __( 'Secondary Button Text', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_login_secondary_btn_word', true ),
+ ),
+ );
+ }
+
+ $debug_info[] = array(
+ 'forgot_pass_link' => array(
'label' => __( 'Show Forgot Password Link?', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'],
+ 'value' => get_post_meta( $form_id, '_um_login_forgot_pass_link', true ) ? $labels['yes'] : $labels['no'],
),
- 'um-login_show_rememberme' => array(
+ 'show_rememberme' => array(
'label' => __( 'Show "Remember Me"?', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'],
+ 'value' => get_post_meta( $form_id, '_um_login_show_rememberme', true ) ? $labels['yes'] : $labels['no'],
),
- 'um-login_after_login' => array(
- 'label' => __( 'Redirection after Login', 'ultimate-member' ),
- 'value' => $login_redirect_options[ $login_after_login ],
- ),
- )
- );
-
- if ( 'redirect_url' === get_post_meta( $key, '_um_login_after_login', true ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-login_redirect_url' => array(
- 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_login_redirect_url', true ),
- ),
- )
);
}
- $info = apply_filters( 'um_debug_information_login_form', $info, $key );
+ $debug_info[] = array(
+ 'after_login' => array(
+ 'label' => __( 'Redirection after Login', 'ultimate-member' ),
+ 'value' => $login_redirect_options[ $login_after_login ],
+ ),
+ );
- $fields = get_post_meta( $key, '_um_custom_fields', true );
- if ( ! empty( $fields ) && is_array( $fields ) ) {
- foreach ( $fields as $field_key => $field ) {
- $field_info = $this->get_field_data( $info, $key, $field_key, $field );
-
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- $field_info
- );
- }
+ if ( 'redirect_url' === get_post_meta( $form_id, '_um_login_after_login', true ) ) {
+ $debug_info[] = array(
+ 'redirect_url' => array(
+ 'label' => __( 'Set Custom Redirect URL', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_login_redirect_url', true ),
+ ),
+ );
}
- } elseif ( 'profile' === get_post_meta( $key, '_um_mode', true ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-profile_role' => array(
+ } elseif ( 'profile' === $form_mode ) {
+ $debug_info[] = array(
+ 'use_custom_settings' => array(
+ 'label' => __( 'Apply custom settings to this form', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_use_custom_settings', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( get_post_meta( $form_id, '_um_profile_use_custom_settings', true ) ) {
+ $debug_info[] = array(
+ 'role' => array(
'label' => __( 'Make this profile form role-specific', 'ultimate-member' ),
- 'value' => ! empty( get_post_meta( $key, '_um_profile_role', true ) ) ? get_post_meta( $key, '_um_profile_role', true ) : $labels['all'],
+ 'value' => ! empty( get_post_meta( $form_id, '_um_profile_role', true ) ) ? get_post_meta( $form_id, '_um_profile_role', true ) : $labels['all'],
),
- 'um-profile_template' => array(
+ 'template' => array(
'label' => __( 'Template', 'ultimate-member' ),
- 'value' => 0 === absint( get_post_meta( $key, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $key, '_um_profile_template', true ),
+ 'value' => 0 === absint( get_post_meta( $form_id, '_um_profile_template', true ) ) ? $labels['default'] : get_post_meta( $form_id, '_um_profile_template', true ),
),
- 'um-profile_primary_btn_word' => array(
+ 'max_width' => array(
+ 'label' => __( 'Max. Width (px)', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_max_width', true ),
+ ),
+ 'area_max_width' => array(
+ 'label' => __( 'Profile Area Max. Width (px)', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_area_max_width', true ),
+ ),
+ 'icons' => array(
+ 'label' => __( 'Field Icons', 'ultimate-member' ),
+ 'value' => $icons_display_options[ get_post_meta( $form_id, '_um_profile_icons', true ) ],
+ ),
+ 'primary_btn_word' => array(
'label' => __( 'Primary Button Text', 'ultimate-member' ),
- 'value' => ! get_post_meta( $key, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $key, '_um_profile_primary_btn_word', true ),
+ 'value' => ! get_post_meta( $form_id, '_um_profile_primary_btn_word', true ) ? $labels['default'] : get_post_meta( $form_id, '_um_profile_primary_btn_word', true ),
),
- 'um-profile_cover_enabled' => array(
- 'label' => __( 'Enable Cover Photos', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'],
+ 'secondary_btn' => array(
+ 'label' => __( 'Show Secondary Button', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_secondary_btn', true ) ? $labels['yes'] : $labels['no'],
),
- 'um-profile_disable_photo_upload' => array(
- 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
- );
+ );
- if ( 0 === absint( get_post_meta( $key, '_um_profile_disable_photo_upload', true ) ) ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-profile_photo_required' => array(
- 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'],
+ if ( get_post_meta( $form_id, '_um_profile_secondary_btn', true ) ) {
+ $debug_info[] = array(
+ 'secondary_btn_word' => array(
+ 'label' => __( 'Secondary Button Text', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_secondary_btn_word', true ),
),
- )
+ );
+ }
+
+ $debug_info[] = array(
+ 'cover_enabled' => array(
+ 'label' => __( 'Enable Cover Photos', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_cover_enabled', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( get_post_meta( $form_id, '_um_profile_cover_enabled', true ) ) {
+ $debug_info[] = array(
+ 'coversize' => array(
+ 'label' => __( 'Cover Photo Size', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_coversize', true ),
+ ),
+ 'cover_ratio' => array(
+ 'label' => __( 'Cover photo ratio', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_cover_ratio', true ),
+ ),
+ );
+ }
+
+ $debug_info[] = array(
+ 'disable_photo_upload' => array(
+ 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_disable_photo_upload', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( 0 === absint( get_post_meta( $form_id, '_um_profile_disable_photo_upload', true ) ) ) {
+ $debug_info[] = array(
+ 'photosize' => array(
+ 'label' => __( 'Profile Photo Size', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_photosize', true ),
+ ),
+ 'photo_required' => array(
+ 'label' => __( 'Make Profile Photo Required', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_photo_required', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+ }
+
+ $debug_info[] = array(
+ 'show_name' => array(
+ 'label' => __( 'Show display name in profile header?', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'show_social_links' => array(
+ 'label' => __( 'Show social links in profile header?', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'show_bio' => array(
+ 'label' => __( 'Show user description in profile header?', 'ultimate-member' ),
+ 'value' => get_post_meta( $form_id, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
}
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-profile_show_name' => array(
- 'label' => __( 'Show display name in profile header?', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_show_name', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-profile_show_social_links' => array(
- 'label' => __( 'Show social links in profile header?', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_show_social_links', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-profile_show_bio' => array(
- 'label' => __( 'Show user description in profile header?', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_show_bio', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
- );
-
- $fields = get_post_meta( $key, '_um_custom_fields', true );
- if ( ! empty( $fields ) && is_array( $fields ) ) {
- foreach ( $fields as $field_key => $field ) {
- $field_info = $this->get_field_data( $info, $key, $field_key, $field );
-
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- $field_info
- );
- }
- }
-
- $profile_metafields = get_post_meta( $key, '_um_profile_metafields', true );
+ $profile_metafields = get_post_meta( $form_id, '_um_profile_metafields', true );
if ( ! empty( $profile_metafields ) && is_array( $profile_metafields ) ) {
- foreach ( $profile_metafields as $k => $field ) {
- $info[ 'ultimate-member-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-' . $key ]['fields'],
- array(
- 'um-profile_metafields-' . $k => array(
- 'label' => __( 'Field to show in user meta', 'ultimate-member' ),
- 'value' => $field,
- ),
- )
- );
- }
+ $debug_info[] = array(
+ 'metafields-' . $form_id => array(
+ 'label' => __( 'Field(s) to show in user meta', 'ultimate-member' ),
+ 'value' => implode( ', ', $profile_metafields ),
+ ),
+ );
}
}
+
+ $fields = get_post_meta( $form_id, '_um_custom_fields', true );
+ if ( ! empty( $fields ) && is_array( $fields ) ) {
+ foreach ( $fields as $field_key => $field ) {
+ $debug_info[] = $this->get_field_data( $field_key, $field );
+ }
+ }
+
+ /**
+ * Filters form settings for Site Health.
+ *
+ * @since 2.10.5
+ * @hook um_debug_information_{$form_mode}_form
+ *
+ * @param {array} $info Registration form settings for Site Health.
+ * @param {string} $form_id Registration form ID.
+ *
+ * @return {array} Registration form settings for Site Health.
+ *
+ * @example Extend Registration form settings for Site Health.
+ * function um_debug_information_user_role( $info, $form_id ) {
+ * // your code here
+ * return $info;
+ * }
+ * add_filter( 'um_debug_information_register_form', 'um_debug_information_register_form', 10, 2 );
+ * @example Extend Login form settings for Site Health.
+ * function um_debug_information_login_form( $info, $form_id ) {
+ * // your code here
+ * return $info;
+ * }
+ * add_filter( 'um_debug_information_login_form', 'um_debug_information_login_form', 10, 2 );
+ */
+ $debug_info = apply_filters( "um_debug_information_{$form_mode}_form", $debug_info, $form_id );
+
+ $debug_info = array_merge( ...$debug_info );
+
+ $info[ 'ultimate-member-form-' . $form_id ] = array(
+ // translators: %s is the form title.
+ 'label' => sprintf( __( ' - Form "%s" settings', 'ultimate-member' ), get_the_title( $form_id ) ),
+ 'description' => __( 'This debug information for your Ultimate Member form.', 'ultimate-member' ),
+ 'fields' => $debug_info,
+ );
}
}
- // Members directory
- $options = array(
- 'country' => __( 'Country', 'ultimate-member' ),
- 'gender' => __( 'Gender', 'ultimate-member' ),
- 'languages' => __( 'Languages', 'ultimate-member' ),
- 'role' => __( 'Roles', 'ultimate-member' ),
- 'birth_date' => __( 'Age', 'ultimate-member' ),
- 'last_login' => __( 'Last Login', 'ultimate-member' ),
- 'user_registered' => __( 'User Registered', 'ultimate-member' ),
- 'first_name' => __( 'First Name', 'ultimate-member' ),
- 'last_name' => __( 'Last Name', 'ultimate-member' ),
- 'nickname' => __( 'Nickname', 'ultimate-member' ),
- 'secondary_user_email' => __( 'Secondary Email Address', 'ultimate-member' ),
- 'description' => __( 'Biography', 'ultimate-member' ),
- 'phone_number' => __( 'Phone Number', 'ultimate-member' ),
- 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ),
- 'role_select' => __( 'Roles (Dropdown)', 'ultimate-member' ),
- 'role_radio' => __( 'Roles (Radio)', 'ultimate-member' ),
- 'whatsapp' => __( 'WhatsApp number', 'ultimate-member' ),
- 'facebook' => __( 'Facebook', 'ultimate-member' ),
- 'twitter' => __( 'X (formerly Twitter)', 'ultimate-member' ),
- 'viber' => __( 'Viber number', 'ultimate-member' ),
- 'skype' => __( 'Skype ID', 'ultimate-member' ),
- 'telegram' => __( 'Telegram', 'ultimate-member' ),
- 'discord' => __( 'Discord', 'ultimate-member' ),
- 'youtube' => __( 'Youtube', 'ultimate-member' ),
- 'soundcloud' => __( 'SoundCloud', 'ultimate-member' ),
- 'user_registered_desc' => __( 'New users first', 'ultimate-member' ),
- 'user_registered_asc' => __( 'Old users first', 'ultimate-member' ),
- 'username' => __( 'Username', 'ultimate-member' ),
- 'display_name' => __( 'Display name', 'ultimate-member' ),
- 'last_first_name' => __( 'Last & First name', 'ultimate-member' ),
- 'random' => __( 'Random', 'ultimate-member' ),
- 'other' => __( 'Other (Custom Field)', 'ultimate-member' ),
+ return $info;
+ }
+
+ /**
+ * Get information about member directories for site health check.
+ *
+ * @param array $info Additional information for site health check.
+ *
+ * @return array Information about Ultimate Member directories including labels, fields, and debug details.
+ */
+ public function member_directories_debug_information( $info ) {
+ $all_member_directories = get_posts(
+ array(
+ 'post_type' => 'um_directory',
+ 'posts_per_page' => -1,
+ 'fields' => 'ids',
+ )
);
+ $formatted_directories = array();
+ foreach ( $all_member_directories as $directory_id ) {
+ $formatted_directories[ 'ID#' . $directory_id ] = get_the_title( $directory_id );
+ }
+
$info['ultimate-member-directories'] = array(
'label' => __( 'Ultimate Member Directories', 'ultimate-member' ),
'description' => __( 'This debug information about Ultimate Member directories.', 'ultimate-member' ),
'fields' => array(
- 'um-directory' => array(
+ 'directory' => array(
'label' => __( 'Member directories', 'ultimate-member' ),
- 'value' => ! empty( $this->get_member_directories() ) ? $this->get_member_directories() : $labels['no-dir'],
+ 'value' => ! empty( $formatted_directories ) ? $formatted_directories : __( 'No member directories', 'ultimate-member' ),
),
),
);
- if ( ! empty( $this->get_member_directories() ) ) {
- foreach ( $this->get_member_directories() as $key => $directory ) {
- if ( 0 === strpos( $key, 'ID#' ) ) {
- $key = substr( $key, 3 );
- }
+ if ( ! empty( $all_member_directories ) ) {
+ $labels = self::get_labels();
+ $options = array_unique( array_merge( UM()->member_directory()->filter_fields, UM()->member_directory()->default_sorting, UM()->member_directory()->sort_fields, UM()->member_directory()->searching_fields ) );
- $_um_view_types_value = get_post_meta( $key, '_um_view_types', true );
+ foreach ( $all_member_directories as $directory_id ) {
+ $_um_view_types_value = get_post_meta( $directory_id, '_um_view_types', true );
$_um_view_types_value = empty( $_um_view_types_value ) ? array( 'grid', 'list' ) : $_um_view_types_value;
$_um_view_types_value = is_string( $_um_view_types_value ) ? array( $_um_view_types_value ) : $_um_view_types_value;
- $info[ 'ultimate-member-directory-' . $key ] = array(
- 'label' => ' - ' . $directory . __( ' directory settings', 'ultimate-member' ),
- 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ),
- 'fields' => array(
- 'um-directory-shortcode' => array(
+ $debug_info = array(
+ array(
+ 'shortcode' => array(
'label' => __( 'Shortcode', 'ultimate-member' ),
- 'value' => '[ultimatemember_directory id="' . $key . '"]',
+ 'value' => '[ultimatemember_directory id="' . $directory_id . '"]',
),
- 'um-directory_template' => array(
+ 'template' => array(
'label' => __( 'Template', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_directory_template', true ) ? get_post_meta( $key, '_um_directory_template', true ) : $labels['default'],
+ 'value' => get_post_meta( $directory_id, '_um_directory_template', true ) ? get_post_meta( $directory_id, '_um_directory_template', true ) : $labels['default'],
),
- 'um-directory-view_types' => array(
+ 'view_types' => array(
'label' => __( 'View types', 'ultimate-member' ),
'value' => implode( ', ', $_um_view_types_value ),
),
- 'um-directory-default_view' => array(
+ 'default_view' => array(
'label' => __( 'Default view type', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_default_view', true ),
+ 'value' => get_post_meta( $directory_id, '_um_default_view', true ),
),
),
);
- if ( isset( $options[ get_post_meta( $key, '_um_sortby', true ) ] ) ) {
- $sortby_label = $options[ get_post_meta( $key, '_um_sortby', true ) ];
- } else {
- $sortby_label = get_post_meta( $key, '_um_sortby', true );
- }
-
- $directory_roles_meta = get_post_meta( $key, '_um_roles', true );
+ $directory_roles_meta = get_post_meta( $directory_id, '_um_roles', true );
$directory_roles = array();
if ( ! empty( $directory_roles_meta ) ) {
if ( is_string( $directory_roles_meta ) ) {
@@ -2209,7 +2507,7 @@ class Site_Health {
}
}
- $directory_show_these_users_meta = get_post_meta( $key, '_um_show_these_users', true );
+ $directory_show_these_users_meta = get_post_meta( $directory_id, '_um_show_these_users', true );
$show_these_users = array();
if ( ! empty( $directory_show_these_users_meta ) ) {
if ( is_string( $directory_show_these_users_meta ) ) {
@@ -2219,7 +2517,7 @@ class Site_Health {
}
}
- $directory_exclude_these_users_meta = get_post_meta( $key, '_um_exclude_these_users', true );
+ $directory_exclude_these_users_meta = get_post_meta( $directory_id, '_um_exclude_these_users', true );
$exclude_these_users = array();
if ( ! empty( $directory_exclude_these_users_meta ) ) {
if ( is_string( $directory_exclude_these_users_meta ) ) {
@@ -2229,186 +2527,123 @@ class Site_Health {
}
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-roles' => array(
- 'label' => __( 'User Roles to display', 'ultimate-member' ),
- 'value' => ! empty( $directory_roles ) ? implode( ', ', $directory_roles ) : $labels['all'],
- ),
- 'um-directory-has_profile_photo' => array(
- 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-directory-has_cover_photo' => array(
- 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-directory-show_these_users' => array(
- 'label' => __( 'Only show specific users (Enter one username per line)', 'ultimate-member' ),
- 'value' => ! empty( $show_these_users ) ? implode( ', ', $show_these_users ) : '',
- ),
- 'um-directory-exclude_these_users' => array(
- 'label' => __( 'Exclude specific users (Enter one username per line)', 'ultimate-member' ),
- 'value' => ! empty( $exclude_these_users ) ? implode( ', ', $exclude_these_users ) : '',
- ),
- )
+ $debug_info[] = array(
+ 'roles' => array(
+ 'label' => __( 'User Roles to display', 'ultimate-member' ),
+ 'value' => ! empty( $directory_roles ) ? implode( ', ', $directory_roles ) : $labels['all'],
+ ),
+ 'has_profile_photo' => array(
+ 'label' => __( 'Only show members who have uploaded a profile photo', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_has_profile_photo', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'has_cover_photo' => array(
+ 'label' => __( 'Only show members who have uploaded a cover photo', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_has_cover_photo', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'show_these_users' => array(
+ 'label' => __( 'Only show specific users', 'ultimate-member' ),
+ 'value' => ! empty( $show_these_users ) ? implode( ', ', $show_these_users ) : $labels['empty'],
+ ),
+ 'exclude_these_users' => array(
+ 'label' => __( 'Exclude specific users', 'ultimate-member' ),
+ 'value' => ! empty( $exclude_these_users ) ? implode( ', ', $exclude_these_users ) : $labels['empty'],
+ ),
);
- $info = apply_filters( 'um_debug_member_directory_general_extend', $info, $key );
+ /**
+ * Filters general member directory settings for Site Health.
+ *
+ * @since 2.10.5
+ * @hook um_debug_member_directory_general_extend
+ *
+ * @param {array} $info Member directory settings for Site Health.
+ * @param {string} $directory_id Member directory ID.
+ *
+ * @return {array} Member directory settings for Site Health.
+ *
+ * @example Extend Member directory settings for Site Health.
+ * function um_debug_member_directory_general_extend( $info, $directory_id ) {
+ * // your code here
+ * return $info;
+ * }
+ * add_filter( 'um_debug_member_directory_general_extend', 'um_debug_member_directory_general_extend', 10, 2 );
+ */
+ $debug_info = apply_filters( 'um_debug_member_directory_general_extend', $debug_info, $directory_id );
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-sortby' => array(
- 'label' => __( 'Default sort users by', 'ultimate-member' ),
- 'value' => $sortby_label,
- ),
- )
+ if ( isset( $options[ get_post_meta( $directory_id, '_um_sortby', true ) ] ) ) {
+ $sortby_label = $options[ get_post_meta( $directory_id, '_um_sortby', true ) ];
+ } else {
+ $sortby_label = get_post_meta( $directory_id, '_um_sortby', true );
+ }
+
+ $debug_info[] = array(
+ 'sortby' => array(
+ 'label' => __( 'Default sort users by', 'ultimate-member' ),
+ 'value' => $sortby_label,
+ ),
);
- if ( 'other' === get_post_meta( $key, '_um_sortby', true ) ) {
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-enable_sorting' => array(
- 'label' => __( 'Enable custom sorting', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-directory-sortby_custom' => array(
- 'label' => __( 'Custom sorting meta key', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_sortby_custom', true ),
- ),
- 'um-directory-sortby_custom_label' => array(
- 'label' => __( 'Label of custom sort', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_sortby_custom_label', true ),
- ),
- )
+ if ( 'other' === get_post_meta( $directory_id, '_um_sortby', true ) ) {
+ $debug_info[] = array(
+ 'sortby_custom' => array(
+ 'label' => __( 'Meta key', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_sortby_custom', true ),
+ ),
+ 'sortby_custom_type' => array(
+ 'label' => __( 'Data type', 'ultimate-member' ),
+ 'value' => UM()->member_directory()->sort_data_types[ get_post_meta( $directory_id, '_um_sortby_custom_type', true ) ],
+ ),
+ 'sortby_custom_order' => array(
+ 'label' => __( 'Order', 'ultimate-member' ),
+ 'value' => 'ASC' === get_post_meta( $directory_id, '_um_sortby_custom_order', true ) ? __( 'Ascending', 'ultimate-member' ) : __( 'Descending', 'ultimate-member' ),
+ ),
+ 'sortby_custom_label' => array(
+ 'label' => __( 'Label of custom sort', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_sortby_custom_label', true ),
+ ),
);
}
- if ( 1 === absint( get_post_meta( $key, '_um_enable_sorting', true ) ) ) {
- $sorting_fields = get_post_meta( $key, '_um_sorting_fields', true );
+ $debug_info[] = array(
+ 'enable_sorting' => array(
+ 'label' => __( 'Enable custom sorting', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_enable_sorting', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( 1 === absint( get_post_meta( $directory_id, '_um_enable_sorting', true ) ) ) {
+ $sorting_fields = get_post_meta( $directory_id, '_um_sorting_fields', true );
if ( ! empty( $sorting_fields ) ) {
foreach ( $sorting_fields as $k => $field ) {
if ( is_array( $field ) ) {
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-sorting_fields-' . $k => array(
- 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ),
- 'value' => __( 'Label: ', 'ultimate-member' ) . array_values( $field )[0] . ' | ' . __( 'Meta key: ', 'ultimate-member' ) . stripslashes( array_keys( $field )[0] ),
- ),
- )
+ $debug_info[] = array(
+ 'sorting_fields-' . $k => array(
+ 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ),
+ 'value' => $field,
+ ),
);
} else {
$sortby_label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-sorting_fields-' . $k => array(
- 'label' => __( 'Field to enable in sorting', 'ultimate-member' ),
- 'value' => $sortby_label,
- ),
- )
+ $debug_info[] = array(
+ 'sorting_fields-' . $k => array(
+ 'label' => __( 'Field(s) to enable in sorting', 'ultimate-member' ),
+ 'value' => $sortby_label,
+ ),
);
}
}
}
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-profile_photo' => array(
- 'label' => __( 'Enable Profile Photo', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-directory-cover_photos' => array(
- 'label' => __( 'Enable Cover Photo', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-directory-show_name' => array(
- 'label' => __( 'Show display name', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_show_name', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'search' => array(
+ 'label' => __( 'Enable Search feature', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_search', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
- $info = apply_filters( 'um_debug_member_directory_profile_extend', $info, $key );
-
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-show_tagline' => array(
- 'label' => __( 'Show tagline below profile name', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
- );
-
- if ( 1 === absint( get_post_meta( $key, '_um_show_tagline', true ) ) ) {
- $tagline_fields = get_post_meta( $key, '_um_tagline_fields', true );
- if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) {
- foreach ( $tagline_fields as $k => $field ) {
- $label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-tagline_fields-' . $k => array(
- 'label' => __( 'Field to display in tagline', 'ultimate-member' ),
- 'value' => $label,
- ),
- )
- );
- }
- }
- }
-
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-show_userinfo' => array(
- 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
- );
-
- if ( 1 === absint( get_post_meta( $key, '_um_show_userinfo', true ) ) ) {
- $reveal_fields = get_post_meta( $key, '_um_reveal_fields', true );
- if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) {
- foreach ( $reveal_fields as $k => $field ) {
- $label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-reveal_fields-' . $k => array(
- 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ),
- 'value' => $label,
- ),
- )
- );
- }
- }
- }
-
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-show_social' => array(
- 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_show_social', true ) ? $labels['yes'] : $labels['no'],
- ),
- 'um-directory-search' => array(
- 'label' => __( 'Enable Search feature', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_search', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
- );
-
- if ( 1 === absint( get_post_meta( $key, '_um_search', true ) ) ) {
- $directory_roles_can_search_meta = get_post_meta( $key, '_um_roles_can_search', true );
+ if ( 1 === absint( get_post_meta( $directory_id, '_um_search', true ) ) ) {
+ $directory_roles_can_search_meta = get_post_meta( $directory_id, '_um_roles_can_search', true );
$roles_can_search = array();
if ( ! empty( $directory_roles_can_search_meta ) ) {
if ( is_string( $directory_roles_can_search_meta ) ) {
@@ -2418,29 +2653,41 @@ class Site_Health {
}
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-roles_can_search' => array(
- 'label' => __( 'User Roles that can use search', 'ultimate-member' ),
- 'value' => ! empty( $roles_can_search ) ? implode( ', ', $roles_can_search ) : $labels['all'],
- ),
- )
+ $debug_info[] = array(
+ 'roles_can_search' => array(
+ 'label' => __( 'User Roles that can use search', 'ultimate-member' ),
+ 'value' => ! empty( $roles_can_search ) ? implode( ', ', $roles_can_search ) : $labels['all'],
+ ),
);
+
+ if ( ! empty( get_post_meta( $directory_id, '_um_search_exclude_fields', true ) ) ) {
+ $debug_info[] = array(
+ 'search_exclude_fields' => array(
+ 'label' => __( 'Exclude fields from search', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_search_exclude_fields', true ),
+ ),
+ );
+ }
+
+ if ( ! empty( get_post_meta( $directory_id, '_um_search_include_fields', true ) ) ) {
+ $debug_info[] = array(
+ 'search_include_fields' => array(
+ 'label' => __( 'Fields to search by', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_search_include_fields', true ),
+ ),
+ );
+ }
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-filters' => array(
- 'label' => __( 'Enable Filters feature', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_filters', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
+ $debug_info[] = array(
+ 'filters' => array(
+ 'label' => __( 'Enable Filters feature', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_filters', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
- if ( 1 === absint( get_post_meta( $key, '_um_filters', true ) ) ) {
- $directory_roles_can_filter_meta = get_post_meta( $key, '_um_roles_can_filter', true );
+ if ( 1 === absint( get_post_meta( $directory_id, '_um_filters', true ) ) ) {
+ $directory_roles_can_filter_meta = get_post_meta( $directory_id, '_um_roles_can_filter', true );
$roles_can_filter = array();
if ( ! empty( $directory_roles_can_filter_meta ) ) {
if ( is_string( $directory_roles_can_filter_meta ) ) {
@@ -2450,124 +2697,224 @@ class Site_Health {
}
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-roles_can_filter' => array(
- 'label' => __( 'User Roles that can use filters', 'ultimate-member' ),
- 'value' => ! empty( $roles_can_filter ) ? implode( ', ', $roles_can_filter ) : $labels['all'],
- ),
- )
- );
-
- $search_fields = get_post_meta( $key, '_um_search_fields', true );
- if ( ! empty( $search_fields ) && is_array( $search_fields ) ) {
- foreach ( $search_fields as $k => $field ) {
- $label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-search_fields-' . $k => array(
- 'label' => __( 'Filter meta to enable', 'ultimate-member' ),
- 'value' => $label,
- ),
- )
- );
- }
- }
- }
-
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-filters_expanded' => array(
- 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'],
+ $debug_info[] = array(
+ 'roles_can_filter' => array(
+ 'label' => __( 'User Roles that can use filters', 'ultimate-member' ),
+ 'value' => ! empty( $roles_can_filter ) ? implode( ', ', $roles_can_filter ) : $labels['all'],
),
- )
- );
-
- if ( 1 === absint( get_post_meta( $key, '_um_filters_expanded', true ) ) ) {
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-filters_is_collapsible' => array(
- 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'],
- ),
- )
);
- }
- $search_filters = get_post_meta( $key, '_um_search_filters', true );
- if ( ! empty( $search_filters ) && is_array( $search_filters ) ) {
- foreach ( $search_filters as $k => $field ) {
- $label = isset( $options[ $k ] ) ? $options[ $k ] : $k;
- $value = $field;
- if ( is_array( $field ) ) {
- $value = __( 'From ', 'ultimate-member' ) . $field[0] . __( ' to ', 'ultimate-member' ) . $field[1];
+ $search_fields = get_post_meta( $directory_id, '_um_search_fields', true );
+ if ( ! empty( $search_fields ) && is_array( $search_fields ) ) {
+ $field_labels = array();
+ foreach ( $search_fields as $field ) {
+ $field_label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
+ $field_labels[] = $field_label;
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-search_filters-' . $k => array(
- 'label' => __( 'Admin filtering', 'ultimate-member' ),
- 'value' => $label . ' - ' . $value,
- ),
- )
+ $debug_info[] = array(
+ 'search_fields-' . $directory_id => array(
+ 'label' => __( 'Filter meta to enable', 'ultimate-member' ),
+ 'value' => $field_labels,
+ ),
+ );
+ }
+
+ $debug_info[] = array(
+ 'filters_expanded' => array(
+ 'label' => __( 'Expand the filter bar by default', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_filters_expanded', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( 1 === absint( get_post_meta( $directory_id, '_um_filters_expanded', true ) ) ) {
+ $debug_info[] = array(
+ 'filters_is_collapsible' => array(
+ 'label' => __( 'Can filter bar be collapsed', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_filters_is_collapsible', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
}
}
- $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge(
- $info[ 'ultimate-member-directory-' . $key ]['fields'],
- array(
- 'um-directory-must_search' => array(
- 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_must_search', true ) ? $labels['yes'] : $labels['no'],
+ $search_filters = get_post_meta( $directory_id, '_um_search_filters', true );
+ if ( ! empty( $search_filters ) && is_array( $search_filters ) ) {
+ $field_labels = array();
+ foreach ( $search_filters as $k => $field ) {
+ $field_label = isset( $options[ $k ] ) ? $options[ $k ] : $k;
+ $value = $field;
+ if ( is_array( $field ) ) {
+ if ( array_key_exists( $k, UM()->member_directory()->filter_types ) && in_array( UM()->member_directory()->filter_types[ $k ], array( 'datepicker', 'timepicker', 'slider' ), true ) ) {
+ // translators: %1$s is the "From" value, %2$s is the "To" value.
+ $value = sprintf( __( 'From %1$s; To %2$s', 'ultimate-member' ), $field[0], $field[1] );
+ } else {
+ $value = implode( ', ', $field );
+ }
+ }
+ $field_labels[] = $field_label . ' - ' . $value;
+ }
+ $debug_info[] = array(
+ 'search_filters-' . $directory_id => array(
+ 'label' => __( 'Admin filtering', 'ultimate-member' ),
+ 'value' => $field_labels,
),
- 'um-directory-max_users' => array(
- 'label' => __( 'Maximum number of profiles', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_max_users', true ),
- ),
- 'um-directory-profiles_per_page' => array(
- 'label' => __( 'Number of profiles per page', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profiles_per_page', true ),
- ),
- 'um-directory-profiles_per_page_mobile' => array(
- 'label' => __( 'Maximum number of profiles', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_profiles_per_page_mobile', true ),
- ),
- 'um-directory-directory_header' => array(
- 'label' => __( 'Results Text', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_directory_header', true ),
- ),
- 'um-directory-directory_header_single' => array(
- 'label' => __( 'Single Result Text', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_directory_header_single', true ),
- ),
- 'um-directory-directory_no_users' => array(
- 'label' => __( 'Custom text if no users were found', 'ultimate-member' ),
- 'value' => get_post_meta( $key, '_um_directory_no_users', true ),
- ),
- )
+ );
+ }
+
+ $debug_info[] = array(
+ 'show_profile_photo' => array(
+ 'label' => __( 'Enable Profile Photo', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_profile_photo', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'show_cover_photos' => array(
+ 'label' => __( 'Enable Cover Photo', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_cover_photos', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'show_display_name' => array(
+ 'label' => __( 'Show display name', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_show_name', true ) ? $labels['yes'] : $labels['no'],
+ ),
);
- $info = apply_filters( 'um_debug_member_directory_extend', $info, $key );
+ /**
+ * Filters member directory profile card settings for Site Health.
+ *
+ * @since 2.10.5
+ * @hook um_debug_member_directory_profile_extend
+ *
+ * @param {array} $info Member directory settings for Site Health.
+ * @param {string} $directory_id Member directory ID.
+ *
+ * @return {array} Member directory settings for Site Health.
+ *
+ * @example Extend Member directory settings for Site Health.
+ * function um_debug_member_directory_profile_extend( $info, $directory_id ) {
+ * // your code here
+ * return $info;
+ * }
+ * add_filter( 'um_debug_member_directory_profile_extend', 'um_debug_member_directory_profile_extend', 10, 2 );
+ */
+ $debug_info = apply_filters( 'um_debug_member_directory_profile_extend', $debug_info, $directory_id );
+
+ $debug_info[] = array(
+ 'show_tagline' => array(
+ 'label' => __( 'Show tagline below profile name', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_show_tagline', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( 1 === absint( get_post_meta( $directory_id, '_um_show_tagline', true ) ) ) {
+ $tagline_fields = get_post_meta( $directory_id, '_um_tagline_fields', true );
+ if ( ! empty( $tagline_fields ) && is_array( $tagline_fields ) ) {
+ $field_labels = array();
+ foreach ( $tagline_fields as $field ) {
+ $label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
+ $field_labels[] = $label;
+ }
+
+ $debug_info[] = array(
+ 'tagline_fields-' . $directory_id => array(
+ 'label' => __( 'Field to display in tagline', 'ultimate-member' ),
+ 'value' => $field_labels,
+ ),
+ );
+ }
+ }
+
+ $debug_info[] = array(
+ 'show_userinfo' => array(
+ 'label' => __( 'Show extra user information below tagline?', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_show_userinfo', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ );
+
+ if ( 1 === absint( get_post_meta( $directory_id, '_um_show_userinfo', true ) ) ) {
+ $reveal_fields = get_post_meta( $directory_id, '_um_reveal_fields', true );
+ if ( ! empty( $reveal_fields ) && is_array( $reveal_fields ) ) {
+ $field_labels = array();
+ foreach ( $reveal_fields as $field ) {
+ $label = isset( $options[ $field ] ) ? $options[ $field ] : $field;
+ $field_labels[] = $label;
+ }
+
+ $debug_info[] = array(
+ 'reveal_fields-' . $directory_id => array(
+ 'label' => __( 'Field to display in extra user information section', 'ultimate-member' ),
+ 'value' => $field_labels,
+ ),
+ );
+ }
+ }
+
+ $debug_info[] = array(
+ 'show_social' => array(
+ 'label' => __( 'Show social connect icons in extra user information section', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_show_social', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'userinfo_animate' => array(
+ 'label' => __( 'Hide extra user information to the reveal section', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_userinfo_animate', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'must_search' => array(
+ 'label' => __( 'Show results only after search/filtration', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_must_search', true ) ? $labels['yes'] : $labels['no'],
+ ),
+ 'max_users' => array(
+ 'label' => __( 'Maximum number of profiles', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_max_users', true ),
+ ),
+ 'profiles_per_page' => array(
+ 'label' => __( 'Number of profiles per page', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_profiles_per_page', true ),
+ ),
+ 'profiles_per_page_mobile' => array(
+ 'label' => __( 'Maximum number of profiles', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_profiles_per_page_mobile', true ),
+ ),
+ 'header' => array(
+ 'label' => __( 'Results Text', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_directory_header', true ),
+ ),
+ 'header_single' => array(
+ 'label' => __( 'Single Result Text', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_directory_header_single', true ),
+ ),
+ 'no_users_text' => array(
+ 'label' => __( 'Custom text if no users were found', 'ultimate-member' ),
+ 'value' => get_post_meta( $directory_id, '_um_directory_no_users', true ),
+ ),
+ );
+
+ /**
+ * Filters member directory settings for Site Health.
+ *
+ * @since 2.10.5
+ * @hook um_debug_member_directory_extend
+ *
+ * @param {array} $info Member directory settings for Site Health.
+ * @param {string} $directory_id Member directory ID.
+ *
+ * @return {array} Member directory settings for Site Health.
+ *
+ * @example Extend Member directory settings for Site Health.
+ * function um_debug_member_directory_extend( $info, $directory_id ) {
+ * // your code here
+ * return $info;
+ * }
+ * add_filter( 'um_debug_member_directory_extend', 'um_debug_member_directory_extend', 10, 2 );
+ */
+ $debug_info = apply_filters( 'um_debug_member_directory_extend', $debug_info, $directory_id );
+
+ $debug_info = array_merge( ...$debug_info );
+
+ $info[ 'ultimate-member-directory-' . $directory_id ] = array(
+ // translators: %s is the member directory title.
+ 'label' => sprintf( __( ' - Member directory "%s" settings', 'ultimate-member' ), get_the_title( $directory_id ) ),
+ 'description' => __( 'This debug information for your Ultimate Member directory.', 'ultimate-member' ),
+ 'fields' => $debug_info,
+ );
}
}
- /**
- * Filters the site health information.
- *
- * @hook um_site_health_extend
- *
- * @since 2.10.3
- *
- * @param {array} $info The site health info to be filtered.
- *
- * @return {array} The filtered site health info.
- */
- return apply_filters( 'um_site_health_extend', $info );
+ return $info;
}
}
diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php
index be73e0f4..3c8f0a30 100644
--- a/includes/admin/core/class-admin-notices.php
+++ b/includes/admin/core/class-admin-notices.php
@@ -1,6 +1,8 @@
maybe_action_scheduler()->has_scheduled_action( Users::BATCH_ACTION ) ) {
+ do_action( Users::SCHEDULE_ACTION );
+ }
+
$allowed_html = array(
'a' => array(
'href' => array(),
diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php
index bdef709a..9821763c 100644
--- a/includes/admin/core/class-admin-settings.php
+++ b/includes/admin/core/class-admin-settings.php
@@ -1403,6 +1403,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'args' => array(
'textarea_rows' => 6,
),
+ 'conditional' => array( 'account_tab_delete', '=', '1' ),
),
array(
'id' => 'delete_account_no_pass_required_text',
@@ -1412,6 +1413,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) {
'args' => array(
'textarea_rows' => 6,
),
+ 'conditional' => array( 'account_tab_delete', '=', '1' ),
),
),
),
diff --git a/includes/class-init.php b/includes/class-init.php
index 36862a92..0d0f976e 100644
--- a/includes/class-init.php
+++ b/includes/class-init.php
@@ -42,6 +42,7 @@ if ( ! class_exists( 'UM' ) ) {
* @method UM_Profile_Tabs Profile_Tabs()
* @method UM_JobBoardWP JobBoardWP()
* @method UM_Zapier Zapier()
+ * @method UM_Stripe_API Stripe_API()
* @method UM_Google_Authenticator Google_Authenticator()
*/
final class UM extends UM_Functions {
@@ -370,16 +371,18 @@ if ( ! class_exists( 'UM' ) ) {
}
}
-
/**
* Plugin Deactivation
*
* @since 2.3
*/
- function deactivation() {
+ public function deactivation() {
$this->cron()->unschedule_events();
- }
+ $this->maybe_action_scheduler()->unschedule_all_actions( 'um_dispatch_email' );
+ $this->maybe_action_scheduler()->unschedule_all_actions( 'um_schedule_empty_account_status_check' );
+ $this->maybe_action_scheduler()->unschedule_all_actions( 'um_set_default_account_status' );
+ }
/**
* Maybe need multisite activation process
diff --git a/includes/common/actions/class-emails.php b/includes/common/actions/class-emails.php
index f4c485be..fb1613dc 100644
--- a/includes/common/actions/class-emails.php
+++ b/includes/common/actions/class-emails.php
@@ -19,7 +19,6 @@ if ( ! class_exists( 'um\common\actions\Emails' ) ) {
public function __construct() {
add_filter( 'um_action_scheduler_is_hook_enabled', array( $this, 'is_enabled' ), 10, 2 );
add_action( 'um_dispatch_email', array( $this, 'send' ), 10, 3 );
- add_action( 'um_before_email_notification_sending', array( $this, 'before_email_send' ), 10, 2 );
}
public function is_enabled( $is_enabled, $hook ) {
@@ -52,29 +51,5 @@ if ( ! class_exists( 'um\common\actions\Emails' ) ) {
UM()->mail()->send( $user_email, $template, $args );
}
-
- /**
- * Add some custom placeholders when sending via Action Scheduler.
- *
- * @todo Workaround for now. Maybe we need to handle email placeholders in email class where $user_id is fetched everytime
- *
- * @param string $email
- * @param string $template
- *
- * @return void
- */
- public function before_email_send( $email, $template ) {
- if ( ! UM()->maybe_action_scheduler()->is_hook_enabled( 'um_dispatch_email' ) ) {
- return;
- }
-
- if ( 'checkmail_email' === $template ) {
- add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) );
- } elseif ( 'welcome_email' === $template || 'approved_email' === $template || 'resetpw_email' === $template ) {
- add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) );
- }
- }
}
}
diff --git a/includes/common/class-users.php b/includes/common/class-users.php
index 1701b913..6505ec0e 100644
--- a/includes/common/class-users.php
+++ b/includes/common/class-users.php
@@ -384,15 +384,33 @@ class Users {
$userdata = get_userdata( $user_id );
- $current_user_id = get_current_user_id();
- um_fetch_user( $user_id );
+ $temp_id = null;
+ if ( um_user( 'ID' ) !== $user_id ) {
+ $temp_id = um_user( 'ID' );
+ um_fetch_user( $user_id );
+ }
- add_filter( 'um_template_tags_patterns_hook', array( UM()->user(), 'add_activation_placeholder' ) );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->user(), 'add_activation_replace_placeholder' ) );
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ 'checkmail_email',
+ array(
+ 'fetch_user_id' => $user_id,
+ 'tags' => array(
+ '{account_activation_link}',
+ ),
+ 'tags_replace' => array(
+ UM()->permalinks()->activate_url( $user_id ),
+ ),
+ ),
+ )
+ );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'checkmail_email', array( 'fetch_user_id' => $user_id ) ) );
+ if ( $temp_id ) {
+ um_fetch_user( $temp_id );
+ }
- um_fetch_user( $current_user_id );
/**
* Fires after User has been set as pending email confirmation.
*
@@ -458,7 +476,25 @@ class Users {
$this->reset_activation_link( $user_id );
$userdata = get_userdata( $user_id );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'inactive_email', array( 'fetch_user_id' => $user_id ) ) );
+
+ $temp_id = null;
+ if ( um_user( 'ID' ) !== $user_id ) {
+ $temp_id = um_user( 'ID' );
+ um_fetch_user( $user_id );
+ }
+
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ 'inactive_email',
+ array( 'fetch_user_id' => $user_id ),
+ )
+ );
+
+ if ( $temp_id ) {
+ um_fetch_user( $temp_id );
+ }
/**
* Fires after User has been deactivated.
@@ -530,7 +566,25 @@ class Users {
$this->reset_activation_link( $user_id );
$userdata = get_userdata( $user_id );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'rejected_email', array( 'fetch_user_id' => $user_id ) ) );
+
+ $temp_id = null;
+ if ( um_user( 'ID' ) !== $user_id ) {
+ $temp_id = um_user( 'ID' );
+ um_fetch_user( $user_id );
+ }
+
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ 'rejected_email',
+ array( 'fetch_user_id' => $user_id ),
+ )
+ );
+
+ if ( $temp_id ) {
+ um_fetch_user( $temp_id );
+ }
/**
* Fires after User has been rejected.
@@ -608,7 +662,25 @@ class Users {
$this->reset_activation_link( $user_id );
$userdata = get_userdata( $user_id );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'pending_email', array( 'fetch_user_id' => $user_id ) ) );
+
+ $temp_id = null;
+ if ( um_user( 'ID' ) !== $user_id ) {
+ $temp_id = um_user( 'ID' );
+ um_fetch_user( $user_id );
+ }
+
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ 'pending_email',
+ array( 'fetch_user_id' => $user_id ),
+ )
+ );
+
+ if ( $temp_id ) {
+ um_fetch_user( $temp_id );
+ }
/**
* Fires after User has been set as pending admin review.
@@ -689,21 +761,55 @@ class Users {
$this->reset_activation_link( $user_id );
- $email_slug = 'welcome_email';
- if ( 'awaiting_admin_review' === $old_status ) {
- $email_slug = 'approved_email';
- $this->maybe_generate_password_reset_key( $userdata );
+ $email_slug = 'awaiting_admin_review' === $old_status ? 'approved_email' : 'welcome_email';
+
+ $reset_pw_link = UM()->password()->reset_url( $user_id );
+
+ $tags = array(
+ '{password_reset_link}',
+ '{password}',
+ );
+ $tags_replace = array(
+ $reset_pw_link,
+ __( 'Your set password', 'ultimate-member' ),
+ );
+
+ if ( 'welcome_email' === $email_slug ) {
+ $tags[] = '{action_url}';
+ $tags[] = '{action_title}';
+
+ $set_password_required = get_user_meta( $user_id, 'um_set_password_required', true );
+ if ( empty( $set_password_required ) || $this->has_status( $user_id, 'pending' ) ) {
+ $tags_replace[] = um_get_core_page( 'login' );
+ $tags_replace[] = esc_html__( 'Login to our site', 'ultimate-member' );
+ } else {
+ $tags_replace[] = $reset_pw_link;
+ $tags_replace[] = esc_html__( 'Set your password', 'ultimate-member' );
+ }
}
- $current_user_id = get_current_user_id();
- um_fetch_user( $user_id );
+ $temp_id = null;
+ if ( um_user( 'ID' ) !== $user_id ) {
+ $temp_id = um_user( 'ID' );
+ um_fetch_user( $user_id );
+ }
- add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) );
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ $email_slug,
+ array(
+ 'fetch_user_id' => $user_id,
+ 'tags' => $tags,
+ 'tags_replace' => $tags_replace,
+ ),
+ )
+ );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, $email_slug, array( 'fetch_user_id' => $user_id ) ) );
-
- um_fetch_user( $current_user_id );
+ if ( $temp_id ) {
+ um_fetch_user( $temp_id );
+ }
}
/**
* Fires after User has been approved.
@@ -773,15 +879,49 @@ class Users {
$userdata = get_userdata( $user_id );
- $current_user_id = get_current_user_id();
- um_fetch_user( $user_id );
+ $temp_id = null;
+ if ( um_user( 'ID' ) !== $user_id ) {
+ $temp_id = um_user( 'ID' );
+ um_fetch_user( $user_id );
+ }
- add_filter( 'um_template_tags_patterns_hook', array( UM()->password(), 'add_placeholder' ) );
- add_filter( 'um_template_tags_replaces_hook', array( UM()->password(), 'add_replace_placeholder' ) );
+ $reset_pw_link = UM()->password()->reset_url( $user_id );
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'welcome_email', array( 'fetch_user_id' => $user_id ) ) );
+ $tags_replace = array(
+ $reset_pw_link,
+ __( 'Your set password', 'ultimate-member' ),
+ );
- um_fetch_user( $current_user_id );
+ $set_password_required = get_user_meta( $user_id, 'um_set_password_required', true );
+ if ( empty( $set_password_required ) || $this->has_status( $user_id, 'pending' ) ) {
+ $tags_replace[] = um_get_core_page( 'login' );
+ $tags_replace[] = esc_html__( 'Login to our site', 'ultimate-member' );
+ } else {
+ $tags_replace[] = $reset_pw_link;
+ $tags_replace[] = esc_html__( 'Set your password', 'ultimate-member' );
+ }
+
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ 'welcome_email',
+ array(
+ 'fetch_user_id' => $user_id,
+ 'tags' => array(
+ '{password_reset_link}',
+ '{password}',
+ '{action_url}',
+ '{action_title}',
+ ),
+ 'tags_replace' => $tags_replace,
+ ),
+ )
+ );
+
+ if ( $temp_id ) {
+ um_fetch_user( $temp_id );
+ }
/**
* Fires after User has been reactivated.
@@ -860,4 +1000,15 @@ class Users {
return $total_users;
}
+
+ /**
+ * Set last login timestamp.
+ *
+ * @param int $user_id User ID.
+ */
+ public function set_last_login( $user_id ) {
+ update_user_meta( $user_id, '_um_last_login', current_time( 'mysql', true ) );
+ // Flush user cache after updating last_login timestamp.
+ UM()->user()->remove_cache( $user_id );
+ }
}
diff --git a/includes/core/class-blocks.php b/includes/core/class-blocks.php
index 25b2cf9d..0b2fa4df 100644
--- a/includes/core/class-blocks.php
+++ b/includes/core/class-blocks.php
@@ -37,27 +37,33 @@ if ( ! class_exists( 'um\core\Blocks' ) ) {
if ( empty( $settings['attributes']['um_is_restrict'] ) ) {
$settings['attributes']['um_is_restrict'] = array(
- 'type' => 'boolean',
+ 'type' => 'boolean',
+ 'default' => false,
);
}
if ( empty( $settings['attributes']['um_who_access'] ) ) {
$settings['attributes']['um_who_access'] = array(
- 'type' => 'string',
+ 'type' => 'string',
+ 'default' => 0,
);
}
if ( empty( $settings['attributes']['um_roles_access'] ) ) {
$settings['attributes']['um_roles_access'] = array(
- 'type' => 'array',
+ 'type' => 'array',
+ 'default' => array(),
+ 'items' => array( 'type' => 'string' ),
);
}
if ( empty( $settings['attributes']['um_message_type'] ) ) {
$settings['attributes']['um_message_type'] = array(
- 'type' => 'string',
+ 'type' => 'string',
+ 'default' => 0,
);
}
if ( empty( $settings['attributes']['um_message_content'] ) ) {
$settings['attributes']['um_message_content'] = array(
- 'type' => 'string',
+ 'type' => 'string',
+ 'default' => '',
);
}
diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php
index eeb735cf..98e69a38 100644
--- a/includes/core/class-builtin.php
+++ b/includes/core/class-builtin.php
@@ -1987,7 +1987,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) {
'LT' => __('Lithuania','ultimate-member'),
'LU' => __('Luxembourg','ultimate-member'),
'MO' => __('Macao','ultimate-member'),
- 'MK' => __('Macedonia, the former Yugoslav Republic of','ultimate-member'),
+ 'MK' => __('North Macedonia','ultimate-member'),
'MG' => __('Madagascar','ultimate-member'),
'MW' => __('Malawi','ultimate-member'),
'MY' => __('Malaysia','ultimate-member'),
diff --git a/includes/core/class-form.php b/includes/core/class-form.php
index e7a553db..8c34c24b 100644
--- a/includes/core/class-form.php
+++ b/includes/core/class-form.php
@@ -857,10 +857,10 @@ if ( ! class_exists( 'um\core\Form' ) ) {
'allowfullscreen' => true,
);
}
- $form[ $k ] = wp_kses( $form[ $k ], $allowed_html );
+ $form[ $k ] = wp_kses( strip_shortcodes( $form[ $k ] ), $allowed_html );
add_filter( 'wp_kses_allowed_html', array( &$this, 'wp_kses_user_desc' ), 10, 2 );
} else {
- $form[ $k ] = sanitize_textarea_field( $form[ $k ] );
+ $form[ $k ] = sanitize_textarea_field( strip_shortcodes( $form[ $k ] ) );
}
break;
case 'oembed':
@@ -915,9 +915,9 @@ if ( ! class_exists( 'um\core\Form' ) ) {
}
}
- $form[ $k ] = esc_url_raw( $v );
+ $form[ $k ] = esc_url_raw( strip_shortcodes( $v ) );
} else {
- $form[ $k ] = esc_url_raw( $form[ $k ] );
+ $form[ $k ] = esc_url_raw( strip_shortcodes( $form[ $k ] ) );
}
break;
case 'password':
@@ -939,12 +939,12 @@ if ( ! class_exists( 'um\core\Form' ) ) {
case 'soundcloud_track':
case 'spotify':
case 'tel':
- $form[ $k ] = sanitize_text_field( $form[ $k ] );
+ $form[ $k ] = sanitize_text_field( strip_shortcodes( $form[ $k ] ) );
break;
case 'multiselect':
case 'radio':
case 'checkbox':
- $form[ $k ] = is_array( $form[ $k ] ) ? array_map( 'sanitize_text_field', $form[ $k ] ) : sanitize_text_field( $form[ $k ] );
+ $form[ $k ] = is_array( $form[ $k ] ) ? array_map( 'sanitize_text_field', array_map( 'strip_shortcodes', $form[ $k ] ) ) : sanitize_text_field( strip_shortcodes( $form[ $k ] ) );
break;
}
}
@@ -997,11 +997,11 @@ if ( ! class_exists( 'um\core\Form' ) ) {
'allowfullscreen' => true,
);
}
- $form[ $description_key ] = wp_kses( $form[ $description_key ], $allowed_html );
+ $form[ $description_key ] = wp_kses( strip_shortcodes( $form[ $description_key ] ), $allowed_html );
add_filter( 'wp_kses_allowed_html', array( &$this, 'wp_kses_user_desc' ), 10, 2 );
} else {
- $form[ $description_key ] = sanitize_textarea_field( $form[ $description_key ] );
+ $form[ $description_key ] = sanitize_textarea_field( strip_shortcodes( $form[ $description_key ] ) );
}
}
}
@@ -1025,11 +1025,11 @@ if ( ! class_exists( 'um\core\Form' ) ) {
'allowfullscreen' => true,
);
}
- $form[ $description_key ] = wp_kses( $form[ $description_key ], $allowed_html );
+ $form[ $description_key ] = wp_kses( strip_shortcodes( $form[ $description_key ] ), $allowed_html );
add_filter( 'wp_kses_allowed_html', array( &$this, 'wp_kses_user_desc' ), 10, 2 );
} else {
- $form[ $description_key ] = sanitize_textarea_field( $form[ $description_key ] );
+ $form[ $description_key ] = sanitize_textarea_field( strip_shortcodes( $form[ $description_key ] ) );
}
}
}
diff --git a/includes/core/class-mail.php b/includes/core/class-mail.php
index 60d7c298..4df1543d 100644
--- a/includes/core/class-mail.php
+++ b/includes/core/class-mail.php
@@ -348,9 +348,6 @@ if ( ! class_exists( 'um\core\Mail' ) ) {
*/
$message = apply_filters( 'um_email_send_message_content', $message, $slug, $args );
-// add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) );
-// add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) );
-
// Convert tags in email template.
return um_convert_tags( $message, $args );
}
@@ -616,12 +613,8 @@ if ( ! class_exists( 'um\core\Mail' ) ) {
$placeholders[] = '{user_profile_link}';
$placeholders[] = '{site_url}';
$placeholders[] = '{admin_email}';
- $placeholders[] = '{submitted_registration}';
$placeholders[] = '{login_url}';
$placeholders[] = '{password}';
- $placeholders[] = '{account_activation_link}';
- $placeholders[] = '{action_url}';
- $placeholders[] = '{action_title}';
return $placeholders;
}
@@ -636,20 +629,8 @@ if ( ! class_exists( 'um\core\Mail' ) ) {
$replace_placeholders[] = um_user_profile_url();
$replace_placeholders[] = get_bloginfo( 'url' );
$replace_placeholders[] = um_admin_email();
- $replace_placeholders[] = um_user_submitted_registration_formatted();
$replace_placeholders[] = um_get_core_page( 'login' );
$replace_placeholders[] = esc_html__( 'Your set password', 'ultimate-member' );
- $replace_placeholders[] = um_user( 'account_activation_link' );
-
- $set_password_required = get_user_meta( um_user( 'ID' ), 'um_set_password_required', true );
- if ( empty( $set_password_required ) || 'pending' === um_user( 'status' ) ) {
- $replace_placeholders[] = um_get_core_page( 'login' );
- $replace_placeholders[] = esc_html__( 'Login to our site', 'ultimate-member' );
- } else {
- $replace_placeholders[] = um_user( 'password_reset_link' );
- $replace_placeholders[] = esc_html__( 'Set your password', 'ultimate-member' );
- }
-
return $replace_placeholders;
}
}
diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php
index d1ca1d31..81c825fc 100644
--- a/includes/core/class-member-directory.php
+++ b/includes/core/class-member-directory.php
@@ -1101,7 +1101,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$wpdb->prepare(
"SELECT DISTINCT meta_value
FROM {$wpdb->usermeta}
- WHERE meta_key = %s
+ WHERE meta_key = %s AND
+ meta_value != ''
ORDER BY meta_value DESC",
$filter
)
@@ -1122,7 +1123,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
MIN(meta_value) AS min,
MAX(meta_value) AS max
FROM {$wpdb->usermeta}
- WHERE meta_key = '_um_last_login'",
+ WHERE meta_key = '_um_last_login' AND
+ meta_value != ''",
ARRAY_A
);
if ( empty( $meta['total'] ) || 1 === absint( $meta['total'] ) ) {
@@ -1161,7 +1163,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) {
$wpdb->prepare(
"SELECT DISTINCT meta_value
FROM {$wpdb->usermeta}
- WHERE meta_key = %s
+ WHERE meta_key = %s AND
+ meta_value != ''
ORDER BY meta_value DESC",
$filter
)
diff --git a/includes/core/class-password.php b/includes/core/class-password.php
index c08fbe0b..434ab902 100644
--- a/includes/core/class-password.php
+++ b/includes/core/class-password.php
@@ -57,11 +57,11 @@ if ( ! class_exists( 'um\core\Password' ) ) {
}
if ( empty( $reset_key ) ) {
- $reset_key = UM()->user()->maybe_generate_password_reset_key( $user_data );
+ $reset_key = UM()->common()->users()->maybe_generate_password_reset_key( $user_data );
}
- // this link looks like WordPress native link e.g. wp-login.php?action=rp&key={hash}&login={user_login}
- $url = add_query_arg(
+ // This link looks like WordPress native link e.g. wp-login.php?action=rp&key={hash}&login={user_login}
+ return add_query_arg(
array(
'act' => 'reset_password',
'hash' => $reset_key,
@@ -69,7 +69,6 @@ if ( ! class_exists( 'um\core\Password' ) ) {
),
um_get_core_page( 'password-reset' )
);
- return $url;
}
@@ -695,31 +694,27 @@ if ( ! class_exists( 'um\core\Password' ) ) {
setcookie( $name, $value, $expire, $path, COOKIE_DOMAIN, is_ssl(), true );
}
-
/**
* UM Placeholders for reset password
- *
+ * @depreated 2.10.5
* @param $placeholders
*
* @return array
*/
- function add_placeholder( $placeholders ) {
- $placeholders[] = '{password_reset_link}';
- $placeholders[] = '{password}';
+ public function add_placeholder( $placeholders ) {
+ _deprecated_function( __METHOD__, '2.10.5' );
return $placeholders;
}
-
/**
* UM Replace Placeholders for reset password
- *
+ * @depreated 2.10.5
* @param $replace_placeholders
*
* @return array
*/
- function add_replace_placeholder( $replace_placeholders ) {
- $replace_placeholders[] = um_user( 'password_reset_link' );
- $replace_placeholders[] = esc_html__( 'Your set password', 'ultimate-member' );
+ public function add_replace_placeholder( $replace_placeholders ) {
+ _deprecated_function( __METHOD__, '2.10.5' );
return $replace_placeholders;
}
}
diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php
index 5abe91cc..d930ab25 100644
--- a/includes/core/class-permalinks.php
+++ b/includes/core/class-permalinks.php
@@ -172,8 +172,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) {
$redirect = empty( $user_role_data['url_email_activate'] ) ? um_get_core_page( 'login', 'account_active' ) : trim( $user_role_data['url_email_activate'] );
} else {
// Redirect to the change password page if there is no password for this user.
- um_fetch_user( $user_id );
- $redirect = um_user( 'password_reset_link' );
+ $redirect = UM()->password()->reset_url( $user_id );
}
/**
* Filter to change the redirect URL after email confirmation.
@@ -204,40 +203,44 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) {
/**
* Makes an activate link for any user
*
- * @return bool|string
+ * @return string
*/
- public function activate_url() {
- if ( ! um_user( 'account_secret_hash' ) ) {
- return false;
+ public function activate_url( $user_id = null ) {
+ if ( is_null( $user_id ) ) {
+ $user_id = um_user( 'ID' );
+ }
+
+ $account_secret_hash = get_user_meta( $user_id, 'account_secret_hash', true );
+ if ( empty( $account_secret_hash ) ) {
+ return '';
}
/**
- * UM hook
+ * Filter to change the base URL for the user activation link.
*
- * @type filter
- * @title um_activate_url
- * @description Change activate user URL
- * @input_vars
- * [{"var":"$url","type":"string","desc":"Activate URL"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- * Change activate user base URL.
+ * function my_after_email_confirmation_redirect( $url ) {
* // your code here
* return $url;
* }
- * ?>
+ * add_filter( 'um_activate_url', 'my_um_activate_url' );
*/
- $url = apply_filters( 'um_activate_url', home_url() );
- $url = add_query_arg( 'act', 'activate_via_email', $url );
- $url = add_query_arg( 'hash', um_user( 'account_secret_hash' ), $url );
- $url = add_query_arg( 'user_id', um_user( 'ID' ), $url );
+ $base_url = apply_filters( 'um_activate_url', home_url() );
- return $url;
+ return add_query_arg(
+ array(
+ 'act' => 'activate_via_email',
+ 'hash' => $account_secret_hash,
+ 'user_id' => $user_id,
+ ),
+ $base_url
+ );
}
/**
diff --git a/includes/core/class-profile.php b/includes/core/class-profile.php
index b469209e..044f4294 100644
--- a/includes/core/class-profile.php
+++ b/includes/core/class-profile.php
@@ -103,7 +103,24 @@ if ( ! class_exists( 'um\core\Profile' ) ) {
* @return array
*/
public function tabs_privacy() {
- $privacy = apply_filters(
+ /**
+ * Filters a privacy list extend.
+ *
+ * @since 2.7.0
+ * @hook um_profile_tabs_privacy_list
+ *
+ * @param {array} $privacy_option Add options for profile tabs' privacy.
+ *
+ * @return {array} Options for profile tabs' privacy.
+ *
+ * @example Add options for profile tabs' privacy.
+ * function um_profile_menu_link_attrs( $privacy_option ) {
+ * // your code here
+ * return $privacy_option;
+ * }
+ * add_filter( 'um_profile_tabs_privacy_list', 'um_profile_tabs_privacy_list', 10, 1 );
+ */
+ return apply_filters(
'um_profile_tabs_privacy_list',
array(
0 => __( 'Anyone', 'ultimate-member' ),
@@ -114,53 +131,46 @@ if ( ! class_exists( 'um\core\Profile' ) ) {
5 => __( 'Owner and specific roles', 'ultimate-member' ),
)
);
-
- return $privacy;
}
-
/**
* All tab data
*
* @return array
*/
- function tabs() {
-
- /**
- * UM hook
- *
- * @type filter
- * @title um_profile_tabs
- * @description Extend user profile tabs
- * @input_vars
- * [{"var":"$tabs","type":"array","desc":"Profile tabs"}]
- * @change_log
- * ["Since: 2.0"]
- * @usage
- *
- * @example
- *
- */
- $tabs = apply_filters( 'um_profile_tabs', array(
- 'main' => array(
+ public function tabs() {
+ $tabs = array(
+ 'main' => array(
'name' => __( 'About', 'ultimate-member' ),
- 'icon' => 'um-faicon-user'
+ 'icon' => 'um-faicon-user',
),
- 'posts' => array(
+ 'posts' => array(
'name' => __( 'Posts', 'ultimate-member' ),
- 'icon' => 'um-faicon-pencil'
+ 'icon' => 'um-faicon-pencil',
),
'comments' => array(
'name' => __( 'Comments', 'ultimate-member' ),
- 'icon' => 'um-faicon-comment'
- )
- ) );
+ 'icon' => 'um-faicon-comment',
+ ),
+ );
+ /**
+ * Filters user profile tabs
+ *
+ * @since 1.3.x
+ * @hook um_profile_tabs
+ *
+ * @param {array} $tabs tabs list.
+ *
+ * @return {array} tabs list.
+ *
+ * @example Add user profile tabs.
+ * function um_profile_tabs( $tabs ) {
+ * // your code here
+ * return $tabs;
+ * }
+ * add_filter( 'um_profile_tabs', 'um_profile_tabs' );
+ */
+ $tabs = apply_filters( 'um_profile_tabs', $tabs );
// disable private tabs
if ( ! is_admin() ) {
@@ -513,35 +523,28 @@ if ( ! class_exists( 'um\core\Profile' ) ) {
maybe_action_scheduler()->enqueue_async_action(
- $batch_size,
+ 'um_set_default_account_status', // See the class constant value `\um\common\actions\Users::BATCH_ACTION`.
array(
'page' => 1,
'total' => $total_users,
diff --git a/includes/core/class-shortcodes.php b/includes/core/class-shortcodes.php
index d34a789f..ff86b3be 100644
--- a/includes/core/class-shortcodes.php
+++ b/includes/core/class-shortcodes.php
@@ -403,7 +403,7 @@ if ( ! class_exists( 'um\core\Shortcodes' ) ) {
public function um_loggedin( $args = array(), $content = '' ) {
$args = shortcode_atts(
array(
- 'lock_text' => __( 'This content has been restricted to logged-in users only. Please login to view this content.', 'ultimate-member' ),
+ 'lock_text' => __( 'This content has been restricted to logged-in users only. Please log in to view this content.', 'ultimate-member' ),
'show_lock' => 'yes',
),
$args,
diff --git a/includes/core/class-user.php b/includes/core/class-user.php
index 630bc515..56063cea 100644
--- a/includes/core/class-user.php
+++ b/includes/core/class-user.php
@@ -1,6 +1,9 @@
@@ -1468,22 +1471,6 @@ if ( ! class_exists( 'um\core\User' ) ) {
do_action( 'um_after_save_registration_details', $this->id, $submitted, $form_data );
}
- /**
- * Set last login for new registered users
- */
- public function set_last_login() {
- update_user_meta( $this->id, '_um_last_login', current_time( 'mysql', true ) );
- }
-
- /**
- * @param \WP_User $userdata
- *
- * @return string|\WP_Error
- */
- function maybe_generate_password_reset_key( $userdata ) {
- return get_password_reset_key( $userdata );
- }
-
/**
* Password reset email
*
@@ -1497,19 +1484,22 @@ if ( ! class_exists( 'um\core\User' ) ) {
}
$userdata = get_userdata( $user_id );
- $this->maybe_generate_password_reset_key( $userdata );
-
- $mail_args = array(
- 'fetch_user_id' => $user_id,
- 'tags' => array(
- '{password_reset_link}',
- ),
- 'tags_replace' => array(
- UM()->password()->reset_url( $user_id ),
- ),
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $userdata->user_email,
+ 'resetpw_email',
+ array(
+ 'fetch_user_id' => $user_id,
+ 'tags' => array(
+ '{password_reset_link}',
+ ),
+ 'tags_replace' => array(
+ UM()->password()->reset_url( $user_id ),
+ ),
+ ),
+ )
);
-
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $userdata->user_email, 'resetpw_email', $mail_args ) );
}
/**
@@ -2121,30 +2111,6 @@ if ( ! class_exists( 'um\core\User' ) ) {
return $hash_email_address;
}
- /**
- * UM Placeholders for activation link in email
- *
- * @param $placeholders
- *
- * @return array
- */
- public function add_activation_placeholder( $placeholders ) {
- $placeholders[] = '{account_activation_link}';
- return $placeholders;
- }
-
- /**
- * UM Replace Placeholders for activation link in email
- *
- * @param $replace_placeholders
- *
- * @return array
- */
- public function add_activation_replace_placeholder( $replace_placeholders ) {
- $replace_placeholders[] = um_user( 'account_activation_link' );
- return $replace_placeholders;
- }
-
/**
* Set user's account status
*
@@ -2240,5 +2206,53 @@ if ( ! class_exists( 'um\core\User' ) ) {
_deprecated_function( __METHOD__, '2.8.7', 'UM()->common()->users()->deactivate()' );
UM()->common()->users()->deactivate( um_user( 'ID' ) );
}
+
+ /**
+ * @deprecated 2.10.5
+ *
+ * @param WP_User $userdata
+ *
+ * @return string|WP_Error
+ */
+ public function maybe_generate_password_reset_key( $userdata ) {
+ _deprecated_function( __METHOD__, '2.10.5', 'UM()->common()->users()->maybe_generate_password_reset_key()' );
+ return UM()->common()->users()->maybe_generate_password_reset_key( $userdata );
+ }
+
+ /**
+ * Set last login for new registered users
+ *
+ * @deprecated 2.10.5
+ *
+ * @return void
+ */
+ public function set_last_login() {
+ _deprecated_function( __METHOD__, '2.10.5', 'UM()->common()->users()->set_last_login()' );
+ UM()->common()->users()->set_last_login( $this->id );
+ }
+
+ /**
+ * UM Placeholders for activation link in email
+ * @deprecated 2.10.5
+ * @param $placeholders
+ *
+ * @return array
+ */
+ public function add_activation_placeholder( $placeholders ) {
+ _deprecated_function( __METHOD__, '2.10.5' );
+ return $placeholders;
+ }
+
+ /**
+ * UM Replace Placeholders for activation link in email
+ * @deprecated 2.10.5
+ * @param $replace_placeholders
+ *
+ * @return array
+ */
+ public function add_activation_replace_placeholder( $replace_placeholders ) {
+ _deprecated_function( __METHOD__, '2.10.5' );
+ return $replace_placeholders;
+ }
}
}
diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php
index 952ec739..82d251a1 100644
--- a/includes/core/um-actions-account.php
+++ b/includes/core/um-actions-account.php
@@ -329,11 +329,11 @@ function um_submit_account_details( $args ) {
}
if ( 'first_name' === $k || 'last_name' === $k || 'user_password' === $k ) {
- $v = sanitize_text_field( $v );
+ $v = sanitize_text_field( strip_shortcodes( $v ) );
} elseif ( 'user_email' === $k ) {
- $v = sanitize_email( $v );
+ $v = sanitize_email( strip_shortcodes( $v ) );
} elseif ( 'hide_in_members' === $k || 'um_show_last_login' === $k ) {
- $v = array_map( 'sanitize_text_field', $v );
+ $v = array_map( 'sanitize_text_field', array_map( 'strip_shortcodes', $v ) );
}
$changes[ $k ] = $v;
diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php
index 097ab0c4..74c592af 100644
--- a/includes/core/um-actions-form.php
+++ b/includes/core/um-actions-form.php
@@ -923,6 +923,7 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) {
$email_exists = email_exists( $submitted_data[ $key ] );
if ( '' === $submitted_data[ $key ] ) {
+ // Primary email should be required everytime.
UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) );
} elseif ( 'register' === $mode && $email_exists ) {
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
@@ -936,16 +937,28 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) {
break;
}
- if ( '' === $submitted_data[ $key ] ) {
+ if ( ! empty( $array['required'] ) && '' === $submitted_data[ $key ] ) {
UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) );
} elseif ( ! is_email( $submitted_data[ $key ] ) || email_exists( $submitted_data[ $key ] ) ) {
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
+ } elseif ( 'secondary_user_email' === $key && ! empty( $submitted_data[ $key ] ) && ! empty( $submitted_data['user_email'] ) && $submitted_data[ $key ] === $submitted_data['user_email'] ) {
+ UM()->form()->add_error( $key, __( 'The secondary email cannot be the same as primary', 'ultimate-member' ) );
} else {
// There we have valid and unique user_email. But need to check in usermeta table for other users.
- $users = get_users( 'meta_value=' . $submitted_data[ $key ] );
- foreach ( $users as $user ) {
- if ( $user->ID !== $submitted_data['user_id'] ) {
+ $args = array(
+ 'meta_query' => array(
+ array(
+ 'key' => $key,
+ 'value' => sanitize_email( $submitted_data[ $key ] ),
+ ),
+ ),
+ );
+
+ $the_similar_users = get_users( $args );
+ foreach ( $the_similar_users as $user ) {
+ if ( empty( $submitted_data['user_id'] ) || absint( $user->ID ) !== absint( $submitted_data['user_id'] ) ) {
UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) );
+ break;
}
}
}
diff --git a/includes/core/um-actions-login.php b/includes/core/um-actions-login.php
index 42cac3e0..28fa6df5 100644
--- a/includes/core/um-actions-login.php
+++ b/includes/core/um-actions-login.php
@@ -157,11 +157,9 @@ add_action( 'um_submit_form_errors_hook_logincheck', 'um_submit_form_errors_hook
* @param $user_id
*/
function um_store_lastlogin_timestamp( $user_id ) {
- update_user_meta( $user_id, '_um_last_login', current_time( 'mysql', true ) );
- // Flush user cache after updating last_login timestamp.
- UM()->user()->remove_cache( $user_id );
+ UM()->common()->users()->set_last_login( $user_id );
}
-add_action( 'um_on_login_before_redirect', 'um_store_lastlogin_timestamp', 10, 1 );
+add_action( 'um_on_login_before_redirect', 'um_store_lastlogin_timestamp' );
/**
@@ -171,7 +169,7 @@ function um_store_lastlogin_timestamp_( $login ) {
$user = get_user_by( 'login', $login );
if ( false !== $user ) {
- um_store_lastlogin_timestamp( $user->ID );
+ UM()->common()->users()->set_last_login( $user->ID );
$attempts = (int) get_user_meta( $user->ID, 'password_rst_attempts', true );
if ( $attempts ) {
@@ -362,6 +360,27 @@ function um_add_submit_button_to_login( $args ) {
if ( ! isset( $primary_btn_word ) || $primary_btn_word == '' ){
$primary_btn_word = UM()->options()->get( 'login_primary_btn_word' );
}
+ /**
+ * Filters the classes applied to the primary button on the login form.
+ *
+ * @hook um_login_form_primary_btn_classes
+ * @since 2.10.5
+ *
+ * @param {array} $classes An array of CSS classes applied to the primary button.
+ * @param {array} $args An array of arguments or configurations used in the login form.
+ *
+ * @return {array} Button CSS classes.
+ *
+ * @example Extend the classes applied to the primary button on the login form.
+ * function my_custom_classes( $classes, $args ) {
+ * // Add a new class to the button
+ * $classes[] = 'new-button-class';
+ *
+ * return $classes;
+ * }
+ * add_filter( 'um_login_form_primary_btn_classes', 'my_custom_classes', 10, 2 );
+ */
+ $primary_btn_classes = apply_filters( 'um_login_form_primary_btn_classes', array( 'um-button' ), $args );
/**
* UM hook
@@ -426,7 +445,7 @@ function um_add_submit_button_to_login( $args ) {
if ( ! empty( $args['secondary_btn'] ) ) { ?>
-
+
@@ -437,7 +456,7 @@ function um_add_submit_button_to_login( $args ) {
-
+
diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php
index 007101e8..bbc783b3 100644
--- a/includes/core/um-actions-register.php
+++ b/includes/core/um-actions-register.php
@@ -120,15 +120,27 @@ function um_send_registration_notification( $user_id ) {
um_fetch_user( $user_id );
$registration_status = um_user( 'status' );
+ $email_template = 'pending' !== $registration_status ? 'notification_new_user' : 'notification_review';
+ $sending_args = array(
+ 'admin' => true,
+ 'fetch_user_id' => $user_id,
+ 'tags' => array(
+ '{submitted_registration}',
+ ),
+ 'tags_replace' => um_user_submitted_registration_formatted(),
+ );
$emails = um_multi_admin_email();
if ( ! empty( $emails ) ) {
foreach ( $emails as $email ) {
- if ( 'pending' !== $registration_status ) {
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $email, 'notification_new_user', array( 'admin' => true, 'fetch_user_id' => $user_id ) ) );
- } else {
- UM()->maybe_action_scheduler()->enqueue_async_action( 'um_dispatch_email', array( $email, 'notification_review', array( 'admin' => true, 'fetch_user_id' => $user_id ) ) );
- }
+ UM()->maybe_action_scheduler()->enqueue_async_action(
+ 'um_dispatch_email',
+ array(
+ $email,
+ $email_template,
+ $sending_args,
+ )
+ );
}
}
}
@@ -597,6 +609,28 @@ function um_add_submit_button_to_register( $args ) {
$primary_btn_word = UM()->options()->get( 'register_primary_btn_word' );
}
+ /**
+ * Filters the classes applied to the primary button on the registration form.
+ *
+ * @hook um_register_form_primary_btn_classes
+ * @since 2.10.5
+ *
+ * @param {array} $classes An array of CSS classes applied to the primary button.
+ * @param {array} $args An array of arguments or configurations used in the registration form.
+ *
+ * @return {array} Button CSS classes.
+ *
+ * @example Extend the classes applied to the primary button on the registration form.
+ * function my_custom_classes( $classes, $args ) {
+ * // Add a new class to the button
+ * $classes[] = 'new-button-class';
+ *
+ * return $classes;
+ * }
+ * add_filter( 'um_register_form_primary_btn_classes', 'my_custom_classes', 10, 2 );
+ */
+ $primary_btn_classes = apply_filters( 'um_register_form_primary_btn_classes', array( 'um-button' ), $args );
+
$secondary_btn_word = $args['secondary_btn_word'];
/**
* UM hook
@@ -656,7 +690,7 @@ function um_add_submit_button_to_register( $args ) {
-
+
@@ -667,7 +701,7 @@ function um_add_submit_button_to_register( $args ) {
-
+
diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php
index df0c93da..45ac1b56 100644
--- a/includes/um-short-functions.php
+++ b/includes/um-short-functions.php
@@ -208,7 +208,7 @@ function um_convert_tags( $content, $args = array(), $with_kses = true ) {
// Support for all usermeta keys
if ( ! empty( $matches[1] ) && is_array( $matches[1] ) ) {
foreach ( $matches[1] as $match ) {
- $key = str_replace( 'usermeta:', '', $match );
+ $key = str_replace( 'usermeta:', '', $match );
$value = um_user( $key );
if ( is_array( $value ) ) {
$value = implode( ', ', $value );
@@ -219,32 +219,6 @@ function um_convert_tags( $content, $args = array(), $with_kses = true ) {
return $content;
}
-
-/**
- * UM Placeholders for activation link in email
- *
- * @param $placeholders
- *
- * @return array
- */
-function account_activation_link_tags_patterns( $placeholders ) {
- $placeholders[] = '{account_activation_link}';
- return $placeholders;
-}
-
-/**
- * UM Replace Placeholders for activation link in email
- *
- * @param $replace_placeholders
- *
- * @return array
- */
-function account_activation_link_tags_replaces( $replace_placeholders ) {
- $replace_placeholders[] = um_user( 'account_activation_link' );
- return $replace_placeholders;
-}
-
-
/**
* @function um_user_ip()
*
@@ -2583,12 +2557,12 @@ function um_user( $data, $attrs = null ) {
break;
case 'password_reset_link':
+ // Avoid using and make it directly with `UM()->password()->reset_url( $user_id )`
return UM()->password()->reset_url();
- break;
case 'account_activation_link':
+ // Avoid using and make it directly with `UM()->permalinks()->activate_url( $user_id )`
return UM()->permalinks()->activate_url();
- break;
case 'profile_photo':
$data = um_get_user_avatar_data( um_user( 'ID' ), $attrs );
diff --git a/readme.txt b/readme.txt
index e22d12d7..11c7e4d5 100644
--- a/readme.txt
+++ b/readme.txt
@@ -6,7 +6,7 @@ Tags: community, member, membership, user-profile, user-registration
Requires PHP: 7.0
Requires at least: 6.2
Tested up to: 6.8
-Stable tag: 2.10.4
+Stable tag: 2.10.5
License: GPLv3
License URI: http://www.gnu.org/licenses/gpl-3.0.txt
@@ -167,6 +167,31 @@ No specific extensions are needed. But we highly recommended keep active these P
IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION
+= 2.10.5 2025-06-25 =
+
+**Enhancements**
+
+* Added: Filter hooks for primary button classes in UM forms.
+* Tweak: Refactored Site Health data, added hooks for 3rd-party integration.
+
+**Bugfixes**
+
+* Fixed: Stripped shortcodes in the user data during the Account, Registration and Profile forms submission. (Thanks to [MissVeronica](https://github.com/MissVeronica))
+* Fixed: Email placeholders values.
+* Fixed: Refactor deactivation logic to un-schedule Action Scheduler actions.
+* Fixed: Action Scheduler library errors. Updated to the recent 3.9.2 version.
+* Fixed: Secondary email field validation.
+* Fixed: Action Scheduler batch actions with users who have Undefined status.
+* Fixed: Restrictions for 3rd-party Gutenberg Blocks.
+* Fixed: Date/time picker filter-types range query on Member Directories.
+* Fixed: Renamed "Macedonia, the former Yugoslav Republic of" to the official "North Macedonia".
+
+**Templates required update**
+
+* password-reset.php
+
+**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade**
+
= 2.10.4 2025-05-15 =
**Bugfixes**
diff --git a/templates/password-reset.php b/templates/password-reset.php
index 6dcf9cb8..0984a2f7 100644
--- a/templates/password-reset.php
+++ b/templates/password-reset.php
@@ -6,17 +6,18 @@
*
* Call: function ultimatemember_password()
*
- * @version 2.7.0
+ * @version 2.10.5
*
* @var string $mode
* @var int $form_id
* @var array $args
+ *
+ * phpcs:disable WordPress.Security.NonceVerification
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
-