diff --git a/assets/css/um-styles.css b/assets/css/um-styles.css index cf14a51a..a32f88f3 100644 --- a/assets/css/um-styles.css +++ b/assets/css/um-styles.css @@ -482,6 +482,11 @@ p.um-notice.warning a { padding-right: 40px !important; } +.um-form .um-field-area-password input[type="password"]::-ms-reveal, +.um-form .um-field-area-password input[type="password"]::-ms-clear { + display: none; +} + .um-form input[type="number"] { width: auto; padding: 0 0 0 5px !important; diff --git a/assets/css/um-styles.min.css b/assets/css/um-styles.min.css index a821a8e0..d6172e41 100644 --- a/assets/css/um-styles.min.css +++ b/assets/css/um-styles.min.css @@ -1 +1 @@ -.um:not(.um-admin){width:100%;text-align:left;box-sizing:border-box;color:#666;font-size:15px;margin-bottom:30px!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;opacity:0}.um-s1,.um-s2{display:none}.um:not(.um-admin) :after,.um:not(.um-admin) :before{box-sizing:content-box}.um-account-side li a,.um-cover a,.um-field-value a,.um-header a,.um-member-less a,.um-member-more a,.um-member-name a,.um-member-photo a,.um-members a,.um-members-pagi a,.um-members-pagi span{border-bottom:0!important}.um-modal a:focus,.um:not(.um-admin) a:focus{outline:0!important}.um:not(.um-admin) a .image-overlay,.um:not(.um-admin) a:hover .image-overlay,.um:not(.um-admin) a:hover .image-overlay *{display:none!important;width:0!important;height:0!important;position:static!important}.um.um-in-admin{padding-top:0}.um.um-in-admin .um-tip{display:none!important}.um:not(.um-admin):not(.um-directory) input,.um:not(.um-admin):not(.um-directory) select,.um:not(.um-admin):not(.um-directory) textarea{font-size:15px}.um:not(.um-admin) *{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.um-left{float:left}.um-right{float:right}.um-clear{clear:both}.um-center{text-align:center}.um-center .um-button{display:inline-block!important;width:auto!important;min-width:250px!important}.um-half{width:48%}.um-field-half{width:48%;float:left}.um-field-half.right{float:right}.um-field-tri{width:30%;float:left;margin-right:3%}.um img{box-shadow:none!important}.um-col{padding-bottom:20px}.um-col-alt{margin:15px 0 5px 0}.um-col-alt-s{padding-top:10px}.um-col-alt-b{padding-top:20px}.um-col-121{float:left;width:48%}.um-col-122{float:right;width:48%}.um-col-131{float:left;width:30%}.um-col-132{float:left;width:30%;margin:0 5%}.um-col-133{float:left;width:30%}.um-raty i{font-size:26px}.um-field-half .um-raty i{font-size:21px}.um-field-tri .um-raty i{font-size:21px}.um-button i{font-size:22px;width:22px;height:12px!important;display:inline-block;line-height:12px!important;vertical-align:middle!important;position:relative;top:-6px;margin-right:8px}.um-row-heading{padding:5px 0;font-size:16px}.um-row-heading i{font-size:24px;height:24px;line-height:24px;margin:0 12px 0 0;display:inline-block;width:30px;text-align:center}.um-row-heading i:before{vertical-align:middle!important}p.um-notice{width:auto;color:#fff;box-sizing:border-box;font-size:15px;padding:12px!important;margin:12px 0 0 0!important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative}p.um-notice a{color:#fff;text-decoration:underline}p.um-notice i{position:absolute;right:14px;font-size:36px;cursor:pointer;top:7px;display:block;height:30px;line-height:30px}p.um-notice.success{background:#7acf58}p.um-notice.err{background:#c74a4a}p.um-notice.warning{background:#f9f9d1;color:#666;border:1px solid #efe4a2;padding:8px 15px!important}p.um-notice.warning a{color:#666;text-decoration:underline}.um-field-error{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:12px 0 0 0}.um-field-error a{color:#fff!important;text-decoration:underline!important}.um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#c74a4a;font-size:28px;line-height:1em!important}.um-error-block{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-field-notice{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:5px 0 0 0}.um-field-notice a{color:#fff!important;text-decoration:underline!important}.um-field-notice .um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#497bc7!important;font-size:28px;line-height:1em!important}.um-notice-block{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-tip{margin:0 0 0 8px;cursor:pointer;display:inline-block;position:relative;top:3px}.um-tip i{font-size:22px;height:22px;line-height:22px;display:block;position:relative}.um-tip-text{display:block;font-size:13px;line-height:15px;color:#999}.um-form button::-moz-focus-inner,.um-form input::-moz-focus-inner{border:0!important;padding:0!important}.um-field{position:relative;padding:15px 0 0 0}.um-field-b,.um-field-c{padding-top:0!important}.um-field-label{display:block;margin:0 0 8px 0}.um-field-label .um-field-label-icon{float:left;margin:0 8px 0 0;height:22px;line-height:18px;display:inline-block;width:24px;text-align:center}.um-field-label .um-field-label-icon i{font-size:22px;position:relative;top:1px}.um-field-label label{font-size:15px!important;line-height:22px!important;font-weight:600}.um-field-area{position:relative;word-wrap:break-word}.um-field-area-password{position:relative}.um-toggle-password{cursor:pointer;display:block;position:absolute;right:0;top:0;height:100%;width:40px;text-align:center;box-sizing:border-box;font-size:20px;line-height:2}.um-toggle-password i{transition:all .2s linear}.um-toggle-password:hover i{color:#44b0ec}.um-field-value p{margin:0 0 6px 0!important;padding:0}.um-field-block{color:#777;font-size:17px}.um-field-spacing{width:100%}.um-field-divider{width:100%;margin:0 0 12px 0;height:24px;position:relative}.um-field-divider-text{position:absolute;width:100%;text-align:center;bottom:-24px;left:0;font-size:16px;padding:10px 0}.um-field-divider-text span{background:#fff;color:#555;display:inline-block;padding:0 15px}.um-field-icon{position:absolute;cursor:default;text-align:center!important;top:2px;left:0;width:44px;font-size:22px;line-height:1.7em;z-index:1}.um-form input[type=number],.um-form input[type=password],.um-form input[type=search],.um-form input[type=tel],.um-form input[type=text]{padding:0 12px!important;width:100%;display:block!important;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;outline:0!important;cursor:text!important;font-size:15px!important;height:40px!important;box-sizing:border-box!important;box-shadow:none!important;margin:0!important;position:static}.um-form .um-field-area-password input[type=password]{padding-right:40px!important}.um-form input[type=number]{width:auto;padding:0 0 0 5px!important;height:30px!important}.um-form input[type=number]:focus,.um-form input[type=password]:focus,.um-form input[type=search]:focus,.um-form input[type=tel]:focus,.um-form input[type=text]:focus,.um-form textarea:focus{box-shadow:none!important;outline:0!important}.um-form input[type=password].um-iconed,.um-form input[type=tel].um-iconed,.um-form input[type=text].um-iconed{padding-left:44px!important}.um-form input[type=password].um-error,.um-form input[type=tel].um-error,.um-form input[type=text].um-error{border-color:#c74a4a!important}.um-form textarea{width:100%;padding:8px 12px!important;display:block;font-size:15px!important;line-height:22px!important;background:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;box-sizing:border-box;min-height:80px!important;box-shadow:none;outline:0!important}.um-form .um-meta-text textarea{max-width:100%}.um-form .wp-editor-container{border:1px solid #ddd}.um-form .wp-editor-container textarea{background:#ddd!important;color:#222!important;border-radius:0}.um-field-c .um-field-checkbox{margin-bottom:14px;margin-top:0!important;position:relative}.um-field-checkbox:not(.um-field),.um-field-radio:not(.um-field){display:block;margin:8px 0;position:relative}.um-profile.um-editing .um-field-checkbox,.um-profile.um-editing .um-field-radio{cursor:pointer!important}.um-field-checkbox:hover i,.um-field-radio:hover i{color:#666}.um-field-checkbox input,.um-field-radio input{opacity:0!important;display:inline!important;width:0!important;float:left}.um-field-checkbox-state,.um-field-radio-state{position:absolute;top:0;left:1px;width:24px;height:24px}.um-field-checkbox-state i,.um-field-radio-state i{font-size:24px;line-height:24px;height:24px;color:#aaa;transition:all .2s linear}.um-field-checkbox-option,.um-field-radio-option{margin:0 0 0 36px;line-height:24px;color:#888!important;display:block}.um-field-group{margin-top:20px}.um-field-group-head{cursor:pointer;color:#fff;font-size:16px;line-height:22px;padding:10px 20px;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;border-top:1px solid transparent!important;border-bottom:2px solid rgba(0,0,0,.1)!important}.um-field-group-head i{font-size:20px;margin:0 8px 0 0}.um-field-group-head i:before{vertical-align:middle!important}.um-field-group-body{display:none;margin:15px 0 0 0;padding:15px 20px 5px 20px;background:#f9f9f9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative;box-sizing:border-box;width:100%}.um-field-group-body div.um-field{padding:0 0 15px 0}.um-field-group-cancel{font-size:18px;position:absolute;z-index:800;right:8px;top:8px;color:#ccc!important;text-decoration:none!important}.um-field-group-cancel:hover{color:#777!important}.um div.disabled,.um input[type=number]:disabled,.um input[type=submit]:disabled,.um input[type=text]:disabled,.um-disabled{opacity:.6!important;cursor:no-drop!important}input[type=submit].um-button,input[type=submit].um-button:focus{vertical-align:middle!important;height:auto!important;font-size:15px;cursor:pointer!important;width:100%;box-shadow:none;text-shadow:none;font-family:inherit;outline:0!important;margin:0;opacity:1;-webkit-appearance:none}input[type=submit].um-button:hover{opacity:1}.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button:hover{-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.um-button.um-btn-auto-width{width:auto;display:inline-block;padding:14px 20px!important;min-width:200px;max-width:450px}a.um-link-alt{line-height:22px;color:#888!important;display:block!important;text-decoration:none!important;font-weight:400;text-align:center;border-bottom:none!important}a.um-link-alt:hover{text-decoration:underline!important}.um-dropdown{position:absolute;height:auto;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;z-index:55;display:none;border:1px solid #e5e5e5;box-sizing:border-box;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 1px rgba(0,0,0,.1)}.um-dropdown li,.um-dropdown ul{list-style-type:none!important;padding:0!important;margin:0!important}.um-dropdown ul{background:#fff;position:relative;z-index:16}.um-dropdown li a{display:block;padding:8px 12px;color:#666;font-size:14px;line-height:18px}.um-dropdown li:last-child a{border-top:1px solid #e5e5e5;padding:12px}.um-dropdown-b{position:relative}.um-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-dropdown-arr *{display:block!important;width:24px!important;height:24px!important;vertical-align:bottom!important;overflow:hidden!important;line-height:24px!important}div.um-photo{margin:20px auto 0 auto;text-align:center;box-sizing:border-box;max-width:100%}div.um-photo,div.um-photo a,div.um-photo img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.um-photo a{border:1px solid #e5e5e5;padding:5px;box-sizing:border-box;display:inline-block;box-shadow:0 1px 1px #eee;margin:0 auto;max-width:100%}div.um-photo img{max-height:300px;max-width:100%}span.um-req{margin:0 0 0 8px;font-size:14px;display:inline-block}small.um-max-filesize{display:block;color:#999;padding-top:5px}small.um-max-filesize span{font-size:12px}.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus{border-color:#db2929!important}.um-form .um-field .um-field-area input.um-searching-username{background-image:url(../img/loading.gif);background-position:right center;background-repeat:no-repeat;background-size:24px 24px}.um-search-area{position:relative;max-width:300px}.um-search-area .um-search-field{width:100%;margin:0;padding-left:25px}.rtl .um-search-area .um-search-field{padding-right:25px;padding-left:initial}.um-search-area .um-search-icon{position:absolute;height:100%;left:6px;top:0}.rtl .um-search-area .um-search-icon{right:6px;left:initial}.um-faicon-search:before{display:flex;align-items:center;justify-content:center;height:100%}.um-field .select2-container.select2-container--open,.um-search-filter .select2-container.select2-container--open{z-index:9999999}.um-field .select2.select2-container .select2-selection,.um-search-filter .select2.select2-container .select2-selection{display:block!important;height:40px;padding:0 0 0 12px!important;overflow:hidden!important;position:relative!important;white-space:nowrap!important;line-height:35px!important;color:#666!important;font-size:15px!important;-moz-border-radius:2px!important;-webkit-border-radius:2px!important;border-radius:2px!important;background-clip:padding-box!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff!important;border:1px solid #ddd!important}.rtl .um-field .select2.select2-container .select2-selection,.rtl .um-search-filter .select2.select2-container .select2-selection{padding:0 12px 0 0!important}.um-field .select2.select2-container .select2-selection .select2-selection__arrow,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{display:inline-block!important;width:34px!important;height:100%!important;position:absolute;right:0;top:0;text-align:center;background:0 0!important;border:none!important}.rtl .um-field .select2.select2-container .select2-selection .select2-selection__arrow,.rtl .um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{right:initial;left:0}.um-field .select2.select2-container .select2-selection .select2-selection__arrow:before,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow:before{content:"\f3d0"!important;font-size:28px!important;font-family:Ionicons!important;display:block;height:100%;line-height:40px;min-width:1em;text-align:center;color:#aaa}.um-field .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation],.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation]{display:none}.um-field .select2-container.select2-container--open .select2-dropdown,.um-search-filter .select2-container.select2-container--open .select2-dropdown{border:1px solid #ddd!important;border-radius:0}.um-field .select2-container.select2-container--open .select2-dropdown .select2-results li,.um-search-filter .select2-container.select2-container--open .select2-dropdown .select2-results li{list-style:none;display:list-item;background:0 0;font-size:15px;margin:5px!important;color:#666!important;padding:3px 7px 4px!important;cursor:pointer;min-height:1em}.um-field .select2.select2-container .select2-selection.select2-selection--multiple,.um-search-filter .select2.select2-container .select2-selection.select2-selection--multiple{height:auto!important;line-height:.8!important;min-height:40px;padding-bottom:4px!important}.um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:37px;padding-left:0;padding-right:24px}.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:24px;padding-right:0}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{line-height:37px;box-sizing:border-box;list-style:none;margin:0;padding-left:0;padding-right:30px;width:100%;font-size:13px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:30px;padding-right:0}.um-field .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted,.um-search-filter .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted{background:#f4f4f4;color:#666}.um-field .select2-dropdown .select2-results li.select2-results__option[aria-selected=true],.um-search-filter .select2-dropdown .select2-results li.select2-results__option[aria-selected=true]{background-color:#ddd}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-field .select2-container--default .select2-selection--single .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{color:#aaa;font-size:28px;font-weight:400;line-height:34px;margin:0!important;right:0;text-align:center;width:1em}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{left:0;right:initial}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear{position:absolute}.um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 5px 0 0;max-height:28px;padding:3px 3px 3px 5px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 0 0 5px;padding:3px 5px 3px 3px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 5px 0 0;padding:0}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 0 0 5px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input{border:none!important;padding:0!important;max-height:28px}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered li,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered li{overflow-x:hidden;text-overflow:ellipsis;max-width:100%;box-sizing:border-box;line-height:20px}.um-field-multiselect .um-field-area .um-field-icon,.um-field-select .um-field-area .um-field-icon{z-index:99999999}.um-field-select .um-field-area.um-field-area-has-icon .select2-selection__rendered{text-indent:20px}.um-field-multiselect .um-field-area.um-field-area-has-icon ul:first-child{margin-left:30px!important}.um-field-area .wp-switch-editor{float:none;height:auto} \ No newline at end of file +.um:not(.um-admin){width:100%;text-align:left;box-sizing:border-box;color:#666;font-size:15px;margin-bottom:30px!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;opacity:0}.um-s1,.um-s2{display:none}.um:not(.um-admin) :after,.um:not(.um-admin) :before{box-sizing:content-box}.um-account-side li a,.um-cover a,.um-field-value a,.um-header a,.um-member-less a,.um-member-more a,.um-member-name a,.um-member-photo a,.um-members a,.um-members-pagi a,.um-members-pagi span{border-bottom:0!important}.um-modal a:focus,.um:not(.um-admin) a:focus{outline:0!important}.um:not(.um-admin) a .image-overlay,.um:not(.um-admin) a:hover .image-overlay,.um:not(.um-admin) a:hover .image-overlay *{display:none!important;width:0!important;height:0!important;position:static!important}.um.um-in-admin{padding-top:0}.um.um-in-admin .um-tip{display:none!important}.um:not(.um-admin):not(.um-directory) input,.um:not(.um-admin):not(.um-directory) select,.um:not(.um-admin):not(.um-directory) textarea{font-size:15px}.um:not(.um-admin) *{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.um-left{float:left}.um-right{float:right}.um-clear{clear:both}.um-center{text-align:center}.um-center .um-button{display:inline-block!important;width:auto!important;min-width:250px!important}.um-half{width:48%}.um-field-half{width:48%;float:left}.um-field-half.right{float:right}.um-field-tri{width:30%;float:left;margin-right:3%}.um img{box-shadow:none!important}.um-col{padding-bottom:20px}.um-col-alt{margin:15px 0 5px 0}.um-col-alt-s{padding-top:10px}.um-col-alt-b{padding-top:20px}.um-col-121{float:left;width:48%}.um-col-122{float:right;width:48%}.um-col-131{float:left;width:30%}.um-col-132{float:left;width:30%;margin:0 5%}.um-col-133{float:left;width:30%}.um-raty i{font-size:26px}.um-field-half .um-raty i{font-size:21px}.um-field-tri .um-raty i{font-size:21px}.um-button i{font-size:22px;width:22px;height:12px!important;display:inline-block;line-height:12px!important;vertical-align:middle!important;position:relative;top:-6px;margin-right:8px}.um-row-heading{padding:5px 0;font-size:16px}.um-row-heading i{font-size:24px;height:24px;line-height:24px;margin:0 12px 0 0;display:inline-block;width:30px;text-align:center}.um-row-heading i:before{vertical-align:middle!important}p.um-notice{width:auto;color:#fff;box-sizing:border-box;font-size:15px;padding:12px!important;margin:12px 0 0 0!important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative}p.um-notice a{color:#fff;text-decoration:underline}p.um-notice i{position:absolute;right:14px;font-size:36px;cursor:pointer;top:7px;display:block;height:30px;line-height:30px}p.um-notice.success{background:#7acf58}p.um-notice.err{background:#c74a4a}p.um-notice.warning{background:#f9f9d1;color:#666;border:1px solid #efe4a2;padding:8px 15px!important}p.um-notice.warning a{color:#666;text-decoration:underline}.um-field-error{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:12px 0 0 0}.um-field-error a{color:#fff!important;text-decoration:underline!important}.um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#c74a4a;font-size:28px;line-height:1em!important}.um-error-block{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-field-notice{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:5px 0 0 0}.um-field-notice a{color:#fff!important;text-decoration:underline!important}.um-field-notice .um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#497bc7!important;font-size:28px;line-height:1em!important}.um-notice-block{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-tip{margin:0 0 0 8px;cursor:pointer;display:inline-block;position:relative;top:3px}.um-tip i{font-size:22px;height:22px;line-height:22px;display:block;position:relative}.um-tip-text{display:block;font-size:13px;line-height:15px;color:#999}.um-form button::-moz-focus-inner,.um-form input::-moz-focus-inner{border:0!important;padding:0!important}.um-field{position:relative;padding:15px 0 0 0}.um-field-b,.um-field-c{padding-top:0!important}.um-field-label{display:block;margin:0 0 8px 0}.um-field-label .um-field-label-icon{float:left;margin:0 8px 0 0;height:22px;line-height:18px;display:inline-block;width:24px;text-align:center}.um-field-label .um-field-label-icon i{font-size:22px;position:relative;top:1px}.um-field-label label{font-size:15px!important;line-height:22px!important;font-weight:600}.um-field-area{position:relative;word-wrap:break-word}.um-field-area-password{position:relative}.um-toggle-password{cursor:pointer;display:block;position:absolute;right:0;top:0;height:100%;width:40px;text-align:center;box-sizing:border-box;font-size:20px;line-height:2}.um-toggle-password i{transition:all .2s linear}.um-toggle-password:hover i{color:#44b0ec}.um-field-value p{margin:0 0 6px 0!important;padding:0}.um-field-block{color:#777;font-size:17px}.um-field-spacing{width:100%}.um-field-divider{width:100%;margin:0 0 12px 0;height:24px;position:relative}.um-field-divider-text{position:absolute;width:100%;text-align:center;bottom:-24px;left:0;font-size:16px;padding:10px 0}.um-field-divider-text span{background:#fff;color:#555;display:inline-block;padding:0 15px}.um-field-icon{position:absolute;cursor:default;text-align:center!important;top:2px;left:0;width:44px;font-size:22px;line-height:1.7em;z-index:1}.um-form input[type=number],.um-form input[type=password],.um-form input[type=search],.um-form input[type=tel],.um-form input[type=text]{padding:0 12px!important;width:100%;display:block!important;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;outline:0!important;cursor:text!important;font-size:15px!important;height:40px!important;box-sizing:border-box!important;box-shadow:none!important;margin:0!important;position:static}.um-form .um-field-area-password input[type=password]{padding-right:40px!important}.um-form .um-field-area-password input[type=password]::-ms-clear,.um-form .um-field-area-password input[type=password]::-ms-reveal{display:none}.um-form input[type=number]{width:auto;padding:0 0 0 5px!important;height:30px!important}.um-form input[type=number]:focus,.um-form input[type=password]:focus,.um-form input[type=search]:focus,.um-form input[type=tel]:focus,.um-form input[type=text]:focus,.um-form textarea:focus{box-shadow:none!important;outline:0!important}.um-form input[type=password].um-iconed,.um-form input[type=tel].um-iconed,.um-form input[type=text].um-iconed{padding-left:44px!important}.um-form input[type=password].um-error,.um-form input[type=tel].um-error,.um-form input[type=text].um-error{border-color:#c74a4a!important}.um-form textarea{width:100%;padding:8px 12px!important;display:block;font-size:15px!important;line-height:22px!important;background:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;box-sizing:border-box;min-height:80px!important;box-shadow:none;outline:0!important}.um-form .um-meta-text textarea{max-width:100%}.um-form .wp-editor-container{border:1px solid #ddd}.um-form .wp-editor-container textarea{background:#ddd!important;color:#222!important;border-radius:0}.um-field-c .um-field-checkbox{margin-bottom:14px;margin-top:0!important;position:relative}.um-field-checkbox:not(.um-field),.um-field-radio:not(.um-field){display:block;margin:8px 0;position:relative}.um-profile.um-editing .um-field-checkbox,.um-profile.um-editing .um-field-radio{cursor:pointer!important}.um-field-checkbox:hover i,.um-field-radio:hover i{color:#666}.um-field-checkbox input,.um-field-radio input{opacity:0!important;display:inline!important;width:0!important;float:left}.um-field-checkbox-state,.um-field-radio-state{position:absolute;top:0;left:1px;width:24px;height:24px}.um-field-checkbox-state i,.um-field-radio-state i{font-size:24px;line-height:24px;height:24px;color:#aaa;transition:all .2s linear}.um-field-checkbox-option,.um-field-radio-option{margin:0 0 0 36px;line-height:24px;color:#888!important;display:block}.um-field-group{margin-top:20px}.um-field-group-head{cursor:pointer;color:#fff;font-size:16px;line-height:22px;padding:10px 20px;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;border-top:1px solid transparent!important;border-bottom:2px solid rgba(0,0,0,.1)!important}.um-field-group-head i{font-size:20px;margin:0 8px 0 0}.um-field-group-head i:before{vertical-align:middle!important}.um-field-group-body{display:none;margin:15px 0 0 0;padding:15px 20px 5px 20px;background:#f9f9f9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative;box-sizing:border-box;width:100%}.um-field-group-body div.um-field{padding:0 0 15px 0}.um-field-group-cancel{font-size:18px;position:absolute;z-index:800;right:8px;top:8px;color:#ccc!important;text-decoration:none!important}.um-field-group-cancel:hover{color:#777!important}.um div.disabled,.um input[type=number]:disabled,.um input[type=submit]:disabled,.um input[type=text]:disabled,.um-disabled{opacity:.6!important;cursor:no-drop!important}input[type=submit].um-button,input[type=submit].um-button:focus{vertical-align:middle!important;height:auto!important;font-size:15px;cursor:pointer!important;width:100%;box-shadow:none;text-shadow:none;font-family:inherit;outline:0!important;margin:0;opacity:1;-webkit-appearance:none}input[type=submit].um-button:hover{opacity:1}.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button:hover{-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.um-button.um-btn-auto-width{width:auto;display:inline-block;padding:14px 20px!important;min-width:200px;max-width:450px}a.um-link-alt{line-height:22px;color:#888!important;display:block!important;text-decoration:none!important;font-weight:400;text-align:center;border-bottom:none!important}a.um-link-alt:hover{text-decoration:underline!important}.um-dropdown{position:absolute;height:auto;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;z-index:55;display:none;border:1px solid #e5e5e5;box-sizing:border-box;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 1px rgba(0,0,0,.1)}.um-dropdown li,.um-dropdown ul{list-style-type:none!important;padding:0!important;margin:0!important}.um-dropdown ul{background:#fff;position:relative;z-index:16}.um-dropdown li a{display:block;padding:8px 12px;color:#666;font-size:14px;line-height:18px}.um-dropdown li:last-child a{border-top:1px solid #e5e5e5;padding:12px}.um-dropdown-b{position:relative}.um-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-dropdown-arr *{display:block!important;width:24px!important;height:24px!important;vertical-align:bottom!important;overflow:hidden!important;line-height:24px!important}div.um-photo{margin:20px auto 0 auto;text-align:center;box-sizing:border-box;max-width:100%}div.um-photo,div.um-photo a,div.um-photo img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.um-photo a{border:1px solid #e5e5e5;padding:5px;box-sizing:border-box;display:inline-block;box-shadow:0 1px 1px #eee;margin:0 auto;max-width:100%}div.um-photo img{max-height:300px;max-width:100%}span.um-req{margin:0 0 0 8px;font-size:14px;display:inline-block}small.um-max-filesize{display:block;color:#999;padding-top:5px}small.um-max-filesize span{font-size:12px}.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus{border-color:#db2929!important}.um-form .um-field .um-field-area input.um-searching-username{background-image:url(../img/loading.gif);background-position:right center;background-repeat:no-repeat;background-size:24px 24px}.um-search-area{position:relative;max-width:300px}.um-search-area .um-search-field{width:100%;margin:0;padding-left:25px}.rtl .um-search-area .um-search-field{padding-right:25px;padding-left:initial}.um-search-area .um-search-icon{position:absolute;height:100%;left:6px;top:0}.rtl .um-search-area .um-search-icon{right:6px;left:initial}.um-faicon-search:before{display:flex;align-items:center;justify-content:center;height:100%}.um-field .select2-container.select2-container--open,.um-search-filter .select2-container.select2-container--open{z-index:9999999}.um-field .select2.select2-container .select2-selection,.um-search-filter .select2.select2-container .select2-selection{display:block!important;height:40px;padding:0 0 0 12px!important;overflow:hidden!important;position:relative!important;white-space:nowrap!important;line-height:35px!important;color:#666!important;font-size:15px!important;-moz-border-radius:2px!important;-webkit-border-radius:2px!important;border-radius:2px!important;background-clip:padding-box!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff!important;border:1px solid #ddd!important}.rtl .um-field .select2.select2-container .select2-selection,.rtl .um-search-filter .select2.select2-container .select2-selection{padding:0 12px 0 0!important}.um-field .select2.select2-container .select2-selection .select2-selection__arrow,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{display:inline-block!important;width:34px!important;height:100%!important;position:absolute;right:0;top:0;text-align:center;background:0 0!important;border:none!important}.rtl .um-field .select2.select2-container .select2-selection .select2-selection__arrow,.rtl .um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{right:initial;left:0}.um-field .select2.select2-container .select2-selection .select2-selection__arrow:before,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow:before{content:"\f3d0"!important;font-size:28px!important;font-family:Ionicons!important;display:block;height:100%;line-height:40px;min-width:1em;text-align:center;color:#aaa}.um-field .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation],.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation]{display:none}.um-field .select2-container.select2-container--open .select2-dropdown,.um-search-filter .select2-container.select2-container--open .select2-dropdown{border:1px solid #ddd!important;border-radius:0}.um-field .select2-container.select2-container--open .select2-dropdown .select2-results li,.um-search-filter .select2-container.select2-container--open .select2-dropdown .select2-results li{list-style:none;display:list-item;background:0 0;font-size:15px;margin:5px!important;color:#666!important;padding:3px 7px 4px!important;cursor:pointer;min-height:1em}.um-field .select2.select2-container .select2-selection.select2-selection--multiple,.um-search-filter .select2.select2-container .select2-selection.select2-selection--multiple{height:auto!important;line-height:.8!important;min-height:40px;padding-bottom:4px!important}.um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:37px;padding-left:0;padding-right:24px}.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:24px;padding-right:0}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{line-height:37px;box-sizing:border-box;list-style:none;margin:0;padding-left:0;padding-right:30px;width:100%;font-size:13px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:30px;padding-right:0}.um-field .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted,.um-search-filter .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted{background:#f4f4f4;color:#666}.um-field .select2-dropdown .select2-results li.select2-results__option[aria-selected=true],.um-search-filter .select2-dropdown .select2-results li.select2-results__option[aria-selected=true]{background-color:#ddd}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-field .select2-container--default .select2-selection--single .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{color:#aaa;font-size:28px;font-weight:400;line-height:34px;margin:0!important;right:0;text-align:center;width:1em}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{left:0;right:initial}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear{position:absolute}.um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 5px 0 0;max-height:28px;padding:3px 3px 3px 5px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 0 0 5px;padding:3px 5px 3px 3px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 5px 0 0;padding:0}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 0 0 5px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input{border:none!important;padding:0!important;max-height:28px}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered li,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered li{overflow-x:hidden;text-overflow:ellipsis;max-width:100%;box-sizing:border-box;line-height:20px}.um-field-multiselect .um-field-area .um-field-icon,.um-field-select .um-field-area .um-field-icon{z-index:99999999}.um-field-select .um-field-area.um-field-area-has-icon .select2-selection__rendered{text-indent:20px}.um-field-multiselect .um-field-area.um-field-area-has-icon ul:first-child{margin-left:30px!important}.um-field-area .wp-switch-editor{float:none;height:auto} \ No newline at end of file diff --git a/assets/js/common-frontend.js b/assets/js/common-frontend.js index fef49375..373bacb5 100644 --- a/assets/js/common-frontend.js +++ b/assets/js/common-frontend.js @@ -57,6 +57,7 @@ UM.frontend = { zoomable: false, rotatable: false, dashed: false, + scalable: false }; } else if ( 'cover' === crop_data ) { if ( Math.round( min_width / ratio ) > 0 ) { @@ -70,6 +71,7 @@ UM.frontend = { zoomable: false, rotatable: false, dashed: false, + scalable: false }; } else if ( 'user' === crop_data ) { opts = { @@ -80,6 +82,7 @@ UM.frontend = { zoomable: false, rotatable: false, dashed: false, + scalable: false }; } diff --git a/assets/js/common-frontend.min.js b/assets/js/common-frontend.min.js index aae402d3..5529d788 100644 --- a/assets/js/common-frontend.min.js +++ b/assets/js/common-frontend.min.js @@ -1 +1 @@ -"object"!=typeof window.UM&&(window.UM={}),"object"!=typeof UM.frontend&&(UM.frontend={}),UM.frontend={cropper:{obj:null,init:function(){var o=jQuery(".um-modal .um-single-image-preview img").first();if(o.length&&""!==o.attr("src")){UM.frontend.cropper.obj&&UM.frontend.cropper.destroy();var t=jQuery(".um-modal .um-single-image-preview"),r=o.parent().data("crop"),n=o.parent().data("min_width"),i=o.parent().data("min_height"),a=o.parent().data("ratio"),d=jQuery(".um-modal").find("#um_upload_single").data("ratio"),d=(d&&(a=d.split(":")[0]),jQuery(window).height()-(jQuery(".um-modal-footer a").height()+20)-50-jQuery(".um-modal-header:visible").height());o.css({height:"auto"}),t.css({height:"auto"}),jQuery(window).height()<=400?(t.css({height:d+"px","max-height":d+"px"}),o.css({height:"auto"})):(o.css({height:"auto","max-height":d+"px"}),t.css({height:o.height(),"max-height":d+"px"}));let e;"square"===r?e={minWidth:n,minHeight:i,dragCrop:!1,aspectRatio:1,zoomable:!1,rotatable:!1,dashed:!1}:"cover"===r?(0is_new_ui()` function for future enhancements related to new UI + - Added: Filter hook `um_before_user_submitted_registration_data` - Tweak: Changed hook's priority for initialization of email templates paths - Tweak: Removed `load_plugin_textdomain` due to (article)[https://make.wordpress.org/core/2024/10/21/i18n-improvements-6-7/#Enhanced-support-for-only-using-PHP-translation-files] * Bugfixes: + - Fixed: Security issue CVE ID: CVE-2025-0308 + - Fixed: Security issue CVE ID: CVE-2025-0318 - Fixed: Using placeholders in email templates when Action Scheduler is active. Using `fetch_user_id` attribute for fetching necessary user before sending email + - Fixed: PHP 8.4 compatibility. Using WordPress native `wp_is_mobile()` instead of MobileDetect library - Fixed: PHP errors related to `UM()->localize()` function - Fixed: PHP errors in user meta header when `last_update` meta is empty + - Fixed: Small CSS changes and avoid duplicates + - Fixed: Removed ms-native show password button for type="password" field in UM forms + - Fixed: Define scalable attribute for cropper * Deprecated: + - Fully deprecated `UM()->mobile()` function - Fully deprecated `UM()->localize()` function - Fully deprecated `um_language_textdomain` filter hook +* Templates required update: + + - account.php + * Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade = 2.9.1 November 15, 2024 = diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 24f6c8a3..bc1a3558 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -123,7 +123,7 @@ class Site_Health { 'title' => get_the_title( $form_id ), 'link' => get_edit_post_link( $form_id ), ); - $forms_count++; + ++$forms_count; continue 2; } } @@ -652,23 +652,27 @@ class Site_Health { 'value' => UM()->options()->get( 'reset_password_limit_number' ), ); } - $access_other_settings['um-change_password_request_limit'] = array( + $access_other_settings['um-change_password_request_limit'] = array( 'label' => __( 'Change Password request limit ', 'ultimate-member' ), 'value' => UM()->options()->get( 'change_password_request_limit' ), ); - $access_other_settings['um-blocked_emails'] = array( + $access_other_settings['um-only_approved_user_reset_password'] = array( + 'label' => __( 'Only approved user Reset Password', 'ultimate-member' ), + 'value' => UM()->options()->get( 'only_approved_user_reset_password' ), + ); + $access_other_settings['um-blocked_emails'] = array( 'label' => __( 'Blocked Email Addresses', 'ultimate-member' ), 'value' => stripslashes( $blocked_emails ), ); - $access_other_settings['um-blocked_words'] = array( + $access_other_settings['um-blocked_words'] = array( 'label' => __( 'Blacklist Words', 'ultimate-member' ), 'value' => stripslashes( $blocked_words ), ); - $access_other_settings['um-allowed_choice_callbacks'] = array( + $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( + $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'], ); diff --git a/includes/admin/core/class-admin-settings.php b/includes/admin/core/class-admin-settings.php index d8373b9f..0325d07b 100644 --- a/includes/admin/core/class-admin-settings.php +++ b/includes/admin/core/class-admin-settings.php @@ -262,7 +262,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { if ( 'publish' === get_post_status( $opt_value ) ) { $title = get_the_title( $opt_value ); $title = ( mb_strlen( $title ) > 50 ) ? mb_substr( $title, 0, 49 ) . '...' : $title; - $title = sprintf( __( '%s (ID: %s)', 'ultimate-member' ), $title, $opt_value ); + $title = sprintf( __( '%1$s (ID: %2$s)', 'ultimate-member' ), $title, $opt_value ); $options = array( $opt_value => $title ); $page_value = $opt_value; @@ -723,310 +723,313 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $settings_map = array_merge( $settings_map, array( - 'permalink_base' => array( + 'permalink_base' => array( 'sanitize' => 'key', ), - 'permalink_base_custom_meta' => array( + 'permalink_base_custom_meta' => array( 'sanitize' => 'text', ), - 'display_name' => array( + 'display_name' => array( 'sanitize' => 'key', ), - 'display_name_field' => array( + 'display_name_field' => array( 'sanitize' => 'text', ), - 'author_redirect' => array( + 'author_redirect' => array( 'sanitize' => 'bool', ), - 'members_page' => array( + 'members_page' => array( 'sanitize' => 'bool', ), - 'use_gravatars' => array( + 'use_gravatars' => array( 'sanitize' => 'bool', ), 'use_um_gravatar_default_builtin_image' => array( 'sanitize' => 'key', ), - 'use_um_gravatar_default_image' => array( + 'use_um_gravatar_default_image' => array( 'sanitize' => 'bool', ), - 'delete_comments' => array( + 'delete_comments' => array( 'sanitize' => 'bool', ), - 'toggle_password' => array( + 'toggle_password' => array( 'sanitize' => 'bool', ), - 'require_strongpass' => array( + 'require_strongpass' => array( 'sanitize' => 'bool', ), - 'password_min_chars' => array( + 'password_min_chars' => array( 'sanitize' => 'absint', ), - 'password_max_chars' => array( + 'password_max_chars' => array( 'sanitize' => 'absint', ), - 'profile_noindex' => array( + 'profile_noindex' => array( 'sanitize' => 'bool', ), - 'activation_link_expiry_time' => array( + 'activation_link_expiry_time' => array( 'sanitize' => 'empty_absint', ), - 'account_tab_password' => array( + 'account_tab_password' => array( 'sanitize' => 'bool', ), - 'account_tab_privacy' => array( + 'account_tab_privacy' => array( 'sanitize' => 'bool', ), - 'account_tab_delete' => array( + 'account_tab_delete' => array( 'sanitize' => 'bool', ), - 'delete_account_text' => array( + 'delete_account_text' => array( 'sanitize' => 'textarea', ), - 'delete_account_no_pass_required_text' => array( + 'delete_account_no_pass_required_text' => array( 'sanitize' => 'textarea', ), - 'account_name' => array( + 'account_name' => array( 'sanitize' => 'bool', ), - 'account_name_disable' => array( + 'account_name_disable' => array( 'sanitize' => 'bool', ), - 'account_name_require' => array( + 'account_name_require' => array( 'sanitize' => 'bool', ), - 'account_email' => array( + 'account_email' => array( 'sanitize' => 'bool', ), - 'account_general_password' => array( + 'account_general_password' => array( 'sanitize' => 'bool', ), - 'account_hide_in_directory' => array( + 'account_hide_in_directory' => array( 'sanitize' => 'bool', ), - 'account_hide_in_directory_default' => array( + 'account_hide_in_directory_default' => array( 'sanitize' => 'text', ), - 'profile_photo_max_size' => array( + 'profile_photo_max_size' => array( 'sanitize' => 'absint', ), - 'cover_photo_max_size' => array( + 'cover_photo_max_size' => array( 'sanitize' => 'absint', ), - 'photo_thumb_sizes' => array( + 'photo_thumb_sizes' => array( 'sanitize' => 'absint', ), - 'cover_thumb_sizes' => array( + 'cover_thumb_sizes' => array( 'sanitize' => 'absint', ), - 'image_orientation_by_exif' => array( + 'image_orientation_by_exif' => array( 'sanitize' => 'bool', ), - 'image_compression' => array( + 'image_compression' => array( 'sanitize' => 'absint', ), - 'image_max_width' => array( + 'image_max_width' => array( 'sanitize' => 'absint', ), - 'cover_min_width' => array( + 'cover_min_width' => array( 'sanitize' => 'absint', ), - 'enable_reset_password_limit' => array( + 'enable_reset_password_limit' => array( 'sanitize' => 'bool', ), - 'reset_password_limit_number' => array( + 'reset_password_limit_number' => array( 'sanitize' => 'absint', ), - 'change_password_request_limit' => array( + 'change_password_request_limit' => array( 'sanitize' => 'bool', ), - 'blocked_emails' => array( + 'only_approved_user_reset_password' => array( + 'sanitize' => 'bool', + ), + 'blocked_emails' => array( 'sanitize' => 'textarea', ), - 'blocked_words' => array( + 'blocked_words' => array( 'sanitize' => 'textarea', ), - 'allowed_choice_callbacks' => array( + 'allowed_choice_callbacks' => array( 'sanitize' => 'textarea', ), - 'allow_url_redirect_confirm' => array( + 'allow_url_redirect_confirm' => array( 'sanitize' => 'bool', ), - 'admin_email' => array( + 'admin_email' => array( 'sanitize' => 'text', ), - 'mail_from' => array( + 'mail_from' => array( 'sanitize' => 'text', ), - 'mail_from_addr' => array( + 'mail_from_addr' => array( 'sanitize' => 'text', ), - 'email_html' => array( + 'email_html' => array( 'sanitize' => 'bool', ), - 'profile_template' => array( + 'profile_template' => array( 'sanitize' => 'text', ), - 'profile_max_width' => array( + 'profile_max_width' => array( 'sanitize' => 'text', ), - 'profile_area_max_width' => array( + 'profile_area_max_width' => array( 'sanitize' => 'text', ), - 'profile_icons' => array( + 'profile_icons' => array( 'sanitize' => 'key', ), - 'profile_primary_btn_word' => array( + 'profile_primary_btn_word' => array( 'sanitize' => 'text', ), - 'profile_secondary_btn' => array( + 'profile_secondary_btn' => array( 'sanitize' => 'bool', ), - 'profile_secondary_btn_word' => array( + 'profile_secondary_btn_word' => array( 'sanitize' => 'text', ), - 'default_avatar' => array( + 'default_avatar' => array( 'sanitize' => 'url', ), - 'default_cover' => array( + 'default_cover' => array( 'sanitize' => 'url', ), - 'disable_profile_photo_upload' => array( + 'disable_profile_photo_upload' => array( 'sanitize' => 'bool', ), - 'profile_photosize' => array( + 'profile_photosize' => array( 'sanitize' => array( UM()->admin(), 'sanitize_photosize' ), ), - 'profile_cover_enabled' => array( + 'profile_cover_enabled' => array( 'sanitize' => 'bool', ), - 'profile_coversize' => array( + 'profile_coversize' => array( 'sanitize' => array( UM()->admin(), 'sanitize_cover_photosize' ), ), - 'profile_cover_ratio' => array( + 'profile_cover_ratio' => array( 'sanitize' => 'text', ), - 'profile_show_metaicon' => array( + 'profile_show_metaicon' => array( 'sanitize' => 'bool', ), - 'profile_show_name' => array( + 'profile_show_name' => array( 'sanitize' => 'bool', ), - 'profile_show_social_links' => array( + 'profile_show_social_links' => array( 'sanitize' => 'bool', ), - 'profile_show_bio' => array( + 'profile_show_bio' => array( 'sanitize' => 'bool', ), - 'profile_show_html_bio' => array( + 'profile_show_html_bio' => array( 'sanitize' => 'bool', ), - 'profile_bio_maxchars' => array( + 'profile_bio_maxchars' => array( 'sanitize' => 'absint', ), - 'profile_header_menu' => array( + 'profile_header_menu' => array( 'sanitize' => 'key', ), - 'profile_empty_text' => array( + 'profile_empty_text' => array( 'sanitize' => 'bool', ), - 'profile_empty_text_emo' => array( + 'profile_empty_text_emo' => array( 'sanitize' => 'bool', ), - 'register_template' => array( + 'register_template' => array( 'sanitize' => 'text', ), - 'register_max_width' => array( + 'register_max_width' => array( 'sanitize' => 'text', ), - 'register_align' => array( + 'register_align' => array( 'sanitize' => 'key', ), - 'register_icons' => array( + 'register_icons' => array( 'sanitize' => 'key', ), - 'register_primary_btn_word' => array( + 'register_primary_btn_word' => array( 'sanitize' => 'text', ), - 'register_secondary_btn' => array( + 'register_secondary_btn' => array( 'sanitize' => 'bool', ), - 'register_secondary_btn_word' => array( + 'register_secondary_btn_word' => array( 'sanitize' => 'text', ), - 'register_secondary_btn_url' => array( + 'register_secondary_btn_url' => array( 'sanitize' => 'url', ), - 'register_role' => array( + 'register_role' => array( 'sanitize' => 'key', ), - 'login_template' => array( + 'login_template' => array( 'sanitize' => 'text', ), - 'login_max_width' => array( + 'login_max_width' => array( 'sanitize' => 'text', ), - 'login_align' => array( + 'login_align' => array( 'sanitize' => 'key', ), - 'login_icons' => array( + 'login_icons' => array( 'sanitize' => 'key', ), - 'login_primary_btn_word' => array( + 'login_primary_btn_word' => array( 'sanitize' => 'text', ), - 'login_secondary_btn' => array( + 'login_secondary_btn' => array( 'sanitize' => 'bool', ), - 'login_secondary_btn_word' => array( + 'login_secondary_btn_word' => array( 'sanitize' => 'text', ), - 'login_secondary_btn_url' => array( + 'login_secondary_btn_url' => array( 'sanitize' => 'url', ), - 'login_forgot_pass_link' => array( + 'login_forgot_pass_link' => array( 'sanitize' => 'bool', ), - 'login_show_rememberme' => array( + 'login_show_rememberme' => array( 'sanitize' => 'bool', ), - 'form_asterisk' => array( + 'form_asterisk' => array( 'sanitize' => 'bool', ), - 'profile_title' => array( + 'profile_title' => array( 'sanitize' => 'text', ), - 'profile_desc' => array( + 'profile_desc' => array( 'sanitize' => 'textarea', ), - 'um_profile_object_cache_stop' => array( + 'um_profile_object_cache_stop' => array( 'sanitize' => 'bool', ), - 'enable_blocks' => array( + 'enable_blocks' => array( 'sanitize' => 'bool', ), - 'enable_action_scheduler' => array( + 'enable_action_scheduler' => array( 'sanitize' => 'bool', ), - 'rest_api_version' => array( + 'rest_api_version' => array( 'sanitize' => 'text', ), - 'disable_restriction_pre_queries' => array( + 'disable_restriction_pre_queries' => array( 'sanitize' => 'bool', ), - 'uninstall_on_delete' => array( + 'uninstall_on_delete' => array( 'sanitize' => 'bool', ), - 'lock_register_forms' => array( + 'lock_register_forms' => array( 'sanitize' => 'bool', ), - 'display_login_form_notice' => array( + 'display_login_form_notice' => array( 'sanitize' => 'bool', ), - 'banned_capabilities' => array( + 'banned_capabilities' => array( 'sanitize' => array( UM()->admin(), 'sanitize_wp_capabilities_assoc' ), ), - 'secure_notify_admins_banned_accounts' => array( + 'secure_notify_admins_banned_accounts' => array( 'sanitize' => 'bool', ), 'secure_notify_admins_banned_accounts__interval' => array( @@ -1069,11 +1072,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $this->settings_structure = apply_filters( 'um_settings_structure', array( - '' => array( + '' => array( 'title' => __( 'General', 'ultimate-member' ), 'sections' => array( '' => array( 'title' => __( 'Pages', 'ultimate-member' ), + // translators: %s: Link to UM Docs 'description' => sprintf( __( 'This section enables you to assign a page to one of the core elements necessary for the plugin\'s proper function. The plugin automatically creates and configures the required pages upon installation.
You only need to use this tab if you accidentally deleted pages that were automatically created during the initial plugin activation. Learn more about manually creating pages.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1903-creating-plugin-core-pages-manually' ), 'fields' => $general_pages_fields, ), @@ -1085,102 +1089,102 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'General users settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'register_role', - 'type' => 'select', - 'label' => __( 'Registration Default Role', 'ultimate-member' ), + 'id' => 'register_role', + 'type' => 'select', + 'label' => __( 'Registration Default Role', 'ultimate-member' ), 'description' => __( 'This will be the role assigned to users registering through Ultimate Member registration forms. By default, this setting will follow the core WordPress setting "New User Default Role" unless you specify a different role.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_role' ), - 'options' => UM()->roles()->get_roles( __( 'Default', 'ultimate-member' ) ), - 'size' => 'small', + 'default' => um_get_metadefault( 'register_role' ), + 'options' => UM()->roles()->get_roles( __( 'Default', 'ultimate-member' ) ), + 'size' => 'small', ), array( - 'id' => 'permalink_base', - 'type' => 'select', - 'size' => 'small', - 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), + 'id' => 'permalink_base', + 'type' => 'select', + 'size' => 'small', + 'label' => __( 'Profile Permalink Base', 'ultimate-member' ), // translators: %s: Profile page URL 'description' => sprintf( __( 'Here you can control the permalink structure of the user profile URL globally e.g. %susername/.', 'ultimate-member' ), trailingslashit( um_get_core_page( 'user' ) ) ), - 'options' => UM()->config()->permalink_base_options, + 'options' => UM()->config()->permalink_base_options, 'placeholder' => __( 'Select...', 'ultimate-member' ), ), array( - 'id' => 'permalink_base_custom_meta', - 'type' => 'text', - 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), + 'id' => 'permalink_base_custom_meta', + 'type' => 'text', + 'label' => __( 'Profile Permalink Base Custom Meta Key', 'ultimate-member' ), 'description' => __( 'Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique.', 'ultimate-member' ), 'conditional' => array( 'permalink_base', '=', 'custom_meta' ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'display_name', - 'type' => 'select', - 'size' => 'medium', - 'label' => __( 'User Display Name', 'ultimate-member' ), + 'id' => 'display_name', + 'type' => 'select', + 'size' => 'medium', + 'label' => __( 'User Display Name', 'ultimate-member' ), 'description' => __( 'This is the name that will be displayed for users on the front end of your site. Default setting uses first/last name as display name if it exists.', 'ultimate-member' ), - 'options' => UM()->config()->display_name_options, + 'options' => UM()->config()->display_name_options, 'placeholder' => __( 'Select...', 'ultimate-member' ), ), array( - 'id' => 'display_name_field', - 'type' => 'text', - 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), + 'id' => 'display_name_field', + 'type' => 'text', + 'label' => __( 'Display Name Custom Field(s)', 'ultimate-member' ), 'description' => __( 'Specify the custom field meta key or custom fields seperated by comma that you want to use to display users name on the frontend of your site.', 'ultimate-member' ), 'conditional' => array( 'display_name', '=', 'field' ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'author_redirect', - 'type' => 'checkbox', - 'label' => __( 'Hide author pages', 'ultimate-member' ), + 'id' => 'author_redirect', + 'type' => 'checkbox', + 'label' => __( 'Hide author pages', 'ultimate-member' ), 'checkbox_label' => __( 'Enable author page redirect to user profile', 'ultimate-member' ), - 'description' => __( 'If enabled, author pages will automatically redirect to the user\'s profile page.', 'ultimate-member' ), + 'description' => __( 'If enabled, author pages will automatically redirect to the user\'s profile page.', 'ultimate-member' ), ), array( - 'id' => 'members_page', - 'type' => 'checkbox', - 'label' => __( 'Members Directory', 'ultimate-member' ), + 'id' => 'members_page', + 'type' => 'checkbox', + 'label' => __( 'Members Directory', 'ultimate-member' ), 'checkbox_label' => __( 'Enable Members Directory', 'ultimate-member' ), - 'description' => __( 'Control whether to enable or disable member directories on this site.', 'ultimate-member' ), + 'description' => __( 'Control whether to enable or disable member directories on this site.', 'ultimate-member' ), ), array( - 'id' => 'use_gravatars', - 'type' => 'checkbox', - 'label' => __( 'Use Gravatar', 'ultimate-member' ), + 'id' => 'use_gravatars', + 'type' => 'checkbox', + 'label' => __( 'Use Gravatar', 'ultimate-member' ), 'checkbox_label' => __( 'Enable Gravatar', 'ultimate-member' ), - 'description' => __( 'Do you want to use Gravatar instead of the default plugin profile photo (If the user did not upload a custom profile photo/avatar)?', 'ultimate-member' ), + 'description' => __( 'Do you want to use Gravatar instead of the default plugin profile photo (If the user did not upload a custom profile photo/avatar)?', 'ultimate-member' ), ), array( - 'id' => 'use_um_gravatar_default_builtin_image', - 'type' => 'select', - 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), + 'id' => 'use_um_gravatar_default_builtin_image', + 'type' => 'select', + 'label' => __( 'Use Gravatar builtin image', 'ultimate-member' ), 'description' => __( 'Gravatar has a number of built in options which you can also use as defaults.', 'ultimate-member' ), - 'options' => array( - 'default' => __( 'Default', 'ultimate-member' ), - '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), - 'mm' => __( 'Mystery Man', 'ultimate-member' ), + 'options' => array( + 'default' => __( 'Default', 'ultimate-member' ), + '404' => __( '404 ( File Not Found response )', 'ultimate-member' ), + 'mm' => __( 'Mystery Man', 'ultimate-member' ), 'identicon' => __( 'Identicon', 'ultimate-member' ), 'monsterid' => __( 'Monsterid', 'ultimate-member' ), - 'wavatar' => __( 'Wavatar', 'ultimate-member' ), - 'retro' => __( 'Retro', 'ultimate-member' ), - 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), + 'wavatar' => __( 'Wavatar', 'ultimate-member' ), + 'retro' => __( 'Retro', 'ultimate-member' ), + 'blank' => __( 'Blank ( a transparent PNG image )', 'ultimate-member' ), ), 'conditional' => array( 'use_gravatars', '=', 1 ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'use_um_gravatar_default_image', - 'type' => 'checkbox', - 'label' => __( 'Replace Gravatar\'s Default avatar', 'ultimate-member' ), + 'id' => 'use_um_gravatar_default_image', + 'type' => 'checkbox', + 'label' => __( 'Replace Gravatar\'s Default avatar', 'ultimate-member' ), 'checkbox_label' => __( 'Set Default plugin avatar as Gravatar\'s Default avatar', 'ultimate-member' ), - 'description' => __( 'Do you want to use the plugin default avatar instead of the gravatar default photo (If the user did not upload a custom profile photo/avatar).', 'ultimate-member' ), - 'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ), + 'description' => __( 'Do you want to use the plugin default avatar instead of the gravatar default photo (If the user did not upload a custom profile photo/avatar).', 'ultimate-member' ), + 'conditional' => array( 'use_um_gravatar_default_builtin_image', '=', 'default' ), ), array( - 'id' => 'delete_comments', - 'type' => 'checkbox', - 'label' => __( 'Delete user comments', 'ultimate-member' ), + 'id' => 'delete_comments', + 'type' => 'checkbox', + 'label' => __( 'Delete user comments', 'ultimate-member' ), 'checkbox_label' => __( 'Enable deleting user comments after deleting a user', 'ultimate-member' ), - 'description' => __( 'Do you want to automatically delete a user\'s comments when they delete their account or are removed from the admin dashboard?', 'ultimate-member' ), + 'description' => __( 'Do you want to automatically delete a user\'s comments when they delete their account or are removed from the admin dashboard?', 'ultimate-member' ), ), ), ), @@ -1189,41 +1193,41 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Password & Security settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'toggle_password', - 'type' => 'checkbox', - 'label' => __( 'Toggle Password Visibility', 'ultimate-member' ), + 'id' => 'toggle_password', + 'type' => 'checkbox', + 'label' => __( 'Toggle Password Visibility', 'ultimate-member' ), 'checkbox_label' => __( 'Enable password show/hide icon on password field', 'ultimate-member' ), - 'description' => __( 'Enable users to view their inputted password before submitting the form.', 'ultimate-member' ), + 'description' => __( 'Enable users to view their inputted password before submitting the form.', 'ultimate-member' ), ), array( - 'id' => 'require_strongpass', - 'type' => 'checkbox', - 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), + 'id' => 'require_strongpass', + 'type' => 'checkbox', + 'label' => __( 'Require Strong Passwords', 'ultimate-member' ), 'checkbox_label' => __( 'Enable strong passwords', 'ultimate-member' ), - 'description' => __( 'Enable this option to apply strong password rules to all password fields (user registration, password reset and password change).', 'ultimate-member' ), + 'description' => __( 'Enable this option to apply strong password rules to all password fields (user registration, password reset and password change).', 'ultimate-member' ), ), array( - 'id' => 'password_min_chars', - 'type' => 'number', - 'label' => __( 'Password minimum length', 'ultimate-member' ), + 'id' => 'password_min_chars', + 'type' => 'number', + 'label' => __( 'Password minimum length', 'ultimate-member' ), 'description' => __( 'Enter the minimum number of characters a user must use for their password. The default minimum characters is 8.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', 'conditional' => array( 'require_strongpass', '=', '1' ), ), array( - 'id' => 'password_max_chars', - 'type' => 'number', - 'label' => __( 'Password maximum length', 'ultimate-member' ), + 'id' => 'password_max_chars', + 'type' => 'number', + 'label' => __( 'Password maximum length', 'ultimate-member' ), 'description' => __( 'Enter the maximum number of characters a user can use for their password. The default maximum characters is 30.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', 'conditional' => array( 'require_strongpass', '=', '1' ), ), array( - 'id' => 'activation_link_expiry_time', - 'type' => 'number', - 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), + 'id' => 'activation_link_expiry_time', + 'type' => 'number', + 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), 'description' => __( 'For user registrations requiring email confirmation via a link, how long should the activation link remain active before expiring? If this field is left blank, the activation link will not expire.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1232,29 +1236,29 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'SEO settings for the user profiles.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'profile_noindex', - 'type' => 'select', - 'size' => 'small', - 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), + 'id' => 'profile_noindex', + 'type' => 'select', + 'size' => 'small', + 'label' => __( 'Avoid indexing profile by search engines', 'ultimate-member' ), 'description' => __( 'Hides the profile page for robots. This setting can be overridden by individual role settings.', 'ultimate-member' ), - 'options' => array( + 'options' => array( '0' => __( 'No', 'ultimate-member' ), '1' => __( 'Yes', 'ultimate-member' ), ), ), array( - 'id' => 'profile_title', - 'type' => 'text', - 'label' => __( 'User Profile Title', 'ultimate-member' ), + 'id' => 'profile_title', + 'type' => 'text', + 'label' => __( 'User Profile Title', 'ultimate-member' ), 'description' => __( 'This is the title that is displayed on a specific user profile.', 'ultimate-member' ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'profile_desc', - 'type' => 'textarea', - 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), + 'id' => 'profile_desc', + 'type' => 'textarea', + 'label' => __( 'User Profile Dynamic Meta Description', 'ultimate-member' ), 'description' => __( 'This will be used in the meta description that is available for search-engines.', 'ultimate-member' ), - 'args' => array( + 'args' => array( 'textarea_rows' => 6, ), ), @@ -1270,41 +1274,41 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Allows you to control the fields on the main tab of Account page.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'account_name', - 'type' => 'checkbox', - 'label' => __( 'Display First & Last name fields', 'ultimate-member' ), + 'id' => 'account_name', + 'type' => 'checkbox', + 'label' => __( 'Display First & Last name fields', 'ultimate-member' ), 'checkbox_label' => __( 'Enable to display First & Last name fields', 'ultimate-member' ), - 'description' => __( 'If enabled, the First & Last name fields will be shown on the account page.', 'ultimate-member' ), + 'description' => __( 'If enabled, the First & Last name fields will be shown on the account page.', 'ultimate-member' ), ), array( - 'id' => 'account_name_disable', - 'type' => 'checkbox', - 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), + 'id' => 'account_name_disable', + 'type' => 'checkbox', + 'label' => __( 'Disable First & Last name field editing', 'ultimate-member' ), 'checkbox_label' => __( 'Enable to prevent First & Last name editing by users', 'ultimate-member' ), - 'description' => __( 'If enabled, this feature will prevent users from changing their first and last names on the account page.', 'ultimate-member' ), - 'conditional' => array( 'account_name', '=', '1' ), + 'description' => __( 'If enabled, this feature will prevent users from changing their first and last names on the account page.', 'ultimate-member' ), + 'conditional' => array( 'account_name', '=', '1' ), ), array( - 'id' => 'account_name_require', - 'type' => 'checkbox', - 'label' => __( 'Require First & Last Name', 'ultimate-member' ), + 'id' => 'account_name_require', + 'type' => 'checkbox', + 'label' => __( 'Require First & Last Name', 'ultimate-member' ), 'checkbox_label' => __( 'First and last name fields are required', 'ultimate-member' ), - 'description' => __( 'If enabled, users will not be allowed to remove their first or last names when updating their account information.', 'ultimate-member' ), - 'conditional' => array( 'account_name', '=', '1' ), + 'description' => __( 'If enabled, users will not be allowed to remove their first or last names when updating their account information.', 'ultimate-member' ), + 'conditional' => array( 'account_name', '=', '1' ), ), array( - 'id' => 'account_email', - 'type' => 'checkbox', - 'label' => __( 'Allow users to change email', 'ultimate-member' ), + 'id' => 'account_email', + 'type' => 'checkbox', + 'label' => __( 'Allow users to change email', 'ultimate-member' ), 'checkbox_label' => __( 'Enable changing email via the account page', 'ultimate-member' ), - 'description' => __( 'If disabled, users will not be allowed to change their email address on the account page.', 'ultimate-member' ), + 'description' => __( 'If disabled, users will not be allowed to change their email address on the account page.', 'ultimate-member' ), ), array( - 'id' => 'account_general_password', - 'type' => 'checkbox', - 'label' => __( 'Require password to update account', 'ultimate-member' ), + 'id' => 'account_general_password', + 'type' => 'checkbox', + 'label' => __( 'Require password to update account', 'ultimate-member' ), 'checkbox_label' => __( 'Enable required password', 'ultimate-member' ), - 'description' => __( 'If enabled, users will need to enter their password when updating their information via the account page.', 'ultimate-member' ), + 'description' => __( 'If enabled, users will need to enter their password when updating their information via the account page.', 'ultimate-member' ), ), ), ), @@ -1313,11 +1317,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Enables you to toggle the change password tab on the account page.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'account_tab_password', - 'type' => 'checkbox', - 'label' => __( 'Password Account Tab', 'ultimate-member' ), + 'id' => 'account_tab_password', + 'type' => 'checkbox', + 'label' => __( 'Password Account Tab', 'ultimate-member' ), 'checkbox_label' => __( 'Display password change account tab', 'ultimate-member' ), - 'description' => __( 'Enable or disable the "Password" tab on the account page.', 'ultimate-member' ), + 'description' => __( 'Enable or disable the "Password" tab on the account page.', 'ultimate-member' ), ), ), ), @@ -1326,30 +1330,30 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Enables you to toggle the privacy tab on the account page. Disable this tab to prevent users from altering their privacy settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'account_tab_privacy', - 'type' => 'checkbox', - 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), + 'id' => 'account_tab_privacy', + 'type' => 'checkbox', + 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), 'checkbox_label' => __( 'Display privacy account tab', 'ultimate-member' ), - 'description' => __( 'Enable or disable the "Privacy" tab on the account page.', 'ultimate-member' ), + 'description' => __( 'Enable or disable the "Privacy" tab on the account page.', 'ultimate-member' ), ), array( - 'id' => 'account_hide_in_directory', - 'type' => 'checkbox', - 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), + 'id' => 'account_hide_in_directory', + 'type' => 'checkbox', + 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), 'checkbox_label' => __( 'Enable users ability to alter their profile visibility in member directories', 'ultimate-member' ), - 'description' => __( 'If enabled, this will allow users to change their profile visibility in the member directory from the account page.', 'ultimate-member' ), - 'conditional' => array( 'account_tab_privacy', '=', '1' ), + 'description' => __( 'If enabled, this will allow users to change their profile visibility in the member directory from the account page.', 'ultimate-member' ), + 'conditional' => array( 'account_tab_privacy', '=', '1' ), ), array( - 'id' => 'account_hide_in_directory_default', - 'type' => 'select', - 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), + 'id' => 'account_hide_in_directory_default', + 'type' => 'select', + 'label' => __( 'Hide profiles from directory by default', 'ultimate-member' ), 'description' => __( 'Set the default value for the "Hide my profile from directory" option.', 'ultimate-member' ), - 'options' => array( + 'options' => array( 'No' => __( 'No', 'ultimate-member' ), 'Yes' => __( 'Yes', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', 'conditional' => array( 'account_hide_in_directory', '=', '1' ), ), ), @@ -1359,11 +1363,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Enables you to toggle the notifications tab on the account page. Disable this tab to prevent users from altering their notifications settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'account_tab_notifications', - 'type' => 'checkbox', - 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), + 'id' => 'account_tab_notifications', + 'type' => 'checkbox', + 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), 'checkbox_label' => __( 'Display notifications account tab', 'ultimate-member' ), - 'description' => __( 'Enable or disable the "Notifications" tab on the account page.', 'ultimate-member' ), + 'description' => __( 'Enable or disable the "Notifications" tab on the account page.', 'ultimate-member' ), ), ), ), @@ -1372,27 +1376,27 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Enables you to enable or disable the "Delete Account" tab on the account page. Disable this tab if you wish to prevent users from being able to delete their own accounts.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'account_tab_delete', - 'type' => 'checkbox', - 'label' => __( 'Delete Account Tab', 'ultimate-member' ), + 'id' => 'account_tab_delete', + 'type' => 'checkbox', + 'label' => __( 'Delete Account Tab', 'ultimate-member' ), 'checkbox_label' => __( 'Display delete account tab', 'ultimate-member' ), - 'description' => __( 'Enable/disable the Delete account tab in account page.', 'ultimate-member' ), + 'description' => __( 'Enable/disable the Delete account tab in account page.', 'ultimate-member' ), ), array( - 'id' => 'delete_account_text', - 'type' => 'textarea', // bug with wp 4.4? should be editor - 'label' => __( 'Account Deletion Text', 'ultimate-member' ), + 'id' => 'delete_account_text', + 'type' => 'textarea', // bug with wp 4.4? should be editor + 'label' => __( 'Account Deletion Text', 'ultimate-member' ), 'description' => __( 'This is the custom text that will be displayed to users before they delete their account from your website when their password is required to confirm account deletion.', 'ultimate-member' ), - 'args' => array( + 'args' => array( 'textarea_rows' => 6, ), ), array( - 'id' => 'delete_account_no_pass_required_text', - 'type' => 'textarea', - 'label' => __( 'Account Deletion Text', 'ultimate-member' ), + 'id' => 'delete_account_no_pass_required_text', + 'type' => 'textarea', + 'label' => __( 'Account Deletion Text', 'ultimate-member' ), 'description' => __( 'This is the custom text that will be displayed to users before they delete their account from your website when no password is required to confirm account deletion.', 'ultimate-member' ), - 'args' => array( + 'args' => array( 'textarea_rows' => 6, ), ), @@ -1408,24 +1412,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This page allows you to manage user upload options, enabling you to optimize photos for your site.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'image_orientation_by_exif', - 'type' => 'checkbox', - 'label' => __( 'Change image orientation', 'ultimate-member' ), + 'id' => 'image_orientation_by_exif', + 'type' => 'checkbox', + 'label' => __( 'Change image orientation', 'ultimate-member' ), 'checkbox_label' => __( 'Enable getting image orientation from EXIF data', 'ultimate-member' ), - 'description' => __( 'Rotate image to and use orientation by the camera EXIF data.', 'ultimate-member' ), + 'description' => __( 'Rotate image to and use orientation by the camera EXIF data.', 'ultimate-member' ), ), array( - 'id' => 'image_compression', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Image Quality', 'ultimate-member' ), + 'id' => 'image_compression', + 'type' => 'text', + 'size' => 'small', + 'label' => __( 'Image Quality', 'ultimate-member' ), 'description' => __( 'Quality is used to determine quality of image uploads, and ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). The default range is 60.', 'ultimate-member' ), ), array( - 'id' => 'image_max_width', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), + 'id' => 'image_max_width', + 'type' => 'text', + 'size' => 'small', + 'label' => __( 'Image Upload Maximum Width (px)', 'ultimate-member' ), 'description' => __( 'Any image upload above this width will be resized to this limit automatically.', 'ultimate-member' ), ), ), @@ -1435,20 +1439,20 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Allows you to control the profile photos sizes, thumbnails, etc.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'profile_photo_max_size', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'id' => 'profile_photo_max_size', + 'type' => 'text', + 'size' => 'small', + 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), 'description' => __( 'Sets a maximum size for the uploaded photo.', 'ultimate-member' ), ), array( - 'id' => 'photo_thumb_sizes', - 'type' => 'multi_text', - 'size' => 'small', - 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'description' => __( 'Here you can define which thumbnail sizes will be created for each profile photo upload.', 'ultimate-member' ), - 'validate' => 'numeric', - 'add_text' => __( 'Add New Size', 'ultimate-member' ), + 'id' => 'photo_thumb_sizes', + 'type' => 'multi_text', + 'size' => 'small', + 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'description' => __( 'Here you can define which thumbnail sizes will be created for each profile photo upload.', 'ultimate-member' ), + 'validate' => 'numeric', + 'add_text' => __( 'Add New Size', 'ultimate-member' ), 'show_default_number' => 1, ), ), @@ -1458,27 +1462,27 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Allows you to control the cover photos sizes, thumbnails, etc.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'cover_photo_max_size', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), + 'id' => 'cover_photo_max_size', + 'type' => 'text', + 'size' => 'small', + 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), 'description' => __( 'Sets a maximum size for the uploaded cover.', 'ultimate-member' ), ), array( - 'id' => 'cover_min_width', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), + 'id' => 'cover_min_width', + 'type' => 'text', + 'size' => 'small', + 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), 'description' => __( 'This will be the minimum width for cover photo uploads.', 'ultimate-member' ), ), array( - 'id' => 'cover_thumb_sizes', - 'type' => 'multi_text', - 'size' => 'small', - 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'description' => __( 'Here you can define which thumbnail sizes will be created for each cover photo upload.', 'ultimate-member' ), - 'validate' => 'numeric', - 'add_text' => __( 'Add New Size', 'ultimate-member' ), + 'id' => 'cover_thumb_sizes', + 'type' => 'multi_text', + 'size' => 'small', + 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), + 'description' => __( 'Here you can define which thumbnail sizes will be created for each cover photo upload.', 'ultimate-member' ), + 'validate' => 'numeric', + 'add_text' => __( 'Add New Size', 'ultimate-member' ), 'show_default_number' => 1, ), ), @@ -1487,7 +1491,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), ), ), - 'access' => array( + 'access' => array( 'title' => __( 'Access', 'ultimate-member' ), 'sections' => array( '' => array( @@ -1498,49 +1502,56 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'other' => array( 'title' => __( 'Other', 'ultimate-member' ), 'form_sections' => array( - 'rp' => array( + 'rp' => array( 'title' => __( 'Reset Password', 'ultimate-member' ), 'description' => __( 'Allows to manage reset password settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'enable_reset_password_limit', - 'type' => 'checkbox', - 'label' => __( 'Password reset limit', 'ultimate-member' ), + 'id' => 'enable_reset_password_limit', + 'type' => 'checkbox', + 'label' => __( 'Password reset limit', 'ultimate-member' ), 'checkbox_label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ), - 'description' => __( 'If enabled, this sets a limit on the number of password resets a user can do.', 'ultimate-member' ), + 'description' => __( 'If enabled, this sets a limit on the number of password resets a user can do.', 'ultimate-member' ), ), array( - 'id' => 'reset_password_limit_number', - 'type' => 'text', - 'label' => __( 'Enter password reset limit', 'ultimate-member' ), + 'id' => 'reset_password_limit_number', + 'type' => 'text', + 'label' => __( 'Enter password reset limit', 'ultimate-member' ), 'description' => __( 'Set the maximum reset password limit. If reached the maximum limit, user will be locked from using this.', 'ultimate-member' ), - 'validate' => 'numeric', + 'validate' => 'numeric', 'conditional' => array( 'enable_reset_password_limit', '=', 1 ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'change_password_request_limit', - 'type' => 'checkbox', - 'label' => __( 'Change Password request limit', 'ultimate-member' ), + 'id' => 'change_password_request_limit', + 'type' => 'checkbox', + 'label' => __( 'Change Password request limit', 'ultimate-member' ), 'checkbox_label' => __( 'Enable limit for changing password', 'ultimate-member' ), - 'description' => __( 'This option adds rate limit when submitting the change password form in the Account page. Users are only allowed to submit 1 request per 30 minutes to prevent from any brute-force attacks or password guessing with the form.', 'ultimate-member' ), + 'description' => __( 'This option adds rate limit when submitting the change password form in the Account page. Users are only allowed to submit 1 request per 30 minutes to prevent from any brute-force attacks or password guessing with the form.', 'ultimate-member' ), + ), + array( + 'id' => 'only_approved_user_reset_password', + 'type' => 'checkbox', + 'label' => __( 'Only approved user Reset Password', 'ultimate-member' ), + 'checkbox_label' => __( 'Enable reset password only for approved users', 'ultimate-member' ), + 'description' => __( 'This option makes possible to reset password only for approved user. Is used to prevent from any spam email attacks from not approved users.', 'ultimate-member' ), ), ), ), - 'blocked' => array( + 'blocked' => array( 'title' => __( 'Blocked data when sign up', 'ultimate-member' ), 'description' => __( 'Allows to manage blocked data of signed up user.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'blocked_emails', - 'type' => 'textarea', - 'label' => __( 'Blocked Email Addresses (Enter one email per line)', 'ultimate-member' ), + 'id' => 'blocked_emails', + 'type' => 'textarea', + 'label' => __( 'Blocked Email Addresses (Enter one email per line)', 'ultimate-member' ), 'description' => __( 'This will block the specified email addresses from being able to sign up or sign in to your site. To block an entire domain, use something like `*@domain.com`.', 'ultimate-member' ), ), array( - 'id' => 'blocked_words', - 'type' => 'textarea', - 'label' => __( 'Blacklist Words (Enter one word per line)', 'ultimate-member' ), + 'id' => 'blocked_words', + 'type' => 'textarea', + 'label' => __( 'Blacklist Words (Enter one word per line)', 'ultimate-member' ), 'description' => __( 'This option lets you specify blacklist of words to prevent anyone from signing up with such a word as their username.', 'ultimate-member' ), ), ), @@ -1549,7 +1560,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), ), ), - 'email' => array( + 'email' => array( 'title' => __( 'Emails', 'ultimate-member' ), 'form_sections' => array( 'email_sender' => array( @@ -1591,7 +1602,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), ), ), - 'appearance' => array( + 'appearance' => array( 'title' => __( 'Appearance', 'ultimate-member' ), 'sections' => array( '' => array( @@ -1599,32 +1610,33 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'form_sections' => array( 'template' => array( 'title' => __( 'Template', 'ultimate-member' ), + // translators: %s: Link to UM docs 'description' => sprintf( __( 'This section allows you to customize the user profile template and size. Learn more about custom profile template creation.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/120-adding-your-custom-profile-templates' ), 'fields' => array( array( - 'id' => 'profile_template', - 'type' => 'select', - 'label' => __( 'Profile Default Template', 'ultimate-member' ), + 'id' => 'profile_template', + 'type' => 'select', + 'label' => __( 'Profile Default Template', 'ultimate-member' ), 'description' => __( 'This will be the default template to output profile.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_template' ), - 'options' => UM()->shortcodes()->get_templates( 'profile' ), - 'size' => 'small', + 'default' => um_get_metadefault( 'profile_template' ), + 'options' => UM()->shortcodes()->get_templates( 'profile' ), + 'size' => 'small', ), array( - 'id' => 'profile_max_width', - 'type' => 'text', - 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_max_width' ), + 'id' => 'profile_max_width', + 'type' => 'text', + 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_max_width' ), 'description' => __( 'The maximum width this shortcode can take from the page width.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'profile_area_max_width', - 'type' => 'text', - 'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_area_max_width' ), + 'id' => 'profile_area_max_width', + 'type' => 'text', + 'label' => __( 'Profile Area Maximum Width', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_area_max_width' ), 'description' => __( 'The maximum width of the profile area inside profile (below profile header).', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1633,31 +1645,31 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This section allows you to customize the profile photo component on the user profile.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'default_avatar', - 'type' => 'media', - 'label' => __( 'Default Profile Photo', 'ultimate-member' ), - 'description' => __( 'You can change the default profile picture globally here. Please make sure that the photo is 300x300px.', 'ultimate-member' ), + 'id' => 'default_avatar', + 'type' => 'media', + 'label' => __( 'Default Profile Photo', 'ultimate-member' ), + 'description' => __( 'You can change the default profile picture globally here. Please make sure that the photo is 300x300px.', 'ultimate-member' ), 'upload_frame_title' => __( 'Select Default Profile Photo', 'ultimate-member' ), - 'default' => array( + 'default' => array( 'url' => UM_URL . 'assets/img/default_avatar.jpg', ), ), array( - 'id' => 'disable_profile_photo_upload', - 'type' => 'checkbox', - 'label' => __( 'Profile Photo Upload', 'ultimate-member' ), + 'id' => 'disable_profile_photo_upload', + 'type' => 'checkbox', + 'label' => __( 'Profile Photo Upload', 'ultimate-member' ), 'checkbox_label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), - 'description' => __( 'Switch on/off the profile photo uploader.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'disable_profile_photo_upload' ), + 'description' => __( 'Switch on/off the profile photo uploader.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'disable_profile_photo_upload' ), ), array( - 'id' => 'profile_photosize', - 'type' => 'select', - 'label' => __( 'Profile Photo Size', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_photosize' ), - 'options' => UM()->files()->get_profile_photo_size( 'photo_thumb_sizes' ), + 'id' => 'profile_photosize', + 'type' => 'select', + 'label' => __( 'Profile Photo Size', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_photosize' ), + 'options' => UM()->files()->get_profile_photo_size( 'photo_thumb_sizes' ), 'description' => __( 'The global default of profile photo size. This can be overridden by individual form settings.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1666,47 +1678,47 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This section allows you to customize the profile photo component on the user profile.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'default_cover', - 'type' => 'media', - 'url' => true, - 'preview' => false, - 'label' => __( 'Default Cover Photo', 'ultimate-member' ), - 'description' => __( 'You can change the default cover photo globally here. Please make sure that the default cover is large enough and respects the ratio you are using for cover photos.', 'ultimate-member' ), + 'id' => 'default_cover', + 'type' => 'media', + 'url' => true, + 'preview' => false, + 'label' => __( 'Default Cover Photo', 'ultimate-member' ), + 'description' => __( 'You can change the default cover photo globally here. Please make sure that the default cover is large enough and respects the ratio you are using for cover photos.', 'ultimate-member' ), 'upload_frame_title' => __( 'Select Default Cover Photo', 'ultimate-member' ), ), array( - 'id' => 'profile_cover_enabled', - 'type' => 'checkbox', - 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), + 'id' => 'profile_cover_enabled', + 'type' => 'checkbox', + 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), 'checkbox_label' => __( 'Enable Cover Photos', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_cover_enabled' ), - 'description' => __( 'Switch on/off the profile cover photos.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_cover_enabled' ), + 'description' => __( 'Switch on/off the profile cover photos.', 'ultimate-member' ), ), array( - 'id' => 'profile_coversize', - 'type' => 'select', - 'label' => __( 'Profile Cover Size', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_coversize' ), - 'options' => UM()->files()->get_profile_photo_size( 'cover_thumb_sizes' ), + 'id' => 'profile_coversize', + 'type' => 'select', + 'label' => __( 'Profile Cover Size', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_coversize' ), + 'options' => UM()->files()->get_profile_photo_size( 'cover_thumb_sizes' ), 'description' => __( 'The global default width of cover photo size. This can be overridden by individual form settings.', 'ultimate-member' ), 'conditional' => array( 'profile_cover_enabled', '=', 1 ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'profile_cover_ratio', - 'type' => 'select', - 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), + 'id' => 'profile_cover_ratio', + 'type' => 'select', + 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), 'description' => __( 'Choose global ratio for cover photos of profiles.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_cover_ratio' ), - 'options' => array( + 'default' => um_get_metadefault( 'profile_cover_ratio' ), + 'options' => array( '1.6:1' => '1.6:1', '2.7:1' => '2.7:1', '2.2:1' => '2.2:1', '3.2:1' => '3.2:1', ), 'conditional' => array( 'profile_cover_enabled', '=', 1 ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1715,64 +1727,64 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This section allows you to customize the user profile header component.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'profile_show_metaicon', - 'type' => 'checkbox', - 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), + 'id' => 'profile_show_metaicon', + 'type' => 'checkbox', + 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), 'checkbox_label' => __( 'Show icons in Profile Header Meta', 'ultimate-member' ), - 'default' => 0, - 'description' => __( 'Display field icons for related user meta fields in header or not.', 'ultimate-member' ), + 'default' => 0, + 'description' => __( 'Display field icons for related user meta fields in header or not.', 'ultimate-member' ), ), array( - 'id' => 'profile_show_name', - 'type' => 'checkbox', - 'label' => __( 'Display name in profile header', 'ultimate-member' ), + 'id' => 'profile_show_name', + 'type' => 'checkbox', + 'label' => __( 'Display name in profile header', 'ultimate-member' ), 'checkbox_label' => __( 'Show display name in profile header', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_show_name' ), - 'description' => __( 'Switch on/off the user name on profile header.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_show_name' ), + 'description' => __( 'Switch on/off the user name on profile header.', 'ultimate-member' ), ), array( - 'id' => 'profile_show_social_links', - 'type' => 'checkbox', - 'label' => __( 'Social links in profile header', 'ultimate-member' ), + 'id' => 'profile_show_social_links', + 'type' => 'checkbox', + 'label' => __( 'Social links in profile header', 'ultimate-member' ), 'checkbox_label' => __( 'Show social links in profile header', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_show_social_links' ), - 'description' => __( 'Switch on/off the social links on profile header.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_show_social_links' ), + 'description' => __( 'Switch on/off the social links on profile header.', 'ultimate-member' ), ), array( - 'id' => 'profile_show_bio', - 'type' => 'checkbox', - 'label' => __( 'User description in profile header', 'ultimate-member' ), + 'id' => 'profile_show_bio', + 'type' => 'checkbox', + 'label' => __( 'User description in profile header', 'ultimate-member' ), 'checkbox_label' => __( 'Show user description in profile header', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_show_bio' ), - 'description' => __( 'Switch on/off the user description on profile header.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_show_bio' ), + 'description' => __( 'Switch on/off the user description on profile header.', 'ultimate-member' ), ), array( - 'id' => 'profile_bio_maxchars', - 'type' => 'text', - 'label' => __( 'User description maximum chars', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_bio_maxchars' ), + 'id' => 'profile_bio_maxchars', + 'type' => 'text', + 'label' => __( 'User description maximum chars', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_bio_maxchars' ), 'description' => __( 'Maximum number of characters to allow in user description field in header.', 'ultimate-member' ), 'conditional' => array( 'profile_show_bio', '=', 1 ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'profile_show_html_bio', - 'type' => 'checkbox', - 'label' => __( 'HTML support for user description', 'ultimate-member' ), + 'id' => 'profile_show_html_bio', + 'type' => 'checkbox', + 'label' => __( 'HTML support for user description', 'ultimate-member' ), 'checkbox_label' => __( 'Enable HTML support for user description', 'ultimate-member' ), - 'description' => __( 'Switch on/off to enable/disable support for HTML tags on user description.', 'ultimate-member' ), + 'description' => __( 'Switch on/off to enable/disable support for HTML tags on user description.', 'ultimate-member' ), ), array( - 'id' => 'profile_header_menu', - 'type' => 'select', - 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_header_menu' ), + 'id' => 'profile_header_menu', + 'type' => 'select', + 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_header_menu' ), 'description' => __( 'For incompatible themes, please make the menu open from left instead of bottom by default.', 'ultimate-member' ), - 'options' => array( + 'options' => array( 'bc' => __( 'Bottom of Icon', 'ultimate-member' ), 'lc' => __( 'Left of Icon (right for RTL)', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1781,59 +1793,59 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This section allows you to customize the user profile buttons and fields layout.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'profile_primary_btn_word', - 'type' => 'text', - 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_primary_btn_word' ), + 'id' => 'profile_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_primary_btn_word' ), 'description' => __( 'The text that is used for updating profile button.', 'ultimate-member' ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'profile_secondary_btn', - 'type' => 'checkbox', - 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), + 'id' => 'profile_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), 'checkbox_label' => __( 'Show Profile Secondary Button', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_secondary_btn' ), - 'description' => __( 'Switch on/off the secondary button display in the form.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_secondary_btn' ), + 'description' => __( 'Switch on/off the secondary button display in the form.', 'ultimate-member' ), ), array( - 'id' => 'profile_secondary_btn_word', - 'type' => 'text', - 'label' => __( 'Profile Secondary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_secondary_btn_word' ), + 'id' => 'profile_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Profile Secondary Button Text', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_secondary_btn_word' ), 'description' => __( 'The text that is used for cancelling update profile button.', 'ultimate-member' ), 'conditional' => array( 'profile_secondary_btn', '=', 1 ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'profile_icons', - 'type' => 'select', - 'label' => __( 'Profile Field Icons', 'ultimate-member' ), + 'id' => 'profile_icons', + 'type' => 'select', + 'label' => __( 'Profile Field Icons', 'ultimate-member' ), 'description' => __( 'This is applicable for edit mode only.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_icons' ), - 'options' => array( + 'default' => um_get_metadefault( 'profile_icons' ), + 'options' => array( 'field' => __( 'Show inside text field', 'ultimate-member' ), 'label' => __( 'Show with label', 'ultimate-member' ), - 'off' => __( 'Turn off', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'profile_empty_text', - 'type' => 'checkbox', - 'label' => __( 'Custom message on empty profile', 'ultimate-member' ), + 'id' => 'profile_empty_text', + 'type' => 'checkbox', + 'label' => __( 'Custom message on empty profile', 'ultimate-member' ), 'checkbox_label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_empty_text' ), - 'description' => __( 'Switch on/off the custom message that appears when the profile is empty.', 'ultimate-member' ), + 'default' => um_get_metadefault( 'profile_empty_text' ), + 'description' => __( 'Switch on/off the custom message that appears when the profile is empty.', 'ultimate-member' ), ), array( - 'id' => 'profile_empty_text_emo', - 'type' => 'checkbox', - 'label' => __( 'Custom message emoticon', 'ultimate-member' ), + 'id' => 'profile_empty_text_emo', + 'type' => 'checkbox', + 'label' => __( 'Custom message emoticon', 'ultimate-member' ), 'checkbox_label' => __( 'Show the emoticon', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_empty_text_emo' ), - 'description' => __( 'Switch on/off the emoticon (sad face) that appears above the message.', 'ultimate-member' ), - 'conditional' => array( 'profile_empty_text', '=', 1 ), + 'default' => um_get_metadefault( 'profile_empty_text_emo' ), + 'description' => __( 'Switch on/off the emoticon (sad face) that appears above the message.', 'ultimate-member' ), + 'conditional' => array( 'profile_empty_text', '=', 1 ), ), ), ), @@ -1847,92 +1859,92 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'registration_form' => array( 'title' => __( 'Registration Form', 'ultimate-member' ), 'form_sections' => array( - 'template' => array( + 'template' => array( 'title' => __( 'Template', 'ultimate-member' ), 'description' => __( 'This section allows you to customize the user registration template and size.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'register_template', - 'type' => 'select', - 'label' => __( 'Registration Default Template', 'ultimate-member' ), + 'id' => 'register_template', + 'type' => 'select', + 'label' => __( 'Registration Default Template', 'ultimate-member' ), 'description' => __( 'This will be the default template to output registration.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_template' ), - 'options' => UM()->shortcodes()->get_templates( 'register' ), - 'size' => 'small', + 'default' => um_get_metadefault( 'register_template' ), + 'options' => UM()->shortcodes()->get_templates( 'register' ), + 'size' => 'small', ), array( - 'id' => 'register_max_width', - 'type' => 'text', - 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_max_width' ), + 'id' => 'register_max_width', + 'type' => 'text', + 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), + 'default' => um_get_metadefault( 'register_max_width' ), 'description' => __( 'The maximum width this shortcode can take from the page width.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'register_align', - 'type' => 'select', - 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), + 'id' => 'register_align', + 'type' => 'select', + 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), 'description' => __( 'The shortcode is centered by default unless you specify otherwise here.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_align' ), - 'options' => array( + 'default' => um_get_metadefault( 'register_align' ), + 'options' => array( 'center' => __( 'Centered', 'ultimate-member' ), - 'left' => __( 'Left aligned', 'ultimate-member' ), - 'right' => __( 'Right aligned', 'ultimate-member' ), + 'left' => __( 'Left aligned', 'ultimate-member' ), + 'right' => __( 'Right aligned', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', ), ), ), - 'fields' => array( + 'fields' => array( 'title' => __( 'Buttons & Fields', 'ultimate-member' ), 'description' => __( 'This section allows you to customize the user registration buttons and fields layout.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'register_primary_btn_word', - 'type' => 'text', - 'label' => __( 'Registration Primary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_primary_btn_word' ), + 'id' => 'register_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Registration Primary Button Text', 'ultimate-member' ), + 'default' => um_get_metadefault( 'register_primary_btn_word' ), 'description' => __( 'The text that is used for primary button text.', 'ultimate-member' ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'register_secondary_btn', - 'type' => 'checkbox', - 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), + 'id' => 'register_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), 'checkbox_label' => __( 'Show Registration Secondary Button', 'ultimate-member' ), - 'default' => 1, - 'description' => __( 'Switch on/off the secondary button display in the form.', 'ultimate-member' ), + 'default' => 1, + 'description' => __( 'Switch on/off the secondary button display in the form.', 'ultimate-member' ), ), array( - 'id' => 'register_secondary_btn_word', - 'type' => 'text', - 'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_secondary_btn_word' ), + 'id' => 'register_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Registration Secondary Button Text', 'ultimate-member' ), + 'default' => um_get_metadefault( 'register_secondary_btn_word' ), 'description' => __( 'The text that is used for the secondary button text.', 'ultimate-member' ), 'conditional' => array( 'register_secondary_btn', '=', 1 ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'register_secondary_btn_url', - 'type' => 'text', - 'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_secondary_btn_url' ), + 'id' => 'register_secondary_btn_url', + 'type' => 'text', + 'label' => __( 'Registration Secondary Button URL', 'ultimate-member' ), + 'default' => um_get_metadefault( 'register_secondary_btn_url' ), 'description' => __( 'You can replace default link for this button by entering custom URL.', 'ultimate-member' ), 'conditional' => array( 'register_secondary_btn', '=', 1 ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'register_icons', - 'type' => 'select', - 'label' => __( 'Registration Field Icons', 'ultimate-member' ), + 'id' => 'register_icons', + 'type' => 'select', + 'label' => __( 'Registration Field Icons', 'ultimate-member' ), 'description' => __( 'This controls the display of field icons in the registration form.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_icons' ), - 'options' => array( + 'default' => um_get_metadefault( 'register_icons' ), + 'options' => array( 'field' => __( 'Show inside text field', 'ultimate-member' ), 'label' => __( 'Show with label', 'ultimate-member' ), - 'off' => __( 'Turn off', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1946,34 +1958,34 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This section allows you to customize the user login template and size.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'login_template', - 'type' => 'select', - 'label' => __( 'Login Default Template', 'ultimate-member' ), + 'id' => 'login_template', + 'type' => 'select', + 'label' => __( 'Login Default Template', 'ultimate-member' ), 'description' => __( 'This will be the default template to output login.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_template' ), - 'options' => UM()->shortcodes()->get_templates( 'login' ), - 'size' => 'small', + 'default' => um_get_metadefault( 'login_template' ), + 'options' => UM()->shortcodes()->get_templates( 'login' ), + 'size' => 'small', ), array( - 'id' => 'login_max_width', - 'type' => 'text', - 'label' => __( 'Login Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_max_width' ), + 'id' => 'login_max_width', + 'type' => 'text', + 'label' => __( 'Login Maximum Width', 'ultimate-member' ), + 'default' => um_get_metadefault( 'login_max_width' ), 'description' => __( 'The maximum width this shortcode can take from the page width.', 'ultimate-member' ), - 'size' => 'small', + 'size' => 'small', ), array( - 'id' => 'login_align', - 'type' => 'select', - 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), + 'id' => 'login_align', + 'type' => 'select', + 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), 'description' => __( 'The shortcode is centered by default unless you specify otherwise here.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_align' ), - 'options' => array( + 'default' => um_get_metadefault( 'login_align' ), + 'options' => array( 'center' => __( 'Centered', 'ultimate-member' ), - 'left' => __( 'Left aligned', 'ultimate-member' ), - 'right' => __( 'Right aligned', 'ultimate-member' ), + 'left' => __( 'Left aligned', 'ultimate-member' ), + 'right' => __( 'Right aligned', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -1982,67 +1994,67 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'This section allows you to customize the user login buttons and fields layout.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'login_primary_btn_word', - 'type' => 'text', - 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_primary_btn_word' ), + 'id' => 'login_primary_btn_word', + 'type' => 'text', + 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), + 'default' => um_get_metadefault( 'login_primary_btn_word' ), 'description' => __( 'The text that is used for primary button text.', 'ultimate-member' ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'login_secondary_btn', - 'type' => 'checkbox', - 'label' => __( 'Login Secondary Button', 'ultimate-member' ), + 'id' => 'login_secondary_btn', + 'type' => 'checkbox', + 'label' => __( 'Login Secondary Button', 'ultimate-member' ), 'checkbox_label' => __( 'Show Login Secondary Button', 'ultimate-member' ), - 'default' => 1, - 'description' => __( 'Switch on/off the secondary button display in the form.', 'ultimate-member' ), + 'default' => 1, + 'description' => __( 'Switch on/off the secondary button display in the form.', 'ultimate-member' ), ), array( - 'id' => 'login_secondary_btn_word', - 'type' => 'text', - 'label' => __( 'Login Secondary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_secondary_btn_word' ), + 'id' => 'login_secondary_btn_word', + 'type' => 'text', + 'label' => __( 'Login Secondary Button Text', 'ultimate-member' ), + 'default' => um_get_metadefault( 'login_secondary_btn_word' ), 'description' => __( 'The text that is used for the secondary button text.', 'ultimate-member' ), 'conditional' => array( 'login_secondary_btn', '=', 1 ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'login_secondary_btn_url', - 'type' => 'text', - 'label' => __( 'Login Secondary Button URL', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_secondary_btn_url' ), + 'id' => 'login_secondary_btn_url', + 'type' => 'text', + 'label' => __( 'Login Secondary Button URL', 'ultimate-member' ), + 'default' => um_get_metadefault( 'login_secondary_btn_url' ), 'description' => __( 'You can replace default link for this button by entering custom URL.', 'ultimate-member' ), 'conditional' => array( 'login_secondary_btn', '=', 1 ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'login_forgot_pass_link', - 'type' => 'checkbox', - 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), + 'id' => 'login_forgot_pass_link', + 'type' => 'checkbox', + 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), 'checkbox_label' => __( 'Show Login Forgot Password Link', 'ultimate-member' ), - 'default' => 1, - 'description' => __( 'Switch on/off the forgot password link in login form.', 'ultimate-member' ), + 'default' => 1, + 'description' => __( 'Switch on/off the forgot password link in login form.', 'ultimate-member' ), ), array( - 'id' => 'login_show_rememberme', - 'type' => 'checkbox', - 'label' => __( '"Remember Me" checkbox', 'ultimate-member' ), + 'id' => 'login_show_rememberme', + 'type' => 'checkbox', + 'label' => __( '"Remember Me" checkbox', 'ultimate-member' ), 'checkbox_label' => __( 'Show "Remember Me" checkbox', 'ultimate-member' ), - 'default' => 1, - 'description' => __( 'Allow users to choose If they want to stay signed in even after closing the browser. If you do not show this option, the default will be to not remember login session.', 'ultimate-member' ), + 'default' => 1, + 'description' => __( 'Allow users to choose If they want to stay signed in even after closing the browser. If you do not show this option, the default will be to not remember login session.', 'ultimate-member' ), ), array( - 'id' => 'login_icons', - 'type' => 'select', - 'label' => __( 'Login Field Icons', 'ultimate-member' ), + 'id' => 'login_icons', + 'type' => 'select', + 'label' => __( 'Login Field Icons', 'ultimate-member' ), 'description' => __( 'This controls the display of field icons in the login form.', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_icons' ), - 'options' => array( + 'default' => um_get_metadefault( 'login_icons' ), + 'options' => array( 'field' => __( 'Show inside text field', 'ultimate-member' ), 'label' => __( 'Show with label', 'ultimate-member' ), - 'off' => __( 'Turn off', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), ), - 'size' => 'small', + 'size' => 'small', ), ), ), @@ -2050,17 +2062,18 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), ), ), - 'extensions' => array( + 'extensions' => array( 'title' => __( 'Extensions', 'ultimate-member' ), ), - 'licenses' => array( + 'licenses' => array( 'title' => __( 'Licenses', 'ultimate-member' ), ), - 'advanced' => array( + 'advanced' => array( 'title' => __( 'Advanced', 'ultimate-member' ), 'sections' => array( '' => array( 'title' => __( 'General', 'ultimate-member' ), + // translators: %s: Link to UM docs 'description' => sprintf( __( 'Advanced settings section is designed to help you fine-tune your website or add extra features. Learn more about advanced settings section.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1902-advanced-tab' ), 'fields' => array( array( @@ -2091,7 +2104,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'override_templates' => array( 'title' => __( 'Override templates', 'ultimate-member' ), // translators: %s: Link to the docs article. - 'description' => sprintf( __( 'Each time we release an update, you\'ll find a list of changes made to the template files. Learn more about overriding templates.
You can easily check the status of the latest templates to see if they are up-to-date or need updating. Learn more about fixing outdated templates.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1516-templates-map', 'https://docs.ultimatemember.com/article/1847-fixing-outdated-ultimate-member-templates' ), /** @noinspection HtmlUnknownTarget */ + 'description' => sprintf( __( 'Each time we release an update, you\'ll find a list of changes made to the template files. Learn more about overriding templates.
You can easily check the status of the latest templates to see if they are up-to-date or need updating. Learn more about fixing outdated templates.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1516-templates-map', 'https://docs.ultimatemember.com/article/1847-fixing-outdated-ultimate-member-templates' ), 'fields' => array( array( 'id' => 'override_templates_list_table', @@ -2109,11 +2122,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Start using new features that are being progressively rolled out to improve the users management experience.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'enable_blocks', - 'type' => 'checkbox', - 'label' => __( 'Gutenberg Blocks', 'ultimate-member' ), + 'id' => 'enable_blocks', + 'type' => 'checkbox', + 'label' => __( 'Gutenberg Blocks', 'ultimate-member' ), 'checkbox_label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ), - 'description' => __( 'Check this box if you would like to use Ultimate Member blocks in Gutenberg editor. Important some themes have the conflicts with Gutenberg editor.', 'ultimate-member' ), + 'description' => __( 'Check this box if you would like to use Ultimate Member blocks in Gutenberg editor. Important some themes have the conflicts with Gutenberg editor.', 'ultimate-member' ), ), $same_page_update, ), @@ -2123,25 +2136,25 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'These features are either experimental or incomplete, enable them at your own risk!', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'enable_new_ui', - 'type' => 'checkbox', - 'label' => __( 'Design scheme', 'ultimate-member' ), + 'id' => 'enable_new_ui', + 'type' => 'checkbox', + 'label' => __( 'Design scheme', 'ultimate-member' ), 'checkbox_label' => __( 'Enable new UI (for developers only)', 'ultimate-member' ), - 'description' => __( 'Check this box if you would like to enable new UI.', 'ultimate-member' ), + 'description' => __( 'Check this box if you would like to enable new UI.', 'ultimate-member' ), ), array( - 'id' => 'enable_new_form_builder', - 'type' => 'checkbox', - 'label' => __( 'Form Builder', 'ultimate-member' ), + 'id' => 'enable_new_form_builder', + 'type' => 'checkbox', + 'label' => __( 'Form Builder', 'ultimate-member' ), 'checkbox_label' => __( 'Enable new Form Builder (for developers only)', 'ultimate-member' ), - 'description' => __( 'Check this box if you would like to enable new Form Builder.', 'ultimate-member' ), + 'description' => __( 'Check this box if you would like to enable new Form Builder.', 'ultimate-member' ), ), array( - 'id' => 'enable_legacy_fonticons', - 'type' => 'checkbox', - 'label' => __( 'Legacy fonticons', 'ultimate-member' ), + 'id' => 'enable_legacy_fonticons', + 'type' => 'checkbox', + 'label' => __( 'Legacy fonticons', 'ultimate-member' ), 'checkbox_label' => __( 'Enable legacy fonticons', 'ultimate-member' ), - 'description' => __( 'Check this box if you would like to enable legacy Ultimate Member fonticons used outdated versions of FontAwesome and Ionicons libraries.', 'ultimate-member' ), + 'description' => __( 'Check this box if you would like to enable legacy Ultimate Member fonticons used outdated versions of FontAwesome and Ionicons libraries.', 'ultimate-member' ), ), ), ), @@ -2152,35 +2165,35 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { // backward compatibility option leave it disabled for better security and ability to exclude posts/terms pre-query // otherwise we're filtering only results and restricted posts/terms can be visible array( - 'id' => 'disable_restriction_pre_queries', - 'type' => 'checkbox', - 'label' => __( 'Restriction content pre-queries', 'ultimate-member' ), + 'id' => 'disable_restriction_pre_queries', + 'type' => 'checkbox', + 'label' => __( 'Restriction content pre-queries', 'ultimate-member' ), 'checkbox_label' => __( 'Disable pre-queries for restriction content logic', 'ultimate-member' ), - 'description' => __( 'Please enable this option only in the cases when you have big or unnecessary queries on your site with active restriction logic. If you want to exclude posts only from the results queries instead of pre_get_posts and fully-hidden post logic also please enable this option. It activates the restriction content logic until 2.2.x version without latest security enhancements.', 'ultimate-member' ), + 'description' => __( 'Please enable this option only in the cases when you have big or unnecessary queries on your site with active restriction logic. If you want to exclude posts only from the results queries instead of pre_get_posts and fully-hidden post logic also please enable this option. It activates the restriction content logic until 2.2.x version without latest security enhancements.', 'ultimate-member' ), ), ), ), ), ), 'developers' => array( - 'title' => __( 'Developers', 'ultimate-member' ), + 'title' => __( 'Developers', 'ultimate-member' ), 'form_sections' => array( 'developers' => array( 'title' => __( 'Developers', 'ultimate-member' ), 'description' => __( 'This section is designed to modify settings that are tailored for developers. If you are not a developer, please be cautious when changing these settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'allowed_choice_callbacks', - 'type' => 'textarea', - 'label' => __( 'Allowed Choice Callbacks (Enter one PHP function per line)', 'ultimate-member' ), + 'id' => 'allowed_choice_callbacks', + 'type' => 'textarea', + 'label' => __( 'Allowed Choice Callbacks (Enter one PHP function per line)', 'ultimate-member' ), 'description' => __( 'This option lets you specify the choice callback functions to prevent anyone from using 3rd-party functions that may put your site at risk.', 'ultimate-member' ), ), array( - 'id' => 'rest_api_version', - 'type' => 'select', - 'label' => __( 'REST API Version', 'ultimate-member' ), + 'id' => 'rest_api_version', + 'type' => 'select', + 'label' => __( 'REST API Version', 'ultimate-member' ), 'description' => __( 'This controls the REST API version, we recommend to use the last version.', 'ultimate-member' ), - 'options' => array( + 'options' => array( '1.0' => __( '1.0 version', 'ultimate-member' ), '2.0' => __( '2.0 version', 'ultimate-member' ), ), @@ -2192,11 +2205,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'description' => __( 'Allows to manage redirect settings.', 'ultimate-member' ), 'fields' => array( array( - 'id' => 'allow_url_redirect_confirm', - 'type' => 'checkbox', - 'label' => __( 'Allow external link redirect confirm', 'ultimate-member' ), + 'id' => 'allow_url_redirect_confirm', + 'type' => 'checkbox', + 'label' => __( 'Allow external link redirect confirm', 'ultimate-member' ), 'checkbox_label' => __( 'Enable JS.confirm for external links', 'ultimate-member' ), - 'description' => __( 'Using JS.confirm alert when you go to an external link.', 'ultimate-member' ), + 'description' => __( 'Using JS.confirm alert when you go to an external link.', 'ultimate-member' ), ), ), ), @@ -2237,9 +2250,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { //sorting licenses if ( ! empty( $settings['licenses']['fields'] ) ) { $licenses = $settings['licenses']['fields']; - @uasort( $licenses, function( $a, $b ) { - return strnatcasecmp( $a['label'], $b['label'] ); - } ); + @uasort( + $licenses, + function ( $a, $b ) { + return strnatcasecmp( $a['label'], $b['label'] ); + } + ); $settings['licenses']['fields'] = $licenses; } @@ -2247,9 +2263,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { if ( ! empty( $settings['extensions']['sections'] ) ) { $extensions = $settings['extensions']['sections']; - @uasort( $extensions, function( $a, $b ) { - return strnatcasecmp( $a['title'], $b['title'] ); - } ); + @uasort( + $extensions, + function ( $a, $b ) { + return strnatcasecmp( $a['title'], $b['title'] ); + } + ); $keys = array_keys( $extensions ); $temp = array( @@ -2540,7 +2559,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { * } * ?> */ - do_action( "um_settings_before_save" ); + do_action( 'um_settings_before_save' ); /** * UM hook @@ -2712,17 +2731,19 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { if ( ! empty( $_POST['um_options'] ) ) { if ( ! empty( $_POST['um_options']['pages_settings'] ) ) { - $post_ids = new \WP_Query( array( - 'post_type' => 'page', - 'meta_query' => array( - array( - 'key' => '_um_core', - 'compare' => 'EXISTS' - ) - ), - 'posts_per_page' => -1, - 'fields' => 'ids' - ) ); + $post_ids = new \WP_Query( + array( + 'post_type' => 'page', + 'meta_query' => array( + array( + 'key' => '_um_core', + 'compare' => 'EXISTS', + ), + ), + 'posts_per_page' => -1, + 'fields' => 'ids', + ) + ); $post_ids = $post_ids->get_posts(); @@ -2792,7 +2813,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } } } - } elseif ( isset( $_POST['um_options']['member_directory_own_table'] ) ) { if ( empty( $_POST['um_options']['member_directory_own_table'] ) ) { global $wpdb; @@ -2800,7 +2820,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $results = $wpdb->get_row( "SELECT * FROM {$wpdb->prefix}um_metadata LIMIT 1", ARRAY_A ); if ( ! empty( $results ) ) { - $wpdb->query("TRUNCATE TABLE {$wpdb->prefix}um_metadata" ); + $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}um_metadata" ); } update_option( 'um_member_directory_truncated', time() ); @@ -2866,19 +2886,19 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } foreach ( $_POST['um_options'] as $key => $value ) { - $key = sanitize_key( $key ); + $key = sanitize_key( $key ); $value = sanitize_text_field( $value ); - $edd_action = ''; + $edd_action = ''; $license_key = ''; if ( empty( $this->previous_licenses[ $key ] ) && ! empty( $value ) || ( ! empty( $this->previous_licenses[ $key ] ) && ! empty( $value ) && $this->previous_licenses[ $key ] != $value ) ) { - $edd_action = 'activate_license'; + $edd_action = 'activate_license'; $license_key = $value; } elseif ( ! empty( $this->previous_licenses[ $key ] ) && empty( $value ) ) { - $edd_action = 'deactivate_license'; + $edd_action = 'deactivate_license'; $license_key = $this->previous_licenses[ $key ]; } elseif ( ! empty( $this->previous_licenses[ $key ] ) && ! empty( $value ) ) { - $edd_action = 'check_license'; + $edd_action = 'check_license'; $license_key = $value; } @@ -3508,7 +3528,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { } if ( file_exists( $theme_template_path ) ) { - $fp = fopen( $theme_template_path, "w" ); + $fp = fopen( $theme_template_path, 'w' ); $result = fputs( $fp, $content ); fclose( $fp ); } diff --git a/includes/class-config.php b/includes/class-config.php index 547e3772..0a3e9fbb 100644 --- a/includes/class-config.php +++ b/includes/class-config.php @@ -691,6 +691,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'enable_reset_password_limit' => true, 'reset_password_limit_number' => 3, 'change_password_request_limit' => false, + 'only_approved_user_reset_password' => true, 'blocked_emails' => '', 'blocked_words' => 'admin' . "\r\n" . 'administrator' . "\r\n" . 'webmaster' . "\r\n" . 'support' . "\r\n" . 'staff', 'allowed_choice_callbacks' => '', diff --git a/includes/class-init.php b/includes/class-init.php index 285035c4..3312e35f 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -520,12 +520,10 @@ if ( ! class_exists( 'UM' ) ) { $this->form()->hooks(); $this->permalinks(); $this->cron(); - $this->mobile(); $this->external_integrations(); $this->gdpr(); $this->member_directory(); $this->blocks(); - $this->secure(); // If multisite networks active if ( is_multisite() ) { @@ -1334,21 +1332,6 @@ if ( ! class_exists( 'UM' ) ) { return $this->classes['templates']; } - - /** - * @since 2.0 - * - * @return um\lib\mobiledetect\Um_Mobile_Detect - */ - function mobile() { - if ( empty( $this->classes['mobile'] ) ) { - $this->classes['mobile'] = new um\lib\mobiledetect\Um_Mobile_Detect(); - } - - return $this->classes['mobile']; - } - - /** * @since 2.0.44 * @@ -1474,6 +1457,14 @@ if ( ! class_exists( 'UM' ) ) { _deprecated_function( __METHOD__, '2.1.0', 'UM()->member_directory()' ); return UM()->member_directory(); } + + /** + * @since 2.0 + * @deprecated 2.9.2 + */ + public function mobile() { + _deprecated_function( __METHOD__, '2.9.2', 'wp_is_mobile' ); + } } } diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php index 2aa7a3b3..d45be262 100644 --- a/includes/core/class-fields.php +++ b/includes/core/class-fields.php @@ -751,13 +751,13 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $output .= ''; if ( ! empty( $data['help'] ) && false === $this->viewing && false === strpos( $key, 'confirm_user_pass' ) ) { - if ( ! UM()->mobile()->isMobile() ) { + if ( ! wp_is_mobile() ) { if ( false === $this->disable_tooltips ) { $output .= ''; } } - if ( false !== $this->disable_tooltips || UM()->mobile()->isMobile() ) { + if ( false !== $this->disable_tooltips || wp_is_mobile() ) { $output .= '' . __( $data['help'], 'ultimate-member' ) . ''; } } diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 8df10b14..1bd8aa1d 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -1027,7 +1027,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $this->sql_order = apply_filters( 'um_modify_sortby_parameter_meta', $this->sql_order, $sortby ); $profiles_per_page = $directory_data['profiles_per_page']; - if ( UM()->mobile()->isMobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { + if ( wp_is_mobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { $profiles_per_page = $directory_data['profiles_per_page_mobile']; } @@ -1105,7 +1105,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $sizes = UM()->options()->get( 'cover_thumb_sizes' ); - $this->cover_size = UM()->mobile()->isTablet() ? $sizes[1] : end( $sizes ); + $this->cover_size = wp_is_mobile() ? $sizes[1] : end( $sizes ); $avatar_size = UM()->options()->get( 'profile_photosize' ); $this->avatar_size = str_replace( 'px', '', $avatar_size ); diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index dd40f0dd..00234ccf 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -1374,7 +1374,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { function pagination_options( $directory_data ) { // number of profiles for mobile $profiles_per_page = $directory_data['profiles_per_page']; - if ( UM()->mobile()->isMobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { + if ( wp_is_mobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { $profiles_per_page = $directory_data['profiles_per_page_mobile']; } @@ -1716,6 +1716,9 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { // Make the search line empty if it contains the mySQL query statements. $regexp_map = array( '/select(.*?)from/im', + '/select(.*?)sleep/im', + '/select(.*?)database/im', + '/select(.*?)where/im', '/update(.*?)set/im', '/delete(.*?)from/im', ); @@ -1727,15 +1730,15 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { break; } } - - return $search; + // Early escape of the search line. The same as `$wpdb->prepare()`. + return esc_sql( $search ); } /** * Handle general search line request */ public function general_search() { - //general search + // General search if ( ! empty( $_POST['search'] ) ) { // complex using with change_meta_sql function $search = $this->prepare_search( $_POST['search'] ); @@ -1873,8 +1876,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $search_where = preg_replace( '/ AND \((.*?)\)/im', "$1 OR", $search_where ); // str_replace( '/', '\/', wp_slash( $search ) ) means that we add backslashes to special symbols + add backslash to slash(/) symbol for proper regular pattern. + $pattern = $wpdb->prepare( $meta_join_for_search . '.meta_value = %s', $search ); + $pattern = '/(' . str_replace( '/', '\/', wp_slash( $pattern ) ) . ')/im'; + $sql['where'] = preg_replace( - '/(' . $meta_join_for_search . '.meta_value = \'' . str_replace( '/', '\/', wp_slash( $search ) ) . '\')/im', + $pattern, trim( $search_where ) . " $1", $sql['where'], 1 @@ -2547,7 +2553,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { // number of profiles for mobile $profiles_per_page = $directory_data['profiles_per_page']; - if ( UM()->mobile()->isMobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { + if ( wp_is_mobile() && isset( $directory_data['profiles_per_page_mobile'] ) ) { $profiles_per_page = $directory_data['profiles_per_page_mobile']; } @@ -2992,7 +2998,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $sizes = UM()->options()->get( 'cover_thumb_sizes' ); - $this->cover_size = UM()->mobile()->isTablet() ? $sizes[1] : end( $sizes ); + $this->cover_size = wp_is_mobile() ? $sizes[1] : end( $sizes ); $this->cover_size = apply_filters( 'um_member_directory_cover_image_size', $this->cover_size, $directory_data ); diff --git a/includes/core/class-password.php b/includes/core/class-password.php index 66a7bfcf..7a02d7fa 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -454,10 +454,13 @@ if ( ! class_exists( 'um\core\Password' ) ) { if ( isset( $data ) && is_a( $data, '\WP_User' ) ) { um_fetch_user( $data->ID ); - UM()->user()->password_reset(); + + if ( false === UM()->options()->get( 'only_approved_user_reset_password' ) || UM()->common()->users()->has_status( $data->ID, 'approved' ) ) { + UM()->user()->password_reset(); + } } - wp_redirect( um_get_core_page('password-reset', 'checkemail' ) ); + wp_safe_redirect( um_get_core_page( 'password-reset', 'checkemail' ) ); exit; } diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index bf3560be..097ab0c4 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -933,20 +933,19 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { } elseif ( ! UM()->validation()->safe_username( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Your email contains invalid characters', 'ultimate-member' ) ); } + break; + } + + if ( '' === $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' ) ); } else { - - if ( '' !== $submitted_data[ $key ] && ! is_email( $submitted_data[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); - } elseif ( '' !== $submitted_data[ $key ] && email_exists( $submitted_data[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); - } elseif ( '' !== $submitted_data[ $key ] ) { - - $users = get_users( 'meta_value=' . $submitted_data[ $key ] ); - - foreach ( $users as $user ) { - if ( $user->ID !== $submitted_data['user_id'] ) { - UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); - } + // 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'] ) { + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } } } diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 33819c07..dfd07abf 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -917,12 +917,9 @@ function um_profile_header_cover_area( $args ) { $size = $get_cover_size; } - if ( UM()->mobile()->isMobile() ) { - - // set for mobile width = 300 by default but can be changed via filter - if ( ! UM()->mobile()->isTablet() ) { - $size = 300; - } + if ( wp_is_mobile() ) { + // Set for mobile width = 300 by default but can be changed via filter + $size = 300; /** * UM hook diff --git a/includes/lib/mobiledetect/class-um-mobile-detect.php b/includes/lib/mobiledetect/class-um-mobile-detect.php deleted file mode 100644 index 03784aa1..00000000 --- a/includes/lib/mobiledetect/class-um-mobile-detect.php +++ /dev/null @@ -1,1321 +0,0 @@ - array('matches' => array( - // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ - 'application/x-obml2d', - // BlackBerry devices. - 'application/vnd.rim.html', - 'text/vnd.wap.wml', - 'application/vnd.wap.xhtml+xml' - )), - 'HTTP_X_WAP_PROFILE' => null, - 'HTTP_X_WAP_CLIENTID' => null, - 'HTTP_WAP_CONNECTION' => null, - 'HTTP_PROFILE' => null, - // Reported by Opera on Nokia devices (eg. C3). - 'HTTP_X_OPERAMINI_PHONE_UA' => null, - 'HTTP_X_NOKIA_GATEWAY_ID' => null, - 'HTTP_X_ORANGE_ID' => null, - 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, - 'HTTP_X_HUAWEI_USERID' => null, - // Reported by Windows Smartphones. - 'HTTP_UA_OS' => null, - // Reported by Verizon, Vodafone proxy system. - 'HTTP_X_MOBILE_GATEWAY' => null, - // Seen this on HTC Sensation. SensationXE_Beats_Z715e. - 'HTTP_X_ATT_DEVICEID' => null, - // Seen this on a HTC. - 'HTTP_UA_CPU' => array('matches' => array('ARM')), - ); - - /** - * List of mobile devices (phones). - * - * @var array - */ - protected static $phoneDevices = array( - 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes - 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', - 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', - 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', - // @todo: Is 'Dell Streak' a tablet or a phone? ;) - 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', - 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925', - 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750', - 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', - 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', - 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', - // http://www.micromaxinfo.com/mobiles/smartphones - // Added because the codes might conflict with Acer Tablets. - 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', - // @todo Complete the regex. - 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; - 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) - // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) - // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. - 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', - // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. - 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', - 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', - // Added simvalley mobile just for fun. They have some interesting devices. - // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html - 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', - // Wolfgang - a brand that is sold by Aldi supermarkets. - // http://www.wolfgangmobile.com/ - 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', - 'Alcatel' => 'Alcatel', - 'Nintendo' => 'Nintendo 3DS', - // http://en.wikipedia.org/wiki/Amoi - 'Amoi' => 'Amoi', - // http://en.wikipedia.org/wiki/INQ - 'INQ' => 'INQ', - // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 - 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', - ); - - /** - * List of tablet devices. - * - * @var array - */ - protected static $tabletDevices = array( - 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. - 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)|^.*Android.*Nexus(?:(?!Mobile).)*$', - 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T707A|SM-T807A|SM-T237P|SM-T807P|SM-P607T|SM-T217T|SM-T337T', // SCH-P709|SCH-P729|SM-T2558 - Samsung Mega - treat them like a regular phone. - // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html - 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI)\b', - // Only the Surface tablets with Windows RT are considered mobile. - // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx - 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', - // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT - 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', - // Watch out for PadFone, see #132. - // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ - 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG', - 'BlackBerryTablet' => 'PlayBook|RIM Tablet', - 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', - 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', - 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', - // http://www.acer.ro/ac/ro/RO/content/drivers - // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) - // http://us.acer.com/ac/en/US/content/group/tablets - // http://www.acer.de/ac/de/DE/content/models/tablets/ - // Can conflict with Micromax and Motorola phones codes. - 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b', - // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ - // http://us.toshiba.com/tablets/tablet-finder - // http://www.toshiba.co.jp/regza/tablet/ - 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', - // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html - // http://www.lg.com/us/tablets - 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', - 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', - // Prestigio Tablets http://www.prestigio.com/support - 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD', - // http://support.lenovo.com/en_GB/downloads/default.page?# - 'LenovoTablet' => 'Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)', - // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets - 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', - // http://www.yarvik.com/en/matrix/tablets/ - 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', - 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', - 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', - // http://www.intenso.de/kategorie_en.php?kategorie=33 - // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate - 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', - // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ - 'IRUTablet' => 'M702pro', - 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', - // http://www.e-boda.ro/tablete-pc.html - 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', - // http://www.allview.ro/produse/droseries/lista-tablete-pc/ - 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', - // http://wiki.archosfans.com/index.php?title=Main_Page - 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', - // http://www.ainol.com/plugin.php?identifier=ainol&module=product - 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', - // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER - // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser - // http://www.sony.jp/support/tablet/ - 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551', - // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 - 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', - // db + http://www.cube-tablet.com/buy-products.html - 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', - // http://www.cobyusa.com/?p=pcat&pcat_id=3001 - 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', - // http://www.match.net.cn/products.asp - 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', - // http://www.msi.com/support - // @todo Research the Windows Tablets. - 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', - // @todo http://www.kyoceramobile.com/support/drivers/ - // 'KyoceraTablet' => null, - // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ - // 'IntextTablet' => null, - // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) - // http://www.imp3.net/14/show.php?itemid=20454 - 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', - // http://www.rock-chips.com/index.php?do=prod&pid=2 - 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', - // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ - 'FlyTablet' => 'IQ310|Fly Vision', - // http://www.bqreaders.com/gb/tablets-prices-sale.html - 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus', - // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 - // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) - 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', - // Nec or Medias Tab - 'NecTablet' => '\bN-06D|\bN-08D', - // Pantech Tablets: http://www.pantechusa.com/phones/ - 'PantechTablet' => 'Pantech.*P4100', - // Broncho Tablets: http://www.broncho.cn/ (hard to find) - 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', - // http://versusuk.com/support.html - 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', - // http://www.zync.in/index.php/our-products/tablet-phablets - 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', - // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ - 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', - // https://www.nabitablet.com/ - 'NabiTablet' => 'Android.*\bNabi', - 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', - // French Danew Tablets http://www.danew.com/produits-tablette.php - 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', - // Texet Tablets and Readers http://www.texet.ru/tablet/ - 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', - // Avoid detecting 'PLAYSTATION 3' as mobile. - 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', - // http://www.trekstor.de/surftabs.html - 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', - // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets - 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', - // http://www.advandigital.com/index.php?link=content-product&jns=JP001 - // because of the short codenames we have to include whitespaces to reduce the possible conflicts. - 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', - // http://www.danytech.com/category/tablet-pc - 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', - // http://www.galapad.net/product.html - 'GalapadTablet' => 'Android.*\bG1\b', - // http://www.micromaxinfo.com/tablet/funbook - 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', - // http://www.karbonnmobiles.com/products_tablet.php - 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', - // http://www.myallfine.com/Products.asp - 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', - // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= - 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', - // http://www.yonesnav.com/products/products.php - 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', - // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 - // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) - 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', - // http://www.gloryunion.cn/products.asp - // http://www.allwinnertech.com/en/apply/mobile.html - // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) - // @todo: Softwiner tablets? - // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. - 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G - // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 - 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', - // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ - // @todo: add more tests. - 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', - // http://hclmetablet.com/India/index.php - 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', - // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html - 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', - // http://www.visture.com/index.asp - 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', - // http://www.mijncresta.nl/tablet - 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', - // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 - 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', - // Concorde tab - 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', - // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ - 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', - // Modecom Tablets - http://www.modecom.eu/tablets/portal/ - 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', - // Vonino Tablets - http://www.vonino.eu/tablets - 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', - // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 - 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', - // Storex Tablets - http://storex.fr/espace_client/support.html - // @note: no need to add all the tablet codes since they are guided by the first regex. - 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', - // Generic Vodafone tablets. - 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7', - // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb - // Aka: http://www.essentielb.fr/ - 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', - // Ross & Moor - http://ross-moor.ru/ - 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', - // i-mobile http://product.i-mobilephone.com/Mobile_Device - 'iMobileTablet' => 'i-mobile i-note', - // http://www.tolino.de/de/vergleichen/ - 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', - // AudioSonic - a Kmart brand - // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 - 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', - // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ - // @todo: add them gradually to avoid conflicts. - 'AMPETablet' => 'Android.* A78 ', - // Skk Mobile - http://skkmobile.com.ph/product_tablets.php - 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', - // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 - 'TecnoTablet' => 'TECNO P9', - // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 - 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', - // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ - 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', - // http://www.intracon.eu/tablet - 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', - // http://www.xoro.de/produkte/ - // @note: Might be the same brand with 'Simply tablets' - 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', - // http://www1.viewsonic.com/products/computing/tablets/ - 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', - // http://www.odys.de/web/internet-tablet_en.html - 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', - // http://www.captiva-power.de/products.html#tablets-en - 'CaptivaTablet' => 'CAPTIVA PAD', - // IconBIT - http://www.iconbit.com/products/tablets/ - 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', - // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 - 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', - 'JaytechTablet' => 'TPC-PA762', - 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', - // http://www.digma.ru/support/download/ - // @todo: Ebooks also (if requested) - 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', - // http://www.evolioshop.com/ro/tablete-pc.html - // http://www.evolio.ro/support/downloads_static.html?cat=2 - // @todo: Research some more - 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', - // @todo http://www.lavamobiles.com/tablets-data-cards - 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY', - // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 - 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', - // http://www.mi.com/en - 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', - // http://www.nbru.cn/index.html - 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', - // http://navroad.com/products/produkty/tablety/ - 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', - // http://www.datawind.com/ubislate/ - 'UbislateTablet' => 'UbiSlate[\s]?7C', - // http://www.pocketbook-int.com/ru/support - 'PocketBookTablet' => 'Pocketbook', - // http://www.tesco.com/direct/hudl/ - 'Hudl' => 'Hudl HT7S3', - // http://www.telstra.com.au/home-phone/thub-2/ - 'TelstraTablet' => 'T-Hub2', - 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bJolla\b' - ); - - /** - * List of mobile Operating Systems. - * - * @var array - */ - protected static $operatingSystems = array( - 'AndroidOS' => 'Android', - 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', - 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', - 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', - // @reference: http://en.wikipedia.org/wiki/Windows_Mobile - 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', - // @reference: http://en.wikipedia.org/wiki/Windows_Phone - // http://wifeng.cn/?r=blog&a=view&id=106 - // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx - // http://msdn.microsoft.com/library/ms537503.aspx - 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', - 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', - // http://en.wikipedia.org/wiki/MeeGo - // @todo: research MeeGo in UAs - 'MeeGoOS' => 'MeeGo', - // http://en.wikipedia.org/wiki/Maemo - // @todo: research Maemo in UAs - 'MaemoOS' => 'Maemo', - 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 - 'webOS' => 'webOS|hpwOS', - 'badaOS' => '\bBada\b', - 'BREWOS' => 'BREW', - ); - - /** - * List of mobile User Agents. - * - * @var array - */ - protected static $browsers = array( - // @reference: https://developers.google.com/chrome/mobile/docs/user-agent - 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', - 'Dolfin' => '\bDolfin\b', - 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', - 'Skyfire' => 'Skyfire', - 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ - 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', - 'Bolt' => 'bolt', - 'TeaShark' => 'teashark', - 'Blazer' => 'Blazer', - // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 - 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', - // http://en.wikipedia.org/wiki/Midori_(web_browser) - //'Midori' => 'midori', - 'Tizen' => 'Tizen', - 'UCBrowser' => 'UC.*Browser|UCWEB', - 'baiduboxapp' => 'baiduboxapp', - 'baidubrowser' => 'baidubrowser', - // https://github.com/serbanghita/Mobile-Detect/issues/7 - 'DiigoBrowser' => 'DiigoBrowser', - // http://www.puffinbrowser.com/index.php - 'Puffin' => 'Puffin', - // http://mercury-browser.com/index.html - 'Mercury' => '\bMercury\b', - // http://en.wikipedia.org/wiki/Obigo_Browser - 'ObigoBrowser' => 'Obigo', - // http://en.wikipedia.org/wiki/NetFront - 'NetFront' => 'NF-Browser', - // @reference: http://en.wikipedia.org/wiki/Minimo - // http://en.wikipedia.org/wiki/Vision_Mobile_Browser - 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', - ); - - /** - * Utilities. - * - * @var array - */ - protected static $utilities = array( - // Experimental. When a mobile device wants to switch to 'Desktop Mode'. - // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ - // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 - 'DesktopMode' => 'WPDesktop', - 'TV' => 'SonyDTV|HbbTV', // experimental - 'WebKit' => '(webkit)[ /]([\w.]+)', - 'Bot' => 'Googlebot|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', - 'MobileBot' => 'Googlebot-Mobile|YahooSeeker/M1A1-R2D2', - // @todo: Include JXD consoles. - 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', - 'Watch' => 'SM-V700', - ); - - /** - * All possible HTTP headers that represent the - * User-Agent string. - * - * @var array - */ - protected static $uaHttpHeaders = array( - // The default User-Agent string. - 'HTTP_USER_AGENT', - // Header can occur on devices using Opera Mini. - 'HTTP_X_OPERAMINI_PHONE_UA', - // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ - 'HTTP_X_DEVICE_USER_AGENT', - 'HTTP_X_ORIGINAL_USER_AGENT', - 'HTTP_X_SKYFIRE_PHONE', - 'HTTP_X_BOLT_PHONE_UA', - 'HTTP_DEVICE_STOCK_UA', - 'HTTP_X_UCBROWSER_DEVICE_UA' - ); - - /** - * The individual segments that could exist in a User-Agent string. VER refers to the regular - * expression defined in the constant self::VER. - * - * @var array - */ - protected static $properties = array( - - // Build - 'Mobile' => 'Mobile/[VER]', - 'Build' => 'Build/[VER]', - 'Version' => 'Version/[VER]', - 'VendorID' => 'VendorID/[VER]', - - // Devices - 'iPad' => 'iPad.*CPU[a-z ]+[VER]', - 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', - 'iPod' => 'iPod.*CPU[a-z ]+[VER]', - //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), - 'Kindle' => 'Kindle/[VER]', - - // Browser - 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), - 'Coast' => array('Coast/[VER]'), - 'Dolfin' => 'Dolfin/[VER]', - // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference - 'Firefox' => 'Firefox/[VER]', - 'Fennec' => 'Fennec/[VER]', - // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx - 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), - // http://en.wikipedia.org/wiki/NetFront - 'NetFront' => 'NetFront/[VER]', - 'NokiaBrowser' => 'NokiaBrowser/[VER]', - 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), - 'Opera Mini' => 'Opera Mini/[VER]', - 'Opera Mobi' => 'Version/[VER]', - 'UC Browser' => 'UC Browser[VER]', - 'MQQBrowser' => 'MQQBrowser/[VER]', - 'MicroMessenger' => 'MicroMessenger/[VER]', - 'baiduboxapp' => 'baiduboxapp/[VER]', - 'baidubrowser' => 'baidubrowser/[VER]', - 'Iron' => 'Iron/[VER]', - // @note: Safari 7534.48.3 is actually Version 5.1. - // @note: On BlackBerry the Version is overwriten by the OS. - 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), - 'Skyfire' => 'Skyfire/[VER]', - 'Tizen' => 'Tizen/[VER]', - 'Webkit' => 'webkit[ /][VER]', - - // Engine - 'Gecko' => 'Gecko/[VER]', - 'Trident' => 'Trident/[VER]', - 'Presto' => 'Presto/[VER]', - - // OS - 'iOS' => ' \bOS\b [VER] ', - 'Android' => 'Android [VER]', - 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), - 'BREW' => 'BREW [VER]', - 'Java' => 'Java/[VER]', - // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx - // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases - 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), - 'Windows Phone' => 'Windows Phone [VER]', - 'Windows CE' => 'Windows CE/[VER]', - // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd - 'Windows NT' => 'Windows NT [VER]', - 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), - 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), - ); - - /** - * Construct an instance of this class. - * - * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. - * If left empty, will use the global _SERVER['HTTP_*'] vars instead. - * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT - * from the $headers array instead. - */ - public function __construct( - array $headers = null, - $userAgent = null - ) { - $this->setHttpHeaders($headers); - $this->setUserAgent($userAgent); - } - - /** - * Get the current script version. - * This is useful for the demo.php file, - * so people can check on what version they are testing - * for mobile devices. - * - * @return string The version number in semantic version format. - */ - public static function getScriptVersion() - { - return self::VERSION; - } - - /** - * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. - * - * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract - * the headers. The default null is left for backwards compatibilty. - */ - public function setHttpHeaders($httpHeaders = null) - { - //use global _SERVER if $httpHeaders aren't defined - if (!is_array($httpHeaders) || !count($httpHeaders)) { - $httpHeaders = $_SERVER; - } - - //clear existing headers - $this->httpHeaders = array(); - - //Only save HTTP headers. In PHP land, that means only _SERVER vars that - //start with HTTP_. - foreach ($httpHeaders as $key => $value) { - if (substr($key,0,5) == 'HTTP_') { - $this->httpHeaders[$key] = $value; - } - } - } - - /** - * Retrieves the HTTP headers. - * - * @return array - */ - public function getHttpHeaders() - { - return $this->httpHeaders; - } - - /** - * Retrieves a particular header. If it doesn't exist, no exception/error is caused. - * Simply null is returned. - * - * @param string $header The name of the header to retrieve. Can be HTTP compliant such as - * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the - * all-caps, HTTP_ prefixed, underscore seperated awesomeness. - * - * @return string|null The value of the header. - */ - public function getHttpHeader($header) - { - //are we using PHP-flavored headers? - if (strpos($header, '_') === false) { - $header = str_replace('-', '_', $header); - $header = strtoupper($header); - } - - //test the alternate, too - $altHeader = 'HTTP_' . $header; - - //Test both the regular and the HTTP_ prefix - if (isset($this->httpHeaders[$header])) { - return $this->httpHeaders[$header]; - } elseif (isset($this->httpHeaders[$altHeader])) { - return $this->httpHeaders[$altHeader]; - } - - return null; - } - - public function getMobileHeaders() - { - return self::$mobileHeaders; - } - - /** - * Get all possible HTTP headers that - * can contain the User-Agent string. - * - * @return array List of HTTP headers. - */ - public function getUaHttpHeaders() - { - return self::$uaHttpHeaders; - } - - /** - * Set the User-Agent to be used. - * - * @param string $userAgent The user agent string to set. - * - * @return string|null - */ - public function setUserAgent($userAgent = null) - { - if (!empty($userAgent)) { - return $this->userAgent = $userAgent; - } else { - $this->userAgent = null; - foreach ($this->getUaHttpHeaders() as $altHeader) { - if (!empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) - $this->userAgent .= $this->httpHeaders[$altHeader] . " "; - } - } - - return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null); - - } - } - - /** - * Retrieve the User-Agent. - * - * @return string|null The user agent if it's set. - */ - public function getUserAgent() - { - return $this->userAgent; - } - - /** - * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or - * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. - * - * @deprecated since version 2.6.9 - * - * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default - * parameter is null which will default to self::DETECTION_TYPE_MOBILE. - */ - public function setDetectionType($type = null) - { - if ($type === null) { - $type = self::DETECTION_TYPE_MOBILE; - } - - if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { - return; - } - - $this->detectionType = $type; - } - - public function getMatchingRegex() - { - return $this->matchingRegex; - } - - public function getMatchesArray() - { - return $this->matchesArray; - } - - /** - * Retrieve the list of known phone devices. - * - * @return array List of phone devices. - */ - public static function getPhoneDevices() - { - return self::$phoneDevices; - } - - /** - * Retrieve the list of known tablet devices. - * - * @return array List of tablet devices. - */ - public static function getTabletDevices() - { - return self::$tabletDevices; - } - - /** - * Alias for getBrowsers() method. - * - * @return array List of user agents. - */ - public static function getUserAgents() - { - return self::getBrowsers(); - } - - /** - * Retrieve the list of known browsers. Specifically, the user agents. - * - * @return array List of browsers / user agents. - */ - public static function getBrowsers() - { - return self::$browsers; - } - - /** - * Retrieve the list of known utilities. - * - * @return array List of utilities. - */ - public static function getUtilities() - { - return self::$utilities; - } - - /** - * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). - * - * @deprecated since version 2.6.9 - * - * @return array All the rules (but not extended). - */ - public static function getMobileDetectionRules() - { - static $rules; - - if (!$rules) { - $rules = array_merge( - self::$phoneDevices, - self::$tabletDevices, - self::$operatingSystems, - self::$browsers - ); - } - - return $rules; - - } - - /** - * Method gets the mobile detection rules + utilities. - * The reason this is separate is because utilities rules - * don't necessary imply mobile. This method is used inside - * the new $detect->is('stuff') method. - * - * @deprecated since version 2.6.9 - * - * @return array All the rules + extended. - */ - public function getMobileDetectionRulesExtended() - { - static $rules; - - if (!$rules) { - // Merge all rules together. - $rules = array_merge( - self::$phoneDevices, - self::$tabletDevices, - self::$operatingSystems, - self::$browsers, - self::$utilities - ); - } - - return $rules; - } - - /** - * Retrieve the current set of rules. - * - * @deprecated since version 2.6.9 - * - * @return array - */ - public function getRules() - { - if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { - return self::getMobileDetectionRulesExtended(); - } else { - return self::getMobileDetectionRules(); - } - } - - /** - * Retrieve the list of mobile operating systems. - * - * @return array The list of mobile operating systems. - */ - public static function getOperatingSystems() - { - return self::$operatingSystems; - } - - /** - * Check the HTTP headers for signs of mobile. - * This is the fastest mobile check possible; it's used - * inside isMobile() method. - * - * @return bool - */ - public function checkHttpHeadersForMobile() - { - - foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { - if ( isset($this->httpHeaders[$mobileHeader]) ) { - if ( is_array($matchType['matches']) ) { - foreach ($matchType['matches'] as $_match) { - if ( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ) { - return true; - } - } - - return false; - } else { - return true; - } - } - } - - return false; - - } - - /** - * Magic overloading method. - * - * @method boolean is[...]() - * @param string $name - * @param array $arguments - * @return mixed - * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' - */ - public function __call($name, $arguments) - { - //make sure the name starts with 'is', otherwise - if (substr($name, 0, 2) != 'is') { - throw new BadMethodCallException("No such method exists: $name"); - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - $key = substr($name, 2); - - return $this->matchUAAgainstKey($key); - } - - /** - * Find a detection rule that matches the current User-agent. - * - * @param null $userAgent deprecated - * @return boolean - */ - protected function matchDetectionRulesAgainstUA($userAgent = null) - { - // Begin general search. - foreach ($this->getRules() as $_regex) { - if (empty($_regex)) { - continue; - } - if ($this->match($_regex, $userAgent)) { - return true; - } - } - - return false; - } - - /** - * Search for a certain key in the rules array. - * If the key is found the try to match the corresponding - * regex agains the User-Agent. - * - * @param string $key - * @param null $userAgent deprecated - * @return mixed - */ - protected function matchUAAgainstKey($key, $userAgent = null) - { - // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. - $key = strtolower($key); - - //change the keys to lower case - $_rules = array_change_key_case($this->getRules()); - - if (array_key_exists($key, $_rules)) { - if (empty($_rules[$key])) { - return null; - } - - return $this->match($_rules[$key], $userAgent); - } - - return false; - } - - /** - * Check if the device is mobile. - * Returns true if any type of mobile device detected, including special ones - * @param null $userAgent deprecated - * @param null $httpHeaders deprecated - * @return bool - */ - public function isMobile($userAgent = null, $httpHeaders = null) - { - - if ($httpHeaders) { - $this->setHttpHeaders($httpHeaders); - } - - if ($userAgent) { - $this->setUserAgent($userAgent); - } - - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - if ($this->checkHttpHeadersForMobile()) { - return true; - } else { - return $this->matchDetectionRulesAgainstUA(); - } - - } - - /** - * Check if the device is a tablet. - * Return true if any type of tablet device is detected. - * - * @param string $userAgent deprecated - * @param array $httpHeaders deprecated - * @return bool - */ - public function isTablet($userAgent = null, $httpHeaders = null) - { - $this->setDetectionType(self::DETECTION_TYPE_MOBILE); - - foreach (self::$tabletDevices as $_regex) { - if ($this->match($_regex, $userAgent)) { - return true; - } - } - - return false; - } - - /** - * This method checks for a certain property in the - * userAgent. - * @todo: The httpHeaders part is not yet used. - * - * @param string $key - * @param string $userAgent deprecated - * @param string $httpHeaders deprecated - * @return bool|int|null - */ - public function is($key, $userAgent = null, $httpHeaders = null) - { - // Set the UA and HTTP headers only if needed (eg. batch mode). - if ($httpHeaders) { - $this->setHttpHeaders($httpHeaders); - } - - if ($userAgent) { - $this->setUserAgent($userAgent); - } - - $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); - - return $this->matchUAAgainstKey($key); - } - - /** - * Some detection rules are relative (not standard), - * because of the diversity of devices, vendors and - * their conventions in representing the User-Agent or - * the HTTP headers. - * - * This method will be used to check custom regexes against - * the User-Agent string. - * - * @param $regex - * @param string $userAgent - * @return bool - * - * @todo: search in the HTTP headers too. - */ - public function match($regex, $userAgent = null) - { - // Escape the special character which is the delimiter. - $regex = str_replace('/', '\/', $regex); - $match = (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent), $matches); - // If positive match is found, store the results for debug. - if ($match) { - $this->matchingRegex = $regex; - $this->matchesArray = $matches; - } - - return $match; - } - - /** - * Get the properties array. - * - * @return array - */ - public static function getProperties() - { - return self::$properties; - } - - /** - * Prepare the version number. - * - * @todo Remove the error supression from str_replace() call. - * - * @param string $ver The string version, like "2.6.21.2152"; - * - * @return float - */ - public function prepareVersionNo($ver) - { - $ver = str_replace(array('_', ' ', '/'), '.', $ver); - $arrVer = explode('.', $ver, 2); - - if (isset($arrVer[1])) { - $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. - } - - return (float) implode('.', $arrVer); - } - - /** - * Check the version of the given property in the User-Agent. - * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) - * - * @param string $propertyName The name of the property. See self::getProperties() array - * keys for all possible properties. - * @param string $type Either self::VERSION_TYPE_STRING to get a string value or - * self::VERSION_TYPE_FLOAT indicating a float value. This parameter - * is optional and defaults to self::VERSION_TYPE_STRING. Passing an - * invalid parameter will default to the this type as well. - * - * @return string|float The version of the property we are trying to extract. - */ - public function version($propertyName, $type = self::VERSION_TYPE_STRING) - { - if (empty($propertyName)) { - return false; - } - - //set the $type to the default if we don't recognize the type - if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) { - $type = self::VERSION_TYPE_STRING; - } - - $properties = self::getProperties(); - - // Check if the property exists in the properties array. - if (array_key_exists($propertyName, $properties)) { - - // Prepare the pattern to be matched. - // Make sure we always deal with an array (string is converted). - $properties[$propertyName] = (array) $properties[$propertyName]; - - foreach ($properties[$propertyName] as $propertyMatchString) { - - $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); - - // Escape the special character which is the delimiter. - $propertyPattern = str_replace('/', '\/', $propertyPattern); - - // Identify and extract the version. - preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); - - if (!empty($match[1])) { - $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] ); - - return $version; - } - - } - - } - - return false; - } - - /** - * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. - * - * @return string One of the self::MOBILE_GRADE_* constants. - */ - public function mobileGrade() - { - $isMobile = $this->isMobile(); - - if ( - // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=4.3 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)>=4.3 || - - // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) - // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM - // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices - // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 - ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || - - // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) - $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.5 || - - // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) - $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 || - // Blackberry Playbook (1.0-2.0) - Tested on PlayBook - $this->match('Playbook.*Tablet') || - - // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) - ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) || - // Palm WebOS 3.0 - Tested on HP TouchPad - $this->match('hp.*TouchPad') || - - // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices - ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=18 ) || - - // Chrome for Android - Tested on Android 4.0, 4.1 device - ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) || - - // Skyfire 4.1 - Tested on Android 2.3 device - ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || - - // Opera Mobile 11.5-12: Tested on Android 2.3 - ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11.5 && $this->is('AndroidOS') ) || - - // Meego 1.2 - Tested on Nokia 950 and N9 - $this->is('MeeGoOS') || - - // Tizen (pre-release) - Tested on early hardware - $this->is('Tizen') || - - // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser - // @todo: more tests here! - $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 || - - // UC Browser - Tested on Android 2.3 device - ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || - - // Kindle 3 and Fire - Tested on the built-in WebKit browser for each - ( $this->match('Kindle Fire') || - $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) || - - // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet - $this->is('AndroidOS') && $this->is('NookTablet') || - - // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 - $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=16 && !$isMobile || - - // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 - $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile || - - // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 - $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=10.0 && !$isMobile || - - // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 - $this->version('IE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile || - - // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 - $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile - ){ - return self::MOBILE_GRADE_A; - } - - if ( - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || - - // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 - $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || - - //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 - ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=7.0 && - ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) || - - // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) - $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || - - // @todo: report this (tested on Nokia N71) - $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS') - ){ - return self::MOBILE_GRADE_B; - } - - if ( - // Blackberry 4.x - Tested on the Curve 8330 - $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<=5.0 || - // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) - $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2 || - - // Tested on original iPhone (3.1), iPhone 3 (3.2) - $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<=3.2 || - $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<=3.2 || - $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<=3.2 || - - // Internet Explorer 7 and older - Tested on Windows XP - $this->version('IE', self::VERSION_TYPE_FLOAT)<=7.0 && !$isMobile - ){ - return self::MOBILE_GRADE_C; - } - - //All older smartphone platforms and featurephones - Any device that doesn't support media queries - //will receive the basic, C grade experience. - return self::MOBILE_GRADE_C; - } - } -} \ No newline at end of file diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index 4cfd3c74..244f3f19 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -693,6 +693,29 @@ function um_user_submitted_registration_formatted( $style = false ) { $output .= um_user_submited_display( 'use_gdpr_agreement', __( 'GDPR Applied', 'ultimate-member' ), $submitted_data ); } + /** + * Filters the custom HTML before user registration submitted and formatted data. + * + * @param {string} $before_html Custom HTML before submitted data. + * @param {string} $output Prepared submitted data in HTML format. + * @param {array} $submitted_data Submitted user data during registration. + * + * @return {string} Custom HTML before submitted data. + * + * @since 2.9.2 + * @hook um_before_user_submitted_registration_data + * + * @example Change custom HTML before user registration submitted and formatted data. + * function my_user_submitted_registration_data( $before_html, $output, $submitted_data ) { + * if ( ! empty( $submitted_data['custom_data'] ) ) { + * $before_html .= 'Custom HTML here'; + * } + * return $before_html; + * } + * add_filter( 'um_before_user_submitted_registration_data', 'my_user_submitted_registration_data', 10, 3 ); + */ + $output .= apply_filters( 'um_before_user_submitted_registration_data', '', $output, $submitted_data ); + if ( isset( $submitted_data ) && is_array( $submitted_data ) ) { if ( isset( $submitted_data['form_id'] ) ) { @@ -810,6 +833,8 @@ function um_user_submitted_registration_formatted( $style = false ) { } } + $output .= apply_filters( 'um_after_user_submitted_registration_data', '', $output, $submitted_data ); + if ( $style ) { $output .= ''; } diff --git a/readme.txt b/readme.txt index 444f048e..c3f8ca15 100644 --- a/readme.txt +++ b/readme.txt @@ -167,26 +167,39 @@ 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.9.2 2024-12-17 = += 2.9.2 2025-01-14 = **Enhancements** * Added: Compatibility with the new [Ultimate Member - Zapier](https://ultimatemember.com/extensions/zapier/) extension +* Added: Only approved user Reset Password setting defined as true by default * Added: `UM()->is_new_ui()` function for future enhancements related to new UI +* Added: Filter hook `um_before_user_submitted_registration_data` * Tweak: Changed hook's priority for initialization of email templates paths * Tweak: Removed `load_plugin_textdomain` due to (article)[https://make.wordpress.org/core/2024/10/21/i18n-improvements-6-7/#Enhanced-support-for-only-using-PHP-translation-files] **Bugfixes** +* Fixed: Security issue CVE ID: CVE-2025-0308 +* Fixed: Security issue CVE ID: CVE-2025-0318 * Fixed: Using placeholders in email templates when Action Scheduler is active. Using `fetch_user_id` attribute for fetching necessary user before sending email +* Fixed: PHP 8.4 compatibility. Using WordPress native `wp_is_mobile()` instead of MobileDetect library * Fixed: PHP errors related to `UM()->localize()` function * Fixed: PHP errors in user meta header when `last_update` meta is empty +* Fixed: Small CSS changes and avoid duplicates +* Fixed: Removed ms-native show password button for type="password" field in UM forms +* Fixed: Define scalable attribute for cropper **Deprecated** +* Fully deprecated `UM()->mobile()` function * Fully deprecated `UM()->localize()` function * Fully deprecated `um_language_textdomain` filter hook +**Templates required update** + +* account.php + **Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** = 2.9.1 2024-11-15 = @@ -224,6 +237,9 @@ IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSI == Upgrade Notice == += 2.9.2 = +This version fixes a security related bug. Upgrade immediately. + = 2.9.0 = This version fixes a security related bug. Upgrade immediately. diff --git a/templates/account.php b/templates/account.php index aa7c5d99..41e36d42 100644 --- a/templates/account.php +++ b/templates/account.php @@ -6,7 +6,7 @@ * * Page: "Account" * - * @version 2.7.0 + * @version 2.9.2 * * @var string $mode * @var int $form_id @@ -75,7 +75,7 @@ if ( ! defined( 'ABSPATH' ) ) { - mobile()->isMobile() ) { ?> +
@@ -114,7 +114,7 @@ if ( ! defined( 'ABSPATH' ) ) { ?>