diff --git a/README.md b/README.md index e5fe5998..2c56d669 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.8.3](https://github.com/ultimatemember/ultimatemember/releases/tag/2.8.3). +[Official Release Version: 2.8.5](https://github.com/ultimatemember/ultimatemember/releases/tag/2.8.5). ## Changelog diff --git a/assets/css/admin/block.css b/assets/css/admin/block.css index 69ad1ae3..bc34c405 100644 --- a/assets/css/admin/block.css +++ b/assets/css/admin/block.css @@ -1,14 +1,17 @@ .um_block_settings .um_block_settings_hide { - display: none; } - + display: none; +} .um_block_settings .components-select-control .components-select-control__input[multiple] { - height: auto; } - .um_block_settings .components-select-control .components-select-control__input[multiple] + .components-input-control__suffix { - display: none; } + height: auto; +} +.um_block_settings .components-select-control .components-select-control__input[multiple] + .components-input-control__suffix { + display: none; +} .um-block-notice { background: #fff; - font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen-Sans, Ubuntu, Cantarell, Helvetica Neue, sans-serif; font-size: 13px; padding: 20px; - border: 1px solid #000; } + border: 1px solid #000; +} \ No newline at end of file diff --git a/assets/css/admin/builder-rtl.css b/assets/css/admin/builder-rtl.css index 28ebb947..a7fe152f 100644 --- a/assets/css/admin/builder-rtl.css +++ b/assets/css/admin/builder-rtl.css @@ -1,29 +1,38 @@ .um-admin-drag-ctrls-demo.um-admin-drag-ctrls { left: 12px; - right: auto; } + right: auto; +} .um-admin-drag-row-icons { left: 0; - right: auto; } - .um-admin-drag-row-icons a { - float: right; } + right: auto; +} +.um-admin-drag-row-icons a { + float: right; +} .um-admin-drag-ctrls.columns { right: 0 !important; - left: auto; } - .um-admin-drag-ctrls.columns a { - float: right; } + left: auto; +} +.um-admin-drag-ctrls.columns a { + float: right; +} .um-admin-drag-rowsub-icons { right: auto; - left: 0; } + left: 0; +} .um-admin-drag-fld-icons { - float: left; } - .um-admin-drag-fld-icons a { - float: right; } + float: left; +} +.um-admin-drag-fld-icons a { + float: right; +} .um-admin-drag-fld-title, .um-admin-drag-fld-type { float: right; - margin: 0 20px 0 0; } + margin: 0 20px 0 0; +} \ No newline at end of file diff --git a/assets/css/admin/builder.css b/assets/css/admin/builder.css index c34e6978..104f6dd7 100644 --- a/assets/css/admin/builder.css +++ b/assets/css/admin/builder.css @@ -1,123 +1,145 @@ @-webkit-keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} @-moz-keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} @-ms-keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} @keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} .um-admin-row-loading { position: absolute; width: 100%; - height: calc( 100% + 30px); + height: calc(100% + 30px); top: -30px; left: 0; background: rgba(241, 241, 241, 0.6); z-index: 999; - display: none; } - .um-admin-row-loading > span { - display: block; - -webkit-transition: 0.1s opacity; - -moz-transition: 0.1s opacity; - -ms-transition: 0.1s opacity; - -o-transition: 0.1s opacity; - transition: 0.1s opacity; - color: #c6c6c6 !important; - -webkit-animation: um-ajax-spinning 1.1s infinite linear; - animation: um-ajax-spinning 1.1s infinite linear; - border-top: 0.2em solid black; - border-right: 0.2em solid black; - border-bottom: 0.2em solid black; - border-left: 0.2em solid #c6c6c6; - font-size: 1.75em; - filter: alpha(opacity=0); - -ms-transform: translateZ(0); - transform: translateZ(0); - border-radius: 50%; - width: 40px; - height: 40px; - margin: -20px 0 0 -20px; - outline: 0; - padding: 0; - vertical-align: baseline; - position: absolute; - left: 50%; - top: 50%; } + display: none; +} +.um-admin-row-loading > span { + display: block; + -webkit-transition: 0.1s opacity; + -moz-transition: 0.1s opacity; + -ms-transition: 0.1s opacity; + -o-transition: 0.1s opacity; + transition: 0.1s opacity; + color: #c6c6c6 !important; + -webkit-animation: um-ajax-spinning 1.1s infinite linear; + animation: um-ajax-spinning 1.1s infinite linear; + border-top: 0.2em solid rgb(0, 0, 0); + border-right: 0.2em solid rgb(0, 0, 0); + border-bottom: 0.2em solid rgb(0, 0, 0); + border-left: 0.2em solid #c6c6c6; + font-size: 1.75em; + filter: alpha(opacity=0); + -ms-transform: translateZ(0); + transform: translateZ(0); + border-radius: 50%; + width: 40px; + height: 40px; + margin: -20px 0 0 -20px; + outline: 0; + padding: 0; + vertical-align: baseline; + position: absolute; + left: 50%; + top: 50%; +} .um-admin-boxed-links { width: 100%; - text-align: center; } - .um-admin-boxed-links a { - width: 33.3%; - float: left; - border-left: 1px solid #fff; - border-right: 1px solid #fff; - padding: 30px 25px !important; - background: #f8f8f8; - text-align: center; - display: inline-block !important; - font-size: 14px; - transition: all .2s linear; - text-decoration: none; - color: #666; - margin: 0 !important; - box-sizing: border-box !important; - border-radius: 2px; - font-weight: 600; } - .um-admin-boxed-links a:hover { - background: #eee; } - .um-admin-boxed-links a.um-admin-activebg { - background: #0085ba; - color: #fff; } - .um-admin-boxed-links a.um-admin-activebg:hover { - background: #0085ba; - color: #fff; } - .um-admin-boxed-links i { - font-size: 28px; - vertical-align: middle; - margin: 0 10px 0 0; } + text-align: center; +} +.um-admin-boxed-links a { + width: 33.3%; + float: left; + border-left: 1px solid #fff; + border-right: 1px solid #fff; + padding: 30px 25px !important; + background: #f8f8f8; + text-align: center; + display: inline-block !important; + font-size: 14px; + transition: all 0.2s linear; + text-decoration: none; + color: #666; + margin: 0 !important; + box-sizing: border-box !important; + border-radius: 2px; + font-weight: 600; +} +.um-admin-boxed-links a:hover { + background: #eee; +} +.um-admin-boxed-links a.um-admin-activebg { + background: #0085ba; + color: #fff; +} +.um-admin-boxed-links a.um-admin-activebg:hover { + background: #0085ba; + color: #fff; +} +.um-admin-boxed-links i { + font-size: 28px; + vertical-align: middle; + margin: 0 10px 0 0; +} .um-admin-half { float: left; - width: 48%; } - .um-admin-half select { - box-sizing: border-box; } - .um-admin-half.um-admin-right { - float: right; } - .um-admin-half p:first-child { - margin-top: 0; } - .um-admin-half .um { - opacity: 1; - margin-bottom: 0 !important; } + width: 48%; +} +.um-admin-half select { + box-sizing: border-box; +} +.um-admin-half.um-admin-right { + float: right; +} +.um-admin-half p:first-child { + margin-top: 0; +} +.um-admin-half .um { + opacity: 1; + margin-bottom: 0 !important; +} .um-admin-tri { float: left; width: 33%; - position: relative; } + position: relative; +} .um-admin-error-block, .um-admin-success-block { @@ -131,16 +153,20 @@ padding: 12px; font-size: 13px; line-height: 1em !important; - margin: 0 0 16px 0; } + margin: 0 0 16px 0; +} .um-admin-success-block { - background: #7acf58; } + background: #7acf58; +} .um-admin-cur-condition-template { - display: none; } + display: none; +} .dynamic-mce-content { - display: none; } + display: none; +} .um-admin-btns { line-height: 1.5em; @@ -149,70 +175,88 @@ flex-direction: row; justify-content: flex-start; align-items: baseline; - flex-wrap: wrap; } - .um-admin-btns .um-no-custom-fields { - margin: 0; } - .um-admin-btns a { - margin: 0 3px 8px 0 !important; - font-size: 12px !important; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; - display: flex !important; } - .um-admin-btns a.with-icon span { - color: #aaa; - font-size: 15px !important; - padding-left: 5px; - height: auto; - width: auto; } - .um-admin-btns a.with-icon:hover span { - color: #cb3838; } + flex-wrap: wrap; +} +.um-admin-btns .um-no-custom-fields { + margin: 0; +} +.um-admin-btns a { + margin: 0 3px 8px 0 !important; + font-size: 12px !important; + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; + display: flex !important; +} +.um-admin-btns a.with-icon span { + color: #aaa; + font-size: 15px !important; + padding-left: 5px; + height: auto; + width: auto; +} +.um-admin-btns a.with-icon:hover span { + color: #cb3838; +} .um-admin-btn-toggle { - padding: 10px 0; } - .um-admin-btn-toggle p { - margin: 0 5px 0 0 !important; } - .um-admin-btn-toggle p.um-admin-reset-conditions a { - margin-bottom: 5px; } - .um-admin-btn-toggle a { - text-decoration: none; - color: #999; } - .um-admin-btn-toggle a.um-admin-new-condition { - margin-bottom: 5px; } - .um-admin-btn-toggle a.active { - color: #0085ba; } - .um-admin-btn-toggle a.active:hover { - color: #0085ba; } - .um-admin-btn-toggle i { - margin: 0 5px 0 0 !important; - height: 100%; - color: #666; - position: relative; - top: 1px; } + padding: 10px 0; +} +.um-admin-btn-toggle p { + margin: 0 5px 0 0 !important; +} +.um-admin-btn-toggle p.um-admin-reset-conditions a { + margin-bottom: 5px; +} +.um-admin-btn-toggle a { + text-decoration: none; + color: #999; +} +.um-admin-btn-toggle a.um-admin-new-condition { + margin-bottom: 5px; +} +.um-admin-btn-toggle a.active { + color: #0085ba; +} +.um-admin-btn-toggle a.active:hover { + color: #0085ba; +} +.um-admin-btn-toggle i { + margin: 0 5px 0 0 !important; + height: 100%; + color: #666; + position: relative; + top: 1px; +} .um-admin-btn-content { display: none; - padding: 5px 0 0 0; } - .um-admin-btn-content p { - float: left; - margin-right: 10px !important; - padding: 0 !important; } - .um-admin-btn-content p.um-admin-conditions-notice { - width: 100%; - margin: 0 0 9px 0 !important; } - .um-admin-btn-content .um-admin-cur-condition:not(:last-child) { - margin: 0 0 5px 0; } + padding: 5px 0 0 0; +} +.um-admin-btn-content p { + float: left; + margin-right: 10px !important; + padding: 0 !important; +} +.um-admin-btn-content p.um-admin-conditions-notice { + width: 100%; + margin: 0 0 9px 0 !important; +} +.um-admin-btn-content .um-admin-cur-condition:not(:last-child) { + margin: 0 0 5px 0; +} .um-admin-builder i { font-size: 15px !important; height: 100% !important; line-height: 100% !important; - margin: 0 5px 0 0 !important; } - + margin: 0 5px 0 0 !important; +} .um-admin-builder .um-admin-drag { - margin-top: 40px; } + margin-top: 40px; +} .um-admin-drag-add-field { display: block; @@ -221,52 +265,66 @@ line-height: 30px; text-align: center; color: #aaa; - text-decoration: none; } - .um-admin-drag-add-field:hover { - color: #0085ba; } - .um-admin-drag-add-field i { - font-size: 23px !important; - margin: 0 !important; } + text-decoration: none; +} +.um-admin-drag-add-field:hover { + color: #0085ba; +} +.um-admin-drag-add-field i { + font-size: 23px !important; + margin: 0 !important; +} .um-admin-drag-ctrls { position: absolute; top: -30px; - left: 0; } - .um-admin-drag-ctrls.um-admin-drag-ctrls-demo { - position: absolute; - right: 7px; - top: -30px; - left: auto; } - .um-admin-drag-ctrls a { - float: left; - margin: 0 5px 0 0; - height: 30px; - line-height: 30px; - background: #eee; - color: #888; - padding: 0 8px; - text-decoration: none; - border-radius: 2px 2px 0 0; } - .um-admin-drag-ctrls a:hover { - background-color: #e5e5e5; } - .um-admin-drag-ctrls a.active, .um-admin-drag-ctrls a.active:hover { - background-color: #0085ba; - color: #fff; } - .um-admin-drag-ctrls.columns a { - width: 30px !important; - background-image: url(../../img/builder/1-column.gif); - background-repeat: no-repeat; - background-position: center; } - .um-admin-drag-ctrls.columns a:nth-child(2) { - background-image: url(../../img/builder/2-columns.gif); } - .um-admin-drag-ctrls.columns a:last-child { - background-image: url(../../img/builder/3-columns.gif); } - .um-admin-drag-ctrls.columns a.active { - background-image: url(../../img/builder/1-column-active.gif); } - .um-admin-drag-ctrls.columns a.active:nth-child(2) { - background-image: url(../../img/builder/2-columns-active.gif); } - .um-admin-drag-ctrls.columns a.active:last-child { - background-image: url(../../img/builder/3-columns-active.gif); } + left: 0; +} +.um-admin-drag-ctrls.um-admin-drag-ctrls-demo { + position: absolute; + right: 7px; + top: -30px; + left: auto; +} +.um-admin-drag-ctrls a { + float: left; + margin: 0 5px 0 0; + height: 30px; + line-height: 30px; + background: #eee; + color: #888; + padding: 0 8px; + text-decoration: none; + border-radius: 2px 2px 0 0; +} +.um-admin-drag-ctrls a:hover { + background-color: #e5e5e5; +} +.um-admin-drag-ctrls a.active, .um-admin-drag-ctrls a.active:hover { + background-color: #0085ba; + color: #fff; +} +.um-admin-drag-ctrls.columns a { + width: 30px !important; + background-image: url(../../img/builder/1-column.gif); + background-repeat: no-repeat; + background-position: center; +} +.um-admin-drag-ctrls.columns a:nth-child(2) { + background-image: url(../../img/builder/2-columns.gif); +} +.um-admin-drag-ctrls.columns a:last-child { + background-image: url(../../img/builder/3-columns.gif); +} +.um-admin-drag-ctrls.columns a.active { + background-image: url(../../img/builder/1-column-active.gif); +} +.um-admin-drag-ctrls.columns a.active:nth-child(2) { + background-image: url(../../img/builder/2-columns-active.gif); +} +.um-admin-drag-ctrls.columns a.active:last-child { + background-image: url(../../img/builder/3-columns-active.gif); +} .um-admin-drag { width: 100%; @@ -275,7 +333,8 @@ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; position: relative; - padding: 60px 20px 20px 20px; } + padding: 60px 20px 20px 20px; +} .um-admin-drag-row { width: 100%; @@ -285,51 +344,59 @@ -webkit-box-sizing: border-box; position: relative; padding: 60px 20px 20px 20px; - margin: 0 0 60px 0; } - .um-admin-drag-row:last-child { - margin-bottom: 0; } + margin: 0 0 60px 0; +} +.um-admin-drag-row:last-child { + margin-bottom: 0; +} .um-admin-drag-row-icons { position: absolute; right: 0; top: -30px; - height: 30px; } - .um-admin-drag-row-icons a { - text-decoration: none; - color: #fff; - width: 40px; - height: 30px; - line-height: 30px; - text-align: center; - display: block !important; - float: left; - background: #0085ba; - padding: 0 4px; - transition: all .2s linear; - border-left: 1px solid #379dd5; } - .um-admin-drag-row-icons a:hover { - background: #008ec2; } - .um-admin-drag-row-icons span { - cursor: move !important; - text-decoration: none; - color: #fff; - width: 40px; - height: 30px; - line-height: 30px; - text-align: center; - display: block !important; - float: left; - background: #0085ba; - padding: 0 4px; - transition: all .2s linear; - border-left: 1px solid #379dd5; } - .um-admin-drag-row-icons span:hover { - background: #008ec2; } - .um-admin-drag-row-icons i { - font-size: 18px !important; - margin: 0 !important; - top: 2px; - position: relative; } + height: 30px; +} +.um-admin-drag-row-icons a { + text-decoration: none; + color: #fff; + width: 40px; + height: 30px; + line-height: 30px; + text-align: center; + display: block !important; + float: left; + background: #0085ba; + padding: 0 4px; + transition: all 0.2s linear; + border-left: 1px solid #379dd5; +} +.um-admin-drag-row-icons a:hover { + background: #008ec2; +} +.um-admin-drag-row-icons span { + cursor: move !important; + text-decoration: none; + color: #fff; + width: 40px; + height: 30px; + line-height: 30px; + text-align: center; + display: block !important; + float: left; + background: #0085ba; + padding: 0 4px; + transition: all 0.2s linear; + border-left: 1px solid #379dd5; +} +.um-admin-drag-row-icons span:hover { + background: #008ec2; +} +.um-admin-drag-row-icons i { + font-size: 18px !important; + margin: 0 !important; + top: 2px; + position: relative; +} .um-admin-drag-rowsub { position: relative; @@ -338,51 +405,59 @@ -webkit-box-sizing: border-box; background: #f1f1f1; padding: 20px; - margin: 0 0 60px 0; } - .um-admin-drag-rowsub:last-child { - margin-bottom: 0; } + margin: 0 0 60px 0; +} +.um-admin-drag-rowsub:last-child { + margin-bottom: 0; +} .um-admin-drag-rowsub-icons { position: absolute; right: 0; top: -30px; - height: 30px; } - .um-admin-drag-rowsub-icons a { - text-decoration: none; - color: #fff; - width: 40px; - height: 30px; - line-height: 30px; - text-align: center; - display: block !important; - float: left; - background: #0085ba; - padding: 0 4px; - transition: all .2s linear; - border-left: 1px solid #379dd5; } - .um-admin-drag-rowsub-icons a:hover { - background: #008ec2; } - .um-admin-drag-rowsub-icons span { - cursor: move !important; - text-decoration: none; - color: #fff; - width: 40px; - height: 30px; - line-height: 30px; - text-align: center; - display: block !important; - float: left; - background: #0085ba; - padding: 0 4px; - transition: all .2s linear; - border-left: 1px solid #379dd5; } - .um-admin-drag-rowsub-icons span:hover { - background: #008ec2; } - .um-admin-drag-rowsub-icons i { - font-size: 18px !important; - margin: 0 !important; - top: 2px; - position: relative; } + height: 30px; +} +.um-admin-drag-rowsub-icons a { + text-decoration: none; + color: #fff; + width: 40px; + height: 30px; + line-height: 30px; + text-align: center; + display: block !important; + float: left; + background: #0085ba; + padding: 0 4px; + transition: all 0.2s linear; + border-left: 1px solid #379dd5; +} +.um-admin-drag-rowsub-icons a:hover { + background: #008ec2; +} +.um-admin-drag-rowsub-icons span { + cursor: move !important; + text-decoration: none; + color: #fff; + width: 40px; + height: 30px; + line-height: 30px; + text-align: center; + display: block !important; + float: left; + background: #0085ba; + padding: 0 4px; + transition: all 0.2s linear; + border-left: 1px solid #379dd5; +} +.um-admin-drag-rowsub-icons span:hover { + background: #008ec2; +} +.um-admin-drag-rowsub-icons i { + font-size: 18px !important; + margin: 0 !important; + top: 2px; + position: relative; +} .um-admin-drag-col { float: left; @@ -390,51 +465,65 @@ background: #fff; border: 1px dashed #bbb; box-sizing: border-box; - padding: 20px; } - .um-admin-drag-col.cols-3 { - width: 32%; } - .um-admin-drag-col.cols-3.cols-last { - width: 32%; } - .um-admin-drag-col.cols-3.cols-middle { - width: 32%; - margin: 0 2%; } - .um-admin-drag-col.cols-3 .um-admin-drag-fld-title { - height: auto; - line-height: 18px; - margin: 10px; - margin-bottom: 0; } - .um-admin-drag-col.cols-3 .um-admin-drag-fld-type { - height: auto; - line-height: 18px; - margin: 0 0 10px 0; } - .um-admin-drag-col.cols-3 .um-admin-drag-fld-icons { - float: none; - position: absolute; - bottom: 0; - right: 0; - height: 30px; - display: none; } - .um-admin-drag-col.cols-3 .um-admin-drag-fld-icons.um-field-type-group { - float: left; - position: relative; - bottom: auto; - right: auto; - height: 30px; - display: block; } - .um-admin-drag-col.cols-3 .um-admin-drag-fld:hover .um-admin-drag-fld-icons { - display: block; } - .um-admin-drag-col.cols-1 { - width: 100%; } - .um-admin-drag-col.cols-1.cols-last { - width: 100%; } - .um-admin-drag-col.cols-2 { - width: 49%; - margin: 0 1% 0 0; } - .um-admin-drag-col.cols-2.cols-last { - width: 49%; - margin: 0 0 0 1%; } - .um-admin-drag-col > .um-admin-drag-fld:last-of-type { - margin-bottom: 20px; } + padding: 20px; +} +.um-admin-drag-col.cols-3 { + width: 32%; +} +.um-admin-drag-col.cols-3.cols-last { + width: 32%; +} +.um-admin-drag-col.cols-3.cols-middle { + width: 32%; + margin: 0 2%; +} +.um-admin-drag-col.cols-3 .um-admin-drag-fld-title { + height: auto; + line-height: 18px; + margin: 10px; + margin-bottom: 0; +} +.um-admin-drag-col.cols-3 .um-admin-drag-fld-type { + height: auto; + line-height: 18px; + margin: 0 0 10px 0; +} +.um-admin-drag-col.cols-3 .um-admin-drag-fld-icons { + float: none; + position: absolute; + bottom: 0; + right: 0; + height: 30px; + display: none; +} +.um-admin-drag-col.cols-3 .um-admin-drag-fld-icons.um-field-type-group { + float: left; + position: relative; + bottom: auto; + right: auto; + height: 30px; + display: block; +} +.um-admin-drag-col.cols-3 .um-admin-drag-fld:hover .um-admin-drag-fld-icons { + display: block; +} +.um-admin-drag-col.cols-1 { + width: 100%; +} +.um-admin-drag-col.cols-1.cols-last { + width: 100%; +} +.um-admin-drag-col.cols-2 { + width: 49%; + margin: 0 1% 0 0; +} +.um-admin-drag-col.cols-2.cols-last { + width: 49%; + margin: 0 0 0 1%; +} +.um-admin-drag-col > .um-admin-drag-fld:last-of-type { + margin-bottom: 20px; +} .um-admin-drag-addrow { text-align: center; @@ -443,12 +532,15 @@ cursor: pointer; border: 1px dashed #bbb; padding: 10px 0; - margin: 20px 0 0 0; } - .um-admin-drag-addrow i { - font-size: 23px !important; - margin: 0 !important; } - .um-admin-drag-addrow:hover { - color: #0085ba; } + margin: 20px 0 0 0; +} +.um-admin-drag-addrow i { + font-size: 23px !important; + margin: 0 !important; +} +.um-admin-drag-addrow:hover { + color: #0085ba; +} .um-admin-drag-fld { display: block; @@ -456,10 +548,12 @@ border: 1px solid #dddddd; margin: 0 0 15px 0; background: #f5f5f5; - cursor: move !important; } - .um-admin-drag-fld.um-field-type-group { - background: #555; - border: 0; } + cursor: move !important; +} +.um-admin-drag-fld.um-field-type-group { + background: #555; + border: 0; +} .um-admin-drag-fld-title { float: left; @@ -468,19 +562,23 @@ color: #666; height: 30px; line-height: 30px; - margin: 0 0 0 20px; } - .um-admin-drag-fld-title.um-field-type-group { - color: #fff; } - .um-admin-drag-fld-title i { - width: 24px; - display: inline-block; - text-align: center; } + margin: 0 0 0 20px; +} +.um-admin-drag-fld-title.um-field-type-group { + color: #fff; +} +.um-admin-drag-fld-title i { + width: 24px; + display: inline-block; + text-align: center; +} .um-admin-drag-group { background: #fcfcfc; cursor: default; padding: 20px; - border: 1px dashed #bbb; } + border: 1px dashed #bbb; +} .um-admin-drag-fld-type { float: left; @@ -489,60 +587,72 @@ line-height: 30px; margin: 0 0 0 20px; font-weight: 400; - color: #999; } - .um-admin-drag-fld-type.um-field-type-group { - color: #fff; } + color: #999; +} +.um-admin-drag-fld-type.um-field-type-group { + color: #fff; +} .um-admin-drag-fld-icons { - float: right; } - .um-admin-drag-fld-icons a { - text-decoration: none; - color: #fff; - width: 40px; - height: 30px; - line-height: 30px; - text-align: center; - display: block !important; - float: left; - background: #0085ba; - padding: 0 4px; - transition: all .2s linear; - border-left: 1px solid #379dd5; } - .um-admin-drag-fld-icons a:hover { - background: #008ec2; } - .um-admin-drag-fld-icons i { - font-size: 18px !important; - margin: 0 !important; - top: 2px; - position: relative; } - .um-admin-drag-fld-icons.um-field-type-group a.um_admin_duplicate_field { - display: none !important; } + float: right; +} +.um-admin-drag-fld-icons a { + text-decoration: none; + color: #fff; + width: 40px; + height: 30px; + line-height: 30px; + text-align: center; + display: block !important; + float: left; + background: #0085ba; + padding: 0 4px; + transition: all 0.2s linear; + border-left: 1px solid #379dd5; +} +.um-admin-drag-fld-icons a:hover { + background: #008ec2; +} +.um-admin-drag-fld-icons i { + font-size: 18px !important; + margin: 0 !important; + top: 2px; + position: relative; +} +.um-admin-drag-fld-icons.um-field-type-group a.um_admin_duplicate_field { + display: none !important; +} .um-row-placeholder { width: 100%; border: 2px dashed #aaa; - box-sizing: border-box; } + box-sizing: border-box; +} .um-rowsub-placeholder { width: 100%; border: 2px dashed #ccc; box-sizing: border-box; - display: block; } + display: block; +} .um-fld-placeholder { display: block; border: 1px dashed #ddd; background: #fff; box-sizing: border-box; - width: 100%; } + width: 100%; +} .um-admin-modal #UM_preview_form .um-admin-modal-body { - position: relative; } - .um-admin-modal #UM_preview_form .um-admin-modal-body .um-admin-preview-overlay { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(255, 255, 255, 0); - z-index: 100; } + position: relative; +} +.um-admin-modal #UM_preview_form .um-admin-modal-body .um-admin-preview-overlay { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(255, 255, 255, 0); + z-index: 100; +} \ No newline at end of file diff --git a/assets/css/admin/common.css b/assets/css/admin/common.css index 2dbef9c5..1358ba92 100644 --- a/assets/css/admin/common.css +++ b/assets/css/admin/common.css @@ -3,19 +3,23 @@ width: 18px; text-align: center; display: inline-block; - color: #7acf58; } - .um-adm-ico.inactive { - color: #c74a4a; } - .um-adm-ico.pointer { - cursor: pointer; } + color: #7acf58; +} +.um-adm-ico.inactive { + color: #c74a4a; +} +.um-adm-ico.pointer { + cursor: pointer; +} body.um-admin-modal-open { - overflow: hidden; } + overflow: hidden; +} .um-admin #major-publishing-actions { background-color: #fff !important; - border-top: 0; } - + border-top: 0; +} .um-admin a.button i, .um-admin a.button-primary i { font-size: 15px !important; @@ -23,36 +27,38 @@ body.um-admin-modal-open { width: 15px !important; text-align: center !important; margin: 0 5px 0 0 !important; - display: inline-block; } - .um-admin a.button i:before, - .um-admin a.button-primary i:before { - position: relative; - top: 1px; } + display: inline-block; +} +.um-admin a.button i:before, +.um-admin a.button-primary i:before { + position: relative; + top: 1px; +} .um-admin-metabox h6 { font-size: 14px; - margin: 12px 0 0 0; } - + margin: 12px 0 0 0; +} .um-admin-metabox h3 { - padding-left: 0 !important; } - + padding-left: 0 !important; +} .um-admin-metabox h4 { font-size: 14px; background: #f5f5f5; padding: 8px 4px; - color: #333; } - + color: #333; +} .um-admin-metabox p { - margin: 10px 0 0 0; } - + margin: 10px 0 0 0; +} .um-admin-metabox label { display: block; cursor: default; padding: 0 !important; font-size: 13px; - color: #666; } - -.um-admin-metabox input[type="text"] { + color: #666; +} +.um-admin-metabox input[type=text] { height: auto !important; width: 100%; max-width: 100%; @@ -60,15 +66,18 @@ body.um-admin-modal-open { box-sizing: border-box !important; font-size: 13px !important; line-height: 1.4em !important; - padding: 4px 10px !important; } - .um-admin-metabox input[type="text"]:disabled { - opacity: 0.7 !important; - color: #aaa !important; } - .um-admin-metabox input[type="text"].small { - width: 54px; } - .um-admin-metabox input[type="text"].um-admin-error { - border-color: #c74a4a !important; } - + padding: 4px 10px !important; +} +.um-admin-metabox input[type=text]:disabled { + opacity: 0.7 !important; + color: #aaa !important; +} +.um-admin-metabox input[type=text].small { + width: 54px; +} +.um-admin-metabox input[type=text].um-admin-error { + border-color: #c74a4a !important; +} .um-admin-metabox textarea { width: 100%; max-width: 100%; @@ -79,18 +88,21 @@ body.um-admin-modal-open { padding: 8px !important; color: #888 !important; min-height: 100px; - height: 100px; } - .um-admin-metabox textarea.tall { - min-height: 200px; - height: 200px; } - .um-admin-metabox textarea.um-admin-error { - border-color: #c74a4a !important; } + height: 100px; +} +.um-admin-metabox textarea.tall { + min-height: 200px; + height: 200px; +} +.um-admin-metabox textarea.um-admin-error { + border-color: #c74a4a !important; +} .um .picker__box, .um .picker__nav--prev:hover, .um .picker__nav--next:hover { - background: #0085ba; } - + background: #0085ba; +} .um .picker__footer, .um .picker__header, .um .picker__day--infocus:hover, @@ -103,13 +115,15 @@ body.um-admin-modal-open { .um .picker__list-item--selected, .um .picker__list-item--selected:hover, .um .picker--focused .picker__list-item--selected { - background: #008ec2; } + background: #008ec2; +} body.um .picker .picker__frame { - top: 32px; } - + top: 32px; +} body.um .picker .picker__footer > button:not(:disabled):not(.button) { - color: #fff; } - + color: #fff; +} body.um .picker .picker__footer > button.picker__button--close { - margin-top: 5px; } + margin-top: 5px; +} \ No newline at end of file diff --git a/assets/css/admin/dashboard.css b/assets/css/admin/dashboard.css index 0504fde1..d850aa2c 100644 --- a/assets/css/admin/dashboard.css +++ b/assets/css/admin/dashboard.css @@ -8,60 +8,74 @@ border-radius: 3px; top: 5px; left: 3px; - border: none !important; } - + border: none !important; +} #um-metaboxes-general.wrap a.red, #um-metaboxes-general.wrap span.red { - color: #c74a4a; } - + color: #c74a4a; +} #um-metaboxes-general.wrap span.ok { - color: #7acf58; } + color: #7acf58; +} .um-metabox-holder p.sub { padding: 0 4px 2px 4px; margin: 0 0 8px 0; color: #8F8F8F; font-size: 14px; - border-bottom: 1px solid #ECECEC; } - -.um-metabox-holder .table { - float: left; - width: 45%; } - .um-metabox-holder .table td { - white-space: nowrap; - font-size: 12px; } - + border-bottom: 1px solid #ECECEC; +} .um-metabox-holder a.warning { color: #c74a4a !important; background: transparent !important; - border: 0; } - -.um-metabox-holder .table_right { - float: right; - width: 45%; } - -.um-metabox-holder td.b { - padding-right: 6px; - text-align: right; - font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif; - font-size: 14px; - width: 1%; } - .um-metabox-holder td.b a { - font-size: 18px; } - + border: 0; +} .um-metabox-holder .norm i { display: inline-block; width: 30px; - text-align: center; } - + text-align: center; +} .um-metabox-holder .norm p { - margin: 5px 0; } - + margin: 5px 0; +} .um-metabox-holder .norm .count { font-size: 16px; - font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; color: #999; width: 40px; display: inline-block; text-align: right; - margin-right: 10px; } + margin-right: 10px; +} + +#um-users-overview-table { + width: 100%; +} +#um-users-overview-table td { + width: 50%; + vertical-align: middle; + padding: 0 0 0 5px; + box-sizing: border-box; +} +#um-users-overview-table td:first-child { + padding: 0 5px 0 0; +} +#um-users-overview-table td > span { + width: 100%; + direction: ltr; + display: grid; + grid-gap: 6px; + grid-template-columns: repeat(2, minmax(20px, auto)); + align-content: start; + align-items: center; + justify-content: start; + justify-items: center; +} +#um-users-overview-table td > span a { + word-break: break-word; +} +#um-users-overview-table td > span a.count { + justify-self: end; + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif; + font-size: 18px; +} \ No newline at end of file diff --git a/assets/css/admin/dashboard.min.css b/assets/css/admin/dashboard.min.css index 121b1a39..e667635c 100644 --- a/assets/css/admin/dashboard.min.css +++ b/assets/css/admin/dashboard.min.css @@ -1 +1 @@ -#um-metaboxes-general h1 sup{font-size:14px;position:relative;font-weight:400;background:#0085ba;color:#fff!important;padding:2px 4px!important;border-radius:3px;top:5px;left:3px;border:none!important}#um-metaboxes-general.wrap a.red,#um-metaboxes-general.wrap span.red{color:#c74a4a}#um-metaboxes-general.wrap span.ok{color:#7acf58}.um-metabox-holder p.sub{padding:0 4px 2px 4px;margin:0 0 8px 0;color:#8f8f8f;font-size:14px;border-bottom:1px solid #ececec}.um-metabox-holder .table{float:left;width:45%}.um-metabox-holder .table td{white-space:nowrap;font-size:12px}.um-metabox-holder a.warning{color:#c74a4a!important;background:0 0!important;border:0}.um-metabox-holder .table_right{float:right;width:45%}.um-metabox-holder td.b{padding-right:6px;text-align:right;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-size:14px;width:1%}.um-metabox-holder td.b a{font-size:18px}.um-metabox-holder .norm i{display:inline-block;width:30px;text-align:center}.um-metabox-holder .norm p{margin:5px 0}.um-metabox-holder .norm .count{font-size:16px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;color:#999;width:40px;display:inline-block;text-align:right;margin-right:10px} \ No newline at end of file +#um-metaboxes-general h1 sup{font-size:14px;position:relative;font-weight:400;background:#0085ba;color:#fff!important;padding:2px 4px!important;border-radius:3px;top:5px;left:3px;border:none!important}#um-metaboxes-general.wrap a.red,#um-metaboxes-general.wrap span.red{color:#c74a4a}#um-metaboxes-general.wrap span.ok{color:#7acf58}.um-metabox-holder p.sub{padding:0 4px 2px 4px;margin:0 0 8px 0;color:#8f8f8f;font-size:14px;border-bottom:1px solid #ececec}.um-metabox-holder a.warning{color:#c74a4a!important;background:0 0!important;border:0}.um-metabox-holder .norm i{display:inline-block;width:30px;text-align:center}.um-metabox-holder .norm p{margin:5px 0}.um-metabox-holder .norm .count{font-size:16px;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;color:#999;width:40px;display:inline-block;text-align:right;margin-right:10px}#um-users-overview-table{width:100%}#um-users-overview-table td{width:50%;vertical-align:middle;padding:0 0 0 5px;box-sizing:border-box}#um-users-overview-table td:first-child{padding:0 5px 0 0}#um-users-overview-table td>span{width:100%;direction:ltr;display:grid;grid-gap:6px;grid-template-columns:repeat(2,minmax(20px,auto));align-content:start;align-items:center;justify-content:start;justify-items:center}#um-users-overview-table td>span a{word-break:break-word}#um-users-overview-table td>span a.count{justify-self:end;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;font-size:18px} \ No newline at end of file diff --git a/assets/css/admin/dashboard.sass b/assets/css/admin/dashboard.sass index 63702151..57bbcde8 100644 --- a/assets/css/admin/dashboard.sass +++ b/assets/css/admin/dashboard.sass @@ -30,31 +30,11 @@ font-size: 14px border-bottom: 1px solid #ECECEC - .table - float: left - width: 45% - td - white-space: nowrap - font-size: 12px - a.warning color: #{$admin-warning} !important background: transparent !important border: 0 - .table_right - float: right - width: 45% - - td.b - padding-right: 6px - text-align: right - font-family: Georgia,"Times New Roman","Bitstream Charter",Times,serif - font-size: 14px - width: 1% - a - font-size: 18px - .norm i display: inline-block @@ -72,3 +52,29 @@ display: inline-block text-align: right margin-right: 10px + +#um-users-overview-table + width: 100% + td + width: 50% + vertical-align: middle + padding: 0 0 0 5px + box-sizing: border-box + &:first-child + padding: 0 5px 0 0 + td > span + width: 100% + direction: ltr + display: grid + grid-gap: 6px + grid-template-columns: repeat(2, minmax(20px, auto)) + align-content: start + align-items: center + justify-content: start + justify-items: center + a + word-break: break-word + &.count + justify-self: end + font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif + font-size: 18px diff --git a/assets/css/admin/directories-screen.css b/assets/css/admin/directories-screen.css index 0f801ad2..1bcc98b0 100644 --- a/assets/css/admin/directories-screen.css +++ b/assets/css/admin/directories-screen.css @@ -1,13 +1,16 @@ .um-admin.post-type-um_directory .wp-list-table.posts .manage-column.column-id { - width: 60px; } - + width: 60px; +} .um-admin.post-type-um_directory .wp-list-table.posts .manage-column.column-shortcode { - width: 35%; } - + width: 35%; +} .um-admin.post-type-um_directory .wp-list-table.posts .column-is_default { width: 120px; - text-align: center !important; } + text-align: center !important; +} @media screen and (max-width: 782px) { .um-admin.post-type-um_directory .wp-list-table.posts td.column-is_default { - text-align: left !important; } } + text-align: left !important; + } +} \ No newline at end of file diff --git a/assets/css/admin/extensions.css b/assets/css/admin/extensions.css index 791e3607..59d7033a 100644 --- a/assets/css/admin/extensions.css +++ b/assets/css/admin/extensions.css @@ -10,8 +10,8 @@ -ms-grid-template-columns: repeat(3, 1fr); -ms-grid-gap: 10px; -ms-grid-auto-rows: minmax(max-content, auto); - align-items: center; } - + align-items: center; +} #um-extensions-wrap .plugin-card { display: flex; flex-direction: column; @@ -20,8 +20,8 @@ flex-wrap: nowrap; width: 100%; margin: 0; - padding: 20px; } - + padding: 20px; +} #um-extensions-wrap .plugin-image-wrapper { display: flex; flex-direction: row; @@ -35,43 +35,48 @@ border-radius: 60px; box-shadow: 0 2px 9px rgba(50, 50, 93, 0.21); border: solid 4px #fff; - overflow: hidden; } - #um-extensions-wrap .plugin-image-wrapper a { - width: 100%; - height: 100%; - margin: 0; - padding: 0; - background-color: #7856ff; } - + overflow: hidden; +} +#um-extensions-wrap .plugin-image-wrapper a { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + background-color: #7856ff; +} #um-extensions-wrap a.plugin-image { - display: block; } - #um-extensions-wrap a.plugin-image img { - display: block; } - #um-extensions-wrap a.plugin-image.svg-image { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - flex-wrap: nowrap; } - #um-extensions-wrap a.plugin-image.svg-image img { - filter: invert(1); - background-color: transparent; - width: 38px; - height: auto; } - #um-extensions-wrap a.plugin-image:not(.svg-image) img { - width: 70px; - margin: 0; - height: 70px; - padding: 0; } - + display: block; +} +#um-extensions-wrap a.plugin-image img { + display: block; +} +#um-extensions-wrap a.plugin-image.svg-image { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + flex-wrap: nowrap; +} +#um-extensions-wrap a.plugin-image.svg-image img { + filter: invert(1); + background-color: transparent; + width: 38px; + height: auto; +} +#um-extensions-wrap a.plugin-image:not(.svg-image) img { + width: 70px; + margin: 0; + height: 70px; + padding: 0; +} #um-extensions-wrap #um_bbpress_image { background-color: #fff !important; filter: none !important; - width: 70px !important; } - + width: 70px !important; +} #um-extensions-wrap #um_mycred_image { - background-color: #fff; } - + background-color: #fff; +} #um-extensions-wrap #um_groups_image, #um-extensions-wrap #um_profile-tabs_image, #um-extensions-wrap #um_user-tags_image, @@ -80,44 +85,46 @@ #um-extensions-wrap #um_verified-users_image, #um-extensions-wrap #um_private-content_image, #um-extensions-wrap #um_online-users_image { - width: 36px !important; } - + width: 36px !important; +} #um-extensions-wrap #um_notices_image, #um-extensions-wrap #um_social-activity_image, #um-extensions-wrap #um_profile-completeness_image, #um-extensions-wrap #um_private-messages_image, #um-extensions-wrap #um_user-photos_image, #um-extensions-wrap #um_terms-conditions_image { - width: 29px !important; } - + width: 29px !important; +} #um-extensions-wrap #um_social-login_image { - width: 28px !important; } - + width: 28px !important; +} #um-extensions-wrap #um_real-time-notifications_image, #um-extensions-wrap #um_user-notes_image { - width: 26px !important; } - + width: 26px !important; +} #um-extensions-wrap #um_followers_image, #um-extensions-wrap #um_user-locations_image { - width: 32px !important; } - + width: 32px !important; +} #um-extensions-wrap #um_user-bookmarks_image { - width: 23px !important; } - + width: 23px !important; +} #um-extensions-wrap .plugin-card-top { margin: 0; padding: 20px 0 0 0; width: 100%; - min-height: 100px; } - #um-extensions-wrap .plugin-card-top h3 { - text-align: center; - margin: 0 0 20px 0; - padding: 0; } - #um-extensions-wrap .plugin-card-top .desc { - text-align: center; - margin: 0 !important; - padding: 0 !important; } - + min-height: 100px; +} +#um-extensions-wrap .plugin-card-top h3 { + text-align: center; + margin: 0 0 20px 0; + padding: 0; +} +#um-extensions-wrap .plugin-card-top .desc { + text-align: center; + margin: 0 !important; + padding: 0 !important; +} #um-extensions-wrap .plugin-action-links { display: flex; flex-direction: row; @@ -125,22 +132,28 @@ align-items: baseline; flex-wrap: nowrap; width: 100%; - padding: 20px 0 0 0; } + padding: 20px 0 0 0; +} @media (max-width: 1152px) { #um-extensions-wrap .plugin-card-top { - min-height: 120px; } } - + min-height: 120px; + } +} @media (max-width: 992px) { #um-extensions-wrap #the-list { grid-template-columns: repeat(2, 1fr); - -ms-grid-template-columns: repeat(2, 1fr); } } - + -ms-grid-template-columns: repeat(2, 1fr); + } +} @media (max-width: 782px) { #um-extensions-wrap #the-list { grid-template-columns: repeat(1, 1fr); - -ms-grid-template-columns: repeat(1, 1fr); } } - + -ms-grid-template-columns: repeat(1, 1fr); + } +} @media screen and (max-width: 782px) { #um-extensions-wrap .plugin-card-top { - min-height: 80px; } } + min-height: 80px; + } +} \ No newline at end of file diff --git a/assets/css/admin/forms-rtl.css b/assets/css/admin/forms-rtl.css index ced0caf4..02e638cf 100644 --- a/assets/css/admin/forms-rtl.css +++ b/assets/css/admin/forms-rtl.css @@ -1,5 +1,7 @@ .um-form-fields-section { padding: 0 0 0 10px; - float: right; } - .um-form-fields-section label input { - float: right; } + float: right; +} +.um-form-fields-section label input { + float: right; +} \ No newline at end of file diff --git a/assets/css/admin/forms-screen.css b/assets/css/admin/forms-screen.css index ccc42f00..27ae7402 100644 --- a/assets/css/admin/forms-screen.css +++ b/assets/css/admin/forms-screen.css @@ -1,17 +1,18 @@ .um-admin.post-type-um_form .manage-column.column-id { - width: 60px; } - + width: 60px; +} .um-admin.post-type-um_form .manage-column.column-mode { - width: 100px; } - + width: 100px; +} .um-admin.post-type-um_form .manage-column.column-is_default { - width: 60px; } - + width: 60px; +} .um-admin.post-type-um_form .manage-column.column-title { - width: 200px; } - + width: 200px; +} .um-admin.post-type-um_form .manage-column.column-shortcode { - width: 200px; } - + width: 200px; +} .um-admin.post-type-um_form td.column-shortcode, .um-admin.post-type-um_form td.column-id { - font-size: 14px; } + font-size: 14px; +} \ No newline at end of file diff --git a/assets/css/admin/forms.css b/assets/css/admin/forms.css index 8ffe133b..6001b47d 100644 --- a/assets/css/admin/forms.css +++ b/assets/css/admin/forms.css @@ -1,20 +1,21 @@ .um-form-table .um-forms-line[data-conditional] { - display: none; } - + display: none; +} .um-form-table .um-forms-line label .um-req { color: #a00; margin: 0 0 0 3px; - font-weight: normal; } - + font-weight: normal; +} .um-form-table .um-forms-line .um-text-delete { color: #a00; - float: left; } - .um-form-table .um-forms-line .um-text-delete:hover { - color: red; } - + float: left; +} +.um-form-table .um-forms-line .um-text-delete:hover { + color: red; +} .um-form-table .um-forms-line .um-multi-text-add-option { - margin-bottom: 14px; } - + margin-bottom: 14px; +} .um-form-table .um-forms-line .icon_preview { display: none; max-width: 200px; @@ -25,108 +26,131 @@ background: #f7f7f7; border-radius: 3px; height: auto; - width: auto !important; } - + width: auto !important; +} .um-form-table .um-forms-line td .um-same-page-update-wrapper { display: none; - margin: 7px 0 0 0; } - .um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update { - margin: 7px 0 0 0; } - .um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log { - margin: 7px 0 0 0; - width: 100%; - height: 150px; - overflow: auto; - border: 1px solid #a1a1a1; } - -.um-form-table .um-forms-line[data-field_type="same_page_update"] { - vertical-align: baseline; } - .um-form-table .um-forms-line[data-field_type="same_page_update"] th, - .um-form-table .um-forms-line[data-field_type="same_page_update"] td { - vertical-align: baseline; } - + margin: 7px 0 0 0; +} +.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update { + margin: 7px 0 0 0; +} +.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log { + margin: 7px 0 0 0; + width: 100%; + height: 150px; + overflow: auto; + border: 1px solid #a1a1a1; +} +.um-form-table .um-forms-line[data-field_type=same_page_update] { + vertical-align: baseline; +} +.um-form-table .um-forms-line[data-field_type=same_page_update] th, +.um-form-table .um-forms-line[data-field_type=same_page_update] td { + vertical-align: baseline; +} .um-form-table.um-third-column .um-forms-line th { - width: 33%; } - + width: 33%; +} .um-form-table.um-half-column .um-forms-line th { - width: 50%; } - + width: 50%; +} .um-form-table.um-two-thirds-column .um-forms-line th { - width: 83%; } - + width: 83%; +} .um-form-table.um-top-label .um-forms-line td { - padding: 0 0 15px 0; } - .um-form-table.um-top-label .um-forms-line td label { - margin: 0 0 5px 0; - display: inline-block; } - -.um-form-table.um-top-label .um-forms-line[data-field_type="icon"] td label { + padding: 0 0 15px 0; +} +.um-form-table.um-top-label .um-forms-line td label { + margin: 0 0 5px 0; + display: inline-block; +} +.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label { width: 100%; display: block; - margin: 0 0 5px 0; } + margin: 0 0 5px 0; +} + +.um-external-link-icon { + width: 1em; + height: 1em; + margin: 0; + vertical-align: middle; + fill: currentcolor; +} .um_admin_fonticon_wrapper { display: flex; flex-direction: row; justify-content: flex-start; align-items: center; - flex-wrap: nowrap; } - .um_admin_fonticon_wrapper .um-admin-icon-value { - line-height: 1; } - .um_admin_fonticon_wrapper .um-admin-icon-value i { - top: 0; } + flex-wrap: nowrap; +} +.um_admin_fonticon_wrapper .um-admin-icon-value { + line-height: 1; +} +.um_admin_fonticon_wrapper .um-admin-icon-value i { + top: 0; +} -input[type="text"].um-forms-field, -input[type="url"].um-forms-field, -input[type="number"].um-forms-field, -input[type="date"].um-forms-field, -input[type="time"].um-forms-field, -input[type="password"].um-forms-field, +input[type=text].um-forms-field, +input[type=url].um-forms-field, +input[type=number].um-forms-field, +input[type=date].um-forms-field, +input[type=time].um-forms-field, +input[type=password].um-forms-field, select.um-forms-field, textarea.um-forms-field { - box-sizing: border-box; } - input[type="text"].um-forms-field.um-long-field, - input[type="url"].um-forms-field.um-long-field, - input[type="number"].um-forms-field.um-long-field, - input[type="date"].um-forms-field.um-long-field, - input[type="time"].um-forms-field.um-long-field, - input[type="password"].um-forms-field.um-long-field, - select.um-forms-field.um-long-field, - textarea.um-forms-field.um-long-field { - width: 100% !important; } - input[type="text"].um-forms-field.um-medium-field, - input[type="url"].um-forms-field.um-medium-field, - input[type="number"].um-forms-field.um-medium-field, - input[type="date"].um-forms-field.um-medium-field, - input[type="time"].um-forms-field.um-medium-field, - input[type="password"].um-forms-field.um-medium-field, - select.um-forms-field.um-medium-field, - textarea.um-forms-field.um-medium-field { - width: 50% !important; } - input[type="text"].um-forms-field.um-small-field, - input[type="url"].um-forms-field.um-small-field, - input[type="number"].um-forms-field.um-small-field, - input[type="date"].um-forms-field.um-small-field, - input[type="time"].um-forms-field.um-small-field, - input[type="password"].um-forms-field.um-small-field, - select.um-forms-field.um-small-field, - textarea.um-forms-field.um-small-field { - width: 25% !important; } + box-sizing: border-box; +} +input[type=text].um-forms-field.um-long-field, +input[type=url].um-forms-field.um-long-field, +input[type=number].um-forms-field.um-long-field, +input[type=date].um-forms-field.um-long-field, +input[type=time].um-forms-field.um-long-field, +input[type=password].um-forms-field.um-long-field, +select.um-forms-field.um-long-field, +textarea.um-forms-field.um-long-field { + width: 100% !important; +} +input[type=text].um-forms-field.um-medium-field, +input[type=url].um-forms-field.um-medium-field, +input[type=number].um-forms-field.um-medium-field, +input[type=date].um-forms-field.um-medium-field, +input[type=time].um-forms-field.um-medium-field, +input[type=password].um-forms-field.um-medium-field, +select.um-forms-field.um-medium-field, +textarea.um-forms-field.um-medium-field { + width: 50% !important; +} +input[type=text].um-forms-field.um-small-field, +input[type=url].um-forms-field.um-small-field, +input[type=number].um-forms-field.um-small-field, +input[type=date].um-forms-field.um-small-field, +input[type=time].um-forms-field.um-small-field, +input[type=password].um-forms-field.um-small-field, +select.um-forms-field.um-small-field, +textarea.um-forms-field.um-small-field { + width: 25% !important; +} -input[type="number"].um-forms-field { - padding-right: 0; } +input[type=number].um-forms-field { + padding-right: 0; +} .um-multi-text-list, .um-multi-selects-list, .um-md-default-filters-list { float: left; width: 100%; - margin: 0 0 10px 0; } + margin: 0 0 10px 0; +} .um-hidden-multi-text, .um-hidden-multi-selects, .um-hidden-md-default-filters { - display: none !important; } + display: none !important; +} .um-md-default-filters-option-line { float: left; @@ -134,128 +158,153 @@ input[type="number"].um-forms-field { clear: both; border-bottom: 1px solid #eee; padding: 0 0 5px 0; - margin: 5px 0 0 0; } - .um-md-default-filters-option-line .um-field-wrapper { - float: left; - width: calc( 100% - 60px); - line-height: 30px; - box-sizing: border-box; } - .um-md-default-filters-option-line .um-field-wrapper2 { - float: left; - width: calc( 100% - 60px); - line-height: 30px; - box-sizing: border-box; } - .um-md-default-filters-option-line .um-field-wrapper2.um { - margin: 5px 0 0 0; } - .um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header { - background: #44b0ec; - border: 1px solid #44b0ec !important; - margin-top: -1px; } - .um-md-default-filters-option-line .um-field-wrapper2 > select { - width: 100%; - float: left; } - .um-md-default-filters-option-line .um-field-wrapper2 > input { - width: 100%; - float: left; } - .um-md-default-filters-option-line .um-field-wrapper2 > input.um-timepicker-filter, .um-md-default-filters-option-line .um-field-wrapper2 > input.um-datepicker-filter { - width: calc( 50% - 7px) !important; - float: left; } - .um-md-default-filters-option-line .um-field-wrapper2 > input.um-timepicker-filter:first-child, .um-md-default-filters-option-line .um-field-wrapper2 > input.um-datepicker-filter:first-child { - margin-right: 11px; } - .um-md-default-filters-option-line .um-field-wrapper2 .um-slider { - margin: 5px 9px 0 9px; - width: calc( 100% - 18px); - box-sizing: border-box; - display: block; } - .um-md-default-filters-option-line .um-field-control { - float: left; - width: 60px; - line-height: 30px; - padding: 0 10px; - box-sizing: border-box; } + margin: 5px 0 0 0; +} +.um-md-default-filters-option-line .um-field-wrapper { + float: left; + width: calc(100% - 60px); + line-height: 30px; + box-sizing: border-box; +} +.um-md-default-filters-option-line .um-field-wrapper2 { + float: left; + width: calc(100% - 60px); + line-height: 30px; + box-sizing: border-box; +} +.um-md-default-filters-option-line .um-field-wrapper2.um { + margin: 5px 0 0 0; +} +.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header { + background: #44b0ec; + border: 1px solid #44b0ec !important; + margin-top: -1px; +} +.um-md-default-filters-option-line .um-field-wrapper2 > select { + width: 100%; + float: left; +} +.um-md-default-filters-option-line .um-field-wrapper2 > input { + width: 100%; + float: left; +} +.um-md-default-filters-option-line .um-field-wrapper2 > input.um-timepicker-filter, .um-md-default-filters-option-line .um-field-wrapper2 > input.um-datepicker-filter { + width: calc(50% - 7px) !important; + float: left; +} +.um-md-default-filters-option-line .um-field-wrapper2 > input.um-timepicker-filter:first-child, .um-md-default-filters-option-line .um-field-wrapper2 > input.um-datepicker-filter:first-child { + margin-right: 11px; +} +.um-md-default-filters-option-line .um-field-wrapper2 .um-slider { + margin: 5px 9px 0 9px; + width: calc(100% - 18px); + box-sizing: border-box; + display: block; +} +.um-md-default-filters-option-line .um-field-control { + float: left; + width: 60px; + line-height: 30px; + padding: 0 10px; + box-sizing: border-box; +} .um-multi-selects-option-line { float: left; width: 100%; padding: 0; clear: both; - margin: 0 0 5px 0; } - .um-multi-selects-option-line.um-admin-drag-fld { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; - background: none; - border: none; } - .um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper { - width: calc( 100% - 90px); } - .um-multi-selects-option-line.um-admin-drag-fld .um-field-icon { - float: left; - width: 20px; - text-align: left; - line-height: 30px; } - .um-multi-selects-option-line .um-field-wrapper { - float: left; - width: calc( 100% - 60px); - line-height: 30px; - box-sizing: border-box; } - .um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields { - margin: 5px 0 0 0; } - .um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label { - float: left; - width: 100%; - line-height: 30px; - box-sizing: border-box; - margin: 0 !important; - padding: 0 !important; - font-weight: bold; - display: flex; - flex-direction: row; - justify-content: space-beetween; - align-items: baseline; - flex-wrap: nowrap; } - .um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type="text"], - .um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select { - width: auto; - display: inline; - font-weight: normal; - max-width: 70%; - flex: 0.9; } - .um-multi-selects-option-line .um-field-wrapper input, - .um-multi-selects-option-line .um-field-wrapper select { - float: left; - width: 100%; - margin: 0; } - .um-multi-selects-option-line .um-field-control { - float: left; - width: 60px; - line-height: 30px; - padding: 0 10px; - box-sizing: border-box; } + margin: 0 0 5px 0; +} +.um-multi-selects-option-line.um-admin-drag-fld { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; + background: none; + border: none; +} +.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper { + width: calc(100% - 90px); +} +.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon { + float: left; + width: 20px; + text-align: left; + line-height: 30px; +} +.um-multi-selects-option-line .um-field-wrapper { + float: left; + width: calc(100% - 60px); + line-height: 30px; + box-sizing: border-box; +} +.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields { + margin: 5px 0 0 0; +} +.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label { + float: left; + width: 100%; + line-height: 30px; + box-sizing: border-box; + margin: 0 !important; + padding: 0 !important; + font-weight: bold; + display: flex; + flex-direction: row; + justify-content: space-beetween; + align-items: baseline; + flex-wrap: nowrap; +} +.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text], +.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select { + width: auto; + display: inline; + font-weight: normal; + max-width: 70%; + flex: 0.9; +} +.um-multi-selects-option-line .um-field-wrapper input, +.um-multi-selects-option-line .um-field-wrapper select { + float: left; + width: 100%; + margin: 0; +} +.um-multi-selects-option-line .um-field-control { + float: left; + width: 60px; + line-height: 30px; + padding: 0 10px; + box-sizing: border-box; +} .um-multi-text-option-line { float: left; width: 100%; padding: 0; clear: both; - margin: 0 0 5px 0; } - .um-multi-text-option-line .um-field-wrapper { - float: left; - width: calc( 100% - 90px); - line-height: 30px; - box-sizing: border-box; } - .um-multi-text-option-line .um-field-wrapper input, - .um-multi-text-option-line .um-field-wrapper select { - float: left; - width: 100%; - margin: 0; } - .um-multi-text-option-line .um-field-control { - float: left; - width: 60px; - line-height: 30px; - padding: 0 10px; - box-sizing: border-box; } + margin: 0 0 5px 0; +} +.um-multi-text-option-line .um-field-wrapper { + float: left; + width: calc(100% - 90px); + line-height: 30px; + box-sizing: border-box; +} +.um-multi-text-option-line .um-field-wrapper input, +.um-multi-text-option-line .um-field-wrapper select { + float: left; + width: 100%; + margin: 0; +} +.um-multi-text-option-line .um-field-control { + float: left; + width: 60px; + line-height: 30px; + padding: 0 10px; + box-sizing: border-box; +} .um-form-fields-section { float: left; @@ -264,52 +313,66 @@ input[type="number"].um-forms-field { padding: 0 10px 0 0; box-sizing: border-box; -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-form-fields-section label { - float: left; - width: 100%; - margin: 0; - padding: 0; } - .um-form-fields-section label input { - float: left; - margin-top: 0; } - .um-form-fields-section label span { - float: left; - width: calc( 100% - 20px); } + -webkit-box-sizing: border-box; +} +.um-form-fields-section label { + float: left; + width: 100%; + margin: 0; + padding: 0; +} +.um-form-fields-section label input { + float: left; + margin-top: 0; +} +.um-form-fields-section label span { + float: left; + width: calc(100% - 20px); +} @media screen and (max-width: 782px) { - input[type="text"].um-forms-field.um-medium-field, + input[type=text].um-forms-field.um-medium-field, select.um-forms-field.um-medium-field, textarea.um-forms-field.um-medium-field { - width: 100% !important; } - input[type="text"].um-forms-field.um-small-field, + width: 100% !important; + } + input[type=text].um-forms-field.um-small-field, select.um-forms-field.um-small-field, textarea.um-forms-field.um-small-field { - width: 50% !important; } + width: 50% !important; + } .um-form-fields-section { - width: 100% !important; } + width: 100% !important; + } .um-admin-metabox .um-form-fields-section label { line-height: 22px !important; - margin: 0 0 12px 0 !important; } - .um-admin-metabox .um-form-fields-section label span { - width: calc( 100% - 30px); } + margin: 0 0 12px 0 !important; + } + .um-admin-metabox .um-form-fields-section label span { + width: calc(100% - 30px); + } .um-multi-text-option-line, .um-multi-selects-option-line { - margin: 0 0 6px 0; } + margin: 0 0 6px 0; + } .um-forms-line label { float: left; - width: 100%; } + width: 100%; + } .um-form-table.um-third-column .um-forms-line th, .um-form-table.um-half-column .um-forms-line th, .um-form-table.um-two-thirds-column .um-forms-line th { float: left; width: 100%; - margin-bottom: 5px; } - .um-form-table.um-third-column .um-forms-line th label, .um-form-table.um-half-column .um-forms-line th label, .um-form-table.um-two-thirds-column .um-forms-line th label { - float: left; - width: 100%; } + margin-bottom: 5px; + } + .um-form-table.um-third-column .um-forms-line th label, .um-form-table.um-half-column .um-forms-line th label, .um-form-table.um-two-thirds-column .um-forms-line th label { + float: left; + width: 100%; + } .um-form-table.um-third-column .um-forms-line td, .um-form-table.um-half-column .um-forms-line td, .um-form-table.um-two-thirds-column .um-forms-line td { float: left; - width: 100%; } } - + width: 100%; + } +} .um-sortable-items-field .um-sortable-item { cursor: move !important; padding: 5px; @@ -326,38 +389,48 @@ input[type="number"].um-forms-field { flex-direction: row; justify-content: flex-start; align-items: center; - flex-wrap: nowrap; } - .um-sortable-items-field .um-sortable-item.um-hidden-item { - display: none; } - .um-sortable-items-field .um-sortable-item .um-field-icon { - width: 20px; - text-align: left; - margin: 0 10px 0 0; } + flex-wrap: nowrap; +} +.um-sortable-items-field .um-sortable-item.um-hidden-item { + display: none; +} +.um-sortable-items-field .um-sortable-item .um-field-icon { + width: 20px; + text-align: left; + margin: 0 10px 0 0; +} -.wp-picker-container input.wp-color-picker[type="text"] { +.wp-picker-container input.wp-color-picker[type=text] { width: 68px !important; float: left !important; padding: 2px 4px !important; - border-width: 1px !important; } + border-width: 1px !important; +} span.um-admin-icon-value { margin: 0 10px; - font-size: 13px; } - span.um-admin-icon-value i { - font-size: 28px; - color: #0085ba; - position: relative; - top: 5px; } + font-size: 13px; +} +span.um-admin-icon-value i { + font-size: 28px; + color: #0085ba; + position: relative; + top: 5px; +} span.um-admin-icon-clear { display: none; cursor: pointer; position: relative; - color: #ccc; } - span.um-admin-icon-clear.show { - display: inline-block; } - span.um-admin-icon-clear:hover { - color: #777; } - span.um-admin-icon-clear i { - font-size: 20px; - vertical-align: middle; } + color: #ccc; +} +span.um-admin-icon-clear.show { + display: inline-block; +} +span.um-admin-icon-clear:hover { + color: #777; +} +span.um-admin-icon-clear i { + font-size: 20px; + vertical-align: middle; +} \ No newline at end of file diff --git a/assets/css/admin/forms.min.css b/assets/css/admin/forms.min.css index 7ef70bc9..38a45e6c 100644 --- a/assets/css/admin/forms.min.css +++ b/assets/css/admin/forms.min.css @@ -1 +1 @@ -.um-form-table .um-forms-line[data-conditional]{display:none}.um-form-table .um-forms-line label .um-req{color:#a00;margin:0 0 0 3px;font-weight:400}.um-form-table .um-forms-line .um-text-delete{color:#a00;float:left}.um-form-table .um-forms-line .um-text-delete:hover{color:red}.um-form-table .um-forms-line .um-multi-text-add-option{margin-bottom:14px}.um-form-table .um-forms-line .icon_preview{display:none;max-width:200px;max-height:200px;padding:5px;cursor:pointer;border:1px solid #e3e3e3;background:#f7f7f7;border-radius:3px;height:auto;width:auto!important}.um-form-table .um-forms-line td .um-same-page-update-wrapper{display:none;margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update{margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log{margin:7px 0 0 0;width:100%;height:150px;overflow:auto;border:1px solid #a1a1a1}.um-form-table .um-forms-line[data-field_type=same_page_update]{vertical-align:baseline}.um-form-table .um-forms-line[data-field_type=same_page_update] td,.um-form-table .um-forms-line[data-field_type=same_page_update] th{vertical-align:baseline}.um-form-table.um-third-column .um-forms-line th{width:33%}.um-form-table.um-half-column .um-forms-line th{width:50%}.um-form-table.um-two-thirds-column .um-forms-line th{width:83%}.um-form-table.um-top-label .um-forms-line td{padding:0 0 15px 0}.um-form-table.um-top-label .um-forms-line td label{margin:0 0 5px 0;display:inline-block}.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label{width:100%;display:block;margin:0 0 5px 0}.um_admin_fonticon_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um_admin_fonticon_wrapper .um-admin-icon-value{line-height:1}.um_admin_fonticon_wrapper .um-admin-icon-value i{top:0}input[type=date].um-forms-field,input[type=number].um-forms-field,input[type=password].um-forms-field,input[type=text].um-forms-field,input[type=time].um-forms-field,input[type=url].um-forms-field,select.um-forms-field,textarea.um-forms-field{box-sizing:border-box}input[type=date].um-forms-field.um-long-field,input[type=number].um-forms-field.um-long-field,input[type=password].um-forms-field.um-long-field,input[type=text].um-forms-field.um-long-field,input[type=time].um-forms-field.um-long-field,input[type=url].um-forms-field.um-long-field,select.um-forms-field.um-long-field,textarea.um-forms-field.um-long-field{width:100%!important}input[type=date].um-forms-field.um-medium-field,input[type=number].um-forms-field.um-medium-field,input[type=password].um-forms-field.um-medium-field,input[type=text].um-forms-field.um-medium-field,input[type=time].um-forms-field.um-medium-field,input[type=url].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:50%!important}input[type=date].um-forms-field.um-small-field,input[type=number].um-forms-field.um-small-field,input[type=password].um-forms-field.um-small-field,input[type=text].um-forms-field.um-small-field,input[type=time].um-forms-field.um-small-field,input[type=url].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:25%!important}input[type=number].um-forms-field{padding-right:0}.um-md-default-filters-list,.um-multi-selects-list,.um-multi-text-list{float:left;width:100%;margin:0 0 10px 0}.um-hidden-md-default-filters,.um-hidden-multi-selects,.um-hidden-multi-text{display:none!important}.um-md-default-filters-option-line{float:left;width:100%;clear:both;border-bottom:1px solid #eee;padding:0 0 5px 0;margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2.um{margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-md-default-filters-option-line .um-field-wrapper2 select{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2 input{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2 input.um-datepicker-filter,.um-md-default-filters-option-line .um-field-wrapper2 input.um-timepicker-filter{width:calc(50% - 7px)!important;float:left}.um-md-default-filters-option-line .um-field-wrapper2 input.um-datepicker-filter:first-child,.um-md-default-filters-option-line .um-field-wrapper2 input.um-timepicker-filter:first-child{margin-right:11px}.um-md-default-filters-option-line .um-field-wrapper2 .um-slider{margin:5px 9px 0 9px;width:calc(100% - 18px);box-sizing:border-box;display:block}.um-md-default-filters-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-selects-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-selects-option-line.um-admin-drag-fld{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;background:0 0;border:none}.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper{width:calc(100% - 90px)}.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon{float:left;width:20px;text-align:left;line-height:30px}.um-multi-selects-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields{margin:5px 0 0 0}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label{float:left;width:100%;line-height:30px;box-sizing:border-box;margin:0!important;padding:0!important;font-weight:700;display:flex;flex-direction:row;justify-content:space-beetween;align-items:baseline;flex-wrap:nowrap}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text],.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select{width:auto;display:inline;font-weight:400;max-width:70%;flex:.9}.um-multi-selects-option-line .um-field-wrapper input,.um-multi-selects-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-selects-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-text-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-text-option-line .um-field-wrapper{float:left;width:calc(100% - 90px);line-height:30px;box-sizing:border-box}.um-multi-text-option-line .um-field-wrapper input,.um-multi-text-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-text-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-form-fields-section{float:left;clear:none;margin:0;padding:0 10px 0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-form-fields-section label{float:left;width:100%;margin:0;padding:0}.um-form-fields-section label input{float:left;margin-top:0}.um-form-fields-section label span{float:left;width:calc(100% - 20px)}@media screen and (max-width:782px){input[type=text].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:100%!important}input[type=text].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:50%!important}.um-form-fields-section{width:100%!important}.um-admin-metabox .um-form-fields-section label{line-height:22px!important;margin:0 0 12px 0!important}.um-admin-metabox .um-form-fields-section label span{width:calc(100% - 30px)}.um-multi-selects-option-line,.um-multi-text-option-line{margin:0 0 6px 0}.um-forms-line label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line th,.um-form-table.um-third-column .um-forms-line th,.um-form-table.um-two-thirds-column .um-forms-line th{float:left;width:100%;margin-bottom:5px}.um-form-table.um-half-column .um-forms-line th label,.um-form-table.um-third-column .um-forms-line th label,.um-form-table.um-two-thirds-column .um-forms-line th label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line td,.um-form-table.um-third-column .um-forms-line td,.um-form-table.um-two-thirds-column .um-forms-line td{float:left;width:100%}}.um-sortable-items-field .um-sortable-item{cursor:move!important;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:1px solid #7e8993;border-radius:4px;-moz-border-radius:4px;background:#fff;height:42px;line-height:28px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-sortable-items-field .um-sortable-item.um-hidden-item{display:none}.um-sortable-items-field .um-sortable-item .um-field-icon{width:20px;text-align:left;margin:0 10px 0 0}.wp-picker-container input.wp-color-picker[type=text]{width:68px!important;float:left!important;padding:2px 4px!important;border-width:1px!important}span.um-admin-icon-value{margin:0 10px;font-size:13px}span.um-admin-icon-value i{font-size:28px;color:#0085ba;position:relative;top:5px}span.um-admin-icon-clear{display:none;cursor:pointer;position:relative;color:#ccc}span.um-admin-icon-clear.show{display:inline-block}span.um-admin-icon-clear:hover{color:#777}span.um-admin-icon-clear i{font-size:20px;vertical-align:middle} +.um-form-table .um-forms-line[data-conditional]{display:none}.um-form-table .um-forms-line label .um-req{color:#a00;margin:0 0 0 3px;font-weight:400}.um-form-table .um-forms-line .um-text-delete{color:#a00;float:left}.um-form-table .um-forms-line .um-text-delete:hover{color:red}.um-form-table .um-forms-line .um-multi-text-add-option{margin-bottom:14px}.um-form-table .um-forms-line .icon_preview{display:none;max-width:200px;max-height:200px;padding:5px;cursor:pointer;border:1px solid #e3e3e3;background:#f7f7f7;border-radius:3px;height:auto;width:auto!important}.um-form-table .um-forms-line td .um-same-page-update-wrapper{display:none;margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper input.um-admin-form-same-page-update{margin:7px 0 0 0}.um-form-table .um-forms-line td .um-same-page-update-wrapper .upgrade_log{margin:7px 0 0 0;width:100%;height:150px;overflow:auto;border:1px solid #a1a1a1}.um-form-table .um-forms-line[data-field_type=same_page_update]{vertical-align:baseline}.um-form-table .um-forms-line[data-field_type=same_page_update] td,.um-form-table .um-forms-line[data-field_type=same_page_update] th{vertical-align:baseline}.um-form-table.um-third-column .um-forms-line th{width:33%}.um-form-table.um-half-column .um-forms-line th{width:50%}.um-form-table.um-two-thirds-column .um-forms-line th{width:83%}.um-form-table.um-top-label .um-forms-line td{padding:0 0 15px 0}.um-form-table.um-top-label .um-forms-line td label{margin:0 0 5px 0;display:inline-block}.um-form-table.um-top-label .um-forms-line[data-field_type=icon] td label{width:100%;display:block;margin:0 0 5px 0}.um-external-link-icon{width:1em;height:1em;margin:0;vertical-align:middle;fill:currentcolor}.um_admin_fonticon_wrapper{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um_admin_fonticon_wrapper .um-admin-icon-value{line-height:1}.um_admin_fonticon_wrapper .um-admin-icon-value i{top:0}input[type=date].um-forms-field,input[type=number].um-forms-field,input[type=password].um-forms-field,input[type=text].um-forms-field,input[type=time].um-forms-field,input[type=url].um-forms-field,select.um-forms-field,textarea.um-forms-field{box-sizing:border-box}input[type=date].um-forms-field.um-long-field,input[type=number].um-forms-field.um-long-field,input[type=password].um-forms-field.um-long-field,input[type=text].um-forms-field.um-long-field,input[type=time].um-forms-field.um-long-field,input[type=url].um-forms-field.um-long-field,select.um-forms-field.um-long-field,textarea.um-forms-field.um-long-field{width:100%!important}input[type=date].um-forms-field.um-medium-field,input[type=number].um-forms-field.um-medium-field,input[type=password].um-forms-field.um-medium-field,input[type=text].um-forms-field.um-medium-field,input[type=time].um-forms-field.um-medium-field,input[type=url].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:50%!important}input[type=date].um-forms-field.um-small-field,input[type=number].um-forms-field.um-small-field,input[type=password].um-forms-field.um-small-field,input[type=text].um-forms-field.um-small-field,input[type=time].um-forms-field.um-small-field,input[type=url].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:25%!important}input[type=number].um-forms-field{padding-right:0}.um-md-default-filters-list,.um-multi-selects-list,.um-multi-text-list{float:left;width:100%;margin:0 0 10px 0}.um-hidden-md-default-filters,.um-hidden-multi-selects,.um-hidden-multi-text{display:none!important}.um-md-default-filters-option-line{float:left;width:100%;clear:both;border-bottom:1px solid #eee;padding:0 0 5px 0;margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-md-default-filters-option-line .um-field-wrapper2.um{margin:5px 0 0 0}.um-md-default-filters-option-line .um-field-wrapper2 .ui-slider-range.ui-widget-header{background:#44b0ec;border:1px solid #44b0ec!important;margin-top:-1px}.um-md-default-filters-option-line .um-field-wrapper2>select{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input{width:100%;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter{width:calc(50% - 7px)!important;float:left}.um-md-default-filters-option-line .um-field-wrapper2>input.um-datepicker-filter:first-child,.um-md-default-filters-option-line .um-field-wrapper2>input.um-timepicker-filter:first-child{margin-right:11px}.um-md-default-filters-option-line .um-field-wrapper2 .um-slider{margin:5px 9px 0 9px;width:calc(100% - 18px);box-sizing:border-box;display:block}.um-md-default-filters-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-selects-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-selects-option-line.um-admin-drag-fld{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap;background:0 0;border:none}.um-multi-selects-option-line.um-admin-drag-fld .um-field-wrapper{width:calc(100% - 90px)}.um-multi-selects-option-line.um-admin-drag-fld .um-field-icon{float:left;width:20px;text-align:left;line-height:30px}.um-multi-selects-option-line .um-field-wrapper{float:left;width:calc(100% - 60px);line-height:30px;box-sizing:border-box}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields{margin:5px 0 0 0}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label{float:left;width:100%;line-height:30px;box-sizing:border-box;margin:0!important;padding:0!important;font-weight:700;display:flex;flex-direction:row;justify-content:space-beetween;align-items:baseline;flex-wrap:nowrap}.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label input[type=text],.um-multi-selects-option-line .um-field-wrapper.um-custom-order-fields label select{width:auto;display:inline;font-weight:400;max-width:70%;flex:.9}.um-multi-selects-option-line .um-field-wrapper input,.um-multi-selects-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-selects-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-multi-text-option-line{float:left;width:100%;padding:0;clear:both;margin:0 0 5px 0}.um-multi-text-option-line .um-field-wrapper{float:left;width:calc(100% - 90px);line-height:30px;box-sizing:border-box}.um-multi-text-option-line .um-field-wrapper input,.um-multi-text-option-line .um-field-wrapper select{float:left;width:100%;margin:0}.um-multi-text-option-line .um-field-control{float:left;width:60px;line-height:30px;padding:0 10px;box-sizing:border-box}.um-form-fields-section{float:left;clear:none;margin:0;padding:0 10px 0 0;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.um-form-fields-section label{float:left;width:100%;margin:0;padding:0}.um-form-fields-section label input{float:left;margin-top:0}.um-form-fields-section label span{float:left;width:calc(100% - 20px)}@media screen and (max-width:782px){input[type=text].um-forms-field.um-medium-field,select.um-forms-field.um-medium-field,textarea.um-forms-field.um-medium-field{width:100%!important}input[type=text].um-forms-field.um-small-field,select.um-forms-field.um-small-field,textarea.um-forms-field.um-small-field{width:50%!important}.um-form-fields-section{width:100%!important}.um-admin-metabox .um-form-fields-section label{line-height:22px!important;margin:0 0 12px 0!important}.um-admin-metabox .um-form-fields-section label span{width:calc(100% - 30px)}.um-multi-selects-option-line,.um-multi-text-option-line{margin:0 0 6px 0}.um-forms-line label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line th,.um-form-table.um-third-column .um-forms-line th,.um-form-table.um-two-thirds-column .um-forms-line th{float:left;width:100%;margin-bottom:5px}.um-form-table.um-half-column .um-forms-line th label,.um-form-table.um-third-column .um-forms-line th label,.um-form-table.um-two-thirds-column .um-forms-line th label{float:left;width:100%}.um-form-table.um-half-column .um-forms-line td,.um-form-table.um-third-column .um-forms-line td,.um-form-table.um-two-thirds-column .um-forms-line td{float:left;width:100%}}.um-sortable-items-field .um-sortable-item{cursor:move!important;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border:1px solid #7e8993;border-radius:4px;-moz-border-radius:4px;background:#fff;height:42px;line-height:28px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex-wrap:nowrap}.um-sortable-items-field .um-sortable-item.um-hidden-item{display:none}.um-sortable-items-field .um-sortable-item .um-field-icon{width:20px;text-align:left;margin:0 10px 0 0}.wp-picker-container input.wp-color-picker[type=text]{width:68px!important;float:left!important;padding:2px 4px!important;border-width:1px!important}span.um-admin-icon-value{margin:0 10px;font-size:13px}span.um-admin-icon-value i{font-size:28px;color:#0085ba;position:relative;top:5px}span.um-admin-icon-clear{display:none;cursor:pointer;position:relative;color:#ccc}span.um-admin-icon-clear.show{display:inline-block}span.um-admin-icon-clear:hover{color:#777}span.um-admin-icon-clear i{font-size:20px;vertical-align:middle} \ No newline at end of file diff --git a/assets/css/admin/forms.sass b/assets/css/admin/forms.sass index 2b7d5c60..b74f1ef5 100644 --- a/assets/css/admin/forms.sass +++ b/assets/css/admin/forms.sass @@ -84,6 +84,7 @@ label margin: 0 0 5px 0 display: inline-block + //font-weight: bold &[data-field_type="icon"] td @@ -95,6 +96,13 @@ // font-style: italic // clear: both +.um-external-link-icon + width: 1em + height: 1em + margin: 0 + vertical-align: middle + fill: currentcolor + .um_admin_fonticon_wrapper +flex( row, flex-start, center, nowrap ) .#{$prefix}admin-icon-value diff --git a/assets/css/admin/global.css b/assets/css/admin/global.css index 1dc29641..1c512a8a 100644 --- a/assets/css/admin/global.css +++ b/assets/css/admin/global.css @@ -1,34 +1,44 @@ ul#adminmenu li#toplevel_page_ultimatemember a.wp-has-current-submenu:after { - display: none !important; } - + display: none !important; +} ul#adminmenu li#toplevel_page_ultimatemember.wp-has-submenu.wp-not-current-submenu:hover:after { - right: -9999999px; } - + right: -9999999px; +} ul#adminmenu > li#toplevel_page_ultimatemember.current > a.current:after { - display: none !important; } + display: none !important; +} .um-admin-notice { border-color: #0085ba; - color: #555; } - .um-admin-notice.error { - border-color: #dc3232; } - .um-admin-notice.notice-warning { - border-color: #dba617; } - .um-admin-notice a { - text-decoration: none; - color: #0085ba; } - .um-admin-notice a:hover { - color: #44b0ec; } - .um-admin-notice a.button-primary { - background-color: #0085ba; - border-color: #0085ba; } - .um-admin-notice a.button-primary:hover { - background-color: #008ec2; - border-color: #008ec2; } - .um-admin-notice a.button-secondary { - opacity: 0.7; } - .um-admin-notice a.button-secondary:hover { - opacity: 0.9; } + color: #555; +} +.um-admin-notice.error { + border-color: #dc3232; +} +.um-admin-notice.notice-warning { + border-color: #dba617; +} +.um-admin-notice a { + text-decoration: none; + color: #0085ba; +} +.um-admin-notice a:hover { + color: #44b0ec; +} +.um-admin-notice a.button-primary { + background-color: #0085ba; + border-color: #0085ba; +} +.um-admin-notice a.button-primary:hover { + background-color: #008ec2; + border-color: #008ec2; +} +.um-admin-notice a.button-secondary { + opacity: 0.7; +} +.um-admin-notice a.button-secondary:hover { + opacity: 0.9; +} /* UM Tooltip ( future helptip ) */ .um .ui-tooltip.um_tooltip { @@ -41,19 +51,28 @@ ul#adminmenu > li#toplevel_page_ultimatemember.current > a.current:after { font-size: 12px; border-radius: 5px; border: none !important; - text-shadow: none !important; } + text-shadow: none !important; +} .um_tooltip { cursor: pointer; - vertical-align: middle; } - .um_tooltip:hover { - opacity: 1; } - .um_tooltip:hover:before { - opacity: 0.8; } - .um_tooltip.dashicons, .um_tooltip.dashicons:before { - height: 22px; } - .um_tooltip.dashicons-editor-help:before { - float: left; - font-size: 20px; - line-height: 20px; - color: rgba(0, 0, 0, 0.85) !important; } + vertical-align: middle; +} +.um_tooltip:hover { + opacity: 1; +} +.um_tooltip:hover:before { + opacity: 0.8; +} +.um_tooltip.dashicons { + height: 22px; +} +.um_tooltip.dashicons:before { + height: 22px; +} +.um_tooltip.dashicons-editor-help:before { + float: left; + font-size: 20px; + line-height: 20px; + color: rgba(0, 0, 0, 0.85) !important; +} \ No newline at end of file diff --git a/assets/css/admin/global.min.css b/assets/css/admin/global.min.css index f1fbda47..d8429501 100644 --- a/assets/css/admin/global.min.css +++ b/assets/css/admin/global.min.css @@ -1 +1 @@ -ul#adminmenu li#toplevel_page_ultimatemember a.wp-has-current-submenu:after{display:none!important}ul#adminmenu li#toplevel_page_ultimatemember.wp-has-submenu.wp-not-current-submenu:hover:after{right:-9999999px}ul#adminmenu>li#toplevel_page_ultimatemember.current>a.current:after{display:none!important}.um-admin-notice{border-color:#0085ba;color:#555}.um-admin-notice.error{border-color:#dc3232}.um-admin-notice.notice-warning{border-color:#dba617}.um-admin-notice a{text-decoration:none;color:#0085ba}.um-admin-notice a:hover{color:#44b0ec}.um-admin-notice a.button-primary{background-color:#0085ba;border-color:#0085ba}.um-admin-notice a.button-primary:hover{background-color:#008ec2;border-color:#008ec2}.um-admin-notice a.button-secondary{opacity:.7}.um-admin-notice a.button-secondary:hover{opacity:.9}.um .ui-tooltip.um_tooltip{padding:8px;color:#eee!important;background:rgba(0,0,0,.85)!important;position:absolute;z-index:10002;max-width:300px;font-size:12px;border-radius:5px;border:none!important;text-shadow:none!important}.um_tooltip{cursor:pointer;vertical-align:middle}.um_tooltip:hover{opacity:1}.um_tooltip:hover:before{opacity:.8}.um_tooltip.dashicons,.um_tooltip.dashicons:before{height:22px}.um_tooltip.dashicons-editor-help:before{float:left;font-size:20px;line-height:20px;color:rgba(0,0,0,.85)!important} \ No newline at end of file +ul#adminmenu li#toplevel_page_ultimatemember a.wp-has-current-submenu:after{display:none!important}ul#adminmenu li#toplevel_page_ultimatemember.wp-has-submenu.wp-not-current-submenu:hover:after{right:-9999999px}ul#adminmenu>li#toplevel_page_ultimatemember.current>a.current:after{display:none!important}.um-admin-notice{border-color:#0085ba;color:#555}.um-admin-notice.error{border-color:#dc3232}.um-admin-notice.notice-warning{border-color:#dba617}.um-admin-notice a{text-decoration:none;color:#0085ba}.um-admin-notice a:hover{color:#44b0ec}.um-admin-notice a.button-primary{background-color:#0085ba;border-color:#0085ba}.um-admin-notice a.button-primary:hover{background-color:#008ec2;border-color:#008ec2}.um-admin-notice a.button-secondary{opacity:.7}.um-admin-notice a.button-secondary:hover{opacity:.9}.um .ui-tooltip.um_tooltip{padding:8px;color:#eee!important;background:rgba(0,0,0,.85)!important;position:absolute;z-index:10002;max-width:300px;font-size:12px;border-radius:5px;border:none!important;text-shadow:none!important}.um_tooltip{cursor:pointer;vertical-align:middle}.um_tooltip:hover{opacity:1}.um_tooltip:hover:before{opacity:.8}.um_tooltip.dashicons{height:22px}.um_tooltip.dashicons:before{height:22px}.um_tooltip.dashicons-editor-help:before{float:left;font-size:20px;line-height:20px;color:rgba(0,0,0,.85)!important} \ No newline at end of file diff --git a/assets/css/admin/global.sass b/assets/css/admin/global.sass index 5e62c3bd..f6e87482 100644 --- a/assets/css/admin/global.sass +++ b/assets/css/admin/global.sass @@ -57,7 +57,7 @@ ul#adminmenu &.dashicons height: 22px &:before - @extend .#{$helptip}.dashicons + height: 22px &.dashicons-editor-help:before float: left font-size: 20px diff --git a/assets/css/admin/modal.css b/assets/css/admin/modal.css index a666a9eb..aa09bc48 100644 --- a/assets/css/admin/modal.css +++ b/assets/css/admin/modal.css @@ -5,7 +5,8 @@ position: fixed; top: 0; left: 0; - z-index: 10000; } + z-index: 10000; +} .um-admin-modal { border-radius: 3px; @@ -17,59 +18,78 @@ z-index: 10001; box-sizing: border-box; width: 730px; - margin-left: -365px; } - .um-admin-modal.normal { - width: 730px; - margin-left: -365px; } - .um-admin-modal.smaller { - width: 500px; - margin-left: -250px; } - .um-admin-modal.small { - width: 400px; - margin-left: -200px; } - .um-admin-modal input[type="submit"].button-primary { - padding: 0 12px !important; - vertical-align: middle !important; - line-height: 24px !important; } - .um-admin-modal .um-admin-modal-body { - padding: 10px 20px 10px 20px; - max-height: 500px; - overflow: auto; } - .um-admin-modal .um-admin-modal-body.um-admin-metabox label { - margin: 0 !important; } - .um-admin-modal .um-admin-modal-body.um-admin-metabox .um-admin-editor-h { - margin-top: 12px; } - .um-admin-modal .um-admin-modal-body.um-admin-metabox .um-admin-editor-h label { - margin: 0 0 4px 0 !important; } - .um-admin-modal .um-admin-modal-body.um-admin-metabox .wp-editor-wrap { - margin: 0 0 4px 0 !important; } - .um-admin-modal .um-admin-modal-body.um-admin-metabox .wp-editor-wrap textarea { - border: 0 !important; } - .um-admin-modal a.button-primary { - padding: 0 12px !important; - vertical-align: middle !important; } - .um-admin-modal a.button { - padding: 0 12px !important; - vertical-align: middle !important; } - .um-admin-modal a.button i:before { - display: block; - top: 0; } - .um-admin-modal h3 { - font-size: 14px; - line-height: 14px; - font-weight: normal; - color: #fff; } - .um-admin-modal h4 { - margin: 0 0 10px 0 !important; } - .um-admin-modal label { - font-size: 13px; - color: #aaa; } - .um-admin-modal p { - font-size: 13px; - color: #aaa; } - .um-admin-modal.loading .um-admin-modal-body { - height: 200px; - background: url(../../img/ajax-loader.gif) no-repeat center; } + margin-left: -365px; +} +.um-admin-modal.normal { + width: 730px; + margin-left: -365px; +} +.um-admin-modal.smaller { + width: 500px; + margin-left: -250px; +} +.um-admin-modal.small { + width: 400px; + margin-left: -200px; +} +.um-admin-modal input[type=submit].button-primary { + padding: 0 12px !important; + vertical-align: middle !important; + line-height: 24px !important; +} +.um-admin-modal .um-admin-modal-body { + padding: 10px 20px 10px 20px; + max-height: 500px; + overflow: auto; +} +.um-admin-modal .um-admin-modal-body.um-admin-metabox label { + margin: 0 !important; +} +.um-admin-modal .um-admin-modal-body.um-admin-metabox .um-admin-editor-h { + margin-top: 12px; +} +.um-admin-modal .um-admin-modal-body.um-admin-metabox .um-admin-editor-h label { + margin: 0 0 4px 0 !important; +} +.um-admin-modal .um-admin-modal-body.um-admin-metabox .wp-editor-wrap { + margin: 0 0 4px 0 !important; +} +.um-admin-modal .um-admin-modal-body.um-admin-metabox .wp-editor-wrap textarea { + border: 0 !important; +} +.um-admin-modal a.button-primary { + padding: 0 12px !important; + vertical-align: middle !important; +} +.um-admin-modal a.button { + padding: 0 12px !important; + vertical-align: middle !important; +} +.um-admin-modal a.button i:before { + display: block; + top: 0; +} +.um-admin-modal h3 { + font-size: 14px; + line-height: 14px; + font-weight: normal; + color: #fff; +} +.um-admin-modal h4 { + margin: 0 0 10px 0 !important; +} +.um-admin-modal label { + font-size: 13px; + color: #aaa; +} +.um-admin-modal p { + font-size: 13px; + color: #aaa; +} +.um-admin-modal.loading .um-admin-modal-body { + height: 200px; + background: url(../../img/ajax-loader.gif) no-repeat center; +} .um-admin-modal-close { position: absolute; @@ -78,63 +98,76 @@ top: 14px; font-size: 22px; text-decoration: none; - opacity: 0.4; } - .um-admin-modal-close:hover { - opacity: 1; } + opacity: 0.4; +} +.um-admin-modal-close:hover { + opacity: 1; +} .um-admin-modal-head { padding: 4px 20px; background: #0085ba; position: relative; - border-radius: 3px 3px 0 0; } + border-radius: 3px 3px 0 0; +} .um-admin-modal-foot { padding: 20px 0 !important; border-top: 1px solid #ddd; text-align: center; background: #eee; - border-radius: 0 0 3px 3px; } - .um-admin-modal-foot a, - .um-admin-modal-foot input { - margin: 0 10px !important; - font-size: 14px !important; } + border-radius: 0 0 3px 3px; +} +.um-admin-modal-foot a, +.um-admin-modal-foot input { + margin: 0 10px !important; + font-size: 14px !important; +} #UM_fonticons div.um-admin-metabox { - padding-bottom: 22px !important; } + padding-bottom: 22px !important; +} p._icon_search { position: relative; width: 85% !important; margin: 0 auto !important; - padding: 12px 0 0 0 !important; } - p._icon_search:before { - position: absolute; - right: 6px; - top: 12px; - font-size: 20px; - content: "\f4a4"; - font-family: "Ionicons"; - color: #999; } - p._icon_search:before input[type="text"] { - padding-right: 40px !important; } + padding: 12px 0 0 0 !important; +} +p._icon_search:before { + position: absolute; + right: 6px; + top: 12px; + font-size: 20px; + content: "\f4a4"; + font-family: "Ionicons"; + color: #999; +} +p._icon_search:before input[type=text] { + padding-right: 40px !important; +} .um-admin-icons { padding: 0 0 15px 12px; - float: left; } - .um-admin-icons span { - cursor: pointer; - float: left; - margin: 5px; - color: #777; - border: 4px solid #eee; - border-radius: 3px; } - .um-admin-icons span:hover, .um-admin-icons span.highlighted { - color: #0085ba; - border-color: #0085ba; } - .um-admin-icons i { - vertical-align: middle !important; - font-size: 24px; - width: 24px; - text-align: center; - padding: 15px 20px; - display: inline-block; } + float: left; +} +.um-admin-icons span { + cursor: pointer; + float: left; + margin: 5px; + color: #777; + border: 4px solid #eee; + border-radius: 3px; +} +.um-admin-icons span:hover, .um-admin-icons span.highlighted { + color: #0085ba; + border-color: #0085ba; +} +.um-admin-icons i { + vertical-align: middle !important; + font-size: 24px; + width: 24px; + text-align: center; + padding: 15px 20px; + display: inline-block; +} \ No newline at end of file diff --git a/assets/css/admin/modal.sass b/assets/css/admin/modal.sass index d450f068..3c4a3f4e 100644 --- a/assets/css/admin/modal.sass +++ b/assets/css/admin/modal.sass @@ -1,11 +1,11 @@ .um-admin-overlay - background: rgba( 0, 0, 0, 0.7) - width: 100% - height: 100% - position: fixed - top: 0 - left: 0 - z-index: 10000 + background: rgba( 0, 0, 0, 0.7) + width: 100% + height: 100% + position: fixed + top: 0 + left: 0 + z-index: 10000 .um-admin-modal border-radius: 3px diff --git a/assets/css/admin/nav-menu.css b/assets/css/admin/nav-menu.css index e1c369b3..9065644c 100644 --- a/assets/css/admin/nav-menu.css +++ b/assets/css/admin/nav-menu.css @@ -1,11 +1,14 @@ .wp-admin p.um-nav-roles { display: none; - margin-top: 5px; } - .wp-admin p.um-nav-roles label { - margin-top: 2px !important; - margin-bottom: 2px !important; } - .wp-admin p.um-nav-roles label input[type="checkbox"] { - margin-top: 2px !important; } - + margin-top: 5px; +} +.wp-admin p.um-nav-roles label { + margin-top: 2px !important; + margin-bottom: 2px !important; +} +.wp-admin p.um-nav-roles label input[type=checkbox] { + margin-top: 2px !important; +} .wp-admin p.um-nav-mode { - margin-top: 10px; } + margin-top: 10px; +} \ No newline at end of file diff --git a/assets/css/admin/roles.css b/assets/css/admin/roles.css index a6bc71a9..63ff1d51 100644 --- a/assets/css/admin/roles.css +++ b/assets/css/admin/roles.css @@ -1,34 +1,46 @@ #um-roles .row-actions .reset a { - color: #a00; } - #um-roles .row-actions .reset a:hover { - color: red; } + color: #a00; +} +#um-roles .row-actions .reset a:hover { + color: red; +} .wp-list-table.roles .column-core, .wp-list-table.roles .column-users { width: 15%; - text-align: center !important; } - + text-align: center !important; +} .wp-list-table.roles .column-admin_access, .wp-list-table.roles .column-priority { width: 10%; - text-align: center !important; } + text-align: center !important; +} @media screen and (max-width: 782px) { .wp-list-table.roles .column-core, .wp-list-table.roles .column-users, .wp-list-table.roles .column-admin_access, .wp-list-table.roles .column-priority { - text-align: left !important; } } - + text-align: left !important; + } +} #um-admin-form-wp-capabilities .um-metadata-line th { - width: auto; } - + width: auto; +} #um-admin-form-wp-capabilities .um-metadata-line td { - width: 20px; } + width: 20px; +} #um_edit_role #titlewrap > span { width: 40px; font-size: 24px; float: left; display: block; - line-height: 37px; } + line-height: 37px; +} + +#um-admin-form-publish #major-publishing-actions { + padding-top: 0; + padding-left: 0; + padding-right: 0; +} \ No newline at end of file diff --git a/assets/css/admin/roles.min.css b/assets/css/admin/roles.min.css index 8343788a..9d13aba0 100644 --- a/assets/css/admin/roles.min.css +++ b/assets/css/admin/roles.min.css @@ -1 +1 @@ -#um-roles .row-actions .reset a{color:#a00}#um-roles .row-actions .reset a:hover{color:red}.wp-list-table.roles .column-core,.wp-list-table.roles .column-users{width:15%;text-align:center!important}.wp-list-table.roles .column-admin_access,.wp-list-table.roles .column-priority{width:10%;text-align:center!important}@media screen and (max-width:782px){.wp-list-table.roles .column-admin_access,.wp-list-table.roles .column-core,.wp-list-table.roles .column-priority,.wp-list-table.roles .column-users{text-align:left!important}}#um-admin-form-wp-capabilities .um-metadata-line th{width:auto}#um-admin-form-wp-capabilities .um-metadata-line td{width:20px}#um_edit_role #titlewrap>span{width:40px;font-size:24px;float:left;display:block;line-height:37px} \ No newline at end of file +#um-roles .row-actions .reset a{color:#a00}#um-roles .row-actions .reset a:hover{color:red}.wp-list-table.roles .column-core,.wp-list-table.roles .column-users{width:15%;text-align:center!important}.wp-list-table.roles .column-admin_access,.wp-list-table.roles .column-priority{width:10%;text-align:center!important}@media screen and (max-width:782px){.wp-list-table.roles .column-admin_access,.wp-list-table.roles .column-core,.wp-list-table.roles .column-priority,.wp-list-table.roles .column-users{text-align:left!important}}#um-admin-form-wp-capabilities .um-metadata-line th{width:auto}#um-admin-form-wp-capabilities .um-metadata-line td{width:20px}#um_edit_role #titlewrap>span{width:40px;font-size:24px;float:left;display:block;line-height:37px}#um-admin-form-publish #major-publishing-actions{padding-top:0;padding-left:0;padding-right:0} \ No newline at end of file diff --git a/assets/css/admin/roles.sass b/assets/css/admin/roles.sass index 08869811..fb78b1ca 100644 --- a/assets/css/admin/roles.sass +++ b/assets/css/admin/roles.sass @@ -42,3 +42,10 @@ float: left display: block line-height: 37px + +#um-admin-form-publish + #major-publishing-actions + padding-top: 0 + padding-left: 0 + padding-right: 0 + diff --git a/assets/css/admin/settings.css b/assets/css/admin/settings.css index 55cec4ca..54385c77 100644 --- a/assets/css/admin/settings.css +++ b/assets/css/admin/settings.css @@ -1,5 +1,6 @@ .um-settings-section .description { - font-style: italic; } + font-style: italic; +} .um-notification-status { margin-right: 18px; @@ -9,74 +10,93 @@ float: left; box-sizing: border-box; -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-notification-status.um-notification-is-active { - color: #7acf58; } + -webkit-box-sizing: border-box; +} +.um-notification-status.um-notification-is-active { + color: #7acf58; +} .um-email-configure span { - line-height: 24px; } + line-height: 24px; +} .um-long-field { - width: 100%; } + width: 100%; +} .um-medium-field { - width: 50%; } + width: 50%; +} .um-small-field { - width: 25%; } + width: 25%; +} .column-configure { width: 10%; - text-align: right; } + text-align: right; +} th.column-email.column-primary { - padding-left: 48px; } + padding-left: 48px; +} .um-form-table .um-forms-line td { - padding-right: 0; } + padding-right: 0; +} #um-settings-emails { - margin: 15px 0; } + margin: 15px 0; +} #um-settings-template-versions { - margin: 15px 0; } - #um-settings-template-versions .wp-list-table .column-core_version { - width: 100px; - text-align: center; } - #um-settings-template-versions .wp-list-table .column-theme_version { - width: 100px; - text-align: center; } - #um-settings-template-versions .wp-list-table .column-status { - width: 260px; } + margin: 15px 0; +} +#um-settings-template-versions .wp-list-table .column-core_version { + width: 100px; + text-align: center; +} +#um-settings-template-versions .wp-list-table .column-theme_version { + width: 100px; + text-align: center; +} +#um-settings-template-versions .wp-list-table .column-status { + width: 260px; +} #um-settings-form { float: left; width: 100%; - margin: 0; } - #um-settings-form .subsubsub { - float: left; - width: 100%; } - #um-settings-form h2.title a.um-back-button { - font-weight: normal; - font-size: 30px; - line-height: 1; - text-decoration: none; - margin-right: 5px; } + margin: 0; +} +#um-settings-form .subsubsub { + float: left; + width: 100%; +} +#um-settings-form h2.title a.um-back-button { + font-weight: normal; + font-size: 30px; + line-height: 1; + text-decoration: none; + margin-right: 5px; +} .um-settings-line .multi-checkbox-line { float: left; width: 100%; clear: both; margin: 0 0 10px 0; - padding: 0; } - + padding: 0; +} .um-settings-line .multi-checkbox-column { float: left; margin: 0; - padding: 0; } - .um-settings-line .multi-checkbox-column label { - float: left; - width: 100%; } + padding: 0; +} +.um-settings-line .multi-checkbox-column label { + float: left; + width: 100%; +} .wrap-licenses .form-table, .wrap-licenses thead, @@ -86,8 +106,8 @@ th.column-email.column-primary { .wrap-licenses td, .wrap-licenses th, .wrap-licenses caption { - display: block; } - + display: block; +} .wrap-licenses .form-table tr { float: left; margin: 0 15px 15px 0; @@ -98,23 +118,23 @@ th.column-email.column-primary { padding: 14px; min-height: 240px; position: relative; - box-sizing: border-box; } - + box-sizing: border-box; +} .wrap-licenses .form-table th { background: #f9f9f9; padding: 14px; border-bottom: 1px solid #ccc; margin: -14px -14px 20px; - width: 100%; } - + width: 100%; +} .wrap-licenses .form-table td { - padding: 0; } - + padding: 0; +} .wrap-licenses td input.regular-text { margin: 0 0 8px; - width: 100%; } - -.wrap-licenses .edd-license-data[class*="edd-license-"] { + width: 100%; +} +.wrap-licenses .edd-license-data[class*=edd-license-] { position: absolute; background: #fafafa; padding: 14px; @@ -123,75 +143,92 @@ th.column-email.column-primary { min-height: 67px; width: 100%; bottom: 14px; - box-sizing: border-box; } - .wrap-licenses .edd-license-data[class*="edd-license-"] a { - color: #444; } - .wrap-licenses .edd-license-data[class*="edd-license-"] a:hover { - text-decoration: none; } - + box-sizing: border-box; +} +.wrap-licenses .edd-license-data[class*=edd-license-] a { + color: #444; +} +.wrap-licenses .edd-license-data[class*=edd-license-] a:hover { + text-decoration: none; +} .wrap-licenses .edd-license-data.license-expires-soon-notice { background-color: #00a0d2; color: #fff; - border-color: #00a0d2; } - .wrap-licenses .edd-license-data.license-expires-soon-notice a { - color: #fff; } - .wrap-licenses .edd-license-data.license-expires-soon-notice a:hover { - text-decoration: none; } - + border-color: #00a0d2; +} +.wrap-licenses .edd-license-data.license-expires-soon-notice a { + color: #fff; +} +.wrap-licenses .edd-license-data.license-expires-soon-notice a:hover { + text-decoration: none; +} .wrap-licenses .edd-license-data.edd-license-expired { background-color: #e24e4e; color: #fff; - border-color: #e24e4e; } - .wrap-licenses .edd-license-data.edd-license-expired a { - color: #fff; } - .wrap-licenses .edd-license-data.edd-license-expired a:hover { - text-decoration: none; } - + border-color: #e24e4e; +} +.wrap-licenses .edd-license-data.edd-license-expired a { + color: #fff; +} +.wrap-licenses .edd-license-data.edd-license-expired a:hover { + text-decoration: none; +} .wrap-licenses .edd-license-data.edd-license-valid { background-color: #5abc55; color: #fff; - border-color: #5abc55; } - + border-color: #5abc55; +} .wrap-licenses .edd-license-data.edd-license-error, .wrap-licenses .edd-license-data.edd-license-missing, .wrap-licenses .edd-license-data.edd-license-invalid, .wrap-licenses .edd-license-data.edd-license-site_inactive, .wrap-licenses .edd-license-data.edd-license-item_name_mismatch { background-color: #ffebcd; - border-color: #ffebcd; } - + border-color: #ffebcd; +} .wrap-licenses .edd-license-data p { font-size: 13px; - margin-top: 0; } - + margin-top: 0; +} .wrap-licenses ~ p.submit { - clear: both; } + clear: both; +} @media screen and (max-width: 980px) { .wrap-licenses .form-table tr { - width: calc( 50% - 15px); - max-width: none; } } - + width: calc(50% - 15px); + max-width: none; + } +} @media screen and (max-width: 782px) { #um-settings-template-versions .wp-list-table .column-core_version, #um-settings-template-versions .wp-list-table .column-theme_version { width: auto; - text-align: left; } + text-align: left; + } .wrap-licenses .form-table tr { width: 100%; margin-right: 0; - max-width: none; } + max-width: none; + } .um-settings-line .multi-checkbox-column { - width: 100% !important; } - .um-settings-line .multi-checkbox-column label { - line-height: 30px !important; } + width: 100% !important; + } + .um-settings-line .multi-checkbox-column label { + line-height: 30px !important; + } .um-medium-field { - width: 100%; } + width: 100%; + } .um-small-field { - width: 50%; } } - + width: 50%; + } +} .um_setting_ajax_button_response.complete { color: #7acf58; - font-style: italic; } + font-style: italic; +} .wp-core-ui .button.um_license_activate, .wp-core-ui .button.um_license_deactivate, .wp-core-ui .button.um_license_reactivate { - margin-top: 5px; } + margin-top: 5px; +} .um-media-upload .um-media-upload-url { - margin-bottom: 5px; } + margin-bottom: 5px; +} \ No newline at end of file diff --git a/assets/css/admin/users.css b/assets/css/admin/users.css index 806eb9b5..bb7b01fc 100644 --- a/assets/css/admin/users.css +++ b/assets/css/admin/users.css @@ -1,29 +1,33 @@ .um-admin.users-php .subsubsub li.subsep { display: block; visibility: hidden; - height: 0; } + height: 0; +} .um-admin-modal .um-admin-infobox label { font-weight: bold; display: block; color: #333; - cursor: default; } - + cursor: default; +} .um-admin-modal .um-admin-infobox p { color: #666; - padding-top: 15px; } - + padding-top: 15px; +} .um-admin-modal .um-admin-infobox > p:not(:first-child) { - border-top: 1px solid #e5e5e5; } - + border-top: 1px solid #e5e5e5; +} .um-admin-modal .um-admin-infobox > p:first-child { margin-top: 0; - padding-top: 0; } - + padding-top: 0; +} .um-admin-modal .um-admin-infobox > .um-row > p { - border-top: 1px solid #e5e5e5; } - .um-admin-modal .um-admin-infobox > .um-row > p:last-child { - margin-bottom: 0; } + border-top: 1px solid #e5e5e5; +} +.um-admin-modal .um-admin-infobox > .um-row > p:last-child { + margin-bottom: 0; +} #UM_preview_registration .um-admin-modal-foot { - display: none; } + display: none; +} \ No newline at end of file diff --git a/assets/css/common.css b/assets/css/common.css index bbe821a6..cffc705e 100644 --- a/assets/css/common.css +++ b/assets/css/common.css @@ -2,8 +2,8 @@ .um .tipsy, .um-page .tipsy { z-index: 9999999999; - font-size: inherit; } - + font-size: inherit; +} .um .tipsy-inner, .um-page .tipsy-inner { background-color: #333333; @@ -15,20 +15,21 @@ line-height: 17px; word-wrap: break-word; -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } - + -moz-osx-font-smoothing: grayscale; +} .um .tipsy-arrow-n, .um-page .tipsy-arrow-n { - border-bottom-color: #333; } - + border-bottom-color: #333; +} .um .tipsy-arrow-s, .um-page .tipsy-arrow-s { - border-top-color: #333; } - + border-top-color: #333; +} .um .tipsy-arrow-e, .um-page .tipsy-arrow-e { - border-left-color: #333; } - + border-left-color: #333; +} .um .tipsy-arrow-w, .um-page .tipsy-arrow-w { - border-right-color: #333; } + border-right-color: #333; +} \ No newline at end of file diff --git a/assets/css/um-members-rtl.css b/assets/css/um-members-rtl.css index 301343a7..8ac2812a 100644 --- a/assets/css/um-members-rtl.css +++ b/assets/css/um-members-rtl.css @@ -1,85 +1,93 @@ .um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { - justify-content: flex-start; } - + justify-content: flex-start; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a { - margin: 0 0 0 5px; } - + margin: 0 0 0 5px; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown { right: -12px; - left: auto; } - + left: auto; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a { - margin: 0 0 0 5px; } - + margin: 0 0 0 5px; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input, .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input { - margin: 0 0 0 5px !important; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even), .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even) { - margin: 0 5px 0 0 !important; } - + margin: 0 0 0 5px !important; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even), .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even) { + margin: 0 5px 0 0 !important; +} .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag { - margin: 0 0 5px 10px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child { - margin-left: 10px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove { - margin-left: 0; - margin-right: 10px; } - + margin: 0 0 5px 10px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child { + margin-left: 10px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove { + margin-left: 0; + margin-right: 10px; +} .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before { margin-right: 0; - margin-left: 8px; } - + margin-left: 8px; +} .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo { - margin: 0 0 0 15px; } - + margin: 0 0 0 15px; +} .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown { right: auto; left: 0; - text-align: right; } - + text-align: right; +} .um-directory .um-members-pagination-box .um-members-pagi { - align-items: center; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow { - transform: rotate(180deg); } - + align-items: center; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow { + transform: rotate(180deg); +} .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { - margin: 0 0 0 2px; } - + margin: 0 0 0 2px; +} .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown { right: auto; - left: 0; } - + left: 0; +} .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { - margin: 0 0 0 5px; } - + margin: 0 0 0 5px; +} .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { - align-items: flex-start; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - margin: 0 0 0 10px; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { - margin: 0 0 5px 10px; } - + align-items: flex-start; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { + margin: 0 0 0 10px; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { + margin: 0 0 5px 10px; +} .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { - margin: 0 0 0 10px; } - + margin: 0 0 0 10px; +} .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - margin: 0 0 0 10px; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { - margin: 0 0 5px 10px; } + margin: 0 0 0 10px; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { + margin: 0 0 5px 10px; +} \ No newline at end of file diff --git a/assets/css/um-members.css b/assets/css/um-members.css index ced7458c..edecd6cc 100644 --- a/assets/css/um-members.css +++ b/assets/css/um-members.css @@ -1,35 +1,43 @@ @-webkit-keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} @-moz-keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} @-ms-keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} @keyframes um-ajax-spinning { 0% { -webkit-transform: rotate(0deg); - transform: rotate(0deg); } + transform: rotate(0deg); + } 100% { -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - + transform: rotate(360deg); + } +} .um-new-dropdown { font-size: 16px; margin: 0; @@ -46,18 +54,22 @@ -webkit-box-sizing: border-box; border-radius: 5px 5px 5px 5px; -moz-border-radius: 5px 5px 5px 5px; - -webkit-border-radius: 5px 5px 5px 5px; } - .um-new-dropdown ul { - margin: 0; - padding: 0; } - .um-new-dropdown ul li { - list-style-type: none; - padding: 0; - margin: 0; } - .um-new-dropdown ul li a { - display: block; - padding: 8px 12px; - line-height: 1; } + -webkit-border-radius: 5px 5px 5px 5px; +} +.um-new-dropdown ul { + margin: 0; + padding: 0; +} +.um-new-dropdown ul li { + list-style-type: none; + padding: 0; + margin: 0; +} +.um-new-dropdown ul li a { + display: block; + padding: 8px 12px; + line-height: 1; +} .um-new-dropdown-arr { position: absolute; @@ -66,23 +78,27 @@ height: 24px; overflow: hidden; z-index: 15; - color: #eee; } - .um-new-dropdown-arr * { - display: block; - width: 24px; - height: 24px; - vertical-align: bottom; - overflow: hidden; - line-height: 24px; } + color: #eee; +} +.um-new-dropdown-arr * { + display: block; + width: 24px; + height: 24px; + vertical-align: bottom; + overflow: hidden; + line-height: 24px; +} body #content .um-directory a { text-decoration: none; border-bottom: none; - box-shadow: none; } - body #content .um-directory a:hover, body #content .um-directory a:focus { - text-decoration: none; - border-bottom: none; - box-shadow: none; } + box-shadow: none; +} +body #content .um-directory a:hover, body #content .um-directory a:focus { + text-decoration: none; + border-bottom: none; + box-shadow: none; +} .um-directory { display: flex; @@ -90,928 +106,1146 @@ body #content .um-directory a { justify-content: flex-start; align-items: stretch; flex-wrap: nowrap; - position: relative; } - .um-directory a { - text-decoration: none; - border-bottom: none; - box-shadow: none; } - .um-directory a:hover, .um-directory a:focus { - text-decoration: none; - border-bottom: none; - box-shadow: none; } - .um-directory .select2-container--disabled { - opacity: 0.6; } - .um-directory .um-members-overlay { - display: none; - position: absolute; - width: 100%; - top: 0; - bottom: 0; - background: none; - z-index: 2; } - .um-directory .um-members-overlay .um-ajax-loading { - -webkit-transition: 0.1s opacity; - -moz-transition: 0.1s opacity; - -ms-transition: 0.1s opacity; - -o-transition: 0.1s opacity; - transition: 0.1s opacity; - color: #c6c6c6 !important; - -webkit-animation: um-ajax-spinning 1.1s infinite linear; - animation: um-ajax-spinning 1.1s infinite linear; - border-top: 0.2em solid rgba(198, 198, 198, 0.2); - border-right: 0.2em solid rgba(198, 198, 198, 0.2); - border-bottom: 0.2em solid rgba(198, 198, 198, 0.2); - border-left: .2em solid #c6c6c6; - font-size: 1.75em; - position: absolute; - left: calc(50% - 1.75em); - top: calc(50% - 1.75em); - filter: alpha(opacity=0); - -ms-transform: translateZ(0); - transform: translateZ(0); - border-radius: 50%; - display: block; - width: 2.5em; - height: 2.5em; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; } - .um-directory .um-member-directory-header { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: stretch; - flex-wrap: nowrap; - width: 100%; } - .um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-filters-bar { - padding: 0 0 10px 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row:not(.um-member-directory-filters-bar) { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - margin: 0 0 10px 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row.um-header-row-invisible { - margin: 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { - justify-content: flex-end; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; - width: 60%; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label { - flex: 1; - margin: 0 10px 0 0; - min-width: 90px; - max-width: 85%; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label span { - display: none; - margin: 0 5px 0 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label .um-search-line { - -webkit-appearance: textfield; - width: 100%; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line .um-do-search { - min-width: 15%; - width: auto; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - flex-wrap: nowrap; - width: 100%; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { - font-size: 30px; - line-height: 30px; - margin: 0 10px 0 0; - width: 30px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type .um-member-directory-view-type-a { - color: #ddd; - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled { - cursor: default; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled a { - cursor: default; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:hover { - color: #ccc; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:focus { - color: #ddd; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - flex: 5; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - position: relative; - cursor: pointer; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a { - margin: 0 5px 0 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-down { - display: inline; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-up { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-down { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-up { - display: inline; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown { - top: 24px; - width: 200px; - left: -12px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown li a[data-selected="1"] { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: baseline; - flex-wrap: nowrap; - flex: 2; - text-align: right; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - cursor: pointer; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a { - margin: 0 5px 0 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-down { - display: inline; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-up { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-down { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-up { - display: inline; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search { - margin: 0; - width: 100%; - display: grid; - grid-template-rows: auto 1fr; - grid-template-columns: repeat(3, 1fr); - grid-gap: 10px; - grid-auto-rows: minmax(max-content, auto); - -ms-grid-template-rows: auto 1fr; - -ms-grid-template-columns: repeat(3, 1fr); - -ms-grid-gap: 10px; - -ms-grid-auto-rows: minmax(max-content, auto); - align-items: center; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - width: 100%; - position: relative; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .select2-container { - float: left; - width: 100% !important; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .um-s1 { - width: 100%; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-text-filter-type input { - width: 100%; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type { - flex-direction: column; - align-items: stretch; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider { - width: calc( 100% - 16px); } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider .ui-slider-range.ui-widget-header { - background: #44b0ec; - border: 1px solid #44b0ec !important; - margin-top: -1px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider.ui-slider.ui-slider-horizontal { - border: 1px solid #ddd !important; - box-sizing: border-box; - margin: 4px 8px 0 8px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider-range { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - margin: 6px 0 0 8px; - font-size: 0.8em; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type, .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input, .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input { - width: calc( 50% - 5px); - margin: 0 5px 0 0 !important; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even), .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even) { - margin: 0 0 0 5px !important; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search[style*="overflow: hidden;"] .um-search-filter { - pointer-events: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-search.um-search-invisible { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: wrap; - margin: 0; - padding: 0; - box-sizing: border-box; - border: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; - margin: 0 10px 5px 0; - padding: 0 10px; - border-radius: 3px; - cursor: default; - background: #f1f1f1; - font-size: 13px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child { - margin-left: 0; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove { - float: right; - display: inline-block; - margin-left: 10px; - cursor: pointer; - font-weight: bold; - font-size: 20px; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove:hover { - color: #a00; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters { - display: none; } - .um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters a { - padding: 3px 10px; - margin: 0 10px; } - .um-directory .um-members-wrapper { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: stretch; - flex-wrap: nowrap; - width: 100%; - margin: 0 0 10px 0; - padding: 0; - position: relative; - height: 300px; } - .um-directory .um-members-wrapper .um-members-intro { - text-align: center; - margin: 0 0 10px 0; } - .um-directory .um-members-wrapper .um-members-total { - font-size: 20px; - font-weight: 300; } - .um-directory .um-members-wrapper .um-members { - width: 100%; - margin: 0; - padding: 0; - -ms-word-break: break-all; - word-break: break-word; - word-wrap: break-word; } - .um-directory .um-members-wrapper .um-members .um-member { - border: 1px solid #ddd; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1 a img { - -moz-border-radius: 999px !important; - -webkit-border-radius: 999px !important; - border-radius: 999px !important; } - .um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-2 a img { - -moz-border-radius: 4px !important; - -webkit-border-radius: 4px !important; - border-radius: 4px !important; } - .um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-3 a img { - -moz-border-radius: 0 !important; - -webkit-border-radius: 0 !important; - border-radius: 0 !important; } - .um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; } - .um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name a { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: nowrap; } - .um-directory .um-members-wrapper .um-members img { - display: block; - overflow: hidden; - -moz-border-radius: 0; - -webkit-border-radius: 0; - border-radius: 0; - margin: 0; - padding: 0; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { - width: 5%; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member { - float: left; - width: 30%; - background: #fff; - text-align: center; - margin-bottom: 40px; - position: relative; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status { - display: none; - background: #999; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.inactive, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.rejected { - display: block; - position: absolute; - top: 0; - left: 0; - width: 100%; - padding: 7px 15px; - color: #fff; - z-index: 10; - font-size: 13px; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review { - background: #c74a4a; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo { - padding: 40px 0 20px 0; - text-align: center; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a { - text-decoration: none; - box-shadow: none !important; - display: inline !important; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a img { - display: inline !important; - border: 5px solid #fff; - background: #fff; - width: 140px; - height: 140px; - float: none !important; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.awaiting_admin_review, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.inactive, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.rejected { - opacity: 0.7; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo { - padding-top: 0; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo a img { - width: 90px; - height: 90px; - position: relative; - top: -35px; - margin-bottom: -45px; - float: none; - opacity: 1; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover { - background-color: #eee; - box-sizing: border-box; - position: relative; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio] { - overflow-y: hidden; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e { - text-align: center; - box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e img { - width: 100% !important; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card { - padding-bottom: 15px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card.no-photo { - padding-top: 30px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name { - margin: 0 0 4px 0; - justify-content: center; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name a { - font-size: 16px; - line-height: 26px; - color: #444; - font-weight: 700; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn { - margin: 2px 0; - height: 40px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn { - padding: 10px 15px !important; - transition: none !important; - display: inline-block !important; - margin: 0 auto !important; - min-width: 110px; - width: auto; - text-align: center; - font-size: 13px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before { - font-family: "FontAwesome"; - margin-right: 8px; - width: 14px; - text-align: left; - display: inline-block; - font-size: 16px; - position: relative; - left: 0; - top: 1px; - content: "\f013"; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-tagline { - font-size: 13px; - line-height: 22px; - color: #999; - padding: 0 15px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta { - display: none; - margin: 20px 15px 0 15px; - padding: 15px 0; - border-top: 1px solid #e5e5e5; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta.no-animate { - display: block; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline { - font-size: 13px; - padding: 12px 0 0 0; - line-height: 16px; - vertical-align: middle; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline strong { - display: block; - clear: both; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline span { - display: block; - text-align: center; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect { - padding-top: 20px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a { - display: inline-block; - width: 40px; - line-height: 40px; - height: 40px; - -moz-border-radius: 999px; - -webkit-border-radius: 999px; - border-radius: 999px; - color: #fff !important; - opacity: 0.85; - margin: 0 1px; - font-size: 22px; - transition: 0.25s; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a:hover { - opacity: 1; - color: #fff; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less { - display: none; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a { - color: #666; - display: inline-block; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a i { - display: block; - font-size: 32px; - height: 32px; - line-height: 32px; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a { - color: #666; - display: inline-block; } - .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a i { - display: block; - font-size: 32px; - height: 32px; - line-height: 32px; } - .um-directory .um-members-wrapper .um-members.um-members-list { - display: grid; - grid-template-rows: auto 1fr; - grid-template-columns: repeat(1, 1fr); - grid-gap: 10px; - grid-auto-rows: minmax(max-content, auto); - -ms-grid-template-rows: auto 1fr; - -ms-grid-template-columns: repeat(1, 1fr); - -ms-grid-gap: 10px; - -ms-grid-auto-rows: minmax(max-content, auto); - align-items: center; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: stretch; - flex-wrap: nowrap; - width: 100%; - padding: 15px; - margin: 0; - background: #fff; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status { - display: none; - background: #999; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review, .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.inactive, .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.rejected { - display: block; - width: 100%; - padding: 7px 15px; - margin-bottom: 10px; - color: #fff; - font-size: 13px; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review { - background: #c74a4a; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - flex-wrap: nowrap; - width: 100%; - margin: 0 0 10px 0; - padding: 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo { - width: 100px; - margin: 0 15px 0 0; - padding: 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a { - width: 100px; - height: 100px; - display: block; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a img { - width: 100px; - height: 100px; - position: relative; - top: 0; - margin: 0; - margin-bottom: 0; - border: none; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: flex-start; - flex-wrap: nowrap; - width: calc( 100% - 115px); - padding: 0; - margin: 0; - box-sizing: border-box; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card.no-photo { - width: 100%; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: stretch; - flex-wrap: nowrap; - width: calc( 100% - 30px); - margin: 0 10px 0 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header { - width: 100%; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name { - margin: 0 0 4px 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name a { - font-size: 16px; - line-height: 26px; - color: #444; - font-weight: 700; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-tagline { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: wrap; - width: 100%; - font-size: 13px; - color: #999; - padding: 0; - box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main { - width: 100%; - padding: 0; - box-sizing: border-box; - display: none; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main.no-animate { - display: block; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta { - float: left; - width: 100%; - display: block; - margin: 10px 0 0 0; - box-sizing: border-box; - border: none; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-metaline { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; - flex-wrap: wrap; - font-size: 13px; - padding: 12px 0 0 0; - line-height: 16px; - width: 100%; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect { - padding-top: 10px; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a { - display: inline-block; - width: 40px; - line-height: 40px; - height: 40px; - -moz-border-radius: 999px; - -webkit-border-radius: 999px; - border-radius: 999px; - color: #fff !important; - opacity: 0.85; - margin: 0 1px; - font-size: 22px; - transition: 0.25s; - text-align: center; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a:hover { - opacity: 1; - color: #fff; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-end; - flex-wrap: nowrap; - width: 20px; - text-align: right; - padding: 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog { - position: relative; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a { - line-height: 1; - display: block; - color: #666; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a i { - display: block; - font-size: 20px; - line-height: 1; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown { - width: 180px; - right: 0; - text-align: left; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions a { - box-sizing: border-box; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: center; - flex-wrap: nowrap; - width: 100%; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - width: calc( 100% - 145px); - margin: 0 10px 0 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - margin: 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons > :not(:last-child) { - margin: 0 10px 0 0; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons { - width: 20px; - text-align: right; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a { - color: #666; - display: inline-block; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a i { - display: block; - font-size: 28px; - height: 28px; - line-height: 28px; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: baseline; - flex-wrap: nowrap; - display: none; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a { - color: #666; - display: inline-block; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a i { - display: block; - font-size: 28px; - height: 28px; - line-height: 28px; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo.no-reveal .um-member-card-footer-buttons { - width: 100%; } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo:not(.no-reveal) .um-member-card-footer-buttons { - width: calc( 100% - 30px); } - .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { - width: calc( 100% - 125px); } - .um-directory .um-members-wrapper .um-members .um-members-none { - text-align: center; - font-size: 18px; } - .um-directory .um-members-pagination-box { - width: 100%; - float: left; - margin: 0 0 10px 0; - padding: 0; } - .um-directory .um-members-pagination-box .um-members-pagi { - display: flex; - flex-direction: row; - justify-content: center; - align-items: baseline; - flex-wrap: nowrap; - width: 100%; - margin: 0; - padding: 0; - font-size: 15px; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi { - cursor: pointer; - display: inline-block; - width: auto; - height: 34px; - line-height: 34px; - transition: all .2s linear; - padding: 0 14px; - color: #666 !important; - font-weight: normal; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow { - line-height: 38px; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow i:before { - font-size: 20px; - vertical-align: middle !important; - height: 34px; - line-height: 34px; - top: -2px; - position: relative; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.current { - cursor: default; - color: #fff !important; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.current:hover { - color: #fff !important; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.disabled { - cursor: default; - opacity: .4; } - .um-directory .um-members-pagination-box .um-members-pagi .pagi.none { - color: #aaa !important; } - .um-directory .um-members-pagination-box .um-members-pagidrop { - width: 100%; - float: left; - margin: 0; - text-align: center; - padding: 5px 0; - font-size: 15px; } - .um-directory.um-loaded .um-members-wrapper { - height: auto; } - .um-directory[data-view_type="list"] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type="list"] { - display: block; } - .um-directory[data-view_type="grid"] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type="grid"] { - display: block; } - .um-directory[data-view_type="map"] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type="map"] { - display: block; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { - width: 100%; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { - justify-content: flex-start; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line { - flex-wrap: wrap; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { - width: 20px; - font-size: 20px; - line-height: 20px; - margin: 0 2px 0 0; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting { - width: calc( 100% - 25px); - justify-content: flex-end; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown { - right: 0; - left: auto; } - .um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters { - flex: none; - width: 100%; } - .um-directory.uimob340 .um-member-directory-header .um-search { - grid-template-columns: repeat(1, 1fr); } - .um-directory.uimob340 .um-members-wrapper .um-members .um-member { - width: 100%; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { - width: 0; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member { - padding: 10px; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { - width: 50px; - margin: 0 10px 0 0; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a { - width: 50px; - height: 50px; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img { - width: 50px; - height: 50px; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card { - width: calc( 100% - 60px); } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { - align-items: flex-start; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: stretch; - flex-wrap: nowrap; - width: calc( 100% - 90px); - margin: 0 10px 0 0; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { - margin: 0 0 5px 0; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper a.um-button { - width: 100% !important; } - .um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { - width: calc( 100% - 70px); } - .um-directory.uimob340 .um-members-pagination-box .um-members-pagi { - display: none; } - .um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { - width: 100%; } - .um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { - justify-content: flex-start; } - .um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { - width: 20px; - font-size: 20px; - line-height: 20px; - margin: 0 5px 0 0; } - .um-directory.uimob500 .um-member-directory-header .um-search { - grid-template-columns: repeat(1, 1fr); } - .um-directory.uimob500 .um-members-wrapper .um-members .um-member { - width: 100%; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { - width: 0; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { - width: 70px; - margin: 0 10px 0 0; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a { - width: 70px; - height: 70px; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img { - width: 70px; - height: 70px; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card { - width: calc( 100% - 80px); } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { - align-items: flex-start; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - flex-wrap: wrap; - width: calc( 100% - 110px); - margin: 0 10px 0 0; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { - margin: 0 10px 5px 0; } - .um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { - width: calc( 100% - 90px); } - .um-directory.uimob500 .um-members-pagination-box .um-members-pagi { - display: none; } - .um-directory.uimob800 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { - width: 100%; } - .um-directory.uimob800 .um-member-directory-header .um-search { - grid-template-columns: repeat(2, 1fr); } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { - width: 4%; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-member { - width: 48%; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { - width: 80px; - margin: 0 10px 0 0; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a { - width: 80px; - height: 80px; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img { - width: 80px; - height: 80px; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card { - width: calc( 100% - 90px); } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { - align-items: flex-start; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { - flex-wrap: wrap; - width: calc( 100% - 120px); - margin: 0 10px 0 0; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { - margin: 0 10px 5px 0; } - .um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { - width: calc( 100% - 100px); } - .um-directory.uimob960 .um-member-directory-header .um-search { - grid-template-columns: repeat(2, 1fr); } - .um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { - width: 4%; } - .um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-member { - width: 48%; } + position: relative; +} +.um-directory a { + text-decoration: none; + border-bottom: none; + box-shadow: none; +} +.um-directory a:hover, .um-directory a:focus { + text-decoration: none; + border-bottom: none; + box-shadow: none; +} +.um-directory .select2-container--disabled { + opacity: 0.6; +} +.um-directory .um-members-overlay { + display: none; + position: absolute; + width: 100%; + top: 0; + bottom: 0; + background: none; + z-index: 2; +} +.um-directory .um-members-overlay .um-ajax-loading { + -webkit-transition: 0.1s opacity; + -moz-transition: 0.1s opacity; + -ms-transition: 0.1s opacity; + -o-transition: 0.1s opacity; + transition: 0.1s opacity; + color: #c6c6c6 !important; + -webkit-animation: um-ajax-spinning 1.1s infinite linear; + animation: um-ajax-spinning 1.1s infinite linear; + border-top: 0.2em solid rgba(198, 198, 198, 0.2); + border-right: 0.2em solid rgba(198, 198, 198, 0.2); + border-bottom: 0.2em solid rgba(198, 198, 198, 0.2); + border-left: 0.2em solid #c6c6c6; + font-size: 1.75em; + position: absolute; + left: calc(50% - 1.75em); + top: calc(50% - 1.75em); + filter: alpha(opacity=0); + -ms-transform: translateZ(0); + transform: translateZ(0); + border-radius: 50%; + display: block; + width: 2.5em; + height: 2.5em; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; +} +.um-directory .um-member-directory-header { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; + width: 100%; +} +.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-filters-bar { + padding: 0 0 10px 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row:not(.um-member-directory-filters-bar) { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + margin: 0 0 10px 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row.um-header-row-invisible { + margin: 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { + justify-content: flex-end; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; + width: 60%; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label { + flex: 1; + margin: 0 10px 0 0; + min-width: 90px; + max-width: 85%; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label span { + display: none; + margin: 0 5px 0 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line label .um-search-line { + -webkit-appearance: textfield; + width: 100%; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line .um-do-search { + min-width: 15%; + width: auto; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + flex-wrap: nowrap; + width: 100%; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { + font-size: 30px; + line-height: 30px; + margin: 0 10px 0 0; + width: 30px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type .um-member-directory-view-type-a { + color: #ddd; + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled { + cursor: default; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type.um-disabled a { + cursor: default; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:hover { + color: #ccc; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type:not(.um-disabled) .um-member-directory-view-type-a:focus { + color: #ddd; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + flex: 5; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + position: relative; + cursor: pointer; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a a { + margin: 0 5px 0 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-down { + display: inline; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a i.um-faicon-caret-up { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-down { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a.um-member-directory-sorting-visible i.um-faicon-caret-up { + display: inline; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown { + top: 24px; + width: 200px; + left: -12px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-member-directory-sorting-a .um-new-dropdown li a[data-selected="1"] { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: baseline; + flex-wrap: nowrap; + flex: 2; + text-align: right; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + cursor: pointer; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a a { + margin: 0 5px 0 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-down { + display: inline; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a i.um-faicon-caret-up { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-down { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters .um-member-directory-filters-a.um-member-directory-filters-visible i.um-faicon-caret-up { + display: inline; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search { + margin: 0; + width: 100%; + display: grid; + grid-template-rows: auto 1fr; + grid-template-columns: repeat(3, 1fr); + grid-gap: 10px; + grid-auto-rows: minmax(max-content, auto); + -ms-grid-template-rows: auto 1fr; + -ms-grid-template-columns: repeat(3, 1fr); + -ms-grid-gap: 10px; + -ms-grid-auto-rows: minmax(max-content, auto); + align-items: center; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + width: 100%; + position: relative; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .select2-container { + float: left; + width: 100% !important; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter .um-s1 { + width: 100%; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-text-filter-type input { + width: 100%; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type { + flex-direction: column; + align-items: stretch; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider { + width: calc(100% - 16px); +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider .ui-slider-range.ui-widget-header { + background: #44b0ec; + border: 1px solid #44b0ec !important; + margin-top: -1px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider.ui-slider.ui-slider-horizontal { + border: 1px solid #ddd !important; + box-sizing: border-box; + margin: 4px 8px 0 8px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-slider-filter-type .um-slider-range { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + margin: 6px 0 0 8px; + font-size: 0.8em; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type, .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input, .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input { + width: calc(50% - 5px); + margin: 0 5px 0 0 !important; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-datepicker-filter-type input:nth-child(even), .um-directory .um-member-directory-header .um-member-directory-header-row .um-search .um-search-filter.um-timepicker-filter-type input:nth-child(even) { + margin: 0 0 0 5px !important; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search[style*="overflow: hidden;"] .um-search-filter { + pointer-events: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-search.um-search-invisible { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: wrap; + margin: 0; + padding: 0; + box-sizing: border-box; + border: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; + margin: 0 10px 5px 0; + padding: 0 10px; + border-radius: 3px; + cursor: default; + background: #f1f1f1; + font-size: 13px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag:first-child { + margin-left: 0; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove { + float: right; + display: inline-block; + margin-left: 10px; + cursor: pointer; + font-weight: bold; + font-size: 20px; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-members-filter-tag .um-members-filter-remove:hover { + color: #a00; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters { + display: none; +} +.um-directory .um-member-directory-header .um-member-directory-header-row .um-filtered-line .um-clear-filters a { + padding: 3px 10px; + margin: 0 10px; +} +.um-directory .um-members-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; + width: 100%; + margin: 0 0 10px 0; + padding: 0; + position: relative; + height: 300px; +} +.um-directory .um-members-wrapper .um-members-intro { + text-align: center; + margin: 0 0 10px 0; +} +.um-directory .um-members-wrapper .um-members-total { + font-size: 20px; + font-weight: 300; +} +.um-directory .um-members-wrapper .um-members { + width: 100%; + margin: 0; + padding: 0; + -ms-word-break: break-all; + word-break: break-word; + word-wrap: break-word; +} +.um-directory .um-members-wrapper .um-members .um-member { + border: 1px solid #ddd; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1 a img { + -moz-border-radius: 999px !important; + -webkit-border-radius: 999px !important; + border-radius: 999px !important; +} +.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-2 a img { + -moz-border-radius: 4px !important; + -webkit-border-radius: 4px !important; + border-radius: 4px !important; +} +.um-directory .um-members-wrapper .um-members .um-member .um-member-photo.radius-1.radius-3 a img { + -moz-border-radius: 0 !important; + -webkit-border-radius: 0 !important; + border-radius: 0 !important; +} +.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; +} +.um-directory .um-members-wrapper .um-members .um-member .um-member-card .um-member-name a { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: nowrap; +} +.um-directory .um-members-wrapper .um-members img { + display: block; + overflow: hidden; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + margin: 0; + padding: 0; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { + width: 5%; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member { + float: left; + width: 30%; + background: #fff; + text-align: center; + margin-bottom: 40px; + position: relative; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status { + display: none; + background: #999; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.inactive, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.rejected { + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + padding: 7px 15px; + color: #fff; + z-index: 10; + font-size: 13px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-status.awaiting_admin_review { + background: #c74a4a; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo { + padding: 40px 0 20px 0; + text-align: center; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a { + text-decoration: none; + box-shadow: none !important; + display: inline !important; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-photo a img { + display: inline !important; + border: 5px solid #fff; + background: #fff; + width: 140px; + height: 140px; + float: none !important; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.awaiting_admin_review, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.inactive, .um-directory .um-members-wrapper .um-members.um-members-grid .um-member.rejected { + opacity: 0.7; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo { + padding-top: 0; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member.with-cover .um-member-photo a img { + width: 90px; + height: 90px; + position: relative; + top: -35px; + margin-bottom: -45px; + float: none; + opacity: 1; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover { + background-color: #eee; + box-sizing: border-box; + position: relative; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio] { + overflow-y: hidden; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e { + text-align: center; + box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover .um-member-cover-e img { + width: 100% !important; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card { + padding-bottom: 15px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card.no-photo { + padding-top: 30px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name { + margin: 0 0 4px 0; + justify-content: center; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-name a { + font-size: 16px; + line-height: 26px; + color: #444; + font-weight: 700; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn { + margin: 2px 0; + height: 40px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn { + padding: 10px 15px !important; + transition: none !important; + display: inline-block !important; + margin: 0 auto !important; + min-width: 110px; + width: auto; + text-align: center; + font-size: 13px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-members-edit-btn a.um-edit-profile-btn:before { + font-family: "FontAwesome"; + margin-right: 8px; + width: 14px; + text-align: left; + display: inline-block; + font-size: 16px; + position: relative; + left: 0; + top: 1px; + content: "\f013"; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-tagline { + font-size: 13px; + line-height: 22px; + color: #999; + padding: 0 15px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta { + display: none; + margin: 20px 15px 0 15px; + padding: 15px 0; + border-top: 1px solid #e5e5e5; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta.no-animate { + display: block; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline { + font-size: 13px; + padding: 12px 0 0 0; + line-height: 16px; + vertical-align: middle; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline strong { + display: block; + clear: both; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-metaline span { + display: block; + text-align: center; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect { + padding-top: 20px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a { + display: inline-block; + width: 40px; + line-height: 40px; + height: 40px; + -moz-border-radius: 999px; + -webkit-border-radius: 999px; + border-radius: 999px; + color: #fff !important; + opacity: 0.85; + margin: 0 1px; + font-size: 22px; + transition: 0.25s; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-meta .um-member-connect a:hover { + opacity: 1; + color: #fff; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less { + display: none; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a { + color: #666; + display: inline-block; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-less a i { + display: block; + font-size: 32px; + height: 32px; + line-height: 32px; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a { + color: #666; + display: inline-block; +} +.um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-card .um-member-meta-main .um-member-more a i { + display: block; + font-size: 32px; + height: 32px; + line-height: 32px; +} +.um-directory .um-members-wrapper .um-members.um-members-list { + display: grid; + grid-template-rows: auto 1fr; + grid-template-columns: repeat(1, 1fr); + grid-gap: 10px; + grid-auto-rows: minmax(max-content, auto); + -ms-grid-template-rows: auto 1fr; + -ms-grid-template-columns: repeat(1, 1fr); + -ms-grid-gap: 10px; + -ms-grid-auto-rows: minmax(max-content, auto); + align-items: center; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; + width: 100%; + padding: 15px; + margin: 0; + background: #fff; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status { + display: none; + background: #999; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review, .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.inactive, .um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.rejected { + display: block; + width: 100%; + padding: 7px 15px; + margin-bottom: 10px; + color: #fff; + font-size: 13px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-status.awaiting_admin_review { + background: #c74a4a; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + flex-wrap: nowrap; + width: 100%; + margin: 0 0 10px 0; + padding: 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo { + width: 100px; + margin: 0 15px 0 0; + padding: 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a { + width: 100px; + height: 100px; + display: block; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-photo a img { + width: 100px; + height: 100px; + position: relative; + top: 0; + margin: 0; + margin-bottom: 0; + border: none; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: flex-start; + flex-wrap: nowrap; + width: calc(100% - 115px); + padding: 0; + margin: 0; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card.no-photo { + width: 100%; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; + width: calc(100% - 30px); + margin: 0 10px 0 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header { + width: 100%; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name { + margin: 0 0 4px 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-card-header .um-member-name a { + font-size: 16px; + line-height: 26px; + color: #444; + font-weight: 700; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-tagline { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: wrap; + width: 100%; + font-size: 13px; + color: #999; + padding: 0; + box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main { + width: 100%; + padding: 0; + box-sizing: border-box; + display: none; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main.no-animate { + display: block; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta { + float: left; + width: 100%; + display: block; + margin: 10px 0 0 0; + box-sizing: border-box; + border: none; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-metaline { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: wrap; + font-size: 13px; + padding: 12px 0 0 0; + line-height: 16px; + width: 100%; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect { + padding-top: 10px; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a { + display: inline-block; + width: 40px; + line-height: 40px; + height: 40px; + -moz-border-radius: 999px; + -webkit-border-radius: 999px; + border-radius: 999px; + color: #fff !important; + opacity: 0.85; + margin: 0 1px; + font-size: 22px; + transition: 0.25s; + text-align: center; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-content .um-member-meta-main .um-member-meta .um-member-connect a:hover { + opacity: 1; + color: #fff; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-end; + flex-wrap: nowrap; + width: 20px; + text-align: right; + padding: 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog { + position: relative; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a { + line-height: 1; + display: block; + color: #666; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-member-actions-a i { + display: block; + font-size: 20px; + line-height: 1; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions .um-member-cog .um-new-dropdown { + width: 180px; + right: 0; + text-align: left; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-container .um-member-card .um-member-card-actions a { + box-sizing: border-box; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + flex-wrap: nowrap; + width: 100%; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + width: calc(100% - 145px); + margin: 0 10px 0 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + margin: 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons > :not(:last-child) { + margin: 0 10px 0 0; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons { + width: 20px; + text-align: right; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a { + color: #666; + display: inline-block; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-more a i { + display: block; + font-size: 28px; + height: 28px; + line-height: 28px; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: baseline; + flex-wrap: nowrap; + display: none; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a { + color: #666; + display: inline-block; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-reveal-buttons .um-member-less a i { + display: block; + font-size: 28px; + height: 28px; + line-height: 28px; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo.no-reveal .um-member-card-footer-buttons { + width: 100%; +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-photo:not(.no-reveal) .um-member-card-footer-buttons { + width: calc(100% - 30px); +} +.um-directory .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { + width: calc(100% - 125px); +} +.um-directory .um-members-wrapper .um-members .um-members-none { + text-align: center; + font-size: 18px; +} +.um-directory .um-members-pagination-box { + width: 100%; + float: left; + margin: 0 0 10px 0; + padding: 0; +} +.um-directory .um-members-pagination-box .um-members-pagi { + display: flex; + flex-direction: row; + justify-content: center; + align-items: baseline; + flex-wrap: nowrap; + width: 100%; + margin: 0; + padding: 0; + font-size: 15px; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi { + cursor: pointer; + display: inline-block; + width: auto; + height: 34px; + line-height: 34px; + transition: all 0.2s linear; + padding: 0 14px; + color: #666 !important; + font-weight: normal; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow { + line-height: 38px; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.pagi-arrow i:before { + font-size: 20px; + vertical-align: middle !important; + height: 34px; + line-height: 34px; + top: -2px; + position: relative; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.current { + cursor: default; + color: #fff !important; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.current:hover { + color: #fff !important; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.disabled { + cursor: default; + opacity: 0.4; +} +.um-directory .um-members-pagination-box .um-members-pagi .pagi.none { + color: #aaa !important; +} +.um-directory .um-members-pagination-box .um-members-pagidrop { + width: 100%; + float: left; + margin: 0; + text-align: center; + padding: 5px 0; + font-size: 15px; +} +.um-directory.um-loaded .um-members-wrapper { + height: auto; +} +.um-directory[data-view_type=list] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=list] { + display: block; +} +.um-directory[data-view_type=grid] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=grid] { + display: block; +} +.um-directory[data-view_type=map] .um-member-directory-header .um-member-directory-header-row .um-member-directory-view-type .um-member-directory-view-type-a[data-type=map] { + display: block; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { + width: 100%; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { + justify-content: flex-start; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line { + flex-wrap: wrap; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { + width: 20px; + font-size: 20px; + line-height: 20px; + margin: 0 2px 0 0; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting { + width: calc(100% - 25px); + justify-content: flex-end; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-sorting .um-new-dropdown { + right: 0; + left: auto; +} +.um-directory.uimob340 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-filters { + flex: none; + width: 100%; +} +.um-directory.uimob340 .um-member-directory-header .um-search { + grid-template-columns: repeat(1, 1fr); +} +.um-directory.uimob340 .um-members-wrapper .um-members .um-member { + width: 100%; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { + width: 0; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member { + padding: 10px; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { + width: 50px; + margin: 0 10px 0 0; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a { + width: 50px; + height: 50px; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img { + width: 50px; + height: 50px; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card { + width: calc(100% - 60px); +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { + align-items: flex-start; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: stretch; + flex-wrap: nowrap; + width: calc(100% - 90px); + margin: 0 10px 0 0; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { + margin: 0 0 5px 0; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper a.um-button { + width: 100% !important; +} +.um-directory.uimob340 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { + width: calc(100% - 70px); +} +.um-directory.uimob340 .um-members-pagination-box .um-members-pagi { + display: none; +} +.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { + width: 100%; +} +.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row.um-member-directory-search-row { + justify-content: flex-start; +} +.um-directory.uimob500 .um-member-directory-header .um-member-directory-header-row .um-member-directory-nav-line .um-member-directory-view-type { + width: 20px; + font-size: 20px; + line-height: 20px; + margin: 0 5px 0 0; +} +.um-directory.uimob500 .um-member-directory-header .um-search { + grid-template-columns: repeat(1, 1fr); +} +.um-directory.uimob500 .um-members-wrapper .um-members .um-member { + width: 100%; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { + width: 0; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { + width: 70px; + margin: 0 10px 0 0; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a { + width: 70px; + height: 70px; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img { + width: 70px; + height: 70px; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card { + width: calc(100% - 80px); +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { + align-items: flex-start; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { + flex-wrap: wrap; + width: calc(100% - 110px); + margin: 0 10px 0 0; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { + margin: 0 10px 5px 0; +} +.um-directory.uimob500 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { + width: calc(100% - 90px); +} +.um-directory.uimob500 .um-members-pagination-box .um-members-pagi { + display: none; +} +.um-directory.uimob800 .um-member-directory-header .um-member-directory-header-row .um-member-directory-search-line { + width: 100%; +} +.um-directory.uimob800 .um-member-directory-header .um-search { + grid-template-columns: repeat(2, 1fr); +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { + width: 4%; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-grid .um-member { + width: 48%; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo { + width: 80px; + margin: 0 10px 0 0; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a { + width: 80px; + height: 80px; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-photo a img { + width: 80px; + height: 80px; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card { + width: calc(100% - 90px); +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer { + align-items: flex-start; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons { + flex-wrap: wrap; + width: calc(100% - 120px); + margin: 0 10px 0 0; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer .um-member-card-footer-buttons .um-members-list-footer-button-wrapper { + margin: 0 10px 5px 0; +} +.um-directory.uimob800 .um-members-wrapper .um-members.um-members-list .um-member .um-member-card-footer.no-reveal:not(.no-photo) .um-member-card-footer-buttons { + width: calc(100% - 100px); +} +.um-directory.uimob960 .um-member-directory-header .um-search { + grid-template-columns: repeat(2, 1fr); +} +.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-gutter-sizer { + width: 4%; +} +.um-directory.uimob960 .um-members-wrapper .um-members.um-members-grid .um-member { + width: 48%; +} .select2-container .select2-results li.select2-results__option[aria-disabled=true] { - display: none; } + display: none; +} \ No newline at end of file diff --git a/assets/css/um-styles.css b/assets/css/um-styles.css index 5380916d..a9129ecf 100644 --- a/assets/css/um-styles.css +++ b/assets/css/um-styles.css @@ -898,12 +898,32 @@ small.um-max-filesize span{ .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; - top: 7px; - right: 10px; + 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%; } /* diff --git a/assets/css/um-styles.min.css b/assets/css/um-styles.min.css index b60d09dd..23f68472 100644 --- a/assets/css/um-styles.min.css +++ b/assets/css/um-styles.min.css @@ -1 +1 @@ -.um:not(.um-admin){width:100%;text-align:left;box-sizing:border-box;color:#666;font-size:15px;margin-bottom:30px!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;opacity:0}.um-s1,.um-s2{display:none}.um:not(.um-admin) :after,.um:not(.um-admin) :before{box-sizing:content-box}.um-account-side li a,.um-cover a,.um-field-value a,.um-header a,.um-member-less a,.um-member-more a,.um-member-name a,.um-member-photo a,.um-members a,.um-members-pagi a,.um-members-pagi span{border-bottom:0!important}.um-modal a:focus,.um:not(.um-admin) a:focus{outline:0!important}.um:not(.um-admin) a .image-overlay,.um:not(.um-admin) a:hover .image-overlay,.um:not(.um-admin) a:hover .image-overlay *{display:none!important;width:0!important;height:0!important;position:static!important}.um.um-in-admin{padding-top:0}.um.um-in-admin .um-tip{display:none!important}.um:not(.um-admin):not(.um-directory) input,.um:not(.um-admin):not(.um-directory) select,.um:not(.um-admin):not(.um-directory) textarea{font-size:15px}.um:not(.um-admin) *{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.um-left{float:left}.um-right{float:right}.um-clear{clear:both}.um-center{text-align:center}.um-center .um-button{display:inline-block!important;width:auto!important;min-width:250px!important}.um-half{width:48%}.um-field-half{width:48%;float:left}.um-field-half.right{float:right}.um-field-tri{width:30%;float:left;margin-right:3%}.um img{box-shadow:none!important}.um-col{padding-bottom:20px}.um-col-alt{margin:15px 0 5px 0}.um-col-alt-s{padding-top:10px}.um-col-alt-b{padding-top:20px}.um-col-121{float:left;width:48%}.um-col-122{float:right;width:48%}.um-col-131{float:left;width:30%}.um-col-132{float:left;width:30%;margin:0 5%}.um-col-133{float:left;width:30%}.um-raty i{font-size:26px}.um-field-half .um-raty i{font-size:21px}.um-field-tri .um-raty i{font-size:21px}.um-button i{font-size:22px;width:22px;height:12px!important;display:inline-block;line-height:12px!important;vertical-align:middle!important;position:relative;top:-6px;margin-right:8px}.um-row-heading{padding:5px 0;font-size:16px}.um-row-heading i{font-size:24px;height:24px;line-height:24px;margin:0 12px 0 0;display:inline-block;width:30px;text-align:center}.um-row-heading i:before{vertical-align:middle!important}p.um-notice{width:auto;color:#fff;box-sizing:border-box;font-size:15px;padding:12px!important;margin:12px 0 0 0!important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative}p.um-notice a{color:#fff;text-decoration:underline}p.um-notice i{position:absolute;right:14px;font-size:36px;cursor:pointer;top:7px;display:block;height:30px;line-height:30px}p.um-notice.success{background:#7acf58}p.um-notice.err{background:#c74a4a}p.um-notice.warning{background:#f9f9d1;color:#666;border:1px solid #efe4a2;padding:8px 15px!important}p.um-notice.warning a{color:#666;text-decoration:underline}.um-field-error{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:12px 0 0 0}.um-field-error a{color:#fff!important;text-decoration:underline!important}.um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#c74a4a;font-size:28px;line-height:1em!important}.um-error-block{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-field-notice{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:5px 0 0 0}.um-field-notice a{color:#fff!important;text-decoration:underline!important}.um-field-notice .um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#497bc7!important;font-size:28px;line-height:1em!important}.um-notice-block{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-tip{margin:0 0 0 8px;cursor:pointer;display:inline-block;position:relative;top:3px}.um-tip i{font-size:22px;height:22px;line-height:22px;display:block;position:relative}.um-tip-text{display:block;font-size:13px;line-height:15px;color:#999}.um-form button::-moz-focus-inner,.um-form input::-moz-focus-inner{border:0!important;padding:0!important}.um-field{position:relative;padding:15px 0 0 0}.um-field-b,.um-field-c{padding-top:0!important}.um-field-label{display:block;margin:0 0 8px 0}.um-field-label .um-field-label-icon{float:left;margin:0 8px 0 0;height:22px;line-height:18px;display:inline-block;width:24px;text-align:center}.um-field-label .um-field-label-icon i{font-size:22px;position:relative;top:1px}.um-field-label label{font-size:15px!important;line-height:22px!important;font-weight:700;font-weight:600}.um-field-area{position:relative;word-wrap:break-word}.um-field-area-password{position:relative}.um-toggle-password{cursor:pointer;display:block;position:absolute;right:0;top:0;height:100%;width:40px;text-align:center;box-sizing:border-box;font-size:20px;line-height:2}.um-toggle-password i{transition:all .2s linear}.um-toggle-password:hover i{color:#44b0ec}.um-field-value p{margin:0 0 6px 0!important;padding:0}.um-field-block{color:#777;font-size:17px}.um-field-spacing{width:100%}.um-field-divider{width:100%;margin:0 0 12px 0;height:24px;position:relative}.um-field-divider-text{position:absolute;width:100%;text-align:center;bottom:-24px;left:0;font-size:16px;padding:10px 0}.um-field-divider-text span{background:#fff;color:#555;display:inline-block;padding:0 15px}.um-field-icon{position:absolute;cursor:default;text-align:center!important;top:2px;left:0;width:44px;font-size:22px;line-height:1.7em;z-index:1}.um-form input[type=number],.um-form input[type=password],.um-form input[type=search],.um-form input[type=tel],.um-form input[type=text]{padding:0 12px!important;width:100%;display:block!important;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;outline:0!important;cursor:text!important;font-size:15px!important;height:40px!important;box-sizing:border-box!important;box-shadow:none!important;margin:0!important;position:static}.um-form .um-field-area-password input[type=password]{padding-right:40px!important}.um-form input[type=number]{width:auto;padding:0 0 0 5px!important;height:30px!important}.um-form input[type=number]:focus,.um-form input[type=password]:focus,.um-form input[type=search]:focus,.um-form input[type=tel]:focus,.um-form input[type=text]:focus,.um-form textarea:focus{box-shadow:none!important;outline:0!important}.um-form input[type=password].um-iconed,.um-form input[type=tel].um-iconed,.um-form input[type=text].um-iconed{padding-left:44px!important}.um-form input[type=password].um-error,.um-form input[type=tel].um-error,.um-form input[type=text].um-error{border-color:#c74a4a!important}.um-form textarea{width:100%;padding:8px 12px!important;display:block;font-size:15px!important;line-height:22px!important;background:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;box-sizing:border-box;min-height:80px!important;box-shadow:none;outline:0!important}.um-form .um-meta-text textarea{max-width:100%}.um-form .wp-editor-container{border:1px solid #ddd}.um-form .wp-editor-container textarea{background:#ddd!important;color:#222!important;border-radius:0}.um-field-c .um-field-checkbox{margin-bottom:14px;margin-top:0!important;position:relative}.um-field-checkbox:not(.um-field),.um-field-radio:not(.um-field){display:block;margin:8px 0;position:relative}.um-profile.um-editing .um-field-checkbox,.um-profile.um-editing .um-field-radio{cursor:pointer!important}.um-field-checkbox:hover i,.um-field-radio:hover i{color:#666}.um-field-checkbox input,.um-field-radio input{opacity:0!important;display:inline!important;width:0!important;float:left}.um-field-checkbox-state,.um-field-radio-state{position:absolute;top:0;left:1px;width:24px;height:24px}.um-field-checkbox-state i,.um-field-radio-state i{font-size:24px;line-height:24px;height:24px;color:#aaa;transition:all .2s linear}.um-field-checkbox-option,.um-field-radio-option{margin:0 0 0 36px;line-height:24px;color:#888!important;display:block}.um-field-group{margin-top:20px}.um-field-group-head{cursor:pointer;color:#fff;font-size:16px;line-height:22px;padding:10px 20px;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;border-top:1px solid transparent!important;border-bottom:2px solid rgba(0,0,0,.1)!important}.um-field-group-head i{font-size:20px;margin:0 8px 0 0}.um-field-group-head i:before{vertical-align:middle!important}.um-field-group-body{display:none;margin:15px 0 0 0;padding:15px 20px 5px 20px;background:#f9f9f9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative;box-sizing:border-box;width:100%}.um-field-group-body div.um-field{padding:0 0 15px 0}.um-field-group-cancel{font-size:18px;position:absolute;z-index:800;right:8px;top:8px;color:#ccc!important;text-decoration:none!important}.um-field-group-cancel:hover{color:#777!important}.um div.disabled,.um input[type=number]:disabled,.um input[type=submit]:disabled,.um input[type=text]:disabled,.um-disabled{opacity:.6!important;cursor:no-drop!important}input[type=submit].um-button,input[type=submit].um-button:focus{vertical-align:middle!important;height:auto!important;font-size:15px;cursor:pointer!important;width:100%;box-shadow:none;text-shadow:none;font-family:inherit;outline:0!important;margin:0;opacity:1;-webkit-appearance:none}input[type=submit].um-button:hover{opacity:1}.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button:hover{-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.um-button.um-btn-auto-width{width:auto;display:inline-block;padding:14px 20px!important;min-width:200px;max-width:450px}a.um-link-alt{line-height:22px;color:#888!important;display:block!important;text-decoration:none!important;font-weight:400;text-align:center;border-bottom:none!important}a.um-link-alt:hover{text-decoration:underline!important}.um-dropdown{position:absolute;height:auto;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;z-index:55;display:none;border:1px solid #e5e5e5;box-sizing:border-box;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 1px rgba(0,0,0,.1)}.um-dropdown li,.um-dropdown ul{list-style-type:none!important;padding:0!important;margin:0!important}.um-dropdown ul{background:#fff;position:relative;z-index:16}.um-dropdown li a{display:block;padding:8px 12px;color:#666;font-size:14px;line-height:18px}.um-dropdown li:last-child a{border-top:1px solid #e5e5e5;padding:12px}.um-dropdown-b{position:relative}.um-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-dropdown-arr *{display:block!important;width:24px!important;height:24px!important;vertical-align:bottom!important;overflow:hidden!important;line-height:24px!important}div.um-photo{margin:20px auto 0 auto;text-align:center;box-sizing:border-box;max-width:100%}div.um-photo,div.um-photo a,div.um-photo img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.um-photo a{border:1px solid #e5e5e5;padding:5px;box-sizing:border-box;display:inline-block;box-shadow:0 1px 1px #eee;margin:0 auto;max-width:100%}div.um-photo img{max-height:300px;max-width:100%}span.um-req{margin:0 0 0 8px;font-size:14px;display:inline-block}small.um-max-filesize{display:block;color:#999;padding-top:5px}small.um-max-filesize span{font-size:12px}.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus{border-color:#db2929!important}.um-form .um-field .um-field-area input.um-searching-username{background-image:url(../img/loading.gif);background-position:right center;background-repeat:no-repeat;background-size:24px 24px}.um-search-area{position:relative;max-width:300px}.um-search-area .um-search-field{width:100%}.um-search-area .um-search-icon{position:absolute;top:7px;right:10px}.um-field .select2-container.select2-container--open,.um-search-filter .select2-container.select2-container--open{z-index:9999999}.um-field .select2.select2-container .select2-selection,.um-search-filter .select2.select2-container .select2-selection{display:block!important;height:40px;padding:0 0 0 12px!important;overflow:hidden!important;position:relative!important;white-space:nowrap!important;line-height:35px!important;color:#666!important;font-size:15px!important;-moz-border-radius:2px!important;-webkit-border-radius:2px!important;border-radius:2px!important;background-clip:padding-box!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff!important;border:1px solid #ddd!important}.rtl .um-field .select2.select2-container .select2-selection,.rtl .um-search-filter .select2.select2-container .select2-selection{padding:0 12px 0 0!important}.um-field .select2.select2-container .select2-selection .select2-selection__arrow,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{display:inline-block!important;width:34px!important;height:100%!important;position:absolute;right:0;top:0;text-align:center;background:0 0!important;border:none!important}.rtl .um-field .select2.select2-container .select2-selection .select2-selection__arrow,.rtl .um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{right:initial;left:0}.um-field .select2.select2-container .select2-selection .select2-selection__arrow:before,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow:before{content:"\f3d0"!important;font-size:28px!important;font-family:Ionicons!important;display:block;height:100%;line-height:40px;min-width:1em;text-align:center;color:#aaa}.um-field .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation],.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation]{display:none}.um-field .select2-container.select2-container--open .select2-dropdown,.um-search-filter .select2-container.select2-container--open .select2-dropdown{border:1px solid #ddd!important;border-radius:0}.um-field .select2-container.select2-container--open .select2-dropdown .select2-results li,.um-search-filter .select2-container.select2-container--open .select2-dropdown .select2-results li{list-style:none;display:list-item;background:0 0;font-size:15px;margin:5px!important;color:#666!important;padding:3px 7px 4px!important;cursor:pointer;min-height:1em}.um-field .select2.select2-container .select2-selection.select2-selection--multiple,.um-search-filter .select2.select2-container .select2-selection.select2-selection--multiple{height:auto!important;line-height:.8!important;min-height:40px;padding-bottom:4px!important}.um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:37px;padding-left:0;padding-right:24px}.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:24px;padding-right:0}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{line-height:37px;box-sizing:border-box;list-style:none;margin:0;padding-left:0;padding-right:30px;width:100%;font-size:13px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:30px;padding-right:0}.um-field .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted,.um-search-filter .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted{background:#f4f4f4;color:#666}.um-field .select2-dropdown .select2-results li.select2-results__option[aria-selected=true],.um-search-filter .select2-dropdown .select2-results li.select2-results__option[aria-selected=true]{background-color:#ddd}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-field .select2-container--default .select2-selection--single .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{color:#aaa;font-size:28px;font-weight:400;line-height:34px;margin:0!important;right:0;text-align:center;width:1em}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{left:0;right:initial}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear{position:absolute}.um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 5px 0 0;max-height:28px;padding:3px 3px 3px 5px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 0 0 5px;padding:3px 5px 3px 3px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 5px 0 0;padding:0}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 0 0 5px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input{border:none!important;padding:0!important;max-height:28px}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered li,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered li{overflow-x:hidden;text-overflow:ellipsis;max-width:100%;box-sizing:border-box;line-height:20px}.um-field-multiselect .um-field-area .um-field-icon,.um-field-select .um-field-area .um-field-icon{z-index:99999999}.um-field-select .um-field-area.um-field-area-has-icon .select2-selection__rendered{text-indent:20px}.um-field-multiselect .um-field-area.um-field-area-has-icon ul:first-child{margin-left:30px!important}.um-field-area .wp-switch-editor{float:none;height:auto} \ No newline at end of file +.um:not(.um-admin){width:100%;text-align:left;box-sizing:border-box;color:#666;font-size:15px;margin-bottom:30px!important;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important;opacity:0}.um-s1,.um-s2{display:none}.um:not(.um-admin) :after,.um:not(.um-admin) :before{box-sizing:content-box}.um-account-side li a,.um-cover a,.um-field-value a,.um-header a,.um-member-less a,.um-member-more a,.um-member-name a,.um-member-photo a,.um-members a,.um-members-pagi a,.um-members-pagi span{border-bottom:0!important}.um-modal a:focus,.um:not(.um-admin) a:focus{outline:0!important}.um:not(.um-admin) a .image-overlay,.um:not(.um-admin) a:hover .image-overlay,.um:not(.um-admin) a:hover .image-overlay *{display:none!important;width:0!important;height:0!important;position:static!important}.um.um-in-admin{padding-top:0}.um.um-in-admin .um-tip{display:none!important}.um:not(.um-admin):not(.um-directory) input,.um:not(.um-admin):not(.um-directory) select,.um:not(.um-admin):not(.um-directory) textarea{font-size:15px}.um:not(.um-admin) *{-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale!important}.um-left{float:left}.um-right{float:right}.um-clear{clear:both}.um-center{text-align:center}.um-center .um-button{display:inline-block!important;width:auto!important;min-width:250px!important}.um-half{width:48%}.um-field-half{width:48%;float:left}.um-field-half.right{float:right}.um-field-tri{width:30%;float:left;margin-right:3%}.um img{box-shadow:none!important}.um-col{padding-bottom:20px}.um-col-alt{margin:15px 0 5px 0}.um-col-alt-s{padding-top:10px}.um-col-alt-b{padding-top:20px}.um-col-121{float:left;width:48%}.um-col-122{float:right;width:48%}.um-col-131{float:left;width:30%}.um-col-132{float:left;width:30%;margin:0 5%}.um-col-133{float:left;width:30%}.um-raty i{font-size:26px}.um-field-half .um-raty i{font-size:21px}.um-field-tri .um-raty i{font-size:21px}.um-button i{font-size:22px;width:22px;height:12px!important;display:inline-block;line-height:12px!important;vertical-align:middle!important;position:relative;top:-6px;margin-right:8px}.um-row-heading{padding:5px 0;font-size:16px}.um-row-heading i{font-size:24px;height:24px;line-height:24px;margin:0 12px 0 0;display:inline-block;width:30px;text-align:center}.um-row-heading i:before{vertical-align:middle!important}p.um-notice{width:auto;color:#fff;box-sizing:border-box;font-size:15px;padding:12px!important;margin:12px 0 0 0!important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative}p.um-notice a{color:#fff;text-decoration:underline}p.um-notice i{position:absolute;right:14px;font-size:36px;cursor:pointer;top:7px;display:block;height:30px;line-height:30px}p.um-notice.success{background:#7acf58}p.um-notice.err{background:#c74a4a}p.um-notice.warning{background:#f9f9d1;color:#666;border:1px solid #efe4a2;padding:8px 15px!important}p.um-notice.warning a{color:#666;text-decoration:underline}.um-field-error{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:12px 0 0 0}.um-field-error a{color:#fff!important;text-decoration:underline!important}.um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#c74a4a;font-size:28px;line-height:1em!important}.um-error-block{width:auto;max-width:100%;background:#c74a4a;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-field-notice{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:20px!important;margin:5px 0 0 0}.um-field-notice a{color:#fff!important;text-decoration:underline!important}.um-field-notice .um-field-arrow{top:-17px;left:10px;position:absolute;z-index:1;color:#497bc7!important;font-size:28px;line-height:1em!important}.um-notice-block{width:auto;max-width:100%;background:#497bc7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:14px;line-height:1em!important;margin:12px 0 0 0}.um-tip{margin:0 0 0 8px;cursor:pointer;display:inline-block;position:relative;top:3px}.um-tip i{font-size:22px;height:22px;line-height:22px;display:block;position:relative}.um-tip-text{display:block;font-size:13px;line-height:15px;color:#999}.um-form button::-moz-focus-inner,.um-form input::-moz-focus-inner{border:0!important;padding:0!important}.um-field{position:relative;padding:15px 0 0 0}.um-field-b,.um-field-c{padding-top:0!important}.um-field-label{display:block;margin:0 0 8px 0}.um-field-label .um-field-label-icon{float:left;margin:0 8px 0 0;height:22px;line-height:18px;display:inline-block;width:24px;text-align:center}.um-field-label .um-field-label-icon i{font-size:22px;position:relative;top:1px}.um-field-label label{font-size:15px!important;line-height:22px!important;font-weight:700;font-weight:600}.um-field-area{position:relative;word-wrap:break-word}.um-field-area-password{position:relative}.um-toggle-password{cursor:pointer;display:block;position:absolute;right:0;top:0;height:100%;width:40px;text-align:center;box-sizing:border-box;font-size:20px;line-height:2}.um-toggle-password i{transition:all .2s linear}.um-toggle-password:hover i{color:#44b0ec}.um-field-value p{margin:0 0 6px 0!important;padding:0}.um-field-block{color:#777;font-size:17px}.um-field-spacing{width:100%}.um-field-divider{width:100%;margin:0 0 12px 0;height:24px;position:relative}.um-field-divider-text{position:absolute;width:100%;text-align:center;bottom:-24px;left:0;font-size:16px;padding:10px 0}.um-field-divider-text span{background:#fff;color:#555;display:inline-block;padding:0 15px}.um-field-icon{position:absolute;cursor:default;text-align:center!important;top:2px;left:0;width:44px;font-size:22px;line-height:1.7em;z-index:1}.um-form input[type=number],.um-form input[type=password],.um-form input[type=search],.um-form input[type=tel],.um-form input[type=text]{padding:0 12px!important;width:100%;display:block!important;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;outline:0!important;cursor:text!important;font-size:15px!important;height:40px!important;box-sizing:border-box!important;box-shadow:none!important;margin:0!important;position:static}.um-form .um-field-area-password input[type=password]{padding-right:40px!important}.um-form input[type=number]{width:auto;padding:0 0 0 5px!important;height:30px!important}.um-form input[type=number]:focus,.um-form input[type=password]:focus,.um-form input[type=search]:focus,.um-form input[type=tel]:focus,.um-form input[type=text]:focus,.um-form textarea:focus{box-shadow:none!important;outline:0!important}.um-form input[type=password].um-iconed,.um-form input[type=tel].um-iconed,.um-form input[type=text].um-iconed{padding-left:44px!important}.um-form input[type=password].um-error,.um-form input[type=tel].um-error,.um-form input[type=text].um-error{border-color:#c74a4a!important}.um-form textarea{width:100%;padding:8px 12px!important;display:block;font-size:15px!important;line-height:22px!important;background:#fff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;box-sizing:border-box;min-height:80px!important;box-shadow:none;outline:0!important}.um-form .um-meta-text textarea{max-width:100%}.um-form .wp-editor-container{border:1px solid #ddd}.um-form .wp-editor-container textarea{background:#ddd!important;color:#222!important;border-radius:0}.um-field-c .um-field-checkbox{margin-bottom:14px;margin-top:0!important;position:relative}.um-field-checkbox:not(.um-field),.um-field-radio:not(.um-field){display:block;margin:8px 0;position:relative}.um-profile.um-editing .um-field-checkbox,.um-profile.um-editing .um-field-radio{cursor:pointer!important}.um-field-checkbox:hover i,.um-field-radio:hover i{color:#666}.um-field-checkbox input,.um-field-radio input{opacity:0!important;display:inline!important;width:0!important;float:left}.um-field-checkbox-state,.um-field-radio-state{position:absolute;top:0;left:1px;width:24px;height:24px}.um-field-checkbox-state i,.um-field-radio-state i{font-size:24px;line-height:24px;height:24px;color:#aaa;transition:all .2s linear}.um-field-checkbox-option,.um-field-radio-option{margin:0 0 0 36px;line-height:24px;color:#888!important;display:block}.um-field-group{margin-top:20px}.um-field-group-head{cursor:pointer;color:#fff;font-size:16px;line-height:22px;padding:10px 20px;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;border-top:1px solid transparent!important;border-bottom:2px solid rgba(0,0,0,.1)!important}.um-field-group-head i{font-size:20px;margin:0 8px 0 0}.um-field-group-head i:before{vertical-align:middle!important}.um-field-group-body{display:none;margin:15px 0 0 0;padding:15px 20px 5px 20px;background:#f9f9f9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;position:relative;box-sizing:border-box;width:100%}.um-field-group-body div.um-field{padding:0 0 15px 0}.um-field-group-cancel{font-size:18px;position:absolute;z-index:800;right:8px;top:8px;color:#ccc!important;text-decoration:none!important}.um-field-group-cancel:hover{color:#777!important}.um div.disabled,.um input[type=number]:disabled,.um input[type=submit]:disabled,.um input[type=text]:disabled,.um-disabled{opacity:.6!important;cursor:no-drop!important}input[type=submit].um-button,input[type=submit].um-button:focus{vertical-align:middle!important;height:auto!important;font-size:15px;cursor:pointer!important;width:100%;box-shadow:none;text-shadow:none;font-family:inherit;outline:0!important;margin:0;opacity:1;-webkit-appearance:none}input[type=submit].um-button:hover{opacity:1}.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button{font-size:15px;border:none!important;display:block;width:100%;line-height:1em!important;padding:16px 20px!important;text-decoration:none!important;text-align:center;text-transform:none!important;font-weight:400!important;overflow:hidden;position:relative;transition:.25s;box-sizing:border-box;-moz-border-radius:4px!important;-webkit-border-radius:4px!important;border-radius:4px!important;-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);opacity:1}a.um-button:hover{-webkit-box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08);box-shadow:0 4px 6px rgba(50,50,93,.11),0 1px 3px rgba(0,0,0,.08)}.um-button.um-btn-auto-width{width:auto;display:inline-block;padding:14px 20px!important;min-width:200px;max-width:450px}a.um-link-alt{line-height:22px;color:#888!important;display:block!important;text-decoration:none!important;font-weight:400;text-align:center;border-bottom:none!important}a.um-link-alt:hover{text-decoration:underline!important}.um-dropdown{position:absolute;height:auto;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;z-index:55;display:none;border:1px solid #e5e5e5;box-sizing:border-box;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1);box-shadow:0 0 1px rgba(0,0,0,.1)}.um-dropdown li,.um-dropdown ul{list-style-type:none!important;padding:0!important;margin:0!important}.um-dropdown ul{background:#fff;position:relative;z-index:16}.um-dropdown li a{display:block;padding:8px 12px;color:#666;font-size:14px;line-height:18px}.um-dropdown li:last-child a{border-top:1px solid #e5e5e5;padding:12px}.um-dropdown-b{position:relative}.um-dropdown-arr{position:absolute;font-size:24px;width:24px;height:24px;overflow:hidden;z-index:15;color:#eee}.um-dropdown-arr *{display:block!important;width:24px!important;height:24px!important;vertical-align:bottom!important;overflow:hidden!important;line-height:24px!important}div.um-photo{margin:20px auto 0 auto;text-align:center;box-sizing:border-box;max-width:100%}div.um-photo,div.um-photo a,div.um-photo img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.um-photo a{border:1px solid #e5e5e5;padding:5px;box-sizing:border-box;display:inline-block;box-shadow:0 1px 1px #eee;margin:0 auto;max-width:100%}div.um-photo img{max-height:300px;max-width:100%}span.um-req{margin:0 0 0 8px;font-size:14px;display:inline-block}small.um-max-filesize{display:block;color:#999;padding-top:5px}small.um-max-filesize span{font-size:12px}.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched,.um-form .um-field .um-field-area input.um-form-field.um-validate-not-matched:focus,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists,.um-form .um-field .um-field-area input.um-form-field.um-validate-username-exists:focus{border-color:#db2929!important}.um-form .um-field .um-field-area input.um-searching-username{background-image:url(../img/loading.gif);background-position:right center;background-repeat:no-repeat;background-size:24px 24px}.um-search-area{position:relative;max-width:300px}.um-search-area .um-search-field{width:100%;margin:0;padding-left:25px}.rtl .um-search-area .um-search-field{padding-right:25px;padding-left:initial}.um-search-area .um-search-icon{position:absolute;height:100%;left:6px;top:0}.rtl .um-search-area .um-search-icon{right:6px;left:initial}.um-faicon-search:before{display:flex;align-items:center;justify-content:center;height:100%}.um-field .select2-container.select2-container--open,.um-search-filter .select2-container.select2-container--open{z-index:9999999}.um-field .select2.select2-container .select2-selection,.um-search-filter .select2.select2-container .select2-selection{display:block!important;height:40px;padding:0 0 0 12px!important;overflow:hidden!important;position:relative!important;white-space:nowrap!important;line-height:35px!important;color:#666!important;font-size:15px!important;-moz-border-radius:2px!important;-webkit-border-radius:2px!important;border-radius:2px!important;background-clip:padding-box!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff!important;border:1px solid #ddd!important}.rtl .um-field .select2.select2-container .select2-selection,.rtl .um-search-filter .select2.select2-container .select2-selection{padding:0 12px 0 0!important}.um-field .select2.select2-container .select2-selection .select2-selection__arrow,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{display:inline-block!important;width:34px!important;height:100%!important;position:absolute;right:0;top:0;text-align:center;background:0 0!important;border:none!important}.rtl .um-field .select2.select2-container .select2-selection .select2-selection__arrow,.rtl .um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow{right:initial;left:0}.um-field .select2.select2-container .select2-selection .select2-selection__arrow:before,.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow:before{content:"\f3d0"!important;font-size:28px!important;font-family:Ionicons!important;display:block;height:100%;line-height:40px;min-width:1em;text-align:center;color:#aaa}.um-field .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation],.um-search-filter .select2.select2-container .select2-selection .select2-selection__arrow b[role=presentation]{display:none}.um-field .select2-container.select2-container--open .select2-dropdown,.um-search-filter .select2-container.select2-container--open .select2-dropdown{border:1px solid #ddd!important;border-radius:0}.um-field .select2-container.select2-container--open .select2-dropdown .select2-results li,.um-search-filter .select2-container.select2-container--open .select2-dropdown .select2-results li{list-style:none;display:list-item;background:0 0;font-size:15px;margin:5px!important;color:#666!important;padding:3px 7px 4px!important;cursor:pointer;min-height:1em}.um-field .select2.select2-container .select2-selection.select2-selection--multiple,.um-search-filter .select2.select2-container .select2-selection.select2-selection--multiple{height:auto!important;line-height:.8!important;min-height:40px;padding-bottom:4px!important}.um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{line-height:37px;padding-left:0;padding-right:24px}.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__rendered{padding-left:24px;padding-right:0}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{line-height:37px;box-sizing:border-box;list-style:none;margin:0;padding-left:0;padding-right:30px;width:100%;font-size:13px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:30px;padding-right:0}.um-field .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted,.um-search-filter .select2-dropdown .select2-results li.select2-results__option.select2-results__option--highlighted{background:#f4f4f4;color:#666}.um-field .select2-dropdown .select2-results li.select2-results__option[aria-selected=true],.um-search-filter .select2-dropdown .select2-results li.select2-results__option[aria-selected=true]{background-color:#ddd}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-field .select2-container--default .select2-selection--single .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{color:#aaa;font-size:28px;font-weight:400;line-height:34px;margin:0!important;right:0;text-align:center;width:1em}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-field .select2-container--default .select2-selection--single .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear,.rtl .um-search-filter .select2-container--default .select2-selection--single .select2-selection__clear{left:0;right:initial}.um-field .select2-container--default .select2-selection--multiple .select2-selection__clear,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__clear{position:absolute}.um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 5px 0 0;max-height:28px;padding:3px 3px 3px 5px}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-selection__choice,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__choice{margin:5px 0 0 5px;padding:3px 5px 3px 3px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 5px 0 0;padding:0}.rtl .um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline,.rtl .um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline{margin:5px 0 0 5px}.um-field .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input,.um-search-filter .select2-container--default .select2-selection--multiple .select2-search.select2-search--inline>input{border:none!important;padding:0!important;max-height:28px}.um-field .select2-container--default .select2-selection--multiple .select2-selection__rendered li,.um-search-filter .select2-container--default .select2-selection--multiple .select2-selection__rendered li{overflow-x:hidden;text-overflow:ellipsis;max-width:100%;box-sizing:border-box;line-height:20px}.um-field-multiselect .um-field-area .um-field-icon,.um-field-select .um-field-area .um-field-icon{z-index:99999999}.um-field-select .um-field-area.um-field-area-has-icon .select2-selection__rendered{text-indent:20px}.um-field-multiselect .um-field-area.um-field-area-has-icon ul:first-child{margin-left:30px!important}.um-field-area .wp-switch-editor{float:none;height:auto} \ No newline at end of file diff --git a/assets/js/admin/forms.js b/assets/js/admin/forms.js index 4d3317e6..913919a0 100644 --- a/assets/js/admin/forms.js +++ b/assets/js/admin/forms.js @@ -827,11 +827,18 @@ jQuery(document).ready( function() { }); jQuery('.um-clear-image').on('click', function(e) { - var clear_button = jQuery(this); - var default_image_url = clear_button.siblings('.um-forms-field').data('default'); + let clear_button = jQuery(this); + let default_image_url = clear_button.siblings('.um-forms-field').data('default'); + if ( undefined === default_image_url ) { + default_image_url = ''; + } + clear_button.siblings('.um-set-image').show(); clear_button.hide(); clear_button.siblings('.icon_preview').attr( 'src', default_image_url ); + if ( '' === default_image_url ) { + clear_button.siblings('.icon_preview').hide(); + } clear_button.siblings('.um-media-upload-data-id').val(''); clear_button.siblings('.um-media-upload-data-width').val(''); clear_button.siblings('.um-media-upload-data-height').val(''); diff --git a/assets/js/admin/forms.min.js b/assets/js/admin/forms.min.js index 7117ccbf..bda056ab 100644 --- a/assets/js/admin/forms.min.js +++ b/assets/js/admin/forms.min.js @@ -1 +1 @@ -function um_admin_init_users_select(){function e(a){var t;if(!a.id)return a.text;if(void 0!==a.img)t=jQuery(' '+a.text+"");else{let e;t=(e=void 0!==a.element&&void 0!==a.element.attributes["data-img"]?a.element.attributes["data-img"].value:e)?jQuery(' '+a.text+""):jQuery(""+a.text+"")}return t}var a,t;jQuery(".um-user-select-field:visible:not(.um-select2-inited)").length&&(a={ajax:{url:wp.ajax.settings.url,dataType:"json",delay:250,data:function(e){var a={action:"um_get_users",search:e.term,page:e.page||1,nonce:um_admin_scripts.nonce};return jQuery.each(jQuery(this)[0].attributes,function(){var e;this.specified&&-1!==this.name.indexOf("data-ajax-args-")&&(e=this.name.replace("data-ajax-args-","").trim(),a[e]=this.value)}),a},processResults:function(e,a){a.page=a.page||1;var t=[];return e.data.users&&jQuery.each(e.data.users,function(e,a){void 0!==a.img?t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")",img:a.img}):t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")"})}),{results:t,pagination:{more:20*a.page")}function um_same_page_wrong_ajax(e){um_add_same_page_log(e,wp.i18n.__("Wrong AJAX response...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}function um_same_page_something_wrong(e){um_add_same_page_log(e,wp.i18n.__("Something went wrong with AJAX request...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}jQuery(document).ready(function(){um_admin_init_users_select(),um_admin_init_pages_select(),jQuery(document.body).on("click",".um-forms-field[data-log-object]",function(){var e=jQuery(this).data("log-object");jQuery(this).is(":checked")?jQuery(this).parents("label").siblings(".um-same-page-update-"+e).show():jQuery(this).parents("label").siblings(".um-same-page-update-"+e).hide()}),jQuery(document.body).on("click",".um-admin-form-same-page-update",function(){var t,a,i,s=jQuery(this).data("upgrade_cb");jQuery(this).prop("disabled",!0),um_add_same_page_log(s,wp.i18n.__("Upgrade Process Started...","ultimate-member")),"sync_metatable"===s?(t=0,a=500,jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_usermeta_fields",nonce:um_admin_scripts.nonce},success:function(e){i=1,um_add_same_page_log(s,wp.i18n.__("Getting metadata","ultimate-member")),jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_get_metadata",nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data.count?(um_add_same_page_log(s,wp.i18n.__("There are ","ultimate-member")+e.data.count+wp.i18n.__(" metadata rows...","ultimate-member")),um_add_same_page_log(s,wp.i18n.__("Start metadata upgrading...","ultimate-member")),t=Math.ceil(e.data.count/a),function a(){i<=t?jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_update_metadata_per_page",page:i,nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data?(um_add_same_page_log(s,e.data.message),i++,a()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}}):window.location=um_forms_data.successfully_redirect}()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}})},error:function(){um_same_page_something_wrong(s)}})):wp.hooks.doAction("um_same_page_upgrade",s)}),jQuery(".um-sortable-items-field").sortable({items:".um-sortable-item",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0,update:function(e,a){var t=[];jQuery(this).find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||t.push(jQuery(this).data("tab-id"))}),jQuery(this).siblings(".um-sortable-items-value").val(t.join(","))}}),jQuery(".um-multi-selects-list.um-sortable-multi-selects").sortable({items:".um-admin-drag-fld",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0}),jQuery('.um-multi-selects-list[data-field_id="_um_sorting_fields"] li').each(function(){"other"===jQuery(this).find(".um-field-wrapper:not(.um-custom-order-fields) select").val()?jQuery(this).find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery('.um-forms-line[data-field_type="md_sorting_fields"] .um-multi-selects-add-option').on("click",function(){var e=jQuery(this).siblings("ul.um-multi-selects-list"),a=e.hasClass("um-sortable-multi-selects"),t=(e.data("field_id"),0),i=(0").append(e.siblings(".um-hidden-multi-selects").clone()).html()),s='
  • ';a&&(s+='');let l="";jQuery.each(um_forms_data.md_sorting_data_types,function(e,a){l+='"}),s+=''+i+''+wp.i18n.__("Remove","ultimate-member")+'
  • ',e.append(s),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t).trigger("change"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="meta_key"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][meta_key]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="label"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][label]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="data_type"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][data_type]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="order"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][order]")}),jQuery(document.body).on("change",'.um-multi-selects-list[data-field_id="_um_sorting_fields"] .um-field-wrapper:not(.um-custom-order-fields) select',function(){"other"===jQuery(this).val()?jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery(document.body).on("click",".um-multi-selects-option-line .um-select-delete",function(){jQuery(this).parents("li.um-multi-selects-option-line").remove()}),jQuery(document.body).on("click",".um-md-default-filters-option-line .um-select-delete",function(){jQuery(this).parents("li.um-md-default-filters-option-line").remove()}),jQuery(".um-multi-selects-add-option").on("click",function(){var e,a,t,i;jQuery(this).parents('.um-forms-line[data-field_type="md_sorting_fields"]').length||(a=(e=jQuery(this).siblings("ul.um-multi-selects-list")).hasClass("um-sortable-multi-selects"),e.data("field_id"),(t=0)',a&&(i+=''),i+=''+jQuery("
    ").append(e.siblings(".um-hidden-multi-selects").clone()).html()+''+wp.i18n.__("Remove","ultimate-member")+"",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker").set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var r,u;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(u=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),r=[],jQuery.each(m,function(e){r.push(jQuery("#"+l+"_"+m[e]))}),void 0!==r[0].parents(".um-forms-line").data("conditional")&&(n=i(r[0].parents(".um-forms-line")))):"><"===t&&void 0!==(u=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,g,h;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?u.is(":checked"):!u.is(":checked"):Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s):"select"==g&&(d=Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?!u.is(":checked"):u.is(":checked"):u.val()!=s):"select"==g&&(d=u.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return g=u.prop("tagName").toLowerCase(),(d="input"==g&&"checkbox"==(h=u.attr("type"))?u.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+'
  • '),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+"
  • "),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this),t=a.siblings(".um-forms-field").data("default");a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0 '+a.text+"");else{let e;t=(e=void 0!==a.element&&void 0!==a.element.attributes["data-img"]?a.element.attributes["data-img"].value:e)?jQuery(' '+a.text+""):jQuery(""+a.text+"")}return t}var a,t;jQuery(".um-user-select-field:visible:not(.um-select2-inited)").length&&(a={ajax:{url:wp.ajax.settings.url,dataType:"json",delay:250,data:function(e){var a={action:"um_get_users",search:e.term,page:e.page||1,nonce:um_admin_scripts.nonce};return jQuery.each(jQuery(this)[0].attributes,function(){var e;this.specified&&-1!==this.name.indexOf("data-ajax-args-")&&(e=this.name.replace("data-ajax-args-","").trim(),a[e]=this.value)}),a},processResults:function(e,a){a.page=a.page||1;var t=[];return e.data.users&&jQuery.each(e.data.users,function(e,a){void 0!==a.img?t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")",img:a.img}):t.push({id:a.ID,text:a.user_login+" (#"+a.ID+")"})}),{results:t,pagination:{more:20*a.page")}function um_same_page_wrong_ajax(e){um_add_same_page_log(e,wp.i18n.__("Wrong AJAX response...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}function um_same_page_something_wrong(e){um_add_same_page_log(e,wp.i18n.__("Something went wrong with AJAX request...","ultimate-member")),um_add_same_page_log(e,wp.i18n.__("Your upgrade was crashed, please contact with support","ultimate-member"))}jQuery(document).ready(function(){um_admin_init_users_select(),um_admin_init_pages_select(),jQuery(document.body).on("click",".um-forms-field[data-log-object]",function(){var e=jQuery(this).data("log-object");jQuery(this).is(":checked")?jQuery(this).parents("label").siblings(".um-same-page-update-"+e).show():jQuery(this).parents("label").siblings(".um-same-page-update-"+e).hide()}),jQuery(document.body).on("click",".um-admin-form-same-page-update",function(){var t,a,i,s=jQuery(this).data("upgrade_cb");jQuery(this).prop("disabled",!0),um_add_same_page_log(s,wp.i18n.__("Upgrade Process Started...","ultimate-member")),"sync_metatable"===s?(t=0,a=500,jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_usermeta_fields",nonce:um_admin_scripts.nonce},success:function(e){i=1,um_add_same_page_log(s,wp.i18n.__("Getting metadata","ultimate-member")),jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_get_metadata",nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data.count?(um_add_same_page_log(s,wp.i18n.__("There are ","ultimate-member")+e.data.count+wp.i18n.__(" metadata rows...","ultimate-member")),um_add_same_page_log(s,wp.i18n.__("Start metadata upgrading...","ultimate-member")),t=Math.ceil(e.data.count/a),function a(){i<=t?jQuery.ajax({url:wp.ajax.settings.url,type:"POST",dataType:"json",data:{action:"um_same_page_update",cb_func:"um_update_metadata_per_page",page:i,nonce:um_admin_scripts.nonce},success:function(e){void 0!==e.data?(um_add_same_page_log(s,e.data.message),i++,a()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}}):window.location=um_forms_data.successfully_redirect}()):um_same_page_wrong_ajax(s)},error:function(){um_same_page_something_wrong(s)}})},error:function(){um_same_page_something_wrong(s)}})):wp.hooks.doAction("um_same_page_upgrade",s)}),jQuery(".um-sortable-items-field").sortable({items:".um-sortable-item",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0,update:function(e,a){var t=[];jQuery(this).find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||t.push(jQuery(this).data("tab-id"))}),jQuery(this).siblings(".um-sortable-items-value").val(t.join(","))}}),jQuery(".um-multi-selects-list.um-sortable-multi-selects").sortable({items:".um-admin-drag-fld",connectWith:".um-admin-drag-col,.um-admin-drag-group",forcePlaceholderSize:!0}),jQuery('.um-multi-selects-list[data-field_id="_um_sorting_fields"] li').each(function(){"other"===jQuery(this).find(".um-field-wrapper:not(.um-custom-order-fields) select").val()?jQuery(this).find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery('.um-forms-line[data-field_type="md_sorting_fields"] .um-multi-selects-add-option').on("click",function(){var e=jQuery(this).siblings("ul.um-multi-selects-list"),a=e.hasClass("um-sortable-multi-selects"),t=(e.data("field_id"),0),i=(0").append(e.siblings(".um-hidden-multi-selects").clone()).html()),s='
  • ';a&&(s+='');let l="";jQuery.each(um_forms_data.md_sorting_data_types,function(e,a){l+='"}),s+=''+i+''+wp.i18n.__("Remove","ultimate-member")+'
  • ',e.append(s),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t).trigger("change"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="meta_key"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][meta_key]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields input[name="label"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][label]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="data_type"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][data_type]"),jQuery("#"+e.data("id_attr")+"-"+t).parents("li").find('.um-field-wrapper.um-custom-order-fields select[name="order"]').attr("name","um_metadata[_um_sorting_fields][other_data]["+t+"][order]")}),jQuery(document.body).on("change",'.um-multi-selects-list[data-field_id="_um_sorting_fields"] .um-field-wrapper:not(.um-custom-order-fields) select',function(){"other"===jQuery(this).val()?jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").show():jQuery(this).parents("li").find(".um-field-wrapper.um-custom-order-fields").hide()}),jQuery(document.body).on("click",".um-multi-selects-option-line .um-select-delete",function(){jQuery(this).parents("li.um-multi-selects-option-line").remove()}),jQuery(document.body).on("click",".um-md-default-filters-option-line .um-select-delete",function(){jQuery(this).parents("li.um-md-default-filters-option-line").remove()}),jQuery(".um-multi-selects-add-option").on("click",function(){var e,a,t,i;jQuery(this).parents('.um-forms-line[data-field_type="md_sorting_fields"]').length||(a=(e=jQuery(this).siblings("ul.um-multi-selects-list")).hasClass("um-sortable-multi-selects"),e.data("field_id"),(t=0)',a&&(i+=''),i+=''+jQuery("
    ").append(e.siblings(".um-hidden-multi-selects").clone()).html()+''+wp.i18n.__("Remove","ultimate-member")+"",e.append(i),e.find("li:last .um-hidden-multi-selects").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-selects").attr("id",e.data("id_attr")+"-"+t))});var t,e=-(new Date).getTimezoneOffset()/60,i=(jQuery('input[name="um-gmt-offset"]').val(e),jQuery(".um-admin-metabox").find(".um-slider").each(function(){var e=jQuery(this),a=parseInt(e.data("min")),t=parseInt(e.data("max")),a=[a=void 0!==jQuery("#"+e.data("field_name")+"_min").val()?jQuery("#"+e.data("field_name")+"_min").val():a,t=void 0!==jQuery("#"+e.data("field_name")+"_max").val()?jQuery("#"+e.data("field_name")+"_max").val():t];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),jQuery(".um-admin-metabox").find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}}).pickadate("picker").set("select",1e3*e.data("value"))}),jQuery(".um-admin-metabox").find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})}),!1);function s(e,a){var t,i="",s=e.siblings(".um-slider-range").data("placeholder-s"),l=e.siblings(".um-slider-range").data("placeholder-p"),a=a?(i=(a.values[0]===a.values[1]?s.replace("{value}",a.values[0]):l.replace("{min_range}",a.values[0]).replace("{max_range}",a.values[1])).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=a.values[0],a.values[1]):(i=(e.slider("values",0)===e.slider("values",1)?s.replace("{value}",e.slider("values",0)):l.replace("{min_range}",e.slider("values",0)).replace("{max_range}",e.slider("values",1))).replace("{field_label}",e.siblings(".um-slider-range").data("label")),t=e.slider("values",0),e.slider("values",1));e.siblings(".um-slider-range").html(i),e.siblings(".um_range_min").val(t),e.siblings(".um_range_max").val(a)}function a(){jQuery(".um-forms-line").removeClass("um-forms-line-conditioned").each(function(){void 0===jQuery(this).data("conditional")||jQuery(this).hasClass("um-forms-line-conditioned")||(!function i(e){e.addClass("um-forms-line-conditioned");var a=e.data("conditional");var t=a[1];var s=a[2];var l=e.data("prefix");var n=!0;{var r,u;"="===t||"!="===t?-1===a[0].indexOf("||")&&void 0!==(u=jQuery("#"+l+"_"+a[0])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line"))):"~"===t?(m=a[0].split("|"),r=[],jQuery.each(m,function(e){r.push(jQuery("#"+l+"_"+m[e]))}),void 0!==r[0].parents(".um-forms-line").data("conditional")&&(n=i(r[0].parents(".um-forms-line")))):"><"===t&&void 0!==(u=jQuery("#"+l+"_"+a[0]+"_"+a[2])).parents(".um-forms-line").data("conditional")&&(n=i(u.parents(".um-forms-line")))}var d=!1;{var m,o,c,p,f,_,g,h;if("="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?e.is(":checked"):!e.is(":checked"):Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s):"select"===t&&(d=Array.isArray(s)?-1!==s.indexOf(e.val()):e.val()==s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?u.is(":checked"):!u.is(":checked"):Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s):"select"==g&&(d=Array.isArray(s)?-1!==s.indexOf(u.val()):u.val()==s),d&&n);if("!="===t)return-1!==a[0].indexOf("||")?(m=a[0].split("||"),o=!1,jQuery.each(m,function(e){var a,e=jQuery("#"+l+"_"+m[e]),t=(n=!(d=!1),void 0!==e.parents(".um-forms-line").data("conditional")&&(n=i(e.parents(".um-forms-line"))),e.prop("tagName").toLowerCase());"input"===t?(a=e.attr("type"),d="checkbox"===a?"1"==s?!e.is(":checked"):e.is(":checked"):e.val()!=s):"select"===t&&(d=e.val()!=s),d&&n&&(o=!0)}),o):("input"==(g=u.prop("tagName").toLowerCase())?(h=u.attr("type"),d="checkbox"==h?"1"==s?!u.is(":checked"):u.is(":checked"):u.val()!=s):"select"==g&&(d=u.val()!=s),d&&n);if("~"===t)return p=[],"sortable_items"===e.data("field_type")?(c=e.find(".um-sortable-items-value").data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.siblings(".um-sortable-items-field").find("li").addClass("um-hidden-item"),jQuery.each(p,function(e){f.siblings(".um-sortable-items-field").find('li[data-tab-id="'+p[e]+'"]').removeClass("um-hidden-item")}),_=[],f.siblings(".um-sortable-items-field").find("li").each(function(){jQuery(this).hasClass("um-hidden-item")||_.push(jQuery(this).data("tab-id"))}),f.val(_.join(",")),f.siblings(".um-sortable-items-field").sortable("refresh"),d=!0):f.val(null)):(c=e.find(e.data("field_type")).data("field_id"),jQuery.each(r,function(e){var e=r[e],a=e.prop("tagName").toLowerCase();"input"===a?"checkbox"===e.attr("type")&&"1"==s&&e.is(":checked")&&p.push(e.data("fill_"+c)):"select"==a&&!s&&e.val()&&(p=(p=p.concat(e.val())).filter(y))}),f=jQuery('[data-field_id="'+c+'"]'),p.length?(f.find("option").hide(),jQuery.each(p,function(e){f.find('option[value="'+p[e]+'"]').show()}),-1===p.indexOf(f.val())&&(f.val(p[0]),f.find("option").attr("selected",!1).prop("selected",!1),f.find('option[value="'+p[0]+'"]').attr("selected",!0).prop("selected",!0)),d=!0):(f.val(null),f.find("option").attr("selected",!1).prop("selected",!1))),d&&n;if("><"===t)return g=u.prop("tagName").toLowerCase(),(d="input"==g&&"checkbox"==(h=u.attr("type"))?u.is(":checked"):d)&&n}return!1}(jQuery(this))?jQuery(this).hide():(jQuery(this).show(),um_admin_init_users_select()))})}function y(e,a,t){return t.indexOf(e)===a}jQuery(document.body).on("change",".um-md-default-filters-option-line .um-field-wrapper select",function(){var t,e,a;i||(e=(t=jQuery(this)).val(),a=t.data("member_directory"),i=!0,wp.ajax.send("um_member_directory_default_filter_settings",{data:{key:e,directory_id:a,nonce:um_admin_scripts.nonce},success:function(e){var a=t.parents(".um-md-default-filters-option-line").find(".um-field-wrapper2");a.html(e.field_html),i=!1,a.find(".um-slider").each(function(){var e=jQuery(this),a=[parseInt(e.data("min")),parseInt(e.data("max"))];e.slider({range:!0,min:parseInt(e.data("min")),max:parseInt(e.data("max")),values:a,create:function(e,a){},step:1,slide:function(e,a){s(jQuery(this),a)},stop:function(e,a){}}),s(e)}),a.find(".um-datepicker-filter").each(function(){var e=jQuery(this),a=new Date(1e3*e.data("date_min")),t=new Date(1e3*e.data("date_max"));e.pickadate({selectYears:!0,min:a,max:t,formatSubmit:"yyyy/mm/dd",hiddenName:!0,onOpen:function(){e.blur(),e.siblings(".picker").find(".picker__button--close").addClass("button")},onClose:function(){e.blur()},onSet:function(e){}})}),a.find(".um-timepicker-filter").each(function(){var e=jQuery(this),a=e.data("min"),t=e.data("max"),a=a.split(":"),t=t.split(":");e.pickatime({format:e.data("format"),interval:parseInt(e.data("intervals")),min:[a[0],a[1]],max:[t[0],t[1]],formatSubmit:"HH:i",hiddenName:!0,onOpen:function(){e.blur()},onClose:function(){e.blur()},onSet:function(e){}})})},error:function(e){return!1}}))}),jQuery(".um-md-default-filters-add-option").on("click",function(){var e,a,t;i||((e=jQuery(this).siblings("ul.um-md-default-filters-list")).data("field_id"),(a=0)").append(e.siblings(".um-hidden-md-default-filters").clone()).html(),e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+'
  • '),e.find("li:last .um-hidden-md-default-filters").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-md-default-filters").attr("id",e.data("id_attr")+"-"+a),e.find("li:last .um-field-wrapper select").trigger("change"))}),jQuery(document.body).on("click",".um-text-delete",function(){jQuery(this).parents("li.um-multi-text-option-line").remove()}),jQuery(".um-multi-text-add-option").on("click",function(){var e=jQuery(this).siblings("ul.um-multi-text-list"),a=0,t=(0").append(e.siblings(".um-hidden-multi-text").clone()).html()),i=e.data("item_class");e.append('
  • '+t+''+wp.i18n.__("Remove","ultimate-member")+"
  • "),e.find("li:last .um-hidden-multi-text").attr("name",jQuery(this).data("name")).addClass("um-forms-field um-long-field").removeClass("um-hidden-multi-text").attr("id",e.data("id_attr")+"-"+a)}),jQuery(".um-media-upload").each(function(){var e=jQuery(this).find(".um-forms-field"),a=e.data("default");""!=e.val()&&e.val()!=a?(e.siblings(".um-set-image").hide(),e.siblings(".um-clear-image").show(),e.siblings(".icon_preview").show()):(e.val()==a&&e.siblings(".icon_preview").show(),e.siblings(".um-set-image").show(),e.siblings(".um-clear-image").hide())}),"undefined"!=typeof wp&&wp.media&&wp.media.editor&&(jQuery(".um-set-image").on("click",function(e){var a=jQuery(this);e.preventDefault(),t&&t.remove(),(t=wp.media({title:a.data("upload_frame"),button:{text:wp.i18n.__("Select","ultimate-member")},multiple:!1})).on("select",function(){var e=t.state().get("selection").first().toJSON();a.siblings(".icon_preview").attr("src",e.url).show(),a.siblings(".um-forms-field").val(e.url),a.siblings(".um-media-upload-data-id").val(e.id),a.siblings(".um-media-upload-data-width").val(e.width),a.siblings(".um-media-upload-data-height").val(e.height),a.siblings(".um-media-upload-data-thumbnail").val(e.thumbnail),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(e.url),a.siblings(".um-clear-image").show(),a.hide(),jQuery(document).trigger("um_media_upload_select",[a,e])}),t.open()}),jQuery(".icon_preview").on("click",function(e){jQuery(this).siblings(".um-set-image").trigger("click")}),jQuery(".um-clear-image").on("click",function(e){var a=jQuery(this);let t=a.siblings(".um-forms-field").data("default");void 0===t&&(t=""),a.siblings(".um-set-image").show(),a.hide(),a.siblings(".icon_preview").attr("src",t),""===t&&a.siblings(".icon_preview").hide(),a.siblings(".um-media-upload-data-id").val(""),a.siblings(".um-media-upload-data-width").val(""),a.siblings(".um-media-upload-data-height").val(""),a.siblings(".um-media-upload-data-thumbnail").val(""),a.siblings(".um-forms-field").val(t),a.siblings(".um-media-upload-data-url").trigger("change"),a.siblings(".um-media-upload-url").val(t),jQuery(document).trigger("um_media_upload_clear",a)})),jQuery(document.body).on("change",".um-forms-field",function(){(0 h ) { + modal.animate({ 'bottom' : 0 }, 300); + } else { + modal.animate({ 'bottom' : half_gap }, 300); + } } } } diff --git a/assets/js/um-functions.min.js b/assets/js/um-functions.min.js index fa3c2b0a..e3e2db4f 100644 --- a/assets/js/um-functions.min.js +++ b/assets/js/um-functions.min.js @@ -1 +1 @@ -function UM_domenus(){jQuery(".um-dropdown").each(function(e,o){UM.dropdown.setPosition(o)})}function UM_check_password_matched(){jQuery(document).on("keyup","input[data-key=user_password],input[data-key=confirm_user_password]",function(e){var o=jQuery("input[data-key=user_password]").val(),a=jQuery("input[data-key=confirm_user_password]").val(),t=jQuery("input[data-key=user_password],input[data-key=confirm_user_password]");o||a?o!==a?t.removeClass("um-validate-matched").addClass("um-validate-not-matched"):t.removeClass("um-validate-not-matched").addClass("um-validate-matched"):t.removeClass("um-validate-matched").removeClass("um-validate-not-matched")})}function um_responsive(){jQuery(".um").each(function(){(element_width=jQuery(this).width())<=340?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob340")):element_width<=500?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob500")):element_width<=800?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob800")):element_width<=960?(jQuery(this).removeClass("uimob340"),jQuery(this).removeClass("uimob500"),jQuery(this).removeClass("uimob800"),jQuery(this).removeClass("uimob960"),jQuery(this).addClass("uimob960")):960'+d.data("upload_help_text")+"":"",icon=d.data("icon")?'':"",upload_text=d.data("upload_text")?''+d.data("upload_text")+"":"";var e=0;jQuery("#um_upload_single:visible").data("user_id")&&(e=jQuery("#um_upload_single:visible").data("user_id")),d.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_imageupload",key:d.data("key"),set_id:d.data("set_id"),set_mode:d.data("set_mode"),_wpnonce:d.data("nonce"),timestamp:d.data("timestamp"),user_id:e},fileName:d.data("key"),allowedTypes:d.data("allowed_types"),maxFileSize:d.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:d.data("max_size_error"),extErrorStr:d.data("extension_error"),maxFileCountErrorStr:d.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,returnType:"json",onSubmit:function(e){d.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,o,a){d.selectedFiles=0,o.success&&0==o.success||void 0!==o.data.error?(d.parents(".um-modal-body").append('
    '+o.data.error+"
    "),d.parents(".um-modal-body").find(".upload-statusbar").hide(0),um_modal_responsive()):jQuery.each(o.data,function(e,o){var a=d.parents(".um-modal-body").find(".um-single-image-preview img"),t=d.parents(".um-modal-body").find(".um-single-image-preview"),i=new Date;a.attr("src",o.url+"?"+i.getTime()),a.data("file",o.file),a.on("load",function(){d.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),d.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),t.show(0),um_modal_responsive()})})},onError:function(e){console.log(e)}})}function initFileUpload_UM(t){upload_help_text=t.data("upload_help_text")?''+t.data("upload_help_text")+"":"",icon=t.data("icon")?'':"",upload_text=t.data("upload_text")?''+t.data("upload_text")+"":"",jQuery("#um_upload_single:visible").data("user_id")&&(user_id=jQuery("#um_upload_single:visible").data("user_id")),t.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_fileupload",key:t.data("key"),set_id:t.data("set_id"),user_id:t.data("user_id"),set_mode:t.data("set_mode"),_wpnonce:t.data("nonce"),timestamp:t.data("timestamp")},fileName:t.data("key"),allowedTypes:t.data("allowed_types"),maxFileSize:t.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:t.data("max_size_error"),extErrorStr:t.data("extension_error"),maxFileCountErrorStr:t.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(e){t.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,o,a){t.selectedFiles=0,o.success&&0==o.success||void 0!==o.data.error?(t.parents(".um-modal-body").append('
    '+o.data.error+"
    "),t.parents(".um-modal-body").find(".upload-statusbar").hide(0)):jQuery.each(o.data,function(e,o){t.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),t.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),t.parents(".um-modal-body").find(".um-single-file-preview").show(0),"icon"==e?t.parents(".um-modal-body").find(".um-single-fileinfo i").removeClass().addClass(o):"icon_bg"==e?t.parents(".um-modal-body").find(".um-single-fileinfo span.icon").css({"background-color":o}):"filename"==e?t.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-file",o):"original_name"==e?(t.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-orignal-name",o),t.parents(".um-modal-body").find(".um-single-fileinfo span.filename").html(o)):"url"==e&&t.parents(".um-modal-body").find(".um-single-fileinfo a").attr("href",o)}),setTimeout(function(){um_modal_responsive()},1e3)},onError:function(e){console.log(e)}})}function um_new_modal(e,o,a,t){var i,d,s,r=jQuery(".um-modal-overlay"),r=(0!==r.length&&(r.hide(),r.next(".um-modal").hide()),UM.common.tipsy.hide(),UM.dropdown.hideAll(),jQuery("body,html,textarea").css("overflow","hidden"),jQuery(document).bind("touchmove",function(e){e.preventDefault()}),jQuery(".um-modal").on("touchmove",function(e){e.stopPropagation()}),jQuery('
    ')),u=r.filter(".um-modal");u.append(jQuery("#"+e)),jQuery("body").append(r),a?(i=jQuery(''),d=jQuery(window).width()-60,s=jQuery(window).height()-.25*jQuery(window).height(),i.on("load",function(){u.find(".um-modal-photo").html(i),u.addClass("is-photo").css({width:i.width(),"margin-left":"-"+i.width()/2+"px"}).show().children().show(),i.css({opacity:0,"max-width":d,"max-height":s}).animate({opacity:1},1e3),um_modal_responsive()})):(u.addClass("no-photo").show().children().show(),um_modal_size(o),initImageUpload_UM(jQuery(".um-modal:visible .um-single-image-upload")),initFileUpload_UM(jQuery(".um-modal:visible .um-single-file-upload")),um_modal_responsive())}function um_modal_responsive(){var e,o,a=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,t=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,i=jQuery(".um-modal:visible").not(".um-modal-hidden"),d=i.find(".um-modal-body.photo:visible");(d.length||i.length)&&(e=(t-i.innerHeight())/2+"px",i.removeClass("uimob340").removeClass("uimob500"),d.length?(d=a-60,t=t-.25*t,(o=jQuery(".um-modal-photo img")).css({opacity:0}),o.css({"max-width":d}),o.css({"max-height":t}),i.css({width:o.width(),"margin-left":"-"+o.width()/2+"px"}),o.animate({opacity:1},1e3),i.animate({bottom:e},300)):i.length&&(a<=340?i.addClass("uimob340"):a<=500&&i.addClass("uimob500"),UM.frontend.cropper.init(),a<=500?i.animate({bottom:0},300):i.animate({bottom:e},300)))}function um_remove_modal(){wp.hooks.doAction("um_remove_modal"),jQuery("body,html,textarea").css("overflow","auto"),jQuery(document).unbind("touchmove"),jQuery('body > .um-modal div[id^="um_"]').hide().appendTo("body"),jQuery("body > .um-modal, body > .um-modal-overlay").remove()}function um_modal_size(e){jQuery(".um-modal:visible").not(".um-modal-hidden").addClass(e)}function prepare_Modal(){0==jQuery(".um-popup-overlay").length&&(jQuery("body").append('
    '),jQuery("body").append('
    '),jQuery(".um-popup").addClass("loading"),jQuery("body,html").css({overflow:"hidden"}))}function remove_Modal(){jQuery(".um-popup-overlay").length&&(wp.hooks.doAction("um_before_modal_removed",jQuery(".um-popup")),UM.common.tipsy.hide(),jQuery(".um-popup").empty().remove(),jQuery(".um-popup-overlay").empty().remove(),jQuery("body,html").css({overflow:"auto"}))}function show_Modal(e){jQuery(".um-popup-overlay").length&&(jQuery(".um-popup").removeClass("loading").html(e),UM.common.tipsy.init())}function responsive_Modal(){jQuery(".um-popup-overlay").length&&(350<(ag_height=jQuery(window).height()-jQuery(".um-popup .um-popup-header").outerHeight()-jQuery(".um-popup .um-popup-footer").outerHeight()-80)&&(ag_height=350),jQuery(".um-popup-autogrow:visible").length?jQuery(".um-popup-autogrow:visible").css({height:ag_height+"px"}):jQuery(".um-popup-autogrow2:visible").length&&jQuery(".um-popup-autogrow2:visible").css({"max-height":ag_height+"px"}))}function um_reset_field(e){jQuery(e).find("div.um-field-area").find("input,textarea,select").not(":button, :submit, :reset, :hidden").val("").prop("checked",!1).prop("selected",!1)}"object"!=typeof window.UM&&(window.UM={}),UM.dropdown={hide:function(e){e=jQuery(e);e.parents("div").find("a").removeClass("active"),e.hide()},hideAll:function(){var e=jQuery(".um-dropdown");e.parents("div").find("a").removeClass("active"),e.hide()},setPosition:function(e){var o,a=jQuery(e),t=200,e=jQuery("html").attr("dir"),i=a.attr("data-element"),d=a.attr("data-position"),s=a.attr("data-trigger"),r=i&&jQuery(i).length?jQuery(i):a.siblings("a").length?a.siblings("a").first():a.parent(),u=(r.addClass("um-trigger-menu-on-"+s),0),n=(r.outerWidth()-t)/2,l=r.outerHeight(),i=r.offset();switch(r.is(".um-profile-photo")&&(o=r.find(".um-profile-photo-img"),l=r.closest("div.uimob500").length?r.outerHeight()-o.outerHeight()/4:(n=(o.outerWidth()-t)/2,o.outerHeight()/4)),r.is(".um-cover")&&(o=r.find(".um-cover-e"),l=r.closest("div.uimob500").length?(n=(o.outerWidth()-t)/2,o.outerHeight()/2+24):(n=(o.outerWidth()-t)/2,o.outerHeight()/2+46)),"lc"===d&&"rtl"===e&&(d="rc"),r.outerWidth()'+d.data("upload_help_text")+"":"",icon=d.data("icon")?'':"",upload_text=d.data("upload_text")?''+d.data("upload_text")+"":"";var e=0;jQuery("#um_upload_single:visible").data("user_id")&&(e=jQuery("#um_upload_single:visible").data("user_id")),d.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_imageupload",key:d.data("key"),set_id:d.data("set_id"),set_mode:d.data("set_mode"),_wpnonce:d.data("nonce"),timestamp:d.data("timestamp"),user_id:e},fileName:d.data("key"),allowedTypes:d.data("allowed_types"),maxFileSize:d.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:d.data("max_size_error"),extErrorStr:d.data("extension_error"),maxFileCountErrorStr:d.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,returnType:"json",onSubmit:function(e){d.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,o,a){d.selectedFiles=0,o.success&&0==o.success||void 0!==o.data.error?(d.parents(".um-modal-body").append('
    '+o.data.error+"
    "),d.parents(".um-modal-body").find(".upload-statusbar").hide(0),um_modal_responsive()):jQuery.each(o.data,function(e,o){var a=d.parents(".um-modal-body").find(".um-single-image-preview img"),t=d.parents(".um-modal-body").find(".um-single-image-preview"),i=new Date;a.attr("src",o.url+"?"+i.getTime()),a.data("file",o.file),a.on("load",function(){d.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),d.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),t.show(0),um_modal_responsive()})})},onError:function(e){console.log(e)}})}function initFileUpload_UM(t){upload_help_text=t.data("upload_help_text")?''+t.data("upload_help_text")+"":"",icon=t.data("icon")?'':"",upload_text=t.data("upload_text")?''+t.data("upload_text")+"":"",jQuery("#um_upload_single:visible").data("user_id")&&(user_id=jQuery("#um_upload_single:visible").data("user_id")),t.uploadFile({url:wp.ajax.settings.url,method:"POST",multiple:!1,formData:{action:"um_fileupload",key:t.data("key"),set_id:t.data("set_id"),user_id:t.data("user_id"),set_mode:t.data("set_mode"),_wpnonce:t.data("nonce"),timestamp:t.data("timestamp")},fileName:t.data("key"),allowedTypes:t.data("allowed_types"),maxFileSize:t.data("max_size"),dragDropStr:icon+upload_text+upload_help_text,sizeErrorStr:t.data("max_size_error"),extErrorStr:t.data("extension_error"),maxFileCountErrorStr:t.data("max_files_error"),maxFileCount:1,showDelete:!1,showAbort:!1,showDone:!1,showFileCounter:!1,showStatusAfterSuccess:!0,onSubmit:function(e){t.parents(".um-modal-body").find(".um-error-block").remove()},onSuccess:function(e,o,a){t.selectedFiles=0,o.success&&0==o.success||void 0!==o.data.error?(t.parents(".um-modal-body").append('
    '+o.data.error+"
    "),t.parents(".um-modal-body").find(".upload-statusbar").hide(0)):jQuery.each(o.data,function(e,o){t.parents(".um-modal-body").find(".um-modal-btn.um-finish-upload.disabled").removeClass("disabled"),t.parents(".um-modal-body").find(".ajax-upload-dragdrop,.upload-statusbar").hide(0),t.parents(".um-modal-body").find(".um-single-file-preview").show(0),"icon"==e?t.parents(".um-modal-body").find(".um-single-fileinfo i").removeClass().addClass(o):"icon_bg"==e?t.parents(".um-modal-body").find(".um-single-fileinfo span.icon").css({"background-color":o}):"filename"==e?t.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-file",o):"original_name"==e?(t.parents(".um-modal-body").find(".um-single-fileinfo a").attr("data-orignal-name",o),t.parents(".um-modal-body").find(".um-single-fileinfo span.filename").html(o)):"url"==e&&t.parents(".um-modal-body").find(".um-single-fileinfo a").attr("href",o)}),setTimeout(function(){um_modal_responsive()},1e3)},onError:function(e){console.log(e)}})}function um_new_modal(e,o,a,t){var i,d,s,r=jQuery(".um-modal-overlay"),r=(0!==r.length&&(r.hide(),r.next(".um-modal").hide()),UM.common.tipsy.hide(),UM.dropdown.hideAll(),jQuery("body,html,textarea").css("overflow","hidden"),jQuery(document).bind("touchmove",function(e){e.preventDefault()}),jQuery(".um-modal").on("touchmove",function(e){e.stopPropagation()}),jQuery('
    ')),u=r.filter(".um-modal");u.append(jQuery("#"+e)),jQuery("body").append(r),a?(i=jQuery(''),d=jQuery(window).width()-60,s=jQuery(window).height()-.25*jQuery(window).height(),i.on("load",function(){u.find(".um-modal-photo").html(i),u.addClass("is-photo").css({width:i.width(),"margin-left":"-"+i.width()/2+"px"}).show().children().show(),i.css({opacity:0,"max-width":d,"max-height":s}).animate({opacity:1},1e3),um_modal_responsive()})):(u.addClass("no-photo").show().children().show(),um_modal_size(o),initImageUpload_UM(jQuery(".um-modal:visible .um-single-image-upload")),initFileUpload_UM(jQuery(".um-modal:visible .um-single-file-upload")),um_modal_responsive())}function um_modal_responsive(){var e,o,a,t=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,i=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,d=jQuery(".um-modal:visible").not(".um-modal-hidden"),s=d.find(".um-modal-body.photo:visible");(s.length||d.length)&&(e=(i-d.innerHeight())/2+"px",d.removeClass("uimob340").removeClass("uimob500"),s.length?(s=t-60,a=i-.25*i,(o=jQuery(".um-modal-photo img")).css({opacity:0}),o.css({"max-width":s}),o.css({"max-height":a}),d.css({width:o.width(),"margin-left":"-"+o.width()/2+"px"}),o.animate({opacity:1},1e3),d.animate({bottom:e},300)):d.length&&(t<=340?d.addClass("uimob340"):t<=500&&d.addClass("uimob500"),UM.frontend.cropper.init(),t<=500||i-parseInt(e)>i?d.animate({bottom:0},300):d.animate({bottom:e},300)))}function um_remove_modal(){wp.hooks.doAction("um_remove_modal"),jQuery("body,html,textarea").css("overflow","auto"),jQuery(document).unbind("touchmove"),jQuery('body > .um-modal div[id^="um_"]').hide().appendTo("body"),jQuery("body > .um-modal, body > .um-modal-overlay").remove()}function um_modal_size(e){jQuery(".um-modal:visible").not(".um-modal-hidden").addClass(e)}function prepare_Modal(){0==jQuery(".um-popup-overlay").length&&(jQuery("body").append('
    '),jQuery("body").append('
    '),jQuery(".um-popup").addClass("loading"),jQuery("body,html").css({overflow:"hidden"}))}function remove_Modal(){jQuery(".um-popup-overlay").length&&(wp.hooks.doAction("um_before_modal_removed",jQuery(".um-popup")),UM.common.tipsy.hide(),jQuery(".um-popup").empty().remove(),jQuery(".um-popup-overlay").empty().remove(),jQuery("body,html").css({overflow:"auto"}))}function show_Modal(e){jQuery(".um-popup-overlay").length&&(jQuery(".um-popup").removeClass("loading").html(e),UM.common.tipsy.init())}function responsive_Modal(){jQuery(".um-popup-overlay").length&&(350<(ag_height=jQuery(window).height()-jQuery(".um-popup .um-popup-header").outerHeight()-jQuery(".um-popup .um-popup-footer").outerHeight()-80)&&(ag_height=350),jQuery(".um-popup-autogrow:visible").length?jQuery(".um-popup-autogrow:visible").css({height:ag_height+"px"}):jQuery(".um-popup-autogrow2:visible").length&&jQuery(".um-popup-autogrow2:visible").css({"max-height":ag_height+"px"}))}function um_reset_field(e){jQuery(e).find("div.um-field-area").find("input,textarea,select").not(":button, :submit, :reset, :hidden").val("").prop("checked",!1).prop("selected",!1)}"object"!=typeof window.UM&&(window.UM={}),UM.dropdown={hide:function(e){e=jQuery(e);e.parents("div").find("a").removeClass("active"),e.hide()},hideAll:function(){var e=jQuery(".um-dropdown");e.parents("div").find("a").removeClass("active"),e.hide()},setPosition:function(e){var o,a=jQuery(e),t=200,e=jQuery("html").attr("dir"),i=a.attr("data-element"),d=a.attr("data-position"),s=a.attr("data-trigger"),r=i&&jQuery(i).length?jQuery(i):a.siblings("a").length?a.siblings("a").first():a.parent(),u=(r.addClass("um-trigger-menu-on-"+s),0),n=(r.outerWidth()-t)/2,l=r.outerHeight(),i=r.offset();switch(r.is(".um-profile-photo")&&(o=r.find(".um-profile-photo-img"),l=r.closest("div.uimob500").length?r.outerHeight()-o.outerHeight()/4:(n=(o.outerWidth()-t)/2,o.outerHeight()/4)),r.is(".um-cover")&&(o=r.find(".um-cover-e"),l=r.closest("div.uimob500").length?(n=(o.outerWidth()-t)/2,o.outerHeight()/2+24):(n=(o.outerWidth()-t)/2,o.outerHeight()/2+46)),"lc"===d&&"rtl"===e&&(d="rc"),r.outerWidth() Settings redesign. More details about setting up. Tooltips changed to descriptions. + +* Bugfixes: + + - Fixed: Member directory queries to custom usermeta table properly escaped and validated + - Fixed: Member directory custom sorting when wp_usermeta table is used + - Fixed: aria-invalid attribute for the user description field + - Fixed: wp_kses protocols for email notifications content + - Fixed: PHP notice while registration form validation + - Fixed: Field validations (English letters, Alpha-numeric types) + - Fixed: Hidden buttons in the modal when uploading profile and cover photo + - Fixed: Theme updater log message + - Fixed: Search line shortcode layout + - Fixed: PHP notice while login form submission + - Fixed: Email notifications HTML layout + - Fixed: Default email notification body color + - Fixed: Ignore username slug when custom meta slug exists when parse user from query + +* Templates required update: + + - email/notification_deletion.php + - email/notification_new_user.php + - email/notification_review.php + - email/welcome_email.php + - password-change.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.8.2: January 15, 2024 = + +* Enhancements: + + - Added: The `data` protocol for embedding base64 encoded logos in emails + - Added: Hook `um_access_restricted_post_instance` for filtering the restricted post instance + - Added: Shortcode `[um_author_profile_link]` for getting user Profile URL + - Updated: Using underscore.js native debounce method for resize handler + - Updated: Texts spelling + +* Bugfixes: + + - Fixed: AJAX requests conflict with `um_current_locale` attribute + - Fixed: Pickadate styling (Date & Time fields) in wp-admin screen + - Fixed: RTL styling and removed `um` class from UM frontend predefined pages + - Fixed: select2 conflict with Impreza theme + - Fixed: cropper conflict with Avada theme and active Fusion Image lazyload + - Fixed: MegaMenu conflict with nav menu items conditional settings (e.g. Newsletter theme) + - Fixed: PHP Fatal error when there isn't a proper WP_Post object in UM User Profile > Posts loop + - Fixed: Account styles + - Fixed: Saving `um_form_version` postmeta + +* Templates required update: + + - profile/posts-single.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.8.1: December 20, 2023 = + +* Enhancements: + + - Updated: Twitter texts to X + - Added: Safeguards against clickjacking attacks on UM Forms + +* Bugfixes: + + - Fixed: Displaying notice to avoid using wrong symbols + - Fixed: UM > Settings button styles + - Fixed: Error notice when creating page via extensions + - Fixed: Workaround for Cropper.JS if UM.frontend.cropper.obj undefined (Cropper hasn't been properly inited for UM objects) + - Fixed: The visibility of sub-items of hidden menu items + += 2.8.0: December 11, 2023 = + +* Enhancements: + + - Refactored: wp-admin assets. Separated or merged some file based on the wp-admin screens + - Tweak: SASS pre-processor is used for wp-admin styles. + - Tweak: Using minified JS and CSS in wp-admin and frontend assets + - Tweak: Added PHP class UM()->admin()->screen() for screen control in wp-admin + - Updated: jquery-ui styles to 1.13.2 version. Prefixed with .um class. + - Updated: Cropper.JS to 1.6.1 version + - Note: Select2.JS version 4.0.13 + - Refreshed: Tipsy.JS to 1.0.0a version. Removed custom changes and restored library base code + - Refreshed: Raty.JS to 2.6.0 version. Restored library base code + - Refreshed: Pickadate.JS to 3.6.2 version. Restored library base code + - Updated: Used `um-tip-{x}` classes to make Tipsy.JS initialization commonly for wp-admin and frontend. + - Updated: wp-admin forms class and render icon type field + - Updated: Using `custom_submitdiv` on the UM Form and UM Member Directory screen to avoid custom styling for unnecessary metabox functionality. Just to render the necessary metabox content with only submission tools. + +* Bugfixes: + + - Fixed: Using fields with numeric keys in Form Builder + - Fixed: Pickadate.JS (datetime picker) localizations using + - Fixed: PHP notices on the SiteHealth and Form Builder pages + - Fixed: Using 'um_user_permissions_filter' hook and it's arguments. + +* Deprecated: + + - Removed Simplebar.JS library in Ultimate Member core. It's used only in extensions. + - Removed outdated styles and scripts for 1.3.x first install page + - `UM()->admin()->enqueue()->js_url` param. Please use `UM()->admin()->enqueue()::get_url( 'js' );` or `self::get_url( 'js' );` instead + - `UM()->admin()->enqueue()->css_url` param. Please use `UM()->admin()->enqueue()::get_url( 'css' );` or `self::get_url( 'js' );` instead + - `UM()->frontend()->enqueue()->js_url` param. Please use `UM()->frontend()->enqueue()::get_url( 'js' );` or `self::get_url( 'js' );` instead + - `UM()->frontend()->enqueue()->css_url` param. Please use `UM()->frontend()->enqueue()::get_url( 'css' );` or `self::get_url( 'js' );` instead + - Fully `UM()->permalinks()->um_rel_canonical_()` function. Because since version 2.1.7 there is used `um_profile_remove_wpseo();` alternative + - Fully `UM()->permalinks()->admin_act_url()` function. Since update for wp-admin links when there is nonce this function isn't used + - Fully `UM()->admin()->enqueue()->front_js_baseurl` param. + - Fully `UM()->admin()->enqueue()->front_css_baseurl` param. + - Fully `UM()->admin()->enqueue()->post_page` param. + - Fully `UM()->frontend()->enqueue()->load_google_charts()` function. Outdated. + - Fully `UM()->frontend()->enqueue()->load_fileupload()` function. Used scripts/styles dependencies to load script in the necessary place. + - Fully `UM()->frontend()->enqueue()->load_datetimepicker()` function. Used scripts/styles dependencies to load script in the necessary place. + - Fully `UM()->frontend()->enqueue()->load_scrollbar()` function. Outdated + - Fully `UM()->frontend()->enqueue()->load_imagecrop()` function. Used scripts/styles dependencies to load script in the necessary place. + - `UM()->is_um_screen()` function. Please use `UM()->admin()->screen()->is_own_screen()` instead + - `UM()->is_plugin_post_type()` function. Please use `UM()->admin()->screen()->is_own_post_type()` instead + - `UM()->is_restricted_entity()` function. Please use `UM()->admin()->screen()->is_restricted_entity()` instead + - `UM()->cpt_list()` function. Please use `UM()->common()->cpt()->get_list()` instead + - `um-admin-clear` CSS class. It duplicates WordPress native `clear`. Using WordPress native instead. + - `um-admin-tipsy-{x}` classes to make Tipsy.JS initialization commonly for wp-admin and frontend by `um-tip-{x}` class. + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.7.0: October 11, 2023 = + +* Enhancements: + + - Added: Site Health sections + - Added: oEmbed field type + - Added: YouTube field type supports YouTube Shorts links + - Added: Profile permalink base options: Unique hash, Custom usermeta + - Added: UM Form meta `um_form_version` for legacy support in the future + - Added: Setting "Deleting user comments after deleting a user" for WordPress native logic workaround + - Added: `aria-invalid` and `aria-errormessage` attributes to the fields on UM Forms + - Updated: Structure for enqueue assets PHP classes + - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) + +* Bugfixes: + + - Fixed: Member directory search query escaping process + - Fixed: Added 'ID' metakey to the blacklist. It's not possible to create field with 'ID' metakey to avoid the conflict + - Fixed: Add/Edit Field metabox and "Field Icon", "Conditional logic" fields + - Fixed: Init `jquery-slider-ui` script/style on the block editor page + - Fixed: Displaying "Notifications Account Tab" setting + - Fixed: Displaying Post Date on the User Profile > Posts tab based on this [article](https://make.wordpress.org/core/2019/09/23/date-time-improvements-wp-5-3/) + - Fixed: Small PHP warning, notices and typos + +* Deprecated: + + - `UM()->enqueue()` use `UM()->frontend()->enqueue()` method + - `UM()->admin_enqueue()` use `UM()->admin()->enqueue()` method + - `UM()->admin_enqueue()->suffix` property use `UM()->frontend()->enqueue()::get_suffix()` + - `UM()->admin()->enqueue()->suffix` property use `UM()->frontend()->enqueue()::get_suffix()` + - Changed directories for the fonts (fonticons + raty), and JS/CSS files related to libs `jquery-ui`, `raty`, `select2`, `tipsy`, `fonticons (FontAwesome + Ionicons)` + +* Templates required update: + + - account.php + - login.php + - password-change.php + - password-reset.php + - register.php + - profile/posts-single.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.6.11: September 06, 2023 = + +* Bugfixes: + + - Fixed: Empty mail From data when there isn't set an option + - Fixed: Nonce validation for the admin actions handler + - Fixed: REST API endpoint List Pages redirecting to the homepage + - Fixed: Standardize the 'editable' attribute for the UM fields and hooks that can extend these fields + - Fixed: Redirection from default WordPress registration to UM registration page (if it's not a published) + += 2.6.10: August 17, 2023 = + +* Enhancements: + + - Added: 'um_can_view_profile' hook to operate with profile privacy + - Added: 'um_member_directory_core_search_fields' hook to operate with core searching fields in member directory search + - Tweak: Standardize the condition for checking not editable fields to `empty( $data['editable'] )` + - Tweak: Unified `UM()->fields()->editing` and `UM()->fields()->viewing` to bool variables use true|false in conditions to make `===` or `!==` comparing + - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) + +* Bugfixes: + + - Fixed: Restriction settings handler when there isn't a WP_Post in query. PHP notices in some cases when WP query is not canonical + - Fixed: User description (Biography) field conflict with validation (max chars) in both cases when HTML can be used or not. Case when there are 2 biography fields are displayed on the profile (header + form field) + - Fixed: Displaying WordPress native registration errors when unique username|email validation is disabled + - Fixed: Make links clickable in the Registration Details + - Fixed: WP_Users_Query on wp-admin > Users screen + - Fixed: Performance for `um_get_form_fields` hook + - Fixed: Admin Modal JS library conflict with bootstrap.js + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.6.9: July 26, 2023 = + +* Enhancements: + + - Added: Compatibility with UM:Stripe extension + - Added: Show/hide password button for toggle password visibility + - Added: JS scripts for syncing biography fields if there are the 1st field in the profile header and the 2nd field in the profile form + +* Bugfixes: + + - Fixed: Using allowed hosts for safe redirect after profile deletion + - Fixed: Nonce validation for the admin actions handler + - Fixed: Using singleton for UM Forms and UM Account shortcodes. Empty pages issue + - Fixed: PHP errors in admin notices + - Fixed: PHP errors on UM Profile update when there is multiselect field + - Fixed: UM Form and UM Member Directories titles un-slashed. Please re-update the entities where you have extra-slashes + - Fixed: Maximum allowed words option for textarea where you may insert HTML tags. Ignore HTML tags symbols when count + - Fixed: Sanitize for fields (Min characters, Max characters, etc.) where can be empty string or absint value + +* Templates required update: + + - profile.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.6.8: July 19, 2023 = + +* Enhancements: + + - Added: Secure settings. [Read more](https://docs.ultimatemember.com/article/1869-security-feature) + - Added: Admin notices about possible security issues. For example, regarding the roles with which the user can register on the site + - Added: `um_edit_profile_url` hook for force changing user profile edit URL + - Added: Additional hook attributes to 'um_reset_password_errors_hook' and 'um_reset_password_process_hook' + - Added: $form_data attribute to 'um_before_save_registration_details' hook + - Added: `um_safe_redirect()` function for handle `wp_safe_redirect()` function with new the "Allowed hosts for safe redirect" setting + - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) + +* Bugfixes: + + - Fixed: Updating user description if there isn't custom field on profile form, but field is displayed on profile top + - Fixed: Delete Row and Sub-Row actions in UM Form Builder. Avoid cases when fields from rows and sub-rows are still in form after delete their parents rows + - Fixed: Ultimate Member WP Cron schedule events starting time. Daily event starts since 12:00AM for now. The similar for weekly and twice-daily events + - Fixed: Custom sorting label issue on the Member Directory header + - Fixed: Disabled not-editable fields on UM Forms + - Fixed: Disabled fields attribute on UM Forms + - Fixed: Registration with empty role. Set default if role fields on the form are empty when form is submitted + - Fixed: Admin notices after UM actions has unique key with 'um_' prefix for now + - Fixed: Escaping form errors. It used `esc_html()` but now there is `wp_kses()` + - Fixed: Stop render 2 similar shortcodes on the same page (e.g. 2 login forms with the same `form_id`). To return back use [`um_ultimatemember_shortcode_disable_singleton`](https://ultimatemember.github.io/ultimatemember/hooks/um_ultimatemember_shortcode_disable_singleton.html) hook + - Fixed: Stop render Ultimate Member forms (Login, Profile, Registration, Member Directory) on the predefined Account page + - Fixed: Using blocks with Ultimate Member shortcodes on the predefined Ultimate Member pages + - Fixed: Using some specific functions which cannot exist if PHP modules are disabled + +* Deprecated: + + - Deprecated: Unnecessary `um_multiselect_option_value` hook + +* Templates required update: + + - members.php + += 2.6.7: July 1, 2023 = + +* Bugfixes: + + - Fixed: A privilege escalation vulnerability used through UM Forms. Known in the wild that vulnerability allowed strangers to create administrator-level WordPress users. Please update immediately and check all administrator-level users on your website. + - Fixed: Displaying fields on Account page > Privacy > Member directory settings + - Fixed: Allowed types for the file field + - Fixed: Disabled weekdays for the datepicker field + += 2.6.6: June 29, 2023 = + +* Bugfixes: + + - Fixed: Password Confirm field and validation + - Fixed: Form Builder row editing + - Fixed: Spotify URL user URL display on user profile + - Fixed: Spotify URL validation + += 2.6.5: June 28, 2023 = + +* Enhancements: + + - Removed: `extract()` function and increase supporting WordPress Code Standards + - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) + +* Bugfixes: + + - Fixed: A privilege escalation vulnerability used through UM Forms. Known in the wild that vulnerability allowed strangers to create administrator-level WordPress users. Please update immediately and check all administrator-level users on your website. + += 2.6.4: June 27, 2023 = + +* Enhancements: + + - Added: Avoid using `extract()` function and increase supporting WordPress Code Standards + +* Bugfixes: + + - Fixed: PHP8.2 PHP errors (deprecated, warnings, etc.) + - Fixed: Using `str_contains()` in template override + - Fixed: Override templates and custom path for 'members-grid.php', 'members-header.php', 'members-list.php', 'members-pagination.php', 'searchform.php', 'login-to-view.php', 'profile/comments.php', 'profile/comments-single.php', 'profile/posts.php', 'profile/posts-single.php', 'modal/um_upload_single.php', 'modal/um_view_photo.php' template files + - Fixed: Custom emails data "--- UM Email HTML Templates ---" in Install info + += 2.6.3: June 14, 2023 = + +* Enhancements: + + - Added: `um_profile_menu_link_{$id}_attrs` hook for changing link attributes + - Added: `get_member_directory_id()` function for getting member directory ID based on page ID + - Added: The "Order" and "Data type" settings for custom sorting fields based on metakey in Member Directory + - Added: New hooks `um_profile_permalink`,`um_external_profile_url` + - Added: Users dropdown field to Admin Forms class + - Added: Spotify URL field type + - Added: New developer docs [here](http://ultimatemember.github.io/ultimatemember/). It will be upgraded from version to version + +* Bugfixes: + + - Fixed: PHP8.2 PHP errors (deprecated, warnings, etc.) + - Fixed: Filters visibility on member directory page based on public or private visibility for filter's field + - Fixed: Incorrect Member Directory numerical sorting order + - Fixed: wp_editor() doesn't work correctly in content restriction settings for Mac users + - Fixed: Profile links when WPML plugin is active + - Fixed: ACF and UM blocks conflict + - Fixed: `UM()->mail()->locate_template()` function's visibility + +* Deprecated: + + - Deprecated: `um_localize_permalink_filter`. Use `post_link` instead + +* Templates required update: + + - members.php + += 2.6.2: May 31, 2023 = + +* Bugfixes: + + - Fixed: Email notifications sending + - Fixed: File and Image uploaders and allowed types data for them + - Fixed: Content field-type editor in wp-admin Form Builder + - Fixed: Image and File uploaders max size saving in wp-admin Form Builder + += 2.6.1: May 29, 2023 = + +* Enhancements: + + - Added: Override templates versioning utility for wp-admin + - Added: Style and class attributes to `info_text` field type in settings + - Added: Emails to install info + - Added: 'um_email_get_template_file_path' hook + - Added: Merging data passed with original field data when `edit_field()` function running + - Added: loading="lazy" for avatars and cover photos + - Tweak: Changed Discord account validation + - Tweak: Changes the structure for the Gutenberg blocks' scripts and way of registration + - Tweak: Removed `filter_input` function using + +* Bugfixes: + + - Fixed: Removed the hidden in UI taxonomies from the Access > Enable the "Content Restriction" settings for taxonomies setting + - Fixed: Dynamically declared variables inside the classes for PHP8 installations + - Fixed: Added wpnonce attribute for duplicate UM Form link + - Fixed: Sanitize restriction messages when Gutenberg block is restricted + - Fixed: Login form error class vulnerability + +* All templates required update. Please add the version comments to your custom templates in themes + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.6.0: March 29, 2023 = + +* Enhancements: + + - Added: Hook arguments ($form_id, $not_searched) to 'um_members_directory_head' + - Added: Using user locale `get_user_locale()` for localization with the 1st priority + - Added: Hooks to change the profile SEO image: 'um_profile_dynamic_meta_image_size', 'um_profile_dynamic_meta_image_type' + - Added: Filter for making 3rd-party roles editable through Ultimate Member interfaces. Use 'um_extend_editable_roles' and pass there an array of role keys( e.g. 'editor', 'administrator', etc. ) + +* Bugfixes: + + - Fixed: Major issues with the Member Directory search line + - Fixed: Social links (Twitch, TikTok, Reddit) colors in profile header + - Fixed: Exclude registered date field from editable fields + - Fixed: Create the custom table for usermeta if does not exists + - Fixed: Locale loading time and hook for that + - Fixed: Used `wp_unslash()` for input POST data on Change Password + - Fixed: Role setting "Avoid indexing profile by search engines" + - Fixed: Date Picker field value format for 3rd-party integration meta fields + - Fixed: Last login timestamp being lost in the users cache + - Fixed: Textdomain typos + - Fixed: Small PHP warnings and notices + +* Deprecated: + + - Deprecated: VKontakte and Google+ predefined fields. VKontakte and Google+ fields validation changed to just URL validation. + +* Templates required update: + - members.php + += 2.5.4: February 17, 2023 = + +* Enhancements: + + - Added: TikTok, Twitch and Reddit fields + - Added: Handler of restriction settings for blog page + - Added: Support of the `` inside textarea with enabled the "HTML using" option + - Added: 'um_get_field_date' hook for filtering date fields + - Added: `UM()->get_allowed_html()` function for using it inside wp_kses allowed HTML tags + +* Bugfixes: + + - Fixed: Redirect to some links when content is restricted. Using `esc_url_raw()` instead of `esc_url()` for redirect to URLs inside class-access.php + - Fixed: Handle restriction settings for attachments, later hook is used for checking capabilities through `current_user_can()` + - Fixed: Honeypot triggering in password reset, when not set + - Fixed: Small PHP notices and warnings + += 2.5.3: December 19, 2022 = + +* Bugfixes: + + - Fixed: Plugin upgrade DB initialization and PHP Fatal Error. + += 2.5.2: December 14, 2022 = + +* Enhancements: + + - Added: Custom dropdown callback functions security enhancements. Avoid using blacklisted functions through namespace or uppercase format + - Added: Validation for upgrade package in wp-admin + - Added: `Change Password request limit` option for prevent from any brute-force attacks or password guessing with the form + - Added: Strong password checking for not using username|email inside the password + - Added: `um_custom_authenticate_error_codes` hook for handling 3rd-party login errors on UM invalid form + +* Bugfixes: + + - Fixed: Some texts sanitizing + - Fixed: PHP Error in url-type field on UM Forms + - Fixed: Using `wp_mkdir` to avoid the filesystem conflict when copy email template to theme + - Fixed: Password Reset URL generating + - Fixed: Multiple users approve + - Fixed: Using regular URL-type field for displaying + +* Templates required update: + - members.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.5.1: October 26, 2022 = + +* Enhancements: + + - Added: Custom fields callbacks blacklist. Use `um_dropdown_options_source_blacklist` filter for adding your custom functions to the custom callbacks blacklist. By default there are all PHP internal functions. + +* Bugfixes: + + - Fixed: Posts' restriction that is based on term restriction settings + - Fixed: Issue with class name in checkbox and radio. Class name being 'activeright' instead of 'active right' + - Fixed: Admin upgrade scripts and upgrades pack validation + - Fixed: Directory traversal vulnerabilities + - Fixed: Destroying user sessions after changing "Approved" status to something else (e.g. deactivated) + - Fixed: Conflict when `wp_get_current_user()` not exists. Transferred restriction settings callbacks to `plugins_loaded` hook + - Fixed: Restriction post displaying when 404 is enabled and old restiction logic isn't active + - Fixed: PHP warning when nav menu is empty + - Fixed: Disable auto-login after user is registered by Administrator and UM Registration form + - Fixed: Some typos errors + - Fixed: Using an apostrophe symbols in emails for registration and login both + - Fixed: Sanitizing YouTube links. Applying both https://youtu.be/xxxxxxx and https://youtube.com/xxxxxxx links + +* Deprecated: + + - Removed: Outdated setting using in code (force_display_name_capitlized). Moved the functionality to extended [repo](https://github.com/ultimatemember/Extended/tree/main/um-capitalize-name#readme) + += 2.5.0: August 17, 2022 = + +* Enhancements: + + - Added: Input type "tel" using for the "Mobile Number" and "Phone Number" fields + +* Bugfixes: + + - Fixed: Performance issue on wp-admin Users screen. Queries were replaced to the cache transient values + - Fixed: Privacy policy displaying when there are 2 registration forms on the same page + - Fixed: Password Reset process via Ultimate Member - Password Reset form. Reset password links' arguments changed to the same view as WordPress native has. Password Reset available for the same cases as native WordPress Password Reset has + - Fixed: Sanitizing for the Info Text field-type in wp-admin forms. Needed for the proper 3rd-party integrations + - Fixed: Displaying the filters' titles on the Member Directory pages + +* Deprecated: + + - `UM()->query()->get_users_by_status()` without alternativities. It's unused since 2.5.0. Will be removed since 2.7.0 + - `UM()->user()->get_pending_users_count()`. Use `UM()->query()->get_pending_users_count()` instead. It's unused since 2.5.0. Will be removed since 2.7.0 + - `UM()->user()->remove_cached_queue()` without alternativities. It's unused since 2.5.0. Will be removed since 2.7.0 + +* Templates required update: + - password-change.php + - password-reset.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.4.2: July 14, 2022 = + +* Bugfixes: + + - Fixed: Member Directory vulnerabilities + - Fixed: 3rd-party integration with profile tabs and ability to show edit profile form on the 3rd-party profile tab + - Fixed: PHP fatal error on unset + - Fixed: select2 style conflicts with 3rd-party plugins + += 2.4.1: June 13, 2022 = + +* Enhancements: + + - Added: Number-type Ultimate Member custom fields to the list of the sorting fields on the member directory + +* Bugfixes: + + - Fixed: XSS issue related to the JS confirmation and links with JS code inside + - Fixed: PHP error when `um_options` option in wp_options table doesn't exist or has wrong format + - Fixed: select2 styles for RTL languages + - Fixed: Using slashes in the `Choices callback` setting for the dropdown/multi-select fields. It's for the using PHP namespaces + - Fixed: Deleting `um_member_directory_data` user meta when user is deleted + - Fixed: Using special chars inside the password and avoid using "\" symbol (WordPress native logic) + - Fixed: Conflict when `wp_get_current_user()` not exists + - Fixed: Changed hook for member directory variables initialization for getting ability to use Ultimate Member hooks for customizing these variables via theme + - Fixed: Remove a redundant WP_Users_Query when getting empty `account_status` users + += 2.4.0: June 1, 2022 = + +* Enhancements: + + - Added: "Allow external link redirect confirm" setting for the displaying JS.confirm alert before redirect to external link from User Profile links + - Added: "Allowed Choice Callbacks" setting for the security enhancements + +* Bugfixes: + + - Fixed: PHP warning when nav menu is empty + - Fixed: Security issue related to the User Description field + - Fixed: Security issue related to the [um_loggedin] shortcode + - Fixed: Using $current_screen without checking for existence + - Fixed: `remove_unused_uploads()` function for some PHP installations + += 2.3.2: April 21, 2022 = + +* Enhancements: + + - Added: wp-admin notice with reminder about locking WordPress native registration for guests + - Added: Users dropdown field for Ultimate Member settings fields in wp-admin. It supports AJAX lazy loading + - Added: JS confirm when redirection from User Profile links to the 3rd-party URL + +* Bugfixes: + + - Fixed: PHP warning when there aren't proper user while login + - Fixed: Removing UM custom capabilities from global $wp_roles when uninstall + - Fixed: Removing UM custom roles from user roles after uninstall + - Fixed: Issue with echo XSS on User Profile + - Fixed: Sanitizing for the checkbox, radio, multiselect fields for PHP8 installations + +* Deprecated: + + - `um_whitelisted_wpadmin_access` hook and `wpadmin_allow_ips` option. They were unused and redundant since the 2.x version + += 2.3.1: February 9, 2022 = + +* Enhancements: + + - Added: wp-admin notice on the Settings page when settings have been changed (#963) + - Added: WP Blocks restriction settings for the blocks (templates/nav-menu) on the FSE pages + - Added: UM-specific query_var for UM additional Users_Query on users.php screen in wp-admin. `um_custom_user_query` = true + - Added: Ability for dropdown.js to use it inside parent wrapper (not only document.body) + - Changed: Using WP Cron schedules. Un-schedule events after plugin deactivation + - Removed: `um_check_extensions_licenses` and replaced it to `um_daily_scheduled_events` event + +* Bugfixes: + + - Fixed: "Can user edit this field?" fields' option for the file/image upload field-types (#958) + - Fixed: Using uppercase symbols in the "Blocked Email Addresses" and "Blacklist Words" blacklists settings (#962) + - Fixed: PHP warning related to the Ultimate Member custom fields without type + - Fixed: Some typos in the labels (#975) + - Fixed: UX issue with wrong text on the admin notice about upgrade + - Fixed: UX issue with Blacklist Words and Blocked Email settings labels. Added a small description about per line separation (#962) + - Fixed: Sorting the Extensions settings sections + += 2.3.0: December 20, 2021 = + +* Enhancements: + + - Added: WhatsApp, Telegram, Discord, Viber messengers predefined fields. + - Added: Callback for deleting the custom field data from member direcroty settings when this custom field has been deleted in Form Builder. + - Added: 'um_account_active_tab_inited' JS hook. + - Updated: Require a strong password option (`Ultimate Member > Settings > General > Users > Require a strong password?`) to make it common for all Ultimate Member forms. Renamed option key from `reset_require_strongpass` to `require_strongpass`. + - Updated: Form errors texts on the login/password reset forms. Made them secure. + - Deprecated: `Ultimate Member > Settings > General > Account > Require a strong password?` option and merged with `Ultimate Member > Settings > General > Users > Require a strong password?` option. + +* Bugfixes: + + - Fixed: "Clear All" button for the filters with "&" symbol in the label. + - Fixed: Uninstall process when delete UM data. Avoid the issue when 3rd-party pages that had been selected as UM page are removed on UM uninstall. + - Fixed: Header meta for the Twitter Card. If the user has twitter field filled then will be filled by this value. + - Fixed: Member directory a slider filter's label displaying. It uses the filled label for now. + - Fixed: SkypeID field validation. Also all SkypeID fields on your forms changed type from `url` to `text`. SkypeID supports nicknames or https://join.skype.com/{hash} links. + - Fixed: Typos in Account > Privacy tab texts related to Download/Erase the user data. + - Fixed: Some typos in the fields' labels. + - Fixed: "false" display name in the member directory. It displays empty for now if the user hasn't display name. + - Fixed: `UM()->clean_array()` function. + - Fixed: LinkedIn field URL. Added ability to display the organization URL. + - Fixed: Canonical link of the user profile if WPML plugin is active. + - Fixed: Replacing placeholders in nav menus. Used an earlier hook for filtering items before generating HTML and avoided issues with raw, not-escaped HTML inside tags' attributes. + +* Templates required update: + - members-grid.php + - members-list.php + - password-reset.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.2.5: September 22, 2021 = + +* Enhancements: + + - Added: Ability to insert SoundCloud track URL instead of Track ID + - Added: Settings for the password min/max length (Ultimate Member > Settings > Users) + +* Bugfixes: + + - Fixed: Invalid role keys on the role list-table + role edit screen (case when latin symbols used with not UTF-8 symbols) + - Fixed: Restriction logic and archive lists (+ nav menu bar) with active "Disable pre-queries for restriction content logic" option + - Fixed: Restriction settings fields conditions on wp-admin screens + - Fixed: Account `user_login` field validation removed as redundant. The field is disabled and not used in code flow + - Fixed: `display_name` data update after First + Last name fields edition on the Account page + - Fixed: Password length validation on the Account page and Password Reset page + - Fixed: Using custom fields from multi-select dropdowns for user's `Display Name`. Unserialized custom field's values + += 2.2.4: August 27, 2021 = + +* Bugfixes: + + - Fixed: Hiding comments feed for pages with active comments + - Fixed: Changing the post title to the restricted value while displaying in the loop that uses direct `post_title` variable + - Fixed: PHP errors related to not passed function attributes from 3rd-party plugins or themes when using WP native hooks + - Fixed: Handling the login form errors via \WP_Error + += 2.2.3: August 25, 2021 = + +* Enhancements: + + - Added: 'um_ignore_restricted_title' hook for workaround show post title of the restricted post + - Added: Disable pre-queries for restriction content logic ('disable_restriction_pre_queries') option for backward compatibility with business logic where 404 error for restricted content isn't a good way + - Added: Replace the restricted Post Title ('restricted_post_title_replace') option for ability to disable restricted post's title replace + +* Bugfixes: + + - Fixed: `pre_get_terms` callback to avoid the conflicts with other terms queries + - Fixed: Terms query and global access settings on PHP8 installations + - Fixed: Member directory dropdown filters where options contain `&` symbol + - Fixed: Displaying 404 error for the restricted Media + - Fixed: Displaying 'Login as this user' action on the user profile + - Fixed: Sanitizing of the social links fields (e.g. Twitter, Facebook, etc.) + - Fixed: Visibility of a restricted taxonomy page in the nav menu + - Fixed: Sanitizing key for the drag&drop action + - Fixed: Sanitizing the description field with allowed HTML inside + - Fixed: The "Assignment to constant variable" JS error on some sites + - Fixed: Keep description formatting in a view mode + - Fixed: Profile form nonce handling, security enhancement + - Fixed: `um_edit_profile_url()`` function and added $user_id attribute + - Optimized: Restriction content handlers, avoid queries duplicates or unnecessary queries + += 2.2.2: August 3, 2021 = + +* Bugfixes: + + - Fixed: `is_restricted()` functions in class-access.php. Avoid using object as array offset + += 2.2.1: August 2, 2021 = + +* Enhancements: + + - Added: Extended callback functions for sanitizing data in wp-admin forms fields + - Added: Restricted Access Post Title setting + +* Bugfixes: + + - Fixed: Restriction settings and related queries (comments, archives, recent posts, post navigation, etc.) + - Fixed: Sanitizing `max-width` value of the Login/Registration/Profile form settings + - Fixed: Sanitizing `in_group` field's data + - Fixed: Restriction settings related with `Hide in queries` + - Fixed: Restriction settings and CPU performance issues on some installations + - Fixed: Form meta settings and handling them on PHP8 installations + - Fixed: Make it clearer the restriction settings form labels + += 2.2.0: July 20, 2021 = + +* Enhancements: + + - Added: Sanitizing handlers to the Ultimate Member > Settings forms' fields + - Added: Sanitizing handlers to the Ultimate Member > User Role Add/Edit forms' fields + - Added: Sanitizing handlers to the Ultimate Member > Forms forms' fields + - Added: Sanitizing handlers to the Ultimate Member > Forms > Add Field/Edit Field forms' fields + - Added: Sanitizing handlers to the Ultimate Member > User Roles forms' fields + - Added: Sanitizing handlers to the Restriction Content forms' fields in the posts/pages/menus additional fields + - Added: Sanitizing handlers to the all (Login/Registration/Profile/Account) frontend forms' fields + - Added: Custom placeholder setting for the Confirm Password field + +* Bugfixes: + + - Fixed: Content restriction settings using in Avada theme with active page headers + - Fixed: Content restriction (CPT + Terms). Avoid displaying comments if the post is restricted + - Fixed: Content restriction (CPT + Terms). Avoid displaying comments and posts feed + - Fixed: Content restriction (CPT + Terms). Displaying the proper count of the posts. Restricted are excluded + - Fixed: Saving and displaying settings on the UM > Settings > Access screen + - Fixed: Saving and displaying default Member Directory settings + - Fixed: Minor PHP warnings on registration data preview + - Fixed: Member directory slider filter-type query and results + - Fixed: Uploader filename displaying + +* Tweaks: + + - WordPress 5.8 compatibility. Widgets screen changes based on the new features with Legacy Widget block + +* Templates required update: + - members.php + - password-reset.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.1.21: June 17, 2021 = + +* Enhancements: + - Added: `um_scripts.max_upload_size` localized variable getting from `wp_max_upload_size()` + - Updated: dropdown.js library to make the stable working + +* Bugfixes: + - Fixed: Displaying different profile form shortcodes with different role visibility settings on the same page + - Fixed: Displaying avatar on the logout page + - Fixed: Role meta sanitizing and related XSS vulnerability + +* Templates required update: + - logout.php + - members.php + - members-list.php + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade + += 2.1.20: May 7, 2021 = + +* Enhancements: + - Added: Hook `um_registration_for_loggedin_users` to unlock the ability to add new users through the registration form + - Added: Filter hook 'um_change_usermeta_for_update' for extending `$to_update` usermeta array after all profile fields validations + - Added: Filter hook 'um_profile_tabs_privacy_list' and 'um_profile_menu_can_view_tab' for extending privacy options for Profile Tabs + +* Bugfixes: + - Fixed: XSS vulnerability when getting user profile URL + - Fixed: Temp directory size calculation + += 2.1.19: April 20, 2021 = + +* Bugfixes: + - Fixed: Endless JS loop when filtering on Member Directory page + += 2.1.18: April 19, 2021 = + +* Bugfixes: + - Fixed: Endless JS loop when filtering on Member Directory page + - Fixed: Regular expression for registration form and username field (added ability to use spaces) (#812) + += 2.1.17: April 14, 2021 = + +* Enhancements: + - Added: Activation link expiration setting (#803) + - Added: 'Owner and specific roles' privacy type for the Profile tabs (#773) + - Added: Hooks `um_before_email_notification_sending` and `um_after_email_notification_sending` regarding #743 pull-request + - Added: Hooks for integration member directory filters with different conditions for query to DB + +* Bugfixes: + - Fixed: Editing private profiles capability. Removed the priority for "Can edit other member accounts?" capability when the account is private. (#805) + - Fixed: PHP notice when the admin filtering field has the not array default value (e.g. bool) + - Fixed: The conflict with [Disable Blog](https://wordpress.org/plugins/disable-blog/) plugin regarding this [issue](https://wordpress.org/support/topic/ultimate-member-file-image-download/). `download_routing` callback has the highest priority now. + - Fixed: Fields privacy functionality. This function `um_can_view_field()` has been rewritten (#780) + - Fixed: Fields privacy + form validation functionality. Skip the field's validation that aren't visible on the form based on the privacy settings (#795) + - Fixed: PHP notice in the confirm password label [wp.org thread](https://wordpress.org/support/topic/undefined-index-label-php-notice/) + - Fixed: Confirm password placeholder when label is empty + - Fixed: Permanently deleting form's field (#786) + - Fixed: Default value with comma for checkbox field-type (#729) + - Fixed: Gutenberg blocks conditional settings (#793) + - Fixed: Getting active Profile tab when some of them are hidden + - Fixed: Restricted content message is showing twice and removing header, avoid the conflicts with themes that use 'the_content' filter in header or footer (#799) + - Fixed: "Is required" validation for the multiselect field-type when it's empty on submit + - Fixed: Using 'wp_login_failed' hook, added 2nd parameter required since WordPress 5.4 version (#810) + += 2.1.16: March 10, 2021 = + +* Enhancements: + - Added: General and role setting to avoid indexing users' profiles + - Added: `um_prepare_user_results_array_meta` hook and the 2nd argument for `um_prepare_user_results_array` hook for handle $user_ids based on getting members query + - Added: Change password email when the password has been reset + - Added: jQuery v3 compatibility + - Added: An option "Administrator" in a menu settings to make the menu visible for administrators only + +* Bugfixes: + - Fixed: Creating and removing usermeta data with `password_rst_attempts` key, just update if exists for now + - Fixed: Using 'edit_users' capability instead of 'manage_options' for approve|reject membership + - Fixed: Using 'manage_options' capability instead of 'delete_users' for switching between members + - Fixed: Using myCRED points metakeys in UM usermeta table + - Fixed: Empty icons are shown in the popup "Choose from... available icons" + - Fixed: Member Directory slider filter with NaN or decimal range + - Fixed: PHP notices and warnings + - Fixed: Security vulnerability with User Account page and password field + - Fixed: User creating without username but based on first+last name with not-ASCII symbols + - Fixed: Password reset hash generating more than 1 time + - Fixed: Random order type translation string on the member directory + - Fixed: Resize and compress images when uploading on User Profile images fields or user wall + - Fixed: Displaying more than 1 UM popups on the same page + - Fixed: UM dropdown.js position calculation + - Fixed: Select2 dropdown block position calculation + +* Tweaks: + - Updated: Select2 to 4.0.13 version + += 2.1.15: December 24, 2020 = + +* Bugfixes: + - Fixed: Conditional logic for the form fields without metakeys + += 2.1.14: December 22, 2020 = + +* Enhancements: + - Added a tooltip with meta key name for fields in a form settings + - Added `Administrator` user role to a restriction setting (to make the content visible only for `Administrator` role) + +* Bugfixes: + - Added third parameter $args to the action hook for Profile Tab redirections `um_user_after_updating_profile` + - Fixed issues with fields without metakeys when trying to display them by the hook + - Fixed PHP notices/warnings + += 2.1.13: December 8, 2020 = + +* Enhancements: + + - Added: `um_member_directory_cover_image_size` hook with ability to change the cover photo size on the member directory + - Added: `um_member_directory_avatar_image_size` hook with ability to change the profile photo size on the member directory + - Added: `um_member_directory_get_members_allow` JS hook for 3rd-party integration with the member directory. You could use a time throttle until some data is loaded + - Added: Notice about the fields' conditional logic rules + small CSS enhancements + - Added: Invalid nonce validation on Login and Registration pages instead of wp_die() + - Added: Privacy settings for the Divider field type (#688) + - Added: Ability for the integration with Gutenberg Block restriction settings (extends the block restriction settings via 3rd-party plugins) + - Added: Strings translations + +* Bugfixes: + + - Fixed: Upgrade process on websites where a hosting locks the frequent AJAX requests (added default JS throttle between requests) + - Fixed: Getting page content of the GDPR privacy policies + - Fixed: Password strength validation for Unicode symbols + - Fixed: Issue with apostrophe options in the multiselect/checkbox fields (#689) + - Fixed: Translation for Password field's label + - Fixed: Download Personal Data URL + - Fixed: Vulnerability with timestamp field on UM Forms (the hidden field with name='timestamp' is deprecated) + +* Tweaks: + + - There are changed PHP’s intval(), strval(), floatval(), and boolval() typecasting functions to (int), (string), (float) and (bool) regarding [this doc](https://make.wordpress.org/core/2020/11/20/miscellaneous-developer-focused-changes-in-wordpress-5-6/). + += 2.1.12: October 29, 2020 = + +* Enhancements: + + - Added ratings required notice and warning + +* Bugfixes: + + - Fixed conflict with other plugins with user 'status' in admin + - Fixed security patch for UM forms handlers + - Fixed security patch for handlers on the edit users' roles + - Fixed member directory admin filtering by the field with uppercase in 'key' + - Fixed member directory sorting by the full name + - Fixed registration form with not editable role field + - Fixed PHP notice for the filter without field's label + - Fixed PHP notice on Admin_Form class initialization + - Fixed style of the textarea field + - Fixed Confirm Password field's placeholder + += 2.1.11: October 6, 2020 = + +* Bugfixes: + + - Fixed can_view_profile() function + - Fixed security patch for role change via profile form + - Fixed admin-menu PHP notice + += 2.1.10: September 23, 2020 = + +* Enhancements: + + - Deprecated the Feed widget from Ultimate Member dashboard + +* Bugfixes: + + - Fixed age filter at Member Directory when using WP native usermeta table + - Fixed the role field values at the user profile/registration forms + - Fixed PHP notice when cover photo is empty + - Fixed the conflict issue with Pickadate JS library and their legacy.js functions + - Fixed Gutenberg Blocks descriptions + += 2.1.9: September 9, 2020 = + +* Bugfixes: + + - Fixed security patch for role change via profile form + += 2.1.8: September 2, 2020 = + +* Enhancements: + + - Added dependency functions for extensions: [Ultimate Member - User Notes](https://ultimatemember.com/extensions/user-notes/) & [Ultimate Member - Profile Tabs](https://ultimatemember.com/extensions/profile-tabs/) + - Added unique IDs to the form fields at the Profile's view mode + - Added restrictions for WP > Users list table based on UM Roles capabilities + +* Bugfixes: + + - Removed additional slashes in the UM custom roles titles + - Fixed cleaning user old uploads and integration with Social activity & Groups files + - Fixed Info window fields (hide fields without metakeys) + - Fixed PHP warning in conditional logic function + - Fixed member directory preloader when using a slider filter + - Fixed 'redirect_to' attribute and approving user on registration + - Fixed activate an account via email + += 2.1.7: August 12, 2020 = + +* Enhancements: + + - Added dependency functions for plugins: [Ultimate Member - JobBoardWP integration](https://wordpress.org/plugins/um-jobboardwp) & [JobBoardWP](https://wordpress.org/plugins/jobboardwp) + - Added account privacy setting for the avoiding profile indexation + - Added setting "Change image orientation" based on image EXIF data + - Added setting "Account Deletion without password Custom Text" + +* Bugfixes: + + - Fixed security lacks for 'redirect_to' attributes + - Fixed account submission when change a password + - Fixed updating UM roles metadata (WP capabilities section) when 3rd-party plugins update the caps for the UM roles + - Fixed member directory roles in query (the case when selected some roles, but current user can see another only) + - Fixed member directory sorting + - Fixed member directory list dropdown init after changing view type + - Fixed member directory admin filtering by the 'user_registered' field + - Fixed validation when using HTML in textarea + - Fixed cleaning user old uploads + - Fixed conditional logic for file/image-type fields + - Fixed "get_profile_photo_size" function (avoid PHP notice with array_combine) + - Fixed password reset/change form when other forms are initialized at the same page + - Fixed getting extension updates on multisites + - Fixed the 'wp_authenticate_user' filter's variables (changed username string to WP_User object) + - Fixed SEO link canonical for the profile page + - Fixed displaying error & notice when the text is empty + +* Deprecated: + + - Deprecated JS event 'um_before_modal_removed', use wp.hooks action 'um_before_modal_removed' instead + += 2.1.6: June 1, 2020 = + +* Enhancements: + + - Added The profile page SEO meta tags for OG, Twitter and schema.org + - Added filter to the field's privacy option for the 3rd-party integrations 'um_field_privacy_options' + - Added layout changes to show email notification description in Settings > Email screen + - Added member directory option 'Exclude specific users' + - Added filter for the changing redirect after profile edited 'um_update_profile_redirect_after' + - Added JS filters for conditional logic + - Tweak: apply_shortcodes() function support + - Tweak: nav-menu custom fields using 'wp_nav_menu_item_custom_fields' hook + +* Bugfixes: + + - Fixed custom meta table fields migration (create, edit, remove field actions) + - Fixed wp-login.php and UM login form validation/errors triggers when using email for login + - Fixed profile form duplicates, show only the first form shortcode on the page for the user with selected role + - Fixed creating user uploads directory on registration + - Fixed Role fields validation on registration + - Fixed Erase User Data field on the Account page + - Fixed profile privacy + - Fixed SkypeID field + - Fixed clickable links in the UM forms which are displayed in a modal window + - Fixed disabling select and textarea fields in inactive tabs on Account + - Fixed compatibility with jQuery 3.x and 'load' event + - Fixed some translations + - Small PHP notices fixes + += 2.1.5: April 2, 2020 = + +* Enhancements: + + - Added number field-type to member directory filters + - Changed export/erase personal data in account page + - Sanitizing variables in wp-admin + +* Bugfixes: + + - Fixed PHP notice 'form_id' on account submission + - Fixed birthday range for member directory filter + - Fixed fields visibility when user can edit other users + - Fixed honeypot JS + - Fixed edit mode for Role (Dropdown/Radio) fields (getting editable priority role) + += 2.1.4: February 24, 2020 = + +* Enhancements: + + - Updated select2 JS library to 4.0.12 version + - Added a few member directories PHP and JS filters for 3rd-party integrations + - Added labels for member directories filters to increase Accessibility points in Audit + - Added formatting for submitted data + - Added fields notices functionality + - Added sanitizing $_GET variables in wp-admin side + +* Bugfixes: + + - Fixed activation licenses with sslverify + - Fixed fields' options if they contains spaces in the start and the end of option (added trim) + - Fixed getting range for slider filters + - Fixed 2.1.3-beta3 package upgrade + - Fixed resize image on registration form + - Fixed multiselect field styles + - Fixed issue with not editable fields and their visibility + - Fixed displaying header with member counts + - Fixed JS errors with not defined tinyMCE on Forms builder + - Fixed issues with "key => value" fields (dropdown + multiselect) if 'um_select_options_pair' filter is used + - Fixed social URLs validations + - Fixed Ultimate Member wrapper's visibility on add/edit user page (wp-admin) + - Fixed jQuery-UI library images + - Fixed vulnerability with sanitizing $_POST + - Fixed last login order on member directories when UM metatable is turned on + - Fixed RTL styles at Account page and Member Directory + += 2.1.3: January 21, 2020 = + +* Enhancements: + + - Added sorting by Last & First name + - Added integrations with future extensions + - Added filter for changing the order of options in select-type filter + - Added GDPR template to get overwritten in the theme directory + - Added member directories' custom sorting labels + - Added ability to use custom metatable for faster requests for Member Directories + - Added ability to request Erase or Download user data via Privacy tab at the Account page + - Added an option to set the "Hide profile from directory" option by default + +* Bugfixes: + + - Fixed [um_loggedin] shortcode render with htmlspecialchars_decode + - Fixed checkbox options missing selections with conditional settings + - Fixed vulnerability with uploading cover/profile photo for other user ID + - Fixed integration with WPML for Account and User pages in case if there are different permalinks for different languages for these pages + - Fixed issues with pagination settings + - Fixed search line additional slashes + - Fixed issues with member results JS template + - Fixed getting posts count at the Posts tab for 3rd party integrations + - Fixed member directories' admin filtering + - Fixed issue with reset filters on member directory + - Fixed getting image/file custom fields values in form submission with not validated values + - Fixed JS handlers for select-type filters with callback and parent/child relations + - Fixed um_convert_tags for array-type values + - Fixed small CSS issues + += 2.1.2: December 4, 2019 = + +* Enhancements: + + - Added text-type filters + - Added sorting for filters, tagline and reveal section fields + - Added universal hook for field's wrapper and improve rendering the field wrapper attributes + - Added returning only existed values for select-type filters + - Added checking privacy for custom fields in filters and general search, exclude private fields + - Added Form fields validation for E-mail( not unique ) + - Added $user_id attribute in update profile hooks for proper callbacks + +* Bugfixes: + + - Fixed fields privacy, editable and visibility attributes + - Fixed member directory styles + - Fixed random sorting + - Fixed conflict with 'php_data' variable in admin JS + - Fixed datepicker/timepicker filtering in the member directories + - Fixed initialization of datepicker, timepicker, slider filters when the "Show results only after search/filtration" option is active + - Fixed callback select-type filters handlers on member directories filters bar + - Fixed cover photo thumbnail sizes in member directory + - Fixed Role filter + - Fixed clearing filters with || condition + - Fixed endless recursion in the function um_check_conditions_on_submit() + - Fixed issue that appears if we try to update several plugins at once + - Fixed using different templates for different member directories + - Fixed form previews, added overlay and displayed buttons + - Fixed wp-admin/admin-post.php access issue + += 2.1.1: November 12, 2019 = + +* Bugfixes: + - Fixed admin actions hook + - Fixed JS templates for list and grid view when user metakeys contain "-" symbol + - Fixed JS template list "$show_block" issue + - Fixed member directory search if 'roles_can_search' is set + - Fixed member directory filters bar animation + - Fixed save profile with Last Login field + - Fixed admin builder for profile form, show not editable fields + += 2.1.0: November 11, 2019 = + +* Enhancements: + - Added member directory list view + - Added member directory search bar + - Added member directory filters by range, date and time + - Added AJAXed member directories + - Updated member directories' search engine + - Additional parameter 'user_id' to action hook 'um_user_after_updating_profile' + - Added ability to set profile/cover image sizes from Ultimate Member -> General -> Uploads settings or Original size + - Added ability edit cover photo HTML (e.g. for adding some HTML attributes. See how add srcset attribute based on all generated cover sizes [here](https://docs.ultimatemember.com/article/1519-change-cover-photo-html)) + - Added custom date format for Date Picker field + - Added hook 'um_show_meta_item_html' to customize user meta HTML at User Profile page + - Added "aria-label" attribute in Field icon + +* Bugfixes: + - Optimized usermeta for Account submit security + - Fixed flushing rewrite rules on every page reloading + - Fixed Gmail & Yahoo UTF-8 encoding of email notification subject + - Fixed ajax_resize_image() process + - Fixed country fields values + - Fixed dynamic_profile.php notice + - Fixed integration with WP native admin_post and admin_post_nopriv requests + - Fixed profile image settings + - Fixed profile privacy for not logged in users, if restriction options set for profile page as visible only for logged in and showing message instead of redirect + (it makes the same for {site_url}/user and {site_url}/user/{user_slug} ) + - Fixed security issue on registration form submission when username or email have conditional logic + - Fixed RTL styles issues on user profile and account pages + - Fixed upload profile/cover photos at the profile page, don't apply until the crop finished + - Fixed alphabetical field validation for cyrillic and not UTF-8 symbols + - Fixed user profile validation if username, username or email, password and email fields were added to form + - Fixed user profile preview in admin Form Builder + - Fixed getting templates function for some Windows servers + - Fixed plugin update process for multisites + - Fixed function "um_apply_conditions". An error appears with jQuery v2.1.3 + - Localized um-raty.js library + - Localized strings + += 2.0.56: August 21, 2019 = + +* Enhancements: + - Added security fixes (XSS) + - Added hooks for 3rd party integrations + - Updated Datepicker & Timepicker library from 5.6 to 6.2 version + +* Bugfixes: + - Fixed validation of forms conditional fields at the backend (for the nesting fields) + - Fixed edit profile mode when profile menu is disabled + - Fixed RTL styles and layouts + - Fixed user profile description validation + - Fixed JS errors on some installs + - Fixed ability approve users by Administrator with special capabilities + - Fixed multiselects' retrieval of options from callback function + - Fixed save process and conditional logic for Appearances -> Profile Menu settings section + - Fixed uninstall process + - Fixed is_selected method for some cases + - Fixed form settings fields for default button labels in wp-admin metaboxes + - Fixed generate metakeys for the form's custom fields + - Fixed issue when UM Roles localized as object on Add/Edit User screen + - Fixed PHP notices + += 2.0.55: August 16, 2019 = + +* Bugfixes: + - Fixed profile privacy for not logged in users, if restriction options set for profile page as visible only for logged in + += 2.0.54: July 22, 2019 = + +* Enhancements: + - Added security fixes (XSS) + +* Bugfixes: + - Fixed update process for not UM custom role + - Fixed extensions licenses validation handler + - Fixed profile tabs handlers + += 2.0.53: July 16, 2019 = + +* Enhancements: + - Added option to disable profile avatar uploader + - Moved extensions icons to core + +* Bugfixes: + - Fixed Profile Tabs Privacy settings + - Fixed Notifications Account tab view + - Fixed warnings on validation process + - Fixed slashes in some texts from options + - Fixed callback functions for select and multiselect fields + += 2.0.52: July 11, 2019 = + +* Enhancements: + - Extended hooks for 3rd party integrations + +* Bugfixes: + - Fixed settings labels with CPT & Taxonomies + - Fixed UM Roles create/edit XSS security issue + - Fixed XSS security issue on account upgrade + += 2.0.51: July 09, 2019 = + +* Bugfixes: + - Fixed UM Roles create/edit security issue + += 2.0.50: July 02, 2019 = + +* Enhancements: + - Extended hooks for 3rd party integrations + +* Bugfixes: + - Fixed PHP notices when runs validation + - Fixed loop issue with Profile tabs + - Fixed home page restrictions + += 2.0.49: May 29, 2019 = + +* Enhancements: + - Extended hooks for 3rd party integrations + +* Bugfixes: + - Fixed security vulnerability with registration form + - Fixed the using of deprecated send password hook + += 2.0.48: May 16, 2019 = + +* Enhancements: + - Added an ability to 3rd party integration with cover image actions + +* Bugfixes: + - Fixed ability to edit profile on not predefined Profile Page + += 2.0.47: May 14, 2019 = + +* Bugfixes: + - Fixed save special characters values + - Fixed trim fields options before validation + - Fixed save empty value at Profile Registration form in radio/checkbox/select/multiselect fields + - Fixed displaying empty value of multiselect field at Profile Page + - Fixed cover photo dropdown menus + += 2.0.46: May 10, 2019 = + +* Bugfixes: + - Fixed extensions' upgrader + - Security vulnerabilities on Profile/Registration submit and file/images uploading + - Fixed session clean on logout + += 2.0.45: May 08, 2019 = + +* Bugfixes: + - Fixed issues with Gutenberg scripts and UM blocks + - Security vulnerabilities on Profile/Registration submit and file/images uploading + += 2.0.44: May 08, 2019 = + +* Enhancements: + - Added automatically template saver when you upgrade your theme + - Added default value for Date and Time user profile fields + - Updated Scroll library + - Added REST API v2 class with new query vars. There is an ability to select v1 or v2 for use. For old users v1 is default, for new users v2 + +* Bugfixes: + - Added nocache headers to reset password form + - Email templates saving to child theme, if parent theme already has email template files + - Email templates locate in the default plugin folder with active WPML + - Form builder with some predefined form fields, which had different keys/metakeys (currently use the same) + - Logout redirect with active WPML + - Fixed $_SERVER usage when WP-CLI using + - Extended integration for UM field value + - um_user function avoid loop when 'display name' and 'full name' used + - Restriction options for Terms and access on front-end + - Plugin/Theme upgrader + - Remove duplicate data 'user_login' from metadata + - Replace placeholders duplicates + - Password Reset link regeneration + - Fixed issues with scroll on mobile devices + - Fixed multisite activation + +* Deprecated: + - "Is Account page?" and "Is User page?" options for WPML integration ( because WPML translations works properly ) + += 2.0.43: March 29, 2019 = + +* Bugfixes: + - Fixed Last Login order in Member Directory + += 2.0.42: March 28, 2019 = + +* Enhancements: + - Added option for enable/disable Gutenberg blocks + +* Bugfixes: + - Fixed conflicts with themes, which not support custom Gutenberg blocks via the option + += 2.0.41: March 27, 2019 = + +* Enhancements: + - Added Gutenberg blocks section with Ultimate Member shortcodes + - Clear temp directory on upload process 1 day files old + - Updated custom scrollbar JS library to jQuery 3 support + +* Bugfixes: + - Fixed vulnerability with Reset Password form + - Fixed Edit Row settings + - Fixed save profile fields with 0 values + - Fixed upload photo base URL for Windows servers + - Fixed displaying user Posts at Profile/Posts tab + - Fixed unique filename issue, upload avatar with high case extension + - Fixed member directory filter title + - Fixed duplicate delete user handler + - Fixed sorting by Last Login date for users without meta + - Fixed hook after password reset (issue #532) + - Fixed member directory user role filter + - Fixed restriction content WC Products integration + - Fixed words count for French in user description field + - Fixed is_selected function for dropdown/multi-select/checkbox profile fields + - Fixed disable email field at Edit Profile form via filter (disabled by default) + += 2.0.40: March 12, 2019 = + +* Bugfixes: + - Fixed security issue on user Account Update + += 2.0.39: February 11, 2019 = + +* Enhancements: + - Restored option for disable users cache + - Transposh plugin integration + +* Bugfixes: + - Fixed delete users handlers on single/multisite installs + - Fixed fields labels on member directory + - Fixed profile form cover photo ratio value + - Fixed profile and registration form default field's values + - Fixed "is_selected" function with empty value and default value option + - Fixed member directory notices with disabled metadata + - Fixed textarea profile field formatting + - Fixed registration without username field + - Fixed flush password reset limit after successfully login + - Fixed upload files handlers for avoid the conflicts with other plugins + += 2.0.38: January 10, 2019 = + +* Enhancements: + - Added option to enable Gutenberg Blocks restriction + += 2.0.37: January 8, 2019 = + +* Enhancements: + - Additional Block's restriction options + - Added column to show User Account Status + - Added filter for disabling Gutenberg blocks restriction to avoid themes conflicts + += 2.0.36: January 7, 2019 = + +* Enhancements: + - Added Block's restriction options + - Added compatibility for upcoming User Events extension + +* Bugfixes: + - Fixed Live Preview form at wp-admin + - Fixed tinyMCE editor loading in form builder + - Fixed external function for dropdown options + - Fixed Add New Menu Item handler + - Fixed small notices at frontend + - Fixed a few admin settings fields + - Fixed displaying comments when they are disabled + += 2.0.35: December 9, 2018 = + +* Bugfixes: + - Fixed JS/CSS enqueue at wp-admin + += 2.0.34: December 7, 2018 = + +* Enhancements: + - Added new "Extensions" class for future integrations + +* Bugfixes: + - Fixed logout redirect vulnerability + - Fixed modal window responsive position + - Fixed class autoloader for Windows servers + - Fixed admin forms integration + - Fixed empty value for select2 selectbox + - Fixed unchecked Remember Me by default on login page + - Fixed admin forms esc_attr value + - Fixed admin forms buttons wp_unslash + - Fixed get/clean plugin upgrades on multisites + - Fixed verify nonce on $_GET requests + +* Deprecated: + - removed "UM_TEXTDOMAIN" constant + - removed function UM()->get_ajax_route() for AJAX vulnerability fix + += 2.0.33: November 22, 2018 = + +* Bugfixes: + - Fixed AJAX vulnerabilities + - Fixed delete user email notification + - Fixed profile tabs displaying + += 2.0.32: November 20, 2018 = + +* Bugfixes: + - Added compatibility with PHP7.2 (removed deprecated functions and ini variables) + - Fixed duplicated "redirect_to" field + - Fixed errors on the installs < PHP5.6 + - Fixed download files/images on the installs with the different home URL and site URL + - Fixed unique emails in admin email notifications + - Remove language notice, all translates are available on wp.org + += 2.0.31: November 14, 2018 = + +* Bugfixes: + - Fixed compatibility with JS/CSS cache plugins + += 2.0.30: November 12, 2018 = + +* Bugfixes: + - Fixed crop settings of the big images + - Fixed WPML integration with email notifications + - Fixed uppercase symbols using at profile page slug + - Fixed download files/images with cache + - Fixed download files/images with not closed buffers + - Fixed looping in case if set 'display_name' as custom fields for display name setting + - Fixed cover photo size + - Fixed date time internalization + - Fixed posts pagination for un-logged users + - Fixed conditional JS + - Fixed "um_" prefix for role data + - Added compatibility for upcoming User Bookmarks extension + += 2.0.29: October 8, 2018 = + +* Bugfixes: + - Fixed User Profile Posts pagination + += 2.0.28: October 5, 2018 = + +* Bugfixes: + - Fixed Email notifications + - Fixed Download files/images for multisites + - Fixed Profile/Cover image for multisites + - Fixed XSS vulnerabilities (detected by @Serhack) + - Fixed trim fields on submit forms + - Fixed submitted info + += 2.0.27: October 2, 2018 = + +* Bugfixes: + - Fixed files class + += 2.0.26: October 2, 2018 = + +* Enhancements: + - New files/images downloading process + - Added dependencies with User Photos and Groups extensions + +* Bugfixes: + - File/Image email placeholders after registration form submitting + - File/Image forms fields values on submit/edit + - Fixed multisite file/image upload process + - Fixed clearing old user sessions after the changing a password + - Made reset password process via WP native functions + += 2.0.25: August 20, 2018 = + +* Enhancements: + - Upgrade minified scripts + += 2.0.24: August 15, 2018 = + +* Bugfixes: + - WP native AJAX using + - Force purge temp files dir + += 2.0.23: August 10, 2018 = + +* Bugfixes: + - Fixed File/Image uploader + += 2.0.22: August 9, 2018 = + +* Enhancements: + - Added an ability to filter user's profile slug "um_change_user_profile_slug" + - Added an ability to filter pages for exclude restriction content settings "um_exclude_posts_from_privacy" + +* Bugfixes: + - Fixed callback functions in member directory search + - Fixed Profile Privacy Settings for different languages + - Fixed security vulnerabilities (File/Image uploader) + - Fixed security vulnerabilities (HTML arguments) + - Fixed search in members directory for some cases, when metadata format isn't correct + - Fixed some cases in conditional logic + - Fixed WP Capabilities list for Gravity Forms + - Fixed View Profile capabilities + +* Deprecated: + - Filters "um_before_user_upload", "um_after_user_upload" + += 2.0.21: July 9, 2018 = + +* Bugfixes: + - Fixed search in members directory by User Tags field (other case) + += 2.0.20: July 6, 2018 = + +* Bugfixes: + - Fixed search in members directory by User Tags field + += 2.0.19: July 5, 2018 = + +* Bugfixes: + - Fixed few JS file's full versions + - Fixed search in members directory by multiselect/radio/checkbox field + - Fixed first activation role metadata reset + += 2.0.18: July 4, 2018 = + +* Enhancements: + - Added an ability to create different email templates for each site on multisites installs + - Added major version notice + - Added an ability to make Profile Form visible for 2 or more roles + - Added ability to dismiss some UM notices + - Redesign some parts of field's conditional logic settings + +* Bugfixes: + - Fixed PHP memory limit issue on some installs. Created pseudo-constructor + - Disabled email notification to user, which wasn't approved about delete their account + - Fixed profile tabs privacy + - Fixed default avatars and Gravatar displaying + - Fixed get current URL function + - Fixed admin bar displaying + - Fixed members directory search + - Fixed nav-menu items restriction handlers + - Fixed user displaying on multisite (added 404 error in some cases) + - Fixed XSS at wp-admin settings screen + - Fixed user's "user_login" permalinks + - Fixed user's capabilities ("Edit", "Delete" user) and profile actions displaying + - Fixed field's conditional logic + - Fixed issue with account button ID's duplicates + +* Deprecated: + - REST API user's key option; + += 2.0.17: May 30, 2018 = + +* Enhancements: + - Added UM dashboard widget for getting latest extension's upgrades + +* Bugfixes: + - Fixed User Profile restriction when the user isn't logged in + - Fixed Profile Tabs displaying on desktop/mobile + - Fixed set user status after registration on some installs + - Fixed PHP memory limit issue on some installs with small PHP memory limit + - Fixed PHP validation on submit UM Forms with conditional fields logic + += 2.0.16: May 23, 2018 = + +* Bugfixes: + - Fixed Profile Tabs issues + += 2.0.15: May 22, 2018 = + +* Bugfixes: + - Fixed GDPR min.js script + += 2.0.14: May 22, 2018 = + +* Enhancements: + - Added support for GDPR Personal Data Exporter + - Added support for GDPR Personal Data Eraser + - Added new privacy field to form builder for GDPR consent collection + - Added GDPR privacy policy guide text + - Added GDPR compatibility on delete user process + - Added security to Restricted posts comments + - Added security to custom field type `Password` + - Deprecated time checking spam bot + +* Bugfixes: + - Fixed settings tabs for PHP7.1 + - Fixed issues with Profile Tabs + - Fixed User Avatars + - Fixed set user status on Registration process + - Fixed Account Privacy tab content + += 2.0.13: May 2, 2018 = + +* Bugfixes: + - Fixed and optimized user avatars + - Fixed Profile Menu on some installs + - Fixed fields IDs duplicates + - Fixed cache users count + += 2.0.12: April 30, 2018 = + +* Bugfixes: + - Fixed approving users with "Administrator" role + - Fixed problem with URLs for upload images + - Fixed not UM roles, which start from "um_" symbols + - Fixed content restriction logic + += 2.0.11: April 19, 2018 = + +* Bugfixes: + - Fixed profile form JS + += 2.0.10: April 17, 2018 = + +* Bugfixes: + - Fixed Profile Form field privacy + - Fixed conditional menu logic for 2 different nav menu hooks + - Fixed registration form preview on wp-admin screen + - Restored old CSS settings to "um_old_settings.css" + - Clean user's cache + += 2.0.9: April 15, 2018 = + +* Bugfixes: + - Fixed registration form role + += 2.0.8: April 13, 2018 = + +* Bugfixes: + - Fixed license activation + += 2.0.7: April 13, 2018 = + +* Bugfixes: + - Fixed add rewrite rules for UM pages + - Fixed Profile Form, Registration Form use custom settings and role + - Fixed save settings security + += 2.0.6: April 12, 2018 = + +* Bugfixes: + - Fixed nav-menu content restriction issues for Administrator role + += 2.0.5: April 12, 2018 = + +* Bugfixes: + - Fixed old pre2.0 extensions notices + - Fixed nav-menu content restriction issues + - Fixed lost password URL in UM Login Form + - Fixed restriction message on taxonomy page, which is restricted + += 2.0.4: April 10, 2018 = + +* Enhancements: + - Added activation dependencies for extensions + - Added Licenses checking and changed Licenses page + - Added uninstall.php file for delete permanently all UM settings + - Added ability to register users without WP Registration enabled + - Added visual integration WPML+UM email notifications + - Added Account Upgrade email notification + - Added ability to register users using role field on Registration Form + - Added Account page shortcodes for each tab content + - Changed UM Option View (deprecated/added options) + - Changed UM Roles, optimized for WP native logic + - Changed backend forms/fields to WP native styles + - Changed Content Restriction feature for posts, taxonomies, menus + - Changed Email Notifications settings and using templates logic + - Deprecated Redux Framework + - Deprecated old unusable options + - Deprecated old unusable forms metadata + - Deprecated old unusable member directories metadata + - Deprecated old unusable user roles metadata + - Optimized registration/upgrade profile process (some hook deprecated) + - Optimized some code parts, deprecated some functions + - Updated `FontAwesome` library + - Removed addons to separate extensions + - Created Plugin Updater for getting updates and license details from Shop + - Increased integration abilities, added new hooks (see new Hooks Docs + PHP documentation); + - Integrated plugin activation, user creation processes with multisite + - Make dependencies with extensions + - OOP structure without procedural methods for wp-admin side; + +* Bugfixes: + - Fixed avatars on some SSL installs + - Fixed some vulnerabilities + - Fixed integrations with core/extensions + - Fixed `Edit Profile` button at members directory + - Fixed conditional logic PHP validation and JS validation (for IE,Edge browsers) + - Fixed textdomains for translations + - Fixed integration with Woocommerce, SEO Framework, WPML + - Fixed navigation menu items custom fields (`Mega Menu`, etc. compatibility) + - Fixed theme conflicts with UM js libraries + - Fixed and optimized handlers for user permalinks + - Fixed replace placeholders for users + - Fixed conditional fields logic + - Fixed fields sanitize for remove XSS injections + += 1.3.88: July 25, 2017 = + +* Enhancements: + - Add new filter hook `um_add_user_frontend_submitted` + - Add class for member tagline in directory grid `um-member-tagline-` + - Add recaptcha support and submit button id + - Update extensions page layout + +* Bugfixes: + - Fix Conditional Logic fields + - Fix required field with specific roles in privacy + - Remove wpautop from biography + - Remove notices + += 1.3.87: June 24, 2017 = + +* Bugfixes + - Fix system info + += 1.3.86: June 19, 2017 = + +* Enhancements: + - Update readme.txt + + += 1.3.85: June 19, 2017 = + +* Enhancements: + * Add new filter hook to modify the profile cancel uri for redirection + * `um_edit_profile_cancel_uri` + * Add new filter hook to modify the specific field type's value + * `um_edit_{$type}_field_value` + * Add new filter hook that modies the file name + * `um_upload_file_name` + * Update en_US translation files + +* Bugfixes: + * Fix file clean up with image/file fields on profile update + * Fix text domain slug for wp.org translation compatibility + * Fix change password email notification + * Fix double click submission in registration forms + * Fix custom field role validation + * Fix conditional logic 'content block' field + * Fix conditional logic field operators and visibility + * Fix textarea field sanitation + * Fix system info false positive virus scan results + * Fix field validation for minimum and maximum numeric values + * Fix used custom fields visibility in form builders + * Fix cache user's profile option description + * Fix double click for android device + * Fix png image upload with transparency + * Fix extra slashes in form edit view when invalid input fields occur + * Remove notices + + += 1.3.84: April 18, 2017 = + +* Enhancements: + * Adds new action hooks before and after WP_User_Query. + * `um_user_before_query` + * `um_user_after_query` + * Adds a dismiss link in locale / language translation notices + * Adds correct user profile url in WPML language switcher + * Adds new option to disable name fields in account page + * `UM > Settings > Account > Disable First & Last Name fields` + * Add new filters to modify upload base directories + * `um_multisite_upload_sites_directory` + * `um_multisite_upload_directory` + * Adds new action hook in admin > user edit > Ultimate Member to append any customisation + * `um_user_profile_section` + * Adds H2 for UltimateMember section to Add/Edit User Form + +* Bugfixes + * Fix image url cache filter + * Fix PHP 7.1+ compatibility issues + * Fix UTF8 encoding in form fields + * Fix hide member directory option. + * Fix conditional logic fields. + * Fix login access settings for logged-in users. + * Fix WP role synchronisation on UM role update + * Fix WP authenticate filter hook + * Fix radio and checbox field active state colors when disabled. + * Fix Content Availability conditional fields in edit/add category screens + * Remove notices + += 1.3.83: February 20, 2017 = + +* Enhancements: + * Adds user avatar's alternate text. The default text is set to `display_name` + * Adds new filter hook to modif the user avatar's alternate text. + * `um_avatar_image_alternate_text` + * Set gravatar for newly registered users + * Adds Tag archive page access settings + +* Bugfixes + * Remove pointer cursor from field areas in profile view mode + * Fix profile slug in permalinks + * Fix URL field 'nofollow' issue + * Fix field icons display + * Fix an issue with admin roles in editing fields + * Fix whitepspace issue with Email Address validation + * Fix profile visibility option in member directories + * Fix icon display as label in profile view + * Fix PHP 7.1.1 compatibility + * Fix redirection on update profile slug + * Fix dynamic CSS options in member directory + * Fix edit profile option by specific role + * Fix Vkontakte view + * Remove notices + += 1.3.82: January 31, 2017 = + +* Enhancements: + * Add filter hook to disable secure account fields + * `um_account_secure_fields__enabled` + * Updates ReduxFramework to version 3.6.2 + * Adds a body class in profile/user page for the current loggedin user + * `um-own-profile` + +* Bugfixes + * Fix select/multi-select field options translation + * Fix profiles visibility and access permissions in member directories + * Fix User deletion in mobile browsers + * Fix WPML & PolyLang compatibility issues + * Fix field view and edit restriction + * Fix author name in recent comments widget + * Fix overwrite of multiple image and file uploads with the same filename + * Remove notices + += 1.3.81: January 19, 2017 = + +* Bugfixes + * Fix conditional field option with 'contains' + * Fix WPML compatibility with UM logout + += 1.3.80: January 18, 2017 = + +* Bugfixes: + * Fix loop email notifications on user creation in the back-end + += 1.3.79: January 17, 2017 = + +* Enhancements: + * Adds new username and string validation filter hooks: + * um_validation_safe_username_regex + * um_validation_safe_string_regex + * Adds new filter hook to modify conditional fields + * um_get_field__{$field_key} + * Change max limit of users queue's count in cache + * Adds current logged in users WP and Community roles in the System Info + * Adds confirmation on user deletion + +* Bugfixes: + * Fix conditional fields + * Fix logout compatibility issues with WPML + * Fix select option's custom callback validation + * Fix translation strings of primary and secondary buttons on Login and Register forms. + * Fix gender filter and results + * Fix user deletion in account page for mobile browsers + * Fix form rows CSS options + * Fix default text autocomplete + * Remove notices + += 1.3.78: December 08, 2016 = + +* Bugfixes: + * Fix menu settings compatibility issue with WP 4.7 + * Fix mobile class on account delete tab heading + * Fixes an issue where tagline shows the current users to all members + * Fixes notice on updating WP List Table quick edit + * Remove notices + + = 1.3.77: November 30, 2016 = + +* Bugfixes: + * Fix set and reset password validation. + * Remove notices + += 1.3.76: November 30, 2016 = + +* Bugfixes: + * Fix invalid security notice in set password. + += 1.3.75: November 29, 2016 = + +* Bugfixes: + * Fix 'Invalid user ID' on profile update + += 1.3.74: November 29, 2016 = + +* Enhancements: + * Improves clear users cache. + * Removes user id from redirect URL on registration process for pending review and email activation statuses. + +* Bugfixes: + * Fix assigning of role on registration process + * Fix change email address in edit mode. + * Fix change password validation. + * Removes notices when role field is present in the profile form. + + += 1.3.73: November 17, 2016 = + +* Enhancements: + * Adds a filter hook to modify the submitted details on registration process + * `um_before_save_filter_submitted` + * Adds a filter hook to disable canonical link in header + * `um_allow_canonical__filter` + * Adds a filter hook to modify the auto-generated email address on registration process + * `um_user_register_submitted__email` + * Adds filter hooks to modify locale, language file path and textdomain + * `um_language_textdomain` + * `um_language_locale` + * `um_language_file` + * Adds filter hook to modify the data of selected value: + * `um_is_selected_filter_data` + * Adds new select/multi-select options to retrieve options from a callback. + * In the form builder, edit or add a select/multi-select field and add your callback function in `Choices callback` field to get populated. + * Adds parent select field option to dynamically populate another select field. + * If `Choices Callback` option is set in the field settings, the `Parent Option` triggers an Ajax request to populate the child options on `change` event. + * Updates `um.min.js` file. + * Updates `en_US` translation file. + +* Bugfixes: + * Removes notices from WPCLI console. + * Removes notices from edit profile mode + * Removes autocomplete from search filter fields + * Fix translation strings of search filters on a member directory + * Fix email notifications not sending on registration process + * Fix field selection with special characters on form submission + * Fix assigning of role on register submission process + += 1.3.72: October 10, 2016 = + +* Enhancements: + * Improves the bulk filters, actions and redirection in `User Screens` + * Adds new access options to disallow access on homepage and category pages. + * Adds Textarea to show in profile tagline on Member Directory + * Adds a filter hook `um_allow_frontend_image_uploads` to allow profile and cover photo uploads on front-end pages. + * Adds new filter hooks to modify image field data on upload: + * `um_image_handle_global__option` + * `um_image_handle_{$field}__option` + * Adds a new filter hook to modify the redirection of non logged in users who visit the parent user page. + * `um_locate_user_profile_not_loggedin__redirect` + * Improves generate dummies tool with `wp_remote_get` + * Adds a new action hook for a new section in cover area: + * `um_cover_area_content` + * Updates the English translation .po and .mo files. + * Improves the shortcode `um_show_content` to swap the `user_id` with the current profile. + +* Bugfixes: + * Fixes a bug where multi-select field options doesn't match the user selected options that contain html entities. + * Fixes a bug to display correct role slugs in radio and select fields. + * Fixes a bug where reset password form is conflicting with register and login form on a page. + * Fixes a bug where Users queue count in the Admin > `All Users / Users` menu doesn't update when a user account is in `pending user review` and gets deleted. + * Fixes a typo in Password Reset Email option's description + * Fixes a bug where conditional fields 'equals to' validation on registration process + * Fixes a bug to disable the query with hiding account on member directory + * Fixes a bug to retrieve specific number of members + * Fixes a bug to retrieve all members with `get_members` new parameter `number` + * Fixes a typo in Welcome Email template. + * Fixes a bug where login form redirection is set to `wp-admin/admin-ajax.php` instead of the current page when loaded via ajax. + * Fixes a bug where uninstall link doesn't load. + * Fixes a bug to redirect users to correct URL after login based from login options. + * Fixes a bug where non-logged in users are not able to access the profile page when `Global Site Access` is set to `Site accessible to Logged In Users`. + * Fixes a bug to modify the login redirection url especially when DOING_AJAX is defined. + * Fixes a bug to retrieve correct community roles per site in a Multisite Network setup. + += 1.3.71: September 12, 2016 = + +* Enhancements: + * Adds a new filter hook to modify the `cover photo` uri. + * `um_user_cover_photo_uri__filter` +* Bugfixes: + * Fixes a bug to allow users change their password in account form + * Fixes a bug to allow role validation and assigning of roles to users on registration process + * Fixes a bug to avoid blank admin footer text all around WordPress + += 1.3.70: September 09, 2016 = + +* Enhancements: + * Adds a new filter hook to modify the profile `cover photo` uri. + * `um_user_cover_photo_uri__filter` +* Bugfixes: + * Fixes a bug to allow users change their password in account form + * Fixes a bug to reset passwords + += 1.3.69: September 08, 2016 = + +* Enhancements: + * Adds a system information tool for support purposes + * Adds a new option to disable generating profile slugs on every load of member directory pages. + * Located in UM > Settings > Advanced > Stop generating profile slugs in member directory. + * This improves the performance when loading profiles in directories. It generates profile slug on Profile Update ( front and back-end ), Registration Process and viewing the Users in the back-end. + * Adds new filter hook `um_activate_url` to modify the account activation url. + * Adds new filter hooks to modify first and last name cases + * `um_user_first_name_case` + * `um_user_last_name_case` + * Adds new filter hooks to modify nonces of image and file uploads + * `um_file_upload_nonce` + * `um_image_upload_nonce` + * Improves search member filters and keyword sensitivity + * Improves generation of profile slugs + * Improves force capitalization of display names with dash + * Improves the pagination and loading of profiles in member directory + +* Bugfixes: + * Fixes a bug where users in member directory are missing after updating their profile + * Fixes a bug to generate random email when email field is not added in a form. + * Fixes a bug to show hidden members in member directory for admins + * Fixes a bug to validate username length on registration process + * Fixes a bug to display profile name in dynamic menu and profile page title + * Fixes a bug where frequent security notices show on registration process + * Fixes a bug to assign correct role to a user on registration process + * Fixes a bug to display correct roles in radio and dropdown fields + * Fixes a bug to validate the reset password + * Fixes a bug to change the assign of role in navigation menu items + * Fixes a bug to select radio field in profile form + * Fixes a bug to allow frontpage and posts page to handle custom access settings + * Fixes a bug where profile role field's conditional logic doesn't show/hide the second field. + * Fixes a bug to show 'Last Login' field in profile edit and view mode. + * Fixes a bug to sync roles with users in Edit Roles. + * Fixes a bug to disable/enable UM profile cache + * Fixes a bug to disable biography field's character limit when added in form + + += 1.3.68: August 02, 2016 = + +* Fixed: radio field in account page + += 1.3.67: August 02, 2016 = + +* New: allow non-editable fields in registration form +* Fixed: member directory mobile pagination +* Fixed: biography field validation in profile header and forms +* Fixed: remove override 'birth date' label +* Fixed: html support in biography field +* Fixed: select options search +* Fixed: select field's search query +* Fixed: search filters and multi-select fields +* Fixed: select, radio and checkbox field options +* Fixed: multiple select in UM settings +* Fixed: member directory's pagination links +* Fixed: remove nonce and http referer from submitted user details +* Fixed: disallow direct access link to posts with enabled category access restriction +* Added: new filter hook: `um_get_default_cover_uri_filter` +* Added: new filter hook: `um_register_allow_nonce_verification` +* Added: new filter hook: `um_get_option_filter__{$option_id}` +* Added: new filter hook: ` um_profile_{$key}__filter` +* Added: new filter hook: `um_profile_{$key}_empty__filter` +* Added: new filter hook `um_enable_ajax_urls` +* Added: new filter hook `um_field_checkbox_item_title` + + += 1.3.66: July 14, 2016 = + +* Tweak: update translation strings and English translation file. +* Fixed: alphabetic and lowercase validations +* Fixed: checkbox and radio label encoding +* Fixed: user_login field validation type +* Fixed: registration form process +* Fixed: remove comments with hidden/private posts from comment tab + += 1.3.65: July 06, 2016 = + +* Tweak: update ReduxFramework to version 3.6.0.1 +* Added: new action hook 'um_registration_after_auto_login' +* Added: new option for Network Permalink Structure +* Added: an account option to require first and last name +* Fixed: account deletion and password confirmation +* Fixed: registration form submission process +* Fixed: access settings in home page and posts conflict +* Fixed: encoding non UTF8 strings + += 1.3.64: June 29, 2016 = +* Fixed: edit profile permission + += 1.3.63: June 28, 2016 = +* Fixed: admin navigation +* Fixed: profile access and redirection + += 1.3.62: June 27, 2016 = +* Fixed: access settings and redirection for logged out users +* Fixed: global access settings +* Fixed: remove notice in permalink + += 1.3.61: June 24, 2016 = +* Fixed: edit profile url in multi-site setup +* Fixed: global access settings + += 1.3.60: June 23, 2016 = +* Fixed: change password +* Fixed: menu settings and roles +* Fixed: cropper issue with Avada theme +* Fixed: image cropper and modal +* Fixed: nonce in registration forms +* Fixed: user redirection for non-loggedin users +* Fixed: global access setting + += 1.3.59: June 17, 2016 = +* Added: filter 'um_register_hidden_role_field' +* Added: filters and action hooks in form post +* Added: cache time filter in avatar url +* Fixed: Nonces added to file uploads +* Fixed: remove notices +* Fixed: upload image cropper +* Fixed: select field multiple select +* Fixed: changing community role by admin +* Fixed: current url method in multisite setup +* Fixed: access settings + += 1.3.58: June 09, 2016 = +* Fixed: change password +* Fixed: select field overlay + += 1.3.57: June 09, 2016 = +* Fixed: admin access restriction + += 1.3.56: June 09, 2016 = +* Fixed: query of pages + += 1.3.55: June 09, 2016 = +* Fixed: select fields styles +* Fixed: select fields with accented characters +* Fixed: select fields with accented text values +* Fixed: select fields in overlay +* Fixed: admin front-end access restriction +* Fixed: pages query + += 1.3.54: June 02, 2016 = +* Fixed: remove quick edit from Built-in roles row actions +* Fixed: remove notices +* Fixed: dropdown/select fields +* Fixed: upload file extension's case sensitive issue +* Fixed: reset and change password + += 1.3.53: June 01, 2016 = +* New: generate dummy users tool +* Added: filter 'um_submit_form_error' for custom error messages +* Tweak: update compressed CSS +* Tweak: update select2.js to version 4.0.2 +* Fixed: gravatar and transfer tool +* Fixed: permalink base for username +* Fixed: saving account fields +* Fixed: remove notice +* Fixed: upload form error logging +* Fixed: cache option +* Fixed: edit profile url +* Fixed: login redirection +* Fixed: remove account information from welcome email +* Fixed: form error with users tags +* Fixed: select fields with accented characters +* Fixed: image upload + += 1.3.52: May 14, 2016 = +* Added: 'wp_authenticate_username_password_before' action hook +* Tweak: remove access settings in media screens +* Fixed: convert tags format +* Fixed: ReduxFramework notice +* Fixed: remove PHP notice + += 1.3.51: May 10, 2016 = +* Added: 'um_form_fields_textarea_settings' filter +* Added: reset password limit options +* Added: option to force display name to be capitlized +* Fixed: remove notices +* Fixed: redirect url on login +* Fixed: optimize query and object caching +* Fixed: profile photo as required field +* Fixed: admin access in front-end login +* Fixed: typos in tooltips +* Fixed: embedding video fields +* Fixed: Flush rewrite rules + += 1.3.50: April 21, 2016 = +* Fixed: menu incompatibility issue +* Fixed: username validation +* Fixed: admin css conflict +* Fixed: display name capitalization +* Fixed: search member filter and fields +* Fixed: member directory big SELECT query +* Added: action hook 'um_access_post_type' & 'um_access_post_type_{current_page_type}' for current page type in access settings + += 1.3.49: April 14, 2016 = +* Fixed: remove core notices from ajax requests +* Fixed: upload form and media path + += 1.3.48: April 11, 2016 = +* New: advanced option to disable profile object caching +* Added: ssl media uri function +* Added: first and last name initial as meta key +* Fixed: order by random and pagination +* Fixed: user sort by random +* Fixed: status message encoding +* Fixed: image upload and file name +* Fixed: user login with other provider +* Fixed: translation strings +* Fixed: dependencies fatal errors +* Fixed: remove notices + += 1.3.47: April 6, 2016 = +* Fixed: Fatal errors with language filter file + += 1.3.46: April 6, 2016 = +* Fixed: Search widget fatal error +* Fixed: image jpeg upload sizes + += 1.3.45: April 6, 2016 = +* New: support for wordfence and limit login +* New: search widget +* New: secondary email address +* Added: hook to password reset form fields +* Added: privacy options for profile menu tabs +* Added: option to allow primary email editable in profile view +* Added: member directory sort randomly +* Fixed: user page redirection +* Fixed: admin script error +* Fixed: invalid image path +* Fixed: upload image png with transparency +* Fixed: permalink basename fallback +* Fixed: casting variable and add new filter +* Fixed: remove notices +* Fixed: search users by tag +* Fixed: force UT8 encoding option +* Fixed: email content type +* Fixed: WPML compatibility +* Fixed: permalink base name format and redirect loop in profile page +* Fixed: form labels textdomain +* Fixed: edit profile redirect +* Tweak: accept period in profile url + += 1.3.44: March 11, 2016 = +* New: an option to force Strings to use UTF-8 encoding +* New: an option to change Gravatar default image +* New: South Sudan to the list of countries. +* Fixed: update profile edit +* Fixed: remove feed from content restriction +* Fixed: search username query +* Fixed: support for server query string data after user login +* Fixed: matching fields values +* Fixed: email template path +* Fixed: shortcode within [um_show_content] shortcode +* Tweak: remove notices + += 1.3.43: March 5, 2016 = +* Fixed: redirect URL after login +* Fixed: security check in registration form +* Fixed: email template path string +* Fixed: member directory query + += 1.3.42: March 3, 2016 = +* Fixed: email template and localization +* Fixed: redirect URL + += 1.3.41: March 3, 2016 = +* Fixed: Registration form redirect url + += 1.3.40: March 3, 2016 = + +* New: filter `um__form_show_field` for display field +* New: shortcode: show custom content to specific role [um_show_content roles='member'][/um_show_content] +* New: 'not' attribute to [um_show_content not='member,contributor'][/um_show_content] shortcode +* Tweak: update masonry script +* Tweak: sql concatenate with prepare statement +* Fixed: remove notices +* Fixed: missing mCSB_buttons.png +* Fixed: set Gravatar default image as UM default image +* Fixed: fix default gravatar image +* Fixed: select2 multi dropdown for wc orders +* Fixed: show admin bar option +* Fixed: session issue with logout +* Fixed: register using email address if it exists +* Fixed: duplicate full_name permalinks +* Fixed: duplicate profile +* Fixed: show admin bar for non-logged in users +* Fixed: honorifics in full name +* Fixed: unsynced wp role +* Fixed: display wp user role filters +* Fixed: select and radio invalid value +* Fixed: email template path +* Fixed: user profile url with single dash in the last name +* Fixed: function to check meta value existence by meta key +* Fixed: um-admin-dashboard warnings +* Fixed: community role field in profile edit screen +* Fixed: mismatched roles +* Fixed: admin access in profiles +* Fixed: allow multiple member directory shortcode in a page +* Fixed: datepicker for ios and safari +* Fixed: adding of members in wp-admin +* Fixed: Fix redirection and XSS issue in login form + += 1.3.39: February 24, 2016 = + +* New: add gravatar transfer tool +* New: show users with gravatar photo in member directory +* New: add upgrade class for data migration +* Tweak: Set last login for new users to show in member directory +* Tweak: validate roles for forms without fields +* Tweak: cropper js update +* Tweak: update minified script +* Tweak: tooltip and comment +* Fixed: member search query +* Fixed: Registration process with pending and show message enabled +* Fixed: Fix form security validation +* Fixed: email content type, template and localization +* Fixed: remove php notices +* Fixed: custom columns for roles +* Fixed: admin bar visibility per user role +* Fixed: community role editing + += 1.3.38: February 19, 2016 = + +* Tweak: remove username validation +* Tweak: update minified scripts +* Fixed: Fix email and user submitted data encoding +* Fixed: role validation on register submission +* Fixed: form role and validation +* Fixed: search form pagination visibility + += 1.3.37: February 17, 2016 = + +* New: Add password confirmation validation +* New: Add VK url validation +* New: Add Vkontakte as predefined url field +* New: Add additional file types +* New: Add file size limit label in image field +* New: Added password reset limit +* New: Allow redirect_to param after registration +* New: Indonesian language support added +* New: Add bio characters limit +* Tweak: Use native WP masonry script instead of duplicating it +* Tweak: Add image upload notice +* Tweak: Add option to allow users to hide profiles from member page +* Tweak: Add filters to modify output field +* Tweak: Add filter hook for email template path +* Tweak: Tweak upload form styles +* Tweak: Remove masonry from core and gulp +* Tweak: Add admin assets and apply minification +* Tweak: Update pickadate assets +* Tweak: Allowing usertags in search filters +* Tweak: Allow members template to be customized/overridden +* Tweak: Option to login user after clicking the activation link +* Tweak: Remove bio count strings +* Fixed: bio limit javascript error +* Fixed: ssl checker for load balancers +* Fixed: redirect loop with wpml permalink +* Fixed: WPML permalink and form compatibility +* Fixed: blocked words +* Fixed: searching with space +* Fixed: change password +* Fixed: members grid override +* Fixed: tipsy.js error +* Fixed: Plugin conflict causing account page displaying wrong info +* Fixed: email locale tempalte path +* Fixed: invalid role +* Fixed: validation for change password +* Fixed: unchecked access roles +* Fixed: telno input styles +* Fixed: escape display name in title attributes +* Fixed: datepicker css issue with some themes +* Fixed: make sure the hash parameter is a string +* Fixed: loading core assets +* Fixed: title tags not updated +* Fixed: empty uneditable fields +* Fixed: account deletion on one submission +* Fixed: Fixed indentation +* Fixed: user_login fallbacks and remove email address +* Fixed: password changed email template + += 1.3.36: January 6, 2016 = + +* New: added in-page content restriction to protect content for logged-in or logged out users +* New: added community role field to user creation in backend +* New: added community role field to user editing in backend +* New: show specific users in members directory +* New: added a new field type: Number +* New: added filter hooks to specific profile fields +* New: added custom admin bulk actions support +* New: added usermeta support to content locking feature in-page +* Tweak: several tweaks in core to be more WordPress native +* Tweak: added fallback for page setup selections +* Tweak: automatic clickable links in profile header bio +* Tweak: trim long field labels in backend fields modal +* Fixed: profile page SEO title +* Fixed: multi-site redirect support +* Fixed: activation hash comparison +* Fixed: page setup fallback field +* Fixed: prevents php warnings and notices +* Fixed: WP-CLI and cronjobs issues +* Fixed: category posts restriction and redirection +* Fixed: category access settings +* Fixed: activation link + += 1.3.35: December 15, 2015 = + +* Fixed: registration/login issues resolved + += 1.3.34: December 15, 2015 = + +* New: new privacy option for fields: allow profile owner & specific roles to view the field +* Fixed: wrong php syntax in admin notice + += 1.3.33: December 15, 2015 = + +* Fixed: Member search on homepage +* Fixed: emoticons support +* Fixed: redux notices, css styles in admin +* Fixed: users not being deleted + += 1.3.32: December 10, 2015 = + +* Fixed: array format and notices +* Fixed: users search, delete confirmation and role filter +* Fixed: unique key field validation + += 1.3.31: December 9, 2015 = + +* Fixed: Add slash in base url filter for multisite +* Fixed: manage user roles, status and filters +* Fixed: Enable WPML support to all UM url/links +* Fixed: Sanitize referers and printing notices in admin screens + += 1.3.30: December 3, 2015 = + +* New: added Simplified Chinese language support +* Tweak: added many new filters (for developers) +* Fixed: Display name update in profile +* Fixed: Photo upload unique IDs +* Fixed: Remove duplicated method um_convert_tags + += 1.3.29: October 31, 2015 = + +* New: added new documentation links to plugin files +* New: added filters to control profile photo menu (for developers) +* Fixed: added security patch to remove decrypted passwords from database +* Fixed: bug with blocked words during registration +* Fixed: some localization strings +* Fixed: php warnings/bugs on specific installs + += 1.3.28: October 13, 2015 = + +* Fixed: Bug with plugin folder structure + += 1.3.27: October 13, 2015 = + +* Fixed: Role name display in Users dashboard + += 1.3.26: September 25, 2015 = + +* New: added Greek language support +* Tweak: added custom class to every user meta in member directory +* Tweak: added option to stop flushing rewrite rules every load (performance tweak) +* Fixed: WPML issue on multisite install +* Fixed: Removed redux menu from tools +* Fixed: fix for wp_authenticate_username_password() +* Fixed: searching users by e-mail address +* Fixed: conflict with sites with thousands of pages + += 1.3.25: September 7, 2015 = + +* Fixed: 404 error on UM pages + += 1.3.24: September 6, 2015 = + +* Tweak: saved some database queries +* Tweak: plugin not compatible with cache plugins out of the box - needs to exclude dynamic urls from cache +* Tweak: added more development filters in backend + += 1.3.23: September 2, 2015 = + +* Fixed: PHP strstr() notice on profile + += 1.3.22: September 2, 2015 = + +* Fixed: compatibility bug with older PHP versions + += 1.3.21: September 2, 2015 = + +* Tweak: added security by sanitizing file/image uploads +* Fixed: issue with account page > notifications tab +* Fixed: image upload path in email notification +* Fixed: php issue with displaying name +* Fixed: missing localisation strings +* Fixed: couple of php notices + += 1.3.20: August 28, 2015 = + +* New: added security measure for profile photo uploads +* New: added filter to hook in registration details sent in email notification +* New: added core pages filter to allow you change pages of extensions within plugin settings (e.g. activity) +* Fixed: multi-select field filtering bug +* Fixed: strip slashes from field names in fields modal +* Fixed: show drag and drop footer content only in the drag and drop form builder page +* Fixed: profile photo crop/upload issue +* Fixed: category/post specific restriction conflict +* Fixed: display UM classes only in UM pages +* Fixed: minor code improvements + += 1.3.19: August 20, 2015 = + +* Fixed: please update - profile issue + += 1.3.18: August 20, 2015 = + +* New: filter for comment types tab in profile +* New: jQuery.scrollto script added (for developers and extensions support) +* Fixed: XSS vulnerability in text input +* Fixed: user goes to profile about tab after editing profile + += 1.3.17: August 13, 2015 = + +* New: added Brazilian Portuguese language support +* Tweak: added support for upcoming social activity extension + += 1.3.16: August 11, 2015 = + +* New: added option to restrict categories in addition to per post content restriction +* New: added support to use dynamic user/profile ID in shortcode field e.g. [your-shortcode user_id={profile_id}] +* New: added security feature to disable admin logging via frontend (optional) +* New: added filter to um_get_core_page() function (for developers) +* Tweak: removed delay from tooltips +* Fixed: conflict with Podcast feed + += 1.3.15: August 4, 2015 = + +* Fixed: issue with logout from adminbar + += 1.3.14: August 4, 2015 = + +* New: added last login date support +* New: show user's last login in profile +* New: added sorting members by last login date +* New: added option to re-assign core pages in plugin settings +* Fixed: issue with multi-select required field +* Fixed: URL validation for custom fields +* Fixed: backend user filtering by non-english role +* Fixed: RTL css bugs + += 1.3.13: July 22, 2015 = + +* Fixed: Woocommerce manual order dropdown conflict + += 1.3.12: July 22, 2015 = + +* New: ability to delete user cache from plugin dashboard +* New: function is_ultimatemember() checks if user is on UM page (developers) +* New: option to disallow editing email in account page +* New: added Spanish (Mexico) language support +* Fixed: bug with profile viewing and user roles +* Fixed: Woocommerce dropdown bugs/conflicts +* Fixed: ipad/tablet css fixes for profile columns +* Fixed: deleting users delete their content + += 1.3.11: July 8, 2015 = + +* Fixed: Redux errors and popups in backend + += 1.3.1: July 7, 2015 = + +* Fixed: major issue with showing HTML in profiles + += 1.3.0: July 7, 2015 = + +* New: easily sync UM roles with WP roles with role settings +* New: first steps towards WPML compatibility +* New: option to show member results only If user has searched +* New: add .um-err class to UM form if the form contains errors +* New: updated redux framework to latest version +* Fixed: feed issue with private / access locked posts + += 1.2.997: June 21, 2015 = + +* New: added support for Farsi / Romanian language +* Tweak: adapted core community roles to prevent conflicts +* Fixed: bug with search results pagination +* Fixed: issue with panic key usage and wp-admin screen +* Fixed: bug with custom field validation action + += 1.2.996: June 11, 2015 = + +* Fixed: php notice causing errors to appear in both frontend and backend + += 1.2.995: June 11, 2015 = + +* New: added required support for WooCommerce extension +* Tweak: added option to fix conflicts of user profile links using different server method to get current url +* Fixed: security fix for redux framework added +* Fixed: button appearance on tablets +* Fixed: member search by display name + += 1.2.994: June 6, 2015 = + +* Tweak: added a filter hook to change priority of enqueued styles/scripts +* Fixed: UM forms and elements not appearing in IE +* Fixed: Skype field output +* Fixed: conflict with libraries using Mobile Detect +* Fixed: issue with WP locale (using get_locale() now instead) + += 1.2.993: May 29, 2015 = + +* Fixed: correction to last update +* Fixed: Private messages extension bug + += 1.2.99: May 29, 2015 = + +* New: added Czech language support +* Fixed: WooCommerce dropdown issues and bugs in backend + += 1.2.98: May 18, 2015 = + +* New: added Google map field +* New: added Vimeo video field +* New: added YouTube video field +* New: added SoundCloud track field +* New: added Hebrew language support +* Tweak: do not show captcha response in submitted registration details +* Fixed: profile photo upload issue on profile view mode +* Fixed: user search in backend/frontend +* Fixed: UM login check +* Fixed: admin settings css issue on mobile +* Fixed: cache variable undefined issue + += 1.2.97: May 13, 2015 = + +* Fixed: issue with image upload fields +* Fixed: date localization resolved +* Fixed: issue with image upload during registration +* Fixed: JS issues for PM extension + += 1.2.96: May 12, 2015 = + +* New: hooks and compatibility with Private Messages extension +* Fixed: bug with empty password on welcome e-mail +* Fixed: bug with member search using default permalinks + += 1.2.95: May 9, 2015 = + +* New: RESTful API methods update.user, get.stats, and delete.user +* New: added Danish (Dansk) support +* New: added Swedish (Svenska) support +* Tweak: minor account and logout redirection tweaks +* Fixed: issue with changing user role +* Fixed: bug with login form validation +* Fixed: issue with biography field and html + += 1.2.94: May 6, 2015 = + +* Fixed: bug with activation e-mails +* Fixed: bug stopping password reset +* Fixed: bug with changing user role and status in backend + += 1.2.93: May 5, 2015 = + +* New: user profiles are cached to speed up load time +* New: emoji support added to bio / user descriptions +* Fixed: issues with bio field HTML +* Fixed: WP-admin PHP warning +* Fixed: bug with localization of en_US.po file + += 1.2.92: May 2, 2015 = + +* New: Important: Introduces the Ultimate Member RESTful API +* Tweak: improved um_user_ip() function +* Fixed: issue with invalid html on profile photo and cover photo + += 1.2.91: April 30, 2015 = + +* New: added custom field validation support via hooks um_custom_field_validation_{$hook} +* Fixed: important bug with profile menu tabs / system + += 1.2.9: April 29, 2015 = + +* New: display pending users count in backend +* Tweak: improved user deletion process from backend +* Tweak: tweaked filter for register/login buttons +* Tweak: disabled registration timebot for admins +* Fixed: wp-load.php path in image and file upload scripts +* Fixed: RTL compatibility bugs +* Fixed: bug with registration and role field +* Fixed: bug with edit profile and biography length in header + += 1.2.8: April 25, 2015 = + +* Fixed: Important WP 4.2 conflict resolved: filtering users in backend + += 1.2.7: April 25, 2015 = + +* Tweak: Compatible with WordPress 4.2 +* Tweak: general code tweaks and improvements +* Tweak: new action hook when user is deleted +* Tweak: new action/filter hooks for profiles (developers) +* Tweak: new filter hook for profile privacy option +* Fixed: permalink issues + += 1.2.6: April 22, 2015 = + +* Fixed: password reset security fix ( do not reveal emails ) +* Fixed: bug with custom profile templates +* Fixed: display name in member directories +* Fixed: URL fields display in member directory +* Fixed: many bugs with previous version + += 1.2.5: April 21, 2015 = + +* Fixed: e-mail activation bugs + += 1.2.4: April 20, 2015 = + +* New: added Russian language support +* Fixed: Security patch related to add_query_arg() +* Fixed: bug with approval HTML e-mail + += 1.2.3: April 16, 2015 = + +* Fixed: major bug with admin capability / editing user profiles via frontend + += 1.2.2: April 15, 2015 = + +* New: added caching to user roles and user permissions to save queries +* New: added user switching feature to allow super admins to sign in as another user easily (without password) +* New: added new modal css/js for future support +* New: added custom scrollbar support for future development use +* Tweak: added form elements focus css +* Fixed: bug with required radio button +* Fixed: prevent access for backend login/register/lost password for a logged in user + += 1.1.6: April 7, 2015 = + +* Fixed: major bug with datepicker (Update recommended) + += 1.1.5: April 4, 2015 = + +* New: new action hook that runs when user role is changed um_member_role_upgrade +* Fixed: bug/compatibility issue with caching UM roles data +* Fixed: bug with changing role settings/permissions +* Fixed: bug with setting e-mail activation redirect URL + += 1.1.4: April 2, 2015 = + +* Fixed: Major bug with dropdown and date fields (Update recommended) +* Fixed: hard-coded translation issues + += 1.1.3: April 1, 2015 = + +* New: added option to manage if access control widgets can be edited by admins only +* Tweak: update to last security patch - deletes user who try to get unauthorized access + += 1.1.2: March 30, 2015 = + +* Fixed: Important security patch - please update +* Fixed: conflict with The Events Calendar plugin +* Fixed: bug with edit profile link + += 1.1.1: March 29, 2015 = + +* Fixed: bug where you user could use an already existing e-mail in account page +* Fixed: bug with special characaters in username +* Fixed: bug with showing draft posts in user profile + += 1.1.0: March 27, 2015 = + +* New: added multi language support to assign different languages to different forms (beta feature) +* New: added RTL support (beta, still partial) +* New: added a dashboard widget to view latest blog posts from the plugin +* Tweak: changed manage_options permission to edit_users on some admin actions +* Fixed: corrected all active color references in the css +* Fixed: bug with user_row_actions filter +* Fixed: do not store user_pass in submitted metakey during registration + += 1.0.96: March 25, 2015 = + +* New: Added Arabic language (ar) support +* Fixed: Date fields not working in Safari +* Fixed: issue with HTML e-mails +* Fixed: issue with showing sidebar logout widget on bbpress forums + += 1.0.95: March 24, 2015 = + +* Tweak: added more hooks to mail function to allow for sending custom e-mails +* Fixed: issue with content lock settings in backend appearing for non-admins +* Fixed: issue with form errors handling + += 1.0.94: March 23, 2015 = + +* Fixed: bug with member directory search +* Fixed: bug with custom role homepage + += 1.0.93: March 22, 2015 = + +* Fixed: bug with showing register and login forms on same page + += 1.0.92: March 20, 2015 = + +* New: added option to customize redirection URL after e-mail activation +* Fixed: issue with hardcoded ajax/upload URLs - they are now localized +* Fixed: issue with admin notification for a deleted account +* Fixed: admin notifications are in plain text format + += 1.0.91: March 20, 2015 = + +* Tweak: featured image in user posts goes to post link +* Fixed: solved a bug with e-mail validation + += 1.0.90: March 19, 2015 = + +* Tweak: minor admin css changes +* Tweak: error message for frontend upload with theme/plugin conflicts + += 1.0.89: March 18, 2015 = + +* Tweak: Major Performance Improvements (beta) + += 1.0.88: March 18, 2015 = + +* Fixed: bug with viewing member profiles + += 1.0.87: March 17, 2015 = + +* Tweak: profile edit form tweaked to be processed for profile edit only. allows you to have custom (not nested) valid forms in other profile tabs + += 1.0.86: March 16, 2015 = + +* Tweak: UM admins can see unapproved users on front-end members directory +* Fixed: few misspelling errors +* Fixed: bug with custom profile templates (showing blank) resolved + += 1.0.85: March 14, 2015 = + +* New: added option to show user social links in profile header (optional) +* New: added option to display post featured image in profile "posts" tab +* Tweak: improved error reporting for theme conflicts on photo upload +* Fixed: issue with comments tab on profile + += 1.0.84: March 13, 2015 = + +* New: adds automatic body class to UM core pages automatically +* Fixed: important jQuery issue +* Fixed: upload security issue - extension error was empty + += 1.0.83: March 12, 2015 = + +* New: added a logout template If user is already logged in (customizable) +* New: strong password formula not required when resetting password (optional) +* Fixed: jQuery issue with live() method - Thanks to Jim Wetton + += 1.0.82: March 11, 2015 = + +* Fixed: issue with saving user account general tab + += 1.0.81: March 11, 2015 = + +* New: official support for plugin extensions released + += 1.0.80: March 10, 2015 = + +* Tweak: added licensing support to plugin core +* Fixed: issue with account form + += 1.0.79: March 10, 2015 = + +* Tweak: Redux up to date +* Fixed: security issue related to deleting a temp file via ajax +* Fixed: bug with a php warning on undefined field type + +Credits to "James Golovich http://www.pritect.net" for the security checks + += 1.0.78: March 10, 2015 = + +* Fixed: important correction from previous version + += 1.0.77: March 10, 2015 = + +* New: integration with comments to show user profile link instead of user link (not compatible with all themes) +* New: option to control maximum size of uploaded profile photo +* New: option to control maximum size of uploaded cover photo +* Tweak: URL fields will are now treated as hyperlinks +* Fixed: bug with member directory privacy option +* Fixed: bug with using # as a character in file or image upload + += 1.0.76: March 7, 2015 = + +* New: added {user_avatar_small} tag to display user photo in menu (requires extra css work) +* Tweak: Removed !important css rules from colors and backgrounds +* Fixed: issue with content block field + += 1.0.75: March 5, 2015 = + +* New: improved & modern html e-mail templates +* New: addon to transfer BuddyPress profile photos to Ultimate Member (user request) +* New: added option to turn off time bot feature (fixes conflict with plugins) +* New: added built-in addons support +* Tweak: improved backend design and css + += 1.0.74: March 4, 2015 = + +* Fixed: bug with numeric validation for a field +* Fixed: bug with conditional logic rules with checkbox + += 1.0.73: March 3, 2015 = + +* Tweak: general code improvements + += 1.0.72: March 2, 2015 = + +* Fixed: bug with e-mail activation since last update + += 1.0.71: March 2, 2015 = + +* Fixed: issue with password reset link +* Fixed: issue with social links showing but user did not fill them + += 1.0.70: March 2, 2015 = + +* Tweak: added a filter hook to control profile photo url +* Tweak: harder random generated passwords by making the length 40 characters for a key/password +* Tweak: added option to enable/disable custom css tab (off by default) +* Tweak: changed rewrite rules to be compatible with some themes and plugins +* Fixed: bug with Role field not showing error when required and left empty +* Fixed: bug with showing incorrect age when users did not fill their age +* Fixed: issue with template name for custom profile templates + += 1.0.69: February 28, 2015 = + +* Tweak: better WP logout handling +* Tweak: new action and filter hooks added + += 1.0.68: February 27, 2015 = + +* New: added support for mp3 as allowed filetype / upload +* Fixed: bug with profile privacy option (on non-english sites) +* Fixed: uncommon php warning caused by um_get_user_avatar_url() function +* Fixed: new translation corrections + += 1.0.67: February 26, 2015 = + +* New: Improved the default HTML e-mail templates design +* New: added a bunch of action hooks to account tabs and content +* Tweak: added a few template tags to use in email: {site_url}, {user_account_link} +* Fixed: issue with making a checkbox required prior to registering +* Fixed: issue with comments showing in posts tab under profile +* Fixed: issue with plugin uninstallation link not showing in multisite + += 1.0.66: February 25, 2015 = + +* New: added option to send e-mails as HTML +* New: added default HTML templates for e-mail notifications + += 1.0.65: February 24, 2015 = + +* New: added option to customize register form secondary button URL +* New: added option to customize login form secondary button URL +* Fixed: issue with global access lock when homepage is excluded +* Fixed: issue with custom account tabs +* Fixed: minor css conflict with profile photo + += 1.0.64: February 22, 2015 = + +* Tweak: updated language files on server +* Tweak: modified account page hooks to accept custom hooks easily +* Fixed: important css issues with safari browser +* Fixed: language notice will no longer show on (English UK/Other) wordpress sites + += 1.0.63: February 21, 2015 = + +* Tweak: minor changes to dashboard widgets +* Tweak: cleaned dashboard js +* Tweak: a few action hooks refined +* Tweak: added filters to registration form buttons +* Fixed: issue with delete account feature + += 1.0.62: February 20, 2015 = + +* New: added Polish (Polski) language +* New: added option to disable Name fields from Account page +* New: added support for custom profile templates selectable from template dropdown +* Tweak: remove rows with no fields from profile view +* Tweak: remove empty rows/row headings from profile +* Fixed: removed plain password user meta key from all users +* Fixed: issue with image upload when form has errors +* Fixed: resolved issue with disabling profile menu / tabs + += 1.0.61: February 20, 2015 = + +* Tweak: Upload button text is made translatable +* Fixed: conflicts with Divi theme +* Fixed: issue with Roles dropdown field + += 1.0.60: February 18, 2015 = + +* Tweak: added a protection to prevent wp-admin lockout for admin users +* Tweak: new hook for account page form submitting (for developers) +* Tweak: added a few missing translations +* Fixed: issue with roles dropdown not saving its state +* Fixed: issue with roles dropdown when made required in form +* Fixed: issue with tabbing on form fields + += 1.0.59: February 17, 2015 = + +* New added Finnish language (fi_FI) +* Tweak: show e-mail column in users backend +* Fixed: issue with showing members directory on frontpage + += 1.0.58: February 16, 2015 = + +* Fixed: display name as search field in member directory +* Fixed: translation issues in backend settings +* Fixed: issue with non-english letters in display names +* Fixed: bug with multiple default values for multi-select and checkbox fields +* Fixed: bug with multiple conditional logic based on different checkbox values + += 1.0.57: February 16, 2015 = + +* Tweak: Italian language up-to-date +* Fixed: issue with registration where it can trigger a php warning +* Fixed: some translation issues + += 1.0.56: February 15, 2015 = + +* Fixed: issue with permalink changes + += 1.0.55: February 15, 2015 = + +* New: added Dutch (Nederlands) language +* New: show user registration/joined date in profile and/or member directory +* New: added facebook meta tags on user profiles (You have to disable facebook og tags in your SEO plugin) +* Tweak: sort users by default in "backend" by newest users first +* Tweak: added a close icon to profile and account notices +* Fixed: changed all time features to reflect WordPress installation time +* Fixed: timestamp on registration info shows form submission date/day +* Fixed: updated language files and new translation words + += 1.0.54: February 15, 2015 = + +* New: added a remember me checkbox to login forms by default (optional) +* Tweak: keep your users signed in even if they close browser (optional) +* Tweak: minor css changes +* Fixed: bug with double redirects (causing incorrect loop) after login on some sites + += 1.0.53: February 14, 2015 = + +* Tweak: when deleting users in backend, users will be deleted upon confirmation only +* Tweak: deleted users content is assigned to admin by default (to avoid losing content) +* Fixed: include plugin js and css on specific pages only + += 1.0.52: February 13, 2015 = + +* Fixed: issue with users backend **update recommended** +* Fixed: preview registration info in users backend + += 1.0.51: February 13, 2015 = + +* New: show registration info for each user in users backend +* New: show user stats at a glance in plugin dashboard +* New: sort users in backend by account status +* New: sort users in backend by user role +* New: added option to disable plugin css and js on homepage +* Tweak: updated language and translations files +* Fixed: issue with changing user role from Profile page +* Fixed: php bug with user description that has links +* Fixed: small issue with rewrite rules + += 1.0.50: February 12, 2015 = + +* New: added option to include plugin js/css only on specific pages (user suggestion) +* Tweak: image and file uploads tweaked +* Fixed: date and time picker localization +* Fixed: bug with date and time fields +* Fixed: issue with searching members with default permalinks used +* Fixed: minor css fixes + += 1.0.49: February 10, 2015 = + +* New: added option to disable UM menu (fixes conflict with mega-menu on some themes/plugins) +* New: added option to disable strong password in Account / Password change tab +* New: added a notice to Account page when user updates account +* Fixed: issue with global access settings + += 1.0.48: February 10, 2015 = + +* New: added translation downloader/updater in plugin dashboard +* New: added admin notice when language is updated or downloaded +* Tweak: redirect to login page by default if content is restricted +* Tweak: redirect back to the protected content after successful login +* Tweak: small modifications to plugin admin css +* Fixed: issue with registration form per role not appearing (when logged in) +* Fixed: image and file uploads strip illegal characters from file name +* Fixed: small issue with mandrill plugin +* Fixed: bug with role creation that have used slugs that exist in database + += 1.0.47: February 9, 2015 = + +* New: A more native dashboard for Ultimate Member +* New: view your temp uploads directory size and purge it from dashboard +* Fixed: user uploads bug with handling photo uploads at once +* Fixed: issue with using UM role as search filter in directory +* Fixed: a little icon issue with directory backend +* Fixed: localized a few words from predefined fields + += 1.0.46: February 8, 2015 = + +(Update Recommended) + +* New: added Spanish language pack +* Fixed: important JS conflict in admin when UM is active +* Fixed: profile permalink issue for e-mail usernames +* Fixed: installation issue on some WP databases + += 1.0.45: February 8, 2015 = + +* Fixed: Multisite bug php Fatal error: call to undefined function wpmu_delete_user() + += 1.0.44: February 8, 2015 = + +* Tweak: improved performance: unused user photos are deleted when user upload +* Tweak: cleaned up dashboard code +* Tweak: updated current translations +* Fixed: display name field should be updated with wp_update_user and not in usermeta +* Fixed: admin js and css should are loaded in UM backend only + += 1.0.43: February 7, 2015 = + +* New: added German (Deutsch) language support +* Tweak: updated all translation packs +* Fixed: profile social links in member directory +* Fixed: prevent storing user_pass in usermeta table +* Fixed: php error triggered from um-access.php file + += 1.0.42: February 6, 2015 = + +* New: added option to block specific e-mail domains from registering +* New: 2 new social profile fields: YouTube and SoundCloud +* New: added option to show field icons in profile header +* New: import/export plugin settings feature added to the backend +* New: added option to duplicate forms in backend with one click +* Tweak: cleaned up installation code +* Tweak: minor css modifications +* Fixed: adding HTML and iframe content to html-allowed textarea fields +* Fixed: upload folders permissions with some configurations and servers +* Fixed: live preview of profile forms in backend + += 1.0.41: February 5, 2015 = + +* New: added access control settings to custom post types, you can have custom access settings applied to your custom post types now +* New: divider and spacing fields fully support conditional logic +* Tweak: Turkish language completed +* Tweak: updated some translations +* Fixed: a couple of PHP warnings and errors have been resolved +* Fixed: conflict with MailPoet plugin has been resolved + += 1.0.40: February 4, 2015 = + +* Tweak: line-breaks and automatic urls are now working for textarea fields +* Tweak: updated ReduxFramework to latest version +* Tweak: backend sentences are now properly localized / updated translation +* Fixed: important issue with field positions in backend form builder +* Fixed: issue with usernames that have spaces resolved +* Fixed: conflict with page title in bbpress forums resolved +* Fixed: issue with escaping the apostrophes resolved +* Fixed: issue with loading more posts/comments in profile resolved + += 1.0.39: February 3, 2015 = + +* New: added support for child templates to allow customizing the templates of plugin via theme or child theme. [See how](https://ultimatemember.com/codex/overriding-default-ultimate-member-profile-templates/) +* New: added French language pack +* Tweak: improved localization notification in backend +* Tweak: improved template loading +* Fixed: a minor css issue with multi-select field placeholder + += 1.0.38: February 3, 2015 = + +* New: added a built-in automatic language pack downloader +* New: plugin now available in Italian, Turkish (40%) +* Tweak: If you need the plugin on available language pack you can download it automatically via the dashboard +* Tweak: when user updates account page the page will refresh and stay in the same tab +* Fixed: possible permalinks conflict with some wordpress themes + += 1.0.37: February 2, 2015 = + +* Tweak: automatic line breaks in user description field +* Tweak: added gravatar rating parameter to the gravatar function +* Fixed: permalinks issue with customized slug for user and account pages + += 1.0.36: February 1, 2015 = + +* New: URLs in user description are automatically converted to hyperlinks +* New: added option to redirect author archive to their UM profile automatically +* New: added option to show asterisk next to required fields (optional) +* New: Turkish language file (40% completed) +* Tweak: updated language file with missing sentences and words +* Tweak: auto redirect user/ base to user profile (e.g. user/username/) +* Fixed: issue with wrong comments count on user profile menu +* Fixed: issue with display name tags in nav menu +* Fixed: issue with conditional logic for select/multi-select fields +* Fixed: issue with conditional logic for content blocks and shortcode fields +* Fixed: conflict with Pods wordpress plugin + += 1.0.35: January 31, 2015 = + +* Tweak: exif module is not required anymore and does not stop photo uploads (exif is highly recommended) +* Fixed: issue with changing a WP administrator role to a community administrator role +* Fixed: issue with plugin uploads directory on some multisite installations +* Fixed: conflict with default profile tab and editing profile +* Fixed: minor css conflict on account page with some themes when viewed on tablets + += 1.0.34: January 31, 2015 = + +* New: added option to set a default cover photo +* New: added option to hide restricted content from search and archive +* Fixed: php error in title tab with ElegantThemes +* Fixed: theme conflict with photo/cover upload +* Fixed: issue with country field showing country code in profile +* Fixed: issue with setting default tab +* Fixed: issue with 2-name user roles + += 1.0.33: January 30, 2015 = + +* New: Introducing profile menu / tab system (optional) +* New: display user posts and comments in profile menu (optional) +* New: added option to force hide adminbar on the frontend even for administrators +* Tweak: added profile menu options to plugin settings panel +* Tweak: added option to enable/disable profile menu and/or profile menu tabs +* Tweak: added option to show or hide post and comment counts (when the tabs are active) +* Tweak: account activation via e-mail redirects user to login page and displays a success message +* Fixed: issue with conditional logic on profile fields has been resolved +* Fixed: bug with searching members by gender +* Fixed: admin nav menus conditional logic conflict with some themes +* Fixed: bug with datepicker field on windows servers + += 1.0.32: January 30, 2015 = + +* New: added 3 new tags to use in email templates {first_name}, {last_name}, and {gender} +* Fixed: Issue with account page permalink resolved - [view issue](https://ultimatemember.com/forums/topic/permalink-bug/) +* Fixed: Issue with conditional menu items showing for un-approved users resolved - [view issue](https://ultimatemember.com/forums/topic/registration/) + += 1.0.31: January 29, 2015 = + +* Fixed: Issue with custom user page slug resolved [view issue](https://wordpress.org/support/topic/translate-plugin-9) +* Fixed: PHP warning in members directory resolved +* Fixed: Issue with hardcoded user profile URLs in menu + += 1.0.30: January 29, 2015 = + +* New: added option to control number of profiles to display in members directory for mobile devices +* New: new admin action hook 'um_extend_admin_menu' to extend plugin administration menu +* New: Improved plugin accessbility e.g add alt text to links and images so people with disabilities can use screen readers +* New: added option to show/hide the message that appears if profile is empty (includes emoticon show/hide) +* Tweak: new translatable strings +* Tweak: added option to customize single-result text for members directory +* Tweak: removed unnecessary code from member directory backend +* Tweak: removed unnecessary js from admin head +* Fixed: Account page is now translatable +* Fixed: content restriction widget css in backend + += 1.0.29: January 28, 2015 = + +* New: added feature to show user display name in menu (e.g. Welcome, {display_name}) +* New: added option to add text to dividers (which can be added using the drag-and-drop form builder) +* New: security improvement: added whitelisted IP(s) option to allow you to access the WP-admin screen always (prevents lockout) +* New: added filter hook um_whitelisted_wpadmin_access to control access to wp-admin login screens (for developers) +* New: added custom css option to apply extra css styling rules from plugin settings +* New: added custom css option to each form allowing you to apply extra styling rules per form +* New: added option to customize profile fields area width (per form basis) besides global option +* Tweak: compatibility with default permalinks (Pretty permalinks are strongly recommended though!) +* Tweak: improved the function that gets user IP address +* Tweak: performance: inline css from the plugin is automatically compressed/minified + += 1.0.28: January 27, 2015 = + +* New: added compatibility with wpMandrill to handle email delivery +* Fixed: Issue with profile edit menu not appearing + += 1.0.27: January 27, 2015 = + +* Fixed: WP admin bar issue with some plugins and themes +* Fixed: conflict with WP Recent Comments With Avatars plugin + += 1.0.26: January 26, 2015 = + +* Fixed: Important issue fix (update recommended) + += 1.0.25: January 26, 2015 = + +* New: addded support to use gravatars (optionally) If the user does not have a custom avatar +* New: um_user_permissions_filter hook (for developer use) +* Tweak: plugin uses get_avatar() properly now +* Fixed: user avatars in backend are fixed +* Fixed: Mobile_Detect class does not throw php error if it was previously called +* Fixed: corrected a few translations errors + += 1.0.24: January 26, 2015 = + +* Tweak: predefined fields are now localized (translatable) +* Fixed: PHP warning in comments was fixed +* Fixed: avatars in comments + += 1.0.23: January 25, 2015 = + +* Fixed: important bugfix with profile editing + += 1.0.22: January 25, 2015 = + +* New: option to set maximum profile fields area width +* New: ajax functions for future development use +* Tweak: improved profile permalinks for e-mail based usernames +* Tweak: disable user from editing username (If admin put the username field by mistake in profile) +* Tweak: minor css changes +* Fixed: ability to clear conditional logic from fields in backend +* Fixed: corrected spacing issue in a multi-column layout in profile + += 1.0.21: January 24, 2015 = + +* New: Added ajax action hook for development use +* New: Extended profile hooks +* New: you can restrict / apply access control to woocommerce shop page +* Fixed: content restriction for woocommerce shop page + += 1.0.20: January 24, 2015 = + +* New: Custom email is sent to user after resetting/changing password +* New: Added action/filter hooks to profile +* Tweak: Improved a few core functions +* Fixed: Encoding issue with non-english sites fixed + += 1.0.19: January 23, 2015 = + +* New: Border thickness option for members directory +* New: Option to show/hide forgot password link on login form +* Tweak: Capital initials on members directory +* Fixed: Issue with row styling in form builder +* Fixed: Conditional logic bug fixes +* Fixed: Icon for conditional rules in backend +* Fixed: php warning in debug mode +* Fixed: Mobile/phone number validation fixed + += 1.0.18: January 23, 2015 = + +* Fixed: Issue with drag and drop form builder +* Fixed: Form builder trash icon in backend +* Fixed: Minor css adjustments in frontend + += 1.0.17: January 22, 2015 = + +* New: WordPress Multi-site compatibility for user uploads and photos +* Fixed: Searching members by username or email in directory (partial search supported) +* Fixed: Anonymous tracking +* Fixed: Minor css fixes + += 1.0.16: January 22, 2015 = + +* Fixed: Settings page: tracking popup removed + += 1.0.15: January 22, 2015 = + +* New: User profiles now show a cool message if the user profile field area is empty +* New: Added 'visibility' setting to all field types in backend +* Tweak: Members search function supports partial search matching +* Tweak: Deleting photo or file removes file from server +* Tweak: Deleting a user will delete all his personal uploads from the server +* Fixed: Duplicate tooltip for password field has been removed + += 1.0.10: January 22, 2015 = + +* Fixed: Template tags for welcome e-mail +* Fixed: {submitted_registration} e-mail template tag + += 1.0.0: January, 2015 = + +* First official release! diff --git a/gulpfile.js b/gulpfile.js index 5a9ae908..12039bd5 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,97 +2,283 @@ Ultimate Member dependencies */ -var gulp = require('gulp') -, uglify = require('gulp-uglify'), - sass = require('gulp-sass'), - rename = require('gulp-rename'), - cleanCSS = require( 'gulp-clean-css' ); +// var gulp = require('gulp') +// , uglify = require('gulp-uglify'), +// sass = require('gulp-sass'), +// rename = require('gulp-rename'), +// cleanCSS = require( 'gulp-clean-css' ); + +const { src, dest, parallel } = require( 'gulp' ); +const sass = require( 'gulp-sass' )( require( 'sass' ) ); +const uglify = require( 'gulp-uglify' ); +const cleanCSS = require( 'gulp-clean-css' ); +const rename = require( 'gulp-rename' ); // task -gulp.task( 'default', function ( done ) { - sass.compiler = require( 'node-sass' ); +// gulp.task( 'default', function ( done ) { +// sass.compiler = require( 'node-sass' ); +// +// gulp.src(['assets/sass/*.sass']).pipe( sass().on( 'error', sass.logError ) ).pipe( gulp.dest( 'assets/css' ) ); +// +// gulp.src(['assets/js/*.js','!assets/js/*.min.js']) // path to your files +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/js/' ) ); +// +// gulp.src(['assets/js/admin/*.js','!assets/js/admin/*.min.js']) // path to your files +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/js/admin/' ) ); +// gulp.src(['assets/css/admin/*.css', '!assets/css/admin/*.min.css',]) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/css/admin/' ) ); +// +// gulp.src(['assets/css/*.css', '!assets/css/*.min.css',]) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/css/' ) ); +// +// // full CSS files +// gulp.src(['assets/css/admin/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( gulp.dest( 'assets/css/admin/' ) ); +// // min CSS files +// gulp.src(['assets/css/admin/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/css/admin/' ) ); +// +// // full CSS files +// gulp.src(['assets/css/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( gulp.dest( 'assets/css/' ) ); +// // min CSS files +// gulp.src(['assets/css/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/css/' ) ); +// +// gulp.src(['assets/libs/legacy/fonticons/*.css', '!assets/libs/legacy/fonticons/*.min.css',]) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/libs/legacy/fonticons/' ) ); +// +// // Dropdown lib +// // full CSS files +// gulp.src(['assets/libs/dropdown/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( gulp.dest( 'assets/libs/dropdown/' ) ); +// // min CSS files +// gulp.src(['assets/libs/dropdown/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/libs/dropdown/' ) ); +// gulp.src(['assets/libs/dropdown/*.js', '!assets/libs/dropdown/*.min.js',]) +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/libs/dropdown/' ) ); +// +// // Modal lib +// // full CSS files +// gulp.src(['assets/libs/modal/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( gulp.dest( 'assets/libs/modal/' ) ); +// // min CSS files +// gulp.src(['assets/libs/modal/*.sass']) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/libs/modal/' ) ); +// gulp.src(['assets/libs/modal/*.js', '!assets/libs/modal/*.min.js',]) +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/libs/modal/' ) ); +// +// // Raty lib +// gulp.src(['assets/libs/raty/*.css', '!assets/libs/raty/*.min.css',]) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/libs/raty/' ) ); +// gulp.src(['assets/libs/raty/*.js', '!assets/libs/raty/*.min.js',]) +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/libs/raty/' ) ); +// +// // Tipsy lib +// gulp.src(['assets/libs/tipsy/*.css', '!assets/libs/tipsy/*.min.css',]) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/libs/tipsy/' ) ); +// gulp.src(['assets/libs/tipsy/*.js', '!assets/libs/tipsy/*.min.js',]) +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/libs/tipsy/' ) ); +// +// // Pickadate lib +// gulp.src(['assets/libs/pickadate/*.css', '!assets/libs/pickadate/*.min.css',]) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( gulp.dest( 'assets/libs/pickadate/' ) ); +// gulp.src(['assets/libs/pickadate/*.js', '!assets/libs/pickadate/*.min.js',]) +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/libs/pickadate/' ) ); +// gulp.src(['assets/libs/pickadate/translations/*.js', '!assets/libs/pickadate/translations/*.min.js',]) +// .pipe( uglify() ) +// .pipe( rename({ suffix: '.min' }) ) +// .pipe( gulp.dest( 'assets/libs/pickadate/translations/' ) ); +// +// done(); +// }); +// +// function js( path ) { +// return src( ['assets/' + path + '/js/*.js', '!assets/' + path + '/js/*.min.js'] ) +// .pipe( uglify() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( dest( 'assets/' + path + '/js' ) ); +// } +// +// function css( path ) { +// sass.compiler = require( 'node-sass' ); +// +// var src_array = exclude_css( path ); +// return src( src_array ) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( dest( 'assets/' + path + '/css' ) ); +// } +// +// function min_css( path ) { +// sass.compiler = require( 'node-sass' ); +// +// var src_array = exclude_css( path ); +// return src( src_array ) +// .pipe( sass().on( 'error', sass.logError ) ) +// .pipe( cleanCSS() ) +// .pipe( rename( { suffix: '.min' } ) ) +// .pipe( dest( 'assets/' + path + '/css' ) ); +// } - gulp.src(['assets/sass/*.sass']).pipe( sass().on( 'error', sass.logError ) ).pipe( gulp.dest( 'assets/css' ) ); +function defaultTask( done ) { + // sass.compiler = require( 'node-sass' ); - gulp.src(['assets/js/*.js','!assets/js/*.min.js']) // path to your files - .pipe( uglify() ) - .pipe( rename({ suffix: '.min' }) ) - .pipe( gulp.dest( 'assets/js/' ) ); + src(['assets/sass/*.sass']).pipe( sass().on( 'error', sass.logError ) ).pipe( dest( 'assets/css' ) ); - gulp.src(['assets/js/admin/*.js','!assets/js/admin/*.min.js']) // path to your files - .pipe( uglify() ) - .pipe( rename({ suffix: '.min' }) ) - .pipe( gulp.dest( 'assets/js/admin/' ) ); - gulp.src(['assets/css/admin/*.css', '!assets/css/admin/*.min.css',]) + src(['assets/js/*.js','!assets/js/*.min.js']) // path to your files + .pipe( uglify() ) + .pipe( rename({ suffix: '.min' }) ) + .pipe( dest( 'assets/js/' ) ); + + src(['assets/js/admin/*.js','!assets/js/admin/*.min.js']) // path to your files + .pipe( uglify() ) + .pipe( rename({ suffix: '.min' }) ) + .pipe( dest( 'assets/js/admin/' ) ); + src(['assets/css/admin/*.css', '!assets/css/admin/*.min.css',]) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/css/admin/' ) ); + .pipe( dest( 'assets/css/admin/' ) ); - gulp.src(['assets/css/*.css', '!assets/css/*.min.css',]) + src(['assets/css/*.css', '!assets/css/*.min.css',]) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/css/' ) ); + .pipe( dest( 'assets/css/' ) ); // full CSS files - gulp.src(['assets/css/admin/*.sass']) + src(['assets/css/admin/*.sass']) .pipe( sass().on( 'error', sass.logError ) ) - .pipe( gulp.dest( 'assets/css/admin/' ) ); + .pipe( dest( 'assets/css/admin/' ) ); // min CSS files - gulp.src(['assets/css/admin/*.sass']) + src(['assets/css/admin/*.sass']) .pipe( sass().on( 'error', sass.logError ) ) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/css/admin/' ) ); + .pipe( dest( 'assets/css/admin/' ) ); // full CSS files - gulp.src(['assets/css/*.sass']) + src(['assets/css/*.sass']) .pipe( sass().on( 'error', sass.logError ) ) - .pipe( gulp.dest( 'assets/css/' ) ); + .pipe( dest( 'assets/css/' ) ); // min CSS files - gulp.src(['assets/css/*.sass']) + src(['assets/css/*.sass']) .pipe( sass().on( 'error', sass.logError ) ) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/css/' ) ); + .pipe( dest( 'assets/css/' ) ); - gulp.src(['assets/libs/legacy/fonticons/*.css', '!assets/libs/legacy/fonticons/*.min.css',]) + src(['assets/libs/legacy/fonticons/*.css', '!assets/libs/legacy/fonticons/*.min.css',]) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/libs/legacy/fonticons/' ) ); + .pipe( dest( 'assets/libs/legacy/fonticons/' ) ); + + // Dropdown lib + // full CSS files + src(['assets/libs/dropdown/*.sass']) + .pipe( sass().on( 'error', sass.logError ) ) + .pipe( dest( 'assets/libs/dropdown/' ) ); + // min CSS files + src(['assets/libs/dropdown/*.sass']) + .pipe( sass().on( 'error', sass.logError ) ) + .pipe( cleanCSS() ) + .pipe( rename( { suffix: '.min' } ) ) + .pipe( dest( 'assets/libs/dropdown/' ) ); + src(['assets/libs/dropdown/*.js', '!assets/libs/dropdown/*.min.js',]) + .pipe( uglify() ) + .pipe( rename({ suffix: '.min' }) ) + .pipe( dest( 'assets/libs/dropdown/' ) ); + + // Modal lib + // full CSS files + src(['assets/libs/modal/*.sass']) + .pipe( sass().on( 'error', sass.logError ) ) + .pipe( dest( 'assets/libs/modal/' ) ); + // min CSS files + src(['assets/libs/modal/*.sass']) + .pipe( sass().on( 'error', sass.logError ) ) + .pipe( cleanCSS() ) + .pipe( rename( { suffix: '.min' } ) ) + .pipe( dest( 'assets/libs/modal/' ) ); + src(['assets/libs/modal/*.js', '!assets/libs/modal/*.min.js',]) + .pipe( uglify() ) + .pipe( rename({ suffix: '.min' }) ) + .pipe( dest( 'assets/libs/modal/' ) ); // Raty lib - gulp.src(['assets/libs/raty/*.css', '!assets/libs/raty/*.min.css',]) + src(['assets/libs/raty/*.css', '!assets/libs/raty/*.min.css',]) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/libs/raty/' ) ); - gulp.src(['assets/libs/raty/*.js', '!assets/libs/raty/*.min.js',]) + .pipe( dest( 'assets/libs/raty/' ) ); + src(['assets/libs/raty/*.js', '!assets/libs/raty/*.min.js',]) .pipe( uglify() ) .pipe( rename({ suffix: '.min' }) ) - .pipe( gulp.dest( 'assets/libs/raty/' ) ); + .pipe( dest( 'assets/libs/raty/' ) ); // Tipsy lib - gulp.src(['assets/libs/tipsy/*.css', '!assets/libs/tipsy/*.min.css',]) + src(['assets/libs/tipsy/*.css', '!assets/libs/tipsy/*.min.css',]) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/libs/tipsy/' ) ); - gulp.src(['assets/libs/tipsy/*.js', '!assets/libs/tipsy/*.min.js',]) + .pipe( dest( 'assets/libs/tipsy/' ) ); + src(['assets/libs/tipsy/*.js', '!assets/libs/tipsy/*.min.js',]) .pipe( uglify() ) .pipe( rename({ suffix: '.min' }) ) - .pipe( gulp.dest( 'assets/libs/tipsy/' ) ); + .pipe( dest( 'assets/libs/tipsy/' ) ); // Pickadate lib - gulp.src(['assets/libs/pickadate/*.css', '!assets/libs/pickadate/*.min.css',]) + src(['assets/libs/pickadate/*.css', '!assets/libs/pickadate/*.min.css',]) .pipe( cleanCSS() ) .pipe( rename( { suffix: '.min' } ) ) - .pipe( gulp.dest( 'assets/libs/pickadate/' ) ); - gulp.src(['assets/libs/pickadate/*.js', '!assets/libs/pickadate/*.min.js',]) + .pipe( dest( 'assets/libs/pickadate/' ) ); + src(['assets/libs/pickadate/*.js', '!assets/libs/pickadate/*.min.js',]) .pipe( uglify() ) .pipe( rename({ suffix: '.min' }) ) - .pipe( gulp.dest( 'assets/libs/pickadate/' ) ); - gulp.src(['assets/libs/pickadate/translations/*.js', '!assets/libs/pickadate/translations/*.min.js',]) + .pipe( dest( 'assets/libs/pickadate/' ) ); + src(['assets/libs/pickadate/translations/*.js', '!assets/libs/pickadate/translations/*.min.js',]) .pipe( uglify() ) .pipe( rename({ suffix: '.min' }) ) - .pipe( gulp.dest( 'assets/libs/pickadate/translations/' ) ); + .pipe( dest( 'assets/libs/pickadate/translations/' ) ); - done(); -}); + done(); +} +exports.default = defaultTask; diff --git a/includes/admin/class-admin.php b/includes/admin/class-admin.php index 0ca641eb..88ebb2a1 100644 --- a/includes/admin/class-admin.php +++ b/includes/admin/class-admin.php @@ -1,6 +1,8 @@ setup()->install_default_pages(); - //check empty pages in settings - $empty_pages = array(); - - $pages = UM()->config()->permalinks; - if ( $pages && is_array( $pages ) ) { - foreach ( $pages as $slug => $page_id ) { - $page = get_post( $page_id ); - - if ( ! isset( $page->ID ) && array_key_exists( $slug, UM()->config()->core_pages ) ) { - $empty_pages[] = $slug; - } - } - } - - //if there aren't empty pages - then hide pages notice - if ( empty( $empty_pages ) ) { - $hidden_notices = get_option( 'um_hidden_admin_notices', array() ); - $hidden_notices[] = 'wrong_pages'; - - update_option( 'um_hidden_admin_notices', $hidden_notices ); - } + // Auto dismiss 'wrong_pages' notice if it's visible + $this->dismiss_wrong_pages(); $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ); wp_safe_redirect( $url ); exit; } + /** + * Install predefined page based on $_REQUEST['um_page_slug'] argument. + */ + public function install_predefined_page() { + if ( ! current_user_can( 'manage_options' ) ) { + $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ); + wp_safe_redirect( $url ); + exit; + } + + $predefined_pages = array_keys( UM()->config()->get( 'predefined_pages' ) ); + + // phpcs:ignore WordPress.Security.NonceVerification -- early nonce verification based on `um_adm_action` + $page_slug = array_key_exists( 'um_page_slug', $_REQUEST ) ? sanitize_key( $_REQUEST['um_page_slug'] ) : ''; + + if ( empty( $page_slug ) || ! in_array( $page_slug, $predefined_pages, true ) ) { + $url = add_query_arg( array( 'page' => 'um_options' ), admin_url( 'admin.php' ) ); + wp_safe_redirect( $url ); + exit; + } + + $post_ids = new WP_Query( + array( + 'post_type' => 'page', + 'meta_query' => array( + array( + 'key' => '_um_core', + 'value' => $page_slug, + ), + ), + 'posts_per_page' => -1, + 'fields' => 'ids', + ) + ); + + $post_ids = $post_ids->get_posts(); + + if ( ! empty( $post_ids ) ) { + foreach ( $post_ids as $post_id ) { + delete_post_meta( $post_id, '_um_core' ); + } + } + + UM()->setup()->predefined_page( $page_slug ); + + // Auto dismiss 'wrong_pages' notice if it's visible + $this->dismiss_wrong_pages(); + + $url = add_query_arg( + array( + 'page' => 'um_options', + 'update' => 'um_settings_updated', + ), + admin_url( 'admin.php' ) + ); + wp_safe_redirect( $url ); + exit; + } + + /** + * Dismiss 'wrong_pages' notice if it's visible. + */ + public function dismiss_wrong_pages() { + // Check empty pages in settings. + $empty_pages = array(); + + $predefined_pages = array_keys( UM()->config()->get( 'predefined_pages' ) ); + foreach ( $predefined_pages as $slug ) { + $page_id = um_get_predefined_page_id( $slug ); + if ( ! $page_id ) { + $empty_pages[] = $slug; + continue; + } + + $page = get_post( $page_id ); + if ( ! $page ) { + $empty_pages[] = $slug; + continue; + } + } + + // If there aren't empty pages - then hide pages notice + if ( empty( $empty_pages ) ) { + $hidden_notices = get_option( 'um_hidden_admin_notices', array() ); + if ( ! is_array( $hidden_notices ) ) { + $hidden_notices = array(); + } + + $hidden_notices[] = 'wrong_pages'; + + update_option( 'um_hidden_admin_notices', $hidden_notices ); + } + } + /** * Clear all users cache. */ @@ -1826,19 +1904,7 @@ if ( ! class_exists( 'um\admin\Admin' ) ) { * Manual check templates versions. */ public function check_templates_version() { - $templates = UM()->admin_settings()->get_override_templates( true ); - $out_date = false; - - foreach ( $templates as $template ) { - if ( 0 === $template['status_code'] ) { - $out_date = true; - break; - } - } - - if ( false === $out_date ) { - delete_option( 'um_override_templates_outdated' ); - } + UM()->common()->theme()->flush_transient_templates_data(); $url = add_query_arg( array( diff --git a/includes/admin/class-enqueue.php b/includes/admin/class-enqueue.php index 01118a53..d17bfc88 100644 --- a/includes/admin/class-enqueue.php +++ b/includes/admin/class-enqueue.php @@ -95,16 +95,17 @@ final class Enqueue extends \um\common\Enqueue { * @since 2.6.1 */ public function block_editor() { - $suffix = self::get_suffix(); - $js_url = self::get_url( 'js' ); - $css_url = self::get_url( 'css' ); + $suffix = self::get_suffix(); + $js_url = self::get_url( 'js' ); + $css_url = self::get_url( 'css' ); + $libs_url = self::get_url( 'libs' ); $this->load_gutenberg_js(); wp_register_script( 'um_admin_blocks_shortcodes', $js_url . 'admin/block-renderer' . $suffix . '.js', array( 'wp-i18n', 'wp-blocks', 'wp-components' ), UM_VERSION, true ); wp_set_script_translations( 'um_admin_blocks_shortcodes', 'ultimate-member' ); - $notifications_enabled = 0; + $notifications_enabled = false; if ( false !== UM()->account()->is_notifications_tab_visible() ) { $notifications_enabled = UM()->options()->get( 'account_tab_notifications' ); } @@ -112,7 +113,7 @@ final class Enqueue extends \um\common\Enqueue { $um_account_settings = array( 'general' => array( 'label' => __( 'General', 'ultimate-member' ), - 'enabled' => 1, + 'enabled' => true, ), 'password' => array( 'label' => __( 'Password', 'ultimate-member' ), @@ -192,10 +193,14 @@ final class Enqueue extends \um\common\Enqueue { wp_register_style( 'um_styles', $css_url . 'um-styles' . $suffix . '.css', array( 'um_ui', 'um_tipsy', 'um_raty', 'um_fonticons_ii', 'um_fonticons_fa', 'select2' ), UM_VERSION ); wp_register_style( 'um_profile', $css_url . 'um-profile' . $suffix . '.css', array(), UM_VERSION ); - wp_register_style( 'um_responsive', $css_url . 'um-responsive' . $suffix . '.css', array( 'um_profile', 'um_crop' ), UM_VERSION ); + wp_register_style( 'um_responsive', $css_url . 'um-responsive' . $suffix . '.css', array( 'um_profile' ), UM_VERSION ); wp_register_style( 'um_account', $css_url . 'um-account' . $suffix . '.css', array(), UM_VERSION ); wp_register_style( 'um_default_css', $css_url . 'um-old-default' . $suffix . '.css', array(), UM_VERSION ); + wp_register_style( 'um_datetime', $libs_url . 'pickadate/default' . $suffix . '.css', array(), '3.6.2' ); + wp_register_style( 'um_datetime_date', $libs_url . 'pickadate/default.date' . $suffix . '.css', array( 'um_datetime' ), '3.6.2' ); + wp_register_style( 'um_datetime_time', $libs_url . 'pickadate/default.time' . $suffix . '.css', array( 'um_datetime' ), '3.6.2' ); + wp_enqueue_style( 'um_default_css' ); wp_enqueue_style( 'um_members' ); wp_enqueue_style( 'um_styles' ); @@ -203,6 +208,9 @@ final class Enqueue extends \um\common\Enqueue { wp_enqueue_style( 'um_responsive' ); wp_enqueue_style( 'um_account' ); + wp_enqueue_style( 'um_datetime_date' ); + wp_enqueue_style( 'um_datetime_time' ); + $custom_css = '.wp-block .um{opacity: 1;}.um_request_name {display: none !important;}'; wp_add_inline_style( 'um_styles', $custom_css ); @@ -584,10 +592,10 @@ final class Enqueue extends \um\common\Enqueue { wp_enqueue_style( 'um_admin_roles' ); } elseif ( 'ultimate-member_page_um_options' === $hook ) { // phpcs:ignore WordPress.Security.NonceVerification - if ( isset( $_GET['tab'], $_GET['section'] ) && 'advanced' === $_GET['tab'] && 'secure' === $_GET['section'] ) { - wp_register_script( 'um_admin_secure', $js_url . 'admin/secure' . $suffix . '.js', array( 'jquery', 'wp-i18n' ), UM_VERSION, true ); - wp_set_script_translations( 'um_admin_secure', 'ultimate-member' ); - wp_enqueue_script( 'um_admin_secure' ); + if ( isset( $_GET['tab'], $_GET['section'] ) && 'advanced' === $_GET['tab'] && 'security' === $_GET['section'] ) { + wp_register_script( 'um_admin_security', $js_url . 'admin/security' . $suffix . '.js', array( 'jquery', 'wp-i18n' ), UM_VERSION, true ); + wp_set_script_translations( 'um_admin_security', 'ultimate-member' ); + wp_enqueue_script( 'um_admin_security' ); } // phpcs:ignore WordPress.Security.NonceVerification diff --git a/includes/admin/class-secure.php b/includes/admin/class-secure.php index 2830bd85..d9d56af0 100644 --- a/includes/admin/class-secure.php +++ b/includes/admin/class-secure.php @@ -90,11 +90,6 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { */ public function admin_init() { global $wpdb; - // Dismiss admin notice after the first visit to Secure settings page. - if ( isset( $_REQUEST['page'], $_REQUEST['tab'], $_REQUEST['section'] ) && 'um_options' === sanitize_key( $_REQUEST['page'] ) && 'advanced' === sanitize_key( $_REQUEST['tab'] ) && 'secure' === sanitize_key( $_REQUEST['section'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification - UM()->admin()->notices()->dismiss( 'secure_settings' ); - } - if ( isset( $_REQUEST['um_secure_expire_all_sessions'] ) && ! wp_doing_ajax() ) { if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'um-secure-expire-session-nonce' ) || ! current_user_can( 'manage_options' ) ) { // This nonce is not valid or current logged-in user has no administrative rights. @@ -300,10 +295,16 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { ) ); - $settings['advanced']['sections']['secure'] = array( - 'title' => __( 'Secure', 'ultimate-member' ), - 'description' => __( 'This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed.', 'ultimate-member' ), - 'fields' => $secure_fields, + $settings['advanced']['sections'] = UM()->array_insert_before( + $settings['advanced']['sections'], + 'developers', + array( + 'security' => array( + 'title' => __( 'Security', 'ultimate-member' ), + 'description' => __( 'This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed.', 'ultimate-member' ), + 'fields' => $secure_fields, + ), + ) ); return $settings; @@ -330,7 +331,7 @@ if ( ! class_exists( 'um\admin\Secure' ) ) { $val .= '
    ' . esc_html__( 'Blocked Due to Suspicious Activity', 'ultimate-member' ) . '
    '; $nonce = wp_create_nonce( 'um-security-restore-account-nonce-' . $user_id ); $restore_account_url = admin_url( 'users.php?user_id=' . $user_id . '&um_secure_restore_account=1&_wpnonce=' . $nonce ); - $action = ' · ' . esc_html__( 'Restore Account', 'ultimate-member' ) . ''; + $action = ' · ' . esc_html__( 'Restore Account', 'ultimate-member' ) . ''; if ( ! empty( $datetime ) ) { $val .= '
    ' . human_time_diff( strtotime( $datetime ) ) . ' ' . __( 'ago', 'ultimate-member' ) . '' . $action . '
    '; } diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index 58d9dd9f..30406f7c 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -12,11 +12,69 @@ if ( ! defined( 'ABSPATH' ) ) { */ class Site_Health { + /** + * String of a badge color. + * Options: blue, green, red, orange, purple and gray. + * + * @see https://make.wordpress.org/core/2019/04/25/site-health-check-in-5-2/ + * + * @since 2.8.3 + */ + const BADGE_COLOR = 'blue'; + /** * Site_Health constructor. */ public function __construct() { add_filter( 'debug_information', array( $this, 'debug_information' ), 20 ); + add_filter( 'site_status_tests', array( $this, 'register_site_status_tests' ) ); + } + + public function register_site_status_tests( $tests ) { + $custom_templates = UM()->common()->theme()->get_custom_templates_list(); + + if ( ! empty( $custom_templates ) ) { + $tests['direct']['um_override_templates'] = array( + 'label' => esc_html__( 'Are the Ultimate Member templates out of date?', 'ultimate-member' ), + 'test' => array( $this, 'override_templates_test' ), + ); + } + + return $tests; + } + + public function override_templates_test() { + $result = array( + 'label' => __( 'You have the most recent version of custom Ultimate Member templates', 'ultimate-member' ), + 'status' => 'good', + 'badge' => array( + 'label' => UM_PLUGIN_NAME, + 'color' => self::BADGE_COLOR, + ), + 'description' => sprintf( + '

    %s

    ', + __( 'Your custom Ultimate Member templates that are situated in the theme have the most recent version and are ready to use.', 'ultimate-member' ) + ), + 'actions' => '', + 'test' => 'um_override_templates', + ); + + if ( UM()->common()->theme()->is_outdated_template_exist() ) { + $result['label'] = __( 'Your custom templates are out of date', 'ultimate-member' ); + $result['status'] = 'critical'; + $result['badge']['color'] = 'red'; + $result['description'] = sprintf( + '

    %s

    ', + __( 'Your custom Ultimate Member templates that are situated in the theme are out of date and may break the website\'s functionality.', 'ultimate-member' ) + ); + $result['actions'] = sprintf( + '

    %s

    ', + admin_url( 'admin.php?page=um_options&tab=advanced§ion=override_templates' ), + esc_html__( 'Check status and update', 'ultimate-member' ) + ); + } + + return $result; } private function get_roles() { @@ -107,7 +165,7 @@ class Site_Health { $pages = array(); $predefined_pages = UM()->config()->core_pages; foreach ( $predefined_pages as $page_s => $page ) { - $page_id = UM()->options()->get_core_page_id( $page_s ); + $page_id = UM()->options()->get_predefined_page_option_key( $page_s ); $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; if ( empty( $page_title ) ) { continue; @@ -290,7 +348,7 @@ class Site_Health { } $account_settings['um-account_email'] = array( - 'label' => __( 'Allow users to change e-mail', 'ultimate-member' ), + 'label' => __( 'Allow users to change email', 'ultimate-member' ), 'value' => UM()->options()->get( 'account_email' ) ? $labels['yes'] : $labels['no'], ); @@ -455,7 +513,7 @@ class Site_Health { 'value' => UM()->options()->get( 'enable_reset_password_limit' ) ? $labels['yes'] : $labels['no'], ), ); - if ( 1 === absint( UM()->options()->get( 'enable_reset_password_limit' ) ) ) { + if ( UM()->options()->get( 'enable_reset_password_limit' ) ) { $access_other_settings['um-reset_password_limit_number'] = array( 'label' => __( 'Reset Password Limit ', 'ultimate-member' ), 'value' => UM()->options()->get( 'reset_password_limit_number' ), @@ -485,7 +543,7 @@ class Site_Health { // Email settings $email_settings = array( 'um-admin_email' => array( - 'label' => __( 'Admin E-mail Address', 'ultimate-member' ), + 'label' => __( 'Admin Email Address', 'ultimate-member' ), 'value' => UM()->options()->get( 'admin_email' ), ), 'um-mail_from' => array( @@ -497,7 +555,7 @@ class Site_Health { 'value' => UM()->options()->get( 'mail_from_addr' ), ), 'um-email_html' => array( - 'label' => __( 'Use HTML for E-mails?', 'ultimate-member' ), + 'label' => __( 'Use HTML for Emails?', 'ultimate-member' ), 'value' => UM()->options()->get( 'email_html' ) ? $labels['yes'] : $labels['no'], ), ); @@ -1362,7 +1420,7 @@ class Site_Health { $info[ 'ultimate-member-' . $key ]['fields'], array( 'um-url_email_activate' => array( - 'label' => __( 'URL redirect after e-mail activation', 'ultimate-member' ), + 'label' => __( 'URL redirect after email activation', 'ultimate-member' ), 'value' => $rolemeta['_um_url_email_activate'], ), ) @@ -1788,7 +1846,7 @@ class Site_Health { 'first_name' => __( 'First Name', 'ultimate-member' ), 'last_name' => __( 'Last Name', 'ultimate-member' ), 'nickname' => __( 'Nickname', 'ultimate-member' ), - 'secondary_user_email' => __( 'Secondary E-mail Address', 'ultimate-member' ), + 'secondary_user_email' => __( 'Secondary Email Address', 'ultimate-member' ), 'description' => __( 'Biography', 'ultimate-member' ), 'phone_number' => __( 'Phone Number', 'ultimate-member' ), 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), diff --git a/includes/admin/core/class-admin-columns.php b/includes/admin/core/class-admin-columns.php index 212edfac..9baa4527 100644 --- a/includes/admin/core/class-admin-columns.php +++ b/includes/admin/core/class-admin-columns.php @@ -244,7 +244,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Columns' ) ) { public function add_display_post_states( $post_states, $post ) { foreach ( UM()->config()->core_pages as $page_key => $page_value ) { - $page_id = UM()->options()->get( UM()->options()->get_core_page_id( $page_key ) ); + $page_id = UM()->options()->get( UM()->options()->get_predefined_page_option_key( $page_key ) ); if ( $page_id == $post->ID ) { $post_states[ 'um_core_page_' . $page_key ] = sprintf( 'UM %s', $page_value['title'] ); diff --git a/includes/admin/core/class-admin-forms.php b/includes/admin/core/class-admin-forms.php index 10def99d..69a579d1 100644 --- a/includes/admin/core/class-admin-forms.php +++ b/includes/admin/core/class-admin-forms.php @@ -1159,7 +1159,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { $button = ''; $slug = str_replace( 'core_', '', $field_data['id'] ); if ( ! um_get_predefined_page_id( $slug ) || 'publish' !== get_post_status( um_get_predefined_page_id( $slug ) ) ) { - $button = ' ' . esc_html__( 'Create Default', 'ultimate-member' ) . ''; + $button = ' ' . esc_html__( 'Create Default', 'ultimate-member' ) . ''; } $html = "$hidden$button"; @@ -1852,5 +1852,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Forms' ) ) { return $value; } + + public function render_external_link( $data ) { + $defaults = array( + 'url' => '', + 'html' => '', + ); + $data = wp_parse_args( $data, $defaults ); + if ( empty( $data['url'] ) || empty( $data['html'] ) ) { + return ''; + } + ob_start(); + ?> + + + + + diff --git a/includes/admin/core/class-admin-notices.php b/includes/admin/core/class-admin-notices.php index 9a251f81..8ea72173 100644 --- a/includes/admin/core/class-admin-notices.php +++ b/includes/admin/core/class-admin-notices.php @@ -31,8 +31,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { add_action( 'wp_ajax_um_dismiss_notice', array( &$this, 'dismiss_notice' ) ); add_action( 'admin_init', array( &$this, 'force_dismiss_notice' ) ); - - add_action( 'current_screen', array( &$this, 'create_list_for_screen' ) ); } /** @@ -51,8 +49,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { $this->extensions_page(); - $this->template_version(); - $this->child_theme_required(); // Removed for now to avoid the bad reviews. @@ -82,13 +78,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { do_action( 'um_admin_create_notices' ); } - public function create_list_for_screen() { - if ( UM()->admin()->screen()->is_own_screen() ) { - $this->secure_settings(); - } - } - - /** * @return array */ @@ -587,9 +576,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { } } - - function check_wrong_licenses() { - $invalid_license = 0; + public function check_wrong_licenses() { + $invalid_license = 0; $arr_inactive_license_keys = array(); if ( empty( UM()->admin_settings()->settings_structure['licenses']['fields'] ) ) { @@ -599,10 +587,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { foreach ( UM()->admin_settings()->settings_structure['licenses']['fields'] as $field_data ) { $license = get_option( "{$field_data['id']}_edd_answer" ); - if ( ( is_object( $license ) && 'valid' == $license->license ) || 'valid' == $license ) + if ( ( is_object( $license ) && isset( $license->license ) && 'valid' === $license->license ) || 'valid' === $license ) { continue; + } - if ( ( is_object( $license ) && 'inactive' == $license->license ) || 'inactive' == $license ) { + if ( ( is_object( $license ) && isset( $license->license ) && 'inactive' === $license->license ) || 'inactive' === $license ) { $arr_inactive_license_keys[] = $license->item_name; } @@ -614,7 +603,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { 'license_key', array( 'class' => 'error', - // translators: %1$s is a inactive license number; %2$s is a plugin name; %3$s is a store link. + // translators: %1$s is an inactive license number; %2$s is a plugin name; %3$s is a store link. 'message' => '

    ' . sprintf( __( 'There are %1$s inactive %2$s license keys for this site. This site is not authorized to get plugin updates. You can active this site on www.ultimatemember.com.', 'ultimate-member' ), count( $arr_inactive_license_keys ), UM_PLUGIN_NAME, UM()->store_url ) . '

    ', ), 3 @@ -622,12 +611,20 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { } if ( $invalid_license ) { + $licenses_page_url = add_query_arg( + array( + 'page' => 'um_options', + 'tab' => 'licenses', + ), + admin_url( 'admin.php' ) + ); + $this->add_notice( 'license_key', array( 'class' => 'error', - // translators: %1$s is a invalid license; %2$s is a plugin name; %3$s is a license link. - 'message' => '

    ' . sprintf( __( 'You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue.', 'ultimate-member' ), $invalid_license, UM_PLUGIN_NAME, add_query_arg( array( 'page' => 'um_options', 'tab' => 'licenses' ), admin_url( 'admin.php' ) ) ) . '

    ', + // translators: %1$s is an invalid license; %2$s is a plugin name; %3$s is a license link. + 'message' => '

    ' . sprintf( __( 'You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue.', 'ultimate-member' ), $invalid_license, UM_PLUGIN_NAME, $licenses_page_url ) . '

    ', ), 3 ); @@ -775,36 +772,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { ), 2 ); } - /** - * Check Templates Versions notice - */ - public function template_version() { - if ( true === (bool) get_option( 'um_override_templates_outdated' ) ) { - $link = admin_url( 'admin.php?page=um_options&tab=advanced§ion=override_templates' ); - ob_start(); - ?> - -

    - override templates status page and update templates.', 'ultimate-member' ), $link ), UM()->get_allowed_html( 'admin_notice' ) ); - ?> -

    - - admin()->notices()->add_notice( - 'um_override_templates_notice', - array( - 'class' => 'error', - 'message' => $message, - 'dismissible' => false, - ), - 10 - ); - } - } - /** * Check if there isn't installed child-theme. Child theme is required for safely saved customizations. */ @@ -820,7 +787,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) {

    child-theme for Ultimate Member customization, which hasn\'t dependencies with the official themes repo, so your custom files cannot be rewritten after a theme upgrade.
    Otherwise, the customization files may be deleted after every theme upgrade.', 'ultimate-member' ), 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ), UM()->get_allowed_html( 'admin_notice' ) ); + echo wp_kses( sprintf( __( 'We recommend using a child-theme for Ultimate Member customization. Unlike official theme repositories, child themes don\'t have dependencies that could lead to your custom files being overwritten during a theme upgrade.
    Without a child theme, your customization files may be deleted after every theme update.', 'ultimate-member' ), 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

    @@ -838,39 +805,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Notices' ) ) { } } - /** - * First time installed Secure settings. - */ - public function secure_settings() { - ob_start(); - ?> -

    -
    - -

    -

    - - -

    - add_notice( - 'secure_settings', - array( - 'class' => 'warning', - 'message' => $message, - 'dismissible' => true, - ), - 1 - ); - } - public function common_secure() { if ( UM()->options()->get( 'lock_register_forms' ) ) { ob_start(); ?>

    - Settings > Secure > Lock All Register Forms.', 'ultimate-member' ); ?> + Settings > Advanced > Security > Lock All Register Forms.', 'ultimate-member' ); ?>

    - Settings > Secure > Display Login form notice to reset passwords.', 'ultimate-member' ); ?> + Settings > Advanced > Security > Display Login form notice to reset passwords.', 'ultimate-member' ); ?>

    - Settings > Secure > Enable ban for administrative capabilities.', 'ultimate-member' ); ?> + Settings > Advanced > Security > Enable ban for administrative capabilities.', 'ultimate-member' ); ?>

    config()->core_pages; -// -// foreach ( $core_pages as $page_s => $page ) { -// $have_pages = UM()->query()->wp_pages(); -// $page_id = UM()->options()->get_core_page_id( $page_s ); -// -// $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; -// -// if ( 'reached_maximum_limit' === $have_pages ) { -// $general_pages_fields[] = array( -// 'id' => $page_id, -// 'type' => 'text', -// // translators: %s: Page title -// 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ), -// 'placeholder' => __( 'Add page ID', 'ultimate-member' ), -// 'compiler' => true, -// 'size' => 'small', -// ); -// } else { -// $general_pages_fields[] = array( -// 'id' => $page_id, -// 'type' => 'select', -// // translators: %s: Page title -// 'label' => sprintf( __( '%s page', 'ultimate-member' ), $page_title ), -// 'options' => UM()->query()->wp_pages(), -// 'placeholder' => __( 'Choose a page...', 'ultimate-member' ), -// 'compiler' => true, -// 'size' => 'small', -// ); -// } -// -// $settings_map[ $page_id ] = array( -// 'sanitize' => 'absint', -// ); -// } - foreach ( UM()->config()->get( 'predefined_pages' ) as $slug => $page ) { $page_id = UM()->options()->get_predefined_page_option_key( $slug ); $page_title = ! empty( $page['title'] ) ? $page['title'] : ''; @@ -360,6 +320,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $page_setting_description = __( 'Warning: User page must contain a profile form shortcode. You can get existing shortcode or create a new one here.', 'ultimate-member' ); } break; + case 'members': + if ( ! has_shortcode( $content, 'ultimatemember' ) ) { + $page_setting_description = __( 'Warning: Members page must contain a profile form shortcode. You can get existing shortcode or create a new one here.', 'ultimate-member' ); + } + break; default: $page_setting_description = apply_filters( 'um_pages_settings_description', $page_setting_description, $content, $slug ); break; @@ -385,9 +350,10 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $appearances_profile_menu_fields = array( array( - 'id' => 'profile_menu', - 'type' => 'checkbox', - 'label' => __( 'Enable profile menu', 'ultimate-member' ), + 'id' => 'profile_menu', + 'type' => 'checkbox', + 'label' => __( 'Profile menu', 'ultimate-member' ), + 'checkbox_label' => __( 'Enable profile menu', 'ultimate-member' ), ), ); @@ -413,12 +379,14 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { if ( isset( $tab['default_privacy'] ) ) { $fields = array( array( - 'id' => 'profile_tab_' . $id, - 'type' => 'checkbox', + 'id' => 'profile_tab_' . $id, + 'type' => 'checkbox', // translators: %s: Tab title - 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), - 'conditional' => array( 'profile_menu', '=', 1 ), - 'data' => array( 'fill_profile_menu_default_tab' => $id ), + 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), + // translators: %s: Tab title + 'checkbox_label' => sprintf( __( 'Enable %s Tab', 'ultimate-member' ), $tab['name'] ), + 'conditional' => array( 'profile_menu', '=', 1 ), + 'data' => array( 'fill_profile_menu_default_tab' => $id ), ), ); @@ -429,19 +397,20 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $fields = array( array( - 'id' => 'profile_tab_' . $id, - 'type' => 'checkbox', + 'id' => 'profile_tab_' . $id, + 'type' => 'checkbox', // translators: %s: Tab title - 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), - 'conditional' => array( 'profile_menu', '=', 1 ), - 'data' => array( 'fill_profile_menu_default_tab' => $id ), + 'label' => sprintf( __( '%s Tab', 'ultimate-member' ), $tab['name'] ), + 'checkbox_label' => sprintf( __( 'Enable %s Tab', 'ultimate-member' ), $tab['name'] ), + 'conditional' => array( 'profile_menu', '=', 1 ), + 'data' => array( 'fill_profile_menu_default_tab' => $id ), ), array( 'id' => 'profile_tab_' . $id . '_privacy', 'type' => 'select', // translators: %s: Tab title 'label' => sprintf( __( 'Who can see %s Tab?', 'ultimate-member' ), $tab['name'] ), - 'tooltip' => __( 'Select which users can view this tab.', 'ultimate-member' ), + 'description' => __( 'Select which users can view this tab.', 'ultimate-member' ), 'options' => UM()->profile()->tabs_privacy(), 'conditional' => array( 'profile_tab_' . $id, '=', 1 ), 'size' => 'small', @@ -451,7 +420,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'type' => 'select', 'multi' => true, 'label' => __( 'Allowed roles', 'ultimate-member' ), - 'tooltip' => __( 'Select the the user roles allowed to view this tab.', 'ultimate-member' ), + 'description' => __( 'Select the the user roles allowed to view this tab.', 'ultimate-member' ), 'options' => UM()->roles()->get_roles(), 'placeholder' => __( 'Choose user roles...', 'ultimate-member' ), 'conditional' => array( 'profile_tab_' . $id . '_privacy', '=', array( '4', '5' ) ), @@ -482,7 +451,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'id' => 'profile_menu_default_tab', 'type' => 'select', 'label' => __( 'Profile menu default tab', 'ultimate-member' ), - 'tooltip' => __( 'This will be the default tab on user profile page', 'ultimate-member' ), + 'description' => __( 'This will be the default tab on user profile page.', 'ultimate-member' ), 'options' => $tabs_options, 'conditional' => array( implode( '|', $tabs_condition ), '~', 1 ), 'size' => 'small', @@ -496,11 +465,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $appearances_profile_menu_fields, array( array( - 'id' => 'profile_menu_icons', - 'type' => 'checkbox', - 'label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ), - 'description' => __( '"Desktop view" means the profile block\'s width lower than 800px', 'ultimate-member' ), - 'conditional' => array( 'profile_menu', '=', 1 ), + 'id' => 'profile_menu_icons', + 'type' => 'checkbox', + 'label' => __( 'Menu icons in desktop view', 'ultimate-member' ), + 'checkbox_label' => __( 'Enable menu icons in desktop view', 'ultimate-member' ), + 'description' => __( '"Desktop view" means the profile block\'s width lower than 800px.', 'ultimate-member' ), + 'conditional' => array( 'profile_menu', '=', 1 ), ), ) ); @@ -562,62 +532,65 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $access_fields = array( array( - 'id' => 'accessible', - 'type' => 'select', - 'label' => __( 'Global Site Access', 'ultimate-member' ), - 'tooltip' => __( 'Globally control the access of your site, you can have separate restrict options per post/page by editing the desired item.', 'ultimate-member' ), - 'options' => array( + 'id' => 'accessible', + 'type' => 'select', + 'label' => __( 'Global Site Access', 'ultimate-member' ), + 'description' => __( 'Globally control the access of your site, you can have separate restrict options per post/page by editing the desired item.', 'ultimate-member' ), + 'options' => array( 0 => __( 'Site accessible to Everyone', 'ultimate-member' ), 2 => __( 'Site accessible to Logged In Users', 'ultimate-member' ), ), - 'size' => 'medium', + 'size' => 'medium', ), array( - 'id' => 'access_redirect', + 'id' => 'a$access_fieldsccess_redirect', 'type' => 'text', 'label' => __( 'Custom Redirect URL', 'ultimate-member' ), - 'tooltip' => __( 'A logged out user will be redirected to this url If he is not permitted to access the site', 'ultimate-member' ), + 'description' => __( 'A logged out user will be redirected to this url If he is not permitted to access the site.', 'ultimate-member' ), 'conditional' => array( 'accessible', '=', 2 ), ), array( 'id' => 'access_exclude_uris', 'type' => 'multi_text', 'label' => __( 'Exclude the following URLs', 'ultimate-member' ), - 'tooltip' => __( 'Here you can exclude URLs beside the redirect URI to be accessible to everyone', 'ultimate-member' ), + 'description' => __( 'Here you can exclude URLs beside the redirect URI to be accessible to everyone.', 'ultimate-member' ), 'add_text' => __( 'Add New URL', 'ultimate-member' ), 'conditional' => array( 'accessible', '=', 2 ), 'show_default_number' => 0, ), array( - 'id' => 'home_page_accessible', - 'type' => 'checkbox', - 'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ), - 'conditional' => array( 'accessible', '=', 2 ), + 'id' => 'home_page_accessible', + 'type' => 'checkbox', + 'label' => __( 'Allow Homepage to be accessible', 'ultimate-member' ), + 'checkbox_label' => __( 'Accessible Homepage', 'ultimate-member' ), + 'conditional' => array( 'accessible', '=', 2 ), ), array( - 'id' => 'category_page_accessible', - 'type' => 'checkbox', - 'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ), - 'conditional' => array( 'accessible', '=', 2 ), + 'id' => 'category_page_accessible', + 'type' => 'checkbox', + 'label' => __( 'Allow Category pages to be accessible', 'ultimate-member' ), + 'checkbox_label' => __( 'Accessible Category pages', 'ultimate-member' ), + 'conditional' => array( 'accessible', '=', 2 ), ), array( - 'id' => 'restricted_post_title_replace', - 'type' => 'checkbox', - 'label' => __( 'Replace the restricted Post Title', 'ultimate-member' ), - 'tooltip' => __( 'Allow to replace the restricted post title to users that do not have permission to view the content', 'ultimate-member' ), + 'id' => 'restricted_post_title_replace', + 'type' => 'checkbox', + 'label' => __( 'Restricted Post Title', 'ultimate-member' ), + 'checkbox_label' => __( 'Replace the restricted Post Title', 'ultimate-member' ), + 'description' => __( 'Allow to replace the restricted post title to users that do not have permission to view the content.', 'ultimate-member' ), ), array( 'id' => 'restricted_access_post_title', 'type' => 'text', 'label' => __( 'Restricted Access Post Title', 'ultimate-member' ), - 'tooltip' => __( 'This is the post title shown to users that do not have permission to view the content', 'ultimate-member' ), + 'description' => __( 'If enabled, the text entered below will replace the title of the post/page/CPT for users who do not have permission to view the restricted content. Please see this doc for more information on this.', 'ultimate-member' ), 'conditional' => array( 'restricted_post_title_replace', '=', 1 ), ), array( - 'id' => 'restricted_access_message', - 'type' => 'wp_editor', - 'label' => __( 'Restricted Access Message', 'ultimate-member' ), - 'tooltip' => __( 'This is the message shown to users that do not have permission to view the content', 'ultimate-member' ), + 'id' => 'restricted_access_message', + 'type' => 'wp_editor', + 'label' => __( 'Restricted Access Message', 'ultimate-member' ), + 'description' => __( 'This is the message shown to users that do not have permission to view the content.', 'ultimate-member' ), ), ); @@ -657,15 +630,17 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $access_fields, array( array( - 'id' => 'restricted_blocks', - 'type' => 'checkbox', - 'label' => __( 'Enable the "Content Restriction" settings for the Gutenberg Blocks', 'ultimate-member' ), + 'id' => 'restricted_blocks', + 'type' => 'checkbox', + 'label' => __( 'Restricted Gutenberg Blocks', 'ultimate-member' ), + 'checkbox_label' => __( 'Enable the "Content Restriction" settings for the Gutenberg Blocks', 'ultimate-member' ), + 'description' => __( 'If enabled then allows to set the blocks restriction settings in wp-admin.', 'ultimate-member' ), ), array( 'id' => 'restricted_block_message', 'type' => 'textarea', 'label' => __( 'Restricted Access Block Message', 'ultimate-member' ), - 'tooltip' => __( 'This is the message shown to users that do not have permission to view the block\'s content', 'ultimate-member' ), + 'description' => __( 'This is the message shown to users that do not have permission to view the block\'s content.', 'ultimate-member' ), 'conditional' => array( 'restricted_blocks', '=', 1 ), ), ) @@ -693,24 +668,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'value' => '', ), array( - 'id' => 'restricted_access_post_metabox', - 'type' => 'multi_checkbox', - 'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ), - 'tooltip' => __( 'Check post types for which you plan to use the "Content Restriction" settings', 'ultimate-member' ), - 'options' => $post_types_options, - 'columns' => 3, - 'value' => $restricted_access_post_metabox_value, - 'default' => UM()->options()->get_default( 'restricted_access_post_metabox' ), + 'id' => 'restricted_access_post_metabox', + 'type' => 'multi_checkbox', + 'label' => __( 'Enable the "Content Restriction" settings for post types', 'ultimate-member' ), + 'description' => __( 'Check post types for which you plan to use the "Content Restriction" settings.', 'ultimate-member' ), + 'options' => $post_types_options, + 'columns' => 3, + 'value' => $restricted_access_post_metabox_value, + 'default' => UM()->options()->get_default( 'restricted_access_post_metabox' ), ), array( - 'id' => 'restricted_access_taxonomy_metabox', - 'type' => 'multi_checkbox', - 'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ), - 'tooltip' => __( 'Check taxonomies for which you plan to use the "Content Restriction" settings', 'ultimate-member' ), - 'options' => $taxonomies_options, - 'columns' => 3, - 'value' => $restricted_access_taxonomy_metabox_value, - 'default' => UM()->options()->get_default( 'restricted_access_taxonomy_metabox' ), + 'id' => 'restricted_access_taxonomy_metabox', + 'type' => 'multi_checkbox', + 'label' => __( 'Enable the "Content Restriction" settings for taxonomies', 'ultimate-member' ), + 'description' => __( 'Check taxonomies for which you plan to use the "Content Restriction" settings.', 'ultimate-member' ), + 'options' => $taxonomies_options, + 'columns' => 3, + 'value' => $restricted_access_taxonomy_metabox_value, + 'default' => UM()->options()->get_default( 'restricted_access_taxonomy_metabox' ), ), ) ); @@ -775,6 +750,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'use_um_gravatar_default_image' => array( 'sanitize' => 'bool', ), + 'delete_comments' => array( + 'sanitize' => 'bool', + ), 'toggle_password' => array( 'sanitize' => 'bool', ), @@ -1030,6 +1008,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'rest_api_version' => array( 'sanitize' => 'text', ), + 'disable_restriction_pre_queries' => array( + 'sanitize' => 'bool', + ), 'uninstall_on_delete' => array( 'sanitize' => 'bool', ), @@ -1054,115 +1035,12 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ) ); - $account_fields = array( - array( - 'id' => 'account_tab_password', - 'type' => 'checkbox', - 'label' => __( 'Password Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Password account tab in account page', 'ultimate-member' ), - ), - array( - 'id' => 'account_tab_privacy', - 'type' => 'checkbox', - 'label' => __( 'Privacy Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Privacy account tab in account page', 'ultimate-member' ), - ), - ); - if ( false !== UM()->account()->is_notifications_tab_visible() ) { - $account_fields[] = array( - 'id' => 'account_tab_notifications', - 'type' => 'checkbox', - 'label' => __( 'Notifications Account Tab', 'ultimate-member' ), - 'tooltip' => __( 'Enable/disable the Notifications account tab in account page', 'ultimate-member' ), - ); - $settings_map['account_tab_notifications'] = array( 'sanitize' => 'bool', ); } - $account_fields = array_merge( - $account_fields, - array( - array( - 'id' => 'account_tab_delete', - 'type' => 'checkbox', - 'label' => __( 'Delete Account Tab', 'ultimate-member' ), - 'tooltip' => __( '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 Custom Text', 'ultimate-member' ), - 'tooltip' => __( 'This is custom text that will be displayed to users before they delete their accounts from your site when password is required.', 'ultimate-member' ), - 'args' => array( - 'textarea_rows' => 6, - ), - ), - array( - 'id' => 'delete_account_no_pass_required_text', - 'type' => 'textarea', - 'label' => __( 'Account Deletion without password Custom Text', 'ultimate-member' ), - 'tooltip' => __( 'This is custom text that will be displayed to users before they delete their accounts from your site when password isn\'t required.', 'ultimate-member' ), - 'args' => array( - 'textarea_rows' => 6, - ), - ), - array( - 'id' => 'account_name', - 'type' => 'checkbox', - 'label' => __( 'Add a First & Last Name fields', 'ultimate-member' ), - 'tooltip' => __( 'Whether to enable these fields on the user account page by default or hide them.', 'ultimate-member' ), - ), - array( - 'id' => 'account_name_disable', - 'type' => 'checkbox', - 'label' => __( 'Disable First & Last Name fields', 'ultimate-member' ), - 'tooltip' => __( 'Whether to allow users changing their first and last name in account page.', 'ultimate-member' ), - 'conditional' => array( 'account_name', '=', '1' ), - ), - array( - 'id' => 'account_name_require', - 'type' => 'checkbox', - 'label' => __( 'Require First & Last Name', 'ultimate-member' ), - 'tooltip' => __( 'Require first and last name?', 'ultimate-member' ), - 'conditional' => array( 'account_name', '=', '1' ), - ), - array( - 'id' => 'account_email', - 'type' => 'checkbox', - 'label' => __( 'Allow users to change e-mail', 'ultimate-member' ), - 'tooltip' => __( 'Whether to allow users changing their email in account page.', 'ultimate-member' ), - ), - array( - 'id' => 'account_general_password', - 'type' => 'checkbox', - 'label' => __( 'Password is required?', 'ultimate-member' ), - 'tooltip' => __( 'Password is required to save account data.', 'ultimate-member' ), - ), - array( - 'id' => 'account_hide_in_directory', - 'type' => 'checkbox', - 'label' => __( 'Allow users to hide their profiles from directory', 'ultimate-member' ), - 'tooltip' => __( 'Whether to allow users changing their profile visibility from member directory in 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' ), - 'tooltip' => __( 'Set default value for the "Hide my profile from directory" option', 'ultimate-member' ), - 'options' => array( - 'No' => __( 'No', 'ultimate-member' ), - 'Yes' => __( 'Yes', 'ultimate-member' ), - ), - 'size' => 'small', - 'conditional' => array( 'account_hide_in_directory', '=', '1' ), - ), - ) - ); - $this->settings_map = apply_filters( 'um_settings_map', $settings_map ); /** @@ -1192,8 +1070,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'title' => __( 'General', 'ultimate-member' ), 'sections' => array( '' => array( - 'title' => __( 'Pages', 'ultimate-member' ), - 'fields' => $general_pages_fields, + 'title' => __( 'Pages', 'ultimate-member' ), + '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, ), 'users' => array( 'title' => __( 'Users', 'ultimate-member' ), @@ -1202,6 +1081,15 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'title' => __( 'Users', 'ultimate-member' ), 'description' => __( 'General users settings.', 'ultimate-member' ), 'fields' => array( + array( + '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', + ), array( 'id' => 'permalink_base', 'type' => 'select', @@ -1241,15 +1129,15 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'id' => 'author_redirect', 'type' => 'checkbox', 'label' => __( 'Hide author pages', 'ultimate-member' ), - 'checkbox_label' => __( 'Enable automatically redirect author page to their profile', 'ultimate-member' ), - 'description' => __( 'If enabled, author pages will automatically redirect to the user\'s profile page', 'ultimate-member' ), + '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' ), ), array( 'id' => 'members_page', 'type' => 'checkbox', 'label' => __( 'Members Directory', 'ultimate-member' ), 'checkbox_label' => __( 'Enable Members Directory', 'ultimate-member' ), - 'description' => __( 'Control whether to enable or disable member directories on this site', 'ultimate-member' ), + 'description' => __( 'Control whether to enable or disable member directories on this site.', 'ultimate-member' ), ), array( 'id' => 'use_gravatars', @@ -1262,7 +1150,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { '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' ), + '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' ), @@ -1281,7 +1169,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { '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' ), + '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( @@ -1289,7 +1177,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'type' => 'checkbox', 'label' => __( 'Delete user comments', 'ultimate-member' ), 'checkbox_label' => __( 'Enable deleting user comments after deleting a user', 'ultimate-member' ), - 'description' => __( 'Do you want to delete a user\'s comments when that user deletes themself or is removed from the admin dashboard from the site?', 'ultimate-member' ), + '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' ), ), ), ), @@ -1301,8 +1189,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'id' => 'toggle_password', 'type' => 'checkbox', 'label' => __( 'Toggle Password Visibility', 'ultimate-member' ), - 'checkbox_label' => __( 'Enable password show/hide button', 'ultimate-member' ), - 'description' => __( 'Enable visibility for show/hide password button for the password field-type.', 'ultimate-member' ), + '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' ), ), array( 'id' => 'require_strongpass', @@ -1331,14 +1219,14 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'id' => 'activation_link_expiry_time', 'type' => 'number', 'label' => __( 'Email activation link expiration (days)', 'ultimate-member' ), - 'description' => __( 'For user registrations that require an email link to be clicked to confirm account. How long would you like the activation link to be active for before it expires? If this field is left blank the activation link will not expire.', 'ultimate-member' ), + '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', ), ), ), 'seo' => array( 'title' => __( 'SEO', 'ultimate-member' ), - 'description' => __( 'SEO settings for the User Profiles.', 'ultimate-member' ), + 'description' => __( 'SEO settings for the user profiles.', 'ultimate-member' ), 'fields' => array( array( 'id' => 'profile_noindex', @@ -1372,74 +1260,225 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), ), 'account' => array( - 'title' => __( 'Account', 'ultimate-member' ), - 'fields' => $account_fields, + 'title' => __( 'Account', 'ultimate-member' ), + 'form_sections' => array( + 'account_tab' => array( + 'title' => __( 'Main account tab', 'ultimate-member' ), + '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' ), + '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' ), + ), + array( + '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' ), + ), + array( + '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' ), + ), + array( + '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' ), + ), + array( + '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' ), + ), + ), + ), + 'password_tab' => array( + 'title' => __( 'Change password tab', 'ultimate-member' ), + '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' ), + 'checkbox_label' => __( 'Display password change account tab', 'ultimate-member' ), + 'description' => __( 'Enable or disable the "Password" tab on the account page.', 'ultimate-member' ), + ), + ), + ), + 'privacy_tab' => array( + 'title' => __( 'Privacy tab', 'ultimate-member' ), + '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' ), + 'checkbox_label' => __( 'Display privacy account tab', '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' ), + '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' ), + ), + array( + '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( + 'No' => __( 'No', 'ultimate-member' ), + 'Yes' => __( 'Yes', 'ultimate-member' ), + ), + 'size' => 'small', + 'conditional' => array( 'account_hide_in_directory', '=', '1' ), + ), + ), + ), + 'notifications_tab' => array( + 'title' => __( 'Notifications tab', 'ultimate-member' ), + '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' ), + 'checkbox_label' => __( 'Display notifications account tab', 'ultimate-member' ), + 'description' => __( 'Enable or disable the "Notifications" tab on the account page.', 'ultimate-member' ), + ), + ), + ), + 'delete_tab' => array( + 'title' => __( 'Delete tab', 'ultimate-member' ), + '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' ), + 'checkbox_label' => __( 'Display delete account tab', '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' ), + '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( + 'textarea_rows' => 6, + ), + ), + array( + '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( + 'textarea_rows' => 6, + ), + ), + ), + ), + ), ), 'uploads' => array( - 'title' => __( 'Uploads', 'ultimate-member' ), - 'fields' => array( - array( - 'id' => 'profile_photo_max_size', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Profile Photo Maximum File Size (bytes)', 'ultimate-member' ), - 'tooltip' => __( 'Sets a maximum size for the uploaded photo', 'ultimate-member' ), + 'title' => __( 'Uploads', 'ultimate-member' ), + 'form_sections' => array( + 'uploads' => array( + 'title' => __( 'Uploads', 'ultimate-member' ), + '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' ), + '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' ), + ), + array( + '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' ), + 'description' => __( 'Any image upload above this width will be resized to this limit automatically.', 'ultimate-member' ), + ), + ), ), - array( - 'id' => 'cover_photo_max_size', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Cover Photo Maximum File Size (bytes)', 'ultimate-member' ), - 'tooltip' => __( 'Sets a maximum size for the uploaded cover', 'ultimate-member' ), + 'profile_photo' => array( + 'title' => __( 'Profile photo', 'ultimate-member' ), + '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' ), + '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' ), + 'show_default_number' => 1, + ), + ), ), - array( - 'id' => 'photo_thumb_sizes', - 'type' => 'multi_text', - 'size' => 'small', - 'label' => __( 'Profile Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'tooltip' => __( '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, - ), - array( - 'id' => 'cover_thumb_sizes', - 'type' => 'multi_text', - 'size' => 'small', - 'label' => __( 'Cover Photo Thumbnail Sizes (px)', 'ultimate-member' ), - 'tooltip' => __( '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, - ), - array( - 'id' => 'image_orientation_by_exif', - 'type' => 'checkbox', - 'label' => __( 'Change image orientation', 'ultimate-member' ), - 'tooltip' => __( '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' ), - 'tooltip' => __( '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' ), - 'tooltip' => __( 'Any image upload above this width will be resized to this limit automatically.', 'ultimate-member' ), - ), - - array( - 'id' => 'cover_min_width', - 'type' => 'text', - 'size' => 'small', - 'label' => __( 'Cover Photo Minimum Width (px)', 'ultimate-member' ), - 'tooltip' => __( 'This will be the minimum width for cover photo uploads', 'ultimate-member' ), + 'cover_photo' => array( + 'title' => __( 'Cover photo', 'ultimate-member' ), + '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' ), + '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' ), + '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' ), + 'show_default_number' => 1, + ), + ), ), ), ), @@ -1449,55 +1488,59 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'title' => __( 'Access', 'ultimate-member' ), 'sections' => array( '' => array( - 'title' => __( 'Restriction Content', 'ultimate-member' ), - 'fields' => $access_fields, + 'title' => __( 'Restriction Content', 'ultimate-member' ), + 'description' => __( 'Provides settings for controlling access to your site.', 'ultimate-member' ), + 'fields' => $access_fields, ), 'other' => array( - 'title' => __( 'Other', 'ultimate-member' ), - 'fields' => array( - array( - 'id' => 'enable_reset_password_limit', - 'type' => 'checkbox', - 'label' => __( 'Enable the Reset Password Limit?', 'ultimate-member' ), + 'title' => __( 'Other', 'ultimate-member' ), + 'form_sections' => 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' ), + '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' ), + ), + array( + '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', + 'conditional' => array( 'enable_reset_password_limit', '=', 1 ), + 'size' => 'small', + ), + array( + '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' ), + ), + ), ), - array( - 'id' => 'reset_password_limit_number', - 'type' => 'text', - 'label' => __( 'Reset Password Limit', 'ultimate-member' ), - 'tooltip' => __( 'Set the maximum reset password limit. If reached the maximum limit, user will be locked from using this.', 'ultimate-member' ), - 'validate' => 'numeric', - 'conditional' => array( 'enable_reset_password_limit', '=', 1 ), - 'size' => 'small', - ), - array( - 'id' => 'change_password_request_limit', - 'type' => 'checkbox', - 'label' => __( 'Change Password request limit', 'ultimate-member' ), - 'tooltip' => __( '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' => 'blocked_emails', - 'type' => 'textarea', - 'label' => __( 'Blocked Email Addresses (Enter one email per line)', 'ultimate-member' ), - 'tooltip' => __( 'This will block the specified e-mail 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' ), - 'tooltip' => __( 'This option lets you specify blacklist of words to prevent anyone from signing up with such a word as their username', 'ultimate-member' ), - ), - array( - 'id' => 'allowed_choice_callbacks', - 'type' => 'textarea', - 'label' => __( 'Allowed Choice Callbacks (Enter one PHP function per line)', 'ultimate-member' ), - 'tooltip' => __( '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' => 'allow_url_redirect_confirm', - 'type' => 'checkbox', - 'label' => __( 'Allow external link redirect confirm', 'ultimate-member' ), - 'tooltip' => __( 'Using JS.confirm alert when you go to an external link.', 'ultimate-member' ), + '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' ), + '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' ), + 'description' => __( 'This option lets you specify blacklist of words to prevent anyone from signing up with such a word as their username.', 'ultimate-member' ), + ), + ), ), ), ), @@ -1513,20 +1556,20 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { array( 'id' => 'admin_email', 'type' => 'text', - 'label' => __( 'Admin E-mail Address', 'ultimate-member' ), - 'description' => __( 'e.g. admin@companyname.com', 'ultimate-member' ), + 'label' => __( 'Admin Email Address', 'ultimate-member' ), + 'description' => __( 'e.g. admin@companyname.com.', 'ultimate-member' ), ), array( 'id' => 'mail_from', 'type' => 'text', 'label' => __( 'Mail appears from', 'ultimate-member' ), - 'description' => __( 'e.g. Site Name', 'ultimate-member' ), + 'description' => __( 'e.g. Site Name.', 'ultimate-member' ), ), array( 'id' => 'mail_from_addr', 'type' => 'text', 'label' => __( 'Mail appears from address', 'ultimate-member' ), - 'description' => __( 'e.g. admin@companyname.com', 'ultimate-member' ), + 'description' => __( 'e.g. admin@companyname.com.', 'ultimate-member' ), ), ), ), @@ -1538,8 +1581,8 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'id' => 'email_html', 'type' => 'checkbox', 'label' => __( 'Content type', 'ultimate-member' ), - 'checkbox_label' => __( 'Enable HTML for E-mails', 'ultimate-member' ), - 'description' => __( 'If you plan use e-mails with HTML, please make sure that this option is enabled. Otherwise, HTML will be displayed as plain text.', 'ultimate-member' ), + 'checkbox_label' => __( 'Enable HTML for Emails', 'ultimate-member' ), + 'description' => __( 'If you plan use emails with HTML, please make sure that this option is enabled. Otherwise, HTML will be displayed as plain text.', 'ultimate-member' ), ), ), ), @@ -1549,395 +1592,456 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'title' => __( 'Appearance', 'ultimate-member' ), 'sections' => array( '' => array( - 'title' => __( 'Profile', 'ultimate-member' ), - 'fields' => array( - array( - 'id' => 'profile_template', - 'type' => 'select', - 'label' => __( 'Profile Default Template', 'ultimate-member' ), - 'tooltip' => __( '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', - ), - array( - 'id' => 'profile_max_width', - 'type' => 'text', - 'label' => __( 'Profile Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_max_width' ), - 'tooltip' => __( 'The maximum width this shortcode can take from the page width', 'ultimate-member' ), - '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' ), - 'tooltip' => __( 'The maximum width of the profile area inside profile (below profile header)', 'ultimate-member' ), - 'size' => 'small', - ), - array( - 'id' => 'profile_icons', - 'type' => 'select', - 'label' => __( 'Profile Field Icons', 'ultimate-member' ), - 'tooltip' => __( 'This is applicable for edit mode only', 'ultimate-member' ), - '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' ), - ), - 'size' => 'small', - ), - array( - 'id' => 'profile_primary_btn_word', - 'type' => 'text', - 'label' => __( 'Profile Primary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_primary_btn_word' ), - 'tooltip' => __( 'The text that is used for updating profile button', 'ultimate-member' ), - 'size' => 'medium', - ), - array( - 'id' => 'profile_secondary_btn', - 'type' => 'checkbox', - 'label' => __( 'Profile Secondary Button', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_secondary_btn' ), - 'tooltip' => __( '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' ), - 'tooltip' => __( 'The text that is used for cancelling update profile button', 'ultimate-member' ), - 'conditional' => array( 'profile_secondary_btn', '=', 1 ), - 'size' => 'medium', - ), - array( - 'id' => 'default_avatar', - 'type' => 'media', - 'label' => __( 'Default Profile Photo', 'ultimate-member' ), - 'tooltip' => __( '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( - 'url' => UM_URL . 'assets/img/default_avatar.jpg', + 'title' => __( 'Profile', 'ultimate-member' ), + 'form_sections' => array( + 'template' => array( + 'title' => __( 'Template', 'ultimate-member' ), + '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' ), + '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', + ), + array( + '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', + ), + array( + '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', + ), ), ), - array( - 'id' => 'default_cover', - 'type' => 'media', - 'url' => true, - 'preview' => false, - 'label' => __( 'Default Cover Photo', 'ultimate-member' ), - 'tooltip' => __( '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' => 'disable_profile_photo_upload', - 'type' => 'checkbox', - 'label' => __( 'Disable Profile Photo Upload', 'ultimate-member' ), - 'tooltip' => __( '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' ), - 'tooltip' => __( 'The global default of profile photo size. This can be overridden by individual form settings', 'ultimate-member' ), - 'size' => 'small', - ), - array( - 'id' => 'profile_cover_enabled', - 'type' => 'checkbox', - 'label' => __( 'Profile Cover Photos', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_cover_enabled' ), - 'tooltip' => __( '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' ), - 'tooltip' => __( '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', - ), - array( - 'id' => 'profile_cover_ratio', - 'type' => 'select', - 'label' => __( 'Profile Cover Ratio', 'ultimate-member' ), - 'tooltip' => __( 'Choose global ratio for cover photos of profiles', 'ultimate-member' ), - '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', + 'profile_photo' => array( + 'title' => __( 'Profile photo', 'ultimate-member' ), + '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' ), + 'upload_frame_title' => __( 'Select Default Profile Photo', 'ultimate-member' ), + 'default' => array( + 'url' => UM_URL . 'assets/img/default_avatar.jpg', + ), + ), + array( + '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' ), + ), + 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' ), + 'description' => __( 'The global default of profile photo size. This can be overridden by individual form settings.', 'ultimate-member' ), + 'size' => 'small', + ), ), - 'conditional' => array( 'profile_cover_enabled', '=', 1 ), - 'size' => 'small', ), - array( - 'id' => 'profile_show_metaicon', - 'type' => 'checkbox', - 'label' => __( 'Profile Header Meta Text Icon', 'ultimate-member' ), - 'default' => 0, - 'tooltip' => __( 'Display field icons for related user meta fields in header or not', 'ultimate-member' ), - ), - array( - 'id' => 'profile_show_name', - 'type' => 'checkbox', - 'label' => __( 'Show display name in profile header', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_show_name' ), - 'tooltip' => __( 'Switch on/off the user name on profile header', 'ultimate-member' ), - ), - array( - 'id' => 'profile_show_social_links', - 'type' => 'checkbox', - 'label' => __( 'Show social links in profile header', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_show_social_links' ), - 'tooltip' => __( 'Switch on/off the social links on profile header', 'ultimate-member' ), - ), - array( - 'id' => 'profile_show_bio', - 'type' => 'checkbox', - 'label' => __( 'Show user description in header', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_show_bio' ), - 'tooltip' => __( 'Switch on/off the user description on profile header', 'ultimate-member' ), - ), - array( - 'id' => 'profile_show_html_bio', - 'type' => 'checkbox', - 'label' => __( 'Enable HTML support for user description', 'ultimate-member' ), - 'tooltip' => __( 'Switch on/off to enable/disable support for html tags on user description.', 'ultimate-member' ), - ), - array( - 'id' => 'profile_bio_maxchars', - 'type' => 'text', - 'label' => __( 'User description maximum chars', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_bio_maxchars' ), - 'tooltip' => __( 'Maximum number of characters to allow in user description field in header.', 'ultimate-member' ), - 'conditional' => array( 'profile_show_bio', '=', 1 ), - 'size' => 'small', - ), - array( - 'id' => 'profile_header_menu', - 'type' => 'select', - 'label' => __( 'Profile Header Menu Position', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_header_menu' ), - 'tooltip' => __( 'For incompatible themes, please make the menu open from left instead of bottom by default.', 'ultimate-member' ), - 'options' => array( - 'bc' => __( 'Bottom of Icon', 'ultimate-member' ), - 'lc' => __( 'Left of Icon (right for RTL)', 'ultimate-member' ), + 'cover_photo' => array( + 'title' => __( 'Cover photo', 'ultimate-member' ), + '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' ), + 'upload_frame_title' => __( 'Select Default Cover Photo', 'ultimate-member' ), + ), + + array( + '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' ), + ), + 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' ), + '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', + ), + array( + '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( + '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', ), - array( - 'id' => 'profile_empty_text', - 'type' => 'checkbox', - 'label' => __( 'Show a custom message if profile is empty', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_empty_text' ), - 'tooltip' => __( 'Switch on/off the custom message that appears when the profile is empty', 'ultimate-member' ), + 'header' => array( + 'title' => __( 'Header', 'ultimate-member' ), + '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' ), + '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' ), + ), + array( + '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' ), + ), + array( + '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' ), + ), + array( + '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' ), + ), + array( + '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', + ), + array( + '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' ), + ), + array( + '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( + 'bc' => __( 'Bottom of Icon', 'ultimate-member' ), + 'lc' => __( 'Left of Icon (right for RTL)', 'ultimate-member' ), + ), + 'size' => 'small', + ), + ), ), - array( - 'id' => 'profile_empty_text_emo', - 'type' => 'checkbox', - 'label' => __( 'Show the emoticon', 'ultimate-member' ), - 'default' => um_get_metadefault( 'profile_empty_text_emo' ), - 'tooltip' => __( 'Switch on/off the emoticon (sad face) that appears above the message', 'ultimate-member' ), - 'conditional' => array( 'profile_empty_text', '=', 1 ), + 'fields' => array( + 'title' => __( 'Buttons & Fields', 'ultimate-member' ), + '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' ), + 'description' => __( 'The text that is used for updating profile button.', 'ultimate-member' ), + 'size' => 'medium', + ), + array( + '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' ), + ), + array( + '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', + ), + array( + '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( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), + ), + 'size' => 'small', + ), + array( + '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' ), + ), + array( + '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 ), + ), + ), ), ), ), 'profile_menu' => array( - 'title' => __( 'Profile Menu', 'ultimate-member' ), - 'fields' => $appearances_profile_menu_fields, + 'title' => __( 'Profile Menu', 'ultimate-member' ), + 'description' => __( 'This section allows you to customize the user profiles menus on your site.', 'ultimate-member' ), + 'fields' => $appearances_profile_menu_fields, ), 'registration_form' => array( - 'title' => __( 'Registration Form', 'ultimate-member' ), - 'fields' => array( - array( - 'id' => 'register_template', - 'type' => 'select', - 'label' => __( 'Registration Default Template', 'ultimate-member' ), - 'tooltip' => __( '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', - ), - array( - 'id' => 'register_max_width', - 'type' => 'text', - 'label' => __( 'Registration Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_max_width' ), - 'tooltip' => __( 'The maximum width this shortcode can take from the page width', 'ultimate-member' ), - 'size' => 'small', - ), - array( - 'id' => 'register_align', - 'type' => 'select', - 'label' => __( 'Registration Shortcode Alignment', 'ultimate-member' ), - 'tooltip' => __( 'The shortcode is centered by default unless you specify otherwise here', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_align' ), - 'options' => array( - 'center' => __( 'Centered', 'ultimate-member' ), - 'left' => __( 'Left aligned', 'ultimate-member' ), - 'right' => __( 'Right aligned', 'ultimate-member' ), + 'title' => __( 'Registration Form', 'ultimate-member' ), + 'form_sections' => 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' ), + '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', + ), + array( + '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', + ), + array( + '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( + 'center' => __( 'Centered', 'ultimate-member' ), + 'left' => __( 'Left aligned', 'ultimate-member' ), + 'right' => __( 'Right aligned', 'ultimate-member' ), + ), + 'size' => 'small', + ), ), - 'size' => 'small', ), - array( - 'id' => 'register_icons', - 'type' => 'select', - 'label' => __( 'Registration Field Icons', 'ultimate-member' ), - 'tooltip' => __( 'This controls the display of field icons in the registration form', 'ultimate-member' ), - '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' ), + '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' ), + 'description' => __( 'The text that is used for primary button text.', 'ultimate-member' ), + 'size' => 'medium', + ), + array( + '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' ), + ), + array( + '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', + ), + array( + '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', + ), + array( + '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( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), + ), + 'size' => 'small', + ), ), - 'size' => 'small', - ), - array( - 'id' => 'register_primary_btn_word', - 'type' => 'text', - 'label' => __( 'Registration Primary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_primary_btn_word' ), - 'tooltip' => __( 'The text that is used for primary button text', 'ultimate-member' ), - 'size' => 'medium', - ), - array( - 'id' => 'register_secondary_btn', - 'type' => 'checkbox', - 'label' => __( 'Registration Secondary Button', 'ultimate-member' ), - 'default' => 1, - 'tooltip' => __( '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' ), - 'tooltip' => __( 'The text that is used for the secondary button text', 'ultimate-member' ), - 'conditional' => array( 'register_secondary_btn', '=', 1 ), - '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' ), - 'tooltip' => __( 'You can replace default link for this button by entering custom URL', 'ultimate-member' ), - 'conditional' => array( 'register_secondary_btn', '=', 1 ), - 'size' => 'medium', - ), - array( - 'id' => 'register_role', - 'type' => 'select', - 'label' => __( 'Registration Default Role', 'ultimate-member' ), - 'tooltip' => __( 'This will be the default role assigned to users registering thru registration form', 'ultimate-member' ), - 'default' => um_get_metadefault( 'register_role' ), - 'options' => UM()->roles()->get_roles( __( 'Default', 'ultimate-member' ) ), - 'size' => 'small', ), ), ), 'login_form' => array( - 'title' => __( 'Login Form', 'ultimate-member' ), - 'fields' => array( - array( - 'id' => 'login_template', - 'type' => 'select', - 'label' => __( 'Login Default Template', 'ultimate-member' ), - 'tooltip' => __( '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', - ), - array( - 'id' => 'login_max_width', - 'type' => 'text', - 'label' => __( 'Login Maximum Width', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_max_width' ), - 'tooltip' => __( 'The maximum width this shortcode can take from the page width', 'ultimate-member' ), - 'size' => 'small', - ), - array( - 'id' => 'login_align', - 'type' => 'select', - 'label' => __( 'Login Shortcode Alignment', 'ultimate-member' ), - 'tooltip' => __( 'The shortcode is centered by default unless you specify otherwise here', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_align' ), - 'options' => array( - 'center' => __( 'Centered', 'ultimate-member' ), - 'left' => __( 'Left aligned', 'ultimate-member' ), - 'right' => __( 'Right aligned', 'ultimate-member' ), + 'title' => __( 'Login Form', 'ultimate-member' ), + 'form_sections' => array( + 'template' => array( + 'title' => __( 'Template', 'ultimate-member' ), + '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' ), + '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', + ), + array( + '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', + ), + array( + '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( + 'center' => __( 'Centered', 'ultimate-member' ), + 'left' => __( 'Left aligned', 'ultimate-member' ), + 'right' => __( 'Right aligned', 'ultimate-member' ), + ), + 'size' => 'small', + ), ), - 'size' => 'small', ), - array( - 'id' => 'login_icons', - 'type' => 'select', - 'label' => __( 'Login Field Icons', 'ultimate-member' ), - 'tooltip' => __( 'This controls the display of field icons in the login form', 'ultimate-member' ), - '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' ), + 'fields' => array( + 'title' => __( 'Buttons & Fields', 'ultimate-member' ), + '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' ), + 'description' => __( 'The text that is used for primary button text.', 'ultimate-member' ), + 'size' => 'medium', + ), + array( + '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' ), + ), + array( + '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', + ), + array( + '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', + ), + array( + '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' ), + ), + array( + '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' ), + ), + array( + '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( + 'field' => __( 'Show inside text field', 'ultimate-member' ), + 'label' => __( 'Show with label', 'ultimate-member' ), + 'off' => __( 'Turn off', 'ultimate-member' ), + ), + 'size' => 'small', + ), ), - 'size' => 'small', - ), - array( - 'id' => 'login_primary_btn_word', - 'type' => 'text', - 'label' => __( 'Login Primary Button Text', 'ultimate-member' ), - 'default' => um_get_metadefault( 'login_primary_btn_word' ), - 'tooltip' => __( 'The text that is used for primary button text', 'ultimate-member' ), - 'size' => 'medium', - ), - array( - 'id' => 'login_secondary_btn', - 'type' => 'checkbox', - 'label' => __( 'Login Secondary Button', 'ultimate-member' ), - 'default' => 1, - 'tooltip' => __( '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' ), - 'tooltip' => __( 'The text that is used for the secondary button text', 'ultimate-member' ), - 'conditional' => array( 'login_secondary_btn', '=', 1 ), - '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' ), - 'tooltip' => __( 'You can replace default link for this button by entering custom URL', 'ultimate-member' ), - 'conditional' => array( 'login_secondary_btn', '=', 1 ), - 'size' => 'medium', - ), - array( - 'id' => 'login_forgot_pass_link', - 'type' => 'checkbox', - 'label' => __( 'Login Forgot Password Link', 'ultimate-member' ), - 'default' => 1, - 'tooltip' => __( 'Switch on/off the forgot password link in login form', 'ultimate-member' ), - ), - array( - 'id' => 'login_show_rememberme', - 'type' => 'checkbox', - 'label' => __( 'Show "Remember Me"', 'ultimate-member' ), - 'default' => 1, - 'tooltip' => __( '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' ), ), ), ), @@ -1953,8 +2057,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'title' => __( 'Advanced', 'ultimate-member' ), 'sections' => array( '' => array( - 'title' => __( 'General', 'ultimate-member' ), - 'fields' => array( + 'title' => __( 'General', 'ultimate-member' ), + '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( 'id' => 'form_asterisk', 'type' => 'checkbox', @@ -1968,16 +2073,6 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { 'checkbox_label' => __( 'Disable user data cache', 'ultimate-member' ), 'description' => __( 'Check this box if you would like to disable Ultimate Member user\'s cache.', 'ultimate-member' ), ), - array( - 'id' => 'rest_api_version', - 'type' => 'select', - 'label' => __( 'REST API version', 'ultimate-member' ), - 'description' => __( 'This controls the REST API version, we recommend to use the last version', 'ultimate-member' ), - 'options' => array( - '1.0' => __( '1.0 version', 'ultimate-member' ), - '2.0' => __( '2.0 version', 'ultimate-member' ), - ), - ), array( 'id' => 'uninstall_on_delete', 'type' => 'checkbox', @@ -1993,7 +2088,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( __( 'You can find a list of template file changes with each release. You can check the latest templates and their statuses, and see if they\'re outdated or updated. You may get more details about overriding templates here.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1516-templates-map' ), /** @noinspection HtmlUnknownTarget */ + '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 */ 'fields' => array( array( 'id' => 'override_templates_list_table', @@ -2064,19 +2159,65 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { ), ), ), - ), - ), - 'install_info' => array( - 'title' => __( 'Install Info', 'ultimate-member' ), - 'fields' => array( - array( - 'type' => 'install_info', + 'developers' => array( + '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' ), + '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' ), + 'description' => __( 'This controls the REST API version, we recommend to use the last version.', 'ultimate-member' ), + 'options' => array( + '1.0' => __( '1.0 version', 'ultimate-member' ), + '2.0' => __( '2.0 version', 'ultimate-member' ), + ), + ), + ), + ), + 'redirect' => array( + 'title' => __( 'Redirect', 'ultimate-member' ), + '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' ), + 'checkbox_label' => __( 'Enable JS.confirm for external links', 'ultimate-member' ), + 'description' => __( 'Using JS.confirm alert when you go to an external link.', 'ultimate-member' ), + ), + ), + ), + ), ), ), - ), // @todo remove since 2.9.0 + ), + 'system_info' => array( + 'title' => __( 'System info', 'ultimate-member' ), + 'link' => add_query_arg( array( 'tab' => 'debug' ), admin_url( 'site-health.php' ) ), + ), ) ); + if ( false === UM()->account()->is_notifications_tab_visible() ) { + unset( $this->settings_structure['']['sections']['account']['form_sections']['notifications_tab'] ); + } + + // Hide sub tab if there aren't custom templates in theme. + $custom_templates = UM()->common()->theme()->get_custom_templates_list(); + if ( empty( $custom_templates ) ) { + unset( $this->settings_structure['advanced']['sections']['override_templates'] ); + } + if ( defined( 'UM_DEV_MODE' ) && UM_DEV_MODE ) { } else { @@ -2201,7 +2342,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { do_action( "um_settings_page_before_{$current_tab}_{$current_subtab}_content" ); $form_wrapper = true; - if ( in_array( $current_tab, array( 'licenses', 'install_info' ), true ) ) { + if ( 'licenses' === $current_tab ) { $form_wrapper = false; } if ( 'advanced' === $current_tab && 'override_templates' === $current_subtab ) { @@ -2272,19 +2413,25 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { if ( ! empty( $tab['fields'] ) || ! empty( $tab['sections'] ) || ! empty( $tab['form_sections'] ) ) { $menu_tabs[ $slug ] = $tab['title']; + } elseif ( ! empty( $tab['link'] ) ) { + $menu_tabs[ $slug ] = $tab['title']; } } $current_tab = empty( $_GET['tab'] ) ? '' : sanitize_key( $_GET['tab'] ); foreach ( $menu_tabs as $name => $label ) { - $active = $current_tab === $name ? 'nav-tab-active' : ''; - - $args = array( 'page' => 'um_options' ); - if ( ! empty( $name ) ) { - $args['tab'] = $name; + if ( ! empty( $this->settings_structure[ $name ]['link'] ) ) { + $active = ''; + $tab_url = $this->settings_structure[ $name ]['link']; + } else { + $active = $current_tab === $name ? 'nav-tab-active' : ''; + $args = array( 'page' => 'um_options' ); + if ( ! empty( $name ) ) { + $args['tab'] = $name; + } + $tab_url = add_query_arg( $args, admin_url( 'admin.php' ) ); } - $tab_url = add_query_arg( $args, admin_url( 'admin.php' ) ); - $tabs .= '' . esc_html( $label ) . ''; + $tabs .= '' . esc_html( $label ) . ''; } break; @@ -2909,14 +3056,31 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { options()->get( $field_data['id'] ); - $value = isset( $option_value ) && ! empty( $option_value ) ? $option_value : ( isset( $field_data['default'] ) ? $field_data['default'] : '' ); + $option_value = UM()->options()->get( $field_data['id'] ); + $default_value = isset( $field_data['default'] ) ? $field_data['default'] : ''; + $value = ! empty( $option_value ) ? $option_value : $default_value; $license = get_option( "{$field_data['id']}_edd_answer" ); if ( is_object( $license ) && ! empty( $value ) ) { - // activate_license 'invalid' on anything other than valid, so if there was an error capture it - if ( empty( $license->success ) ) { + // Activate_license 'invalid' on anything other than valid, so if there was an error capture it + if ( is_wp_error( $license ) ) { + $class = 'error'; + $errors_data = array(); + $error_codes = $license->get_error_codes(); + if ( ! empty( $error_codes ) ) { + foreach ( $error_codes as $error_code ) { + // translators: %1$s is an error code; %2$s is an error message. + $errors_data[] = sprintf( __( 'code: %1$s, message: %2$s;', 'ultimate-member' ), $error_code, $license->get_error_messages( $error_code ) ); + } + } + $errors_data = ! empty( $errors_data ) ? implode( ' ', $errors_data ) : ''; + + // translators: %1$s is an error data; %2$s is a support link. + $messages[] = sprintf( __( 'There was an error with this license key: %1$s. Please contact our support team.', 'ultimate-member' ), $errors_data, 'https://ultimatemember.com/support' ); + + $license_status = 'license-' . $class . '-notice'; + } elseif ( empty( $license->success ) ) { if ( ! empty( $license->error ) ) { switch ( $license->error ) { @@ -2925,7 +3089,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $messages[] = sprintf( // translators: %1$s is an expiry date; %2$s is a renewal link. __( 'Your license key expired on %1$s. Please renew your license key.', 'ultimate-member' ), - wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new \DateTimeZone( 'UTC' ) ), + wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new DateTimeZone( 'UTC' ) ), 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=expired' ); @@ -3020,7 +3184,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $messages[] = sprintf( // translators: %1$s is a expiry date; %2$s is a renew link. __( 'Your license key expired on %1$s. Please renew your license key.', 'ultimate-member' ), - wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new \DateTimeZone( 'UTC' ) ), + wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new DateTimeZone( 'UTC' ) ), 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=expired' ); @@ -3096,7 +3260,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $messages[] = sprintf( // translators: %1$s is an expiry date; %2$s is a renewal link. __( 'Your license key expires soon! It expires on %1$s. Renew your license key.', 'ultimate-member' ), - wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new \DateTimeZone( 'UTC' ) ), + wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new DateTimeZone( 'UTC' ) ), 'https://ultimatemember.com/checkout/?edd_license_key=' . $value . '&utm_campaign=admin&utm_source=licenses&utm_medium=renew' ); @@ -3107,7 +3271,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { $messages[] = sprintf( // translators: %s: expiry date. __( 'Your license key expires on %s.', 'ultimate-member' ), - wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new \DateTimeZone( 'UTC' ) ) + wp_date( get_option( 'date_format', 'F j, Y' ), strtotime( $license->expires ), new DateTimeZone( 'UTC' ) ) ); $license_status = 'license-expiration-date-notice'; @@ -3146,7 +3310,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { license ) || 'valid' === $license ) ) { + if ( ! empty( $value ) && ( ( is_object( $license ) && isset( $license->license ) && 'valid' === $license->license ) || 'valid' === $license ) ) { ?> get_override_templates(); - } - } - /** * HTML for Settings > Advanced > Override Templates tab. * * @return string */ - public function settings_override_templates_tab( $content ) { - $um_check_version = get_transient( 'um_check_template_versions' ); + public function settings_override_templates_tab() { + $um_check_version = time(); + $custom_templates = get_transient( 'um_custom_templates_list' ); + if ( false !== $custom_templates && array_key_exists( 'time', $custom_templates ) ) { + $um_check_version = $custom_templates['time']; + } $check_url = add_query_arg( array( @@ -3210,178 +3364,24 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { '_wpnonce' => wp_create_nonce( 'check_templates_version' ), ) ); + ob_start(); ?> -

    - Install Info tab. - * - * @todo remove since 2.9.0 - * - * @return string - */ - public function settings_install_info() { - ob_start(); - ?> -

    -

    - Info. - echo wp_kses( sprintf( __( 'This settings tab is deprecated. And it will be fully removed since 2.9.0 version. Please get the installation info from there.', 'ultimate-member' ), add_query_arg( 'tab', 'debug', admin_url( 'site-health.php' ) ) ), UM()->get_allowed_html( 'admin_notice' ) ); - ?> -

    -

    - here.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1879-ultimate-member-site-health' ), UM()->get_allowed_html( 'admin_notice' ) ); - ?> -

    - - $files ) { - foreach ( $files as $file ) { - if ( false === strpos( $file, 'email/' ) ) { - $located = array(); - /** - * Filters an array of the template files for scanning versions based on $key. - * - * Note: $key - means um or extension key. - * - * @since 2.6.1 - * @hook um_override_templates_get_template_path__{$key} - * - * @param {array} $located Template file paths for scanning versions. - * @param {string} $file Template file name. - * - * @return {array} Template file paths for scanning versions. - */ - $located = apply_filters( "um_override_templates_get_template_path__{$key}", $located, $file ); - - $exceptions = array( - 'members-grid.php', - 'members-header.php', - 'members-list.php', - 'members-pagination.php', - 'searchform.php', - 'login-to-view.php', - 'profile/comments.php', - 'profile/comments-single.php', - 'profile/posts.php', - 'profile/posts-single.php', - 'modal/um_upload_single.php', - 'modal/um_view_photo.php', - ); - - if ( ! empty( $located ) ) { - $theme_file = $located['theme']; - } elseif ( in_array( $file, $exceptions, true ) && file_exists( get_stylesheet_directory() . '/ultimate-member/' . $file ) ) { - $theme_file = get_stylesheet_directory() . '/ultimate-member/' . $file; - } elseif ( file_exists( get_stylesheet_directory() . '/ultimate-member/templates/' . $file ) ) { - $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $file; - } else { - $theme_file = false; - } - - if ( ! empty( $theme_file ) ) { - $core_file = $file; - - if ( ! empty( $located ) ) { - $core_path = $located['core']; - $core_file_path = stristr( $core_path, 'wp-content' ); - } else { - $core_path = UM_PATH . '/templates/' . $core_file; - $core_file_path = stristr( UM_PATH . 'templates/' . $core_file, 'wp-content' ); - } - $core_version = self::get_file_version( $core_path ); - $theme_version = self::get_file_version( $theme_file ); - - $status = esc_html__( 'Theme version up to date', 'ultimate-member' ); - $status_code = 1; - if ( version_compare( $theme_version, $core_version, '<' ) ) { - $status = esc_html__( 'Theme version is out of date', 'ultimate-member' ); - $status_code = 0; - } - if ( '' === $theme_version ) { - $status = esc_html__( 'Theme version is empty', 'ultimate-member' ); - $status_code = 0; - } - if ( 0 === $status_code ) { - $out_date = true; - update_option( 'um_override_templates_outdated', true ); - } - $outdated_files[] = array( - 'core_version' => $core_version, - 'theme_version' => $theme_version, - 'core_file' => $core_file_path, - 'theme_file' => stristr( $theme_file, 'wp-content' ), - 'status' => $status, - 'status_code' => $status_code, - ); - } - } - } - } - - if ( false === $out_date ) { - delete_option( 'um_override_templates_outdated' ); - } - update_option( 'um_template_statuses', $outdated_files ); - if ( true === $get_list ) { - return $outdated_files; - } - } - - /** * Scan the template files. * @@ -3389,58 +3389,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { * @return array */ public static function scan_template_files( $template_path ) { - $files = @scandir( $template_path ); // @codingStandardsIgnoreLine. - $result = array(); - - if ( ! empty( $files ) ) { - - foreach ( $files as $value ) { - - if ( ! in_array( $value, array( '.', '..' ), true ) ) { - - if ( is_dir( $template_path . DIRECTORY_SEPARATOR . $value ) ) { - $sub_files = self::scan_template_files( $template_path . DIRECTORY_SEPARATOR . $value ); - foreach ( $sub_files as $sub_file ) { - $result[] = $value . DIRECTORY_SEPARATOR . $sub_file; - } - } else { - $result[] = $value; - } - } - } - } - return $result; - } - - /** - * @param $file string - * - * @return string - */ - public static function get_file_version( $file ) { - // Avoid notices if file does not exist. - if ( ! file_exists( $file ) ) { - return ''; - } - - // We don't need to write to the file, so just open for reading. - $fp = fopen( $file, 'r' ); // @codingStandardsIgnoreLine. - - // Pull only the first 8kiB of the file in. - $file_data = fread( $fp, 8192 ); // @codingStandardsIgnoreLine. - - // PHP will close a file handle, but we are good citizens. - fclose( $fp ); // @codingStandardsIgnoreLine. - - // Make sure we catch CR-only line endings. - $file_data = str_replace( "\r", "\n", $file_data ); - $version = ''; - - if ( preg_match( '/^[ \t\/*#@]*' . preg_quote( '@version', '/' ) . '(.*)$/mi', $file_data, $match ) && $match[1] ) { - $version = _cleanup_header_comment( $match[1] ); - } - - return $version; + return UM()->common()->theme()::scan_template_files( $template_path ); } /** @@ -3542,8 +3491,11 @@ if ( ! class_exists( 'um\admin\core\Admin_Settings' ) ) { return $settings; } + $wp_default_protocols = wp_allowed_protocols(); + $protocols = array_merge( $wp_default_protocols, array( 'data' ) ); + $template = $settings['um_email_template']; - $content = wp_kses( stripslashes( $settings[ $template ] ), 'post', array( 'data' ) ); + $content = wp_kses( stripslashes( $settings[ $template ] ), 'post', $protocols ); $theme_template_path = UM()->mail()->get_template_file( 'theme', $template ); if ( ! file_exists( $theme_template_path ) ) { diff --git a/includes/admin/core/class-admin-theme-updater.php b/includes/admin/core/class-admin-theme-updater.php index 144ccac4..5c460b58 100644 --- a/includes/admin/core/class-admin-theme-updater.php +++ b/includes/admin/core/class-admin-theme-updater.php @@ -85,7 +85,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Theme_Updater' ) ) { } $old_version = get_option( 'theme_version ' . $theme->get( 'Name' ) ); - $version = $theme->get( 'Version' ); + $version = $theme->get( 'Version' ); if ( $old_version === $version ) { return; } @@ -98,14 +98,14 @@ if ( ! class_exists( 'um\admin\core\Admin_Theme_Updater' ) ) { $um_dir = $theme->get_stylesheet_directory() . DIRECTORY_SEPARATOR . 'ultimate-member'; @mkdir( $um_dir, 0777, true ); - $src = realpath( $temp_dir ); + $src = realpath( $temp_dir ); $dest = realpath( $um_dir ); if ( $src && $dest ) { self::recurse_copy( $src, $dest ); - error_log( "UM Log. Theme '" . $theme->get( 'template' ) . "' templates restored." ); + error_log( "UM Log. Theme '" . $theme->get( 'Name' ) . "' templates restored." ); UM()->files()->remove_dir( $src ); } else { - error_log( "UM Error. Can not restore theme templates." ); + error_log( 'UM Error. Can not restore theme templates.' ); } delete_option( 'theme_version ' . $theme->get( 'Name' ) ); @@ -140,13 +140,13 @@ if ( ! class_exists( 'um\admin\core\Admin_Theme_Updater' ) ) { $temp_dir = UM()->uploader()->get_core_temp_dir() . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR . $theme->get( 'template' ); @mkdir( $temp_dir, 0777, true ); - $src = realpath( $um_dir ); + $src = realpath( $um_dir ); $dest = realpath( $temp_dir ); if ( $src && $dest ) { self::recurse_copy( $src, $dest ); - error_log( "UM Log. Theme '" . $theme->get( 'template' ) . "' templates saved." ); + error_log( "UM Log. Theme '" . $theme->get( 'Name' ) . "' templates saved." ); } else { - error_log( "UM Error. Can not save theme templates." ); + error_log( 'UM Error. Can not save theme templates.' ); } update_option( 'theme_version ' . $theme->get( 'Name' ), $theme->get( 'Version' ) ); @@ -156,7 +156,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Theme_Updater' ) ) { /** * Filter: upgrader_package_options - * + * * @param array $options * @return array */ @@ -170,7 +170,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Theme_Updater' ) ) { /** * Action: upgrader_process_complete - * + * * @param \WP_Upgrader $WP_Upgrader * @param array $options */ @@ -184,4 +184,4 @@ if ( ! class_exists( 'um\admin\core\Admin_Theme_Updater' ) ) { } -} \ No newline at end of file +} diff --git a/includes/admin/core/class-admin-users.php b/includes/admin/core/class-admin-users.php index bcb05c8c..6582793a 100644 --- a/includes/admin/core/class-admin-users.php +++ b/includes/admin/core/class-admin-users.php @@ -247,7 +247,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { 'label' => __( 'Put as Pending Review', 'ultimate-member' ) ), 'um_resend_activation' => array( - 'label' => __( 'Resend Activation E-mail', 'ultimate-member' ) + 'label' => __( 'Resend Activation Email', 'ultimate-member' ) ), 'um_deactivate' => array( 'label' => __( 'Deactivate', 'ultimate-member' ) @@ -274,7 +274,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { public function user_row_actions( $actions, $user_object ) { $user_id = $user_object->ID; - $actions['frontend_profile'] = '' . __( 'View profile', 'ultimate-member' ) . ''; + $actions['frontend_profile'] = '' . __( 'View profile', 'ultimate-member' ) . ''; $submitted = get_user_meta( $user_id, 'submitted', true ); if ( ! empty( $submitted ) ) { @@ -407,7 +407,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Users' ) ) { $status = array( 'approved' => __( 'Approved', 'ultimate-member' ), 'awaiting_admin_review' => __( 'Pending review', 'ultimate-member' ), - 'awaiting_email_confirmation' => __( 'Waiting e-mail confirmation', 'ultimate-member' ), + 'awaiting_email_confirmation' => __( 'Waiting email confirmation', 'ultimate-member' ), 'inactive' => __( 'Inactive', 'ultimate-member' ), 'rejected' => __( 'Rejected', 'ultimate-member' ), ); diff --git a/includes/admin/core/list-tables/emails-list-table.php b/includes/admin/core/list-tables/emails-list-table.php index 0ebd6798..0321b934 100644 --- a/includes/admin/core/list-tables/emails-list-table.php +++ b/includes/admin/core/list-tables/emails-list-table.php @@ -336,8 +336,8 @@ $ListTable->wpc_set_pagination_args( array( 'total_items' => count( $emails ), '


    - - here.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/1335-email-templates' ), UM()->get_allowed_html( 'admin_notice' ) ); ?> + + doc for more information.', 'ultimate-member' ), 'https://docs.ultimatemember.com/article/116-not-receiving-user-emails-or-admin-notifications' ), UM()->get_allowed_html( 'admin_notice' ) ); ?>

    diff --git a/includes/admin/core/list-tables/version-template-list-table.php b/includes/admin/core/list-tables/version-template-list-table.php index bf1360fe..f116b0c8 100644 --- a/includes/admin/core/list-tables/version-template-list-table.php +++ b/includes/admin/core/list-tables/version-template-list-table.php @@ -58,8 +58,7 @@ class UM_Versions_List_Table extends WP_List_Table { $sortable = $this->get_sortable_columns(); $this->_column_headers = array( $columns, array(), $sortable ); - $templates = get_option( 'um_template_statuses', array() ); - $templates = is_array( $templates ) ? $templates : array(); + $templates = UM()->common()->theme()->build_templates_data(); @uasort( $templates, diff --git a/includes/admin/templates/dashboard/users.php b/includes/admin/templates/dashboard/users.php index e7718757..5be7fde9 100644 --- a/includes/admin/templates/dashboard/users.php +++ b/includes/admin/templates/dashboard/users.php @@ -1,93 +1,74 @@ - + - -
    - - - - + + + + + + + + + + +
    - + + + - - - - - - - - - - - - -
    + + query()->count_users(); ?> - -
    - - query()->count_users_by_status( 'approved' ); ?> - - - - - -
    - - query()->count_users_by_status( 'rejected' ); ?> - - - - - -
    - - - - + +
    + + + query()->count_users_by_status( 'awaiting_admin_review' ); ?> + + + + + +
    + + + query()->count_users_by_status( 'approved' ); ?> + + + + + + + + + query()->count_users_by_status( 'awaiting_email_confirmation' ); ?> + + + + + +
    + + + query()->count_users_by_status( 'rejected' ); ?> + + + + + + + + query()->count_users_by_status( 'inactive' ); ?> + + + + + +
    diff --git a/includes/admin/templates/extensions.php b/includes/admin/templates/extensions.php index 7da231e4..bcc2bcbf 100644 --- a/includes/admin/templates/extensions.php +++ b/includes/admin/templates/extensions.php @@ -166,12 +166,12 @@ $premium['profile-tabs'] = array( 'desc' => 'Add custom tabs to profiles', ); -//$premium['stripe'] = array( -// 'url' => 'https://ultimatemember.com/extensions/stripe/', -// 'img' => 'stripe.png', -// 'name' => 'Stripe', -// 'desc' => 'Sell paid memberships to access your website via Stripe subscriptions', -//); +$premium['stripe'] = array( + 'url' => 'https://ultimatemember.com/extensions/stripe/', + 'img' => 'stripe.png', + 'name' => 'Stripe', + 'desc' => 'Sell paid memberships to access your website via Stripe subscriptions', +); $free['jobboardwp'] = array( 'url' => 'https://wordpress.org/plugins/um-jobboardwp', diff --git a/includes/admin/templates/role/admin-permissions.php b/includes/admin/templates/role/admin-permissions.php index 93113d19..524ca8b5 100644 --- a/includes/admin/templates/role/admin-permissions.php +++ b/includes/admin/templates/role/admin-permissions.php @@ -43,7 +43,7 @@ 'id' => '_um_can_delete_everyone', 'type' => 'checkbox', 'label' => __( 'Can delete other member accounts?', 'ultimate-member' ), - 'tooltip' => __( 'Allow this role to edit accounts of other members', 'ultimate-member' ), + 'tooltip' => __( 'Allow this role to delete other user accounts.', 'ultimate-member' ), 'value' => ! empty( $role['_um_can_delete_everyone'] ) ? $role['_um_can_delete_everyone'] : 0, ), array( @@ -58,4 +58,4 @@ ) ) ) )->render_form(); ?> -
    \ No newline at end of file +
    diff --git a/includes/admin/templates/role/publish.php b/includes/admin/templates/role/publish.php index bdbaf33c..9273d006 100644 --- a/includes/admin/templates/role/publish.php +++ b/includes/admin/templates/role/publish.php @@ -1,12 +1,14 @@ - +$role = $object['data']; +?>
    admin_forms( + $form = UM()->admin_forms( array( 'class' => 'um-role-publish um-top-label', 'prefix_id' => 'role', @@ -20,7 +22,8 @@ $role = $object['data']; ?> ), ), ) - )->render_form(); + ); + $form->render_form(); ?>
    @@ -31,3 +34,10 @@ $role = $object['data']; ?>
    +render_external_link( + array( + 'html' => __( 'Learn more about role priorities', 'ultimate-member' ), + 'url' => 'https://docs.ultimatemember.com/article/1494-how-to-set-role-priority-for-user-roles', + ) +); diff --git a/includes/admin/templates/role/register.php b/includes/admin/templates/role/register.php index 5b2ba4df..3952a31b 100644 --- a/includes/admin/templates/role/register.php +++ b/includes/admin/templates/role/register.php @@ -76,8 +76,8 @@ array( 'id' => '_um_url_email_activate', 'type' => 'text', - 'label' => __( 'URL redirect after e-mail activation', 'ultimate-member' ), - 'tooltip' => __( 'If you want users to go to a specific page other than login page after e-mail activation, enter the URL here.', 'ultimate-member' ), + 'label' => __( 'URL redirect after email activation', 'ultimate-member' ), + 'tooltip' => __( 'If you want users to go to a specific page other than login page after email activation, enter the URL here.', 'ultimate-member' ), 'value' => ! empty( $role['_um_url_email_activate'] ) ? __( $role['_um_url_email_activate'], 'ultimate-member' ) : '', 'conditional' => array( '_um_status', '=', 'checkmail' ), ), diff --git a/includes/ajax/class-secure.php b/includes/ajax/class-secure.php index c432ea7f..f69fc682 100644 --- a/includes/ajax/class-secure.php +++ b/includes/ajax/class-secure.php @@ -284,8 +284,8 @@ class Secure { if ( $suspicious_accounts_count > 0 ) { $lock_register_forms_url = admin_url( 'admin.php?page=um_options&tab=advanced§ion=secure&um_secure_lock_register_forms=1&_wpnonce=' . wp_create_nonce( 'um_secure_lock_register_forms' ) ); $content .= $br . esc_html__( '1. Please temporarily lock all your active Register forms.', 'ultimate-member' ); - $content .= ' ' . esc_html__( 'Click here to lock them now.', 'ultimate-member' ) . ''; - $content .= ' ' . esc_html__( 'You can unblock the Register forms later. Just go to Ultimate Member > Settings > Secure > uncheck the option "Lock All Register Forms".', 'ultimate-member' ); + $content .= ' ' . esc_html__( 'Click here to lock them now.', 'ultimate-member' ) . ''; + $content .= ' ' . esc_html__( 'You can unblock the Register forms later. Just go to Ultimate Member > Settings > Advanced > Security and uncheck the option "Lock All Register Forms".', 'ultimate-member' ); $content .= $br . $br; $suspicious_accounts_url = admin_url( 'users.php?um_status=inactive' ); @@ -300,24 +300,24 @@ class Secure { } $content .= esc_html__( '2. Review all suspicious accounts and delete them completely.', 'ultimate-member' ); - $content .= ' ' . esc_html__( 'Click here to review accounts.', 'ultimate-member' ) . ''; + $content .= ' ' . esc_html__( 'Click here to review accounts.', 'ultimate-member' ) . ''; $content .= $br . $br; $nonce = wp_create_nonce( 'um-secure-expire-session-nonce' ); $destroy_all_sessions_url = admin_url( '?um_secure_expire_all_sessions=1&_wpnonce=' . esc_attr( $nonce ) . '&except_me=1' ); $content .= esc_html__( '3. If accounts are suspicious to you, please destroy all user sessions to logout active users on your site.', 'ultimate-member' ); - $content .= ' ' . esc_html__( 'Click here to Destroy Sessions now', 'ultimate-member' ) . ''; + $content .= ' ' . esc_html__( 'Click here to Destroy Sessions now', 'ultimate-member' ) . ''; $content .= $br . $br; $content .= esc_html__( '4. Run a complete scan on your site using third-party Security plugins such as', 'ultimate-member' ); - $content .= ' ' . esc_html__( 'WPScan/Jetpack Protect or WordFence Security', 'ultimate-member' ) . '.'; + $content .= ' ' . esc_html__( 'WPScan/Jetpack Protect or WordFence Security', 'ultimate-member' ) . '.'; $content .= $br . $br; $nonce = wp_create_nonce( 'um-secure-enable-reset-pass-nonce' ); $reset_pass_sessions_url = admin_url( '?um_secure_enable_reset_password=1&_wpnonce=' . esc_attr( $nonce ) . '&except_me=1' ); $content .= esc_html__( '5. Force users to Reset their Passwords.', 'ultimate-member' ); - $content .= ' ' . esc_html__( 'Click here to enable this option', 'ultimate-member' ) . '.'; + $content .= ' ' . esc_html__( 'Click here to enable this option', 'ultimate-member' ) . '.'; $content .= ' ' . esc_html__( 'When this option is enabled, users will be asked to reset their passwords(one-time) on the next login in the UM Login form.', 'ultimate-member' ); $content .= $br . $br; diff --git a/includes/blocks/um-member-directories/build/index.asset.php b/includes/blocks/um-member-directories/build/index.asset.php index 4c516119..83e8be83 100644 --- a/includes/blocks/um-member-directories/build/index.asset.php +++ b/includes/blocks/um-member-directories/build/index.asset.php @@ -1 +1 @@ - array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-element', 'wp-server-side-render'), 'version' => 'a7aefdd7c81b99d7d5e3'); + array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-server-side-render'), 'version' => '5b1a8ec016836a5c26cd'); diff --git a/includes/blocks/um-member-directories/build/index.js b/includes/blocks/um-member-directories/build/index.js index 4a028c8b..7492c2d3 100644 --- a/includes/blocks/um-member-directories/build/index.js +++ b/includes/blocks/um-member-directories/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e={n:function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,{a:r}),r},d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t=window.wp.element,r=window.wp.data,n=window.wp.components,i=window.wp.blockEditor,o=window.wp.serverSideRender,l=e.n(o);(0,window.wp.blocks.registerBlockType)("um-block/um-member-directories",{edit:function(e){let{member_id:o,setAttributes:u}=e.attributes;const c=(0,i.useBlockProps)(),a=(0,r.useSelect)((e=>e("core").getEntityRecords("postType","um_directory",{per_page:-1,_fields:["id","title"]})));if(!a)return(0,t.createElement)("p",null,(0,t.createElement)(n.Spinner,null),wp.i18n.__("Loading...","ultimate-member"));if(0===a.length)return"No posts found.";let d=[{id:"",title:""}].concat(a).map((e=>({label:e.title.rendered,value:e.id})));return(0,t.createElement)("div",{...c},(0,t.createElement)(l(),{block:"um-block/um-member-directories",attributes:e.attributes}),(0,t.createElement)(i.InspectorControls,null,(0,t.createElement)(n.PanelBody,{title:wp.i18n.__("Select Directories","ultimate-member")},(0,t.createElement)(n.SelectControl,{label:wp.i18n.__("Select Directories","ultimate-member"),className:"um_select_directory",value:o,options:d,style:{height:"35px",lineHeight:"20px",padding:"0 7px"},onChange:t=>{e.setAttributes({member_id:t})}}))))},save:function(e){return null}}),jQuery(window).on("load",(function(e){new MutationObserver((function(e){e.forEach((function(e){jQuery(e.addedNodes).find(".um.um-directory").each((function(){var e=jQuery(this);um_ajax_get_members(e),um_slider_filter_init(e),um_datepicker_filter_init(e),um_timepicker_filter_init(e)}))}))})).observe(document,{attributes:!1,childList:!0,characterData:!1,subtree:!0})}))}(); \ No newline at end of file +(()=>{"use strict";var e={n:t=>{var r=t&&t.__esModule?()=>t.default:()=>t;return e.d(r,{a:r}),r},d:(t,r)=>{for(var i in r)e.o(r,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:r[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window.React,r=window.wp.data,i=window.wp.components,n=window.wp.blockEditor,o=window.wp.serverSideRender;var l=e.n(o);(0,window.wp.blocks.registerBlockType)("um-block/um-member-directories",{edit:function(e){let{member_id:o,setAttributes:a}=e.attributes;const c=(0,n.useBlockProps)(),u=(0,r.useSelect)((e=>e("core").getEntityRecords("postType","um_directory",{per_page:-1,_fields:["id","title"]})));if(!u)return(0,t.createElement)("p",null,(0,t.createElement)(i.Spinner,null),wp.i18n.__("Loading...","ultimate-member"));if(0===u.length)return"No posts found.";let d=[{id:"",title:""}].concat(u).map((e=>({label:e.title.rendered,value:e.id})));return(0,t.createElement)("div",{...c},(0,t.createElement)(l(),{block:"um-block/um-member-directories",attributes:e.attributes}),(0,t.createElement)(n.InspectorControls,null,(0,t.createElement)(i.PanelBody,{title:wp.i18n.__("Select Directories","ultimate-member")},(0,t.createElement)(i.SelectControl,{label:wp.i18n.__("Select Directories","ultimate-member"),className:"um_select_directory",value:o,options:d,style:{height:"35px",lineHeight:"20px",padding:"0 7px"},onChange:t=>{e.setAttributes({member_id:t})}}))))},save:function(e){return null}}),jQuery(window).on("load",(function(e){new MutationObserver((function(e){e.forEach((function(e){jQuery(e.addedNodes).find(".um.um-directory").each((function(){var e=jQuery(this);um_ajax_get_members(e),um_slider_filter_init(e),um_datepicker_filter_init(e),um_timepicker_filter_init(e)})),jQuery(e.addedNodes).find(".um-member").each((function(){var e=jQuery(this).parent();UM_Member_Grid(e)}))}))})).observe(document,{attributes:!1,childList:!0,characterData:!1,subtree:!0})}))})(); \ No newline at end of file diff --git a/includes/blocks/um-member-directories/src/index.js b/includes/blocks/um-member-directories/src/index.js index 18bbcc63..41e606b3 100644 --- a/includes/blocks/um-member-directories/src/index.js +++ b/includes/blocks/um-member-directories/src/index.js @@ -101,6 +101,10 @@ jQuery(window).on( 'load', function($) { um_datepicker_filter_init( directory ); um_timepicker_filter_init( directory ); }); + jQuery(mutation.addedNodes).find('.um-member').each(function() { + var directory = jQuery(this).parent(); + UM_Member_Grid(directory); + }); }); }); diff --git a/includes/class-config.php b/includes/class-config.php index 1a4c7a1e..3d3039a5 100644 --- a/includes/class-config.php +++ b/includes/class-config.php @@ -204,29 +204,7 @@ if ( ! class_exists( 'um\Config' ) ) { '_um_secondary_color', ); - /** - * UM hook - * - * @type filter - * @title um_core_form_meta_all - * @description Extend UM forms meta keys - * @input_vars - * [{"var":"$meta","type":"array","desc":"UM forms meta"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * - */ - $this->core_form_meta_all = apply_filters( 'um_core_form_meta_all', array( + $this->core_form_meta_all = array( /*Profile Form*/ '_um_profile_show_name' => 1, '_um_profile_show_social_links' => 0, @@ -279,62 +257,49 @@ if ( ! class_exists( 'um\Config' ) ) { '_um_directory_template' => 'members', '_um_directory_header' => __( '{total_users} Members', 'ultimate-member' ), '_um_directory_header_single' => __( '{total_users} Member', 'ultimate-member' ), - ) ); + ); + /** + * Filters the list of Ultimate Member forms meta. + * + * @param {array} $form_meta UM Forms meta. + * + * @return {array} Forms meta. + * + * @since 1.3.x + * @hook um_core_form_meta_all + * + * @example Add custom admin notice after {custom_update_key} action. + * function my_um_core_form_meta_all( $form_meta ) { + * // your code here + * $meta['my_meta_key'] = 'my_meta_value'; + * return $meta; + * } + * add_filter( 'um_core_form_meta_all', 'my_um_core_form_meta_all' ); + */ + $this->core_form_meta_all = apply_filters( 'um_core_form_meta_all', $this->core_form_meta_all ); $this->core_form_meta['register'] = array( - '_um_custom_fields' => 'a:6:{s:10:"user_login";a:15:{s:5:"title";s:8:"Username";s:7:"metakey";s:10:"user_login";s:4:"type";s:4:"text";s:5:"label";s:8:"Username";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:0;s:8:"validate";s:15:"unique_username";s:9:"min_chars";i:3;s:9:"max_chars";i:24;s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"user_email";a:13:{s:5:"title";s:14:"E-mail Address";s:7:"metakey";s:10:"user_email";s:4:"type";s:4:"text";s:5:"label";s:14:"E-mail Address";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"validate";s:12:"unique_email";s:8:"position";s:1:"4";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"5";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"first_name";a:12:{s:5:"title";s:10:"First Name";s:7:"metakey";s:10:"first_name";s:4:"type";s:4:"text";s:5:"label";s:10:"First Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"last_name";a:12:{s:5:"title";s:9:"Last Name";s:7:"metakey";s:9:"last_name";s:4:"type";s:4:"text";s:5:"label";s:9:"Last Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"position";s:1:"3";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', - '_um_mode' => 'register', - '_um_core' => 'register', + '_um_custom_fields' => 'a:6:{s:10:"user_login";a:15:{s:5:"title";s:8:"Username";s:7:"metakey";s:10:"user_login";s:4:"type";s:4:"text";s:5:"label";s:8:"Username";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:0;s:8:"validate";s:15:"unique_username";s:9:"min_chars";i:3;s:9:"max_chars";i:24;s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"user_email";a:13:{s:5:"title";s:14:"Email Address";s:7:"metakey";s:10:"user_email";s:4:"type";s:4:"text";s:5:"label";s:14:"E-mail Address";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"validate";s:12:"unique_email";s:8:"position";s:1:"4";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"5";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:10:"first_name";a:12:{s:5:"title";s:10:"First Name";s:7:"metakey";s:10:"first_name";s:4:"type";s:4:"text";s:5:"label";s:10:"First Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"last_name";a:12:{s:5:"title";s:9:"Last Name";s:7:"metakey";s:9:"last_name";s:4:"type";s:4:"text";s:5:"label";s:9:"Last Name";s:8:"required";i:0;s:6:"public";i:1;s:8:"editable";b:1;s:8:"position";s:1:"3";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', + '_um_mode' => 'register', + '_um_core' => 'register', '_um_register_use_custom_settings' => 0, ); $this->core_form_meta['login'] = array( - '_um_custom_fields' => 'a:3:{s:8:"username";a:13:{s:5:"title";s:18:"Username or E-mail";s:7:"metakey";s:8:"username";s:4:"type";s:4:"text";s:5:"label";s:18:"Username or E-mail";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:0;s:8:"validate";s:24:"unique_username_or_email";s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', - '_um_mode' => 'login', - '_um_core' => 'login', + '_um_custom_fields' => 'a:3:{s:8:"username";a:13:{s:5:"title";s:18:"Username or Email";s:7:"metakey";s:8:"username";s:4:"type";s:4:"text";s:5:"label";s:18:"Username or E-mail";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:0;s:8:"validate";s:24:"unique_username_or_email";s:8:"position";s:1:"1";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:13:"user_password";a:16:{s:5:"title";s:8:"Password";s:7:"metakey";s:13:"user_password";s:4:"type";s:8:"password";s:5:"label";s:8:"Password";s:8:"required";i:1;s:6:"public";i:1;s:8:"editable";b:1;s:9:"min_chars";i:8;s:9:"max_chars";i:30;s:15:"force_good_pass";i:1;s:18:"force_confirm_pass";i:1;s:8:"position";s:1:"2";s:6:"in_row";s:9:"_um_row_1";s:10:"in_sub_row";s:1:"0";s:9:"in_column";s:1:"1";s:8:"in_group";s:0:"";}s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', + '_um_mode' => 'login', + '_um_core' => 'login', '_um_login_use_custom_settings' => 0, ); $this->core_form_meta['profile'] = array( - '_um_custom_fields' => 'a:1:{s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', - '_um_mode' => 'profile', - '_um_core' => 'profile', + '_um_custom_fields' => 'a:1:{s:9:"_um_row_1";a:4:{s:4:"type";s:3:"row";s:2:"id";s:9:"_um_row_1";s:8:"sub_rows";s:1:"1";s:4:"cols";s:1:"1";}}', + '_um_mode' => 'profile', + '_um_core' => 'profile', '_um_profile_use_custom_settings' => 0, ); - - /** - * UM hook - * - * @type filter - * @title um_email_notifications - * @description Extend UM email notifications - * @input_vars - * [{"var":"$emails","type":"array","desc":"UM email notifications"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * 'my_email', - * 'title' => __( 'my_email_title','ultimate-member' ), - * 'subject' => 'my_email_subject', - * 'body' => 'my_email_body', - * 'description' => 'my_email_description', - * 'recipient' => 'user', // set 'admin' for make administrator as recipient - * 'default_active' => true // can be false for make disabled by default - * ); - * - * return $emails; - * } - * ?> - */ - $this->email_notifications = apply_filters( 'um_email_notifications', array( + $this->email_notifications = array( 'welcome_email' => array( 'key' => 'welcome_email', 'title' => __( 'Account Welcome Email','ultimate-member' ), @@ -343,7 +308,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'Thank you for signing up with {site_name}! Your account is now active.

    ' . '{action_title}:

    ' . '{action_url}

    ' . - 'Your account e-mail: {email}
    ' . + 'Your account email: {email}
    ' . 'Your account username: {username}

    ' . 'If you have any problems, please contact us at {admin_email}

    ' . 'Thanks,
    ' . @@ -362,7 +327,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'If you have any problems, please contact us at {admin_email}

    ' . 'Thanks,
    ' . '{site_name}', - 'description' => __('Whether to send the user an email when his account needs e-mail activation','ultimate-member'), + 'description' => __('Whether to send the user an email when his account needs email activation','ultimate-member'), 'recipient' => 'user' ), 'pending_email' => array( @@ -386,7 +351,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'Thank you for signing up with {site_name}! Your account has been approved and is now active.

    ' . 'To login please visit the following url:

    ' . '{login_url}

    ' . - 'Your account e-mail: {email}
    ' . + 'Your account email: {email}
    ' . 'Your account username: {username}
    ' . 'Set your account password: {password_reset_link}

    ' . 'If you have any problems, please contact us at {admin_email}

    ' . @@ -507,92 +472,123 @@ if ( ! class_exists( 'um\Config' ) ) { ), 'suspicious-activity' => array( 'key' => 'suspicious-activity', - 'title' => __( 'Secure: Suspicious Account Activity', 'ultimate-member' ), + 'title' => __( 'Security: Suspicious Account Activity', 'ultimate-member' ), 'subject' => __( '[{site_name}] Suspicious Account Activity', 'ultimate-member' ), 'body' => 'This is to inform you that there are suspicious activities with the following accounts: {user_profile_link}', 'description' => __( 'Whether to receive notification when suspicious account activity is detected.', 'ultimate-member' ), 'recipient' => 'admin', 'default_active' => true, ), - ) ); + ); + /** + * Filters the list of Ultimate Member email notifications. + * + * @param {array} $email_notifications Email notifications. + * + * @return {array} Email notifications. + * + * @since 2.0.0 + * @hook um_email_notifications + * + * @example Add custom admin notice after {custom_update_key} action. + * function my_um_email_notifications( $notifications ) { + * // your code here + * $emails['my_email'] = array( + * 'key' => 'my_email', + * 'title' => __( 'my_email_title','ultimate-member' ), + * 'subject' => 'my_email_subject', + * 'body' => 'my_email_body', + * 'description' => 'my_email_description', + * 'recipient' => 'user', // set 'admin' for make administrator as recipient + * 'default_active' => true // can be false for make disabled by default + * ); + * + * return $emails; + * } + * add_filter( 'um_email_notifications', 'my_um_email_notifications' ); + */ + $this->email_notifications = apply_filters( 'um_email_notifications', $this->email_notifications ); - //settings defaults + // Settings defaults. $this->settings_defaults = array( - 'restricted_access_post_metabox' => array( 'post' => 1, 'page' => 1 ), - 'disable_restriction_pre_queries' => 0, - 'uninstall_on_delete' => 0, + 'restricted_access_post_metabox' => array( + 'post' => 1, + 'page' => 1, + ), + 'disable_restriction_pre_queries' => false, + 'uninstall_on_delete' => false, 'permalink_base' => 'user_login', 'permalink_base_custom_meta' => '', 'display_name' => 'full_name', 'display_name_field' => '', - 'author_redirect' => 1, + 'author_redirect' => true, 'members_page' => true, - 'use_gravatars' => 0, + 'use_gravatars' => false, 'use_um_gravatar_default_builtin_image' => 'default', - 'use_um_gravatar_default_image' => 0, + 'use_um_gravatar_default_image' => false, 'toggle_password' => false, - 'require_strongpass' => 0, + 'require_strongpass' => false, 'password_min_chars' => 8, 'password_max_chars' => 30, - 'account_tab_password' => 1, - 'account_tab_privacy' => 1, - 'account_tab_notifications' => 1, - 'account_tab_delete' => 1, + 'account_tab_password' => true, + 'account_tab_privacy' => true, + 'account_tab_notifications' => true, + 'account_tab_delete' => true, 'delete_account_text' => __( 'Are you sure you want to delete your account? This will erase all of your account data from the site. To delete your account enter your password below.', 'ultimate-member' ), 'delete_account_no_pass_required_text' => __( 'Are you sure you want to delete your account? This will erase all of your account data from the site. To delete your account, click on the button below.', 'ultimate-member' ), - 'account_name' => 1, - 'account_name_disable' => 0, - 'account_name_require' => 1, - 'account_email' => 1, - 'account_general_password' => 0, - 'account_hide_in_directory' => 1, + 'account_name' => true, + 'account_name_disable' => false, + 'account_name_require' => true, + 'account_email' => true, + 'account_general_password' => false, + 'account_hide_in_directory' => true, 'account_hide_in_directory_default' => 'No', 'photo_thumb_sizes' => array( 40, 80, 190 ), 'cover_thumb_sizes' => array( 300, 600 ), 'accessible' => 0, 'access_redirect' => '', 'access_exclude_uris' => array(), - 'home_page_accessible' => 1, - 'category_page_accessible' => 1, - 'restricted_post_title_replace' => 1, + 'home_page_accessible' => true, + 'category_page_accessible' => true, + 'restricted_post_title_replace' => true, 'restricted_access_post_title' => __( 'Restricted content', 'ultimate-member' ), 'restricted_access_message' => '', - 'restricted_blocks' => 0, - 'enable_blocks' => 0, + 'restricted_blocks' => false, + 'enable_blocks' => false, 'restricted_block_message' => '', - 'enable_reset_password_limit' => 1, + 'enable_reset_password_limit' => true, 'reset_password_limit_number' => 3, 'change_password_request_limit' => false, 'blocked_emails' => '', 'blocked_words' => 'admin' . "\r\n" . 'administrator' . "\r\n" . 'webmaster' . "\r\n" . 'support' . "\r\n" . 'staff', 'allowed_choice_callbacks' => '', - 'allow_url_redirect_confirm' => 1, + 'allow_url_redirect_confirm' => true, 'default_avatar' => '', 'default_cover' => '', - 'disable_profile_photo_upload' => 0, - 'profile_show_metaicon' => 0, - 'profile_menu' => 1, + 'disable_profile_photo_upload' => false, + 'profile_show_metaicon' => false, + 'profile_menu' => true, 'profile_menu_default_tab' => 'main', - 'profile_menu_icons' => 1, - 'form_asterisk' => 0, + 'profile_menu_icons' => true, + 'form_asterisk' => false, 'profile_title' => '{display_name} | {site_name}', 'profile_desc' => '{display_name} is on {site_name}. Join {site_name} to view {display_name}\'s profile', 'admin_email' => get_bloginfo( 'admin_email' ), 'mail_from' => get_bloginfo( 'name' ), 'mail_from_addr' => get_bloginfo( 'admin_email' ), - 'email_html' => 1, - 'image_orientation_by_exif' => 0, + 'email_html' => true, + 'image_orientation_by_exif' => false, 'image_compression' => 60, 'image_max_width' => 1000, 'cover_min_width' => 1000, 'profile_photo_max_size' => 999999999, 'cover_photo_max_size' => 999999999, 'custom_roles_increment' => 1, - 'um_profile_object_cache_stop' => 0, + 'um_profile_object_cache_stop' => false, 'rest_api_version' => '2.0', - 'member_directory_own_table' => 0, + 'member_directory_own_table' => false, 'profile_show_bio' => false, - 'profile_show_html_bio' => 0, + 'profile_show_html_bio' => false, 'profile_bio_maxchars' => 180, 'profile_noindex' => 0, 'activation_link_expiry_time' => '', @@ -603,7 +599,7 @@ if ( ! class_exists( 'um\Config' ) ) { 'secure_notify_admins_banned_accounts' => false, 'secure_notify_admins_banned_accounts__interval' => 'instant', 'secure_allowed_redirect_hosts' => '', - 'delete_comments' => 0, + 'delete_comments' => false, ); add_filter( 'um_get_tabs_from_config', '__return_true' ); @@ -620,26 +616,26 @@ if ( ! class_exists( 'um\Config' ) ) { if ( ! isset( $tab['default_privacy'] ) ) { $this->settings_defaults[ 'profile_tab_' . $id . '_privacy' ] = 0; - $this->settings_defaults[ 'profile_tab_' . $id . '_roles' ] = ''; + $this->settings_defaults[ 'profile_tab_' . $id . '_roles' ] = ''; } } foreach ( $this->email_notifications as $key => $notification ) { - $this->settings_defaults[ $key . '_on' ] = ! empty( $notification['default_active'] ); + $this->settings_defaults[ $key . '_on' ] = ! empty( $notification['default_active'] ); $this->settings_defaults[ $key . '_sub' ] = $notification['subject']; - $this->settings_defaults[ $key ] = $notification['body']; + $this->settings_defaults[ $key ] = $notification['body']; } foreach ( $this->core_pages as $page_s => $page ) { - $page_id = UM()->options()->get_core_page_id( $page_s ); + $page_id = UM()->options()->get_predefined_page_option_key( $page_s ); + $this->settings_defaults[ $page_id ] = ''; } - foreach( $this->core_form_meta_all as $key => $value ) { + foreach ( $this->core_form_meta_all as $key => $value ) { $this->settings_defaults[ str_replace( '_um_', '', $key ) ] = $value; } - /** * UM hook * @@ -665,126 +661,86 @@ if ( ! class_exists( 'um\Config' ) ) { $this->permalinks = $this->get_core_pages(); - - $this->default_roles_metadata = array( - /* - * All caps map - * - * '_um_can_access_wpadmin' => 1, - '_um_can_not_see_adminbar' => 0, - '_um_can_edit_everyone' => 1, - '_um_can_edit_roles' => '', - '_um_can_delete_everyone' => 1, - '_um_can_delete_roles' => '', - '_um_after_delete' => '', - '_um_delete_redirect_url' => '', - '_um_can_edit_profile' => 1, - '_um_can_delete_profile' => 1, - '_um_default_homepage' => 1, - '_um_redirect_homepage' => '', - '_um_after_login' => 'redirect_admin', - '_um_login_redirect_url' => '', - '_um_after_logout' => 'redirect_home', - '_um_logout_redirect_url' => '', - '_um_can_view_all' => 1, - '_um_can_view_roles' => '', - '_um_can_make_private_profile' => 1, - '_um_can_access_private_profile' => 1, - '_um_status' => 'approved', - '_um_auto_approve_act' => 'redirect_profile', - '_um_auto_approve_url' => '', - '_um_login_email_activate' => '', - '_um_checkmail_action' => '', - '_um_checkmail_message' => '', - '_um_checkmail_url' => '', - '_um_url_email_activate' => '', - '_um_pending_action' => '', - '_um_pending_message' => '', - '_um_pending_url' => '', - * - * */ - - - 'subscriber' => array( - '_um_can_access_wpadmin' => 0, - '_um_can_not_see_adminbar' => 1, - '_um_can_edit_everyone' => 0, - '_um_can_delete_everyone' => 0, - '_um_can_edit_profile' => 1, - '_um_can_delete_profile' => 1, - '_um_after_login' => 'redirect_profile', - '_um_after_logout' => 'redirect_home', - '_um_default_homepage' => 1, - '_um_can_view_all' => 1, - '_um_can_make_private_profile' => 0, - '_um_can_access_private_profile' => 0, - '_um_status' => 'approved', - '_um_auto_approve_act' => 'redirect_profile', + 'subscriber' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_after_logout' => 'redirect_home', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', ), - 'author' => array( - '_um_can_access_wpadmin' => 0, - '_um_can_not_see_adminbar' => 1, - '_um_can_edit_everyone' => 0, - '_um_can_delete_everyone' => 0, - '_um_can_edit_profile' => 1, - '_um_can_delete_profile' => 1, - '_um_after_login' => 'redirect_profile', - '_um_after_logout' => 'redirect_home', - '_um_default_homepage' => 1, - '_um_can_view_all' => 1, - '_um_can_make_private_profile' => 0, - '_um_can_access_private_profile' => 0, - '_um_status' => 'approved', - '_um_auto_approve_act' => 'redirect_profile', + 'author' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_after_logout' => 'redirect_home', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', ), - 'contributor' => array( - '_um_can_access_wpadmin' => 0, - '_um_can_not_see_adminbar' => 1, - '_um_can_edit_everyone' => 0, - '_um_can_delete_everyone' => 0, - '_um_can_edit_profile' => 1, - '_um_can_delete_profile' => 1, - '_um_after_login' => 'redirect_profile', - '_um_after_logout' => 'redirect_home', - '_um_default_homepage' => 1, - '_um_can_view_all' => 1, - '_um_can_make_private_profile' => 0, - '_um_can_access_private_profile' => 0, - '_um_status' => 'approved', - '_um_auto_approve_act' => 'redirect_profile', + 'contributor' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_after_logout' => 'redirect_home', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', ), - 'editor' => array( - '_um_can_access_wpadmin' => 0, - '_um_can_not_see_adminbar' => 1, - '_um_can_edit_everyone' => 0, - '_um_can_delete_everyone' => 0, - '_um_can_edit_profile' => 1, - '_um_can_delete_profile' => 1, - '_um_after_login' => 'redirect_profile', - '_um_after_logout' => 'redirect_home', - '_um_default_homepage' => 1, - '_um_can_view_all' => 1, - '_um_can_make_private_profile' => 0, - '_um_can_access_private_profile' => 0, - '_um_status' => 'approved', - '_um_auto_approve_act' => 'redirect_profile', + 'editor' => array( + '_um_can_access_wpadmin' => 0, + '_um_can_not_see_adminbar' => 1, + '_um_can_edit_everyone' => 0, + '_um_can_delete_everyone' => 0, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_after_login' => 'redirect_profile', + '_um_after_logout' => 'redirect_home', + '_um_default_homepage' => 1, + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 0, + '_um_can_access_private_profile' => 0, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', ), 'administrator' => array( - '_um_can_access_wpadmin' => 1, - '_um_can_not_see_adminbar' => 0, - '_um_can_edit_everyone' => 1, - '_um_can_delete_everyone' => 1, - '_um_can_edit_profile' => 1, - '_um_can_delete_profile' => 1, - '_um_default_homepage' => 1, - '_um_after_login' => 'redirect_admin', - '_um_after_logout' => 'redirect_home', - '_um_can_view_all' => 1, - '_um_can_make_private_profile' => 1, - '_um_can_access_private_profile' => 1, - '_um_status' => 'approved', - '_um_auto_approve_act' => 'redirect_profile', + '_um_can_access_wpadmin' => 1, + '_um_can_not_see_adminbar' => 0, + '_um_can_edit_everyone' => 1, + '_um_can_delete_everyone' => 1, + '_um_can_edit_profile' => 1, + '_um_can_delete_profile' => 1, + '_um_default_homepage' => 1, + '_um_after_login' => 'redirect_admin', + '_um_after_logout' => 'redirect_home', + '_um_can_view_all' => 1, + '_um_can_make_private_profile' => 1, + '_um_can_access_private_profile' => 1, + '_um_status' => 'approved', + '_um_auto_approve_act' => 'redirect_profile', ), ); @@ -812,7 +768,6 @@ if ( ! class_exists( 'um\Config' ) ) { ); } - /** * Get UM Pages * @@ -826,27 +781,41 @@ if ( ! class_exists( 'um\Config' ) ) { } foreach ( $core_pages as $page_key ) { - $page_option_key = UM()->options()->get_core_page_id( $page_key ); + $page_option_key = UM()->options()->get_predefined_page_option_key( $page_key ); $permalink[ $page_key ] = UM()->options()->get( $page_option_key ); } return $permalink; } - /** * @todo make config class not cycled */ - function set_core_page() { - $this->core_pages = apply_filters( 'um_core_pages', array( - 'user' => array( 'title' => __( 'User', 'ultimate-member' ) ), - 'login' => array( 'title' => __( 'Login', 'ultimate-member' ) ), - 'register' => array( 'title' => __( 'Register', 'ultimate-member' ) ), - 'members' => array( 'title' => __( 'Members', 'ultimate-member' ) ), - 'logout' => array( 'title' => __( 'Logout', 'ultimate-member' ) ), - 'account' => array( 'title' => __( 'Account', 'ultimate-member' ) ), - 'password-reset' => array( 'title' => __( 'Password Reset', 'ultimate-member' ) ), - ) ); + public function set_core_page() { + $this->core_pages = array( + 'user' => array( + 'title' => __( 'User', 'ultimate-member' ), + ), + 'login' => array( + 'title' => __( 'Login', 'ultimate-member' ), + ), + 'register' => array( + 'title' => __( 'Register', 'ultimate-member' ), + ), + 'members' => array( + 'title' => __( 'Members', 'ultimate-member' ), + ), + 'logout' => array( + 'title' => __( 'Logout', 'ultimate-member' ), + ), + 'account' => array( + 'title' => __( 'Account', 'ultimate-member' ), + ), + 'password-reset' => array( + 'title' => __( 'Password Reset', 'ultimate-member' ), + ), + ); + $this->core_pages = apply_filters( 'um_core_pages', $this->core_pages ); } /** @@ -872,13 +841,15 @@ if ( ! class_exists( 'um\Config' ) ) { */ public function init_predefined_pages() { $core_forms = get_option( 'um_core_forms', array() ); + $core_directories = get_option( 'um_core_directories', array() ); $setup_shortcodes = array_merge( array( 'profile' => '', 'login' => '', 'register' => '', + 'members' => '', ), - $core_forms + array_merge( $core_forms, $core_directories ) ); $this->predefined_pages = array( @@ -894,6 +865,10 @@ if ( ! class_exists( 'um\Config' ) ) { 'title' => __( 'Register', 'ultimate-member' ), 'content' => ! empty( $setup_shortcodes['register'] ) ? '[ultimatemember form_id="' . $setup_shortcodes['register'] . '"]' : '', ), + 'members' => array( + 'title' => __( 'Members', 'ultimate-member' ), + 'content' => ! empty( $setup_shortcodes['members'] ) ? '[ultimatemember form_id="' . $setup_shortcodes['members'] . '"]' : '', + ), 'logout' => array( 'title' => __( 'Logout', 'ultimate-member' ), 'content' => '', @@ -921,7 +896,7 @@ if ( ! class_exists( 'um\Config' ) ) { * @example Extend UM core pages. * function my_predefined_pages( $pages ) { * // your code here - * $pages['my_page_key'] = array( 'title' => __( 'My Page Title', 'my-translate-key' ) ); + * $pages['my_page_key'] = array( 'title' => __( 'My Page Title', 'my-translate-key' ), 'content' => 'my-page-predefined-content' ); * return $pages; * } * add_filter( 'um_predefined_pages', 'my_predefined_pages' ); diff --git a/includes/class-init.php b/includes/class-init.php index 0a7d33b4..a8005d2a 100644 --- a/includes/class-init.php +++ b/includes/class-init.php @@ -235,93 +235,41 @@ if ( ! class_exists( 'UM' ) ) { } } - /** - * Loading UM textdomain + * Loading UM textdomain. * - * 'ultimate-member' by default + * Note: 'ultimate-member' is a default textdomain. + * + * @since 2.8.5 WordPress native functions are used to make this function clear. */ public function localize() { - // The function `get_user_locale()` will return `get_locale()` result by default if user or its locale is empty. - $language_locale = get_user_locale(); - + $default_domain = dirname( plugin_basename( UM_PLUGIN ) ); /** - * UM hook + * Filters the plugin's textdomain. * - * @type filter - * @title um_language_locale - * @description Change UM language locale - * @input_vars - * [{"var":"$locale","type":"string","desc":"UM language locale"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_language_locale', 'function_name', 10, 1 ); - * @example - * - */ - $language_locale = apply_filters( 'um_language_locale', $language_locale ); - - - /** - * UM hook + * @param {string} $domain Plugin's textdomain. * - * @type filter - * @title um_language_textdomain - * @description Change UM textdomain - * @input_vars - * [{"var":"$domain","type":"string","desc":"UM Textdomain"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_language_textdomain', 'function_name', 10, 1 ); - * @example - * Change UM language locale. + * function my_um_language_textdomain( $domain ) { + * $domain = 'ultimate-member-custom'; * return $domain; * } - * ?> + * add_filter( 'um_language_textdomain', 'my_um_language_textdomain' ); */ - $language_domain = apply_filters( 'um_language_textdomain', 'ultimate-member' ); - - $language_file = WP_LANG_DIR . '/plugins/' . $language_domain . '-' . $language_locale . '.mo'; - - /** - * UM hook - * - * @type filter - * @title um_language_file - * @description Change UM language file path - * @input_vars - * [{"var":"$language_file","type":"string","desc":"UM language file path"}] - * @change_log - * ["Since: 2.0"] - * @usage add_filter( 'um_language_file', 'function_name', 10, 1 ); - * @example - * - */ - $language_file = apply_filters( 'um_language_file', $language_file ); + $domain = apply_filters( 'um_language_textdomain', $default_domain ); // Unload textdomain if it has already loaded. - if ( is_textdomain_loaded( $language_domain ) ) { - unload_textdomain( $language_domain, true ); + if ( is_textdomain_loaded( $domain ) ) { + unload_textdomain( $domain, true ); } - load_textdomain( $language_domain, $language_file ); + load_plugin_textdomain( $domain, false, $default_domain . '/languages' ); } - /** * 1.3.x active extensions deactivate for properly running 2.0.x AJAX upgrades */ diff --git a/includes/common/class-init.php b/includes/common/class-init.php index aa777765..1e9e74cd 100644 --- a/includes/common/class-init.php +++ b/includes/common/class-init.php @@ -24,6 +24,7 @@ if ( ! class_exists( 'um\common\Init' ) ) { $this->screen(); $this->secure()->hooks(); $this->site_health(); + $this->theme()->hooks(); } /** @@ -73,5 +74,17 @@ if ( ! class_exists( 'um\common\Init' ) ) { } return UM()->classes['um\common\site_health']; } + + /** + * @since 2.8.3 + * + * @return Theme + */ + public function theme() { + if ( empty( UM()->classes['um\common\theme'] ) ) { + UM()->classes['um\common\theme'] = new Theme(); + } + return UM()->classes['um\common\theme']; + } } } diff --git a/includes/common/class-screen.php b/includes/common/class-screen.php index 494cdae8..e9328e74 100644 --- a/includes/common/class-screen.php +++ b/includes/common/class-screen.php @@ -18,7 +18,7 @@ if ( ! class_exists( 'um\common\Screen' ) ) { * Screen constructor. */ public function __construct() { - add_filter( 'body_class', array( &$this, 'remove_admin_bar' ), 1000, 1 ); + add_filter( 'body_class', array( &$this, 'remove_admin_bar' ), 1000 ); } /** diff --git a/includes/common/class-theme.php b/includes/common/class-theme.php new file mode 100644 index 00000000..896627ef --- /dev/null +++ b/includes/common/class-theme.php @@ -0,0 +1,242 @@ + $files ) { + foreach ( $files as $file ) { + if ( false === strpos( $file, 'email/' ) ) { + /** + * Filters an array of the template files for scanning versions based on $key. + * + * Note: $key - means um or extension key. + * + * @since 2.6.1 + * @hook um_override_templates_get_template_path__{$key} + * + * @param {array} $located Template file paths for scanning versions. + * @param {string} $file Template file name. + * + * @return {array} Template file paths for scanning versions. + */ + $located = apply_filters( "um_override_templates_get_template_path__{$key}", array(), $file ); + + $exceptions = array( + 'members-grid.php', + 'members-header.php', + 'members-list.php', + 'members-pagination.php', + 'searchform.php', + 'login-to-view.php', + 'profile/comments.php', + 'profile/comments-single.php', + 'profile/posts.php', + 'profile/posts-single.php', + 'modal/um_upload_single.php', + 'modal/um_view_photo.php', + ); + + $theme_file = false; + if ( ! empty( $located ) ) { + $theme_file = $located['theme']; + } elseif ( in_array( $file, $exceptions, true ) && file_exists( get_stylesheet_directory() . '/ultimate-member/' . $file ) ) { + $theme_file = get_stylesheet_directory() . '/ultimate-member/' . $file; + } elseif ( file_exists( get_stylesheet_directory() . '/ultimate-member/templates/' . $file ) ) { + $theme_file = get_stylesheet_directory() . '/ultimate-member/templates/' . $file; + } + + if ( ! empty( $theme_file ) ) { + if ( ! empty( $located ) ) { + $core_path = $located['core']; + } else { + $core_path = UM_PATH . 'templates/' . $file; + } + + $files_in_theme[] = array( + 'core' => $core_path, + 'theme' => $theme_file, + ); + } + } + } + } + + return $files_in_theme; + } + + public function is_outdated_template_exist() { + $outdated_exists = false; + $templates = $this->get_custom_templates_list(); + foreach ( $templates as $files ) { + if ( ! array_key_exists( 'core', $files ) || ! array_key_exists( 'theme', $files ) ) { + continue; + } + + $core_path = $files['core']; + $theme_file = $files['theme']; + + $core_version = self::get_file_version( $core_path ); + $theme_version = self::get_file_version( $theme_file ); + + if ( '' === $theme_version || version_compare( $theme_version, $core_version, '<' ) ) { + $outdated_exists = true; + break; + } + } + + return $outdated_exists; + } + + public function build_templates_data() { + $templates_data = array(); + + // Get from cache if isn't empty and request isn't force. + $transient = get_transient( 'um_custom_templates_list' ); + if ( false !== $transient && array_key_exists( 'data', $transient ) ) { + return $transient['data']; + } + + $templates = $this->get_custom_templates_list(); + foreach ( $templates as $files ) { + if ( ! array_key_exists( 'core', $files ) || ! array_key_exists( 'theme', $files ) ) { + continue; + } + + $core_path = $files['core']; + $theme_file = $files['theme']; + + $core_version = self::get_file_version( $core_path ); + $theme_version = self::get_file_version( $theme_file ); + + $status = esc_html__( 'Theme version up to date', 'ultimate-member' ); + $status_code = 1; + + if ( '' === $theme_version ) { + $status = esc_html__( 'Theme version is empty', 'ultimate-member' ); + $status_code = 0; + } elseif ( version_compare( $theme_version, $core_version, '<' ) ) { + $status = esc_html__( 'Theme version is out of date', 'ultimate-member' ); + $status_code = 0; + } + + $templates_data[] = array( + 'core_version' => $core_version, + 'theme_version' => $theme_version, + 'core_file' => stristr( $core_path, 'wp-content' ), + 'theme_file' => stristr( $theme_file, 'wp-content' ), + 'status' => $status, + 'status_code' => $status_code, + ); + } + + // Cache results via transient setting. + $transient = array( + 'data' => $templates_data, + 'time' => time(), + ); + set_transient( 'um_custom_templates_list', $transient, 5 * MINUTE_IN_SECONDS ); + + return $templates_data; + } +} diff --git a/includes/core/class-access.php b/includes/core/class-access.php index 1cafc3b9..fa91fa31 100644 --- a/includes/core/class-access.php +++ b/includes/core/class-access.php @@ -1772,10 +1772,10 @@ if ( ! class_exists( 'um\core\Access' ) ) { $access = UM()->options()->get( 'accessible' ); if ( $access == 2 ) { - //global settings for accessible home page + // Global settings for accessible home page $home_page_accessible = UM()->options()->get( 'home_page_accessible' ); - if ( $home_page_accessible == 0 ) { + if ( ! $home_page_accessible ) { //get redirect URL if not set get login page by default $redirect = UM()->options()->get( 'access_redirect' ); if ( ! $redirect ) { @@ -1795,9 +1795,9 @@ if ( ! class_exists( 'um\core\Access' ) ) { $access = UM()->options()->get( 'accessible' ); if ( $access == 2 ) { - //global settings for accessible home page + // Global settings for accessible home page $category_page_accessible = UM()->options()->get( 'category_page_accessible' ); - if ( $category_page_accessible == 0 ) { + if ( ! $category_page_accessible ) { //get redirect URL if not set get login page by default $redirect = UM()->options()->get( 'access_redirect' ); if ( ! $redirect ) { diff --git a/includes/core/class-account.php b/includes/core/class-account.php index 1128a08e..65df44e9 100644 --- a/includes/core/class-account.php +++ b/includes/core/class-account.php @@ -576,7 +576,7 @@ if ( ! class_exists( 'um\core\Account' ) ) { case 'privacy': - $args = 'profile_privacy,profile_noindex,hide_in_members'; + $args = 'profile_privacy,profile_noindex,hide_in_members,um_show_last_login'; /** * UM hook * diff --git a/includes/core/class-builtin.php b/includes/core/class-builtin.php index 32158e0c..cf3b7958 100644 --- a/includes/core/class-builtin.php +++ b/includes/core/class-builtin.php @@ -273,7 +273,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), 'tel' => array( - 'name' => __( 'Telephone Box', 'ultimate-member' ), + 'name' => __( 'Telephone', 'ultimate-member' ), 'col1' => array('_title','_metakey','_help','_default','_min_chars','_visibility'), 'col2' => array('_label','_placeholder','_public','_roles','_validate','_custom_validate','_max_chars'), 'col3' => array('_required','_editable','_icon'), @@ -782,10 +782,10 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), 'username' => array( - 'title' => __('Username or E-mail','ultimate-member'), + 'title' => __('Username or Email','ultimate-member'), 'metakey' => 'username', 'type' => 'text', - 'label' => __('Username or E-mail','ultimate-member'), + 'label' => __('Username or Email','ultimate-member'), 'required' => 1, 'public' => 1, 'editable' => false, @@ -871,10 +871,10 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), 'user_email' => array( - 'title' => __('E-mail Address','ultimate-member'), + 'title' => __('Email Address','ultimate-member'), 'metakey' => 'user_email', 'type' => 'text', - 'label' => __('E-mail Address','ultimate-member'), + 'label' => __('Email Address','ultimate-member'), 'required' => 0, 'public' => 1, 'validate' => 'unique_email', @@ -882,10 +882,10 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), 'secondary_user_email' => array( - 'title' => __('Secondary E-mail Address','ultimate-member'), + 'title' => __('Secondary Email Address','ultimate-member'), 'metakey' => 'secondary_user_email', 'type' => 'text', - 'label' => __('Secondary E-mail Address','ultimate-member'), + 'label' => __('Secondary Email Address','ultimate-member'), 'required' => 0, 'public' => 1, 'editable' => true, @@ -1271,7 +1271,7 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { ), 'username_b' => array( - 'title' => __('Username or E-mail','ultimate-member'), + 'title' => __('Username or Email','ultimate-member'), 'metakey' => 'username_b', 'type' => 'text', 'placeholder' => __('Enter your username or email','ultimate-member'), @@ -1336,6 +1336,23 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { 'required_opt' => array( 'members_page', true ), ), + 'um_show_last_login' => array( + 'title' => __( 'Show my last login?', 'ultimate-member' ), + 'metakey' => 'um_show_last_login', + 'type' => 'radio', + 'label' => __( 'Show my last login?', 'ultimate-member' ), + 'help' => __( 'Here you can hide last login field on profile page and card in member directory', 'ultimate-member' ), + 'required' => 0, + 'public' => 1, + 'editable' => true, + 'default' => 'yes', + 'options' => array( + 'no' => __( 'No', 'ultimate-member' ), + 'yes' => __( 'Yes', 'ultimate-member' ), + ), + 'account_only' => true, + ), + 'delete_account' => array( 'title' => __( 'Delete Account', 'ultimate-member' ), 'metakey' => 'delete_account', @@ -1558,11 +1575,11 @@ if ( ! class_exists( 'um\core\Builtin' ) ) { $array['skype'] = __('Skype ID','ultimate-member'); $array['soundcloud'] = __( 'SoundCloud Profile', 'ultimate-member' ); $array['twitter_url'] = __( 'X (formerly Twitter) URL', 'ultimate-member' ); - $array['is_email'] = __('E-mail( Not Unique )','ultimate-member'); - $array['unique_email'] = __('Unique E-mail','ultimate-member'); + $array['is_email'] = __('Email( Not Unique )','ultimate-member'); + $array['unique_email'] = __('Unique Email','ultimate-member'); $array['unique_value'] = __('Unique Metakey value','ultimate-member'); $array['unique_username'] = __('Unique Username','ultimate-member'); - $array['unique_username_or_email'] = __('Unique Username/E-mail','ultimate-member'); + $array['unique_username_or_email'] = __('Unique Username/Email','ultimate-member'); $array['url'] = __('Website URL','ultimate-member'); $array['youtube_url'] = __('YouTube Profile','ultimate-member'); $array['youtube_video'] = __('YouTube Video','ultimate-member'); diff --git a/includes/core/class-external-integrations.php b/includes/core/class-external-integrations.php index 905ae007..8a846efe 100644 --- a/includes/core/class-external-integrations.php +++ b/includes/core/class-external-integrations.php @@ -604,7 +604,7 @@ if ( ! class_exists( 'um\core\External_Integrations' ) ) { */ function render_status_icon( $link, $text, $img ) { - $icon_html = ''; + $icon_html = ''; $icon_html .= ''
diff --git a/includes/core/class-fields.php b/includes/core/class-fields.php
index 5aeae98a..e6fcb66d 100644
--- a/includes/core/class-fields.php
+++ b/includes/core/class-fields.php
@@ -623,7 +623,10 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
 		 * @return string
 		 */
 		public function show_error( $key ) {
-			return UM()->form()->errors[ $key ];
+			if ( empty( UM()->form()->errors ) ) {
+				return '';
+			}
+			return array_key_exists( $key, UM()->form()->errors ) ? UM()->form()->errors[ $key ] : '';
 		}
 
 		/**
@@ -634,7 +637,10 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
 		 * @return string
 		 */
 		public function show_notice( $key ) {
-			return UM()->form()->notices[ $key ];
+			if ( empty( UM()->form()->notices ) ) {
+				return '';
+			}
+			return array_key_exists( $key, UM()->form()->notices ) ? UM()->form()->notices[ $key ] : '';
 		}
 
 		/**
@@ -647,13 +653,6 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
 		 * @return string
 		 */
 		public function field_label( $label, $key, $data ) {
-			$output  = null;
-			$output .= '<div class='; - - if ( ! empty( $data['icon'] ) && isset( $this->field_icons ) && 'off' !== $this->field_icons && ( 'label' === $this->field_icons || true === $this->viewing ) ) { - $output .= '
    '; - } - if ( true === $this->viewing ) { /** * Filters Ultimate Member field label on the Profile form: View mode. @@ -724,13 +723,26 @@ if ( ! class_exists( 'um\core\Fields' ) ) { $label = apply_filters( 'um_edit_label_all_fields', $label, $data ); } + $output = null; + $output .= '
    '; @@ -4272,6 +4284,14 @@ if ( ! class_exists( 'um\core\Fields' ) ) { * @throws \Exception */ public function view_field( $key, $data, $rule = false ) { + if ( '_um_last_login' === $key ) { + $profile_id = um_user( 'ID' ); + $show_last_login = get_user_meta( $profile_id, 'um_show_last_login', true ); + if ( ! empty( $show_last_login ) && 'no' === $show_last_login[0] ) { + return ''; + } + } + $output = ''; // Get whole field data. diff --git a/includes/core/class-mail.php b/includes/core/class-mail.php index a056888e..71ec896e 100644 --- a/includes/core/class-mail.php +++ b/includes/core/class-mail.php @@ -351,8 +351,8 @@ if ( ! class_exists( 'um\core\Mail' ) ) { */ $message = apply_filters( 'um_email_send_message_content', $message, $slug, $args ); - add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) ); +// add_filter( 'um_template_tags_patterns_hook', array( &$this, 'add_placeholder' ) ); +// add_filter( 'um_template_tags_replaces_hook', array( &$this, 'add_replace_placeholder' ) ); // Convert tags in email template. return um_convert_tags( $message, $args ); @@ -421,8 +421,8 @@ if ( ! class_exists( 'um\core\Mail' ) ) { $mail_from_addr = UM()->options()->get( 'mail_from_addr' ) ? UM()->options()->get( 'mail_from_addr' ) : get_bloginfo( 'admin_email' ); $this->headers = 'From: ' . stripslashes( $mail_from ) . ' <' . $mail_from_addr . '>' . "\r\n"; - add_filter( 'um_template_tags_patterns_hook', array( UM()->mail(), 'add_placeholder' ) ); - add_filter( 'um_template_tags_replaces_hook', array( UM()->mail(), 'add_replace_placeholder' ) ); + add_filter( 'um_template_tags_patterns_hook', array( $this, 'add_placeholder' ) ); + add_filter( 'um_template_tags_replaces_hook', array( $this, 'add_replace_placeholder' ) ); /** * Filters email notification subject. diff --git a/includes/core/class-member-directory-meta.php b/includes/core/class-member-directory-meta.php index 4ae8c47e..3b2f7b57 100644 --- a/includes/core/class-member-directory-meta.php +++ b/includes/core/class-member-directory-meta.php @@ -31,15 +31,32 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { /** * @var bool */ - var $roles_in_query = false; + private $roles_in_query = false; - var $general_meta_joined = false; + /** + * @var bool + */ + public $general_meta_joined = false; - var $having = ''; - var $select = ''; - var $sql_limit = ''; - var $sql_order = ''; + /** + * @var string + */ + private $having = ''; + /** + * @var string + */ + private $select = ''; + + /** + * @var string + */ + private $sql_limit = ''; + + /** + * @var string + */ + public $sql_order = ''; /** * Member_Directory_Meta constructor. @@ -55,28 +72,27 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { add_action( 'um_delete_custom_field', array( &$this, 'on_delete_custom_field' ), 10, 2 ); } - /** * Delete custom field and metakey from UM usermeta table * * @param $metakey * @param $args */ - function on_delete_custom_field( $metakey, $args ) { + public function on_delete_custom_field( $metakey, $args ) { $metakeys = get_option( 'um_usermeta_fields', array() ); - if ( in_array( $metakey, $metakeys ) ) { - unset( $metakeys[ array_search( $metakey, $metakeys ) ] ); + if ( in_array( $metakey, $metakeys, true ) ) { + unset( $metakeys[ array_search( $metakey, $metakeys, true ) ] ); global $wpdb; $wpdb->delete( "{$wpdb->prefix}um_metadata", array( - 'um_key' => $metakey + 'um_key' => $metakey, ), array( - '%s' + '%s', ) ); @@ -86,17 +102,16 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { do_action( 'um_metadata_on_delete_custom_field', $metakeys, $metakey, $args ); } - /** * Add metakey to usermeta fields * * @param $metakey * @param $args */ - function on_new_field_added( $metakey, $args ) { + public function on_new_field_added( $metakey, $args ) { $metakeys = get_option( 'um_usermeta_fields', array() ); - if ( ! in_array( $metakey, $metakeys ) ) { + if ( ! in_array( $metakey, $metakeys, true ) ) { $metakeys[] = $metakey; update_option( 'um_usermeta_fields', array_values( $metakeys ) ); } @@ -104,7 +119,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { do_action( 'um_metadata_on_new_field_added', $metakeys, $metakey, $args ); } - /** * When you delete usermeta - remove row from um_metadata * @@ -113,9 +127,9 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { * @param string $meta_key * @param mixed $_meta_value */ - function on_delete_usermeta( $meta_ids, $object_id, $meta_key, $_meta_value ) { + public function on_delete_usermeta( $meta_ids, $object_id, $meta_key, $_meta_value ) { $metakeys = get_option( 'um_usermeta_fields', array() ); - if ( ! in_array( $meta_key, $metakeys ) ) { + if ( ! in_array( $meta_key, $metakeys, true ) ) { return; } @@ -124,17 +138,16 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $wpdb->delete( "{$wpdb->prefix}um_metadata", array( - 'user_id' => $object_id, - 'um_key' => $meta_key + 'user_id' => $object_id, + 'um_key' => $meta_key, ), array( '%d', - '%s' + '%s', ) ); } - /** * When you add/update usermeta - add/update row from um_metadata * @@ -143,32 +156,33 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { * @param string $meta_key * @param mixed $_meta_value */ - function on_update_usermeta( $meta_id, $object_id, $meta_key, $_meta_value ) { - + public function on_update_usermeta( $meta_id, $object_id, $meta_key, $_meta_value ) { $metakeys = get_option( 'um_usermeta_fields', array() ); - if ( ! in_array( $meta_key, $metakeys ) ) { + if ( ! in_array( $meta_key, $metakeys, true ) ) { return; } global $wpdb; - $result = $wpdb->get_var( $wpdb->prepare( - "SELECT umeta_id - FROM {$wpdb->prefix}um_metadata - WHERE user_id = %d AND - um_key = %s - LIMIT 1", - $object_id, - $meta_key - ) ); + $result = $wpdb->get_var( + $wpdb->prepare( + "SELECT umeta_id + FROM {$wpdb->prefix}um_metadata + WHERE user_id = %d AND + um_key = %s + LIMIT 1", + $object_id, + $meta_key + ) + ); if ( empty( $result ) ) { $wpdb->insert( "{$wpdb->prefix}um_metadata", array( - 'user_id' => $object_id, - 'um_key' => $meta_key, - 'um_value' => maybe_serialize( $_meta_value ), + 'user_id' => $object_id, + 'um_key' => $meta_key, + 'um_value' => maybe_serialize( $_meta_value ), ), array( '%d', @@ -180,10 +194,10 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $wpdb->update( "{$wpdb->prefix}um_metadata", array( - 'um_value' => maybe_serialize( $_meta_value ), + 'um_value' => maybe_serialize( $_meta_value ), ), array( - 'umeta_id' => $result, + 'umeta_id' => $result, ), array( '%s', @@ -195,74 +209,121 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } } - /** * @param $directory_data * @param $field * @param $value - * @param $i + * @param int $i * @param bool $is_default */ - function handle_filter_query( $directory_data, $field, $value, $i, $is_default = false ) { + protected function handle_filter_query( $directory_data, $field, $value, $i, $is_default = false ) { global $wpdb; - $join_slug = $is_default ? 'ummd' : 'umm' ; + $join_slug = $is_default ? 'ummd' : 'umm'; + $join_alias = esc_sql( $join_slug . $i ); $blog_id = get_current_blog_id(); + /** + * Filters member directory select-type filter relation in query. + * + * @param {string} $relation Relation `OR` or `AND`. `OR` by default. + * @param {string} $field Field key. + * + * @return {string} Relation. + * + * @since 2.8.5 + * @hook um_members_directory_select_filter_relation + * + * @example Change relation to 'AND'. + * function my_um_members_directory_select_filter_relation( $relation, $field ) { + * // your code here + * $relation = 'AND'; + * return $relation; + * } + * add_filter( 'um_members_directory_select_filter_relation', 'my_um_members_directory_select_filter_relation', 10, 2 ); + */ + $relation = apply_filters( 'um_members_directory_select_filter_relation', 'OR', $field ); + switch ( $field ) { default: - $filter_type = $this->filter_types[ $field ]; /** - * UM hook + * Filters marker for skipping default filter handle in member directory queries. + * Hook handle filter queries for the custom usermeta table only. + * Note: $field is the field meta key. * - * @type filter - * @title um_query_args_{$field}__filter - * @description Change field's query for search at Members Directory - * @input_vars - * [{"var":"$field_query","type":"array","desc":"Field query"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Skip filter by rating default handler and add 3rd-party handlers in callback. + * function um_custom_query_args_filter_rating__filter_meta( $skip, $member_directory_meta, $field, $value, $filter_type, $is_default ) { + * $skip = true; + * $member_directory_meta->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata ummreviews ON ( ummreviews.user_id = u.ID AND ummreviews.um_key = '_reviews_avg' )"; + * return $skip; * } - * ?> + * add_filter( 'um_query_args_filter_rating__filter_meta', 'um_custom_query_args_filter_rating__filter_meta', 10, 6 ); */ $skip_default = apply_filters( "um_query_args_{$field}__filter_meta", false, $this, $field, $value, $filter_type, $is_default ); - + /** + * Filters marker for skipping default filter handle in member directory queries. + * Hook handle filter queries for the custom usermeta table only. + * + * @since 2.1 + * @hook um_query_args_filter_global_meta + * + * @param {bool} $skip Skip default filter handler marker. + * @param {object} $member_directory_meta Member_Directory_Meta class instance. + * @param {string} $field Filter's field key. + * @param {mixed} $value Filter value. + * @param {string} $filter_type Filter type. + * @param {bool} $is_default If it's admin filtering option then `true`. + * + * @return {bool} Skip default filter handler marker. + * + * @example Skip filter by rating default handler and add 3rd-party handlers in callback. + * function um_custom_query_args_filter_global_meta( $skip, $member_directory_meta, $field, $value, $filter_type, $is_default ) { + * if ( 'filter_rating' === $field ) { + * $skip = true; + * $member_directory_meta->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata ummreviews ON ( ummreviews.user_id = u.ID AND ummreviews.um_key = '_reviews_avg' )"; + * } + * return $skip; + * } + * add_filter( 'um_query_args_filter_global_meta', 'um_custom_query_args_filter_global_meta', 10, 6 ); + */ $skip_default = apply_filters( 'um_query_args_filter_global_meta', $skip_default, $this, $field, $value, $filter_type, $is_default ); if ( ! $skip_default ) { - switch ( $filter_type ) { default: - do_action( "um_query_args_{$field}_{$filter_type}__filter_meta", $field, $value, $filter_type, $i, $is_default ); break; case 'text': + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - - $value = trim( stripslashes( $value ) ); - + $value = trim( stripslashes( $value ) ); $compare = apply_filters( 'um_members_directory_filter_text', '=', $field ); - $value = apply_filters( 'um_members_directory_filter_text_meta_value', $value, $field ); + $compare = esc_sql( $compare ); + $value = apply_filters( 'um_members_directory_filter_text_meta_value', $value, $field ); - $this->where_clauses[] = $wpdb->prepare( "{$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value {$compare} %s", $field, $value ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias and $compare variables are pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "{$join_alias}.um_key = %s AND {$join_alias}.um_value {$compare} %s", $field, $value ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } - break; case 'select': @@ -270,51 +331,57 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $value = array( $value ); } - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; $values_array = array(); foreach ( $value as $single_val ) { $single_val = trim( stripslashes( $single_val ) ); - $values_array[] = $wpdb->prepare( "{$join_slug}{$i}.um_value LIKE %s", '%"' . $single_val . '"%' ); - $values_array[] = $wpdb->prepare( "{$join_slug}{$i}.um_value LIKE %s", '%' . serialize( (string) $single_val ) . '%' ); - $values_array[] = $wpdb->prepare( "{$join_slug}{$i}.um_value = %s", $single_val ); + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias and $compare variables are pre-escaped. + $values_array[] = $wpdb->prepare( "{$join_alias}.um_value LIKE %s", '%"' . $wpdb->esc_like( $single_val ) . '"%' ); + $values_array[] = $wpdb->prepare( "{$join_alias}.um_value LIKE %s", '%' . $wpdb->esc_like( maybe_serialize( (string) $single_val ) ) . '%' ); + $values_array[] = $wpdb->prepare( "{$join_alias}.um_value = %s", $single_val ); if ( is_numeric( $single_val ) ) { - $values_array[] = $wpdb->prepare( "{$join_slug}{$i}.um_value LIKE %s", '%' . serialize( (int) $single_val ) . '%' ); + $values_array[] = $wpdb->prepare( "{$join_alias}.um_value LIKE %s", '%' . $wpdb->esc_like( maybe_serialize( (int) $single_val ) ) . '%' ); } + // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. } - $values = implode( ' OR ', $values_array ); + $values = implode( ' ' . esc_sql( $relation ) . ' ', $values_array ); - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND ( {$values} ) )", $field ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias and $values variables are pre-escaped or $wpdb->prepare. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND ( {$values} ) )", $field ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } - break; - case 'slider': - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; + case 'slider': + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; $min = min( $value ); $max = max( $value ); - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value BETWEEN %d AND %d )", $field, $min, $max ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND {$join_alias}.um_value BETWEEN %d AND %d )", $field, $min, $max ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } - break; - case 'datepicker': + case 'datepicker': $offset = 0; if ( ! $is_default ) { + // phpcs:disable WordPress.Security.NonceVerification -- early verified in `ajax_get_members()`. if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { $offset = (int) $_POST['gmt_offset']; } + // phpcs:enable WordPress.Security.NonceVerification -- early verified in `ajax_get_members()`. } else { $gmt_offset = get_post_meta( $directory_data['form_id'], '_um_search_filters_gmt', true ); if ( is_numeric( $gmt_offset ) ) { @@ -324,103 +391,112 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59 + // @todo: rewrite date() in WP5.3 standards. $from_date = date( 'Y/m/d', $from_date ); - $to_date = date( 'Y/m/d', $to_date ); + $to_date = date( 'Y/m/d', $to_date ); - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value BETWEEN %s AND %s )", $field, $from_date, $to_date ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND {$join_alias}.um_value BETWEEN %s AND %s )", $field, $from_date, $to_date ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = array( $from_date, $to_date ); } - break; - case 'timepicker': - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - if ( $value[0] == $value[1] ) { - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND {$join_slug}{$i}.um_value = %s )", $field, $value[0] ); + case 'timepicker': + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; + if ( $value[0] === $value[1] ) { + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND {$join_alias}.um_value = %s )", $field, $value[0] ); } else { - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = %s AND CAST( {$join_slug}{$i}.um_value AS TIME ) BETWEEN %s AND %s )", $field, $value[0], $value[1] ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND CAST( {$join_alias}.um_value AS TIME ) BETWEEN %s AND %s )", $field, $value[0], $value[1] ); } if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } - break; + } - } - break; + case 'role': $value = array_map( 'strtolower', $value ); if ( empty( $this->roles ) && ! is_multisite() ) { - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' )"; - $this->roles = $value; + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = %s )", $wpdb->get_blog_prefix( $blog_id ) . 'capabilities' ); + $this->roles = $value; $this->roles_in_query = true; } $roles_clauses = array(); foreach ( $value as $role ) { - $roles_clauses[] = $wpdb->prepare( "umm_roles.um_value LIKE %s", '%"' . $role . '"%' ); + $roles_clauses[] = $wpdb->prepare( 'umm_roles.um_value LIKE %s', '%"' . $wpdb->esc_like( $role ) . '"%' ); } - $this->where_clauses[] = '( ' . implode( ' OR ', $roles_clauses ) . ' )'; + // $roles_clauses is pre-prepared. + $this->where_clauses[] = '( ' . implode( ' ' . esc_sql( $relation ) . ' ', $roles_clauses ) . ' )'; if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } - break; + case 'birth_date': - + // @todo: rewrite date() in WP5.3 standards. $from_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ), date( 'Y', time() - min( $value ) * YEAR_IN_SECONDS ) ) ); - $to_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ) + 1, date( 'Y', time() - ( max( $value ) + 1 ) * YEAR_IN_SECONDS ) ) ); + $to_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ) + 1, date( 'Y', time() - ( max( $value ) + 1 ) * YEAR_IN_SECONDS ) ) ); - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = 'birth_date' AND {$join_slug}{$i}.um_value BETWEEN %s AND %s )", $to_date, $from_date ); + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = 'birth_date' AND {$join_alias}.um_value BETWEEN %s AND %s )", $to_date, $from_date ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = array( $to_date, $from_date ); } - break; - case 'user_registered': + case 'user_registered': $offset = 0; if ( ! $is_default ) { + // phpcs:disable WordPress.Security.NonceVerification -- early verified in `ajax_get_members()`. if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { $offset = (int) $_POST['gmt_offset']; } + // phpcs:enable WordPress.Security.NonceVerification -- early verified in `ajax_get_members()`. } else { $gmt_offset = get_post_meta( $directory_data['form_id'], '_um_search_filters_gmt', true ); if ( is_numeric( $gmt_offset ) ) { $offset = (int) $gmt_offset; } } - + // @todo: rewrite date() in WP5.3 standards. $from_date = date( 'Y-m-d H:i:s', strtotime( min( $value ) ) + $offset * HOUR_IN_SECONDS ); // client time zone offset - $to_date = date( 'Y-m-d H:i:s', strtotime( max( $value ) ) + $offset * HOUR_IN_SECONDS + DAY_IN_SECONDS - 1 ); // time 23:59 + $to_date = date( 'Y-m-d H:i:s', strtotime( max( $value ) ) + $offset * HOUR_IN_SECONDS + DAY_IN_SECONDS - 1 ); // time 23:59 - $this->where_clauses[] = $wpdb->prepare( "u.user_registered BETWEEN %s AND %s", $from_date, $to_date ); + $this->where_clauses[] = $wpdb->prepare( 'u.user_registered BETWEEN %s AND %s', $from_date, $to_date ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } - break; + case 'last_login': $offset = 0; if ( ! $is_default ) { + // phpcs:disable WordPress.Security.NonceVerification -- early verified in `ajax_get_members()`. if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { $offset = (int) $_POST['gmt_offset']; } + // phpcs:enable WordPress.Security.NonceVerification -- early verified in `ajax_get_members()`. } else { $gmt_offset = get_post_meta( $directory_data['form_id'], '_um_search_filters_gmt', true ); if ( is_numeric( $gmt_offset ) ) { @@ -428,45 +504,81 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } } + $value = array_map( + function( $date ) { + return is_numeric( $date ) ? $date : strtotime( $date ); + }, + $value + ); + $from_date = gmdate( 'Y-m-d H:i:s', (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ) ); // client time zone offset $to_date = gmdate( 'Y-m-d H:i:s', (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1 ); // time 23:59 - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_slug}{$i} ON {$join_slug}{$i}.user_id = u.ID"; - - $this->where_clauses[] = $wpdb->prepare( "( {$join_slug}{$i}.um_key = '_um_last_login' AND {$join_slug}{$i}.um_value BETWEEN %s AND %s )", $from_date, $to_date ); + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; + $join_alias_ll = $join_alias . '_show_las_login'; + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias_ll} ON {$join_alias_ll}.user_id = u.ID AND {$join_alias_ll}.um_key = 'um_show_last_login'"; + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = '_um_last_login' AND {$join_alias}.um_value BETWEEN %s AND %s AND ( {$join_alias_ll}.um_value IS NULL OR {$join_alias_ll}.um_value != %s ) )", $from_date, $to_date, 'a:1:{i:0;s:2:"no";}' ); if ( ! $is_default ) { $this->custom_filters_in_query[ $field ] = $value; } + break; + case 'gender': + if ( ! is_array( $value ) ) { + $value = array( $value ); + } + + // $join_alias is pre-escaped. + $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata {$join_alias} ON {$join_alias}.user_id = u.ID"; + + $values_array = array(); + foreach ( $value as $single_val ) { + $single_val = trim( stripslashes( $single_val ) ); + + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias and $compare variables are pre-escaped. + $values_array[] = $wpdb->prepare( "{$join_alias}.um_value LIKE %s", '%"' . $wpdb->esc_like( $single_val ) . '"%' ); + $values_array[] = $wpdb->prepare( "{$join_alias}.um_value = %s", $single_val ); + // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias is pre-escaped. + } + + $values = implode( ' ' . esc_sql( $relation ) . ' ', $values_array ); + + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $join_alias and $values variables are pre-escaped or $wpdb->prepare. + $this->where_clauses[] = $wpdb->prepare( "( {$join_alias}.um_key = %s AND ( {$values} ) )", $field ); + + if ( ! $is_default ) { + $this->custom_filters_in_query[ $field ] = $value; + } break; } } - /** * Main Query function for getting members via AJAX */ - function ajax_get_members() { + public function ajax_get_members() { UM()->check_ajax_nonce(); global $wpdb; $blog_id = get_current_blog_id(); - + // phpcs:disable WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. if ( empty( $_POST['directory_id'] ) ) { wp_send_json_error( __( 'Wrong member directory data', 'ultimate-member' ) ); } $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); - if ( empty( $directory_id ) ) { wp_send_json_error( __( 'Wrong member directory data', 'ultimate-member' ) ); } + // phpcs:enable WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. $directory_data = UM()->query()->post_data( $directory_id ); - //predefined result for user without capabilities to see other members + // Predefined result for user without capabilities to see other members. $this->predefined_no_caps( $directory_data ); do_action( 'um_member_directory_before_query' ); @@ -474,7 +586,6 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { // Prepare for BIG SELECT query $wpdb->query( 'SET SQL_BIG_SELECTS=1' ); - if ( ! empty( $directory_data['show_these_users'] ) ) { $show_these_users = maybe_unserialize( $directory_data['show_these_users'] ); @@ -482,7 +593,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $users_array = array(); foreach ( $show_these_users as $username ) { if ( false !== ( $exists_id = username_exists( $username ) ) ) { - $users_array[] = $exists_id; + $users_array[] = absint( $exists_id ); } } @@ -499,7 +610,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $users_array = array(); foreach ( $exclude_these_users as $username ) { if ( false !== ( $exists_id = username_exists( $username ) ) ) { - $users_array[] = $exists_id; + $users_array[] = absint( $exists_id ); } } @@ -522,21 +633,24 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { if ( ! UM()->roles()->um_user_can( 'can_edit_everyone' ) ) { if ( ! $this->general_meta_joined ) { $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_general ON umm_general.user_id = u.ID"; + $this->general_meta_joined = true; } + // $profile_photo_where and $cover_photo_where are static in code. $this->where_clauses[] = "( umm_general.um_key = 'um_member_directory_data' AND umm_general.um_value LIKE '%s:14:\"account_status\";s:8:\"approved\";%' AND umm_general.um_value LIKE '%s:15:\"hide_in_members\";b:0;%'{$profile_photo_where}{$cover_photo_where} )"; } else { if ( ! empty( $cover_photo_where ) || ! empty( $profile_photo_where ) ) { if ( ! $this->general_meta_joined ) { $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_general ON umm_general.user_id = u.ID"; + $this->general_meta_joined = true; } + // $profile_photo_where and $cover_photo_where are static in code. $this->where_clauses[] = "( umm_general.um_key = 'um_member_directory_data'{$profile_photo_where}{$cover_photo_where} )"; } } - //$this->roles = array(); if ( UM()->roles()->um_user_can( 'can_view_all' ) ) { $view_roles = um_user( 'can_view_roles' ); @@ -560,46 +674,51 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } if ( ! empty( $this->roles ) ) { - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' )"; + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = %s )", $wpdb->get_blog_prefix( $blog_id ) . 'capabilities' ); $roles_clauses = array(); foreach ( $this->roles as $role ) { - $roles_clauses[] = $wpdb->prepare( 'umm_roles.um_value LIKE %s', '%"' . $role . '"%' ); + $roles_clauses[] = $wpdb->prepare( 'umm_roles.um_value LIKE %s', '%"' . $wpdb->esc_like( $role ) . '"%' ); } + // $roles_clauses is pre-prepared. $this->where_clauses[] = '( ' . implode( ' OR ', $roles_clauses ) . ' )'; } else { - if ( ! $this->roles_in_query && is_multisite() ) { // select users who have capabilities for current blog - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = '" . $wpdb->get_blog_prefix( $blog_id ) . "capabilities' )"; - $this->where_clauses[] = "umm_roles.um_value IS NOT NULL"; + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_roles ON ( umm_roles.user_id = u.ID AND umm_roles.um_key = %s )", $wpdb->get_blog_prefix( $blog_id ) . 'capabilities' ); + $this->where_clauses[] = 'umm_roles.um_value IS NOT NULL'; } elseif ( $this->roles_in_query ) { - $member_directory_response = apply_filters( 'um_ajax_get_members_response', array( - 'pagination' => $this->calculate_pagination( $directory_data, 0 ), - 'users' => array(), - 'is_search' => $this->is_search, - ), $directory_data ); + $member_directory_response = array( + 'pagination' => $this->calculate_pagination( $directory_data, 0 ), + 'users' => array(), + 'is_search' => $this->is_search, + ); + $member_directory_response = apply_filters( 'um_ajax_get_members_response', $member_directory_response, $directory_data ); wp_send_json_success( $member_directory_response ); } } + // phpcs:disable WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. if ( ! empty( $_POST['search'] ) ) { $search_line = $this->prepare_search( $_POST['search'] ); + // phpcs:enable WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. if ( ! empty( $search_line ) ) { $searches = array(); foreach ( $this->core_search_fields as $field ) { - $searches[] = $wpdb->prepare( "u.{$field} LIKE %s", '%' . $search_line . '%' ); + $field = esc_sql( $field ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $field is pre-escaped. + $searches[] = $wpdb->prepare( "u.{$field} LIKE %s", '%' . $wpdb->esc_like( $search_line ) . '%' ); } $core_search = implode( ' OR ', $searches ); $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_search ON umm_search.user_id = u.ID"; - $additional_search = apply_filters( 'um_member_directory_meta_general_search_meta_query', '',$search_line ); + $additional_search = apply_filters( 'um_member_directory_meta_general_search_meta_query', '', $search_line ); - $search_like_string = apply_filters( 'um_member_directory_meta_search_like_type', '%' . $search_line . '%', $search_line ); + $search_like_string = apply_filters( 'um_member_directory_meta_search_like_type', '%' . $wpdb->esc_like( $search_line ) . '%', $search_line ); $directory_id = $this->get_directory_by_hash( sanitize_key( $_POST['directory_id'] ) ); $exclude_fields = get_post_meta( $directory_id, '_um_search_exclude_fields', true ); @@ -620,17 +739,19 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $custom_fields_sql = rtrim( $custom_fields_sql, ',' ); $custom_fields_sql .= ') '; } - $this->where_clauses[] = $wpdb->prepare( "( umm_search.um_value = %s OR umm_search.um_value LIKE %s OR umm_search.um_value LIKE %s OR {$core_search}{$additional_search}) {$custom_fields_sql}", $search_line, $search_like_string, '%' . serialize( (string) $search_line ) . '%' ); + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $core_search and $additional_search are pre-prepared. + $this->where_clauses[] = $wpdb->prepare( "( umm_search.um_value = %s OR umm_search.um_value LIKE %s OR umm_search.um_value LIKE %s OR {$core_search}{$additional_search}) {$custom_fields_sql}", $search_line, $search_like_string, '%' . $wpdb->esc_like( maybe_serialize( (string) $search_line ) ) . '%' ); $this->is_search = true; } } - //filters + // Filters $filter_query = array(); if ( ! empty( $directory_data['search_fields'] ) ) { $search_filters = maybe_unserialize( $directory_data['search_fields'] ); if ( ! empty( $search_filters ) && is_array( $search_filters ) ) { + // phpcs:ignore WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. $filter_query = array_intersect_key( $_POST, array_flip( $search_filters ) ); } } @@ -682,15 +803,16 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { //} $order = 'ASC'; + // phpcs:ignore WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. $sortby = ! empty( $_POST['sorting'] ) ? sanitize_text_field( $_POST['sorting'] ) : $directory_data['sortby']; - $sortby = ( $sortby == 'other' ) ? $directory_data['sortby_custom'] : $sortby; + $sortby = ( 'other' === $sortby ) ? $directory_data['sortby_custom'] : $sortby; $custom_sort = array(); if ( ! empty( $directory_data['sorting_fields'] ) ) { $sorting_fields = maybe_unserialize( $directory_data['sorting_fields'] ); foreach ( $sorting_fields as $field ) { if ( is_array( $field ) ) { - $field_keys = array_keys( $field ); + $field_keys = array_keys( $field ); $custom_sort[] = $field_keys[0]; } } @@ -717,10 +839,10 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { // handle sorting options // sort members by - if ( $sortby == $directory_data['sortby_custom'] || in_array( $sortby, $custom_sort ) ) { + if ( $sortby === $directory_data['sortby_custom'] || in_array( $sortby, $custom_sort, true ) ) { $custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'ASC'; - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '{$sortby}' )"; + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = %s )", $sortby ); $meta_query = new \WP_Meta_Query(); $custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $meta_query->get_cast_for_type( $directory_data['sortby_custom_type'] ) : 'CHAR'; @@ -739,47 +861,60 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { /** This filter is documented in includes/core/class-member-directory.php */ $custom_sort_type = apply_filters( 'um_member_directory_custom_sorting_type', $custom_sort_type, $sortby, $directory_data ); + $custom_sort_type = esc_sql( $custom_sort_type ); + $custom_sort_type = in_array( strtoupper( $custom_sort_type ), $this->sort_data_types, true ) ? $custom_sort_type : 'CHAR'; - $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS {$custom_sort_type} ) {$custom_sort_order} "; + $custom_sort_order = esc_sql( $custom_sort_order ); + $custom_sort_order = in_array( strtoupper( $custom_sort_order ), array( 'ASC', 'DESC' ), true ) ? $custom_sort_order : 'ASC'; + $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS {$custom_sort_type} ) {$custom_sort_order} "; - } elseif ( count( $numeric_sorting_keys ) && in_array( $sortby, $numeric_sorting_keys ) ) { + } elseif ( count( $numeric_sorting_keys ) && in_array( $sortby, $numeric_sorting_keys, true ) ) { - if ( strstr( $sortby, '_desc' ) ) { + if ( false !== strpos( $sortby, '_desc' ) ) { $sortby = str_replace( '_desc', '', $sortby ); - $order = 'DESC'; + $order = 'DESC'; } - if ( strstr( $sortby, '_asc' ) ) { + if ( false !== strpos( $sortby, '_asc' ) ) { $sortby = str_replace( '_asc', '', $sortby ); - $order = 'ASC'; + $order = 'ASC'; } - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '{$sortby}' )"; + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = %s )", $sortby ); $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS SIGNED ) {$order}, u.user_registered DESC "; - } elseif ( 'username' == $sortby ) { + } elseif ( 'username' === $sortby ) { + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; $this->sql_order = " ORDER BY u.user_login {$order} "; - } elseif ( 'display_name' == $sortby ) { + } elseif ( 'display_name' === $sortby ) { $display_name = UM()->options()->get( 'display_name' ); - if ( $display_name == 'username' ) { + if ( 'username' === $display_name ) { + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; $this->sql_order = " ORDER BY u.user_login {$order} "; } else { $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = 'full_name' )"; + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) {$order}, u.display_name {$order} "; } + } elseif ( in_array( $sortby, array( 'last_name', 'first_name', 'nickname' ), true ) ) { - } elseif ( in_array( $sortby, array( 'last_name', 'first_name', 'nickname' ) ) ) { - - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '{$sortby}' )"; + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = %s )", $sortby ); + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) {$order} "; } elseif ( 'last_login' === $sortby ) { @@ -787,20 +922,22 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '_um_last_login' )"; $this->sql_order = ' ORDER BY CAST( umm_sort.um_value AS DATETIME ) DESC '; - } elseif ( $sortby == 'last_first_name' ) { + } elseif ( 'last_first_name' === $sortby ) { $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = 'last_name' )"; $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort2 ON ( umm_sort2.user_id = u.ID AND umm_sort2.um_key = 'first_name' )"; - $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) ASC, CAST( umm_sort2.um_value AS CHAR ) ASC "; + $this->sql_order = ' ORDER BY CAST( umm_sort.um_value AS CHAR ) ASC, CAST( umm_sort2.um_value AS CHAR ) ASC '; - } elseif ( $sortby == 'random' ) { + } elseif ( 'random' === $sortby ) { if ( um_is_session_started() === false ) { + // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged @session_start(); } // Reset seed on load of initial + // phpcs:ignore WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. if ( empty( $_REQUEST['directory_id'] ) && isset( $_SESSION['um_member_directory_seed'] ) ) { unset( $_SESSION['um_member_directory_seed'] ); } @@ -808,35 +945,42 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { // Get seed from session variable if it exists $seed = false; if ( isset( $_SESSION['um_member_directory_seed'] ) ) { - $seed = $_SESSION['um_member_directory_seed']; + $seed = (int) $_SESSION['um_member_directory_seed']; } // Set new seed if none exists if ( ! $seed ) { - $seed = rand(); + $seed = wp_rand(); + $_SESSION['um_member_directory_seed'] = $seed; } + $seed = esc_sql( $seed ); $this->sql_order = 'ORDER BY RAND(' . $seed . ')'; } else { - if ( strstr( $sortby, '_desc' ) ) { + if ( false !== strpos( $sortby, '_desc' ) ) { $sortby = str_replace( '_desc', '', $sortby ); - $order = 'DESC'; + $order = 'DESC'; } - if ( strstr( $sortby, '_asc' ) ) { + if ( false !== strpos( $sortby, '_asc' ) ) { $sortby = str_replace( '_asc', '', $sortby ); - $order = 'ASC'; + $order = 'ASC'; } $metakeys = get_option( 'um_usermeta_fields', array() ); - if ( false !== array_search( $sortby, $metakeys ) ) { - $this->joins[] = "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = '{$sortby}' )"; - $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) {$order} "; - } else { + if ( in_array( $sortby, $this->core_users_fields, true ) ) { + $sortby = esc_sql( $sortby ); + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; $this->sql_order = " ORDER BY u.{$sortby} {$order} "; + } elseif ( in_array( $sortby, $metakeys, true ) ) { + $this->joins[] = $wpdb->prepare( "LEFT JOIN {$wpdb->prefix}um_metadata umm_sort ON ( umm_sort.user_id = u.ID AND umm_sort.um_key = %s )", $sortby ); + $order = esc_sql( $order ); + $order = in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ? $order : 'ASC'; + $this->sql_order = " ORDER BY CAST( umm_sort.um_value AS CHAR ) {$order} "; } } @@ -848,11 +992,11 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { } $query_number = ( ! empty( $directory_data['max_users'] ) && $directory_data['max_users'] <= $profiles_per_page ) ? $directory_data['max_users'] : $profiles_per_page; - $query_paged = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; + $query_paged = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; // phpcs:ignore WordPress.Security.NonceVerification -- verified via `UM()->check_ajax_nonce();`. $number = $query_number; - if ( ! empty( $directory_data['max_users'] ) && $query_paged*$query_number > $directory_data['max_users'] ) { - $number = ( $query_paged*$query_number - ( $query_paged*$query_number - $directory_data['max_users'] ) ) % $query_number; + if ( ! empty( $directory_data['max_users'] ) && $query_paged * $query_number > $directory_data['max_users'] ) { + $number = ( $query_paged * $query_number - ( $query_paged * $query_number - $directory_data['max_users'] ) ) % $query_number; } // limit @@ -862,11 +1006,11 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { do_action( 'um_pre_users_query', $this, $directory_data, $sortby ); - $sql_join = implode( ' ', $this->joins ); - $sql_where = implode( ' AND ', $this->where_clauses ); - $sql_where = ! empty( $sql_where ) ? 'AND ' . $sql_where : ''; - - global $wpdb; + $sql_select = esc_sql( $this->select ); + $sql_having = esc_sql( $this->having ); + $sql_join = implode( ' ', $this->joins ); + $sql_where = implode( ' AND ', $this->where_clauses ); + $sql_where = ! empty( $sql_where ) ? 'AND ' . $sql_where : ''; /* * @@ -876,11 +1020,11 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { * */ $user_ids = $wpdb->get_col( "SELECT SQL_CALC_FOUND_ROWS DISTINCT u.ID - {$this->select} + {$sql_select} FROM {$wpdb->users} AS u {$sql_join} WHERE 1=1 {$sql_where} - {$this->having} + {$sql_having} {$this->sql_order} {$this->sql_limit}" ); @@ -920,7 +1064,7 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { $this->cover_size = UM()->mobile()->isTablet() ? $sizes[1] : end( $sizes ); - $avatar_size = UM()->options()->get( 'profile_photosize' ); + $avatar_size = UM()->options()->get( 'profile_photosize' ); $this->avatar_size = str_replace( 'px', '', $avatar_size ); $users = array(); @@ -931,11 +1075,12 @@ if ( ! class_exists( 'um\core\Member_Directory_Meta' ) ) { um_reset_user(); // end of user card - $member_directory_response = apply_filters( 'um_ajax_get_members_response', array( - 'pagination' => $pagination_data, - 'users' => $users, - 'is_search' => $this->is_search, - ), $directory_data ); + $member_directory_response = array( + 'pagination' => $pagination_data, + 'users' => $users, + 'is_search' => $this->is_search, + ); + $member_directory_response = apply_filters( 'um_ajax_get_members_response', $member_directory_response, $directory_data ); wp_send_json_success( $member_directory_response ); } diff --git a/includes/core/class-member-directory.php b/includes/core/class-member-directory.php index ed0f1a0b..6f82e7a0 100644 --- a/includes/core/class-member-directory.php +++ b/includes/core/class-member-directory.php @@ -58,7 +58,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { var $filter_types = array(); - + /** + * Fields used for searching from wp_users table. + * + * @var string[] + */ var $core_search_fields = array( 'user_login', 'user_url', @@ -67,6 +71,19 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 'user_nicename', ); + /** + * Fields used for sorting from wp_users table. + * + * @var string[] + */ + var $core_users_fields = array( + 'user_login', + 'user_url', + 'display_name', + 'user_email', + 'user_nicename', + 'user_registered', + ); /** * @var @@ -408,7 +425,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 'first_name' => __( 'First Name', 'ultimate-member' ), 'last_name' => __( 'Last Name', 'ultimate-member' ), 'nickname' => __( 'Nickname', 'ultimate-member' ), - 'secondary_user_email' => __( 'Secondary E-mail Address', 'ultimate-member' ), + 'secondary_user_email' => __( 'Secondary Email Address', 'ultimate-member' ), 'description' => __( 'Biography', 'ultimate-member' ), 'phone_number' => __( 'Phone Number', 'ultimate-member' ), 'mobile_number' => __( 'Mobile Number', 'ultimate-member' ), @@ -1314,24 +1331,24 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['paged'] = ! empty( $_POST['page'] ) ? absint( $_POST['page'] ) : 1; } - /** * Add sorting attributes for \WP_Users_Query * * @param array $directory_data Member Directory options */ - function sorting_query( $directory_data ) { + public function sorting_query( $directory_data ) { // sort members by $this->query_args['order'] = 'ASC'; + $sortby = ! empty( $_POST['sorting'] ) ? sanitize_text_field( $_POST['sorting'] ) : $directory_data['sortby']; - $sortby = ( $sortby == 'other' ) ? $directory_data['sortby_custom'] : $sortby; + $sortby = ( 'other' === $sortby ) ? $directory_data['sortby_custom'] : $sortby; $custom_sort = array(); if ( ! empty( $directory_data['sorting_fields'] ) ) { $sorting_fields = maybe_unserialize( $directory_data['sorting_fields'] ); foreach ( $sorting_fields as $field ) { if ( is_array( $field ) ) { - $field_keys = array_keys( $field ); + $field_keys = array_keys( $field ); $custom_sort[] = $field_keys[0]; } } @@ -1384,7 +1401,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['order'] = 'ASC'; } - } elseif ( in_array( $sortby, array( 'last_name', 'first_name', 'nickname' ) ) ) { + } elseif ( in_array( $sortby, array( 'last_name', 'first_name', 'nickname' ), true ) ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $sortby . '_c' => array( 'key' => $sortby, @@ -1426,7 +1443,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->query_args['orderby'] = array( 'last_name_c' => 'ASC', 'first_name_c' => 'ASC' ); unset( $this->query_args['order'] ); - } elseif ( count( $numeric_sorting_keys ) && in_array( $sortby, $numeric_sorting_keys ) ) { + } elseif ( count( $numeric_sorting_keys ) && in_array( $sortby, $numeric_sorting_keys, true ) ) { $order = 'DESC'; if ( strstr( $sortby, '_desc' ) ) { @@ -1458,18 +1475,23 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { ) ); - $this->query_args['orderby'] = array( $sortby . '_ns' => $order, 'user_registered' => 'DESC' ); + $this->query_args['orderby'] = array( + $sortby . '_ns' => $order, + 'user_registered' => 'DESC', + ); unset( $this->query_args['order'] ); - } elseif ( ( ! empty( $directory_data['sortby_custom'] ) && $sortby == $directory_data['sortby_custom'] ) || in_array( $sortby, $custom_sort ) ) { + } elseif ( ( ! empty( $directory_data['sortby_custom'] ) && $sortby === $directory_data['sortby_custom'] ) || in_array( $sortby, $custom_sort, true ) ) { $custom_sort_order = ! empty( $directory_data['sortby_custom_order'] ) ? $directory_data['sortby_custom_order'] : 'ASC'; $meta_query = new \WP_Meta_Query(); $custom_sort_type = ! empty( $directory_data['sortby_custom_type'] ) ? $meta_query->get_cast_for_type( $directory_data['sortby_custom_type'] ) : 'CHAR'; + if ( ! empty( $directory_data['sorting_fields'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification -- already verified here $sorting = sanitize_text_field( $_POST['sorting'] ); - $sorting_fields = maybe_serialize( $directory_data['sorting_fields'] ); + $sorting_fields = maybe_unserialize( $directory_data['sorting_fields'] ); + if ( ! empty( $sorting_fields ) && is_array( $sorting_fields ) ) { foreach ( $sorting_fields as $field ) { if ( isset( $field[ $sorting ] ) ) { @@ -1777,6 +1799,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { * Handle filters request */ function filters( $directory_data ) { + global $wpdb; //filters $filter_query = array(); if ( ! empty( $directory_data['search_fields'] ) ) { @@ -1809,9 +1832,11 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { continue; } + /** This filter is documented in includes/core/class-member-directory-meta.php */ + $relation = apply_filters( 'um_members_directory_select_filter_relation', 'OR', $field ); + switch ( $field ) { default: - $filter_type = $this->filter_types[ $field ]; /** @@ -1865,35 +1890,35 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { case 'select': if ( is_array( $value ) ) { - $field_query = array( 'relation' => 'OR' ); + $field_query = array( 'relation' => esc_sql( $relation ) ); foreach ( $value as $single_val ) { $single_val = trim( stripslashes( $single_val ) ); $arr_meta_query = array( array( - 'key' => $field, - 'value' => $single_val, - 'compare' => '=', + 'key' => $field, + 'value' => $single_val, + 'compare' => '=', ), array( - 'key' => $field, - 'value' => serialize( (string) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( (string) $single_val ), + 'compare' => 'LIKE', ), array( - 'key' => $field, - 'value' => '"' . $single_val . '"', - 'compare' => 'LIKE', - ) + 'key' => $field, + 'value' => '"' . $single_val . '"', + 'compare' => 'LIKE', + ), ); if ( is_numeric( $single_val ) ) { $arr_meta_query[] = array( - 'key' => $field, - 'value' => serialize( (int) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( absint( $single_val ) ), + 'compare' => 'LIKE', ); } @@ -1967,26 +1992,39 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( ! empty( $field_query ) && $field_query !== true ) { $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) ); } - break; case 'role': $value = array_map( 'strtolower', $value ); - if ( ! empty( $this->query_args['role__in'] ) ) { - $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] ); - $default_role = array_intersect( $this->query_args['role__in'], $value ); - $um_role = array_diff( $value, $default_role ); - - foreach ( $um_role as $key => &$val ) { - $val = 'um_' . str_replace( ' ', '-', $val ); + if ( 'OR' !== $relation ) { + $role__in_clauses = array( 'relation' => $relation ); + foreach ( $value as $role ) { + $role__in_clauses[] = array( + 'key' => $wpdb->get_blog_prefix() . 'capabilities', + 'value' => '"' . $role . '"', + 'compare' => 'LIKE', + ); } - $this->query_args['role__in'] = array_merge( $default_role, $um_role ); + + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $role__in_clauses ) ); + + $this->custom_filters_in_query[ $field ] = $value; } else { - $this->query_args['role__in'] = $value; - }; + if ( ! empty( $this->query_args['role__in'] ) ) { + $this->query_args['role__in'] = is_array( $this->query_args['role__in'] ) ? $this->query_args['role__in'] : array( $this->query_args['role__in'] ); + $default_role = array_intersect( $this->query_args['role__in'], $value ); + $um_role = array_diff( $value, $default_role ); - $this->custom_filters_in_query[ $field ] = $this->query_args['role__in']; + foreach ( $um_role as $key => &$val ) { + $val = 'um_' . str_replace( ' ', '-', $val ); + } + $this->query_args['role__in'] = array_merge( $default_role, $um_role ); + } else { + $this->query_args['role__in'] = $value; + } + $this->custom_filters_in_query[ $field ] = $this->query_args['role__in']; + } break; case 'birth_date': $from_date = date( 'Y/m/d', mktime( 0,0,0, date( 'm', time() ), date( 'd', time() ), date( 'Y', time() - min( $value ) * YEAR_IN_SECONDS ) ) ); @@ -2008,7 +2046,6 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { break; case 'user_registered': - $offset = 0; if ( isset( $_POST['gmt_offset'] ) && is_numeric( $_POST['gmt_offset'] ) ) { $offset = (int) $_POST['gmt_offset']; @@ -2044,6 +2081,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59 $meta_query = array( + 'relation' => 'AND', array( 'key' => '_um_last_login', 'value' => array( gmdate( 'Y-m-d H:i:s', $from_date ), gmdate( 'Y-m-d H:i:s', $to_date ) ), @@ -2051,12 +2089,54 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 'inclusive' => true, 'type' => 'DATETIME', ), + array( + 'relation' => 'OR', + array( + 'key' => 'um_show_last_login', + 'compare' => 'NOT EXISTS', + ), + array( + 'key' => 'um_show_last_login', + 'value' => 'a:1:{i:0;s:2:"no";}', + 'compare' => '!=', + ), + ), ); $this->custom_filters_in_query[ $field ] = $value; $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); break; + case 'gender': + if ( is_array( $value ) ) { + $field_query = array( 'relation' => $relation ); + + foreach ( $value as $single_val ) { + $single_val = trim( stripslashes( $single_val ) ); + + $arr_meta_query = array( + array( + 'key' => $field, + 'value' => $single_val, + 'compare' => '=', + ), + array( + 'key' => $field, + 'value' => '"' . $single_val . '"', + 'compare' => 'LIKE', + ), + ); + + $field_query = array_merge( $field_query, $arr_meta_query ); + } + } + + if ( ! empty( $field_query ) ) { + $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $field_query ) ); + + $this->custom_filters_in_query[ $field ] = $value; + } + break; } } } @@ -2133,35 +2213,36 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $value = array( $value ); } - $field_query = array( 'relation' => 'OR' ); + /** This filter is documented in includes/core/class-member-directory.php */ + $field_query = apply_filters( 'um_members_directory_filter_select', array( 'relation' => 'OR' ), $field ); foreach ( $value as $single_val ) { $single_val = trim( $single_val ); $arr_meta_query = array( array( - 'key' => $field, - 'value' => $single_val, - 'compare' => '=', + 'key' => $field, + 'value' => $single_val, + 'compare' => '=', ), array( - 'key' => $field, - 'value' => serialize( (string) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( (string) $single_val ), + 'compare' => 'LIKE', ), array( - 'key' => $field, - 'value' => '"' . $single_val . '"', - 'compare' => 'LIKE', - ) + 'key' => $field, + 'value' => '"' . $single_val . '"', + 'compare' => 'LIKE', + ), ); if ( is_numeric( $single_val ) ) { $arr_meta_query[] = array( - 'key' => $field, - 'value' => serialize( (int) $single_val ), - 'compare' => 'LIKE', + 'key' => $field, + 'value' => serialize( absint( $single_val ) ), + 'compare' => 'LIKE', ); } @@ -2290,9 +2371,18 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $offset = $gmt_offset; } - $from_date = (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ); // client time zone offset - $to_date = (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1; // time 23:59 + $value = array_map( + function( $date ) { + return is_numeric( $date ) ? $date : strtotime( $date ); + }, + $value + ); + + $from_date = gmdate( 'Y-m-d H:i:s', (int) min( $value ) + ( $offset * HOUR_IN_SECONDS ) ); // client time zone offset + $to_date = gmdate( 'Y-m-d H:i:s', (int) max( $value ) + ( $offset * HOUR_IN_SECONDS ) + DAY_IN_SECONDS - 1 ); // time 23:59 + $meta_query = array( + 'relation' => 'AND', array( 'key' => '_um_last_login', 'value' => array( $from_date, $to_date ), @@ -2300,6 +2390,18 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { 'inclusive' => true, 'type' => 'DATETIME', ), + array( + 'relation' => 'OR', + array( + 'key' => 'um_show_last_login', + 'compare' => 'NOT EXISTS', + ), + array( + 'key' => 'um_show_last_login', + 'value' => 'a:1:{i:0;s:2:"no";}', + 'compare' => '!=', + ), + ), ); $this->query_args['meta_query'] = array_merge( $this->query_args['meta_query'], array( $meta_query ) ); @@ -2385,8 +2487,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( UM()->roles()->um_current_user_can( 'edit', $user_id ) ) { $actions['um-editprofile'] = array( - 'title' => __( 'Edit Profile', 'ultimate-member' ), - 'url' => um_edit_profile_url(), + 'title' => esc_html__( 'Edit Profile', 'ultimate-member' ), + 'url' => um_edit_profile_url(), ); } @@ -2417,8 +2519,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $url = add_query_arg( array( 'um_action' => $id, 'uid' => $user_id ), um_get_core_page( 'user' ) ); $actions[ $id ] = array( - 'title' => $arr['label'], - 'url' => $url, + 'title' => esc_html( $arr['label'] ), + 'url' => esc_url( $url ), ); } } @@ -2429,25 +2531,24 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { if ( empty( UM()->user()->cannot_edit ) ) { $actions['um-editprofile'] = array( - 'title' => __( 'Edit Profile', 'ultimate-member' ), + 'title' => esc_html__( 'Edit Profile', 'ultimate-member' ), 'url' => um_edit_profile_url(), ); } $actions['um-myaccount'] = array( - 'title' => __( 'My Account', 'ultimate-member' ), + 'title' => esc_html__( 'My Account', 'ultimate-member' ), 'url' => um_get_core_page( 'account' ), ); $actions['um-logout'] = array( - 'title' => __( 'Logout', 'ultimate-member' ), + 'title' => esc_html__( 'Logout', 'ultimate-member' ), 'url' => um_get_core_page( 'logout' ), ); $actions = apply_filters( 'um_member_directory_my_user_card_actions', $actions, $user_id ); } - return $actions; } @@ -2464,7 +2565,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $dropdown_actions = $this->build_user_actions_list( $user_id ); - $actions = array(); + $actions = array(); $can_edit = UM()->roles()->um_current_user_can( 'edit', $user_id ); // Replace hook 'um_members_just_after_name' @@ -2478,21 +2579,21 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $hook_after_user_name = ob_get_clean(); $data_array = array( - 'card_anchor' => substr( md5( $user_id ), 10, 5 ), - 'id' => $user_id, - 'role' => um_user( 'role' ), - 'account_status' => um_user( 'account_status' ), - 'account_status_name' => um_user( 'account_status_name' ), - 'cover_photo' => um_user( 'cover_photo', $this->cover_size ), - 'display_name' => um_user( 'display_name' ), - 'profile_url' => um_user_profile_url(), - 'can_edit' => $can_edit, - 'edit_profile_url' => um_edit_profile_url(), - 'avatar' => get_avatar( $user_id, $this->avatar_size ), - 'display_name_html' => um_user( 'display_name', 'html' ), - 'dropdown_actions' => $dropdown_actions, - 'hook_just_after_name' => preg_replace( '/^\s+/im', '', $hook_just_after_name ), - 'hook_after_user_name' => preg_replace( '/^\s+/im', '', $hook_after_user_name ), + 'card_anchor' => esc_html( substr( md5( $user_id ), 10, 5 ) ), + 'id' => absint( $user_id ), + 'role' => esc_html( um_user( 'role' ) ), + 'account_status' => esc_html( um_user( 'account_status' ) ), + 'account_status_name' => esc_html( um_user( 'account_status_name' ) ), + 'cover_photo' => wp_kses( um_user( 'cover_photo', $this->cover_size ), UM()->get_allowed_html( 'templates' ) ), + 'display_name' => esc_html( um_user( 'display_name' ) ), + 'profile_url' => esc_url( um_user_profile_url() ), + 'can_edit' => (bool) $can_edit, + 'edit_profile_url' => esc_url( um_edit_profile_url() ), + 'avatar' => wp_kses( get_avatar( $user_id, $this->avatar_size ), UM()->get_allowed_html( 'templates' ) ), + 'display_name_html' => wp_kses( um_user( 'display_name', 'html' ), UM()->get_allowed_html( 'templates' ) ), + 'dropdown_actions' => $dropdown_actions, + 'hook_just_after_name' => wp_kses( preg_replace( '/^\s+/im', '', $hook_just_after_name ), UM()->get_allowed_html( 'templates' ) ), + 'hook_after_user_name' => wp_kses( preg_replace( '/^\s+/im', '', $hook_after_user_name ), UM()->get_allowed_html( 'templates' ) ), ); if ( ! empty( $directory_data['show_tagline'] ) ) { @@ -2506,13 +2607,20 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { continue; } + if ( '_um_last_login' === $key ) { + $show_last_login = get_user_meta( $user_id, 'um_show_last_login', true ); + if ( ! empty( $show_last_login ) && 'no' === $show_last_login[0] ) { + continue; + } + } + $value = um_filtered_value( $key ); if ( ! $value ) { continue; } - $data_array[ $key ] = $value; + $data_array[ $key ] = wp_kses( $value, UM()->get_allowed_html( 'templates' ) ); } } } @@ -2530,6 +2638,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { continue; } + if ( '_um_last_login' === $key ) { + $show_last_login = get_user_meta( $user_id, 'um_show_last_login', true ); + if ( ! empty( $show_last_login ) && 'no' === $show_last_login[0] ) { + continue; + } + } + $value = um_filtered_value( $key ); if ( ! $value ) { continue; @@ -2543,8 +2658,8 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { ) ); } - $data_array[ "label_{$key}" ] = __( $label, 'ultimate-member' ); - $data_array[ $key ] = $value; + $data_array[ "label_{$key}" ] = esc_html__( $label, 'ultimate-member' ); + $data_array[ $key ] = wp_kses( $value, UM()->get_allowed_html( 'templates' ) ); } } } @@ -2554,7 +2669,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { UM()->fields()->show_social_urls(); $social_urls = ob_get_clean(); - $data_array['social_urls'] = $social_urls; + $data_array['social_urls'] = wp_kses( $social_urls, UM()->get_allowed_html( 'templates' ) ); } } @@ -2643,14 +2758,13 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { // Prepare default user query values $this->query_args = array( - 'fields' => 'ids', - 'number' => 0, - 'meta_query' => array( - 'relation' => 'AND' + 'fields' => 'ids', + 'number' => 0, + 'meta_query' => array( + 'relation' => 'AND', ), ); - // handle different restrictions $this->restriction_options(); @@ -2784,7 +2898,7 @@ if ( ! class_exists( 'um\core\Member_Directory' ) ) { $this->cover_size = apply_filters( 'um_member_directory_cover_image_size', $this->cover_size, $directory_data ); - $avatar_size = UM()->options()->get( 'profile_photosize' ); + $avatar_size = UM()->options()->get( 'profile_photosize' ); $this->avatar_size = str_replace( 'px', '', $avatar_size ); $this->avatar_size = apply_filters( 'um_member_directory_avatar_image_size', $this->avatar_size, $directory_data ); diff --git a/includes/core/class-options.php b/includes/core/class-options.php index 66a0ca97..daf801e3 100644 --- a/includes/core/class-options.php +++ b/includes/core/class-options.php @@ -7,64 +7,56 @@ if ( ! defined( 'ABSPATH' ) ) { if ( ! class_exists( 'um\core\Options' ) ) { - /** * Class Options * @package um\core */ class Options { - /** * @var array */ - var $options = array(); - + private $options = array(); /** * Options constructor. */ - function __construct() { + public function __construct() { $this->init_variables(); } - /** * Set variables */ - function init_variables() { + private function init_variables() { $this->options = get_option( 'um_options', array() ); } - /** - * Get UM option value + * Get UM option value. * - * @param $option_id - * @return mixed|string|void + * @param string $option_id + * + * @return mixed */ - function get( $option_id ) { + public function get( $option_id ) { if ( isset( $this->options[ $option_id ] ) ) { /** - * UM hook + * Filters the plugin option. * - * @type filter - * @title um_get_option_filter__{$option_id} - * @description Change UM option on get by $option_id - * @input_vars - * [{"var":"$option","type":"array","desc":"Option Value"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change `option_1` value. + * function my_custom_option_1( $value ) { + * $value = 'option_1_custom_value'; + * return $value; * } - * ?> + * add_filter( 'um_get_option_filter__option_1', 'my_custom_option_1' ); */ return apply_filters( "um_get_option_filter__{$option_id}", $this->options[ $option_id ] ); } @@ -72,35 +64,30 @@ if ( ! class_exists( 'um\core\Options' ) ) { switch ( $option_id ) { case 'site_name': return get_bloginfo( 'name' ); - break; case 'admin_email': return get_bloginfo( 'admin_email' ); - break; default: return ''; - break; } } - /** * Update UM option value * * @param $option_id * @param $value */ - function update( $option_id, $value ) { + public function update( $option_id, $value ) { $this->options[ $option_id ] = $value; update_option( 'um_options', $this->options ); } - /** * Delete UM option * * @param $option_id */ - function remove( $option_id ) { + public function remove( $option_id ) { if ( ! empty( $this->options[ $option_id ] ) ) { unset( $this->options[ $option_id ] ); } @@ -108,16 +95,15 @@ if ( ! class_exists( 'um\core\Options' ) ) { update_option( 'um_options', $this->options ); } - /** * Get UM option default value * * @use UM()->config() * - * @param $option_id + * @param string $option_id * @return mixed */ - function get_default( $option_id ) { + public function get_default( $option_id ) { $settings_defaults = UM()->config()->settings_defaults; if ( ! isset( $settings_defaults[ $option_id ] ) ) { return false; @@ -136,40 +122,58 @@ if ( ! class_exists( 'um\core\Options' ) ) { * @return string */ public function get_predefined_page_option_key( $slug ) { + /** + * Filters the predefined page option key. + * + * @param {string} $option_key Predefined page option key. + * + * @return {string} Predefined page option key. + * + * @since 2.8.3 + * @hook um_predefined_page_option_key + * + * @example Change option key for login predefined page. + * function my_um_predefined_page_option_key( $option_key ) { + * if ( 'core_login' === $option_key ) { + * $option_key = 'core_login_custom'; + * } + * return $option_key; + * } + * add_filter( 'um_predefined_page_option_key', 'my_um_predefined_page_option_key' ); + */ return apply_filters( 'um_predefined_page_option_key', "core_{$slug}" ); } /** * Get core page ID * + * @todo Deprecate soon + * * @param string $key * - * @return mixed|void + * @return string */ - function get_core_page_id( $key ) { + public function get_core_page_id( $key ) { /** - * UM hook + * Filters the predefined page option key. * - * @type filter - * @title um_core_page_id_filter - * @description Change UM page slug - * @input_vars - * [{"var":"$slug","type":"array","desc":"UM page slug"}] - * @change_log - * ["Since: 2.0"] - * @usage - * - * @example - * Change option key for login predefined page. + * function my_um_core_page_id_filter( $page_key ) { + * if ( 'core_login' === $page_key ) { + * $page_key = 'core_login_custom'; + * } + * return $page_key; * } - * ?> + * add_filter( 'um_core_page_id_filter', 'my_um_core_page_id_filter' ); */ - return apply_filters( 'um_core_page_id_filter', 'core_' . $key ); + return apply_filters( 'um_core_page_id_filter', $this->get_predefined_page_option_key( $key ) ); } - } } diff --git a/includes/core/class-password.php b/includes/core/class-password.php index 77f4c5cb..66a7bfcf 100644 --- a/includes/core/class-password.php +++ b/includes/core/class-password.php @@ -38,21 +38,26 @@ if ( ! class_exists( 'um\core\Password' ) ) { * * @return bool|string */ - function reset_url() { + public function reset_url() { + static $reset_key = null; + $user_id = um_user( 'ID' ); delete_option( "um_cache_userdata_{$user_id}" ); - //new reset password key via WordPress native field. It maybe already exists here but generated twice to make sure that emailed with a proper and fresh hash + // New reset password key via WordPress native field. It maybe already exists here but generated twice to make sure that emailed with a proper and fresh hash. + // But doing that only once in 1 request using static variable. Different email placeholders can use reset_url() and we have to use 1 time generated to avoid invalid keys. $user_data = get_userdata( $user_id ); - $key = UM()->user()->maybe_generate_password_reset_key( $user_data ); + if ( empty( $reset_key ) ) { + $reset_key = UM()->user()->maybe_generate_password_reset_key( $user_data ); + } // this link looks like WordPress native link e.g. wp-login.php?action=rp&key={hash}&login={user_login} $url = add_query_arg( array( 'act' => 'reset_password', - 'hash' => $key, - 'login' => $user_data->user_login, + 'hash' => $reset_key, + 'login' => rawurlencode( $user_data->user_login ), ), um_get_core_page( 'password-reset' ) ); @@ -490,6 +495,7 @@ if ( ! class_exists( 'um\core\Password' ) ) { if ( isset( $args['user_password'] ) && empty( $args['user_password'] ) ) { UM()->form()->add_error( 'user_password', __( 'You must enter a new password', 'ultimate-member' ) ); + return; } if ( isset( $args['user_password'] ) ) { diff --git a/includes/core/class-permalinks.php b/includes/core/class-permalinks.php index 5d66a799..b2714d45 100644 --- a/includes/core/class-permalinks.php +++ b/includes/core/class-permalinks.php @@ -174,7 +174,7 @@ if ( ! class_exists( 'um\core\Permalinks' ) ) { do_action( 'um_after_email_confirmation', $user_id ); if ( empty( $set_password_required ) ) { - $redirect = empty( $user_role_data['url_email_activate'] ) ? um_get_core_page( 'login', 'account_active' ) : trim( $user_role_data['url_email_activate'] ); // Role setting "URL redirect after e-mail activation" + $redirect = empty( $user_role_data['url_email_activate'] ) ? um_get_core_page( 'login', 'account_active' ) : trim( $user_role_data['url_email_activate'] ); // Role setting "URL redirect after email activation" } $redirect = apply_filters( 'um_after_email_confirmation_redirect', $redirect, $user_id, $login ); diff --git a/includes/core/class-profile.php b/includes/core/class-profile.php index ca698a96..b469209e 100644 --- a/includes/core/class-profile.php +++ b/includes/core/class-profile.php @@ -418,6 +418,13 @@ if ( ! class_exists( 'um\core\Profile' ) ) { if ( ! empty( $array ) ) { foreach ( $array as $key ) { if ( $key ) { + if ( '_um_last_login' === $key ) { + $show_last_login = get_user_meta( um_user( 'ID' ), 'um_show_last_login', true ); + if ( ! empty( $show_last_login ) && 'no' === $show_last_login[0] ) { + continue; + } + } + $data = array(); if ( isset( UM()->builtin()->all_user_fields[ $key ] ) ) { $data = UM()->builtin()->all_user_fields[ $key ]; diff --git a/includes/core/class-rewrite.php b/includes/core/class-rewrite.php index a8d66482..ccad3bb4 100644 --- a/includes/core/class-rewrite.php +++ b/includes/core/class-rewrite.php @@ -162,6 +162,13 @@ if ( ! class_exists( 'um\core\Rewrite' ) ) { if ( empty( $custom_meta ) ) { // Set default permalink base if custom meta is empty. $permalink_base = 'user_login'; + } else { + // Ignore username slug if custom meta slug exists. + $user_id = username_exists( um_queried_user() ); + $custom_permalink = get_user_meta( $user_id, 'um_user_profile_url_slug_' . $permalink_base, true ); + if ( ! empty( $custom_permalink ) && um_queried_user() !== $custom_permalink ) { + return false; + } } } diff --git a/includes/core/class-setup.php b/includes/core/class-setup.php index 209c8ae4..ae67f0ac 100644 --- a/includes/core/class-setup.php +++ b/includes/core/class-setup.php @@ -191,27 +191,7 @@ KEY meta_value_indx (um_value(191)) $content = '[ultimatemember form_id="' . $setup_shortcodes[ $slug ] . '"]'; } - /** - * Filters Ultimate Member predefined pages content when set up the predefined page. - * - * @param {string} $content Predefined page content. - * @param {string} $slug Predefined page slug (key). - * - * @return {string} Predefined page content. - * - * @since 2.1.0 - * @hook um_setup_predefined_page_content - * - * @example Set Ultimate Member predefined pages content with key = 'my_page_key'. - * function my_um_setup_predefined_page_content( $content, $slug ) { - * // your code here - * if ( 'my_page_key' === $slug ) { - * $content = __( 'My Page content', 'my-translate-key' ); - * } - * return $pages; - * } - * add_filter( 'um_setup_predefined_page_content', 'my_um_setup_predefined_page_content' ); - */ + /** This filter is documented in includes/core/class-setup.php */ $content = apply_filters( 'um_setup_predefined_page_content', $content, $slug ); $user_page = array( @@ -233,7 +213,7 @@ KEY meta_value_indx (um_value(191)) $options = get_option( 'um_options', array() ); foreach ( $core_pages as $slug => $page_id ) { - $key = UM()->options()->get_core_page_id( $slug ); + $key = UM()->options()->get_predefined_page_option_key( $slug ); $options[ $key ] = $page_id; } @@ -243,6 +223,72 @@ KEY meta_value_indx (um_value(191)) UM()->rewrite()->reset_rules(); } + public function predefined_page( $slug, $with_rewrite = true ) { + $page_exists = UM()->query()->find_post_id( 'page', '_um_core', $slug ); + if ( $page_exists ) { + return; + } + + $predefined_pages = UM()->config()->get( 'predefined_pages' ); + if ( empty( $predefined_pages ) || ! array_key_exists( $slug, $predefined_pages ) ) { + return; + } + + $data = $predefined_pages[ $slug ]; + + if ( empty( $data['title'] ) ) { + return; + } + + $content = ! empty( $data['content'] ) ? $data['content'] : ''; + /** + * Filters Ultimate Member predefined pages content when set up the predefined page. + * + * @param {string} $content Predefined page content. + * @param {string} $slug Predefined page slug (key). + * + * @return {string} Predefined page content. + * + * @since 2.1.0 + * @hook um_setup_predefined_page_content + * + * @example Set Ultimate Member predefined pages content with key = 'my_page_key'. + * function my_um_setup_predefined_page_content( $content, $slug ) { + * // your code here + * if ( 'my_page_key' === $slug ) { + * $content = __( 'My Page content', 'my-translate-key' ); + * } + * return $pages; + * } + * add_filter( 'um_setup_predefined_page_content', 'my_um_setup_predefined_page_content' ); + */ + $content = apply_filters( 'um_setup_predefined_page_content', $content, $slug ); + + $user_page = array( + 'post_title' => $data['title'], + 'post_content' => $content, + 'post_name' => $slug, + 'post_type' => 'page', + 'post_status' => 'publish', + 'post_author' => get_current_user_id(), + 'comment_status' => 'closed', + ); + + $post_id = wp_insert_post( $user_page ); + if ( empty( $post_id ) || is_wp_error( $post_id ) ) { + return; + } + + update_post_meta( $post_id, '_um_core', $slug ); + + UM()->options()->update( UM()->options()->get_predefined_page_option_key( $slug ), $post_id ); + + if ( $with_rewrite ) { + // Reset rewrite rules after page creation and option upgrade. + UM()->rewrite()->reset_rules(); + } + } + /** * Set default UM settings. */ diff --git a/includes/core/class-uploader.php b/includes/core/class-uploader.php index 5a66d74d..19f6e28f 100644 --- a/includes/core/class-uploader.php +++ b/includes/core/class-uploader.php @@ -968,28 +968,29 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { /** * Profile photo image process * - * @param array $response + * @param array $response * @param string $image_path * @param string $src * @param string $key - * @param integer $user_id + * @param int $user_id * @param string $coord - * @param array $crop + * @param array $crop * * @since 2.0.22 * * @return array */ public function profile_photo( $response, $image_path, $src, $key, $user_id, $coord, $crop ) { - $sizes = UM()->options()->get( 'photo_thumb_sizes' ); - + $sizes = UM()->options()->get( 'photo_thumb_sizes' ); $quality = UM()->options()->get( 'image_compression' ); $image = wp_get_image_editor( $image_path ); // Return an implementation that extends WP_Image_Editor $temp_image_path = $image_path; - //refresh image_path to make temporary image permanently after upload - $image_path = pathinfo( $image_path, PATHINFO_DIRNAME ) . DIRECTORY_SEPARATOR . $key . '.' . pathinfo( $image_path, PATHINFO_EXTENSION ); + + // Refresh image_path to make temporary image permanently after upload + $photo_ext = pathinfo( $image_path, PATHINFO_EXTENSION ); + $image_path = pathinfo( $image_path, PATHINFO_DIRNAME ) . DIRECTORY_SEPARATOR . $key . '.' . $photo_ext; if ( ! is_wp_error( $image ) ) { $src_x = $crop[0]; @@ -1004,12 +1005,16 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { $image->resize( $max_w, $src_h ); } - $image->save( $image_path ); + $save_result = $image->save( $image_path ); + + if ( is_wp_error( $save_result ) ) { + // translators: %s is the file src. + wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); + } $image->set_quality( $quality ); $sizes_array = array(); - foreach ( $sizes as $size ) { $sizes_array[] = array( 'width' => $size ); } @@ -1020,50 +1025,49 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { unlink( $temp_image_path ); - $src = str_replace( '/' . $key . '_temp.', '/' . $key . '.', $src ); + $basename = $key . '_temp.' . $photo_ext; + $src = str_replace( '/' . $basename, '/' . $save_result['file'], $src ); - $response['image']['source_url'] = $src; - $response['image']['source_path'] = $image_path; - $response['image']['filename'] = wp_basename( $image_path ); + $response['image']['source_url'] = $src; + $response['image']['source_path'] = $save_result['path']; + $response['image']['filename'] = $save_result['file']; - update_user_meta( $this->user_id, $key, wp_basename( wp_basename( $image_path ) ) ); + update_user_meta( $this->user_id, $key, $save_result['file'] ); delete_user_meta( $this->user_id, "{$key}_metadata_temp" ); } else { - wp_send_json_error( esc_js( __( "Unable to crop image file: {$src}", 'ultimate-member' ) ) ); + // translators: %s is the file src. + wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); } return $response; } - /** * Cover photo image process * * @param string $src - * @param integer $user_id + * @param int $user_id * @param string $coord - * @param array $crop - * @param array $response + * @param array $crop + * @param array $response * * @since 2.0.22 * * @return array */ public function cover_photo( $response, $image_path, $src, $key, $user_id, $coord, $crop ) { - - $sizes = UM()->options()->get( 'cover_thumb_sizes' ); - + $sizes = UM()->options()->get( 'cover_thumb_sizes' ); $quality = UM()->options()->get( 'image_compression' ); $image = wp_get_image_editor( $image_path ); // Return an implementation that extends WP_Image_Editor $temp_image_path = $image_path; - //refresh image_path to make temporary image permanently after upload - $image_path = pathinfo( $image_path, PATHINFO_DIRNAME ) . DIRECTORY_SEPARATOR . $key . '.' . pathinfo( $image_path, PATHINFO_EXTENSION ); + // Refresh image_path to make temporary image permanently after upload + $photo_ext = pathinfo( $image_path, PATHINFO_EXTENSION ); + $image_path = pathinfo( $image_path, PATHINFO_DIRNAME ) . DIRECTORY_SEPARATOR . $key . '.' . $photo_ext; if ( ! is_wp_error( $image ) ) { - $src_x = $crop[0]; $src_y = $crop[1]; $src_w = $crop[2]; @@ -1076,7 +1080,12 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { $image->resize( $max_w, $src_h ); } - $image->save( $image_path ); + $save_result = $image->save( $image_path ); + + if ( is_wp_error( $save_result ) ) { + // translators: %s is the file src. + wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); + } $image->set_quality( $quality ); @@ -1090,7 +1099,7 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { // change filenames of resized images foreach ( $resize as $row ) { - $new_filename = str_replace( "x{$row['height']}" , '', $row['file'] ); + $new_filename = str_replace( "x{$row['height']}", '', $row['file'] ); $old_filename = $row['file']; rename( dirname( $image_path ) . DIRECTORY_SEPARATOR . $old_filename, dirname( $image_path ) . DIRECTORY_SEPARATOR . $new_filename ); @@ -1098,16 +1107,18 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { unlink( $temp_image_path ); - $src = str_replace( '/' . $key . '_temp.', '/' . $key . '.', $src ); + $basename = $key . '_temp.' . $photo_ext; + $src = str_replace( '/' . $basename, '/' . $save_result['file'], $src ); - $response['image']['source_url'] = $src; - $response['image']['source_path'] = $image_path; - $response['image']['filename'] = wp_basename( $image_path ); + $response['image']['source_url'] = $src; + $response['image']['source_path'] = $save_result['path']; + $response['image']['filename'] = $save_result['file']; - update_user_meta( $this->user_id, $key, wp_basename( wp_basename( $image_path ) ) ); + update_user_meta( $this->user_id, $key, $save_result['file'] ); delete_user_meta( $this->user_id, "{$key}_metadata_temp" ); } else { - wp_send_json_error( esc_js( __( "Unable to crop image file: {$src}", 'ultimate-member' ) ) ); + // translators: %s is the file src. + wp_send_json_error( sprintf( __( 'Unable to crop image file: %s', 'ultimate-member' ), $src ) ); } return $response; @@ -1195,15 +1206,15 @@ if ( ! class_exists( 'um\core\Uploader' ) ) { $response = array( 'image' => array( - 'source_url' => $src, - 'source_path' => $image_path, - 'filename' => wp_basename( $image_path ), + 'source_url' => $src, + 'source_path' => $image_path, + 'filename' => wp_basename( $image_path ), ), ); $response = apply_filters( "um_upload_image_process__{$key}", $response, $image_path, $src, $key, $user_id, $coord, $crop ); - if ( ! in_array( $key, array( 'profile_photo', 'cover_photo' ) ) ) { + if ( ! in_array( $key, array( 'profile_photo', 'cover_photo' ), true ) ) { $response = apply_filters( 'um_upload_stream_image_process', $response, $image_path, $src, $key, $user_id, $coord, $crop ); } diff --git a/includes/core/class-user.php b/includes/core/class-user.php index 9a96da1f..914a82b2 100644 --- a/includes/core/class-user.php +++ b/includes/core/class-user.php @@ -1301,7 +1301,7 @@ if ( ! class_exists( 'um\core\User' ) ) { } if ( $this->usermeta['account_status'][0] == 'awaiting_email_confirmation' ) { - $this->usermeta['account_status_name'][0] = __( 'Awaiting E-mail Confirmation', 'ultimate-member' ); + $this->usermeta['account_status_name'][0] = __( 'Awaiting Email Confirmation', 'ultimate-member' ); } if ( $this->usermeta['account_status'][0] == 'awaiting_admin_review' ) { @@ -1607,7 +1607,7 @@ if ( ! class_exists( 'um\core\User' ) ) { $expiry_time = UM()->options()->get( 'activation_link_expiry_time' ); if ( ! empty( $expiry_time ) && is_numeric( $expiry_time ) ) { - $this->profile['account_secret_hash_expiry'] = time() + $expiry_time; + $this->profile['account_secret_hash_expiry'] = time() + $expiry_time * DAY_IN_SECONDS; $this->update_usermeta_info( 'account_secret_hash_expiry' ); } @@ -1676,7 +1676,7 @@ if ( ! class_exists( 'um\core\User' ) ) { /** - * This method approves a user membership and sends them an optional welcome/approval e-mail. + * This method approves a user membership and sends them an optional welcome/approval email. * * @usage user()->approve(); ?> * @@ -1758,7 +1758,7 @@ if ( ! class_exists( 'um\core\User' ) ) { /** - * This method puts a user under manual review by administrator and sends them an optional e-mail. + * This method puts a user under manual review by administrator and sends them an optional email. * * @usage user()->pending(); ?> * @@ -1784,7 +1784,7 @@ if ( ! class_exists( 'um\core\User' ) ) { /** - * This method rejects a user membership and sends them an optional e-mail. + * This method rejects a user membership and sends them an optional email. * * @usage user()->reject(); ?> * @@ -1811,7 +1811,7 @@ if ( ! class_exists( 'um\core\User' ) ) { /** - * This method deactivates a user membership and sends them an optional e-mail. + * This method deactivates a user membership and sends them an optional email. * * @usage user()->deactivate(); ?> * diff --git a/includes/core/um-actions-account.php b/includes/core/um-actions-account.php index 41e520dc..b761a49f 100644 --- a/includes/core/um-actions-account.php +++ b/includes/core/um-actions-account.php @@ -157,15 +157,15 @@ function um_submit_account_errors_hook( $args ) { if ( isset( $args['user_email'] ) ) { if ( strlen( trim( $args['user_email'] ) ) === 0 ) { - UM()->form()->add_error( 'user_email', __( 'You must provide your e-mail', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_email', __( 'You must provide your email', 'ultimate-member' ) ); } if ( ! is_email( $args['user_email'] ) ) { - UM()->form()->add_error( 'user_email', __( 'Please provide a valid e-mail', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_email', __( 'Please provide a valid email', 'ultimate-member' ) ); } if ( email_exists( $args['user_email'] ) && email_exists( $args['user_email'] ) !== get_current_user_id() ) { - UM()->form()->add_error( 'user_email', __( 'Please provide a valid e-mail', 'ultimate-member' ) ); + UM()->form()->add_error( 'user_email', __( 'Please provide a valid email', 'ultimate-member' ) ); } } @@ -330,7 +330,7 @@ function um_submit_account_details( $args ) { $v = sanitize_text_field( $v ); } elseif ( 'user_email' === $k ) { $v = sanitize_email( $v ); - } elseif ( 'hide_in_members' === $k ) { + } elseif ( 'hide_in_members' === $k || 'um_show_last_login' === $k ) { $v = array_map( 'sanitize_text_field', $v ); } @@ -351,6 +351,13 @@ function um_submit_account_details( $args ) { } } + if ( isset( $changes['um_show_last_login'] ) ) { + if ( 'yes' === $changes['um_show_last_login'] || array_intersect( array( 'yes' ), $changes['um_show_last_login'] ) ) { + delete_user_meta( $user_id, 'um_show_last_login' ); + unset( $changes['um_show_last_login'] ); + } + } + /** * UM hook * @@ -552,8 +559,13 @@ add_action( 'um_after_user_account_updated', 'um_after_user_account_updated_perm * @param $changed */ function um_account_updated_notification( $user_id, $changed ) { - um_fetch_user( $user_id ); - UM()->mail()->send( um_user( 'user_email' ), 'changedaccount_email' ); + // phpcs:disable WordPress.Security.NonceVerification + if ( 'password' !== $_POST['_um_account_tab'] || ! UM()->options()->get( 'changedpw_email_on' ) ) { + // Avoid email duplicates (account changed and password changed) on the password change tab. + um_fetch_user( $user_id ); + UM()->mail()->send( um_user( 'user_email' ), 'changedaccount_email' ); + } + // phpcs:enable WordPress.Security.NonceVerification } add_action( 'um_after_user_account_updated', 'um_account_updated_notification', 20, 2 ); @@ -612,7 +624,7 @@ function um_after_account_privacy( $args ) { $exports_url = wp_privacy_exports_url(); echo '

    ' . esc_html__( 'You could download your previous data:', 'ultimate-member' ) . '

    '; - echo '' . esc_html__( 'Download Personal Data', 'ultimate-member' ) . ''; + echo '' . esc_html__( 'Download Personal Data', 'ultimate-member' ) . ''; echo '

    ' . esc_html__( 'You could send a new request for an export of personal your data.', 'ultimate-member' ) . '

    '; } diff --git a/includes/core/um-actions-form.php b/includes/core/um-actions-form.php index 1cbf29e5..259ac140 100644 --- a/includes/core/um-actions-form.php +++ b/includes/core/um-actions-form.php @@ -821,7 +821,7 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { case 'soundcloud_url': if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'soundcloud.com' ) ) { // translators: %s: label. - UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s username or profile URL','ultimate-member'), $array['label'] ) ); + UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s username or profile URL', 'ultimate-member' ), $array['label'] ) ); } break; @@ -840,7 +840,6 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { break; case 'instagram_url': - if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'instagram.com' ) ) { // translators: %s: label. UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s profile URL', 'ultimate-member' ), $array['label'] ) ); @@ -861,7 +860,6 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { break; case 'tiktok_url': - if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'tiktok.com' ) ) { // translators: %s: label. UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s profile URL', 'ultimate-member' ), $array['label'] ) ); @@ -869,7 +867,6 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { break; case 'twitch_url': - if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'twitch.tv' ) ) { // translators: %s: label. UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s profile URL', 'ultimate-member' ), $array['label'] ) ); @@ -877,7 +874,6 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { break; case 'reddit_url': - if ( ! UM()->validation()->is_url( $submitted_data[ $key ], 'reddit.com' ) ) { // translators: %s: label. UM()->form()->add_error( $key, sprintf( __( 'Please enter a valid %s profile URL', 'ultimate-member' ), $array['label'] ) ); @@ -891,126 +887,126 @@ function um_submit_form_errors_hook_( $submitted_data, $form_data ) { break; case 'unique_username': - - if ( $submitted_data[ $key ] == '' ) { + if ( '' === $submitted_data[ $key ] ) { UM()->form()->add_error( $key, __( 'You must provide a username', 'ultimate-member' ) ); - } elseif ( $mode == 'register' && username_exists( sanitize_user( $submitted_data[ $key ] ) ) ) { + } elseif ( 'register' === $mode && username_exists( sanitize_user( $submitted_data[ $key ] ) ) ) { UM()->form()->add_error( $key, __( 'The username you entered is incorrect', 'ultimate-member' ) ); } elseif ( is_email( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Username cannot be an email', 'ultimate-member' ) ); } elseif ( ! UM()->validation()->safe_username( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Your username contains invalid characters', 'ultimate-member' ) ); } - break; case 'unique_username_or_email': - - if ( $submitted_data[ $key ] == '' ) { + if ( '' === $submitted_data[ $key ] ) { UM()->form()->add_error( $key, __( 'You must provide a username or email', 'ultimate-member' ) ); - } elseif ( $mode == 'register' && username_exists( sanitize_user( $submitted_data[ $key ] ) ) ) { + } elseif ( 'register' === $mode && username_exists( sanitize_user( $submitted_data[ $key ] ) ) ) { UM()->form()->add_error( $key, __( 'The username you entered is incorrect', 'ultimate-member' ) ); - } elseif ( $mode == 'register' && email_exists( $submitted_data[ $key ] ) ) { + } elseif ( 'register' === $mode && email_exists( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( ! UM()->validation()->safe_username( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'Your username contains invalid characters', 'ultimate-member' ) ); } - break; case 'unique_email': - $submitted_data[ $key ] = trim( $submitted_data[ $key ] ); - if ( in_array( $key, array( 'user_email' ) ) ) { - - if ( ! isset( $submitted_data['user_id'] ) ){ + if ( 'user_email' === $key ) { + if ( ! isset( $submitted_data['user_id'] ) ) { $submitted_data['user_id'] = um_get_requested_user(); } $email_exists = email_exists( $submitted_data[ $key ] ); - if ( $submitted_data[ $key ] == '' && in_array( $key, array( 'user_email' ) ) ) { + if ( '' === $submitted_data[ $key ] ) { UM()->form()->add_error( $key, __( 'You must provide your email', 'ultimate-member' ) ); - } elseif ( in_array( $mode, array( 'register' ) ) && $email_exists ) { + } elseif ( 'register' === $mode && $email_exists ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); - } elseif ( in_array( $mode, array( 'profile' ) ) && $email_exists && $email_exists != $submitted_data['user_id'] ) { + } elseif ( 'profile' === $mode && $email_exists && $email_exists !== $submitted_data['user_id'] ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( ! is_email( $submitted_data[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member') ); + UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } elseif ( ! UM()->validation()->safe_username( $submitted_data[ $key ] ) ) { - UM()->form()->add_error( $key, __( 'Your email contains invalid characters', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'Your email contains invalid characters', 'ultimate-member' ) ); } - } else { - if ( $submitted_data[ $key ] != '' && ! is_email( $submitted_data[ $key ] ) ) { + 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 ] ) ) { + } 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 ] != '' ) { + } elseif ( '' !== $submitted_data[ $key ] ) { $users = get_users( 'meta_value=' . $submitted_data[ $key ] ); foreach ( $users as $user ) { - if ( $user->ID != $submitted_data['user_id'] ) { + if ( $user->ID !== $submitted_data['user_id'] ) { UM()->form()->add_error( $key, __( 'The email you entered is incorrect', 'ultimate-member' ) ); } } - } - } - break; case 'is_email': - $submitted_data[ $key ] = trim( $submitted_data[ $key ] ); - - if ( $submitted_data[ $key ] != '' && ! is_email( $submitted_data[ $key ] ) ) { + if ( '' !== $submitted_data[ $key ] && ! is_email( $submitted_data[ $key ] ) ) { UM()->form()->add_error( $key, __( 'This is not a valid email', 'ultimate-member' ) ); } - break; case 'unique_value': + if ( '' !== $submitted_data[ $key ] ) { - if ( $submitted_data[ $key ] != '' ) { + if ( ! isset( $submitted_data['user_id'] ) ) { + $submitted_data['user_id'] = um_get_requested_user(); + } $args_unique_meta = array( - 'meta_key' => $key, - 'meta_value' => $submitted_data[ $key ], - 'compare' => '=', - 'exclude' => array( $submitted_data['user_id'] ), + 'meta_key' => $key, + 'meta_value' => $submitted_data[ $key ], + 'compare' => '=', + 'exclude' => array( $submitted_data['user_id'] ), ); $meta_key_exists = get_users( $args_unique_meta ); if ( $meta_key_exists ) { - UM()->form()->add_error( $key , __( 'You must provide a unique value', 'ultimate-member' ) ); + UM()->form()->add_error( $key, __( 'You must provide a unique value', 'ultimate-member' ) ); } } break; case 'alphabetic': - - if ( $submitted_data[ $key ] != '' ) { - + if ( '' !== $submitted_data[ $key ] ) { if ( ! preg_match( '/^\p{L}+$/u', str_replace( ' ', '', $submitted_data[ $key ] ) ) ) { UM()->form()->add_error( $key, __( 'You must provide alphabetic letters', 'ultimate-member' ) ); } - } + break; + case 'alpha_numeric': + if ( '' !== $submitted_data[ $key ] ) { + if ( ! preg_match( '/^[\p{L}0-9\s]+$/u', str_replace( ' ', '', $submitted_data[ $key ] ) ) ) { + UM()->form()->add_error( $key, __( 'You must provide alphabetic letters or numbers', 'ultimate-member' ) ); + } + } break; case 'lowercase': + if ( '' !== $submitted_data[ $key ] ) { + if ( ! ctype_lower( str_replace( ' ', '', $submitted_data[ $key ] ) ) ) { + UM()->form()->add_error( $key, __( 'You must provide lowercase letters.', 'ultimate-member' ) ); + } + } + break; - if ( $submitted_data[ $key ] != '' ) { - - if ( ! ctype_lower( str_replace(' ', '', $submitted_data[ $key ] ) ) ) { - UM()->form()->add_error( $key , __( 'You must provide lowercase letters.', 'ultimate-member' ) ); + case 'english': + if ( '' !== $submitted_data[ $key ] ) { + if ( ! preg_match( '/^[a-zA-Z]*$/u', str_replace( ' ', '', $submitted_data[ $key ] ) ) ) { + UM()->form()->add_error( $key, __( 'You must provide English letters.', 'ultimate-member' ) ); } } @@ -1076,9 +1072,12 @@ add_action( 'um_submit_form_errors_hook_', 'um_submit_form_errors_hook_', 10, 2 * @return string */ function um_invalid_nonce_redirect_url( $url ) { - $url = add_query_arg( [ - 'um-hash' => substr( md5( rand() ), 0, 6 ), - ], remove_query_arg( 'um-hash', $url ) ); + $url = add_query_arg( + array( + 'um-hash' => substr( md5( rand() ), 0, 6 ), + ), + remove_query_arg( 'um-hash', $url ) + ); return $url; } diff --git a/includes/core/um-actions-misc.php b/includes/core/um-actions-misc.php index 1327d024..9525b5a1 100644 --- a/includes/core/um-actions-misc.php +++ b/includes/core/um-actions-misc.php @@ -168,7 +168,7 @@ function um_add_update_notice( $args ) { $err = __( 'Your account has not been approved yet.', 'ultimate-member' ); break; case 'awaiting_email_confirmation': - $err = __( 'Your account is awaiting e-mail verification.', 'ultimate-member' ); + $err = __( 'Your account is awaiting email verification.', 'ultimate-member' ); break; case 'rejected': $err = __( 'Your membership request has been rejected.', 'ultimate-member' ); diff --git a/includes/core/um-actions-profile.php b/includes/core/um-actions-profile.php index 49e58869..0347a85a 100644 --- a/includes/core/um-actions-profile.php +++ b/includes/core/um-actions-profile.php @@ -1017,7 +1017,7 @@ function um_profile_header( $args ) { */ do_action( 'um_pre_header_editprofile', $args ); ?> -
    fields()->aria_valid_attributes( UM()->fields()->is_error( 'profile_photo' ), 'profile_photo' ) ); ?>> +
    fields()->aria_valid_attributes( UM()->fields()->is_error( 'profile_photo' ), 'profile_photo' ), UM()->get_allowed_html( 'templates' ) ); ?>> " data-character-limit="" placeholder="" - name="" fields()->aria_valid_attributes( UM()->fields()->is_error( $description_key ), 'um-meta-bio' ) ); ?>> + name="" fields()->aria_valid_attributes( UM()->fields()->is_error( $description_key ), 'um-meta-bio' ), UM()->get_allowed_html( 'templates' ) ); ?>> @@ -1576,7 +1576,8 @@ function um_submit_form_profile( $args, $form_data ) { * function my_user_edit_profile( $post, $form_data ) { * // your code here * } - * add_action( 'um_user_edit_profile', 'my_user_edit_profile', 10, 2 ); + * // Don't use priority >= 10 because there is native Ultimate Member handler on it. + * add_action( 'um_user_edit_profile', 'my_user_edit_profile', 9, 2 ); */ do_action( 'um_user_edit_profile', $args, $form_data ); } diff --git a/includes/core/um-actions-register.php b/includes/core/um-actions-register.php index 5d4bf6ac..d79718c4 100644 --- a/includes/core/um-actions-register.php +++ b/includes/core/um-actions-register.php @@ -766,7 +766,7 @@ add_action( 'um_registration_set_extra_data', 'um_registration_set_profile_full_ * Redirect from default registration to UM registration page */ function um_form_register_redirect() { - $page_id = UM()->options()->get( UM()->options()->get_core_page_id( 'register' ) ); + $page_id = UM()->options()->get( UM()->options()->get_predefined_page_option_key( 'register' ) ); // Do not redirect if the registration page is not published. if ( ! empty( $page_id ) && 'publish' === get_post_status( $page_id ) ) { // Not `um_safe_redirect()` because predefined register page is situated on the same host. diff --git a/includes/core/um-filters-commenting.php b/includes/core/um-filters-commenting.php index acadc17f..b6f6f570 100644 --- a/includes/core/um-filters-commenting.php +++ b/includes/core/um-filters-commenting.php @@ -1,37 +1,38 @@ -user_id ) && ! empty( $comment->user_id ) ){ + if ( ! empty( $comment->user_id ) ) { if ( isset( UM()->user()->cached_user[ $comment->user_id ] ) && UM()->user()->cached_user[ $comment->user_id ] ) { - - $return = '' . UM()->user()->cached_user[$comment->user_id]['name'] . ''; - + $return = '' . UM()->user()->cached_user[ $comment->user_id ]['name'] . ''; } else { - um_fetch_user( $comment->user_id ); - UM()->user()->cached_user[ $comment->user_id ] = array('url' => um_user_profile_url(), 'name' => um_user('display_name') ); - $return = '' . UM()->user()->cached_user[$comment->user_id]['name'] . ''; + UM()->user()->cached_user[ $comment->user_id ] = array( + 'url' => um_user_profile_url(), + 'name' => um_user( 'display_name' ), + ); + + $return = '' . UM()->user()->cached_user[ $comment->user_id ]['name'] . ''; um_reset_user(); - } } return $return; } -add_filter('get_comment_author_link', 'um_comment_link_to_profile', 10000, 3 ); \ No newline at end of file +add_filter( 'get_comment_author_link', 'um_comment_link_to_profile', 10000, 3 ); diff --git a/includes/core/um-filters-fields.php b/includes/core/um-filters-fields.php index 94423d43..251d4e63 100644 --- a/includes/core/um-filters-fields.php +++ b/includes/core/um-filters-fields.php @@ -3,24 +3,6 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -/** - * Field is required? - * - * @param $label - * @param $data - * - * @return string - */ -function um_edit_label_all_fields( $label, $data ) { - $asterisk = UM()->options()->get( 'form_asterisk' ); - if ( $asterisk && ! empty( $data['required'] ) ) { - $label .= '*'; - } - - return $label; -} -add_filter( 'um_edit_label_all_fields', 'um_edit_label_all_fields', 10, 2 ); - /** * Outputs a oEmbed field * @@ -114,7 +96,7 @@ add_filter( 'um_profile_field_filter_hook__youtube_video', 'um_profile_field_fil function um_profile_field_filter_hook__spotify( $value, $data ) { if ( preg_match( '/https:\/\/open.spotify.com\/.*/', $value ) ) { if ( false !== strpos( $value, '/user/' ) ) { - $value = '' . esc_html( $value ) . ''; + $value = '' . esc_html( $value ) . ''; } else { $url = str_replace( 'open.spotify.com/', 'open.spotify.com/embed/', $value ); @@ -162,12 +144,10 @@ add_filter( 'um_profile_field_filter_hook__vimeo_video', 'um_profile_field_filte * @return int|string */ function um_profile_field_filter_hook__phone( $value, $data ) { - $value = '' . esc_html( $value ) . ''; + $value = '' . esc_html( $value ) . ''; return $value; } -add_filter( 'um_profile_field_filter_hook__phone_number', 'um_profile_field_filter_hook__phone', 99, 2 ); -add_filter( 'um_profile_field_filter_hook__mobile_number', 'um_profile_field_filter_hook__phone', 99, 2 ); - +add_filter( 'um_profile_field_filter_hook__tel', 'um_profile_field_filter_hook__phone', 99, 2 ); /** * Outputs a viber link @@ -178,8 +158,9 @@ add_filter( 'um_profile_field_filter_hook__mobile_number', 'um_profile_field_fil * @return int|string */ function um_profile_field_filter_hook__viber( $value, $data ) { - $value = str_replace('+', '', $value); - $value = '' . esc_html( $value ) . ''; + $value = str_replace( '+', '', $value ); + $url = 'viber://chat?number=%2B' . $value; + $value = '' . esc_html( $value ) . ''; return $value; } add_filter( 'um_profile_field_filter_hook__viber', 'um_profile_field_filter_hook__viber', 99, 2 ); @@ -194,8 +175,9 @@ add_filter( 'um_profile_field_filter_hook__viber', 'um_profile_field_filter_hook * @return int|string */ function um_profile_field_filter_hook__whatsapp( $value, $data ) { - $value = str_replace('+', '', $value); - $value = '' . esc_html( $value ) . ''; + $value = str_replace( '+', '', $value ); + $url = add_query_arg( array( 'phone' => $value ), 'https://api.whatsapp.com/send' ); + $value = '' . esc_html( $value ) . ''; return $value; } add_filter( 'um_profile_field_filter_hook__whatsapp', 'um_profile_field_filter_hook__whatsapp', 99, 2 ); @@ -391,7 +373,7 @@ function um_profile_field_filter_hook__file( $value, $data ) { } $value = '
    - + ' . esc_attr( $value ) . ' @@ -465,11 +447,13 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) { $url_rel = ( isset( $data['url_rel'] ) && 'nofollow' === $data['url_rel'] ) ? 'rel="nofollow"' : ''; $data['url_target'] = ( isset( $data['url_target'] ) ) ? $data['url_target'] : '_blank'; + $protocols = wp_allowed_protocols(); if ( false === strstr( $value, 'join.skype.com' ) ) { $value = 'skype:' . $value . '?chat'; + $protocols[] = 'skype'; } - $value = '' . esc_html( $alt ) . ''; + $value = '' . esc_html( $alt ) . ''; } else { // check $value is oEmbed if ( 'oembed' === $data['type'] ) { @@ -545,7 +529,7 @@ function um_profile_field_filter_hook__( $value, $data, $type = '' ) { if ( ! is_array( $value ) ) { if ( is_email( $value ) ) { - $value = '' . $value . ''; + $value = '' . $value . ''; } } else { $value = implode( ', ', $value ); diff --git a/includes/core/um-filters-login.php b/includes/core/um-filters-login.php index 18af141c..a5369469 100644 --- a/includes/core/um-filters-login.php +++ b/includes/core/um-filters-login.php @@ -53,45 +53,46 @@ function um_wp_form_errors_hook_ip_test( $user, $username, $password ) { } add_filter( 'authenticate', 'um_wp_form_errors_hook_ip_test', 10, 3 ); - /** * Login checks through the WordPress admin login. * - * @param $user - * @param $username - * @param $password + * @param WP_Error|WP_User $user * * @return WP_Error|WP_User */ -function um_wp_form_errors_hook_logincheck( $user, $username, $password ) { +function um_wp_form_errors_hook_logincheck( $user ) { + if ( is_wp_error( $user ) ) { + return $user; + } if ( isset( $user->ID ) ) { - um_fetch_user( $user->ID ); $status = um_user( 'account_status' ); - switch( $status ) { + $error = null; + switch ( $status ) { case 'inactive': - return new WP_Error( $status, __( 'Your account has been disabled.', 'ultimate-member' ) ); + $error = new WP_Error( $status, __( 'Your account has been disabled.', 'ultimate-member' ) ); break; case 'awaiting_admin_review': - return new WP_Error( $status, __( 'Your account has not been approved yet.', 'ultimate-member' ) ); + $error = new WP_Error( $status, __( 'Your account has not been approved yet.', 'ultimate-member' ) ); break; case 'awaiting_email_confirmation': - return new WP_Error( $status, __( 'Your account is awaiting e-mail verification.', 'ultimate-member' ) ); + $error = new WP_Error( $status, __( 'Your account is awaiting email verification.', 'ultimate-member' ) ); break; case 'rejected': - return new WP_Error( $status, __( 'Your membership request has been rejected.', 'ultimate-member' ) ); + $error = new WP_Error( $status, __( 'Your membership request has been rejected.', 'ultimate-member' ) ); break; } + if ( null !== $error ) { + return $error; + } } return $user; - } -add_filter( 'authenticate', 'um_wp_form_errors_hook_logincheck', 50, 3 ); - +add_filter( 'authenticate', 'um_wp_form_errors_hook_logincheck', 50 ); /** * Change lost password url in UM Login form diff --git a/includes/core/um-filters-user.php b/includes/core/um-filters-user.php index 455651ca..2ff9e293 100644 --- a/includes/core/um-filters-user.php +++ b/includes/core/um-filters-user.php @@ -34,7 +34,7 @@ function um_admin_user_actions_hook( $actions, $user_id ) { } if ( 'awaiting_email_confirmation' === $account_status ) { - $actions['um_resend_activation'] = array( 'label' => __( 'Resend Activation E-mail', 'ultimate-member' ) ); + $actions['um_resend_activation'] = array( 'label' => __( 'Resend Activation Email', 'ultimate-member' ) ); } if ( 'inactive' !== $account_status ) { diff --git a/includes/um-deprecated-hooks.php b/includes/um-deprecated-hooks.php new file mode 100644 index 00000000..86a01327 --- /dev/null +++ b/includes/um-deprecated-hooks.php @@ -0,0 +1,47 @@ +Change UM language locale. + * function my_um_language_locale( $language_locale ) { + * $language_locale = 'es_ES'; + * return $language_locale; + * } + * add_filter( 'um_language_locale', 'my_um_language_locale' ); + */ + +/** + * Filters the path to the language file (*.mo). + * + * @param {string} $language_file Default path to the language file. + * + * @return {string} Language file path. + * + * @since 1.3.x + * @depecated 2.8.5 Used WordPress native `load_plugin_textdomain()`. And can be replaced via WordPress native hook 'load_textdomain_mofile'. + * @hook um_language_file + * + * @example Change UM language file path. + * function my_um_language_file( $language_file ) { + * $language_file = '{path-to-language-file}'; + * return $language_file; + * } + * add_filter( 'um_language_file', 'my_um_language_file' ); + */ diff --git a/includes/um-short-functions.php b/includes/um-short-functions.php index 2a63b100..a26f0d5a 100644 --- a/includes/um-short-functions.php +++ b/includes/um-short-functions.php @@ -870,7 +870,7 @@ function um_user_submited_display( $k, $title, $data = array(), $style = true ) } if ( ! empty( $filedata['original_name'] ) ) { - $v = '' . esc_html( $filedata['original_name'] ) . ''; + $v = '' . esc_html( $filedata['original_name'] ) . ''; } else { $v = $baseurl . um_user( 'ID' ) . '/' . $file; } @@ -1751,7 +1751,7 @@ function um_can_edit_my_profile() { /** - * Short for admin e-mail + * Short for admin email * * @return mixed|string|void */ @@ -1761,7 +1761,7 @@ function um_admin_email() { /** - * Get admin e-mails + * Get admin emails * * @return array */ diff --git a/languages/ultimate-member.pot b/languages/ultimate-member.pot index d8099916..a3f827e6 100644 --- a/languages/ultimate-member.pot +++ b/languages/ultimate-member.pot @@ -2,32 +2,35 @@ # This file is distributed under the same license as the Ultimate Member plugin. msgid "" msgstr "" -"Project-Id-Version: Ultimate Member 2.8.2\n" +"Project-Id-Version: Ultimate Member 2.8.4\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/ultimate-member\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2024-01-15T10:58:42+00:00\n" +"POT-Creation-Date: 2024-03-06T15:02:09+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.9.0\n" +"X-Generator: WP-CLI 2.10.0\n" "X-Domain: ultimate-member\n" #. Plugin Name of the plugin #. Author of the plugin -#: includes/admin/class-site-health.php:101 -#: includes/admin/core/class-admin-menu.php:147 +#: ultimate-member.php +#: includes/admin/class-site-health.php:159 +#: includes/admin/core/class-admin-menu.php:183 #: includes/core/class-user.php:1061 msgid "Ultimate Member" msgstr "" #. Plugin URI of the plugin #. Author URI of the plugin +#: ultimate-member.php msgid "http://ultimatemember.com/" msgstr "" #. Description of the plugin +#: ultimate-member.php msgid "The easiest way to create powerful online communities and beautiful user profiles with WordPress" msgstr "" @@ -36,88 +39,89 @@ msgstr "" msgid "Wrong Nonce" msgstr "" -#: includes/admin/class-admin.php:840 -#: includes/admin/class-site-health.php:1812 +#: includes/admin/class-admin.php:843 +#: includes/admin/class-site-health.php:1870 #: includes/admin/templates/directory/sorting.php:68 -#: includes/core/class-member-directory.php:394 +#: includes/core/class-member-directory.php:411 msgid "Other (Custom Field)" msgstr "" -#: includes/admin/class-admin.php:1719 -#: includes/admin/class-secure.php:102 -#: includes/admin/class-secure.php:139 -#: includes/admin/core/class-admin-settings.php:3678 +#: includes/admin/class-admin.php:1797 +#: includes/admin/class-secure.php:96 +#: includes/admin/class-secure.php:133 msgid "Security check" msgstr "" -#: includes/admin/class-admin.php:1723 +#: includes/admin/class-admin.php:1801 msgid "Wrong ID" msgstr "" #. translators: %s - Form title -#: includes/admin/class-admin.php:1731 +#: includes/admin/class-admin.php:1809 msgid "Duplicate of %s" msgstr "" -#: includes/admin/class-admin.php:1862 +#: includes/admin/class-admin.php:1929 msgid "Docs" msgstr "" -#: includes/admin/class-admin.php:1863 -#: includes/admin/core/class-admin-settings.php:1952 +#: includes/admin/class-admin.php:1930 +#: includes/admin/core/class-admin-menu.php:195 msgid "Settings" msgstr "" -#: includes/admin/class-admin.php:1887 -#: includes/admin/core/class-admin-notices.php:1093 -#: includes/admin/core/class-admin-settings.php:2234 +#: includes/admin/class-admin.php:1954 +#: includes/admin/core/class-admin-notices.php:1033 +#: includes/admin/core/class-admin-settings.php:2552 #: includes/ajax/class-secure.php:34 msgid "Security Check" msgstr "" -#: includes/admin/class-admin.php:1949 -#: includes/admin/class-admin.php:1952 +#: includes/admin/class-admin.php:2016 +#: includes/admin/class-admin.php:2019 msgid "Form updated." msgstr "" -#: includes/admin/class-admin.php:1950 +#: includes/admin/class-admin.php:2017 msgid "Custom field updated." msgstr "" -#: includes/admin/class-admin.php:1951 +#: includes/admin/class-admin.php:2018 msgid "Custom field deleted." msgstr "" -#: includes/admin/class-admin.php:1953 +#: includes/admin/class-admin.php:2020 msgid "Form restored to revision." msgstr "" -#: includes/admin/class-admin.php:1954 +#: includes/admin/class-admin.php:2021 msgid "Form created." msgstr "" -#: includes/admin/class-admin.php:1955 +#: includes/admin/class-admin.php:2022 msgid "Form saved." msgstr "" -#: includes/admin/class-admin.php:1956 +#: includes/admin/class-admin.php:2023 msgid "Form submitted." msgstr "" -#: includes/admin/class-admin.php:1957 +#: includes/admin/class-admin.php:2024 msgid "Form scheduled." msgstr "" -#: includes/admin/class-admin.php:1958 +#: includes/admin/class-admin.php:2025 msgid "Form draft updated." msgstr "" #: includes/admin/class-enqueue.php:114 -#: includes/admin/core/class-admin-settings.php:1099 +#: includes/admin/core/class-admin-settings.php:1100 +#: includes/admin/core/class-admin-settings.php:2092 msgid "General" msgstr "" #: includes/admin/class-enqueue.php:118 +#: includes/admin/core/class-admin-settings.php:1215 #: includes/core/class-builtin.php:796 #: includes/core/class-builtin.php:799 #: includes/core/class-builtin.php:1357 @@ -147,164 +151,208 @@ msgstr "" msgid "Delete" msgstr "" -#: includes/admin/class-enqueue.php:529 +#: includes/admin/class-enqueue.php:530 msgid "Ultimate Member Blocks" msgstr "" -#: includes/admin/class-secure.php:144 +#: includes/admin/class-secure.php:138 msgid "Invalid user." msgstr "" -#: includes/admin/class-secure.php:202 +#: includes/admin/class-secure.php:196 msgid "Scan Now" msgstr "" -#: includes/admin/class-secure.php:204 +#: includes/admin/class-secure.php:198 msgid "Last scan:" msgstr "" -#: includes/admin/class-secure.php:208 -#: includes/admin/class-secure.php:331 +#: includes/admin/class-secure.php:202 +#: includes/admin/class-secure.php:336 msgid "ago" msgstr "" -#: includes/admin/class-secure.php:210 +#: includes/admin/class-secure.php:204 msgid "Not Completed." msgstr "" -#: includes/admin/class-secure.php:213 +#: includes/admin/class-secure.php:207 msgid "Not Scanned yet." msgstr "" -#: includes/admin/class-secure.php:227 -#: includes/admin/class-site-health.php:921 +#: includes/admin/class-secure.php:221 +#: includes/admin/class-site-health.php:979 msgid "Banned Administrative Capabilities" msgstr "" #. translators: %s are disabled default capabilities that are enabled by default. -#: includes/admin/class-secure.php:229 +#: includes/admin/class-secure.php:223 msgid "All the above are default Administrator & Super Admin capabilities. When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be flagged with this option. The %s capabilities are locked to ensure no users will be created with these capabilities." msgstr "" -#: includes/admin/class-secure.php:234 +#: includes/admin/class-secure.php:228 msgid "Scanner" msgstr "" -#: includes/admin/class-secure.php:236 +#: includes/admin/class-secure.php:230 msgid "Scan your site to check for vulnerabilities prior to Ultimate Member version 2.6.7 and get recommendations to secure your site." msgstr "" -#: includes/admin/class-secure.php:241 -#: includes/admin/class-site-health.php:925 +#: includes/admin/class-secure.php:235 +#: includes/admin/class-site-health.php:983 msgid "Lock All Register Forms" msgstr "" -#: includes/admin/class-secure.php:242 +#: includes/admin/class-secure.php:236 +msgid "Lock Forms" +msgstr "" + +#: includes/admin/class-secure.php:237 msgid "This prevents all users from registering with Ultimate Member on your site." msgstr "" -#: includes/admin/class-secure.php:247 -#: includes/admin/class-site-health.php:929 +#: includes/admin/class-secure.php:242 +#: includes/admin/class-site-health.php:987 msgid "Display Login form notice to reset passwords" msgstr "" -#: includes/admin/class-secure.php:248 -msgid "Enforces users to reset their passwords( one-time ) and prevent from entering old password." +#: includes/admin/class-secure.php:243 +msgid "Enable Login form notice" msgstr "" -#: includes/admin/class-secure.php:257 +#: includes/admin/class-secure.php:244 +msgid "Enforces users to reset their passwords (one-time) and prevent from entering old password." +msgstr "" + +#: includes/admin/class-secure.php:253 msgid "Expire All Users Sessions" msgstr "" #. translators: %d is the users count. -#: includes/admin/class-secure.php:259 +#: includes/admin/class-secure.php:255 msgid "Are you sure that you want to make all users sessions expired?" msgstr "" #. translators: %d is the users count. -#: includes/admin/class-secure.php:259 +#: includes/admin/class-secure.php:255 msgid "Logout Users (%d)" msgstr "" -#: includes/admin/class-secure.php:260 +#: includes/admin/class-secure.php:256 msgid "This will log out all users on your site and forces them to reset passwords
    when \"Display Login form notice to reset passwords\" is enabled/checked." msgstr "" -#: includes/admin/class-secure.php:270 -#: includes/admin/class-site-health.php:933 +#: includes/admin/class-secure.php:266 +msgid "Administrative capabilities ban" +msgstr "" + +#: includes/admin/class-secure.php:267 +#: includes/admin/class-site-health.php:991 msgid "Enable ban for administrative capabilities" msgstr "" -#: includes/admin/class-secure.php:271 +#: includes/admin/class-secure.php:268 msgid " When someone tries to inject capabilities to the Account, Profile & Register forms submission, it will be banned." msgstr "" -#: includes/admin/class-secure.php:276 -#: includes/admin/class-site-health.php:941 +#: includes/admin/class-secure.php:273 +#: includes/admin/class-site-health.php:999 msgid "Notify Administrators" msgstr "" -#: includes/admin/class-secure.php:277 +#: includes/admin/class-secure.php:274 +msgid "Enable notification" +msgstr "" + +#: includes/admin/class-secure.php:275 msgid "When enabled, All administrators will be notified when someone has suspicious activities in the Account, Profile & Register forms." msgstr "" -#: includes/admin/class-secure.php:284 -#: includes/admin/class-site-health.php:946 +#: includes/admin/class-secure.php:282 +#: includes/admin/class-site-health.php:1004 msgid "Send Immediately" msgstr "" -#: includes/admin/class-secure.php:285 -#: includes/admin/class-site-health.php:947 +#: includes/admin/class-secure.php:283 +#: includes/admin/class-site-health.php:1005 msgid "Hourly" msgstr "" -#: includes/admin/class-secure.php:286 -#: includes/admin/class-site-health.php:948 +#: includes/admin/class-secure.php:284 +#: includes/admin/class-site-health.php:1006 msgid "Daily" msgstr "" -#: includes/admin/class-secure.php:288 -#: includes/admin/class-site-health.php:952 +#: includes/admin/class-secure.php:286 +#: includes/admin/class-site-health.php:1010 msgid "Notification Schedule" msgstr "" -#: includes/admin/class-secure.php:294 +#: includes/admin/class-secure.php:292 msgid "Allowed hosts for safe redirect (one host per line)" msgstr "" -#: includes/admin/class-secure.php:295 -msgid "Extend allowed hosts for frontend pages redirects" +#: includes/admin/class-secure.php:293 +msgid "Extend allowed hosts for frontend pages redirects." msgstr "" -#: includes/admin/class-secure.php:301 -msgid "Secure" +#: includes/admin/class-secure.php:303 +msgid "Security" msgstr "" -#: includes/admin/class-secure.php:326 +#: includes/admin/class-secure.php:304 +msgid "This feature scans for suspicious registered accounts, bans the usage of administrative capabilities to site subscribers/members, allows the website administrators to force all users to reset their passwords, preventing users from logging-in using their old passwords that may have been exposed." +msgstr "" + +#: includes/admin/class-secure.php:331 msgid "Blocked Due to Suspicious Activity" msgstr "" -#: includes/admin/class-secure.php:329 +#: includes/admin/class-secure.php:334 msgid "Are you sure that you want to restore this account after getting flagged for suspicious activity?" msgstr "" -#: includes/admin/class-secure.php:329 +#: includes/admin/class-secure.php:334 msgid "Restore Account" msgstr "" -#: includes/admin/class-site-health.php:53 +#: includes/admin/class-site-health.php:38 +msgid "Are the Ultimate Member templates out of date?" +msgstr "" + +#: includes/admin/class-site-health.php:48 +msgid "You have the most recent version of custom Ultimate Member templates" +msgstr "" + +#: includes/admin/class-site-health.php:56 +msgid "Your custom Ultimate Member templates that are situated in the theme have the most recent version and are ready to use." +msgstr "" + +#: includes/admin/class-site-health.php:63 +msgid "Your custom templates are out of date" +msgstr "" + +#: includes/admin/class-site-health.php:68 +msgid "Your custom Ultimate Member templates that are situated in the theme are out of date and may break the website's functionality." +msgstr "" + +#: includes/admin/class-site-health.php:73 +msgid "Check status and update" +msgstr "" + +#: includes/admin/class-site-health.php:111 msgid "Row: " msgstr "" -#: includes/admin/class-site-health.php:53 +#: includes/admin/class-site-health.php:111 msgid "Field: " msgstr "" -#: includes/admin/class-site-health.php:93 +#: includes/admin/class-site-health.php:151 #: includes/admin/core/class-admin-columns.php:197 #: includes/admin/core/class-admin-columns.php:230 -#: includes/admin/core/class-admin-settings.php:1065 -#: includes/admin/core/class-admin-settings.php:1220 +#: includes/admin/core/class-admin-settings.php:1269 +#: includes/admin/core/class-admin-settings.php:1377 #: includes/admin/core/list-tables/roles-list-table.php:435 #: includes/admin/core/list-tables/roles-list-table.php:443 #: includes/admin/core/packages/2.1.3-beta3/functions.php:75 @@ -334,11 +382,11 @@ msgstr "" msgid "Yes" msgstr "" -#: includes/admin/class-site-health.php:94 +#: includes/admin/class-site-health.php:152 #: includes/admin/core/class-admin-columns.php:197 #: includes/admin/core/class-admin-columns.php:230 -#: includes/admin/core/class-admin-settings.php:1064 -#: includes/admin/core/class-admin-settings.php:1219 +#: includes/admin/core/class-admin-settings.php:1268 +#: includes/admin/core/class-admin-settings.php:1376 #: includes/admin/core/list-tables/roles-list-table.php:435 #: includes/admin/core/list-tables/roles-list-table.php:443 #: includes/admin/templates/form/login_customize.php:27 @@ -365,7 +413,7 @@ msgstr "" msgid "No" msgstr "" -#: includes/admin/class-site-health.php:95 +#: includes/admin/class-site-health.php:153 #: includes/admin/core/class-admin-users.php:402 #: includes/admin/core/class-admin-users.php:404 #: includes/blocks/um-account/build/index.js:1 @@ -373,15 +421,15 @@ msgstr "" msgid "All" msgstr "" -#: includes/admin/class-site-health.php:96 -#: includes/admin/class-site-health.php:218 -#: includes/admin/class-site-health.php:813 -#: includes/admin/class-site-health.php:1197 -#: includes/admin/class-site-health.php:1631 +#: includes/admin/class-site-health.php:154 +#: includes/admin/class-site-health.php:276 +#: includes/admin/class-site-health.php:871 +#: includes/admin/class-site-health.php:1255 +#: includes/admin/class-site-health.php:1689 #: includes/admin/core/class-admin-columns.php:145 #: includes/admin/core/class-admin-columns.php:164 -#: includes/admin/core/class-admin-settings.php:1167 -#: includes/admin/core/class-admin-settings.php:1695 +#: includes/admin/core/class-admin-settings.php:1120 +#: includes/admin/core/class-admin-settings.php:1185 #: includes/admin/templates/form/login_settings.php:19 #: includes/admin/templates/form/register_customize.php:9 #: includes/admin/templates/form/register_customize.php:42 @@ -389,880 +437,866 @@ msgstr "" msgid "Default" msgstr "" -#: includes/admin/class-site-health.php:97 +#: includes/admin/class-site-health.php:155 msgid "No predefined page" msgstr "" -#: includes/admin/class-site-health.php:102 +#: includes/admin/class-site-health.php:160 msgid "This debug information for your Ultimate Member installation can assist you in getting support." msgstr "" #. translators: %1$s is a predefined page title; %2$d is a predefined page ID; %3$s is a predefined page permalink. -#: includes/admin/class-site-health.php:123 +#: includes/admin/class-site-health.php:181 msgid "%1$s (ID#%2$d) | %3$s" msgstr "" -#: includes/admin/class-site-health.php:130 -#: includes/admin/core/class-admin-settings.php:1102 +#: includes/admin/class-site-health.php:188 +#: includes/admin/core/class-admin-settings.php:1103 msgid "Pages" msgstr "" -#: includes/admin/class-site-health.php:141 -#: includes/admin/core/class-admin-settings.php:1112 +#: includes/admin/class-site-health.php:199 +#: includes/admin/core/class-admin-settings.php:1127 msgid "Profile Permalink Base" msgstr "" -#: includes/admin/class-site-health.php:145 -#: includes/admin/core/class-admin-settings.php:1130 +#: includes/admin/class-site-health.php:203 +#: includes/admin/core/class-admin-settings.php:1145 msgid "User Display Name" msgstr "" -#: includes/admin/class-site-health.php:149 -#: includes/admin/core/class-admin-settings.php:1146 +#: includes/admin/class-site-health.php:207 msgid "Automatically redirect author page to their profile?" msgstr "" -#: includes/admin/class-site-health.php:153 -#: includes/admin/core/class-admin-settings.php:1152 +#: includes/admin/class-site-health.php:211 +#: includes/admin/core/class-admin-settings.php:1169 msgid "Enable Members Directory" msgstr "" -#: includes/admin/class-site-health.php:157 -#: includes/admin/core/class-admin-settings.php:1189 +#: includes/admin/class-site-health.php:215 msgid "Show/hide password button" msgstr "" -#: includes/admin/class-site-health.php:161 -#: includes/admin/class-site-health.php:165 -#: includes/admin/class-site-health.php:169 +#: includes/admin/class-site-health.php:219 +#: includes/admin/class-site-health.php:223 +#: includes/admin/class-site-health.php:227 +#: includes/admin/core/class-admin-settings.php:1228 #: includes/ajax/class-secure.php:421 msgid "Require Strong Passwords" msgstr "" -#: includes/admin/class-site-health.php:173 -#: includes/admin/class-site-health.php:1233 -#: includes/admin/core/class-admin-settings.php:1216 +#: includes/admin/class-site-health.php:231 +#: includes/admin/class-site-health.php:1291 +#: includes/admin/core/class-admin-settings.php:1265 #: includes/admin/templates/role/profile.php:49 msgid "Avoid indexing profile by search engines" msgstr "" -#: includes/admin/class-site-health.php:177 -#: includes/admin/core/class-admin-settings.php:1226 +#: includes/admin/class-site-health.php:235 msgid "Activation link lifetime" msgstr "" -#: includes/admin/class-site-health.php:181 -#: includes/admin/core/class-admin-settings.php:1158 +#: includes/admin/class-site-health.php:239 msgid "Use Gravatars?" msgstr "" -#: includes/admin/class-site-health.php:185 -#: includes/admin/core/class-admin-settings.php:1233 +#: includes/admin/class-site-health.php:243 msgid "Deleting user comments after deleting a user" msgstr "" -#: includes/admin/class-site-health.php:196 -#: includes/admin/core/class-admin-settings.php:1121 +#: includes/admin/class-site-health.php:254 +#: includes/admin/core/class-admin-settings.php:1136 msgid "Profile Permalink Base Custom Meta Key" msgstr "" -#: includes/admin/class-site-health.php:209 -#: includes/admin/core/class-admin-settings.php:1138 +#: includes/admin/class-site-health.php:267 +#: includes/admin/core/class-admin-settings.php:1153 msgid "Display Name Custom Field(s)" msgstr "" -#: includes/admin/class-site-health.php:219 -#: includes/admin/core/class-admin-settings.php:1168 +#: includes/admin/class-site-health.php:277 +#: includes/admin/core/class-admin-settings.php:1186 msgid "404 ( File Not Found response )" msgstr "" -#: includes/admin/class-site-health.php:220 -#: includes/admin/core/class-admin-settings.php:1169 +#: includes/admin/class-site-health.php:278 +#: includes/admin/core/class-admin-settings.php:1187 msgid "Mystery Man" msgstr "" -#: includes/admin/class-site-health.php:221 -#: includes/admin/core/class-admin-settings.php:1170 +#: includes/admin/class-site-health.php:279 +#: includes/admin/core/class-admin-settings.php:1188 msgid "Identicon" msgstr "" -#: includes/admin/class-site-health.php:222 -#: includes/admin/core/class-admin-settings.php:1171 +#: includes/admin/class-site-health.php:280 +#: includes/admin/core/class-admin-settings.php:1189 msgid "Monsterid" msgstr "" -#: includes/admin/class-site-health.php:223 -#: includes/admin/core/class-admin-settings.php:1172 +#: includes/admin/class-site-health.php:281 +#: includes/admin/core/class-admin-settings.php:1190 msgid "Wavatar" msgstr "" -#: includes/admin/class-site-health.php:224 -#: includes/admin/core/class-admin-settings.php:1173 +#: includes/admin/class-site-health.php:282 +#: includes/admin/core/class-admin-settings.php:1191 msgid "Retro" msgstr "" -#: includes/admin/class-site-health.php:225 -#: includes/admin/core/class-admin-settings.php:1174 +#: includes/admin/class-site-health.php:283 +#: includes/admin/core/class-admin-settings.php:1192 msgid "Blank ( a transparent PNG image )" msgstr "" -#: includes/admin/class-site-health.php:229 -#: includes/admin/core/class-admin-settings.php:1164 +#: includes/admin/class-site-health.php:287 +#: includes/admin/core/class-admin-settings.php:1182 msgid "Use Gravatar builtin image" msgstr "" -#: includes/admin/class-site-health.php:234 -#: includes/admin/core/class-admin-settings.php:1182 +#: includes/admin/class-site-health.php:292 msgid "Use Default plugin avatar as Gravatar's Default avatar" msgstr "" -#: includes/admin/class-site-health.php:243 -#: includes/admin/core/class-admin-settings.php:968 +#: includes/admin/class-site-health.php:301 +#: includes/admin/core/class-admin-settings.php:1345 msgid "Password Account Tab" msgstr "" -#: includes/admin/class-site-health.php:247 -#: includes/admin/core/class-admin-settings.php:974 +#: includes/admin/class-site-health.php:305 +#: includes/admin/core/class-admin-settings.php:1358 msgid "Privacy Account Tab" msgstr "" -#: includes/admin/class-site-health.php:254 -#: includes/admin/core/class-admin-settings.php:983 +#: includes/admin/class-site-health.php:312 +#: includes/admin/core/class-admin-settings.php:1391 msgid "Notifications Account Tab" msgstr "" -#: includes/admin/class-site-health.php:263 -#: includes/admin/core/class-admin-settings.php:998 +#: includes/admin/class-site-health.php:321 +#: includes/admin/core/class-admin-settings.php:1404 msgid "Delete Account Tab" msgstr "" -#: includes/admin/class-site-health.php:267 -#: includes/admin/core/class-admin-settings.php:1004 +#: includes/admin/class-site-health.php:325 msgid "Account Deletion Custom Text" msgstr "" -#: includes/admin/class-site-health.php:271 -#: includes/admin/core/class-admin-settings.php:1013 +#: includes/admin/class-site-health.php:329 msgid "Account Deletion without password Custom Text" msgstr "" -#: includes/admin/class-site-health.php:275 -#: includes/admin/core/class-admin-settings.php:1022 +#: includes/admin/class-site-health.php:333 msgid "Add a First & Last Name fields" msgstr "" -#: includes/admin/class-site-health.php:283 +#: includes/admin/class-site-health.php:341 +#: includes/admin/core/class-admin-settings.php:1309 msgid "Disable First & Last name field editing" msgstr "" -#: includes/admin/class-site-health.php:287 -#: includes/admin/core/class-admin-settings.php:1035 +#: includes/admin/class-site-health.php:345 +#: includes/admin/core/class-admin-settings.php:1317 msgid "Require First & Last Name" msgstr "" -#: includes/admin/class-site-health.php:293 -#: includes/admin/core/class-admin-settings.php:1042 -msgid "Allow users to change e-mail" +#: includes/admin/class-site-health.php:351 +#: includes/admin/core/class-admin-settings.php:1325 +msgid "Allow users to change email" msgstr "" -#: includes/admin/class-site-health.php:298 -#: includes/admin/core/class-admin-settings.php:1048 +#: includes/admin/class-site-health.php:356 msgid "Password is required?" msgstr "" -#: includes/admin/class-site-health.php:303 -#: includes/admin/core/class-admin-settings.php:1054 +#: includes/admin/class-site-health.php:361 +#: includes/admin/core/class-admin-settings.php:1365 msgid "Allow users to hide their profiles from directory" msgstr "" -#: includes/admin/class-site-health.php:309 -#: includes/admin/core/class-admin-settings.php:1061 +#: includes/admin/class-site-health.php:367 +#: includes/admin/core/class-admin-settings.php:1373 msgid "Hide profiles from directory by default" msgstr "" -#: includes/admin/class-site-health.php:331 -#: includes/admin/core/class-admin-settings.php:1249 +#: includes/admin/class-site-health.php:389 +#: includes/admin/core/class-admin-settings.php:1470 msgid "Profile Photo Maximum File Size (bytes)" msgstr "" -#: includes/admin/class-site-health.php:335 -#: includes/admin/core/class-admin-settings.php:1256 +#: includes/admin/class-site-health.php:393 +#: includes/admin/core/class-admin-settings.php:1493 msgid "Cover Photo Maximum File Size (bytes)" msgstr "" -#: includes/admin/class-site-health.php:339 -#: includes/admin/core/class-admin-settings.php:1263 +#: includes/admin/class-site-health.php:397 +#: includes/admin/core/class-admin-settings.php:1477 msgid "Profile Photo Thumbnail Sizes (px)" msgstr "" -#: includes/admin/class-site-health.php:343 -#: includes/admin/core/class-admin-settings.php:1273 +#: includes/admin/class-site-health.php:401 +#: includes/admin/core/class-admin-settings.php:1507 msgid "Cover Photo Thumbnail Sizes (px)" msgstr "" -#: includes/admin/class-site-health.php:347 -#: includes/admin/core/class-admin-settings.php:1282 +#: includes/admin/class-site-health.php:405 +#: includes/admin/core/class-admin-settings.php:1442 msgid "Change image orientation" msgstr "" -#: includes/admin/class-site-health.php:351 -#: includes/admin/core/class-admin-settings.php:1289 +#: includes/admin/class-site-health.php:409 +#: includes/admin/core/class-admin-settings.php:1450 msgid "Image Quality" msgstr "" -#: includes/admin/class-site-health.php:355 -#: includes/admin/core/class-admin-settings.php:1297 +#: includes/admin/class-site-health.php:413 +#: includes/admin/core/class-admin-settings.php:1457 msgid "Image Upload Maximum Width (px)" msgstr "" -#: includes/admin/class-site-health.php:359 -#: includes/admin/core/class-admin-settings.php:1305 +#: includes/admin/class-site-health.php:417 +#: includes/admin/core/class-admin-settings.php:1500 msgid "Cover Photo Minimum Width (px)" msgstr "" -#: includes/admin/class-site-health.php:384 -#: includes/admin/core/class-admin-settings.php:475 +#: includes/admin/class-site-health.php:442 +#: includes/admin/core/class-admin-settings.php:573 msgid "Global Site Access" msgstr "" -#: includes/admin/class-site-health.php:385 -#: includes/admin/core/class-admin-settings.php:478 +#: includes/admin/class-site-health.php:443 +#: includes/admin/core/class-admin-settings.php:576 msgid "Site accessible to Everyone" msgstr "" -#: includes/admin/class-site-health.php:385 -#: includes/admin/core/class-admin-settings.php:479 +#: includes/admin/class-site-health.php:443 +#: includes/admin/core/class-admin-settings.php:577 msgid "Site accessible to Logged In Users" msgstr "" -#: includes/admin/class-site-health.php:396 -#: includes/admin/core/class-admin-settings.php:486 +#: includes/admin/class-site-health.php:454 +#: includes/admin/core/class-admin-settings.php:584 msgid "Custom Redirect URL" msgstr "" -#: includes/admin/class-site-health.php:400 -#: includes/admin/core/class-admin-settings.php:493 +#: includes/admin/class-site-health.php:458 +#: includes/admin/core/class-admin-settings.php:591 msgid "Exclude the following URLs" msgstr "" -#: includes/admin/class-site-health.php:404 -#: includes/admin/core/class-admin-settings.php:502 +#: includes/admin/class-site-health.php:462 +#: includes/admin/core/class-admin-settings.php:600 msgid "Allow Homepage to be accessible" msgstr "" -#: includes/admin/class-site-health.php:408 -#: includes/admin/core/class-admin-settings.php:508 +#: includes/admin/class-site-health.php:466 +#: includes/admin/core/class-admin-settings.php:607 msgid "Allow Category pages to be accessible" msgstr "" -#: includes/admin/class-site-health.php:414 +#: includes/admin/class-site-health.php:472 msgid "Restricted Content Titles" msgstr "" -#: includes/admin/class-site-health.php:419 +#: includes/admin/class-site-health.php:477 msgid "Restricted Content Title Text" msgstr "" -#: includes/admin/class-site-health.php:425 -#: includes/admin/core/class-admin-settings.php:527 +#: includes/admin/class-site-health.php:483 +#: includes/admin/core/class-admin-settings.php:628 msgid "Restricted Access Message" msgstr "" -#: includes/admin/class-site-health.php:429 -#: includes/admin/core/class-admin-settings.php:570 +#: includes/admin/class-site-health.php:487 +#: includes/admin/core/class-admin-settings.php:672 msgid "Enable the \"Content Restriction\" settings for the Gutenberg Blocks" msgstr "" -#: includes/admin/class-site-health.php:434 -#: includes/admin/core/class-admin-settings.php:575 +#: includes/admin/class-site-health.php:492 +#: includes/admin/core/class-admin-settings.php:678 msgid "Restricted Access Block Message" msgstr "" -#: includes/admin/class-site-health.php:439 -#: includes/admin/core/class-admin-settings.php:606 +#: includes/admin/class-site-health.php:497 +#: includes/admin/core/class-admin-settings.php:709 msgid "Enable the \"Content Restriction\" settings for post types" msgstr "" -#: includes/admin/class-site-health.php:443 -#: includes/admin/core/class-admin-settings.php:616 +#: includes/admin/class-site-health.php:501 +#: includes/admin/core/class-admin-settings.php:719 msgid "Enable the \"Content Restriction\" settings for taxonomies" msgstr "" -#: includes/admin/class-site-health.php:454 -#: includes/admin/core/class-admin-settings.php:1325 +#: includes/admin/class-site-health.php:512 +#: includes/admin/core/class-admin-settings.php:1538 msgid "Enable the Reset Password Limit?" msgstr "" -#: includes/admin/class-site-health.php:460 +#: includes/admin/class-site-health.php:518 msgid "Reset Password Limit " msgstr "" -#: includes/admin/class-site-health.php:465 +#: includes/admin/class-site-health.php:523 msgid "Change Password request limit " msgstr "" -#: includes/admin/class-site-health.php:469 +#: includes/admin/class-site-health.php:527 msgid "Blocked Email Addresses" msgstr "" -#: includes/admin/class-site-health.php:473 +#: includes/admin/class-site-health.php:531 msgid "Blacklist Words" msgstr "" -#: includes/admin/class-site-health.php:477 +#: includes/admin/class-site-health.php:535 msgid "Allowed Choice Callbacks" msgstr "" -#: includes/admin/class-site-health.php:481 +#: includes/admin/class-site-health.php:539 msgid "Allow external link redirect confirm " msgstr "" -#: includes/admin/class-site-health.php:488 -#: includes/admin/core/class-admin-settings.php:1376 -msgid "Admin E-mail Address" +#: includes/admin/class-site-health.php:546 +#: includes/admin/core/class-admin-settings.php:1591 +msgid "Admin Email Address" msgstr "" -#: includes/admin/class-site-health.php:492 -#: includes/admin/core/class-admin-settings.php:1382 +#: includes/admin/class-site-health.php:550 +#: includes/admin/core/class-admin-settings.php:1597 msgid "Mail appears from" msgstr "" -#: includes/admin/class-site-health.php:496 -#: includes/admin/core/class-admin-settings.php:1388 +#: includes/admin/class-site-health.php:554 +#: includes/admin/core/class-admin-settings.php:1603 msgid "Mail appears from address" msgstr "" -#: includes/admin/class-site-health.php:500 -#: includes/admin/core/class-admin-settings.php:1394 -msgid "Use HTML for E-mails?" +#: includes/admin/class-site-health.php:558 +msgid "Use HTML for Emails?" msgstr "" #. translators: %s is email template title. -#: includes/admin/class-site-health.php:510 +#: includes/admin/class-site-health.php:568 msgid "\"%s\" Subject" msgstr "" #. translators: %s is email template title. -#: includes/admin/class-site-health.php:516 +#: includes/admin/class-site-health.php:574 msgid "Template \"%s\" in theme?" msgstr "" -#: includes/admin/class-site-health.php:525 -#: includes/admin/core/class-admin-settings.php:1437 -#: includes/admin/core/class-admin-settings.php:1650 -#: includes/admin/core/class-admin-settings.php:1740 +#: includes/admin/class-site-health.php:583 +#: includes/admin/core/class-admin-settings.php:1844 +#: includes/admin/core/class-admin-settings.php:1960 +#: includes/admin/core/class-admin-settings.php:2070 #: includes/admin/templates/form/login_customize.php:54 #: includes/admin/templates/form/profile_customize.php:87 #: includes/admin/templates/form/register_customize.php:68 msgid "Show inside text field" msgstr "" -#: includes/admin/class-site-health.php:526 -#: includes/admin/core/class-admin-settings.php:1438 -#: includes/admin/core/class-admin-settings.php:1651 -#: includes/admin/core/class-admin-settings.php:1741 +#: includes/admin/class-site-health.php:584 +#: includes/admin/core/class-admin-settings.php:1845 +#: includes/admin/core/class-admin-settings.php:1961 +#: includes/admin/core/class-admin-settings.php:2071 #: includes/admin/templates/form/login_customize.php:55 #: includes/admin/templates/form/profile_customize.php:88 #: includes/admin/templates/form/register_customize.php:69 msgid "Show with label" msgstr "" -#: includes/admin/class-site-health.php:527 -#: includes/admin/core/class-admin-settings.php:1439 -#: includes/admin/core/class-admin-settings.php:1652 -#: includes/admin/core/class-admin-settings.php:1742 +#: includes/admin/class-site-health.php:585 +#: includes/admin/core/class-admin-settings.php:1846 +#: includes/admin/core/class-admin-settings.php:1962 +#: includes/admin/core/class-admin-settings.php:2072 #: includes/admin/templates/form/login_customize.php:56 #: includes/admin/templates/form/profile_customize.php:89 #: includes/admin/templates/form/register_customize.php:70 msgid "Turn off" msgstr "" -#: includes/admin/class-site-health.php:530 -#: includes/admin/core/class-admin-settings.php:1584 +#: includes/admin/class-site-health.php:588 +#: includes/admin/core/class-admin-settings.php:1801 msgid "Bottom of Icon" msgstr "" -#: includes/admin/class-site-health.php:531 -#: includes/admin/core/class-admin-settings.php:1585 +#: includes/admin/class-site-health.php:589 +#: includes/admin/core/class-admin-settings.php:1802 msgid "Left of Icon (right for RTL)" msgstr "" -#: includes/admin/class-site-health.php:536 -#: includes/admin/class-site-health.php:767 -#: includes/admin/class-site-health.php:819 +#: includes/admin/class-site-health.php:594 +#: includes/admin/class-site-health.php:825 +#: includes/admin/class-site-health.php:877 msgid "No template name" msgstr "" -#: includes/admin/class-site-health.php:543 -#: includes/admin/core/class-admin-settings.php:1408 +#: includes/admin/class-site-health.php:601 +#: includes/admin/core/class-admin-settings.php:1636 msgid "Profile Default Template" msgstr "" #. translators: %1$s - profile template name, %2$s - profile template filename #. translators: %1$s - register template name, %2$s - register template filename #. translators: %1$s - login template name, %2$s - login template filename -#: includes/admin/class-site-health.php:545 -#: includes/admin/class-site-health.php:779 -#: includes/admin/class-site-health.php:825 +#: includes/admin/class-site-health.php:603 +#: includes/admin/class-site-health.php:837 +#: includes/admin/class-site-health.php:883 msgid "%1$s (filename: %2$s.php)" msgstr "" -#: includes/admin/class-site-health.php:548 -#: includes/admin/core/class-admin-settings.php:1417 +#: includes/admin/class-site-health.php:606 +#: includes/admin/core/class-admin-settings.php:1645 msgid "Profile Maximum Width" msgstr "" -#: includes/admin/class-site-health.php:552 -#: includes/admin/core/class-admin-settings.php:1425 +#: includes/admin/class-site-health.php:610 +#: includes/admin/core/class-admin-settings.php:1653 msgid "Profile Area Maximum Width" msgstr "" -#: includes/admin/class-site-health.php:556 -#: includes/admin/core/class-admin-settings.php:1433 +#: includes/admin/class-site-health.php:614 +#: includes/admin/core/class-admin-settings.php:1840 msgid "Profile Field Icons" msgstr "" -#: includes/admin/class-site-health.php:560 -#: includes/admin/core/class-admin-settings.php:1446 +#: includes/admin/class-site-health.php:618 +#: includes/admin/core/class-admin-settings.php:1815 msgid "Profile Primary Button Text" msgstr "" -#: includes/admin/class-site-health.php:564 -#: includes/admin/core/class-admin-settings.php:1454 +#: includes/admin/class-site-health.php:622 +#: includes/admin/core/class-admin-settings.php:1823 msgid "Profile Secondary Button" msgstr "" -#: includes/admin/class-site-health.php:570 +#: includes/admin/class-site-health.php:628 msgid "Profile Secondary Button Text " msgstr "" -#: includes/admin/class-site-health.php:579 -#: includes/admin/core/class-admin-settings.php:1470 +#: includes/admin/class-site-health.php:637 +#: includes/admin/core/class-admin-settings.php:1667 msgid "Default Profile Photo" msgstr "" -#: includes/admin/class-site-health.php:583 -#: includes/admin/core/class-admin-settings.php:1482 +#: includes/admin/class-site-health.php:641 +#: includes/admin/core/class-admin-settings.php:1702 msgid "Default Cover Photo" msgstr "" -#: includes/admin/class-site-health.php:587 -#: includes/admin/class-site-health.php:1713 -#: includes/admin/core/class-admin-settings.php:1489 +#: includes/admin/class-site-health.php:645 +#: includes/admin/class-site-health.php:1771 +#: includes/admin/core/class-admin-settings.php:1678 #: includes/admin/templates/form/profile_customize.php:157 msgid "Disable Profile Photo Upload" msgstr "" -#: includes/admin/class-site-health.php:591 -#: includes/admin/core/class-admin-settings.php:1496 +#: includes/admin/class-site-health.php:649 +#: includes/admin/core/class-admin-settings.php:1685 #: includes/admin/templates/form/profile_customize.php:169 msgid "Profile Photo Size" msgstr "" -#: includes/admin/class-site-health.php:595 -#: includes/admin/core/class-admin-settings.php:1505 +#: includes/admin/class-site-health.php:653 +#: includes/admin/core/class-admin-settings.php:1710 msgid "Profile Cover Photos" msgstr "" -#: includes/admin/class-site-health.php:600 -#: includes/admin/core/class-admin-settings.php:1512 +#: includes/admin/class-site-health.php:658 +#: includes/admin/core/class-admin-settings.php:1718 msgid "Profile Cover Size" msgstr "" -#: includes/admin/class-site-health.php:604 -#: includes/admin/core/class-admin-settings.php:1522 +#: includes/admin/class-site-health.php:662 +#: includes/admin/core/class-admin-settings.php:1728 msgid "Profile Cover Ratio" msgstr "" -#: includes/admin/class-site-health.php:609 -#: includes/admin/core/class-admin-settings.php:1537 +#: includes/admin/class-site-health.php:667 +#: includes/admin/core/class-admin-settings.php:1749 msgid "Profile Header Meta Text Icon" msgstr "" -#: includes/admin/class-site-health.php:613 -#: includes/admin/core/class-admin-settings.php:1544 +#: includes/admin/class-site-health.php:671 +#: includes/admin/core/class-admin-settings.php:1758 msgid "Show display name in profile header" msgstr "" -#: includes/admin/class-site-health.php:617 -#: includes/admin/core/class-admin-settings.php:1551 +#: includes/admin/class-site-health.php:675 +#: includes/admin/core/class-admin-settings.php:1766 msgid "Show social links in profile header" msgstr "" -#: includes/admin/class-site-health.php:621 -#: includes/admin/core/class-admin-settings.php:1558 +#: includes/admin/class-site-health.php:679 msgid "Show user description in header" msgstr "" -#: includes/admin/class-site-health.php:625 -#: includes/admin/core/class-admin-settings.php:1565 +#: includes/admin/class-site-health.php:683 +#: includes/admin/core/class-admin-settings.php:1791 msgid "Enable HTML support for user description" msgstr "" -#: includes/admin/class-site-health.php:629 -#: includes/admin/core/class-admin-settings.php:1571 +#: includes/admin/class-site-health.php:687 +#: includes/admin/core/class-admin-settings.php:1781 msgid "User description maximum chars" msgstr "" -#: includes/admin/class-site-health.php:633 -#: includes/admin/core/class-admin-settings.php:1580 +#: includes/admin/class-site-health.php:691 +#: includes/admin/core/class-admin-settings.php:1797 msgid "Profile Header Menu Position" msgstr "" -#: includes/admin/class-site-health.php:637 -#: includes/admin/core/class-admin-settings.php:1592 +#: includes/admin/class-site-health.php:695 +#: includes/admin/core/class-admin-settings.php:1854 msgid "Show a custom message if profile is empty" msgstr "" -#: includes/admin/class-site-health.php:642 -#: includes/admin/core/class-admin-settings.php:1599 +#: includes/admin/class-site-health.php:700 +#: includes/admin/core/class-admin-settings.php:1862 msgid "Show the emoticon" msgstr "" -#: includes/admin/class-site-health.php:651 -#: includes/admin/core/class-admin-settings.php:303 +#: includes/admin/class-site-health.php:709 +#: includes/admin/core/class-admin-settings.php:392 msgid "Enable profile menu" msgstr "" #. translators: %s Profile Tab Title #. translators: %s: Tab title -#: includes/admin/class-site-health.php:685 -#: includes/admin/core/class-admin-settings.php:332 -#: includes/admin/core/class-admin-settings.php:348 +#: includes/admin/class-site-health.php:743 +#: includes/admin/core/class-admin-settings.php:421 +#: includes/admin/core/class-admin-settings.php:439 msgid "%s Tab" msgstr "" #. translators: %s Profile Tab Title #. translators: %s: Tab title -#: includes/admin/class-site-health.php:694 -#: includes/admin/core/class-admin-settings.php:356 +#: includes/admin/class-site-health.php:752 +#: includes/admin/core/class-admin-settings.php:448 msgid "Who can see %s Tab?" msgstr "" -#: includes/admin/class-site-health.php:740 +#: includes/admin/class-site-health.php:798 #: includes/core/class-profile.php:152 msgid "About" msgstr "" -#: includes/admin/class-site-health.php:744 +#: includes/admin/class-site-health.php:802 #: includes/core/class-profile.php:156 msgid "Posts" msgstr "" -#: includes/admin/class-site-health.php:748 +#: includes/admin/class-site-health.php:806 #: includes/core/class-profile.php:160 msgid "Comments" msgstr "" -#: includes/admin/class-site-health.php:755 -#: includes/admin/core/class-admin-settings.php:397 +#: includes/admin/class-site-health.php:813 +#: includes/admin/core/class-admin-settings.php:489 msgid "Profile menu default tab" msgstr "" -#: includes/admin/class-site-health.php:759 -#: includes/admin/core/class-admin-settings.php:414 +#: includes/admin/class-site-health.php:817 +#: includes/admin/core/class-admin-settings.php:507 msgid "Enable menu icons in desktop view" msgstr "" -#: includes/admin/class-site-health.php:771 -#: includes/admin/core/class-admin-settings.php:1637 -#: includes/admin/core/class-admin-settings.php:1727 +#: includes/admin/class-site-health.php:829 +#: includes/admin/core/class-admin-settings.php:1907 +#: includes/admin/core/class-admin-settings.php:2001 msgid "Centered" msgstr "" -#: includes/admin/class-site-health.php:772 -#: includes/admin/core/class-admin-settings.php:1638 -#: includes/admin/core/class-admin-settings.php:1728 +#: includes/admin/class-site-health.php:830 +#: includes/admin/core/class-admin-settings.php:1908 +#: includes/admin/core/class-admin-settings.php:2002 msgid "Left aligned" msgstr "" -#: includes/admin/class-site-health.php:773 -#: includes/admin/core/class-admin-settings.php:1639 -#: includes/admin/core/class-admin-settings.php:1729 +#: includes/admin/class-site-health.php:831 +#: includes/admin/core/class-admin-settings.php:1909 +#: includes/admin/core/class-admin-settings.php:2003 msgid "Right aligned" msgstr "" -#: includes/admin/class-site-health.php:777 -#: includes/admin/core/class-admin-settings.php:1616 +#: includes/admin/class-site-health.php:835 +#: includes/admin/core/class-admin-settings.php:1886 msgid "Registration Default Template" msgstr "" -#: includes/admin/class-site-health.php:782 -#: includes/admin/core/class-admin-settings.php:1625 +#: includes/admin/class-site-health.php:840 +#: includes/admin/core/class-admin-settings.php:1895 msgid "Registration Maximum Width" msgstr "" -#: includes/admin/class-site-health.php:786 -#: includes/admin/core/class-admin-settings.php:1633 +#: includes/admin/class-site-health.php:844 +#: includes/admin/core/class-admin-settings.php:1903 msgid "Registration Shortcode Alignment" msgstr "" -#: includes/admin/class-site-health.php:790 -#: includes/admin/core/class-admin-settings.php:1646 +#: includes/admin/class-site-health.php:848 +#: includes/admin/core/class-admin-settings.php:1956 msgid "Registration Field Icons" msgstr "" -#: includes/admin/class-site-health.php:794 +#: includes/admin/class-site-health.php:852 msgid "Registration Primary Button Text " msgstr "" -#: includes/admin/class-site-health.php:798 -#: includes/admin/core/class-admin-settings.php:1667 +#: includes/admin/class-site-health.php:856 +#: includes/admin/core/class-admin-settings.php:1930 msgid "Registration Secondary Button" msgstr "" -#: includes/admin/class-site-health.php:803 -#: includes/admin/core/class-admin-settings.php:1674 +#: includes/admin/class-site-health.php:861 +#: includes/admin/core/class-admin-settings.php:1938 msgid "Registration Secondary Button Text" msgstr "" -#: includes/admin/class-site-health.php:807 -#: includes/admin/core/class-admin-settings.php:1683 +#: includes/admin/class-site-health.php:865 +#: includes/admin/core/class-admin-settings.php:1947 msgid "Registration Secondary Button URL" msgstr "" -#: includes/admin/class-site-health.php:812 -#: includes/admin/core/class-admin-settings.php:1692 +#: includes/admin/class-site-health.php:870 +#: includes/admin/core/class-admin-settings.php:1117 msgid "Registration Default Role" msgstr "" -#: includes/admin/class-site-health.php:823 -#: includes/admin/core/class-admin-settings.php:1706 +#: includes/admin/class-site-health.php:881 +#: includes/admin/core/class-admin-settings.php:1980 msgid "Login Default Template" msgstr "" -#: includes/admin/class-site-health.php:828 -#: includes/admin/core/class-admin-settings.php:1715 +#: includes/admin/class-site-health.php:886 +#: includes/admin/core/class-admin-settings.php:1989 msgid "Login Maximum Width" msgstr "" -#: includes/admin/class-site-health.php:832 -#: includes/admin/core/class-admin-settings.php:1723 +#: includes/admin/class-site-health.php:890 +#: includes/admin/core/class-admin-settings.php:1997 msgid "Login Shortcode Alignment" msgstr "" -#: includes/admin/class-site-health.php:836 -#: includes/admin/core/class-admin-settings.php:1736 +#: includes/admin/class-site-health.php:894 +#: includes/admin/core/class-admin-settings.php:2066 msgid "Login Field Icons" msgstr "" -#: includes/admin/class-site-health.php:840 -#: includes/admin/core/class-admin-settings.php:1749 +#: includes/admin/class-site-health.php:898 +#: includes/admin/core/class-admin-settings.php:2016 msgid "Login Primary Button Text" msgstr "" -#: includes/admin/class-site-health.php:844 -#: includes/admin/core/class-admin-settings.php:1757 +#: includes/admin/class-site-health.php:902 +#: includes/admin/core/class-admin-settings.php:2024 msgid "Login Secondary Button" msgstr "" -#: includes/admin/class-site-health.php:849 -#: includes/admin/core/class-admin-settings.php:1764 +#: includes/admin/class-site-health.php:907 +#: includes/admin/core/class-admin-settings.php:2032 msgid "Login Secondary Button Text" msgstr "" -#: includes/admin/class-site-health.php:853 -#: includes/admin/core/class-admin-settings.php:1773 +#: includes/admin/class-site-health.php:911 +#: includes/admin/core/class-admin-settings.php:2041 msgid "Login Secondary Button URL" msgstr "" -#: includes/admin/class-site-health.php:858 -#: includes/admin/core/class-admin-settings.php:1782 +#: includes/admin/class-site-health.php:916 +#: includes/admin/core/class-admin-settings.php:2050 msgid "Login Forgot Password Link" msgstr "" -#: includes/admin/class-site-health.php:862 -#: includes/admin/core/class-admin-settings.php:1789 +#: includes/admin/class-site-health.php:920 msgid "Show \"Remember Me\"" msgstr "" -#: includes/admin/class-site-health.php:869 -#: includes/admin/core/class-admin-settings.php:1809 +#: includes/admin/class-site-health.php:927 +#: includes/admin/core/class-admin-settings.php:2099 msgid "Show an asterisk for required fields" msgstr "" -#: includes/admin/class-site-health.php:873 -#: includes/admin/core/class-admin-settings.php:1814 +#: includes/admin/class-site-health.php:931 +#: includes/admin/core/class-admin-settings.php:1275 msgid "User Profile Title" msgstr "" -#: includes/admin/class-site-health.php:877 -#: includes/admin/core/class-admin-settings.php:1821 +#: includes/admin/class-site-health.php:935 +#: includes/admin/core/class-admin-settings.php:1282 msgid "User Profile Dynamic Meta Description" msgstr "" -#: includes/admin/class-site-health.php:881 -#: includes/admin/core/class-admin-settings.php:1830 +#: includes/admin/class-site-health.php:939 msgid "Disable Cache User Profile" msgstr "" -#: includes/admin/class-site-health.php:885 -#: includes/admin/core/class-admin-settings.php:1836 +#: includes/admin/class-site-health.php:943 +#: includes/admin/core/class-admin-settings.php:2144 msgid "Enable Gutenberg Blocks" msgstr "" -#: includes/admin/class-site-health.php:889 -#: includes/admin/core/class-admin-settings.php:1842 +#: includes/admin/class-site-health.php:947 msgid "REST API version" msgstr "" -#: includes/admin/class-site-health.php:893 -#: includes/admin/core/class-admin-settings.php:1854 +#: includes/admin/class-site-health.php:951 msgid "Disable pre-queries for restriction content logic (advanced)" msgstr "" -#: includes/admin/class-site-health.php:897 -#: includes/admin/core/class-admin-settings.php:644 +#: includes/admin/class-site-health.php:955 +#: includes/admin/core/class-admin-settings.php:748 msgid "Enable custom table for usermeta" msgstr "" -#: includes/admin/class-site-health.php:901 -#: includes/admin/core/class-admin-settings.php:1861 +#: includes/admin/class-site-health.php:959 +#: includes/admin/core/class-admin-settings.php:2111 msgid "Remove Data on Uninstall?" msgstr "" -#: includes/admin/class-site-health.php:962 +#: includes/admin/class-site-health.php:1020 msgid "Allowed hosts for safe redirect" msgstr "" -#: includes/admin/class-site-health.php:969 -#: includes/admin/core/class-admin-settings.php:1801 +#: includes/admin/class-site-health.php:1027 +#: includes/admin/core/class-admin-settings.php:2086 msgid "Licenses" msgstr "" -#: includes/admin/class-site-health.php:1014 +#: includes/admin/class-site-health.php:1072 msgid "User roles" msgstr "" -#: includes/admin/class-site-health.php:1015 +#: includes/admin/class-site-health.php:1073 msgid "This debug information about user roles." msgstr "" -#: includes/admin/class-site-health.php:1018 +#: includes/admin/class-site-health.php:1076 msgid "User Roles (priority)" msgstr "" -#: includes/admin/class-site-health.php:1022 +#: includes/admin/class-site-health.php:1080 msgid "WordPress Default New User Role" msgstr "" -#: includes/admin/class-site-health.php:1039 +#: includes/admin/class-site-health.php:1097 msgid " role settings" msgstr "" -#: includes/admin/class-site-health.php:1040 +#: includes/admin/class-site-health.php:1098 msgid "This debug information about user role." msgstr "" -#: includes/admin/class-site-health.php:1049 +#: includes/admin/class-site-health.php:1107 #: includes/admin/templates/role/admin-permissions.php:14 msgid "Can access wp-admin?" msgstr "" -#: includes/admin/class-site-health.php:1061 +#: includes/admin/class-site-health.php:1119 #: includes/admin/templates/role/admin-permissions.php:21 msgid "Force hiding adminbar in frontend?" msgstr "" -#: includes/admin/class-site-health.php:1073 +#: includes/admin/class-site-health.php:1131 #: includes/admin/templates/role/admin-permissions.php:28 msgid "Can edit other member accounts?" msgstr "" -#: includes/admin/class-site-health.php:1095 +#: includes/admin/class-site-health.php:1153 #: includes/admin/templates/role/admin-permissions.php:35 msgid "Can edit these user roles only" msgstr "" -#: includes/admin/class-site-health.php:1107 +#: includes/admin/class-site-health.php:1165 #: includes/admin/templates/role/admin-permissions.php:45 msgid "Can delete other member accounts?" msgstr "" -#: includes/admin/class-site-health.php:1129 +#: includes/admin/class-site-health.php:1187 #: includes/admin/templates/role/admin-permissions.php:52 msgid "Can delete these user roles only" msgstr "" -#: includes/admin/class-site-health.php:1141 +#: includes/admin/class-site-health.php:1199 #: includes/admin/templates/role/general.php:14 msgid "Can edit their profile?" msgstr "" -#: includes/admin/class-site-health.php:1153 +#: includes/admin/class-site-health.php:1211 #: includes/admin/templates/role/general.php:21 msgid "Can delete their account?" msgstr "" -#: includes/admin/class-site-health.php:1165 +#: includes/admin/class-site-health.php:1223 #: includes/admin/templates/role/profile.php:14 msgid "Can view other member profiles?" msgstr "" -#: includes/admin/class-site-health.php:1187 +#: includes/admin/class-site-health.php:1245 #: includes/admin/templates/role/profile.php:21 msgid "Can view these user roles only" msgstr "" -#: includes/admin/class-site-health.php:1202 +#: includes/admin/class-site-health.php:1260 msgid "No such option" msgstr "" -#: includes/admin/class-site-health.php:1210 +#: includes/admin/class-site-health.php:1268 #: includes/admin/templates/role/profile.php:32 msgid "Can make their profile private?" msgstr "" -#: includes/admin/class-site-health.php:1222 +#: includes/admin/class-site-health.php:1280 #: includes/admin/templates/role/profile.php:40 msgid "Can view/access private profiles?" msgstr "" -#: includes/admin/class-site-health.php:1237 +#: includes/admin/class-site-health.php:1295 #: includes/admin/templates/role/home.php:15 msgid "Can view default homepage?" msgstr "" -#: includes/admin/class-site-health.php:1248 -#: includes/admin/class-site-health.php:1284 +#: includes/admin/class-site-health.php:1306 +#: includes/admin/class-site-health.php:1342 #: includes/admin/templates/role/home.php:22 msgid "Custom Homepage Redirect" msgstr "" -#: includes/admin/class-site-health.php:1256 +#: includes/admin/class-site-health.php:1314 #: includes/admin/templates/role/register.php:18 msgid "Auto Approve" msgstr "" -#: includes/admin/class-site-health.php:1257 +#: includes/admin/class-site-health.php:1315 #: includes/admin/templates/role/register.php:19 msgid "Require Email Activation" msgstr "" -#: includes/admin/class-site-health.php:1258 +#: includes/admin/class-site-health.php:1316 #: includes/admin/templates/role/register.php:20 msgid "Require Admin Review" msgstr "" -#: includes/admin/class-site-health.php:1266 +#: includes/admin/class-site-health.php:1324 #: includes/admin/templates/role/register.php:14 msgid "Registration Status" msgstr "" -#: includes/admin/class-site-health.php:1275 -#: includes/admin/class-site-health.php:1419 -#: includes/admin/class-site-health.php:1632 +#: includes/admin/class-site-health.php:1333 +#: includes/admin/class-site-health.php:1477 +#: includes/admin/class-site-health.php:1690 #: includes/admin/templates/form/login_settings.php:20 #: includes/admin/templates/role/login.php:19 #: includes/admin/templates/role/register.php:30 msgid "Redirect to profile" msgstr "" -#: includes/admin/class-site-health.php:1276 -#: includes/admin/class-site-health.php:1307 -#: includes/admin/class-site-health.php:1376 -#: includes/admin/class-site-health.php:1420 -#: includes/admin/class-site-health.php:1633 +#: includes/admin/class-site-health.php:1334 +#: includes/admin/class-site-health.php:1365 +#: includes/admin/class-site-health.php:1434 +#: includes/admin/class-site-health.php:1478 +#: includes/admin/class-site-health.php:1691 #: includes/admin/templates/form/login_settings.php:21 #: includes/admin/templates/role/login.php:20 #: includes/admin/templates/role/register.php:31 @@ -1271,13 +1305,13 @@ msgstr "" msgid "Redirect to URL" msgstr "" -#: includes/admin/class-site-health.php:1296 -#: includes/admin/class-site-health.php:1352 -#: includes/admin/class-site-health.php:1409 -#: includes/admin/class-site-health.php:1443 -#: includes/admin/class-site-health.php:1476 -#: includes/admin/class-site-health.php:1505 -#: includes/admin/class-site-health.php:1672 +#: includes/admin/class-site-health.php:1354 +#: includes/admin/class-site-health.php:1410 +#: includes/admin/class-site-health.php:1467 +#: includes/admin/class-site-health.php:1501 +#: includes/admin/class-site-health.php:1534 +#: includes/admin/class-site-health.php:1563 +#: includes/admin/class-site-health.php:1730 #: includes/admin/templates/form/login_settings.php:29 #: includes/admin/templates/role/delete.php:26 #: includes/admin/templates/role/login.php:28 @@ -1288,107 +1322,107 @@ msgstr "" msgid "Set Custom Redirect URL" msgstr "" -#: includes/admin/class-site-health.php:1306 -#: includes/admin/class-site-health.php:1375 +#: includes/admin/class-site-health.php:1364 +#: includes/admin/class-site-health.php:1433 #: includes/admin/templates/role/register.php:57 #: includes/admin/templates/role/register.php:91 #: assets/js/admin/block-restrictions.js:162 msgid "Show custom message" msgstr "" -#: includes/admin/class-site-health.php:1315 +#: includes/admin/class-site-health.php:1373 #: includes/admin/templates/role/register.php:45 msgid "Login user after validating the activation link?" msgstr "" -#: includes/admin/class-site-health.php:1327 -#: includes/admin/class-site-health.php:1384 +#: includes/admin/class-site-health.php:1385 +#: includes/admin/class-site-health.php:1442 #: includes/admin/templates/role/register.php:26 #: includes/admin/templates/role/register.php:53 #: includes/admin/templates/role/register.php:87 msgid "Action to be taken after registration" msgstr "" -#: includes/admin/class-site-health.php:1340 -#: includes/admin/class-site-health.php:1397 +#: includes/admin/class-site-health.php:1398 +#: includes/admin/class-site-health.php:1455 #: includes/admin/templates/role/register.php:65 #: includes/admin/templates/role/register.php:99 msgid "Personalize the custom message" msgstr "" -#: includes/admin/class-site-health.php:1365 +#: includes/admin/class-site-health.php:1423 #: includes/admin/templates/role/register.php:79 -msgid "URL redirect after e-mail activation" +msgid "URL redirect after email activation" msgstr "" -#: includes/admin/class-site-health.php:1421 -#: includes/admin/class-site-health.php:1634 +#: includes/admin/class-site-health.php:1479 +#: includes/admin/class-site-health.php:1692 #: includes/admin/templates/form/login_settings.php:22 #: includes/admin/templates/role/login.php:21 msgid "Refresh active page" msgstr "" -#: includes/admin/class-site-health.php:1422 -#: includes/admin/class-site-health.php:1635 +#: includes/admin/class-site-health.php:1480 +#: includes/admin/class-site-health.php:1693 #: includes/admin/templates/form/login_settings.php:23 #: includes/admin/templates/role/login.php:22 msgid "Redirect to WordPress Admin" msgstr "" -#: includes/admin/class-site-health.php:1430 +#: includes/admin/class-site-health.php:1488 #: includes/admin/templates/role/login.php:15 msgid "Action to be taken after login" msgstr "" -#: includes/admin/class-site-health.php:1452 +#: includes/admin/class-site-health.php:1510 #: includes/admin/templates/role/delete.php:19 #: includes/admin/templates/role/logout.php:19 msgid "Go to Homepage" msgstr "" -#: includes/admin/class-site-health.php:1453 +#: includes/admin/class-site-health.php:1511 #: includes/admin/templates/role/delete.php:20 #: includes/admin/templates/role/logout.php:20 msgid "Go to Custom URL" msgstr "" -#: includes/admin/class-site-health.php:1463 +#: includes/admin/class-site-health.php:1521 #: includes/admin/templates/role/logout.php:15 msgid "Action to be taken after logout" msgstr "" -#: includes/admin/class-site-health.php:1492 +#: includes/admin/class-site-health.php:1550 #: includes/admin/templates/role/delete.php:15 msgid "Action to be taken after account is deleted" msgstr "" -#: includes/admin/class-site-health.php:1519 +#: includes/admin/class-site-health.php:1577 #: includes/admin/core/class-admin-metabox.php:997 msgid "WP Capabilities" msgstr "" -#: includes/admin/class-site-health.php:1533 +#: includes/admin/class-site-health.php:1591 msgid "Ultimate Member Forms" msgstr "" -#: includes/admin/class-site-health.php:1534 +#: includes/admin/class-site-health.php:1592 msgid "This debug information for your Ultimate Member forms." msgstr "" -#: includes/admin/class-site-health.php:1537 +#: includes/admin/class-site-health.php:1595 msgid "UM Forms" msgstr "" -#: includes/admin/class-site-health.php:1549 +#: includes/admin/class-site-health.php:1607 msgid " form settings" msgstr "" -#: includes/admin/class-site-health.php:1550 +#: includes/admin/class-site-health.php:1608 msgid "This debug information for your Ultimate Member form." msgstr "" -#: includes/admin/class-site-health.php:1553 -#: includes/admin/class-site-health.php:1841 +#: includes/admin/class-site-health.php:1611 +#: includes/admin/class-site-health.php:1899 #: includes/admin/core/class-admin-columns.php:146 #: includes/admin/core/class-admin-columns.php:165 #: includes/admin/core/class-admin-metabox.php:864 @@ -1396,21 +1430,24 @@ msgstr "" msgid "Shortcode" msgstr "" -#: includes/admin/class-site-health.php:1557 +#: includes/admin/class-site-health.php:1615 #: includes/admin/core/class-admin-columns.php:144 msgid "Type" msgstr "" -#: includes/admin/class-site-health.php:1568 +#: includes/admin/class-site-health.php:1626 msgid "User registration role" msgstr "" -#: includes/admin/class-site-health.php:1572 -#: includes/admin/class-site-health.php:1645 -#: includes/admin/class-site-health.php:1701 -#: includes/admin/class-site-health.php:1845 -#: includes/admin/core/list-tables/version-template-list-table.php:170 -#: includes/admin/core/list-tables/version-template-list-table.php:200 +#: includes/admin/class-site-health.php:1630 +#: includes/admin/class-site-health.php:1703 +#: includes/admin/class-site-health.php:1759 +#: includes/admin/class-site-health.php:1903 +#: includes/admin/core/class-admin-settings.php:1630 +#: includes/admin/core/class-admin-settings.php:1880 +#: includes/admin/core/class-admin-settings.php:1974 +#: includes/admin/core/list-tables/version-template-list-table.php:179 +#: includes/admin/core/list-tables/version-template-list-table.php:209 #: includes/admin/templates/directory/appearance.php:17 #: includes/admin/templates/form/login_customize.php:34 #: includes/admin/templates/form/profile_customize.php:59 @@ -1418,483 +1455,484 @@ msgstr "" msgid "Template" msgstr "" -#: includes/admin/class-site-health.php:1576 -#: includes/admin/class-site-health.php:1649 -#: includes/admin/class-site-health.php:1705 +#: includes/admin/class-site-health.php:1634 +#: includes/admin/class-site-health.php:1707 +#: includes/admin/class-site-health.php:1763 #: includes/admin/templates/form/login_customize.php:63 #: includes/admin/templates/form/profile_customize.php:96 #: includes/admin/templates/form/register_customize.php:77 msgid "Primary Button Text" msgstr "" -#: includes/admin/class-site-health.php:1580 +#: includes/admin/class-site-health.php:1638 msgid "Enable privacy policy agreement" msgstr "" -#: includes/admin/class-site-health.php:1593 +#: includes/admin/class-site-health.php:1651 msgid "Privacy policy content" msgstr "" -#: includes/admin/class-site-health.php:1597 +#: includes/admin/class-site-health.php:1655 #: includes/admin/templates/form/register_gdpr.php:46 msgid "Toggle Show text" msgstr "" -#: includes/admin/class-site-health.php:1601 +#: includes/admin/class-site-health.php:1659 #: includes/admin/templates/form/register_gdpr.php:54 msgid "Toggle Hide text" msgstr "" -#: includes/admin/class-site-health.php:1605 +#: includes/admin/class-site-health.php:1663 #: includes/admin/templates/form/register_gdpr.php:62 msgid "Checkbox agreement description" msgstr "" -#: includes/admin/class-site-health.php:1609 +#: includes/admin/class-site-health.php:1667 #: includes/admin/templates/form/register_gdpr.php:70 msgid "Error Text" msgstr "" -#: includes/admin/class-site-health.php:1653 +#: includes/admin/class-site-health.php:1711 #: includes/admin/templates/form/login_customize.php:90 msgid "Show Forgot Password Link?" msgstr "" -#: includes/admin/class-site-health.php:1657 +#: includes/admin/class-site-health.php:1715 #: includes/admin/templates/form/login_customize.php:101 msgid "Show \"Remember Me\"?" msgstr "" -#: includes/admin/class-site-health.php:1661 +#: includes/admin/class-site-health.php:1719 #: includes/admin/templates/form/login_settings.php:15 msgid "Redirection after Login" msgstr "" -#: includes/admin/class-site-health.php:1697 +#: includes/admin/class-site-health.php:1755 #: includes/admin/templates/form/profile_customize.php:50 msgid "Make this profile form role-specific" msgstr "" -#: includes/admin/class-site-health.php:1709 +#: includes/admin/class-site-health.php:1767 +#: includes/admin/core/class-admin-settings.php:1711 #: includes/admin/templates/form/profile_customize.php:123 msgid "Enable Cover Photos" msgstr "" -#: includes/admin/class-site-health.php:1724 +#: includes/admin/class-site-health.php:1782 #: includes/admin/templates/form/profile_customize.php:178 msgid "Make Profile Photo Required" msgstr "" -#: includes/admin/class-site-health.php:1735 +#: includes/admin/class-site-health.php:1793 #: includes/admin/templates/form/profile_customize.php:190 msgid "Show display name in profile header?" msgstr "" -#: includes/admin/class-site-health.php:1739 +#: includes/admin/class-site-health.php:1797 #: includes/admin/templates/form/profile_customize.php:201 msgid "Show social links in profile header?" msgstr "" -#: includes/admin/class-site-health.php:1743 +#: includes/admin/class-site-health.php:1801 #: includes/admin/templates/form/profile_customize.php:212 msgid "Show user description in profile header?" msgstr "" -#: includes/admin/class-site-health.php:1768 +#: includes/admin/class-site-health.php:1826 msgid "Field to show in user meta" msgstr "" -#: includes/admin/class-site-health.php:1781 +#: includes/admin/class-site-health.php:1839 #: includes/core/class-builtin.php:935 #: includes/core/class-builtin.php:938 -#: includes/core/class-member-directory.php:401 +#: includes/core/class-member-directory.php:418 msgid "Country" msgstr "" -#: includes/admin/class-site-health.php:1782 +#: includes/admin/class-site-health.php:1840 #: includes/core/class-builtin.php:924 #: includes/core/class-builtin.php:927 -#: includes/core/class-member-directory.php:402 +#: includes/core/class-member-directory.php:419 msgid "Gender" msgstr "" -#: includes/admin/class-site-health.php:1783 +#: includes/admin/class-site-health.php:1841 #: includes/core/class-builtin.php:1207 -#: includes/core/class-member-directory.php:403 +#: includes/core/class-member-directory.php:420 msgid "Languages" msgstr "" -#: includes/admin/class-site-health.php:1784 +#: includes/admin/class-site-health.php:1842 #: includes/admin/core/list-tables/roles-list-table.php:26 #: includes/admin/core/list-tables/roles-list-table.php:117 #: includes/admin/core/list-tables/roles-list-table.php:466 -#: includes/core/class-member-directory.php:404 +#: includes/core/class-member-directory.php:421 msgid "Roles" msgstr "" -#: includes/admin/class-site-health.php:1785 -#: includes/core/class-member-directory.php:405 +#: includes/admin/class-site-health.php:1843 +#: includes/core/class-member-directory.php:422 #: includes/core/um-filters-fields.php:1018 #: includes/core/um-filters-fields.php:1035 msgid "Age" msgstr "" -#: includes/admin/class-site-health.php:1786 +#: includes/admin/class-site-health.php:1844 #: includes/core/class-builtin.php:863 #: includes/core/class-builtin.php:866 -#: includes/core/class-member-directory.php:406 +#: includes/core/class-member-directory.php:423 msgid "Last Login" msgstr "" -#: includes/admin/class-site-health.php:1787 -#: includes/core/class-member-directory.php:407 +#: includes/admin/class-site-health.php:1845 +#: includes/core/class-member-directory.php:424 msgid "User Registered" msgstr "" -#: includes/admin/class-site-health.php:1788 +#: includes/admin/class-site-health.php:1846 #: includes/core/class-builtin.php:811 #: includes/core/class-builtin.php:814 -#: includes/core/class-member-directory.php:408 +#: includes/core/class-member-directory.php:425 msgid "First Name" msgstr "" -#: includes/admin/class-site-health.php:1789 +#: includes/admin/class-site-health.php:1847 #: includes/core/class-builtin.php:821 #: includes/core/class-builtin.php:824 -#: includes/core/class-member-directory.php:409 +#: includes/core/class-member-directory.php:426 msgid "Last Name" msgstr "" -#: includes/admin/class-site-health.php:1790 -#: includes/class-config.php:797 +#: includes/admin/class-site-health.php:1848 +#: includes/class-config.php:804 #: includes/core/class-builtin.php:831 #: includes/core/class-builtin.php:834 -#: includes/core/class-member-directory.php:341 -#: includes/core/class-member-directory.php:410 +#: includes/core/class-member-directory.php:358 +#: includes/core/class-member-directory.php:427 msgid "Nickname" msgstr "" -#: includes/admin/class-site-health.php:1791 +#: includes/admin/class-site-health.php:1849 #: includes/core/class-builtin.php:885 #: includes/core/class-builtin.php:888 -#: includes/core/class-member-directory.php:411 -msgid "Secondary E-mail Address" +#: includes/core/class-member-directory.php:428 +msgid "Secondary Email Address" msgstr "" -#: includes/admin/class-site-health.php:1792 +#: includes/admin/class-site-health.php:1850 #: includes/core/class-builtin.php:897 #: includes/core/class-builtin.php:900 -#: includes/core/class-member-directory.php:412 +#: includes/core/class-member-directory.php:429 msgid "Biography" msgstr "" -#: includes/admin/class-site-health.php:1793 +#: includes/admin/class-site-health.php:1851 #: includes/core/class-builtin.php:1219 #: includes/core/class-builtin.php:1222 #: includes/core/class-builtin.php:1557 -#: includes/core/class-member-directory.php:413 +#: includes/core/class-member-directory.php:430 msgid "Phone Number" msgstr "" -#: includes/admin/class-site-health.php:1794 +#: includes/admin/class-site-health.php:1852 #: includes/core/class-builtin.php:1231 #: includes/core/class-builtin.php:1234 -#: includes/core/class-member-directory.php:414 +#: includes/core/class-member-directory.php:431 msgid "Mobile Number" msgstr "" -#: includes/admin/class-site-health.php:1795 +#: includes/admin/class-site-health.php:1853 #: includes/core/class-builtin.php:1184 msgid "Roles (Dropdown)" msgstr "" -#: includes/admin/class-site-health.php:1796 +#: includes/admin/class-site-health.php:1854 #: includes/core/class-builtin.php:1196 msgid "Roles (Radio)" msgstr "" -#: includes/admin/class-site-health.php:1797 +#: includes/admin/class-site-health.php:1855 #: includes/core/class-builtin.php:1048 #: includes/core/class-builtin.php:1051 msgid "WhatsApp number" msgstr "" -#: includes/admin/class-site-health.php:1798 +#: includes/admin/class-site-health.php:1856 #: includes/core/class-builtin.php:947 #: includes/core/class-builtin.php:950 msgid "Facebook" msgstr "" -#: includes/admin/class-site-health.php:1799 +#: includes/admin/class-site-health.php:1857 #: includes/core/class-builtin.php:965 msgid "X (formerly Twitter)" msgstr "" -#: includes/admin/class-site-health.php:1800 +#: includes/admin/class-site-health.php:1858 #: includes/core/class-builtin.php:1034 #: includes/core/class-builtin.php:1037 msgid "Viber number" msgstr "" -#: includes/admin/class-site-health.php:1801 +#: includes/admin/class-site-health.php:1859 #: includes/core/class-builtin.php:1019 #: includes/core/class-builtin.php:1022 #: includes/core/class-builtin.php:1558 msgid "Skype ID" msgstr "" -#: includes/admin/class-site-health.php:1802 +#: includes/admin/class-site-health.php:1860 #: includes/core/class-builtin.php:1062 #: includes/core/class-builtin.php:1065 msgid "Telegram" msgstr "" -#: includes/admin/class-site-health.php:1803 +#: includes/admin/class-site-health.php:1861 #: includes/core/class-builtin.php:1078 msgid "Discord" msgstr "" -#: includes/admin/class-site-health.php:1804 +#: includes/admin/class-site-health.php:1862 msgid "Youtube" msgstr "" -#: includes/admin/class-site-health.php:1805 +#: includes/admin/class-site-health.php:1863 #: includes/core/class-builtin.php:1166 #: includes/core/class-builtin.php:1169 msgid "SoundCloud" msgstr "" -#: includes/admin/class-site-health.php:1806 -#: includes/core/class-member-directory.php:338 +#: includes/admin/class-site-health.php:1864 +#: includes/core/class-member-directory.php:355 msgid "New users first" msgstr "" -#: includes/admin/class-site-health.php:1807 -#: includes/core/class-member-directory.php:339 +#: includes/admin/class-site-health.php:1865 +#: includes/core/class-member-directory.php:356 msgid "Old users first" msgstr "" -#: includes/admin/class-site-health.php:1808 -#: includes/class-config.php:785 -#: includes/class-config.php:798 +#: includes/admin/class-site-health.php:1866 +#: includes/class-config.php:792 +#: includes/class-config.php:805 #: includes/core/class-builtin.php:772 #: includes/core/class-builtin.php:775 -#: includes/core/class-member-directory.php:340 +#: includes/core/class-member-directory.php:357 msgid "Username" msgstr "" -#: includes/admin/class-site-health.php:1809 -#: includes/core/class-member-directory.php:344 +#: includes/admin/class-site-health.php:1867 +#: includes/core/class-member-directory.php:361 msgid "Display name" msgstr "" -#: includes/admin/class-site-health.php:1810 -#: includes/core/class-member-directory.php:345 +#: includes/admin/class-site-health.php:1868 +#: includes/core/class-member-directory.php:362 msgid "Last & First name" msgstr "" -#: includes/admin/class-site-health.php:1811 -#: includes/core/class-member-directory.php:393 +#: includes/admin/class-site-health.php:1869 +#: includes/core/class-member-directory.php:410 #: templates/members.php:102 msgid "Random" msgstr "" -#: includes/admin/class-site-health.php:1816 +#: includes/admin/class-site-health.php:1874 msgid "Ultimate Member Directories" msgstr "" -#: includes/admin/class-site-health.php:1817 +#: includes/admin/class-site-health.php:1875 msgid "This debug information about Ultimate Member directories." msgstr "" -#: includes/admin/class-site-health.php:1820 +#: includes/admin/class-site-health.php:1878 msgid "Member directories" msgstr "" -#: includes/admin/class-site-health.php:1837 +#: includes/admin/class-site-health.php:1895 msgid " directory settings" msgstr "" -#: includes/admin/class-site-health.php:1838 +#: includes/admin/class-site-health.php:1896 msgid "This debug information for your Ultimate Member directory." msgstr "" -#: includes/admin/class-site-health.php:1849 +#: includes/admin/class-site-health.php:1907 msgid "View types" msgstr "" -#: includes/admin/class-site-health.php:1853 +#: includes/admin/class-site-health.php:1911 #: includes/admin/templates/directory/general.php:57 msgid "Default view type" msgstr "" -#: includes/admin/class-site-health.php:1899 +#: includes/admin/class-site-health.php:1957 msgid "User Roles to display" msgstr "" -#: includes/admin/class-site-health.php:1903 -#: includes/admin/class-site-health.php:1907 +#: includes/admin/class-site-health.php:1961 +#: includes/admin/class-site-health.php:1965 #: includes/admin/templates/directory/general.php:75 msgid "Only show members who have uploaded a profile photo" msgstr "" -#: includes/admin/class-site-health.php:1911 +#: includes/admin/class-site-health.php:1969 #: includes/admin/templates/directory/general.php:88 msgid "Only show specific users (Enter one username per line)" msgstr "" -#: includes/admin/class-site-health.php:1915 +#: includes/admin/class-site-health.php:1973 #: includes/admin/templates/directory/general.php:94 msgid "Exclude specific users (Enter one username per line)" msgstr "" -#: includes/admin/class-site-health.php:1927 +#: includes/admin/class-site-health.php:1985 #: includes/admin/templates/directory/sorting.php:14 msgid "Default sort users by" msgstr "" -#: includes/admin/class-site-health.php:1938 +#: includes/admin/class-site-health.php:1996 #: includes/admin/templates/directory/sorting.php:59 msgid "Enable custom sorting" msgstr "" -#: includes/admin/class-site-health.php:1942 +#: includes/admin/class-site-health.php:2000 msgid "Custom sorting meta key" msgstr "" -#: includes/admin/class-site-health.php:1946 +#: includes/admin/class-site-health.php:2004 #: includes/admin/templates/directory/sorting.php:51 msgid "Label of custom sort" msgstr "" -#: includes/admin/class-site-health.php:1962 +#: includes/admin/class-site-health.php:2020 msgid "Field(s) to enable in sorting" msgstr "" -#: includes/admin/class-site-health.php:1963 +#: includes/admin/class-site-health.php:2021 msgid "Label: " msgstr "" -#: includes/admin/class-site-health.php:1963 +#: includes/admin/class-site-health.php:2021 msgid "Meta key: " msgstr "" -#: includes/admin/class-site-health.php:1977 +#: includes/admin/class-site-health.php:2035 msgid "Field to enable in sorting" msgstr "" -#: includes/admin/class-site-health.php:1991 +#: includes/admin/class-site-health.php:2049 #: includes/admin/templates/directory/profile.php:19 msgid "Enable Profile Photo" msgstr "" -#: includes/admin/class-site-health.php:1995 +#: includes/admin/class-site-health.php:2053 #: includes/admin/templates/directory/profile.php:25 msgid "Enable Cover Photo" msgstr "" -#: includes/admin/class-site-health.php:1999 +#: includes/admin/class-site-health.php:2057 #: includes/admin/templates/directory/profile.php:32 msgid "Show display name" msgstr "" -#: includes/admin/class-site-health.php:2011 +#: includes/admin/class-site-health.php:2069 #: includes/admin/templates/directory/profile.php:38 msgid "Show tagline below profile name" msgstr "" -#: includes/admin/class-site-health.php:2026 +#: includes/admin/class-site-health.php:2084 msgid "Field to display in tagline" msgstr "" -#: includes/admin/class-site-health.php:2039 +#: includes/admin/class-site-health.php:2097 #: includes/admin/templates/directory/profile.php:55 msgid "Show extra user information below tagline?" msgstr "" -#: includes/admin/class-site-health.php:2054 +#: includes/admin/class-site-health.php:2112 msgid "Field to display in extra user information section" msgstr "" -#: includes/admin/class-site-health.php:2067 +#: includes/admin/class-site-health.php:2125 #: includes/admin/templates/directory/profile.php:72 msgid "Show social connect icons in extra user information section" msgstr "" -#: includes/admin/class-site-health.php:2071 +#: includes/admin/class-site-health.php:2129 #: includes/admin/templates/directory/search.php:27 msgid "Enable Search feature" msgstr "" -#: includes/admin/class-site-health.php:2092 +#: includes/admin/class-site-health.php:2150 #: includes/admin/templates/directory/search.php:34 msgid "User Roles that can use search" msgstr "" -#: includes/admin/class-site-health.php:2103 +#: includes/admin/class-site-health.php:2161 #: includes/admin/templates/directory/search.php:44 msgid "Enable Filters feature" msgstr "" -#: includes/admin/class-site-health.php:2124 +#: includes/admin/class-site-health.php:2182 #: includes/admin/templates/directory/search.php:51 msgid "User Roles that can use filters" msgstr "" -#: includes/admin/class-site-health.php:2138 +#: includes/admin/class-site-health.php:2196 msgid "Filter meta to enable" msgstr "" -#: includes/admin/class-site-health.php:2151 +#: includes/admin/class-site-health.php:2209 #: includes/admin/templates/directory/search.php:72 msgid "Expand the filter bar by default" msgstr "" -#: includes/admin/class-site-health.php:2162 +#: includes/admin/class-site-health.php:2220 #: includes/admin/templates/directory/search.php:80 msgid "Can filter bar be collapsed" msgstr "" -#: includes/admin/class-site-health.php:2175 +#: includes/admin/class-site-health.php:2233 msgid "From " msgstr "" -#: includes/admin/class-site-health.php:2175 +#: includes/admin/class-site-health.php:2233 msgid " to " msgstr "" -#: includes/admin/class-site-health.php:2181 +#: includes/admin/class-site-health.php:2239 #: includes/admin/templates/directory/search.php:88 msgid "Admin filtering" msgstr "" -#: includes/admin/class-site-health.php:2193 +#: includes/admin/class-site-health.php:2251 #: includes/admin/templates/directory/pagination.php:17 msgid "Show results only after search/filtration" msgstr "" -#: includes/admin/class-site-health.php:2197 -#: includes/admin/class-site-health.php:2205 +#: includes/admin/class-site-health.php:2255 +#: includes/admin/class-site-health.php:2263 #: includes/admin/templates/directory/pagination.php:25 msgid "Maximum number of profiles" msgstr "" -#: includes/admin/class-site-health.php:2201 +#: includes/admin/class-site-health.php:2259 #: includes/admin/templates/directory/pagination.php:33 msgid "Number of profiles per page" msgstr "" -#: includes/admin/class-site-health.php:2209 +#: includes/admin/class-site-health.php:2267 #: includes/admin/templates/directory/pagination.php:49 msgid "Results Text" msgstr "" -#: includes/admin/class-site-health.php:2213 +#: includes/admin/class-site-health.php:2271 #: includes/admin/templates/directory/pagination.php:57 msgid "Single Result Text" msgstr "" -#: includes/admin/class-site-health.php:2217 +#: includes/admin/class-site-health.php:2275 #: includes/admin/templates/directory/pagination.php:65 msgid "Custom text if no users were found" msgstr "" @@ -1928,7 +1966,7 @@ msgstr "" #: includes/admin/core/class-admin-builder.php:590 #: includes/admin/core/class-admin-builder.php:724 #: includes/admin/core/class-admin-dragdrop.php:41 -#: includes/admin/core/class-admin-menu.php:106 +#: includes/admin/core/class-admin-menu.php:142 msgid "Please login as administrator" msgstr "" @@ -2024,7 +2062,7 @@ msgstr "" #: includes/core/class-form.php:161 #: includes/core/class-form.php:243 #: includes/core/class-form.php:608 -#: includes/core/class-password.php:466 +#: includes/core/class-password.php:480 #: includes/core/um-actions-profile.php:550 msgid "This is not possible for security reasons." msgstr "" @@ -2034,7 +2072,7 @@ msgid "This is not possible for security reasons. Don't use internal PHP functio msgstr "" #: includes/admin/core/class-admin-columns.php:50 -#: includes/admin/core/list-tables/version-template-list-table.php:203 +#: includes/admin/core/list-tables/version-template-list-table.php:212 msgid "Status" msgstr "" @@ -2061,18 +2099,18 @@ msgstr "" msgid "Invalid form ID." msgstr "" -#: includes/admin/core/class-admin-forms.php:345 +#: includes/admin/core/class-admin-forms.php:348 #: includes/core/um-filters-fields.php:17 msgid "Required" msgstr "" -#: includes/admin/core/class-admin-forms.php:555 +#: includes/admin/core/class-admin-forms.php:558 #: includes/admin/core/class-admin-metabox.php:1561 #: includes/admin/core/class-admin-metabox.php:1586 msgid "Choose Icon" msgstr "" -#: includes/admin/core/class-admin-forms.php:561 +#: includes/admin/core/class-admin-forms.php:564 #: includes/admin/core/class-admin-metabox.php:1563 #: includes/admin/core/class-admin-metabox.php:1588 #: assets/js/admin/modal.js:188 @@ -2080,79 +2118,83 @@ msgstr "" msgid "No Icon" msgstr "" -#: includes/admin/core/class-admin-forms.php:644 +#: includes/admin/core/class-admin-forms.php:647 msgid "Select Users" msgstr "" -#: includes/admin/core/class-admin-forms.php:1016 +#: includes/admin/core/class-admin-forms.php:1027 #: includes/admin/core/class-admin-upgrade.php:274 msgid "Run" msgstr "" -#: includes/admin/core/class-admin-forms.php:1156 -#: includes/admin/core/class-admin-forms.php:1175 -#: includes/admin/core/class-admin-forms.php:1313 -#: includes/admin/core/class-admin-forms.php:1322 -#: includes/admin/core/class-admin-forms.php:1569 -#: includes/admin/core/class-admin-forms.php:1583 -#: includes/admin/core/class-admin-forms.php:1699 -#: includes/admin/core/class-admin-forms.php:1728 +#: includes/admin/core/class-admin-forms.php:1162 +msgid "Create Default" +msgstr "" + +#: includes/admin/core/class-admin-forms.php:1239 +#: includes/admin/core/class-admin-forms.php:1258 +#: includes/admin/core/class-admin-forms.php:1396 +#: includes/admin/core/class-admin-forms.php:1405 +#: includes/admin/core/class-admin-forms.php:1652 +#: includes/admin/core/class-admin-forms.php:1666 +#: includes/admin/core/class-admin-forms.php:1782 +#: includes/admin/core/class-admin-forms.php:1811 #: includes/core/um-actions-profile.php:846 -#: assets/js/admin/forms.js:306 -#: assets/js/admin/forms.js:380 -#: assets/js/admin/forms.js:659 -#: assets/js/admin/forms.js:692 +#: assets/js/admin/forms.js:353 +#: assets/js/admin/forms.js:427 +#: assets/js/admin/forms.js:706 +#: assets/js/admin/forms.js:739 msgid "Remove" msgstr "" -#: includes/admin/core/class-admin-forms.php:1369 +#: includes/admin/core/class-admin-forms.php:1452 msgid "Select media" msgstr "" -#: includes/admin/core/class-admin-forms.php:1399 -#: assets/js/admin/forms.js:740 +#: includes/admin/core/class-admin-forms.php:1482 +#: assets/js/admin/forms.js:787 msgid "Select" msgstr "" -#: includes/admin/core/class-admin-forms.php:1400 +#: includes/admin/core/class-admin-forms.php:1483 msgid "Clear" msgstr "" -#: includes/admin/core/class-admin-forms.php:1700 -#: includes/admin/core/class-admin-forms.php:1729 +#: includes/admin/core/class-admin-forms.php:1783 +#: includes/admin/core/class-admin-forms.php:1812 #: includes/admin/templates/directory/sorting.php:22 -#: assets/js/admin/forms.js:308 +#: assets/js/admin/forms.js:355 msgid "Meta key" msgstr "" -#: includes/admin/core/class-admin-forms.php:1701 +#: includes/admin/core/class-admin-forms.php:1784 #: includes/admin/templates/directory/sorting.php:30 -#: assets/js/admin/forms.js:309 +#: assets/js/admin/forms.js:356 msgid "Data type" msgstr "" -#: includes/admin/core/class-admin-forms.php:1704 +#: includes/admin/core/class-admin-forms.php:1787 #: includes/admin/templates/directory/sorting.php:39 -#: assets/js/admin/forms.js:312 +#: assets/js/admin/forms.js:359 msgid "Order" msgstr "" -#: includes/admin/core/class-admin-forms.php:1705 +#: includes/admin/core/class-admin-forms.php:1788 #: includes/admin/templates/directory/sorting.php:43 -#: assets/js/admin/forms.js:313 +#: assets/js/admin/forms.js:360 msgid "ASC" msgstr "" -#: includes/admin/core/class-admin-forms.php:1706 +#: includes/admin/core/class-admin-forms.php:1789 #: includes/admin/templates/directory/sorting.php:44 -#: assets/js/admin/forms.js:314 +#: assets/js/admin/forms.js:361 msgid "DESC" msgstr "" -#: includes/admin/core/class-admin-forms.php:1708 -#: includes/admin/core/class-admin-forms.php:1730 +#: includes/admin/core/class-admin-forms.php:1791 +#: includes/admin/core/class-admin-forms.php:1813 #: includes/admin/core/class-admin-metabox.php:2356 -#: assets/js/admin/forms.js:316 +#: assets/js/admin/forms.js:363 msgid "Label" msgstr "" @@ -2237,53 +2279,53 @@ msgstr "" msgid "Your %s was unable to be removed at this time." msgstr "" -#: includes/admin/core/class-admin-menu.php:64 +#: includes/admin/core/class-admin-menu.php:100 msgid "Thanks :)" msgstr "" #. translators: %s: Review link. -#: includes/admin/core/class-admin-menu.php:72 +#: includes/admin/core/class-admin-menu.php:108 msgid "If you like Ultimate Member please consider leaving a %s review. It will help us to grow the plugin and make it more popular. Thank you." msgstr "" -#: includes/admin/core/class-admin-menu.php:151 +#: includes/admin/core/class-admin-menu.php:187 msgid "Dashboard" msgstr "" -#: includes/admin/core/class-admin-menu.php:159 +#: includes/admin/core/class-admin-menu.php:197 #: includes/admin/templates/gdpr.php:7 #: includes/common/class-cpt.php:31 msgid "Forms" msgstr "" -#: includes/admin/core/class-admin-menu.php:161 +#: includes/admin/core/class-admin-menu.php:199 #: includes/admin/core/list-tables/roles-list-table.php:547 msgid "User Roles" msgstr "" -#: includes/admin/core/class-admin-menu.php:164 +#: includes/admin/core/class-admin-menu.php:202 #: includes/common/class-cpt.php:63 msgid "Member Directories" msgstr "" -#: includes/admin/core/class-admin-menu.php:206 -#: includes/admin/core/class-admin-settings.php:1798 +#: includes/admin/core/class-admin-menu.php:244 +#: includes/admin/core/class-admin-settings.php:2083 msgid "Extensions" msgstr "" -#: includes/admin/core/class-admin-menu.php:219 +#: includes/admin/core/class-admin-menu.php:257 msgid "Users Overview" msgstr "" -#: includes/admin/core/class-admin-menu.php:221 +#: includes/admin/core/class-admin-menu.php:259 msgid "Purge Temp Files" msgstr "" -#: includes/admin/core/class-admin-menu.php:223 +#: includes/admin/core/class-admin-menu.php:261 msgid "User Cache" msgstr "" -#: includes/admin/core/class-admin-menu.php:228 +#: includes/admin/core/class-admin-menu.php:266 msgid "Upgrade's Manual Request" msgstr "" @@ -2533,6 +2575,7 @@ msgid "Select Form Type" msgstr "" #: includes/admin/core/class-admin-metabox.php:1028 +#: includes/admin/core/class-admin-settings.php:2164 msgid "Form Builder" msgstr "" @@ -3100,10 +3143,10 @@ msgid "The text that appears on the button. e.g. Upload" msgstr "" #: includes/admin/core/class-admin-metabox.php:2108 -#: includes/core/class-fields.php:1945 -#: includes/core/class-fields.php:1986 -#: includes/core/class-fields.php:2937 -#: includes/core/class-fields.php:3040 +#: includes/core/class-fields.php:1951 +#: includes/core/class-fields.php:1992 +#: includes/core/class-fields.php:2943 +#: includes/core/class-fields.php:3046 msgid "Upload" msgstr "" @@ -3306,8 +3349,9 @@ msgid "This is the text that appears within the field e.g please enter your emai msgstr "" #: includes/admin/core/class-admin-metabox.php:2386 -#: includes/class-config.php:126 -#: includes/class-config.php:838 +#: includes/class-config.php:133 +#: includes/class-config.php:845 +#: includes/class-config.php:900 msgid "Members" msgstr "" @@ -3425,228 +3469,207 @@ msgid "Select the member roles that can see this link" msgstr "" #. translators: %s: Setting link. -#: includes/admin/core/class-admin-notices.php:253 +#: includes/admin/core/class-admin-notices.php:242 msgid "The \"Membership - Anyone can register\" option on the general settings page is enabled. This means users can register via the standard WordPress wp-login.php page. If you do not want users to be able to register via this page and only register via the Ultimate Member registration form, you should deactivate this option. You can dismiss this notice if you wish to keep the wp-login.php registration page open." msgstr "" -#: includes/admin/core/class-admin-notices.php:270 +#: includes/admin/core/class-admin-notices.php:259 msgid "All Access Pass – Get access to all Ultimate Member extensions at a significant discount with our All Access Pass." msgstr "" -#: includes/admin/core/class-admin-notices.php:274 +#: includes/admin/core/class-admin-notices.php:263 msgid "View Pricing" msgstr "" #. translators: %1$s is a plugin name; %2$s is a plugin version; %3$s is a plugin name; %4$s is a doc link. -#: includes/admin/core/class-admin-notices.php:368 +#: includes/admin/core/class-admin-notices.php:357 msgid "%1$s %2$s requires 2.0 extensions. You have pre 2.0 extensions installed on your site.
    Please update %3$s extensions to latest versions. For more info see this doc." msgstr "" #. translators: %s: Plugin name. -#: includes/admin/core/class-admin-notices.php:399 +#: includes/admin/core/class-admin-notices.php:388 msgid "%s needs to create several pages (User Profiles, Account, Registration, Login, Password Reset, Logout, Member Directory) to function correctly." msgstr "" -#: includes/admin/core/class-admin-notices.php:404 +#: includes/admin/core/class-admin-notices.php:393 msgid "Create Pages" msgstr "" -#: includes/admin/core/class-admin-notices.php:406 +#: includes/admin/core/class-admin-notices.php:395 msgid "No thanks" msgstr "" -#: includes/admin/core/class-admin-notices.php:433 +#: includes/admin/core/class-admin-notices.php:422 msgid "Ultimate Member Setup Error: User page can not be a child page." msgstr "" -#: includes/admin/core/class-admin-notices.php:447 +#: includes/admin/core/class-admin-notices.php:436 msgid "Ultimate Member Setup Error: Account page can not be a child page." msgstr "" #. translators: %s: query args. -#: includes/admin/core/class-admin-notices.php:466 +#: includes/admin/core/class-admin-notices.php:455 msgid "Exif is not enabled on your server. Mobile photo uploads will not be rotated correctly until you enable the exif extension." msgstr "" -#: includes/admin/core/class-admin-notices.php:484 +#: includes/admin/core/class-admin-notices.php:473 msgid "Your temp uploads directory is now clean." msgstr "" -#: includes/admin/core/class-admin-notices.php:487 +#: includes/admin/core/class-admin-notices.php:476 msgid "Your user cache is now removed." msgstr "" -#: includes/admin/core/class-admin-notices.php:490 +#: includes/admin/core/class-admin-notices.php:479 msgid "Your user statuses cache is now removed." msgstr "" -#: includes/admin/core/class-admin-notices.php:493 +#: includes/admin/core/class-admin-notices.php:482 msgid "You have the latest updates." msgstr "" -#: includes/admin/core/class-admin-notices.php:496 +#: includes/admin/core/class-admin-notices.php:485 msgid "Try again later. You can run this action once daily." msgstr "" -#: includes/admin/core/class-admin-notices.php:499 +#: includes/admin/core/class-admin-notices.php:488 msgid "The form has been duplicated successfully." msgstr "" -#: includes/admin/core/class-admin-notices.php:502 +#: includes/admin/core/class-admin-notices.php:491 msgid "Settings have been saved successfully." msgstr "" -#: includes/admin/core/class-admin-notices.php:505 +#: includes/admin/core/class-admin-notices.php:494 msgid "User has been updated." msgstr "" -#: includes/admin/core/class-admin-notices.php:508 +#: includes/admin/core/class-admin-notices.php:497 msgid "Users have been updated." msgstr "" -#: includes/admin/core/class-admin-notices.php:511 +#: includes/admin/core/class-admin-notices.php:500 msgid "All users sessions have been successfully destroyed." msgstr "" -#: includes/admin/core/class-admin-notices.php:514 +#: includes/admin/core/class-admin-notices.php:503 msgid "Account has been successfully restored." msgstr "" #. translators: %s: Plugin name. -#: includes/admin/core/class-admin-notices.php:583 +#: includes/admin/core/class-admin-notices.php:572 msgid "You have installed %s with wrong folder name. Correct folder name is \"ultimate-member\"." msgstr "" -#. translators: %1$s is a inactive license number; %2$s is a plugin name; %3$s is a store link. -#: includes/admin/core/class-admin-notices.php:618 +#. translators: %1$s is an inactive license number; %2$s is a plugin name; %3$s is a store link. +#: includes/admin/core/class-admin-notices.php:607 msgid "There are %1$s inactive %2$s license keys for this site. This site is not authorized to get plugin updates. You can active this site on www.ultimatemember.com." msgstr "" -#. translators: %1$s is a invalid license; %2$s is a plugin name; %3$s is a license link. -#: includes/admin/core/class-admin-notices.php:630 +#. translators: %1$s is an invalid license; %2$s is a plugin name; %3$s is a license link. +#: includes/admin/core/class-admin-notices.php:627 msgid "You have %1$s invalid or expired license keys for %2$s. Please go to the Licenses page to correct this issue." msgstr "" -#: includes/admin/core/class-admin-notices.php:647 +#: includes/admin/core/class-admin-notices.php:644 msgid "version needs to be updated to work correctly." msgstr "" -#: includes/admin/core/class-admin-notices.php:649 +#: includes/admin/core/class-admin-notices.php:646 msgid "It is necessary to update the structure of the database and options that are associated with current version" msgstr "" -#: includes/admin/core/class-admin-notices.php:651 +#: includes/admin/core/class-admin-notices.php:648 msgid "Please run the upgrade process on this " msgstr "" -#: includes/admin/core/class-admin-notices.php:651 +#: includes/admin/core/class-admin-notices.php:648 msgid "page" msgstr "" -#: includes/admin/core/class-admin-notices.php:655 +#: includes/admin/core/class-admin-notices.php:652 msgid "Visit Upgrade Page" msgstr "" -#: includes/admin/core/class-admin-notices.php:670 +#: includes/admin/core/class-admin-notices.php:667 msgid "Settings successfully upgraded" msgstr "" #. translators: %1$s is a plugin name title; %2$s is a plugin version. -#: includes/admin/core/class-admin-notices.php:678 +#: includes/admin/core/class-admin-notices.php:675 msgid "%1$s %2$s Successfully Upgraded" msgstr "" #. translators: %s: plugin name. -#: includes/admin/core/class-admin-notices.php:709 +#: includes/admin/core/class-admin-notices.php:706 msgid "Hey there! It's been one month since you installed %s. How have you found the plugin so far?" msgstr "" -#: includes/admin/core/class-admin-notices.php:713 +#: includes/admin/core/class-admin-notices.php:710 msgid "I love it!" msgstr "" -#: includes/admin/core/class-admin-notices.php:714 +#: includes/admin/core/class-admin-notices.php:711 msgid "It's good but could be better" msgstr "" -#: includes/admin/core/class-admin-notices.php:715 +#: includes/admin/core/class-admin-notices.php:712 msgid "I don't like the plugin" msgstr "" -#: includes/admin/core/class-admin-notices.php:724 +#: includes/admin/core/class-admin-notices.php:721 msgid "Leave Review" msgstr "" -#: includes/admin/core/class-admin-notices.php:733 -#: includes/admin/core/class-admin-notices.php:742 +#: includes/admin/core/class-admin-notices.php:730 +#: includes/admin/core/class-admin-notices.php:739 msgid "Provide Feedback" msgstr "" #. translators: %1$s is a plugin name; %2$s is a #. -#: includes/admin/core/class-admin-notices.php:766 +#: includes/admin/core/class-admin-notices.php:763 msgid "%1$s future plans! Detailed future list is here" msgstr "" -#. translators: %s override templates page link. -#: includes/admin/core/class-admin-notices.php:790 -msgid "Your templates are out of date. Please visit override templates status page and update templates." -msgstr "" - #. translators: %s child-theme article link. -#: includes/admin/core/class-admin-notices.php:823 -msgid "We highly recommend using a child-theme for Ultimate Member customization, which hasn't dependencies with the official themes repo, so your custom files cannot be rewritten after a theme upgrade.
    Otherwise, the customization files may be deleted after every theme upgrade." +#: includes/admin/core/class-admin-notices.php:790 +msgid "We recommend using a child-theme for Ultimate Member customization. Unlike official theme repositories, child themes don't have dependencies that could lead to your custom files being overwritten during a theme upgrade.
    Without a child theme, your customization files may be deleted after every theme update." msgstr "" -#: includes/admin/core/class-admin-notices.php:848 -msgid "Important Update" +#: includes/admin/core/class-admin-notices.php:813 +msgid "Your Register forms are now locked. You can unlock them in Ultimate Member > Settings > Advanced > Security > Lock All Register Forms." msgstr "" -#: includes/admin/core/class-admin-notices.php:849 -msgid "Ultimate Member has a new additional feature to secure your Ultimate Member forms to prevent attacks from injecting accounts with administrative roles & capabilities." +#: includes/admin/core/class-admin-notices.php:832 +msgid "Mandatory password changes has been enabled. You can disable them in Ultimate Member > Settings > Advanced > Security > Display Login form notice to reset passwords." msgstr "" -#: includes/admin/core/class-admin-notices.php:852 -msgid "Manage Security Settings" +#: includes/admin/core/class-admin-notices.php:851 +msgid "Ban for administrative capabilities is enabled. You can disable them in Ultimate Member > Settings > Advanced > Security > Enable ban for administrative capabilities." msgstr "" -#: includes/admin/core/class-admin-notices.php:853 -msgid "Read the documentation" -msgstr "" - -#: includes/admin/core/class-admin-notices.php:873 -msgid "Your Register forms are now locked. You can unlock them in Ultimate Member > Settings > Secure > Lock All Register Forms." -msgstr "" - -#: includes/admin/core/class-admin-notices.php:892 -msgid "Mandatory password changes has been enabled. You can disable them in Ultimate Member > Settings > Secure > Display Login form notice to reset passwords." -msgstr "" - -#: includes/admin/core/class-admin-notices.php:911 -msgid "Ban for administrative capabilities is enabled. You can disable them in Ultimate Member > Settings > Secure > Enable ban for administrative capabilities." -msgstr "" - -#: includes/admin/core/class-admin-notices.php:944 +#: includes/admin/core/class-admin-notices.php:884 msgid "The role selected in WordPress native \"Settings > New User Default Role\" setting has Administrative capabilities." msgstr "" -#: includes/admin/core/class-admin-notices.php:970 +#: includes/admin/core/class-admin-notices.php:910 msgid "The role selected in \"Ultimate Member > Settings > Appearance > Registration Form > Registration Default Role\" setting has Administrative capabilities." msgstr "" #. translators: %s are link(s) to the forms. -#: includes/admin/core/class-admin-notices.php:1038 +#: includes/admin/core/class-admin-notices.php:978 msgid "Register forms have Administrative roles, we recommend that you assign a non-admin roles to secure the forms. %s" msgstr "" -#: includes/admin/core/class-admin-notices.php:1057 +#: includes/admin/core/class-admin-notices.php:997 msgid "Wrong Data" msgstr "" -#: includes/admin/core/class-admin-settings.php:91 +#: includes/admin/core/class-admin-settings.php:80 msgid "Wrong callback" msgstr "" -#: includes/admin/core/class-admin-settings.php:197 +#: includes/admin/core/class-admin-settings.php:186 #: includes/admin/core/packages/2.1.3-beta3/functions.php:24 #: includes/admin/core/packages/2.3.0/functions.php:89 #: includes/admin/core/packages/2.8.0/functions.php:32 @@ -3654,765 +3677,1298 @@ msgid "Wrong data" msgstr "" #. translators: %1$s is a metadata from name; %2$s is a metadata to. -#: includes/admin/core/class-admin-settings.php:242 +#: includes/admin/core/class-admin-settings.php:231 msgid "Metadata from %1$s to %2$s was upgraded successfully..." msgstr "" +#: includes/admin/core/class-admin-settings.php:301 +#: includes/ajax/class-pages.php:56 +msgid "%s (ID: %s)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:321 +#: includes/admin/core/class-admin-settings.php:354 +msgid "Warning: Account page and User page must be separate pages." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:323 +msgid "Warning: Account page must contain shortcode [ultimatemember_account]." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:325 +msgid "Warning: Account page and WooCommerce \"My account\" page should be separate pages." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:330 +#: includes/admin/core/class-admin-settings.php:339 +msgid "Warning: Login page and Logout page must be separate pages." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:332 +msgid "Warning: Login page must contain a login form shortcode. You can get existing shortcode or create a new one here." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:337 +msgid "Warning: Home page and Logout page must be separate pages." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:344 +msgid "Warning: Password Reset page must contain shortcode [ultimatemember_password]." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:349 +msgid "Warning: Register page must contain a registration form shortcode. You can get existing shortcode or create a new one here." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:356 +msgid "Warning: User page must contain a profile form shortcode. You can get existing shortcode or create a new one here." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:361 +msgid "Warning: Members page must contain a profile form shortcode. You can get existing shortcode or create a new one here." +msgstr "" + #. translators: %s: Page title -#: includes/admin/core/class-admin-settings.php:276 -#: includes/admin/core/class-admin-settings.php:286 +#: includes/admin/core/class-admin-settings.php:374 msgid "%s page" msgstr "" -#: includes/admin/core/class-admin-settings.php:277 -msgid "Add page ID" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:288 +#: includes/admin/core/class-admin-settings.php:377 msgid "Choose a page..." msgstr "" -#: includes/admin/core/class-admin-settings.php:357 +#: includes/admin/core/class-admin-settings.php:391 +msgid "Profile menu" +msgstr "" + +#. translators: %s: Tab title +#: includes/admin/core/class-admin-settings.php:423 +#: includes/admin/core/class-admin-settings.php:440 +msgid "Enable %s Tab" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:449 msgid "Select which users can view this tab." msgstr "" -#: includes/admin/core/class-admin-settings.php:366 +#: includes/admin/core/class-admin-settings.php:458 msgid "Allowed roles" msgstr "" -#: includes/admin/core/class-admin-settings.php:367 +#: includes/admin/core/class-admin-settings.php:459 msgid "Select the the user roles allowed to view this tab." msgstr "" -#: includes/admin/core/class-admin-settings.php:369 +#: includes/admin/core/class-admin-settings.php:461 msgid "Choose user roles..." msgstr "" -#: includes/admin/core/class-admin-settings.php:398 -msgid "This will be the default tab on user profile page" +#: includes/admin/core/class-admin-settings.php:490 +msgid "This will be the default tab on user profile page." msgstr "" -#: includes/admin/core/class-admin-settings.php:415 -msgid "\"Desktop view\" means the profile block's width lower than 800px" +#: includes/admin/core/class-admin-settings.php:506 +msgid "Menu icons in desktop view" msgstr "" -#: includes/admin/core/class-admin-settings.php:476 +#: includes/admin/core/class-admin-settings.php:508 +msgid "\"Desktop view\" means the profile block's width lower than 800px." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:574 msgid "Globally control the access of your site, you can have separate restrict options per post/page by editing the desired item." msgstr "" -#: includes/admin/core/class-admin-settings.php:487 -msgid "A logged out user will be redirected to this url If he is not permitted to access the site" +#: includes/admin/core/class-admin-settings.php:585 +msgid "A logged out user will be redirected to this url If he is not permitted to access the site." msgstr "" -#: includes/admin/core/class-admin-settings.php:494 -msgid "Here you can exclude URLs beside the redirect URI to be accessible to everyone" +#: includes/admin/core/class-admin-settings.php:592 +msgid "Here you can exclude URLs beside the redirect URI to be accessible to everyone." msgstr "" -#: includes/admin/core/class-admin-settings.php:495 +#: includes/admin/core/class-admin-settings.php:593 msgid "Add New URL" msgstr "" -#: includes/admin/core/class-admin-settings.php:514 +#: includes/admin/core/class-admin-settings.php:601 +msgid "Accessible Homepage" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:608 +msgid "Accessible Category pages" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:614 +msgid "Restricted Post Title" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:615 msgid "Replace the restricted Post Title" msgstr "" -#: includes/admin/core/class-admin-settings.php:515 -msgid "Allow to replace the restricted post title to users that do not have permission to view the content" +#: includes/admin/core/class-admin-settings.php:616 +msgid "Allow to replace the restricted post title to users that do not have permission to view the content." msgstr "" -#: includes/admin/core/class-admin-settings.php:520 +#: includes/admin/core/class-admin-settings.php:621 msgid "Restricted Access Post Title" msgstr "" -#: includes/admin/core/class-admin-settings.php:521 -msgid "This is the post title shown to users that do not have permission to view the content" +#: includes/admin/core/class-admin-settings.php:622 +msgid "If enabled, the text entered below will replace the title of the post/page/CPT for users who do not have permission to view the restricted content. Please see this doc for more information on this." msgstr "" -#: includes/admin/core/class-admin-settings.php:528 -msgid "This is the message shown to users that do not have permission to view the content" +#: includes/admin/core/class-admin-settings.php:629 +msgid "This is the message shown to users that do not have permission to view the content." msgstr "" -#: includes/admin/core/class-admin-settings.php:576 -msgid "This is the message shown to users that do not have permission to view the block's content" +#: includes/admin/core/class-admin-settings.php:671 +msgid "Restricted Gutenberg Blocks" msgstr "" -#: includes/admin/core/class-admin-settings.php:607 -msgid "Check post types for which you plan to use the \"Content Restriction\" settings" +#: includes/admin/core/class-admin-settings.php:673 +msgid "If enabled then allows to set the blocks restriction settings in wp-admin." msgstr "" -#: includes/admin/core/class-admin-settings.php:617 -msgid "Check taxonomies for which you plan to use the \"Content Restriction\" settings" +#: includes/admin/core/class-admin-settings.php:679 +msgid "This is the message shown to users that do not have permission to view the block's content." msgstr "" -#: includes/admin/core/class-admin-settings.php:645 +#: includes/admin/core/class-admin-settings.php:710 +msgid "Check post types for which you plan to use the \"Content Restriction\" settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:720 +msgid "Check taxonomies for which you plan to use the \"Content Restriction\" settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:747 +msgid "Custom usermeta table" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:749 msgid "Check this box if you would like to enable the use of a custom table for user metadata. Improved performance for member directory searches." msgstr "" -#: includes/admin/core/class-admin-settings.php:650 +#: includes/admin/core/class-admin-settings.php:754 msgid "We recommend creating a backup of your site before running the update process. Do not exit the page before the update process has complete." msgstr "" -#: includes/admin/core/class-admin-settings.php:651 +#: includes/admin/core/class-admin-settings.php:755 msgid "After clicking the \"Run\" button, the update process will start. All information will be displayed in the field below." msgstr "" -#: includes/admin/core/class-admin-settings.php:652 +#: includes/admin/core/class-admin-settings.php:756 #: includes/admin/core/class-admin-upgrade.php:270 msgid "If the update was successful, you will see a corresponding message. Otherwise, contact technical support if the update failed." msgstr "" -#: includes/admin/core/class-admin-settings.php:969 -msgid "Enable/disable the Password account tab in account page" +#: includes/admin/core/class-admin-settings.php:1104 +msgid "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." msgstr "" -#: includes/admin/core/class-admin-settings.php:975 -msgid "Enable/disable the Privacy account tab in account page" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:984 -msgid "Enable/disable the Notifications account tab in account page" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:999 -msgid "Enable/disable the Delete account tab in account page" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1005 -msgid "This is custom text that will be displayed to users before they delete their accounts from your site when password is required." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1014 -msgid "This is custom text that will be displayed to users before they delete their accounts from your site when password isn't required." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1023 -msgid "Whether to enable these fields on the user account page by default or hide them." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1028 -msgid "Disable First & Last Name fields" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1029 -msgid "Whether to allow users changing their first and last name in account page." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1036 -msgid "Require first and last name?" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1043 -msgid "Whether to allow users changing their email in account page." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1049 -msgid "Password is required to save account data." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1055 -msgid "Whether to allow users changing their profile visibility from member directory in account page." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1062 -msgid "Set default value for the \"Hide my profile from directory\" option" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1106 +#: includes/admin/core/class-admin-settings.php:1108 +#: includes/admin/core/class-admin-settings.php:1111 #: includes/admin/templates/dashboard/users.php:15 msgid "Users" msgstr "" +#: includes/admin/core/class-admin-settings.php:1112 +msgid "General users settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1118 +msgid "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." +msgstr "" + #. translators: %s: Profile page URL -#: includes/admin/core/class-admin-settings.php:1114 -msgid "Here you can control the permalink structure of the user profile URL globally e.g. %susername/" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1116 -#: includes/admin/core/class-admin-settings.php:1133 -msgid "Select..." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1122 -msgid "Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique." +#: includes/admin/core/class-admin-settings.php:1129 +msgid "Here you can control the permalink structure of the user profile URL globally e.g. %susername/." msgstr "" #: includes/admin/core/class-admin-settings.php:1131 -msgid "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" +#: includes/admin/core/class-admin-settings.php:1148 +msgid "Select..." msgstr "" -#: includes/admin/core/class-admin-settings.php:1139 -msgid "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" +#: includes/admin/core/class-admin-settings.php:1137 +msgid "Specify the custom field meta key that you want to use as profile permalink base. Meta value should be unique." msgstr "" -#: includes/admin/core/class-admin-settings.php:1147 -msgid "If enabled, author pages will automatically redirect to the user's profile page" +#: includes/admin/core/class-admin-settings.php:1146 +msgid "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." msgstr "" -#: includes/admin/core/class-admin-settings.php:1153 -msgid "Control whether to enable or disable member directories on this site" +#: includes/admin/core/class-admin-settings.php:1154 +msgid "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." msgstr "" -#: includes/admin/core/class-admin-settings.php:1159 -msgid "Do you want to use gravatars instead of the default plugin profile photo (If the user did not upload a custom profile photo / avatar)" +#: includes/admin/core/class-admin-settings.php:1161 +msgid "Hide author pages" msgstr "" -#: includes/admin/core/class-admin-settings.php:1165 -msgid "Gravatar has a number of built in options which you can also use as defaults" +#: includes/admin/core/class-admin-settings.php:1162 +msgid "Enable author page redirect to user profile" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1163 +msgid "If enabled, author pages will automatically redirect to the user's profile page." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1168 +msgid "Members Directory" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1170 +msgid "Control whether to enable or disable member directories on this site." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1175 +msgid "Use Gravatar" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1176 +msgid "Enable Gravatar" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1177 +msgid "Do you want to use Gravatar instead of the default plugin profile photo (If the user did not upload a custom profile photo/avatar)?" msgstr "" #: includes/admin/core/class-admin-settings.php:1183 -msgid "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)" +msgid "Gravatar has a number of built in options which you can also use as defaults." msgstr "" -#: includes/admin/core/class-admin-settings.php:1190 -msgid "Enable visibility for show/hide password button for the password field-type." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1195 -msgid "Require a strong password?" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1196 -msgid "Enable or disable a strong password rules common for all Ultimate Member forms." +#: includes/admin/core/class-admin-settings.php:1200 +msgid "Replace Gravatar's Default avatar" msgstr "" #: includes/admin/core/class-admin-settings.php:1201 -msgid "Password minimum length" +msgid "Set Default plugin avatar as Gravatar's Default avatar" msgstr "" #: includes/admin/core/class-admin-settings.php:1202 -msgid "If you want to enable a minimum number of characters to be in password. User password field in the UM forms has own settings for that. Leave empty to use default value 8" +msgid "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)." msgstr "" #: includes/admin/core/class-admin-settings.php:1208 -msgid "Password maximum length" +msgid "Delete user comments" msgstr "" #: includes/admin/core/class-admin-settings.php:1209 -msgid "If you want to enable a maximum number of characters to be in password. User password field in the UM forms has own settings for that. Leave empty to use default value 30" +msgid "Enable deleting user comments after deleting a user" msgstr "" -#: includes/admin/core/class-admin-settings.php:1217 +#: includes/admin/core/class-admin-settings.php:1210 +msgid "Do you want to automatically delete a user's comments when they delete their account or are removed from the admin dashboard?" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1216 +msgid "Password & Security settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1221 +msgid "Toggle Password Visibility" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1222 +msgid "Enable password show/hide icon on password field" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1223 +msgid "Enable users to view their inputted password before submitting the form." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1229 +msgid "Enable strong passwords" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1230 +msgid "Enable this option to apply strong password rules to all password fields (user registration, password reset and password change)." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1235 +msgid "Password minimum length" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1236 +msgid "Enter the minimum number of characters a user must use for their password. The default minimum characters is 8." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1243 +msgid "Password maximum length" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1244 +msgid "Enter the maximum number of characters a user can use for their password. The default maximum characters is 30." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1251 +msgid "Email activation link expiration (days)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1252 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1258 +msgid "SEO" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1259 +msgid "SEO settings for the user profiles." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1266 msgid "Hides the profile page for robots. This setting can be overridden by individual role settings." msgstr "" -#: includes/admin/core/class-admin-settings.php:1227 -msgid "How long does an activation link live in seconds? Leave empty for endless links." +#: includes/admin/core/class-admin-settings.php:1276 +msgid "This is the title that is displayed on a specific user profile." msgstr "" -#: includes/admin/core/class-admin-settings.php:1234 -msgid "Do you want to delete a user's comments when that user deletes themself or is removed from the admin dashboard from the site?" +#: includes/admin/core/class-admin-settings.php:1283 +msgid "This will be used in the meta description that is available for search-engines." msgstr "" -#: includes/admin/core/class-admin-settings.php:1239 -#: includes/class-config.php:128 -#: includes/class-config.php:840 +#: includes/admin/core/class-admin-settings.php:1293 +#: includes/class-config.php:135 +#: includes/class-config.php:847 +#: includes/class-config.php:908 #: includes/core/class-account.php:89 msgid "Account" msgstr "" -#: includes/admin/core/class-admin-settings.php:1243 -msgid "Uploads" +#: includes/admin/core/class-admin-settings.php:1296 +msgid "Main account tab" msgstr "" -#: includes/admin/core/class-admin-settings.php:1250 -msgid "Sets a maximum size for the uploaded photo" +#: includes/admin/core/class-admin-settings.php:1297 +msgid "Allows you to control the fields on the main tab of Account page." msgstr "" -#: includes/admin/core/class-admin-settings.php:1257 -msgid "Sets a maximum size for the uploaded cover" +#: includes/admin/core/class-admin-settings.php:1302 +msgid "Display First & Last name fields" msgstr "" -#: includes/admin/core/class-admin-settings.php:1264 -msgid "Here you can define which thumbnail sizes will be created for each profile photo upload." +#: includes/admin/core/class-admin-settings.php:1303 +msgid "Enable to display First & Last name fields" msgstr "" -#: includes/admin/core/class-admin-settings.php:1266 -#: includes/admin/core/class-admin-settings.php:1276 -msgid "Add New Size" +#: includes/admin/core/class-admin-settings.php:1304 +msgid "If enabled, the First & Last name fields will be shown on the account page." msgstr "" -#: includes/admin/core/class-admin-settings.php:1274 -msgid "Here you can define which thumbnail sizes will be created for each cover photo upload." +#: includes/admin/core/class-admin-settings.php:1310 +msgid "Enable to prevent First & Last name editing by users" msgstr "" -#: includes/admin/core/class-admin-settings.php:1283 -msgid "Rotate image to and use orientation by the camera EXIF data." +#: includes/admin/core/class-admin-settings.php:1311 +msgid "If enabled, this feature will prevent users from changing their first and last names on the account page." msgstr "" -#: includes/admin/core/class-admin-settings.php:1290 -msgid "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." +#: includes/admin/core/class-admin-settings.php:1318 +msgid "First and last name fields are required" msgstr "" -#: includes/admin/core/class-admin-settings.php:1298 -msgid "Any image upload above this width will be resized to this limit automatically." +#: includes/admin/core/class-admin-settings.php:1319 +msgid "If enabled, users will not be allowed to remove their first or last names when updating their account information." msgstr "" -#: includes/admin/core/class-admin-settings.php:1306 -msgid "This will be the minimum width for cover photo uploads" +#: includes/admin/core/class-admin-settings.php:1326 +msgid "Enable changing email via the account page" msgstr "" -#: includes/admin/core/class-admin-settings.php:1313 -msgid "Access" +#: includes/admin/core/class-admin-settings.php:1327 +msgid "If disabled, users will not be allowed to change their email address on the account page." msgstr "" -#: includes/admin/core/class-admin-settings.php:1316 -msgid "Restriction Content" +#: includes/admin/core/class-admin-settings.php:1332 +msgid "Require password to update account" msgstr "" -#: includes/admin/core/class-admin-settings.php:1320 -msgid "Other" +#: includes/admin/core/class-admin-settings.php:1333 +msgid "Enable required password" msgstr "" -#: includes/admin/core/class-admin-settings.php:1330 -msgid "Reset Password Limit" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1331 -msgid "Set the maximum reset password limit. If reached the maximum limit, user will be locked from using this." +#: includes/admin/core/class-admin-settings.php:1334 +msgid "If enabled, users will need to enter their password when updating their information via the account page." msgstr "" #: includes/admin/core/class-admin-settings.php:1339 -msgid "Change Password request limit" +msgid "Change password tab" msgstr "" #: includes/admin/core/class-admin-settings.php:1340 -msgid "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." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1345 -msgid "Blocked Email Addresses (Enter one email per line)" +msgid "Enables you to toggle the change password tab on the account page." msgstr "" #: includes/admin/core/class-admin-settings.php:1346 -msgid "This will block the specified e-mail addresses from being able to sign up or sign in to your site. To block an entire domain, use something like *@domain.com" +msgid "Display password change account tab" msgstr "" -#: includes/admin/core/class-admin-settings.php:1351 -msgid "Blacklist Words (Enter one word per line)" +#: includes/admin/core/class-admin-settings.php:1347 +msgid "Enable or disable the \"Password\" tab on the account page." msgstr "" #: includes/admin/core/class-admin-settings.php:1352 -msgid "This option lets you specify blacklist of words to prevent anyone from signing up with such a word as their username" +msgid "Privacy tab" msgstr "" -#: includes/admin/core/class-admin-settings.php:1357 -msgid "Allowed Choice Callbacks (Enter one PHP function per line)" +#: includes/admin/core/class-admin-settings.php:1353 +msgid "Enables you to toggle the privacy tab on the account page. Disable this tab to prevent users from altering their privacy settings." msgstr "" -#: includes/admin/core/class-admin-settings.php:1358 -msgid "This option lets you specify the choice callback functions to prevent anyone from using 3rd-party functions that may put your site at risk." +#: includes/admin/core/class-admin-settings.php:1359 +msgid "Display privacy account tab" msgstr "" -#: includes/admin/core/class-admin-settings.php:1363 -msgid "Allow external link redirect confirm" +#: includes/admin/core/class-admin-settings.php:1360 +msgid "Enable or disable the \"Privacy\" tab on the account page." msgstr "" -#: includes/admin/core/class-admin-settings.php:1364 -msgid "Using JS.confirm alert when you go to an external link." +#: includes/admin/core/class-admin-settings.php:1366 +msgid "Enable users ability to alter their profile visibility in member directories" msgstr "" -#: includes/admin/core/class-admin-settings.php:1371 -#: includes/admin/core/list-tables/emails-list-table.php:309 -msgid "Email" +#: includes/admin/core/class-admin-settings.php:1367 +msgid "If enabled, this will allow users to change their profile visibility in the member directory from the account page." msgstr "" -#: includes/admin/core/class-admin-settings.php:1377 -#: includes/admin/core/class-admin-settings.php:1389 -msgid "e.g. admin@companyname.com" +#: includes/admin/core/class-admin-settings.php:1374 +msgid "Set the default value for the \"Hide my profile from directory\" option." msgstr "" -#: includes/admin/core/class-admin-settings.php:1383 -msgid "e.g. Site Name" +#: includes/admin/core/class-admin-settings.php:1385 +msgid "Notifications tab" msgstr "" -#: includes/admin/core/class-admin-settings.php:1395 -msgid "If you plan use e-mails with HTML, please make sure that this option is enabled. Otherwise, HTML will be displayed as plain text." +#: includes/admin/core/class-admin-settings.php:1386 +msgid "Enables you to toggle the notifications tab on the account page. Disable this tab to prevent users from altering their notifications settings." msgstr "" -#: includes/admin/core/class-admin-settings.php:1400 +#: includes/admin/core/class-admin-settings.php:1392 +msgid "Display notifications account tab" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1393 +msgid "Enable or disable the \"Notifications\" tab on the account page." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1398 +msgid "Delete tab" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1399 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1405 +msgid "Display delete account tab" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1406 +msgid "Enable/disable the Delete account tab in account page." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1411 +#: includes/admin/core/class-admin-settings.php:1421 +msgid "Account Deletion Text" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1412 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1422 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1433 +#: includes/admin/core/class-admin-settings.php:1436 +msgid "Uploads" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1437 +msgid "This page allows you to manage user upload options, enabling you to optimize photos for your site." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1443 +msgid "Enable getting image orientation from EXIF data" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1444 +msgid "Rotate image to and use orientation by the camera EXIF data." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1451 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1458 +msgid "Any image upload above this width will be resized to this limit automatically." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1463 +#: includes/admin/core/class-admin-settings.php:1661 +#: includes/core/um-actions-profile.php:767 +#: includes/core/um-actions-profile.php:781 +msgid "Profile photo" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1464 +msgid "Allows you to control the profile photos sizes, thumbnails, etc." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1471 +msgid "Sets a maximum size for the uploaded photo." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1478 +msgid "Here you can define which thumbnail sizes will be created for each profile photo upload." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1480 +#: includes/admin/core/class-admin-settings.php:1510 +msgid "Add New Size" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1486 +#: includes/admin/core/class-admin-settings.php:1694 +msgid "Cover photo" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1487 +msgid "Allows you to control the cover photos sizes, thumbnails, etc." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1494 +msgid "Sets a maximum size for the uploaded cover." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1501 +msgid "This will be the minimum width for cover photo uploads." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1508 +msgid "Here you can define which thumbnail sizes will be created for each cover photo upload." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1520 +msgid "Access" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1523 +msgid "Restriction Content" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1524 +msgid "Provides settings for controlling access to your site." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1528 +msgid "Other" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1531 +msgid "Reset Password" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1532 +msgid "Allows to manage reset password settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1537 +msgid "Password reset limit" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1539 +msgid "If enabled, this sets a limit on the number of password resets a user can do." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1544 +msgid "Enter password reset limit" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1545 +msgid "Set the maximum reset password limit. If reached the maximum limit, user will be locked from using this." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1553 +msgid "Change Password request limit" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1554 +msgid "Enable limit for changing password" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1555 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1560 +msgid "Blocked data when sign up" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1561 +msgid "Allows to manage blocked data of signed up user." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1566 +msgid "Blocked Email Addresses (Enter one email per line)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1567 +msgid "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`." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1572 +msgid "Blacklist Words (Enter one word per line)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1573 +msgid "This option lets you specify blacklist of words to prevent anyone from signing up with such a word as their username." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1582 +msgid "Emails" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1585 +msgid "Email sender options" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1586 +msgid "How the sender appears in outgoing Ultimate Member emails." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1592 +#: includes/admin/core/class-admin-settings.php:1604 +msgid "e.g. admin@companyname.com." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1598 +msgid "e.g. Site Name." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1609 +msgid "Email template" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1610 +msgid "Section to customize email templates settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1615 +msgid "Content type" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1616 +msgid "Enable HTML for Emails" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1617 +msgid "If you plan use emails with HTML, please make sure that this option is enabled. Otherwise, HTML will be displayed as plain text." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1624 msgid "Appearance" msgstr "" -#: includes/admin/core/class-admin-settings.php:1403 +#: includes/admin/core/class-admin-settings.php:1627 #: includes/core/class-form.php:992 msgid "Profile" msgstr "" -#: includes/admin/core/class-admin-settings.php:1409 -msgid "This will be the default template to output profile" +#: includes/admin/core/class-admin-settings.php:1631 +msgid "This section allows you to customize the user profile template and size. Learn more about custom profile template creation." msgstr "" -#: includes/admin/core/class-admin-settings.php:1419 -#: includes/admin/core/class-admin-settings.php:1627 -#: includes/admin/core/class-admin-settings.php:1717 -msgid "The maximum width this shortcode can take from the page width" +#: includes/admin/core/class-admin-settings.php:1637 +msgid "This will be the default template to output profile." msgstr "" -#: includes/admin/core/class-admin-settings.php:1427 -#: includes/admin/templates/form/profile_customize.php:76 -msgid "The maximum width of the profile area inside profile (below profile header)" +#: includes/admin/core/class-admin-settings.php:1647 +#: includes/admin/core/class-admin-settings.php:1897 +#: includes/admin/core/class-admin-settings.php:1991 +msgid "The maximum width this shortcode can take from the page width." msgstr "" -#: includes/admin/core/class-admin-settings.php:1434 -msgid "This is applicable for edit mode only" +#: includes/admin/core/class-admin-settings.php:1655 +msgid "The maximum width of the profile area inside profile (below profile header)." msgstr "" -#: includes/admin/core/class-admin-settings.php:1448 -msgid "The text that is used for updating profile button" +#: includes/admin/core/class-admin-settings.php:1662 +#: includes/admin/core/class-admin-settings.php:1695 +msgid "This section allows you to customize the profile photo component on the user profile." msgstr "" -#: includes/admin/core/class-admin-settings.php:1456 -#: includes/admin/core/class-admin-settings.php:1669 -#: includes/admin/core/class-admin-settings.php:1759 -msgid "Switch on/off the secondary button display in the form" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1461 -msgid "Profile Secondary Button Text" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1463 -msgid "The text that is used for cancelling update profile button" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1471 +#: includes/admin/core/class-admin-settings.php:1668 msgid "You can change the default profile picture globally here. Please make sure that the photo is 300x300px." msgstr "" -#: includes/admin/core/class-admin-settings.php:1472 +#: includes/admin/core/class-admin-settings.php:1669 msgid "Select Default Profile Photo" msgstr "" -#: includes/admin/core/class-admin-settings.php:1483 +#: includes/admin/core/class-admin-settings.php:1677 +msgid "Profile Photo Upload" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1679 +msgid "Switch on/off the profile photo uploader." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1688 +msgid "The global default of profile photo size. This can be overridden by individual form settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1703 msgid "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." msgstr "" -#: includes/admin/core/class-admin-settings.php:1484 +#: includes/admin/core/class-admin-settings.php:1704 msgid "Select Default Cover Photo" msgstr "" -#: includes/admin/core/class-admin-settings.php:1490 -#: includes/admin/templates/form/profile_customize.php:158 -msgid "Switch on/off the profile photo uploader" +#: includes/admin/core/class-admin-settings.php:1713 +msgid "Switch on/off the profile cover photos." msgstr "" -#: includes/admin/core/class-admin-settings.php:1499 -msgid "The global default of profile photo size. This can be overridden by individual form settings" +#: includes/admin/core/class-admin-settings.php:1721 +msgid "The global default width of cover photo size. This can be overridden by individual form settings." msgstr "" -#: includes/admin/core/class-admin-settings.php:1507 -msgid "Switch on/off the profile cover photos" +#: includes/admin/core/class-admin-settings.php:1729 +msgid "Choose global ratio for cover photos of profiles." msgstr "" -#: includes/admin/core/class-admin-settings.php:1515 -msgid "The global default width of cover photo size. This can be overridden by individual form settings" +#: includes/admin/core/class-admin-settings.php:1743 +msgid "Header" msgstr "" -#: includes/admin/core/class-admin-settings.php:1523 -msgid "Choose global ratio for cover photos of profiles" +#: includes/admin/core/class-admin-settings.php:1744 +msgid "This section allows you to customize the user profile header component." msgstr "" -#: includes/admin/core/class-admin-settings.php:1539 -msgid "Display field icons for related user meta fields in header or not" +#: includes/admin/core/class-admin-settings.php:1750 +msgid "Show icons in Profile Header Meta" msgstr "" -#: includes/admin/core/class-admin-settings.php:1546 -msgid "Switch on/off the user name on profile header" +#: includes/admin/core/class-admin-settings.php:1752 +msgid "Display field icons for related user meta fields in header or not." msgstr "" -#: includes/admin/core/class-admin-settings.php:1553 -msgid "Switch on/off the social links on profile header" +#: includes/admin/core/class-admin-settings.php:1757 +msgid "Display name in profile header" msgstr "" -#: includes/admin/core/class-admin-settings.php:1560 -msgid "Switch on/off the user description on profile header" +#: includes/admin/core/class-admin-settings.php:1760 +msgid "Switch on/off the user name on profile header." msgstr "" -#: includes/admin/core/class-admin-settings.php:1566 -msgid "Switch on/off to enable/disable support for html tags on user description." +#: includes/admin/core/class-admin-settings.php:1765 +msgid "Social links in profile header" msgstr "" -#: includes/admin/core/class-admin-settings.php:1573 +#: includes/admin/core/class-admin-settings.php:1768 +msgid "Switch on/off the social links on profile header." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1773 +msgid "User description in profile header" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1774 +msgid "Show user description in profile header" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1776 +msgid "Switch on/off the user description on profile header." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1783 msgid "Maximum number of characters to allow in user description field in header." msgstr "" -#: includes/admin/core/class-admin-settings.php:1582 +#: includes/admin/core/class-admin-settings.php:1790 +msgid "HTML support for user description" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1792 +msgid "Switch on/off to enable/disable support for HTML tags on user description." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1799 msgid "For incompatible themes, please make the menu open from left instead of bottom by default." msgstr "" -#: includes/admin/core/class-admin-settings.php:1594 -msgid "Switch on/off the custom message that appears when the profile is empty" +#: includes/admin/core/class-admin-settings.php:1809 +#: includes/admin/core/class-admin-settings.php:1916 +#: includes/admin/core/class-admin-settings.php:2010 +msgid "Buttons & Fields" msgstr "" -#: includes/admin/core/class-admin-settings.php:1601 -msgid "Switch on/off the emoticon (sad face) that appears above the message" +#: includes/admin/core/class-admin-settings.php:1810 +msgid "This section allows you to customize the user profile buttons and fields layout." msgstr "" -#: includes/admin/core/class-admin-settings.php:1607 +#: includes/admin/core/class-admin-settings.php:1817 +msgid "The text that is used for updating profile button." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1824 +msgid "Show Profile Secondary Button" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1826 +#: includes/admin/core/class-admin-settings.php:1933 +#: includes/admin/core/class-admin-settings.php:2027 +msgid "Switch on/off the secondary button display in the form." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1831 +msgid "Profile Secondary Button Text" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1833 +msgid "The text that is used for cancelling update profile button." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1841 +msgid "This is applicable for edit mode only." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1853 +msgid "Custom message on empty profile" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1856 +msgid "Switch on/off the custom message that appears when the profile is empty." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1861 +msgid "Custom message emoticon" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1864 +msgid "Switch on/off the emoticon (sad face) that appears above the message." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1872 msgid "Profile Menu" msgstr "" -#: includes/admin/core/class-admin-settings.php:1611 +#: includes/admin/core/class-admin-settings.php:1873 +msgid "This section allows you to customize the user profiles menus on your site." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1877 #: includes/admin/templates/form/mode.php:16 msgid "Registration Form" msgstr "" -#: includes/admin/core/class-admin-settings.php:1617 -msgid "This will be the default template to output registration" +#: includes/admin/core/class-admin-settings.php:1881 +msgid "This section allows you to customize the user registration template and size." msgstr "" -#: includes/admin/core/class-admin-settings.php:1634 -#: includes/admin/core/class-admin-settings.php:1724 -#: includes/admin/templates/form/profile_customize.php:144 -msgid "The shortcode is centered by default unless you specify otherwise here" +#: includes/admin/core/class-admin-settings.php:1887 +msgid "This will be the default template to output registration." msgstr "" -#: includes/admin/core/class-admin-settings.php:1647 -msgid "This controls the display of field icons in the registration form" +#: includes/admin/core/class-admin-settings.php:1904 +#: includes/admin/core/class-admin-settings.php:1998 +msgid "The shortcode is centered by default unless you specify otherwise here." msgstr "" -#: includes/admin/core/class-admin-settings.php:1659 +#: includes/admin/core/class-admin-settings.php:1917 +msgid "This section allows you to customize the user registration buttons and fields layout." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1922 msgid "Registration Primary Button Text" msgstr "" -#: includes/admin/core/class-admin-settings.php:1661 -#: includes/admin/core/class-admin-settings.php:1751 -msgid "The text that is used for primary button text" +#: includes/admin/core/class-admin-settings.php:1924 +#: includes/admin/core/class-admin-settings.php:2018 +msgid "The text that is used for primary button text." msgstr "" -#: includes/admin/core/class-admin-settings.php:1676 -#: includes/admin/core/class-admin-settings.php:1766 -msgid "The text that is used for the secondary button text" +#: includes/admin/core/class-admin-settings.php:1931 +msgid "Show Registration Secondary Button" msgstr "" -#: includes/admin/core/class-admin-settings.php:1685 -#: includes/admin/core/class-admin-settings.php:1775 -msgid "You can replace default link for this button by entering custom URL" +#: includes/admin/core/class-admin-settings.php:1940 +#: includes/admin/core/class-admin-settings.php:2034 +msgid "The text that is used for the secondary button text." msgstr "" -#: includes/admin/core/class-admin-settings.php:1693 -msgid "This will be the default role assigned to users registering thru registration form" +#: includes/admin/core/class-admin-settings.php:1949 +#: includes/admin/core/class-admin-settings.php:2043 +msgid "You can replace default link for this button by entering custom URL." msgstr "" -#: includes/admin/core/class-admin-settings.php:1701 +#: includes/admin/core/class-admin-settings.php:1957 +msgid "This controls the display of field icons in the registration form." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:1971 #: includes/admin/templates/form/mode.php:24 msgid "Login Form" msgstr "" -#: includes/admin/core/class-admin-settings.php:1707 -msgid "This will be the default template to output login" +#: includes/admin/core/class-admin-settings.php:1975 +msgid "This section allows you to customize the user login template and size." msgstr "" -#: includes/admin/core/class-admin-settings.php:1737 -msgid "This controls the display of field icons in the login form" +#: includes/admin/core/class-admin-settings.php:1981 +msgid "This will be the default template to output login." msgstr "" -#: includes/admin/core/class-admin-settings.php:1784 -msgid "Switch on/off the forgot password link in login form" +#: includes/admin/core/class-admin-settings.php:2011 +msgid "This section allows you to customize the user login buttons and fields layout." msgstr "" -#: includes/admin/core/class-admin-settings.php:1791 +#: includes/admin/core/class-admin-settings.php:2025 +msgid "Show Login Secondary Button" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2051 +msgid "Show Login Forgot Password Link" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2053 +msgid "Switch on/off the forgot password link in login form." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2058 +msgid "\"Remember Me\" checkbox" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2059 +msgid "Show \"Remember Me\" checkbox" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2061 msgid "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." msgstr "" -#: includes/admin/core/class-admin-settings.php:1804 -msgid "Misc" +#: includes/admin/core/class-admin-settings.php:2067 +msgid "This controls the display of field icons in the login form." msgstr "" -#: includes/admin/core/class-admin-settings.php:1815 -msgid "This is the title that is displayed on a specific user profile" +#: includes/admin/core/class-admin-settings.php:2089 +msgid "Advanced" msgstr "" -#: includes/admin/core/class-admin-settings.php:1822 -msgid "This will be used in the meta description that is available for search-engines." +#: includes/admin/core/class-admin-settings.php:2093 +msgid "Advanced settings section is designed to help you fine-tune your website or add extra features. Learn more about advanced settings section." msgstr "" -#: includes/admin/core/class-admin-settings.php:1831 +#: includes/admin/core/class-admin-settings.php:2098 +msgid "Required fields' asterisk" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2104 +msgid "Cache User Profile" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2105 +msgid "Disable user data cache" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2106 msgid "Check this box if you would like to disable Ultimate Member user's cache." msgstr "" -#: includes/admin/core/class-admin-settings.php:1837 -msgid "Check this box if you would like to use Ultimate Member blocks in Gutenberg editor. Important some themes have the conflicts with Gutenberg editor." +#: includes/admin/core/class-admin-settings.php:2112 +msgid "Enable flushing data" msgstr "" -#: includes/admin/core/class-admin-settings.php:1843 -msgid "This controls the REST API version, we recommend to use the last version" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1845 -msgid "1.0 version" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1846 -msgid "2.0 version" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1855 -msgid "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" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1862 +#: includes/admin/core/class-admin-settings.php:2113 msgid "Check this box if you would like Ultimate Member to completely remove all of its data when the plugin/extensions are deleted." msgstr "" -#: includes/admin/core/class-admin-settings.php:1867 -msgid "Install Info" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:1875 +#: includes/admin/core/class-admin-settings.php:2118 +#: includes/admin/core/class-admin-settings.php:2121 msgid "Override templates" msgstr "" -#: includes/admin/core/class-admin-settings.php:1986 +#. translators: %s: Link to the docs article. +#: includes/admin/core/class-admin-settings.php:2123 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2134 +#: includes/admin/core/class-admin-settings.php:2137 +msgid "Features" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2138 +msgid "Start using new features that are being progressively rolled out to improve the users management experience." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2143 +msgid "Gutenberg Blocks" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2145 +msgid "Check this box if you would like to use Ultimate Member blocks in Gutenberg editor. Important some themes have the conflicts with Gutenberg editor." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2151 +msgid "Experimental features" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2152 +msgid "These features are either experimental or incomplete, enable them at your own risk!" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2157 +msgid "Design scheme" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2158 +msgid "Enable new UI (for developers only)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2159 +msgid "Check this box if you would like to enable new UI." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2165 +msgid "Enable new Form Builder (for developers only)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2166 +msgid "Check this box if you would like to enable new Form Builder." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2171 +msgid "Legacy fonticons" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2172 +msgid "Enable legacy fonticons" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2173 +msgid "Check this box if you would like to enable legacy Ultimate Member fonticons used outdated versions of FontAwesome and Ionicons libraries." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2178 +msgid "Legacy features" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2179 +msgid "These features are related to the legacy logic or functionality. Please enable them only for the backward compatibility." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2186 +msgid "Restriction content pre-queries" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2187 +msgid "Disable pre-queries for restriction content logic" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2188 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2195 +#: includes/admin/core/class-admin-settings.php:2198 +msgid "Developers" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2199 +msgid "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." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2204 +msgid "Allowed Choice Callbacks (Enter one PHP function per line)" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2205 +msgid "This option lets you specify the choice callback functions to prevent anyone from using 3rd-party functions that may put your site at risk." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2210 +msgid "REST API Version" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2211 +msgid "This controls the REST API version, we recommend to use the last version." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2213 +msgid "1.0 version" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2214 +msgid "2.0 version" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2220 +msgid "Redirect" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2221 +msgid "Allows to manage redirect settings." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2226 +msgid "Allow external link redirect confirm" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2227 +msgid "Enable JS.confirm for external links" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2228 +msgid "Using JS.confirm alert when you go to an external link." +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2237 +msgid "System info" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:2352 msgid "Ultimate Member - Settings" msgstr "" -#: includes/admin/core/class-admin-settings.php:2116 +#: includes/admin/core/class-admin-settings.php:2417 msgid "Save Changes" msgstr "" -#: includes/admin/core/class-admin-settings.php:2715 -msgid "Subject Line" +#: includes/admin/core/class-admin-settings.php:3016 +msgid "Back" msgstr "" -#: includes/admin/core/class-admin-settings.php:2717 -msgid "This is the subject line of the e-mail" +#: includes/admin/core/class-admin-settings.php:3028 +msgid "Enable/Disable" msgstr "" -#: includes/admin/core/class-admin-settings.php:2722 -msgid "Message Body" +#: includes/admin/core/class-admin-settings.php:3029 +msgid "Enable this email notification" msgstr "" -#: includes/admin/core/class-admin-settings.php:2724 -msgid "This is the content of the e-mail" +#: includes/admin/core/class-admin-settings.php:3034 +msgid "Subject" +msgstr "" + +#: includes/admin/core/class-admin-settings.php:3040 +msgid "Email Content" +msgstr "" + +#. translators: %1$s is an error code; %2$s is an error message. +#: includes/admin/core/class-admin-settings.php:3106 +msgid "code: %1$s, message: %2$s;" +msgstr "" + +#. translators: %1$s is an error data; %2$s is a support link. +#. translators: %1$s is an error; %2$s is a support link. +#: includes/admin/core/class-admin-settings.php:3112 +#: includes/admin/core/class-admin-settings.php:3186 +#: includes/admin/core/class-admin-settings.php:3195 +msgid "There was an error with this license key: %1$s. Please contact our support team." msgstr "" #. translators: %1$s is an expiry date; %2$s is a renewal link. #. translators: %1$s is a expiry date; %2$s is a renew link. -#: includes/admin/core/class-admin-settings.php:2774 -#: includes/admin/core/class-admin-settings.php:2869 +#: includes/admin/core/class-admin-settings.php:3123 +#: includes/admin/core/class-admin-settings.php:3218 msgid "Your license key expired on %1$s. Please renew your license key." msgstr "" #. translators: %s: support link name. -#: includes/admin/core/class-admin-settings.php:2785 -#: includes/admin/core/class-admin-settings.php:2880 +#: includes/admin/core/class-admin-settings.php:3134 +#: includes/admin/core/class-admin-settings.php:3229 msgid "Your license key has been disabled. Please contact support for more information." msgstr "" #. translators: %s: account page. -#: includes/admin/core/class-admin-settings.php:2795 -#: includes/admin/core/class-admin-settings.php:2890 +#: includes/admin/core/class-admin-settings.php:3144 +#: includes/admin/core/class-admin-settings.php:3239 msgid "Invalid license. Please visit your account page and verify it." msgstr "" #. translators: %1$s is a item name title; %2$s is a account page. -#: includes/admin/core/class-admin-settings.php:2806 -#: includes/admin/core/class-admin-settings.php:2901 +#: includes/admin/core/class-admin-settings.php:3155 +#: includes/admin/core/class-admin-settings.php:3250 msgid "Your %1$s is not active for this URL. Please visit your account page to manage your license key URLs." msgstr "" #. translators: %s: item name. -#: includes/admin/core/class-admin-settings.php:2816 -#: includes/admin/core/class-admin-settings.php:2911 +#: includes/admin/core/class-admin-settings.php:3165 +#: includes/admin/core/class-admin-settings.php:3260 msgid "This appears to be an invalid license key for %s." msgstr "" #. translators: %s: account link. -#: includes/admin/core/class-admin-settings.php:2823 -#: includes/admin/core/class-admin-settings.php:2918 +#: includes/admin/core/class-admin-settings.php:3172 +#: includes/admin/core/class-admin-settings.php:3267 msgid "Your license key has reached its activation limit. View possible upgrades now." msgstr "" -#: includes/admin/core/class-admin-settings.php:2829 -#: includes/admin/core/class-admin-settings.php:2924 +#: includes/admin/core/class-admin-settings.php:3178 +#: includes/admin/core/class-admin-settings.php:3273 msgid "The key you entered belongs to a bundle, please use the product specific license key." msgstr "" -#: includes/admin/core/class-admin-settings.php:2835 -#: includes/admin/core/class-admin-settings.php:2844 -#: includes/admin/core/class-admin-settings.php:2855 +#: includes/admin/core/class-admin-settings.php:3184 +#: includes/admin/core/class-admin-settings.php:3193 +#: includes/admin/core/class-admin-settings.php:3204 msgid "unknown_error" msgstr "" -#. translators: %1$s is an error; %2$s is a support link. -#: includes/admin/core/class-admin-settings.php:2837 -#: includes/admin/core/class-admin-settings.php:2846 -msgid "There was an error with this license key: %1$s. Please contact our support team." -msgstr "" - #. translators: %1$s is an error; %2$s is a error data; %3$s is a support link. -#: includes/admin/core/class-admin-settings.php:2858 +#: includes/admin/core/class-admin-settings.php:3207 msgid "There was an error with this license key: %1$s%2$s. Please contact our support team." msgstr "" -#: includes/admin/core/class-admin-settings.php:2937 +#: includes/admin/core/class-admin-settings.php:3286 msgid "License key never expires." msgstr "" #. translators: %1$s is an expiry date; %2$s is a renewal link. -#: includes/admin/core/class-admin-settings.php:2945 +#: includes/admin/core/class-admin-settings.php:3294 msgid "Your license key expires soon! It expires on %1$s. Renew your license key." msgstr "" #. translators: %s: expiry date. -#: includes/admin/core/class-admin-settings.php:2956 +#: includes/admin/core/class-admin-settings.php:3305 msgid "Your license key expires on %s." msgstr "" #. translators: %s: item name. -#: includes/admin/core/class-admin-settings.php:2972 +#: includes/admin/core/class-admin-settings.php:3321 msgid "To receive updates, please enter your valid %s license key." msgstr "" -#: includes/admin/core/class-admin-settings.php:2999 -#: includes/admin/core/class-admin-settings.php:3008 +#: includes/admin/core/class-admin-settings.php:3347 +#: includes/admin/core/class-admin-settings.php:3356 msgid "Clear License" msgstr "" -#: includes/admin/core/class-admin-settings.php:3003 +#: includes/admin/core/class-admin-settings.php:3351 msgid "Activate" msgstr "" -#: includes/admin/core/class-admin-settings.php:3007 +#: includes/admin/core/class-admin-settings.php:3355 msgid "Re-Activate" msgstr "" -#: includes/admin/core/class-admin-settings.php:3065 +#: includes/admin/core/class-admin-settings.php:3404 msgid "Re-check templates" msgstr "" #. translators: %s: Last checking templates time. -#: includes/admin/core/class-admin-settings.php:3070 +#: includes/admin/core/class-admin-settings.php:3408 msgid "Last update: %s. You could re-check changes manually." msgstr "" -#: includes/admin/core/class-admin-settings.php:3072 -msgid "Templates haven't check yet. You could check changes manually." -msgstr "" - -#. translators: %s: Link to the docs article. -#: includes/admin/core/class-admin-settings.php:3080 -msgid "You may get more details about overriding templates here." -msgstr "" - -#: includes/admin/core/class-admin-settings.php:3169 -msgid "Theme version up to date" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:3172 -msgid "Theme version is out of date" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:3176 -msgid "Theme version is empty" -msgstr "" - -#: includes/admin/core/class-admin-settings.php:3297 -msgid "To copy the Install info, click below then press Ctrl + C (PC) or Cmd + C (Mac)." -msgstr "" - #. translators: %s: new version. #: includes/admin/core/class-admin-upgrade.php:139 msgid "%s is a major update, and we highly recommend creating a full backup of your site before updating." @@ -4454,7 +5010,7 @@ msgid "UM Action" msgstr "" #: includes/admin/core/class-admin-users.php:199 -#: includes/core/class-fields.php:3021 +#: includes/core/class-fields.php:3027 msgid "Apply" msgstr "" @@ -4476,7 +5032,7 @@ msgstr "" #: includes/admin/core/class-admin-users.php:250 #: includes/core/um-filters-user.php:37 -msgid "Resend Activation E-mail" +msgid "Resend Activation Email" msgstr "" #: includes/admin/core/class-admin-users.php:253 @@ -4508,7 +5064,7 @@ msgid "Pending review" msgstr "" #: includes/admin/core/class-admin-users.php:410 -msgid "Waiting e-mail confirmation" +msgid "Waiting email confirmation" msgstr "" #: includes/admin/core/class-admin-users.php:411 @@ -4543,29 +5099,52 @@ msgstr "" msgid "not found." msgstr "" -#: includes/admin/core/list-tables/emails-list-table.php:245 +#: includes/admin/core/list-tables/emails-list-table.php:234 +msgid "Enabled" +msgstr "" + +#: includes/admin/core/list-tables/emails-list-table.php:234 +msgid "Disabled" +msgstr "" + +#: includes/admin/core/list-tables/emails-list-table.php:257 msgid "Member" msgstr "" -#: includes/admin/core/list-tables/emails-list-table.php:256 -msgid "Edit template" +#: includes/admin/core/list-tables/emails-list-table.php:268 +msgid "Manage" msgstr "" -#: includes/admin/core/list-tables/emails-list-table.php:279 +#: includes/admin/core/list-tables/emails-list-table.php:291 msgid "Email Notification" msgstr "" -#: includes/admin/core/list-tables/emails-list-table.php:280 +#: includes/admin/core/list-tables/emails-list-table.php:292 msgid "Email Notifications" msgstr "" -#: includes/admin/core/list-tables/emails-list-table.php:310 +#: includes/admin/core/list-tables/emails-list-table.php:321 +msgid "Email" +msgstr "" + +#: includes/admin/core/list-tables/emails-list-table.php:322 msgid "Recipient(s)" msgstr "" -#. translators: %s: doc link. -#: includes/admin/core/list-tables/emails-list-table.php:325 -msgid "You may get more details about email notifications customization here" +#: includes/admin/core/list-tables/emails-list-table.php:335 +msgid "Email notifications" +msgstr "" + +#: includes/admin/core/list-tables/emails-list-table.php:337 +msgid "Email notifications sent from Ultimate Member are listed below. Click on an email to configure it." +msgstr "" + +#: includes/admin/core/list-tables/emails-list-table.php:339 +msgid "Emails should be sent from an email using your website's domain name. We highly recommend using a SMTP service email delivery." +msgstr "" + +#: includes/admin/core/list-tables/emails-list-table.php:340 +msgid "Please see this doc for more information." msgstr "" #: includes/admin/core/list-tables/roles-list-table.php:390 @@ -4620,23 +5199,23 @@ msgstr "" msgid "User Role Deleted Successfully." msgstr "" -#: includes/admin/core/list-tables/version-template-list-table.php:131 +#: includes/admin/core/list-tables/version-template-list-table.php:130 msgid "Core path - " msgstr "" -#: includes/admin/core/list-tables/version-template-list-table.php:133 +#: includes/admin/core/list-tables/version-template-list-table.php:132 msgid "Theme path - " msgstr "" -#: includes/admin/core/list-tables/version-template-list-table.php:171 +#: includes/admin/core/list-tables/version-template-list-table.php:180 msgid "Templates" msgstr "" -#: includes/admin/core/list-tables/version-template-list-table.php:201 +#: includes/admin/core/list-tables/version-template-list-table.php:210 msgid "Core version" msgstr "" -#: includes/admin/core/list-tables/version-template-list-table.php:202 +#: includes/admin/core/list-tables/version-template-list-table.php:211 msgid "Theme version" msgstr "" @@ -4723,7 +5302,7 @@ msgstr "" #: includes/admin/core/packages/2.1.3-beta3/init.php:22 #: includes/admin/core/packages/2.3.0/init.php:54 #: includes/admin/core/packages/2.8.0/init.php:25 -#: assets/js/admin/forms.js:188 +#: assets/js/admin/forms.js:235 msgid "There are " msgstr "" @@ -4837,7 +5416,7 @@ msgstr "" #: includes/admin/core/packages/2.1.3-beta3/init.php:23 #: includes/admin/core/packages/2.3.0/init.php:55 #: includes/admin/core/packages/2.8.0/init.php:26 -#: assets/js/admin/forms.js:189 +#: assets/js/admin/forms.js:236 msgid "Start metadata upgrading..." msgstr "" @@ -4951,7 +5530,7 @@ msgid "Upgrade SkypeID fields metadata for users..." msgstr "" #: includes/admin/core/packages/2.3.0/init.php:54 -#: assets/js/admin/forms.js:188 +#: assets/js/admin/forms.js:235 msgid " metadata rows..." msgstr "" @@ -5081,7 +5660,7 @@ msgstr "" #: includes/admin/templates/dashboard/users.php:73 #: includes/core/class-user.php:1304 -msgid "Awaiting E-mail Confirmation" +msgid "Awaiting Email Confirmation" msgstr "" #: includes/admin/templates/directory/general.php:47 @@ -5349,6 +5928,10 @@ msgstr "" msgid "Profile Area Max. Width (px)" msgstr "" +#: includes/admin/templates/form/profile_customize.php:76 +msgid "The maximum width of the profile area inside profile (below profile header)" +msgstr "" + #: includes/admin/templates/form/profile_customize.php:134 msgid "Cover Photo Size" msgstr "" @@ -5362,6 +5945,14 @@ msgstr "" msgid "Cover photo ratio" msgstr "" +#: includes/admin/templates/form/profile_customize.php:144 +msgid "The shortcode is centered by default unless you specify otherwise here" +msgstr "" + +#: includes/admin/templates/form/profile_customize.php:158 +msgid "Switch on/off the profile photo uploader" +msgstr "" + #: includes/admin/templates/form/profile_customize.php:179 msgid "Require user to update a profile photo when updating their profile" msgstr "" @@ -5475,10 +6066,10 @@ msgstr "" #: includes/admin/templates/modal/forms/dynamic_new_field.php:18 #: includes/admin/templates/modal/forms/dynamic_new_group.php:18 #: includes/admin/templates/modal/forms/fonticons.php:20 -#: includes/admin/templates/role/publish.php:30 -#: includes/class-config.php:246 -#: includes/core/class-fields.php:3022 -#: includes/core/class-fields.php:3147 +#: includes/admin/templates/role/publish.php:33 +#: includes/class-config.php:253 +#: includes/core/class-fields.php:3028 +#: includes/core/class-fields.php:3153 #: includes/core/um-actions-profile.php:847 #: includes/core/um-actions-profile.php:859 #: includes/core/um-actions-profile.php:1047 @@ -5540,7 +6131,6 @@ msgid "Mark this option if you need to hide the adminbar on frontend for this ro msgstr "" #: includes/admin/templates/role/admin-permissions.php:29 -#: includes/admin/templates/role/admin-permissions.php:46 msgid "Allow this role to edit accounts of other members" msgstr "" @@ -5549,6 +6139,10 @@ msgstr "" msgid "Which roles that role can edit, choose none to allow role to edit all member roles" msgstr "" +#: includes/admin/templates/role/admin-permissions.php:46 +msgid "Allow this role to delete other user accounts." +msgstr "" + #: includes/admin/templates/role/delete.php:16 msgid "Select what happens when a user with this role deletes their own account" msgstr "" @@ -5609,22 +6203,26 @@ msgstr "" msgid "Hides the profile page for robots. The default value depends on the General > Users setting." msgstr "" -#: includes/admin/templates/role/publish.php:17 +#: includes/admin/templates/role/publish.php:19 msgid "Role Priority" msgstr "" -#: includes/admin/templates/role/publish.php:18 +#: includes/admin/templates/role/publish.php:20 msgid "The higher the number, the higher the priority" msgstr "" -#: includes/admin/templates/role/publish.php:29 +#: includes/admin/templates/role/publish.php:32 msgid "Update Role" msgstr "" -#: includes/admin/templates/role/publish.php:29 +#: includes/admin/templates/role/publish.php:32 msgid "Create Role" msgstr "" +#: includes/admin/templates/role/publish.php:40 +msgid "Learn more about role priorities" +msgstr "" + #: includes/admin/templates/role/register.php:15 msgid "Select the status you would like this user role to have after they register on your site" msgstr "" @@ -5644,7 +6242,7 @@ msgid "Thank you for registering. Before you can login we need you to activate y msgstr "" #: includes/admin/templates/role/register.php:80 -msgid "If you want users to go to a specific page other than login page after e-mail activation, enter the URL here." +msgid "If you want users to go to a specific page other than login page after email activation, enter the URL here." msgstr "" #: includes/admin/templates/role/register.php:100 @@ -5763,7 +6361,7 @@ msgid "Click here to lock them now." msgstr "" #: includes/ajax/class-secure.php:288 -msgid "You can unblock the Register forms later. Just go to Ultimate Member > Settings > Secure > uncheck the option \"Lock All Register Forms\"." +msgid "You can unblock the Register forms later. Just go to Ultimate Member > Settings > Advanced > Security and uncheck the option \"Lock All Register Forms\"." msgstr "" #: includes/ajax/class-secure.php:302 @@ -6037,235 +6635,240 @@ msgstr "" msgid "That's all. If you have any recommendation on how to secure your site or have questions, please contact us on our feedback page." msgstr "" -#: includes/class-config.php:123 -#: includes/class-config.php:835 +#: includes/class-config.php:130 +#: includes/class-config.php:842 +#: includes/class-config.php:888 msgid "User" msgstr "" -#: includes/class-config.php:124 -#: includes/class-config.php:256 -#: includes/class-config.php:264 -#: includes/class-config.php:836 +#: includes/class-config.php:131 +#: includes/class-config.php:263 +#: includes/class-config.php:271 +#: includes/class-config.php:843 +#: includes/class-config.php:892 #: includes/core/class-form.php:989 msgid "Login" msgstr "" -#: includes/class-config.php:125 -#: includes/class-config.php:254 -#: includes/class-config.php:268 -#: includes/class-config.php:837 +#: includes/class-config.php:132 +#: includes/class-config.php:261 +#: includes/class-config.php:275 +#: includes/class-config.php:844 +#: includes/class-config.php:896 #: includes/core/class-form.php:995 msgid "Register" msgstr "" -#: includes/class-config.php:127 -#: includes/class-config.php:839 -#: includes/core/class-member-directory.php:2429 +#: includes/class-config.php:134 +#: includes/class-config.php:846 +#: includes/class-config.php:904 +#: includes/core/class-member-directory.php:2451 #: includes/core/um-actions-profile.php:1478 #: includes/core/um-actions-user.php:19 msgid "Logout" msgstr "" -#: includes/class-config.php:129 -#: includes/class-config.php:841 +#: includes/class-config.php:136 +#: includes/class-config.php:848 +#: includes/class-config.php:912 msgid "Password Reset" msgstr "" -#: includes/class-config.php:174 -#: includes/class-config.php:273 +#: includes/class-config.php:181 +#: includes/class-config.php:280 msgid "{total_users} Members" msgstr "" -#: includes/class-config.php:175 -#: includes/class-config.php:274 +#: includes/class-config.php:182 +#: includes/class-config.php:281 msgid "{total_users} Member" msgstr "" -#: includes/class-config.php:176 +#: includes/class-config.php:183 msgid "We are sorry. We cannot find any users who match your search criteria." msgstr "" -#: includes/class-config.php:244 +#: includes/class-config.php:251 msgid "Update Profile" msgstr "" -#: includes/class-config.php:333 +#: includes/class-config.php:340 msgid "Account Welcome Email" msgstr "" -#: includes/class-config.php:344 +#: includes/class-config.php:351 msgid "Whether to send the user an email when his account is automatically approved" msgstr "" -#: includes/class-config.php:350 +#: includes/class-config.php:357 msgid "Account Activation Email" msgstr "" -#: includes/class-config.php:358 -msgid "Whether to send the user an email when his account needs e-mail activation" +#: includes/class-config.php:365 +msgid "Whether to send the user an email when his account needs email activation" msgstr "" -#: includes/class-config.php:363 +#: includes/class-config.php:370 msgid "Your account is pending review" msgstr "" -#: includes/class-config.php:371 +#: includes/class-config.php:378 msgid "Whether to send the user an email when his account needs admin review" msgstr "" -#: includes/class-config.php:376 +#: includes/class-config.php:383 msgid "Account Approved Email" msgstr "" -#: includes/class-config.php:388 +#: includes/class-config.php:395 msgid "Whether to send the user an email when his account is approved" msgstr "" -#: includes/class-config.php:393 +#: includes/class-config.php:400 msgid "Account Rejected Email" msgstr "" -#: includes/class-config.php:400 +#: includes/class-config.php:407 msgid "Whether to send the user an email when his account is rejected" msgstr "" -#: includes/class-config.php:405 +#: includes/class-config.php:412 msgid "Account Deactivated Email" msgstr "" -#: includes/class-config.php:412 +#: includes/class-config.php:419 msgid "Whether to send the user an email when his account is deactivated" msgstr "" -#: includes/class-config.php:418 +#: includes/class-config.php:425 msgid "Account Deleted Email" msgstr "" -#: includes/class-config.php:425 +#: includes/class-config.php:432 msgid "Whether to send the user an email when his account is deleted" msgstr "" -#: includes/class-config.php:431 +#: includes/class-config.php:438 msgid "Password Reset Email" msgstr "" -#: includes/class-config.php:439 +#: includes/class-config.php:446 msgid "Whether to send an email when users changed their password (Recommended, please keep on)" msgstr "" -#: includes/class-config.php:445 +#: includes/class-config.php:452 msgid "Password Changed Email" msgstr "" -#: includes/class-config.php:452 +#: includes/class-config.php:459 msgid "Whether to send the user an email when he requests to reset password (Recommended, please keep on)" msgstr "" -#: includes/class-config.php:458 +#: includes/class-config.php:465 msgid "Account Updated Email" msgstr "" -#: includes/class-config.php:465 +#: includes/class-config.php:472 msgid "Whether to send the user an email when he updated their account" msgstr "" -#: includes/class-config.php:471 +#: includes/class-config.php:478 msgid "New User Notification" msgstr "" -#: includes/class-config.php:477 +#: includes/class-config.php:484 msgid "Whether to receive notification when a new user account is created" msgstr "" -#: includes/class-config.php:483 +#: includes/class-config.php:490 msgid "Account Needs Review Notification" msgstr "" -#: includes/class-config.php:490 +#: includes/class-config.php:497 msgid "Whether to receive notification when an account needs admin review" msgstr "" -#: includes/class-config.php:495 +#: includes/class-config.php:502 msgid "Account Deletion Notification" msgstr "" -#: includes/class-config.php:498 +#: includes/class-config.php:505 msgid "Whether to receive notification when an account is deleted" msgstr "" -#: includes/class-config.php:503 -msgid "Secure: Suspicious Account Activity" +#: includes/class-config.php:510 +msgid "Security: Suspicious Account Activity" msgstr "" -#: includes/class-config.php:504 +#: includes/class-config.php:511 msgid "[{site_name}] Suspicious Account Activity" msgstr "" -#: includes/class-config.php:506 +#: includes/class-config.php:513 msgid "Whether to receive notification when suspicious account activity is detected." msgstr "" -#: includes/class-config.php:534 +#: includes/class-config.php:541 msgid "Are you sure you want to delete your account? This will erase all of your account data from the site. To delete your account enter your password below." msgstr "" -#: includes/class-config.php:535 +#: includes/class-config.php:542 msgid "Are you sure you want to delete your account? This will erase all of your account data from the site. To delete your account, click on the button below." msgstr "" -#: includes/class-config.php:551 +#: includes/class-config.php:558 msgid "Restricted content" msgstr "" -#: includes/class-config.php:786 +#: includes/class-config.php:793 msgid "First and Last Name with '.'" msgstr "" -#: includes/class-config.php:787 +#: includes/class-config.php:794 msgid "First and Last Name with '-'" msgstr "" -#: includes/class-config.php:788 +#: includes/class-config.php:795 msgid "First and Last Name with '+'" msgstr "" -#: includes/class-config.php:789 +#: includes/class-config.php:796 msgid "User ID" msgstr "" -#: includes/class-config.php:790 +#: includes/class-config.php:797 msgid "Unique hash string" msgstr "" -#: includes/class-config.php:791 +#: includes/class-config.php:798 msgid "Custom usermeta" msgstr "" -#: includes/class-config.php:796 +#: includes/class-config.php:803 msgid "Default WP Display Name" msgstr "" -#: includes/class-config.php:799 +#: includes/class-config.php:806 msgid "First name & last name" msgstr "" -#: includes/class-config.php:800 +#: includes/class-config.php:807 msgid "Last name & first name" msgstr "" -#: includes/class-config.php:801 +#: includes/class-config.php:808 msgid "First name & first initial of last name" msgstr "" -#: includes/class-config.php:802 +#: includes/class-config.php:809 msgid "First initial of first name & last name" msgstr "" -#: includes/class-config.php:803 +#: includes/class-config.php:810 msgid "First name only" msgstr "" -#: includes/class-config.php:804 +#: includes/class-config.php:811 msgid "Custom field(s)" msgstr "" @@ -6360,12 +6963,24 @@ msgstr "" msgid "Ultimate Member Scanner" msgstr "" +#: includes/common/class-theme.php:212 +msgid "Theme version up to date" +msgstr "" + +#: includes/common/class-theme.php:216 +msgid "Theme version is empty" +msgstr "" + +#: includes/common/class-theme.php:219 +msgid "Theme version is out of date" +msgstr "" + #. translators: %s: Restricted post message. #. translators: %s: The message after registration process based on a role data and user status after registration #. translators: %s: Restricted blog page message. #. translators: %s: Restricted taxonomy message. #: includes/core/class-access.php:774 -#: includes/core/class-fields.php:1549 +#: includes/core/class-fields.php:1555 #: includes/core/um-actions-account.php:510 #: templates/message.php:23 #: templates/restricted-blog.php:41 @@ -6478,7 +7093,7 @@ msgid "You must provide a title" msgstr "" #: includes/core/class-builtin.php:276 -msgid "Telephone Box" +msgid "Telephone" msgstr "" #: includes/core/class-builtin.php:292 @@ -6522,7 +7137,7 @@ msgstr "" #: includes/core/class-builtin.php:785 #: includes/core/class-builtin.php:788 #: includes/core/class-builtin.php:1274 -msgid "Username or E-mail" +msgid "Username or Email" msgstr "" #: includes/core/class-builtin.php:807 @@ -6542,7 +7157,7 @@ msgstr "" #: includes/core/class-builtin.php:874 #: includes/core/class-builtin.php:877 -msgid "E-mail Address" +msgid "Email Address" msgstr "" #: includes/core/class-builtin.php:906 @@ -6724,11 +7339,11 @@ msgid "X (formerly Twitter) URL" msgstr "" #: includes/core/class-builtin.php:1561 -msgid "E-mail( Not Unique )" +msgid "Email( Not Unique )" msgstr "" #: includes/core/class-builtin.php:1562 -msgid "Unique E-mail" +msgid "Unique Email" msgstr "" #: includes/core/class-builtin.php:1563 @@ -6740,7 +7355,7 @@ msgid "Unique Username" msgstr "" #: includes/core/class-builtin.php:1565 -msgid "Unique Username/E-mail" +msgid "Unique Username/Email" msgstr "" #: includes/core/class-builtin.php:1567 @@ -8535,109 +9150,109 @@ msgid_plural "%s years old" msgstr[0] "" msgstr[1] "" -#: includes/core/class-fields.php:1570 +#: includes/core/class-fields.php:1576 msgid "Custom Field" msgstr "" -#: includes/core/class-fields.php:1934 +#: includes/core/class-fields.php:1940 msgid "Please upload a valid image!" msgstr "" -#: includes/core/class-fields.php:1948 +#: includes/core/class-fields.php:1954 msgid "Sorry this is not a valid image." msgstr "" -#: includes/core/class-fields.php:1951 +#: includes/core/class-fields.php:1957 msgid "This image is too large!" msgstr "" -#: includes/core/class-fields.php:1954 +#: includes/core/class-fields.php:1960 msgid "This image is too small!" msgstr "" -#: includes/core/class-fields.php:1957 +#: includes/core/class-fields.php:1963 msgid "You can only upload one image" msgstr "" -#: includes/core/class-fields.php:1989 +#: includes/core/class-fields.php:1995 msgid "Sorry this is not a valid file." msgstr "" -#: includes/core/class-fields.php:1992 +#: includes/core/class-fields.php:1998 msgid "This file is too large!" msgstr "" -#: includes/core/class-fields.php:1995 +#: includes/core/class-fields.php:2001 msgid "This file is too small!" msgstr "" -#: includes/core/class-fields.php:1998 +#: includes/core/class-fields.php:2004 msgid "You can only upload one file" msgstr "" -#: includes/core/class-fields.php:2527 +#: includes/core/class-fields.php:2533 msgid "Current Password" msgstr "" -#: includes/core/class-fields.php:2567 +#: includes/core/class-fields.php:2573 msgid "New Password" msgstr "" #. translators: %s: label. #. translators: %s: placeholder. -#: includes/core/class-fields.php:2618 -#: includes/core/class-fields.php:2636 -#: includes/core/class-fields.php:2639 +#: includes/core/class-fields.php:2624 +#: includes/core/class-fields.php:2642 +#: includes/core/class-fields.php:2645 msgid "Confirm %s" msgstr "" -#: includes/core/class-fields.php:2950 +#: includes/core/class-fields.php:2956 msgid "Upload Photo" msgstr "" -#: includes/core/class-fields.php:2977 -#: includes/core/class-fields.php:3021 +#: includes/core/class-fields.php:2983 +#: includes/core/class-fields.php:3027 #: includes/core/um-actions-profile.php:1078 msgid "Change photo" msgstr "" -#: includes/core/class-fields.php:3021 -#: includes/core/class-fields.php:3146 +#: includes/core/class-fields.php:3027 +#: includes/core/class-fields.php:3152 msgid "Processing..." msgstr "" -#: includes/core/class-fields.php:3049 +#: includes/core/class-fields.php:3055 msgid "Upload File" msgstr "" -#: includes/core/class-fields.php:3094 +#: includes/core/class-fields.php:3100 #: includes/core/um-filters-fields.php:386 msgid "This file has been removed." msgstr "" -#: includes/core/class-fields.php:3098 -#: includes/core/class-fields.php:3146 +#: includes/core/class-fields.php:3104 +#: includes/core/class-fields.php:3152 msgid "Change file" msgstr "" -#: includes/core/class-fields.php:3146 +#: includes/core/class-fields.php:3152 msgid "Save" msgstr "" #. translators: %s: edit user link. -#: includes/core/class-fields.php:4658 +#: includes/core/class-fields.php:4664 msgid "Your profile is looking a little empty. Why not add some information!" msgstr "" -#: includes/core/class-fields.php:4660 +#: includes/core/class-fields.php:4666 msgid "This user has not added any information to their profile yet." msgstr "" -#: includes/core/class-fields.php:4926 +#: includes/core/class-fields.php:4932 msgid "Please login as administrator." msgstr "" -#: includes/core/class-fields.php:4930 +#: includes/core/class-fields.php:4936 msgid "Invalid action." msgstr "" @@ -8698,8 +9313,8 @@ msgid "Wrong callback." msgstr "" #: includes/core/class-form.php:577 -#: includes/core/class-password.php:382 -#: includes/core/class-password.php:460 +#: includes/core/class-password.php:396 +#: includes/core/class-password.php:474 msgid "Hello, spam bot!" msgstr "" @@ -8712,168 +9327,176 @@ msgstr "" msgid "GDPR Applied" msgstr "" -#: includes/core/class-mail.php:642 -#: includes/core/class-password.php:684 +#: includes/core/class-mail.php:644 +#: includes/core/class-password.php:704 #: includes/core/class-profile.php:535 msgid "Your set password" msgstr "" -#: includes/core/class-member-directory-meta.php:458 -#: includes/core/class-member-directory-meta.php:464 -#: includes/core/class-member-directory.php:2611 -#: includes/core/class-member-directory.php:2617 +#: includes/core/class-mail.php:650 +msgid "Login to our site" +msgstr "" + +#: includes/core/class-mail.php:653 +msgid "Set your password" +msgstr "" + +#: includes/core/class-member-directory-meta.php:513 +#: includes/core/class-member-directory-meta.php:518 +#: includes/core/class-member-directory.php:2632 +#: includes/core/class-member-directory.php:2638 msgid "Wrong member directory data" msgstr "" -#: includes/core/class-member-directory.php:332 +#: includes/core/class-member-directory.php:349 msgid "Grid" msgstr "" -#: includes/core/class-member-directory.php:333 +#: includes/core/class-member-directory.php:350 msgid "List" msgstr "" -#: includes/core/class-member-directory.php:342 +#: includes/core/class-member-directory.php:359 msgid "First name" msgstr "" -#: includes/core/class-member-directory.php:343 +#: includes/core/class-member-directory.php:360 msgid "Last name" msgstr "" -#: includes/core/class-member-directory.php:346 +#: includes/core/class-member-directory.php:363 msgid "Last login" msgstr "" -#: includes/core/class-member-directory.php:352 +#: includes/core/class-member-directory.php:369 msgid "CHAR" msgstr "" -#: includes/core/class-member-directory.php:353 +#: includes/core/class-member-directory.php:370 msgid "NUMERIC" msgstr "" -#: includes/core/class-member-directory.php:354 +#: includes/core/class-member-directory.php:371 msgid "BINARY" msgstr "" -#: includes/core/class-member-directory.php:355 +#: includes/core/class-member-directory.php:372 msgid "DATE" msgstr "" -#: includes/core/class-member-directory.php:356 +#: includes/core/class-member-directory.php:373 msgid "DATETIME" msgstr "" -#: includes/core/class-member-directory.php:357 +#: includes/core/class-member-directory.php:374 msgid "DECIMAL" msgstr "" -#: includes/core/class-member-directory.php:358 +#: includes/core/class-member-directory.php:375 msgid "SIGNED" msgstr "" -#: includes/core/class-member-directory.php:359 +#: includes/core/class-member-directory.php:376 msgid "TIME" msgstr "" -#: includes/core/class-member-directory.php:360 +#: includes/core/class-member-directory.php:377 msgid "UNSIGNED" msgstr "" #. translators: %s: title. -#: includes/core/class-member-directory.php:373 -#: includes/core/class-member-directory.php:383 +#: includes/core/class-member-directory.php:390 +#: includes/core/class-member-directory.php:400 msgid "%s DESC" msgstr "" #. translators: %s: title. -#: includes/core/class-member-directory.php:385 +#: includes/core/class-member-directory.php:402 msgid "%s ASC" msgstr "" -#: includes/core/class-member-directory.php:976 -#: includes/core/class-member-directory.php:977 +#: includes/core/class-member-directory.php:993 +#: includes/core/class-member-directory.php:994 msgid " stars" msgstr "" -#: includes/core/class-member-directory.php:987 +#: includes/core/class-member-directory.php:1004 msgid "Age: {value} years old" msgstr "" -#: includes/core/class-member-directory.php:988 +#: includes/core/class-member-directory.php:1005 msgid "Age: {min_range} - {max_range} years old" msgstr "" -#: includes/core/class-member-directory.php:2374 -#: includes/core/class-member-directory.php:2418 +#: includes/core/class-member-directory.php:2396 +#: includes/core/class-member-directory.php:2440 #: includes/core/um-actions-profile.php:1445 #: includes/core/um-actions-profile.php:1476 msgid "Edit Profile" msgstr "" -#: includes/core/class-member-directory.php:2424 +#: includes/core/class-member-directory.php:2446 #: includes/core/um-actions-profile.php:1477 msgid "My Account" msgstr "" -#: includes/core/class-password.php:393 +#: includes/core/class-password.php:407 msgid "Please provide your username or email" msgstr "" -#: includes/core/class-password.php:411 +#: includes/core/class-password.php:425 msgid "You have reached the limit for requesting password change for this user already. Contact support if you cannot open the email" msgstr "" -#: includes/core/class-password.php:477 +#: includes/core/class-password.php:491 msgid "Unable to change password because of password change limit. Please try again later." msgstr "" -#: includes/core/class-password.php:483 +#: includes/core/class-password.php:497 msgid "You must enter a new password" msgstr "" -#: includes/core/class-password.php:496 +#: includes/core/class-password.php:511 #: includes/core/um-actions-account.php:67 #: includes/core/um-actions-register.php:322 msgid "Passwords may not contain the character \"\\\"." msgstr "" #. translators: %s: min length. -#: includes/core/class-password.php:521 +#: includes/core/class-password.php:536 #: includes/core/um-actions-account.php:104 msgid "Your password must contain at least %d characters" msgstr "" #. translators: %s: max length. -#: includes/core/class-password.php:526 +#: includes/core/class-password.php:541 #: includes/core/um-actions-account.php:108 msgid "Your password must contain less than %d characters" msgstr "" -#: includes/core/class-password.php:530 +#: includes/core/class-password.php:545 #: includes/core/um-actions-account.php:112 #: includes/core/um-actions-form.php:636 msgid "Your password cannot contain the part of your username" msgstr "" -#: includes/core/class-password.php:534 +#: includes/core/class-password.php:549 #: includes/core/um-actions-account.php:116 #: includes/core/um-actions-form.php:640 msgid "Your password cannot contain the part of your email address" msgstr "" -#: includes/core/class-password.php:538 +#: includes/core/class-password.php:553 #: includes/core/um-actions-account.php:120 #: includes/core/um-actions-form.php:644 msgid "Your password must contain at least one lowercase letter, one capital letter and one number" msgstr "" -#: includes/core/class-password.php:543 +#: includes/core/class-password.php:558 msgid "You must confirm your new password" msgstr "" -#: includes/core/class-password.php:547 +#: includes/core/class-password.php:562 #: includes/core/um-actions-form.php:656 msgid "Your passwords do not match" msgstr "" @@ -8971,6 +9594,14 @@ msgstr "" msgid "This file type is not recognized." msgstr "" +#. translators: %s is the file src. +#: includes/core/class-uploader.php:1012 +#: includes/core/class-uploader.php:1039 +#: includes/core/class-uploader.php:1087 +#: includes/core/class-uploader.php:1121 +msgid "Unable to crop image file: %s" +msgstr "" + #: includes/core/class-user.php:1123 msgid "Ultimate Member Role" msgstr "" @@ -9086,12 +9717,13 @@ msgid "You must provide your last name" msgstr "" #: includes/core/um-actions-account.php:160 -msgid "You must provide your e-mail" +#: includes/core/um-actions-form.php:924 +msgid "You must provide your email" msgstr "" #: includes/core/um-actions-account.php:164 #: includes/core/um-actions-account.php:168 -msgid "Please provide a valid e-mail" +msgid "Please provide a valid email" msgstr "" #: includes/core/um-actions-account.php:525 @@ -9197,13 +9829,13 @@ msgstr "" #: includes/core/um-actions-core.php:89 #: includes/core/um-actions-core.php:100 -#: includes/core/um-actions-core.php:113 -#: includes/core/um-actions-core.php:123 -#: includes/core/um-actions-core.php:136 +#: includes/core/um-actions-core.php:114 +#: includes/core/um-actions-core.php:124 +#: includes/core/um-actions-core.php:137 msgid "You do not have permission to make this action." msgstr "" -#: includes/core/um-actions-core.php:146 +#: includes/core/um-actions-core.php:147 msgid "You do not have permission to delete this user." msgstr "" @@ -9298,7 +9930,7 @@ msgstr "" #. translators: %s: max chars. #: includes/core/um-actions-form.php:745 -#: includes/core/um-actions-form.php:1063 +#: includes/core/um-actions-form.php:1059 msgid "Your user description must contain less than %s characters" msgstr "" @@ -9316,7 +9948,7 @@ msgstr "" #: includes/core/um-actions-form.php:824 #: includes/core/um-actions-form.php:831 #: includes/core/um-actions-form.php:838 -#: includes/core/um-actions-form.php:853 +#: includes/core/um-actions-form.php:852 msgid "Please enter a valid %s username or profile URL" msgstr "" @@ -9327,77 +9959,81 @@ msgid "Please enter a valid %s URL" msgstr "" #. translators: %s: label. -#: includes/core/um-actions-form.php:846 -#: includes/core/um-actions-form.php:867 -#: includes/core/um-actions-form.php:875 -#: includes/core/um-actions-form.php:883 +#: includes/core/um-actions-form.php:845 +#: includes/core/um-actions-form.php:865 +#: includes/core/um-actions-form.php:872 +#: includes/core/um-actions-form.php:879 msgid "Please enter a valid %s profile URL" msgstr "" -#: includes/core/um-actions-form.php:859 +#: includes/core/um-actions-form.php:858 msgid "Please enter a valid Discord ID" msgstr "" -#: includes/core/um-actions-form.php:889 +#: includes/core/um-actions-form.php:885 msgid "Please enter a valid URL" msgstr "" -#: includes/core/um-actions-form.php:896 +#: includes/core/um-actions-form.php:891 msgid "You must provide a username" msgstr "" -#: includes/core/um-actions-form.php:898 -#: includes/core/um-actions-form.php:912 +#: includes/core/um-actions-form.php:893 +#: includes/core/um-actions-form.php:905 msgid "The username you entered is incorrect" msgstr "" -#: includes/core/um-actions-form.php:900 +#: includes/core/um-actions-form.php:895 msgid "Username cannot be an email" msgstr "" -#: includes/core/um-actions-form.php:902 -#: includes/core/um-actions-form.php:916 +#: includes/core/um-actions-form.php:897 +#: includes/core/um-actions-form.php:909 msgid "Your username contains invalid characters" msgstr "" -#: includes/core/um-actions-form.php:910 +#: includes/core/um-actions-form.php:903 msgid "You must provide a username or email" msgstr "" -#: includes/core/um-actions-form.php:914 -#: includes/core/um-actions-form.php:936 -#: includes/core/um-actions-form.php:938 -#: includes/core/um-actions-form.php:940 -#: includes/core/um-actions-form.php:948 -#: includes/core/um-actions-form.php:950 -#: includes/core/um-actions-form.php:957 +#: includes/core/um-actions-form.php:907 +#: includes/core/um-actions-form.php:926 +#: includes/core/um-actions-form.php:928 +#: includes/core/um-actions-form.php:930 +#: includes/core/um-actions-form.php:937 +#: includes/core/um-actions-form.php:939 +#: includes/core/um-actions-form.php:946 msgid "The email you entered is incorrect" msgstr "" -#: includes/core/um-actions-form.php:934 -msgid "You must provide your email" -msgstr "" - -#: includes/core/um-actions-form.php:942 +#: includes/core/um-actions-form.php:932 msgid "Your email contains invalid characters" msgstr "" -#: includes/core/um-actions-form.php:972 +#: includes/core/um-actions-form.php:956 msgid "This is not a valid email" msgstr "" -#: includes/core/um-actions-form.php:991 +#: includes/core/um-actions-form.php:977 msgid "You must provide a unique value" msgstr "" -#: includes/core/um-actions-form.php:1001 +#: includes/core/um-actions-form.php:985 msgid "You must provide alphabetic letters" msgstr "" -#: includes/core/um-actions-form.php:1013 +#: includes/core/um-actions-form.php:993 +msgid "You must provide alphabetic letters or numbers" +msgstr "" + +#: includes/core/um-actions-form.php:1001 msgid "You must provide lowercase letters." msgstr "" +#: includes/core/um-actions-form.php:1009 +msgid "You must provide English letters." +msgstr "" + #: includes/core/um-actions-login.php:15 msgid "Please enter your username or email" msgstr "" @@ -9478,7 +10114,7 @@ msgstr "" #: includes/core/um-actions-misc.php:171 #: includes/core/um-filters-login.php:81 -msgid "Your account is awaiting e-mail verification." +msgid "Your account is awaiting email verification." msgstr "" #: includes/core/um-actions-misc.php:174 @@ -9499,11 +10135,6 @@ msgstr "" msgid "Your choosed %s" msgstr "" -#: includes/core/um-actions-profile.php:767 -#: includes/core/um-actions-profile.php:781 -msgid "Profile photo" -msgstr "" - #: includes/core/um-actions-profile.php:842 #: includes/core/um-actions-profile.php:858 #: includes/core/um-actions-profile.php:929 @@ -9689,7 +10320,11 @@ msgstr "" msgid "Close view photo modal" msgstr "" -#: templates/password-change.php:65 +#: templates/password-change.php:62 +msgid "Set password" +msgstr "" + +#: templates/password-change.php:64 msgid "Change password" msgstr "" @@ -9795,32 +10430,32 @@ msgstr "" msgid "This will permanently delete this custom field from a database and from all forms on your site. Are you sure?" msgstr "" -#: assets/js/admin/forms.js:113 +#: assets/js/admin/forms.js:159 msgid "Wrong AJAX response..." msgstr "" -#: assets/js/admin/forms.js:114 -#: assets/js/admin/forms.js:120 +#: assets/js/admin/forms.js:160 +#: assets/js/admin/forms.js:166 msgid "Your upgrade was crashed, please contact with support" msgstr "" -#: assets/js/admin/forms.js:119 +#: assets/js/admin/forms.js:165 msgid "Something went wrong with AJAX request..." msgstr "" -#: assets/js/admin/forms.js:144 +#: assets/js/admin/forms.js:191 msgid "Upgrade Process Started..." msgstr "" -#: assets/js/admin/forms.js:176 +#: assets/js/admin/forms.js:223 msgid "Getting metadata" msgstr "" -#: assets/js/admin/secure.js:27 +#: assets/js/admin/security.js:27 msgid "Scanning site.." msgstr "" -#: assets/js/admin/secure.js:33 +#: assets/js/admin/security.js:33 msgid "You can start the scan now but you must save the settings to apply the selected capabilities after the scan is complete." msgstr "" diff --git a/readme.txt b/readme.txt index c9f8bdf4..bb89947a 100644 --- a/readme.txt +++ b/readme.txt @@ -2,12 +2,11 @@ Author URI: https://ultimatemember.com/ Plugin URI: https://ultimatemember.com/ Contributors: ultimatemember, champsupertramp, nsinelnikov -Donate link: Tags: community, member, membership, user-profile, user-registration Requires PHP: 5.6 Requires at least: 5.5 Tested up to: 6.4 -Stable tag: 2.8.2 +Stable tag: 2.8.4 License: GNU Version 2 or Any Later Version License URI: http://www.gnu.org/licenses/gpl-3.0.txt @@ -42,6 +41,7 @@ Read about all of the plugin's features at [Ultimate Member](https://ultimatemem Ultimate Member has a range of extensions that allow you to extend the power of the plugin. You can purchase all of these extensions at a significant discount with our [All Access Pass](https://ultimatemember.com/pricing/) or you can purchase extensions individually. +* [Stripe](https://ultimatemember.com/extensions/stripe/) - Sell paid memberships to access your website via Stripe subscriptions * [User Notes](https://ultimatemember.com/extensions/user-notes/) - Allow users to create public and private notes from their profile * [Profile Tabs](https://ultimatemember.com/extensions/profile-tabs/) - Allow to add the custom tabs to profiles * [User Locations](https://ultimatemember.com/extensions/user-locations/) - Allow to display users on a map on the member directory page and allow users to add their location via their profile @@ -166,3339 +166,165 @@ No specific extensions are needed. But we highly recommended keep active these P IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -= 2.8.2: January 15, 2024 = += 2.8.5 2024-03-xx = -* Enhancements: - - Added: The `data` protocol for embedding base64 encoded logos in emails - - Added: Hook `um_access_restricted_post_instance` for filtering the restricted post instance - - Added: Shortcode `[um_author_profile_link]` for getting user Profile URL - - Updated: Using underscore.js native debounce method for resize handler - - Updated: Texts spelling -* Bugfixes: += 2.8.4 2024-03-06 = - - Fixed: AJAX requests conflict with `um_current_locale` attribute - - Fixed: Pickadate styling (Date & Time fields) in wp-admin screen - - Fixed: RTL styling and removed `um` class from UM frontend predefined pages - - Fixed: select2 conflict with Impreza theme - - Fixed: cropper conflict with Avada theme and active Fusion Image lazyload - - Fixed: MegaMenu conflict with nav menu items conditional settings (e.g. Newsletter theme) - - Fixed: PHP Fatal error when there isn't a proper WP_Post object in UM User Profile > Posts loop - - Fixed: Account styles - - Fixed: Saving `um_form_version` postmeta +**Enhancements** -* Templates required update: +* Tweak: Added separate file for full changelog. readme.txt shows only a few latest versions - - profile/posts-single.php +**Bugfixes** -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade +* Fixed: Member directory data sanitizing (CVE-2024-2123) +* Fixed: Activation link time changed from seconds to days +* Fixed: Password validation error +* Fixed: Password reset url for the approved user who didn't set their password after registration without password +* Fixed: Conflict with WebP Uploads -= 2.8.1: December 20, 2023 = += 2.8.3 2024-02-19 = -* Enhancements: +**Enhancements** - - Updated: Twitter texts to X - - Added: Safeguards against clickjacking attacks on UM Forms +* Added: Link to the Ultimate Member docs +* Tweak: Ultimate Member > Settings redesign. More details about setting up. Tooltips changed to descriptions. -* Bugfixes: +**Bugfixes** - - Fixed: Displaying notice to avoid using wrong symbols - - Fixed: UM > Settings button styles - - Fixed: Error notice when creating page via extensions - - Fixed: Workaround for Cropper.JS if UM.frontend.cropper.obj undefined (Cropper hasn't been properly inited for UM objects) - - Fixed: The visibility of sub-items of hidden menu items +* Fixed: Member directory queries to custom usermeta table properly escaped and validated +* Fixed: Member directory custom sorting when wp_usermeta table is used +* Fixed: aria-invalid attribute for the user description field +* Fixed: wp_kses protocols for email notifications content +* Fixed: PHP notice while registration form validation +* Fixed: Field validations (English letters, Alpha-numeric types) +* Fixed: Hidden buttons in the modal when uploading profile and cover photo +* Fixed: Theme updater log message +* Fixed: Search line shortcode layout +* Fixed: PHP notice while login form submission +* Fixed: Email notifications HTML layout +* Fixed: Default email notification body color +* Fixed: Ignore username slug when custom meta slug exists when parse user from query -= 2.8.0: December 11, 2023 = +**Templates required update** -* Enhancements: +* email/notification_deletion.php +* email/notification_new_user.php +* email/notification_review.php +* email/welcome_email.php +* password-change.php - - Refactored: wp-admin assets. Separated or merged some file based on the wp-admin screens - - Tweak: SASS pre-processor is used for wp-admin styles. - - Tweak: Using minified JS and CSS in wp-admin and frontend assets - - Tweak: Added PHP class UM()->admin()->screen() for screen control in wp-admin - - Updated: jquery-ui styles to 1.13.2 version. Prefixed with .um class. - - Updated: Cropper.JS to 1.6.1 version - - Note: Select2.JS version 4.0.13 - - Refreshed: Tipsy.JS to 1.0.0a version. Removed custom changes and restored library base code - - Refreshed: Raty.JS to 2.6.0 version. Restored library base code - - Refreshed: Pickadate.JS to 3.6.2 version. Restored library base code - - Updated: Used `um-tip-{x}` classes to make Tipsy.JS initialization commonly for wp-admin and frontend. - - Updated: wp-admin forms class and render icon type field - - Updated: Using `custom_submitdiv` on the UM Form and UM Member Directory screen to avoid custom styling for unnecessary metabox functionality. Just to render the necessary metabox content with only submission tools. +**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** -* Bugfixes: += 2.8.2 2024-01-15 = - - Fixed: Using fields with numeric keys in Form Builder - - Fixed: Pickadate.JS (datetime picker) localizations using - - Fixed: PHP notices on the SiteHealth and Form Builder pages - - Fixed: Using 'um_user_permissions_filter' hook and it's arguments. +**Enhancements** -* Deprecated: +* Added: The `data` protocol for embedding base64 encoded logos in emails +* Added: Hook `um_access_restricted_post_instance` for filtering the restricted post instance +* Added: Shortcode `[um_author_profile_link]` for getting user Profile URL +* Updated: Using underscore.js native debounce method for resize handler +* Updated: Texts spelling - - Removed Simplebar.JS library in Ultimate Member core. It's used only in extensions. - - Removed outdated styles and scripts for 1.3.x first install page - - `UM()->admin()->enqueue()->js_url` param. Please use `UM()->admin()->enqueue()::get_url( 'js' );` or `self::get_url( 'js' );` instead - - `UM()->admin()->enqueue()->css_url` param. Please use `UM()->admin()->enqueue()::get_url( 'css' );` or `self::get_url( 'js' );` instead - - `UM()->frontend()->enqueue()->js_url` param. Please use `UM()->frontend()->enqueue()::get_url( 'js' );` or `self::get_url( 'js' );` instead - - `UM()->frontend()->enqueue()->css_url` param. Please use `UM()->frontend()->enqueue()::get_url( 'css' );` or `self::get_url( 'js' );` instead - - Fully `UM()->permalinks()->um_rel_canonical_()` function. Because since version 2.1.7 there is used `um_profile_remove_wpseo();` alternative - - Fully `UM()->permalinks()->admin_act_url()` function. Since update for wp-admin links when there is nonce this function isn't used - - Fully `UM()->admin()->enqueue()->front_js_baseurl` param. - - Fully `UM()->admin()->enqueue()->front_css_baseurl` param. - - Fully `UM()->admin()->enqueue()->post_page` param. - - Fully `UM()->frontend()->enqueue()->load_google_charts()` function. Outdated. - - Fully `UM()->frontend()->enqueue()->load_fileupload()` function. Used scripts/styles dependencies to load script in the necessary place. - - Fully `UM()->frontend()->enqueue()->load_datetimepicker()` function. Used scripts/styles dependencies to load script in the necessary place. - - Fully `UM()->frontend()->enqueue()->load_scrollbar()` function. Outdated - - Fully `UM()->frontend()->enqueue()->load_imagecrop()` function. Used scripts/styles dependencies to load script in the necessary place. - - `UM()->is_um_screen()` function. Please use `UM()->admin()->screen()->is_own_screen()` instead - - `UM()->is_plugin_post_type()` function. Please use `UM()->admin()->screen()->is_own_post_type()` instead - - `UM()->is_restricted_entity()` function. Please use `UM()->admin()->screen()->is_restricted_entity()` instead - - `UM()->cpt_list()` function. Please use `UM()->common()->cpt()->get_list()` instead - - `um-admin-clear` CSS class. It duplicates WordPress native `clear`. Using WordPress native instead. - - `um-admin-tipsy-{x}` classes to make Tipsy.JS initialization commonly for wp-admin and frontend by `um-tip-{x}` class. +**Bugfixes** -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade +* Fixed: AJAX requests conflict with `um_current_locale` attribute +* Fixed: Pickadate styling (Date & Time fields) in wp-admin screen +* Fixed: RTL styling and removed `um` class from UM frontend predefined pages +* Fixed: select2 conflict with Impreza theme +* Fixed: cropper conflict with Avada theme and active Fusion Image lazyload +* Fixed: MegaMenu conflict with nav menu items conditional settings (e.g. Newsletter theme) +* Fixed: PHP Fatal error when there isn't a proper WP_Post object in UM User Profile > Posts loop +* Fixed: Account styles +* Fixed: Saving `um_form_version` postmeta -= 2.7.0: October 11, 2023 = +**Templates required update** -* Enhancements: +* profile/posts-single.php - - Added: Site Health sections - - Added: oEmbed field type - - Added: YouTube field type supports YouTube Shorts links - - Added: Profile permalink base options: Unique hash, Custom usermeta - - Added: UM Form meta `um_form_version` for legacy support in the future - - Added: Setting "Deleting user comments after deleting a user" for WordPress native logic workaround - - Added: `aria-invalid` and `aria-errormessage` attributes to the fields on UM Forms - - Updated: Structure for enqueue assets PHP classes - - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) +**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** -* Bugfixes: += 2.8.1: 2023-12-20 = - - Fixed: Member directory search query escaping process - - Fixed: Added 'ID' metakey to the blacklist. It's not possible to create field with 'ID' metakey to avoid the conflict - - Fixed: Add/Edit Field metabox and "Field Icon", "Conditional logic" fields - - Fixed: Init `jquery-slider-ui` script/style on the block editor page - - Fixed: Displaying "Notifications Account Tab" setting - - Fixed: Displaying Post Date on the User Profile > Posts tab based on this [article](https://make.wordpress.org/core/2019/09/23/date-time-improvements-wp-5-3/) - - Fixed: Small PHP warning, notices and typos +**Enhancements** -* Deprecated: +* Updated: Twitter texts to X +* Added: Safeguards against clickjacking attacks on UM Forms - - `UM()->enqueue()` use `UM()->frontend()->enqueue()` method - - `UM()->admin_enqueue()` use `UM()->admin()->enqueue()` method - - `UM()->admin_enqueue()->suffix` property use `UM()->frontend()->enqueue()::get_suffix()` - - `UM()->admin()->enqueue()->suffix` property use `UM()->frontend()->enqueue()::get_suffix()` - - Changed directories for the fonts (fonticons + raty), and JS/CSS files related to libs `jquery-ui`, `raty`, `select2`, `tipsy`, `fonticons (FontAwesome + Ionicons)` +**Bugfixes** -* Templates required update: +* Fixed: Displaying notice to avoid using wrong symbols +* Fixed: UM > Settings button styles +* Fixed: Error notice when creating page via extensions +* Fixed: Workaround for Cropper.JS if UM.frontend.cropper.obj undefined (Cropper hasn't been properly inited for UM objects) +* Fixed: The visibility of sub-items of hidden menu items - - account.php - - login.php - - password-change.php - - password-reset.php - - register.php - - profile/posts-single.php += 2.8.0: 2023-12-11 = -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade +**Enhancements** -= 2.6.11: September 06, 2023 = - -* Bugfixes: - - - Fixed: Empty mail From data when there isn't set an option - - Fixed: Nonce validation for the admin actions handler - - Fixed: REST API endpoint List Pages redirecting to the homepage - - Fixed: Standardize the 'editable' attribute for the UM fields and hooks that can extend these fields - - Fixed: Redirection from default WordPress registration to UM registration page (if it's not a published) - -= 2.6.10: August 17, 2023 = - -* Enhancements: - - - Added: 'um_can_view_profile' hook to operate with profile privacy - - Added: 'um_member_directory_core_search_fields' hook to operate with core searching fields in member directory search - - Tweak: Standardize the condition for checking not editable fields to `empty( $data['editable'] )` - - Tweak: Unified `UM()->fields()->editing` and `UM()->fields()->viewing` to bool variables use true|false in conditions to make `===` or `!==` comparing - - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) - -* Bugfixes: - - - Fixed: Restriction settings handler when there isn't a WP_Post in query. PHP notices in some cases when WP query is not canonical - - Fixed: User description (Biography) field conflict with validation (max chars) in both cases when HTML can be used or not. Case when there are 2 biography fields are displayed on the profile (header + form field) - - Fixed: Displaying WordPress native registration errors when unique username|email validation is disabled - - Fixed: Make links clickable in the Registration Details - - Fixed: WP_Users_Query on wp-admin > Users screen - - Fixed: Performance for `um_get_form_fields` hook - - Fixed: Admin Modal JS library conflict with bootstrap.js - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.6.9: July 26, 2023 = - -* Enhancements: - - - Added: Compatibility with UM:Stripe extension - - Added: Show/hide password button for toggle password visibility - - Added: JS scripts for syncing biography fields if there are the 1st field in the profile header and the 2nd field in the profile form - -* Bugfixes: - - - Fixed: Using allowed hosts for safe redirect after profile deletion - - Fixed: Nonce validation for the admin actions handler - - Fixed: Using singleton for UM Forms and UM Account shortcodes. Empty pages issue - - Fixed: PHP errors in admin notices - - Fixed: PHP errors on UM Profile update when there is multiselect field - - Fixed: UM Form and UM Member Directories titles un-slashed. Please re-update the entities where you have extra-slashes - - Fixed: Maximum allowed words option for textarea where you may insert HTML tags. Ignore HTML tags symbols when count - - Fixed: Sanitize for fields (Min characters, Max characters, etc.) where can be empty string or absint value - -* Templates required update: - - - profile.php - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.6.8: July 19, 2023 = - -* Enhancements: - - - Added: Secure settings. [Read more](https://docs.ultimatemember.com/article/1869-security-feature) - - Added: Admin notices about possible security issues. For example, regarding the roles with which the user can register on the site - - Added: `um_edit_profile_url` hook for force changing user profile edit URL - - Added: Additional hook attributes to 'um_reset_password_errors_hook' and 'um_reset_password_process_hook' - - Added: $form_data attribute to 'um_before_save_registration_details' hook - - Added: `um_safe_redirect()` function for handle `wp_safe_redirect()` function with new the "Allowed hosts for safe redirect" setting - - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) - -* Bugfixes: - - - Fixed: Updating user description if there isn't custom field on profile form, but field is displayed on profile top - - Fixed: Delete Row and Sub-Row actions in UM Form Builder. Avoid cases when fields from rows and sub-rows are still in form after delete their parents rows - - Fixed: Ultimate Member WP Cron schedule events starting time. Daily event starts since 12:00AM for now. The similar for weekly and twice-daily events - - Fixed: Custom sorting label issue on the Member Directory header - - Fixed: Disabled not-editable fields on UM Forms - - Fixed: Disabled fields attribute on UM Forms - - Fixed: Registration with empty role. Set default if role fields on the form are empty when form is submitted - - Fixed: Admin notices after UM actions has unique key with 'um_' prefix for now - - Fixed: Escaping form errors. It used `esc_html()` but now there is `wp_kses()` - - Fixed: Stop render 2 similar shortcodes on the same page (e.g. 2 login forms with the same `form_id`). To return back use [`um_ultimatemember_shortcode_disable_singleton`](https://ultimatemember.github.io/ultimatemember/hooks/um_ultimatemember_shortcode_disable_singleton.html) hook - - Fixed: Stop render Ultimate Member forms (Login, Profile, Registration, Member Directory) on the predefined Account page - - Fixed: Using blocks with Ultimate Member shortcodes on the predefined Ultimate Member pages - - Fixed: Using some specific functions which cannot exist if PHP modules are disabled - -* Deprecated: - - - Deprecated: Unnecessary `um_multiselect_option_value` hook - -* Templates required update: - - - members.php - -= 2.6.7: July 1, 2023 = - -* Bugfixes: - - - Fixed: A privilege escalation vulnerability used through UM Forms. Known in the wild that vulnerability allowed strangers to create administrator-level WordPress users. Please update immediately and check all administrator-level users on your website. - - Fixed: Displaying fields on Account page > Privacy > Member directory settings - - Fixed: Allowed types for the file field - - Fixed: Disabled weekdays for the datepicker field - -= 2.6.6: June 29, 2023 = - -* Bugfixes: - - - Fixed: Password Confirm field and validation - - Fixed: Form Builder row editing - - Fixed: Spotify URL user URL display on user profile - - Fixed: Spotify URL validation - -= 2.6.5: June 28, 2023 = - -* Enhancements: - - - Removed: `extract()` function and increase supporting WordPress Code Standards - - Updated: [Hooks Documentation v2](https://ultimatemember.github.io/ultimatemember/hooks/) - -* Bugfixes: - - - Fixed: A privilege escalation vulnerability used through UM Forms. Known in the wild that vulnerability allowed strangers to create administrator-level WordPress users. Please update immediately and check all administrator-level users on your website. - -= 2.6.4: June 27, 2023 = - -* Enhancements: - - - Added: Avoid using `extract()` function and increase supporting WordPress Code Standards - -* Bugfixes: - - - Fixed: PHP8.2 PHP errors (deprecated, warnings, etc.) - - Fixed: Using `str_contains()` in template override - - Fixed: Override templates and custom path for 'members-grid.php', 'members-header.php', 'members-list.php', 'members-pagination.php', 'searchform.php', 'login-to-view.php', 'profile/comments.php', 'profile/comments-single.php', 'profile/posts.php', 'profile/posts-single.php', 'modal/um_upload_single.php', 'modal/um_view_photo.php' template files - - Fixed: Custom emails data "--- UM Email HTML Templates ---" in Install info - -= 2.6.3: June 14, 2023 = - -* Enhancements: - - - Added: `um_profile_menu_link_{$id}_attrs` hook for changing link attributes - - Added: `get_member_directory_id()` function for getting member directory ID based on page ID - - Added: The "Order" and "Data type" settings for custom sorting fields based on metakey in Member Directory - - Added: New hooks `um_profile_permalink`,`um_external_profile_url` - - Added: Users dropdown field to Admin Forms class - - Added: Spotify URL field type - - Added: New developer docs [here](http://ultimatemember.github.io/ultimatemember/). It will be upgraded from version to version - -* Bugfixes: - - - Fixed: PHP8.2 PHP errors (deprecated, warnings, etc.) - - Fixed: Filters visibility on member directory page based on public or private visibility for filter's field - - Fixed: Incorrect Member Directory numerical sorting order - - Fixed: wp_editor() doesn't work correctly in content restriction settings for Mac users - - Fixed: Profile links when WPML plugin is active - - Fixed: ACF and UM blocks conflict - - Fixed: `UM()->mail()->locate_template()` function's visibility - -* Deprecated: - - - Deprecated: `um_localize_permalink_filter`. Use `post_link` instead - -* Templates required update: - - - members.php - -= 2.6.2: May 31, 2023 = - -* Bugfixes: - - - Fixed: Email notifications sending - - Fixed: File and Image uploaders and allowed types data for them - - Fixed: Content field-type editor in wp-admin Form Builder - - Fixed: Image and File uploaders max size saving in wp-admin Form Builder - -= 2.6.1: May 29, 2023 = - -* Enhancements: - - - Added: Override templates versioning utility for wp-admin - - Added: Style and class attributes to `info_text` field type in settings - - Added: Emails to install info - - Added: 'um_email_get_template_file_path' hook - - Added: Merging data passed with original field data when `edit_field()` function running - - Added: loading="lazy" for avatars and cover photos - - Tweak: Changed Discord account validation - - Tweak: Changes the structure for the Gutenberg blocks' scripts and way of registration - - Tweak: Removed `filter_input` function using - -* Bugfixes: - - - Fixed: Removed the hidden in UI taxonomies from the Access > Enable the "Content Restriction" settings for taxonomies setting - - Fixed: Dynamically declared variables inside the classes for PHP8 installations - - Fixed: Added wpnonce attribute for duplicate UM Form link - - Fixed: Sanitize restriction messages when Gutenberg block is restricted - - Fixed: Login form error class vulnerability - -* All templates required update. Please add the version comments to your custom templates in themes - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.6.0: March 29, 2023 = - -* Enhancements: - - - Added: Hook arguments ($form_id, $not_searched) to 'um_members_directory_head' - - Added: Using user locale `get_user_locale()` for localization with the 1st priority - - Added: Hooks to change the profile SEO image: 'um_profile_dynamic_meta_image_size', 'um_profile_dynamic_meta_image_type' - - Added: Filter for making 3rd-party roles editable through Ultimate Member interfaces. Use 'um_extend_editable_roles' and pass there an array of role keys( e.g. 'editor', 'administrator', etc. ) - -* Bugfixes: - - - Fixed: Major issues with the Member Directory search line - - Fixed: Social links (Twitch, TikTok, Reddit) colors in profile header - - Fixed: Exclude registered date field from editable fields - - Fixed: Create the custom table for usermeta if does not exists - - Fixed: Locale loading time and hook for that - - Fixed: Used `wp_unslash()` for input POST data on Change Password - - Fixed: Role setting "Avoid indexing profile by search engines" - - Fixed: Date Picker field value format for 3rd-party integration meta fields - - Fixed: Last login timestamp being lost in the users cache - - Fixed: Textdomain typos - - Fixed: Small PHP warnings and notices - -* Deprecated: - - - Deprecated: VKontakte and Google+ predefined fields. VKontakte and Google+ fields validation changed to just URL validation. - -* Templates required update: - - members.php - -= 2.5.4: February 17, 2023 = - -* Enhancements: - - - Added: TikTok, Twitch and Reddit fields - - Added: Handler of restriction settings for blog page - - Added: Support of the `` inside textarea with enabled the "HTML using" option - - Added: 'um_get_field_date' hook for filtering date fields - - Added: `UM()->get_allowed_html()` function for using it inside wp_kses allowed HTML tags - -* Bugfixes: - - - Fixed: Redirect to some links when content is restricted. Using `esc_url_raw()` instead of `esc_url()` for redirect to URLs inside class-access.php - - Fixed: Handle restriction settings for attachments, later hook is used for checking capabilities through `current_user_can()` - - Fixed: Honeypot triggering in password reset, when not set - - Fixed: Small PHP notices and warnings - -= 2.5.3: December 19, 2022 = - -* Bugfixes: - - - Fixed: Plugin upgrade DB initialization and PHP Fatal Error. - -= 2.5.2: December 14, 2022 = - -* Enhancements: - - - Added: Custom dropdown callback functions security enhancements. Avoid using blacklisted functions through namespace or uppercase format - - Added: Validation for upgrade package in wp-admin - - Added: `Change Password request limit` option for prevent from any brute-force attacks or password guessing with the form - - Added: Strong password checking for not using username|email inside the password - - Added: `um_custom_authenticate_error_codes` hook for handling 3rd-party login errors on UM invalid form - -* Bugfixes: - - - Fixed: Some texts sanitizing - - Fixed: PHP Error in url-type field on UM Forms - - Fixed: Using `wp_mkdir` to avoid the filesystem conflict when copy email template to theme - - Fixed: Password Reset URL generating - - Fixed: Multiple users approve - - Fixed: Using regular URL-type field for displaying - -* Templates required update: - - members.php - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.5.1: October 26, 2022 = - -* Enhancements: - - - Added: Custom fields callbacks blacklist. Use `um_dropdown_options_source_blacklist` filter for adding your custom functions to the custom callbacks blacklist. By default there are all PHP internal functions. - -* Bugfixes: - - - Fixed: Posts' restriction that is based on term restriction settings - - Fixed: Issue with class name in checkbox and radio. Class name being 'activeright' instead of 'active right' - - Fixed: Admin upgrade scripts and upgrades pack validation - - Fixed: Directory traversal vulnerabilities - - Fixed: Destroying user sessions after changing "Approved" status to something else (e.g. deactivated) - - Fixed: Conflict when `wp_get_current_user()` not exists. Transferred restriction settings callbacks to `plugins_loaded` hook - - Fixed: Restriction post displaying when 404 is enabled and old restiction logic isn't active - - Fixed: PHP warning when nav menu is empty - - Fixed: Disable auto-login after user is registered by Administrator and UM Registration form - - Fixed: Some typos errors - - Fixed: Using an apostrophe symbols in emails for registration and login both - - Fixed: Sanitizing YouTube links. Applying both https://youtu.be/xxxxxxx and https://youtube.com/xxxxxxx links - -* Deprecated: - - - Removed: Outdated setting using in code (force_display_name_capitlized). Moved the functionality to extended [repo](https://github.com/ultimatemember/Extended/tree/main/um-capitalize-name#readme) - -= 2.5.0: August 17, 2022 = - -* Enhancements: - - - Added: Input type "tel" using for the "Mobile Number" and "Phone Number" fields - -* Bugfixes: - - - Fixed: Performance issue on wp-admin Users screen. Queries were replaced to the cache transient values - - Fixed: Privacy policy displaying when there are 2 registration forms on the same page - - Fixed: Password Reset process via Ultimate Member - Password Reset form. Reset password links' arguments changed to the same view as WordPress native has. Password Reset available for the same cases as native WordPress Password Reset has - - Fixed: Sanitizing for the Info Text field-type in wp-admin forms. Needed for the proper 3rd-party integrations - - Fixed: Displaying the filters' titles on the Member Directory pages - -* Deprecated: - - - `UM()->query()->get_users_by_status()` without alternativities. It's unused since 2.5.0. Will be removed since 2.7.0 - - `UM()->user()->get_pending_users_count()`. Use `UM()->query()->get_pending_users_count()` instead. It's unused since 2.5.0. Will be removed since 2.7.0 - - `UM()->user()->remove_cached_queue()` without alternativities. It's unused since 2.5.0. Will be removed since 2.7.0 - -* Templates required update: - - password-change.php - - password-reset.php - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.4.2: July 14, 2022 = - -* Bugfixes: - - - Fixed: Member Directory vulnerabilities - - Fixed: 3rd-party integration with profile tabs and ability to show edit profile form on the 3rd-party profile tab - - Fixed: PHP fatal error on unset - - Fixed: select2 style conflicts with 3rd-party plugins - -= 2.4.1: June 13, 2022 = - -* Enhancements: - - - Added: Number-type Ultimate Member custom fields to the list of the sorting fields on the member directory - -* Bugfixes: - - - Fixed: XSS issue related to the JS confirmation and links with JS code inside - - Fixed: PHP error when `um_options` option in wp_options table doesn't exist or has wrong format - - Fixed: select2 styles for RTL languages - - Fixed: Using slashes in the `Choices callback` setting for the dropdown/multi-select fields. It's for the using PHP namespaces - - Fixed: Deleting `um_member_directory_data` user meta when user is deleted - - Fixed: Using special chars inside the password and avoid using "\" symbol (WordPress native logic) - - Fixed: Conflict when `wp_get_current_user()` not exists - - Fixed: Changed hook for member directory variables initialization for getting ability to use Ultimate Member hooks for customizing these variables via theme - - Fixed: Remove a redundant WP_Users_Query when getting empty `account_status` users - -= 2.4.0: June 1, 2022 = - -* Enhancements: - - - Added: "Allow external link redirect confirm" setting for the displaying JS.confirm alert before redirect to external link from User Profile links - - Added: "Allowed Choice Callbacks" setting for the security enhancements - -* Bugfixes: - - - Fixed: PHP warning when nav menu is empty - - Fixed: Security issue related to the User Description field - - Fixed: Security issue related to the [um_loggedin] shortcode - - Fixed: Using $current_screen without checking for existence - - Fixed: `remove_unused_uploads()` function for some PHP installations - -= 2.3.2: April 21, 2022 = - -* Enhancements: - - - Added: wp-admin notice with reminder about locking WordPress native registration for guests - - Added: Users dropdown field for Ultimate Member settings fields in wp-admin. It supports AJAX lazy loading - - Added: JS confirm when redirection from User Profile links to the 3rd-party URL - -* Bugfixes: - - - Fixed: PHP warning when there aren't proper user while login - - Fixed: Removing UM custom capabilities from global $wp_roles when uninstall - - Fixed: Removing UM custom roles from user roles after uninstall - - Fixed: Issue with echo XSS on User Profile - - Fixed: Sanitizing for the checkbox, radio, multiselect fields for PHP8 installations - -* Deprecated: - - - `um_whitelisted_wpadmin_access` hook and `wpadmin_allow_ips` option. They were unused and redundant since the 2.x version - -= 2.3.1: February 9, 2022 = - -* Enhancements: - - - Added: wp-admin notice on the Settings page when settings have been changed (#963) - - Added: WP Blocks restriction settings for the blocks (templates/nav-menu) on the FSE pages - - Added: UM-specific query_var for UM additional Users_Query on users.php screen in wp-admin. `um_custom_user_query` = true - - Added: Ability for dropdown.js to use it inside parent wrapper (not only document.body) - - Changed: Using WP Cron schedules. Un-schedule events after plugin deactivation - - Removed: `um_check_extensions_licenses` and replaced it to `um_daily_scheduled_events` event - -* Bugfixes: - - - Fixed: "Can user edit this field?" fields' option for the file/image upload field-types (#958) - - Fixed: Using uppercase symbols in the "Blocked Email Addresses" and "Blacklist Words" blacklists settings (#962) - - Fixed: PHP warning related to the Ultimate Member custom fields without type - - Fixed: Some typos in the labels (#975) - - Fixed: UX issue with wrong text on the admin notice about upgrade - - Fixed: UX issue with Blacklist Words and Blocked Email settings labels. Added a small description about per line separation (#962) - - Fixed: Sorting the Extensions settings sections - -= 2.3.0: December 20, 2021 = - -* Enhancements: - - - Added: WhatsApp, Telegram, Discord, Viber messengers predefined fields. - - Added: Callback for deleting the custom field data from member direcroty settings when this custom field has been deleted in Form Builder. - - Added: 'um_account_active_tab_inited' JS hook. - - Updated: Require a strong password option (`Ultimate Member > Settings > General > Users > Require a strong password?`) to make it common for all Ultimate Member forms. Renamed option key from `reset_require_strongpass` to `require_strongpass`. - - Updated: Form errors texts on the login/password reset forms. Made them secure. - - Deprecated: `Ultimate Member > Settings > General > Account > Require a strong password?` option and merged with `Ultimate Member > Settings > General > Users > Require a strong password?` option. - -* Bugfixes: - - - Fixed: "Clear All" button for the filters with "&" symbol in the label. - - Fixed: Uninstall process when delete UM data. Avoid the issue when 3rd-party pages that had been selected as UM page are removed on UM uninstall. - - Fixed: Header meta for the Twitter Card. If the user has twitter field filled then will be filled by this value. - - Fixed: Member directory a slider filter's label displaying. It uses the filled label for now. - - Fixed: SkypeID field validation. Also all SkypeID fields on your forms changed type from `url` to `text`. SkypeID supports nicknames or https://join.skype.com/{hash} links. - - Fixed: Typos in Account > Privacy tab texts related to Download/Erase the user data. - - Fixed: Some typos in the fields' labels. - - Fixed: "false" display name in the member directory. It displays empty for now if the user hasn't display name. - - Fixed: `UM()->clean_array()` function. - - Fixed: LinkedIn field URL. Added ability to display the organization URL. - - Fixed: Canonical link of the user profile if WPML plugin is active. - - Fixed: Replacing placeholders in nav menus. Used an earlier hook for filtering items before generating HTML and avoided issues with raw, not-escaped HTML inside tags' attributes. - -* Templates required update: - - members-grid.php - - members-list.php - - password-reset.php - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.2.5: September 22, 2021 = - -* Enhancements: - - - Added: Ability to insert SoundCloud track URL instead of Track ID - - Added: Settings for the password min/max length (Ultimate Member > Settings > Users) - -* Bugfixes: - - - Fixed: Invalid role keys on the role list-table + role edit screen (case when latin symbols used with not UTF-8 symbols) - - Fixed: Restriction logic and archive lists (+ nav menu bar) with active "Disable pre-queries for restriction content logic" option - - Fixed: Restriction settings fields conditions on wp-admin screens - - Fixed: Account `user_login` field validation removed as redundant. The field is disabled and not used in code flow - - Fixed: `display_name` data update after First + Last name fields edition on the Account page - - Fixed: Password length validation on the Account page and Password Reset page - - Fixed: Using custom fields from multi-select dropdowns for user's `Display Name`. Unserialized custom field's values - -= 2.2.4: August 27, 2021 = - -* Bugfixes: - - - Fixed: Hiding comments feed for pages with active comments - - Fixed: Changing the post title to the restricted value while displaying in the loop that uses direct `post_title` variable - - Fixed: PHP errors related to not passed function attributes from 3rd-party plugins or themes when using WP native hooks - - Fixed: Handling the login form errors via \WP_Error - -= 2.2.3: August 25, 2021 = - -* Enhancements: - - - Added: 'um_ignore_restricted_title' hook for workaround show post title of the restricted post - - Added: Disable pre-queries for restriction content logic ('disable_restriction_pre_queries') option for backward compatibility with business logic where 404 error for restricted content isn't a good way - - Added: Replace the restricted Post Title ('restricted_post_title_replace') option for ability to disable restricted post's title replace - -* Bugfixes: - - - Fixed: `pre_get_terms` callback to avoid the conflicts with other terms queries - - Fixed: Terms query and global access settings on PHP8 installations - - Fixed: Member directory dropdown filters where options contain `&` symbol - - Fixed: Displaying 404 error for the restricted Media - - Fixed: Displaying 'Login as this user' action on the user profile - - Fixed: Sanitizing of the social links fields (e.g. Twitter, Facebook, etc.) - - Fixed: Visibility of a restricted taxonomy page in the nav menu - - Fixed: Sanitizing key for the drag&drop action - - Fixed: Sanitizing the description field with allowed HTML inside - - Fixed: The "Assignment to constant variable" JS error on some sites - - Fixed: Keep description formatting in a view mode - - Fixed: Profile form nonce handling, security enhancement - - Fixed: `um_edit_profile_url()`` function and added $user_id attribute - - Optimized: Restriction content handlers, avoid queries duplicates or unnecessary queries - -= 2.2.2: August 3, 2021 = - -* Bugfixes: - - - Fixed: `is_restricted()` functions in class-access.php. Avoid using object as array offset - -= 2.2.1: August 2, 2021 = - -* Enhancements: - - - Added: Extended callback functions for sanitizing data in wp-admin forms fields - - Added: Restricted Access Post Title setting - -* Bugfixes: - - - Fixed: Restriction settings and related queries (comments, archives, recent posts, post navigation, etc.) - - Fixed: Sanitizing `max-width` value of the Login/Registration/Profile form settings - - Fixed: Sanitizing `in_group` field's data - - Fixed: Restriction settings related with `Hide in queries` - - Fixed: Restriction settings and CPU performance issues on some installations - - Fixed: Form meta settings and handling them on PHP8 installations - - Fixed: Make it clearer the restriction settings form labels - -= 2.2.0: July 20, 2021 = - -* Enhancements: - - - Added: Sanitizing handlers to the Ultimate Member > Settings forms' fields - - Added: Sanitizing handlers to the Ultimate Member > User Role Add/Edit forms' fields - - Added: Sanitizing handlers to the Ultimate Member > Forms forms' fields - - Added: Sanitizing handlers to the Ultimate Member > Forms > Add Field/Edit Field forms' fields - - Added: Sanitizing handlers to the Ultimate Member > User Roles forms' fields - - Added: Sanitizing handlers to the Restriction Content forms' fields in the posts/pages/menus additional fields - - Added: Sanitizing handlers to the all (Login/Registration/Profile/Account) frontend forms' fields - - Added: Custom placeholder setting for the Confirm Password field - -* Bugfixes: - - - Fixed: Content restriction settings using in Avada theme with active page headers - - Fixed: Content restriction (CPT + Terms). Avoid displaying comments if the post is restricted - - Fixed: Content restriction (CPT + Terms). Avoid displaying comments and posts feed - - Fixed: Content restriction (CPT + Terms). Displaying the proper count of the posts. Restricted are excluded - - Fixed: Saving and displaying settings on the UM > Settings > Access screen - - Fixed: Saving and displaying default Member Directory settings - - Fixed: Minor PHP warnings on registration data preview - - Fixed: Member directory slider filter-type query and results - - Fixed: Uploader filename displaying - -* Tweaks: - - - WordPress 5.8 compatibility. Widgets screen changes based on the new features with Legacy Widget block - -* Templates required update: - - members.php - - password-reset.php - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.1.21: June 17, 2021 = - -* Enhancements: - - Added: `um_scripts.max_upload_size` localized variable getting from `wp_max_upload_size()` - - Updated: dropdown.js library to make the stable working - -* Bugfixes: - - Fixed: Displaying different profile form shortcodes with different role visibility settings on the same page - - Fixed: Displaying avatar on the logout page - - Fixed: Role meta sanitizing and related XSS vulnerability - -* Templates required update: - - logout.php - - members.php - - members-list.php - -* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade - -= 2.1.20: May 7, 2021 = - -* Enhancements: - - Added: Hook `um_registration_for_loggedin_users` to unlock the ability to add new users through the registration form - - Added: Filter hook 'um_change_usermeta_for_update' for extending `$to_update` usermeta array after all profile fields validations - - Added: Filter hook 'um_profile_tabs_privacy_list' and 'um_profile_menu_can_view_tab' for extending privacy options for Profile Tabs - -* Bugfixes: - - Fixed: XSS vulnerability when getting user profile URL - - Fixed: Temp directory size calculation - -= 2.1.19: April 20, 2021 = - -* Bugfixes: - - Fixed: Endless JS loop when filtering on Member Directory page - -= 2.1.18: April 19, 2021 = - -* Bugfixes: - - Fixed: Endless JS loop when filtering on Member Directory page - - Fixed: Regular expression for registration form and username field (added ability to use spaces) (#812) - -= 2.1.17: April 14, 2021 = - -* Enhancements: - - Added: Activation link expiration setting (#803) - - Added: 'Owner and specific roles' privacy type for the Profile tabs (#773) - - Added: Hooks `um_before_email_notification_sending` and `um_after_email_notification_sending` regarding #743 pull-request - - Added: Hooks for integration member directory filters with different conditions for query to DB - -* Bugfixes: - - Fixed: Editing private profiles capability. Removed the priority for "Can edit other member accounts?" capability when the account is private. (#805) - - Fixed: PHP notice when the admin filtering field has the not array default value (e.g. bool) - - Fixed: The conflict with [Disable Blog](https://wordpress.org/plugins/disable-blog/) plugin regarding this [issue](https://wordpress.org/support/topic/ultimate-member-file-image-download/). `download_routing` callback has the highest priority now. - - Fixed: Fields privacy functionality. This function `um_can_view_field()` has been rewritten (#780) - - Fixed: Fields privacy + form validation functionality. Skip the field's validation that aren't visible on the form based on the privacy settings (#795) - - Fixed: PHP notice in the confirm password label [wp.org thread](https://wordpress.org/support/topic/undefined-index-label-php-notice/) - - Fixed: Confirm password placeholder when label is empty - - Fixed: Permanently deleting form's field (#786) - - Fixed: Default value with comma for checkbox field-type (#729) - - Fixed: Gutenberg blocks conditional settings (#793) - - Fixed: Getting active Profile tab when some of them are hidden - - Fixed: Restricted content message is showing twice and removing header, avoid the conflicts with themes that use 'the_content' filter in header or footer (#799) - - Fixed: "Is required" validation for the multiselect field-type when it's empty on submit - - Fixed: Using 'wp_login_failed' hook, added 2nd parameter required since WordPress 5.4 version (#810) - -= 2.1.16: March 10, 2021 = - -* Enhancements: - - Added: General and role setting to avoid indexing users' profiles - - Added: `um_prepare_user_results_array_meta` hook and the 2nd argument for `um_prepare_user_results_array` hook for handle $user_ids based on getting members query - - Added: Change password email when the password has been reset - - Added: jQuery v3 compatibility - - Added: An option "Administrator" in a menu settings to make the menu visible for administrators only - -* Bugfixes: - - Fixed: Creating and removing usermeta data with `password_rst_attempts` key, just update if exists for now - - Fixed: Using 'edit_users' capability instead of 'manage_options' for approve|reject membership - - Fixed: Using 'manage_options' capability instead of 'delete_users' for switching between members - - Fixed: Using myCRED points metakeys in UM usermeta table - - Fixed: Empty icons are shown in the popup "Choose from... available icons" - - Fixed: Member Directory slider filter with NaN or decimal range - - Fixed: PHP notices and warnings - - Fixed: Security vulnerability with User Account page and password field - - Fixed: User creating without username but based on first+last name with not-ASCII symbols - - Fixed: Password reset hash generating more than 1 time - - Fixed: Random order type translation string on the member directory - - Fixed: Resize and compress images when uploading on User Profile images fields or user wall - - Fixed: Displaying more than 1 UM popups on the same page - - Fixed: UM dropdown.js position calculation - - Fixed: Select2 dropdown block position calculation - -* Tweaks: - - Updated: Select2 to 4.0.13 version - -= 2.1.15: December 24, 2020 = - -* Bugfixes: - - Fixed: Conditional logic for the form fields without metakeys - -= 2.1.14: December 22, 2020 = - -* Enhancements: - - Added a tooltip with meta key name for fields in a form settings - - Added `Administrator` user role to a restriction setting (to make the content visible only for `Administrator` role) - -* Bugfixes: - - Added third parameter $args to the action hook for Profile Tab redirections `um_user_after_updating_profile` - - Fixed issues with fields without metakeys when trying to display them by the hook - - Fixed PHP notices/warnings - -= 2.1.13: December 8, 2020 = - -* Enhancements: - - - Added: `um_member_directory_cover_image_size` hook with ability to change the cover photo size on the member directory - - Added: `um_member_directory_avatar_image_size` hook with ability to change the profile photo size on the member directory - - Added: `um_member_directory_get_members_allow` JS hook for 3rd-party integration with the member directory. You could use a time throttle until some data is loaded - - Added: Notice about the fields' conditional logic rules + small CSS enhancements - - Added: Invalid nonce validation on Login and Registration pages instead of wp_die() - - Added: Privacy settings for the Divider field type (#688) - - Added: Ability for the integration with Gutenberg Block restriction settings (extends the block restriction settings via 3rd-party plugins) - - Added: Strings translations - -* Bugfixes: - - - Fixed: Upgrade process on websites where a hosting locks the frequent AJAX requests (added default JS throttle between requests) - - Fixed: Getting page content of the GDPR privacy policies - - Fixed: Password strength validation for Unicode symbols - - Fixed: Issue with apostrophe options in the multiselect/checkbox fields (#689) - - Fixed: Translation for Password field's label - - Fixed: Download Personal Data URL - - Fixed: Vulnerability with timestamp field on UM Forms (the hidden field with name='timestamp' is deprecated) - -* Tweaks: - - - There are changed PHP’s intval(), strval(), floatval(), and boolval() typecasting functions to (int), (string), (float) and (bool) regarding [this doc](https://make.wordpress.org/core/2020/11/20/miscellaneous-developer-focused-changes-in-wordpress-5-6/). - -= 2.1.12: October 29, 2020 = - -* Enhancements: - - - Added ratings required notice and warning - -* Bugfixes: - - - Fixed conflict with other plugins with user 'status' in admin - - Fixed security patch for UM forms handlers - - Fixed security patch for handlers on the edit users' roles - - Fixed member directory admin filtering by the field with uppercase in 'key' - - Fixed member directory sorting by the full name - - Fixed registration form with not editable role field - - Fixed PHP notice for the filter without field's label - - Fixed PHP notice on Admin_Form class initialization - - Fixed style of the textarea field - - Fixed Confirm Password field's placeholder - -= 2.1.11: October 6, 2020 = - -* Bugfixes: - - - Fixed can_view_profile() function - - Fixed security patch for role change via profile form - - Fixed admin-menu PHP notice - -= 2.1.10: September 23, 2020 = - -* Enhancements: - - - Deprecated the Feed widget from Ultimate Member dashboard - -* Bugfixes: - - - Fixed age filter at Member Directory when using WP native usermeta table - - Fixed the role field values at the user profile/registration forms - - Fixed PHP notice when cover photo is empty - - Fixed the conflict issue with Pickadate JS library and their legacy.js functions - - Fixed Gutenberg Blocks descriptions - -= 2.1.9: September 9, 2020 = - -* Bugfixes: - - - Fixed security patch for role change via profile form - -= 2.1.8: September 2, 2020 = - -* Enhancements: - - - Added dependency functions for extensions: [Ultimate Member - User Notes](https://ultimatemember.com/extensions/user-notes/) & [Ultimate Member - Profile Tabs](https://ultimatemember.com/extensions/profile-tabs/) - - Added unique IDs to the form fields at the Profile's view mode - - Added restrictions for WP > Users list table based on UM Roles capabilities - -* Bugfixes: - - - Removed additional slashes in the UM custom roles titles - - Fixed cleaning user old uploads and integration with Social activity & Groups files - - Fixed Info window fields (hide fields without metakeys) - - Fixed PHP warning in conditional logic function - - Fixed member directory preloader when using a slider filter - - Fixed 'redirect_to' attribute and approving user on registration - - Fixed activate an account via email - -= 2.1.7: August 12, 2020 = - -* Enhancements: - - - Added dependency functions for plugins: [Ultimate Member - JobBoardWP integration](https://wordpress.org/plugins/um-jobboardwp) & [JobBoardWP](https://wordpress.org/plugins/jobboardwp) - - Added account privacy setting for the avoiding profile indexation - - Added setting "Change image orientation" based on image EXIF data - - Added setting "Account Deletion without password Custom Text" - -* Bugfixes: - - - Fixed security lacks for 'redirect_to' attributes - - Fixed account submission when change a password - - Fixed updating UM roles metadata (WP capabilities section) when 3rd-party plugins update the caps for the UM roles - - Fixed member directory roles in query (the case when selected some roles, but current user can see another only) - - Fixed member directory sorting - - Fixed member directory list dropdown init after changing view type - - Fixed member directory admin filtering by the 'user_registered' field - - Fixed validation when using HTML in textarea - - Fixed cleaning user old uploads - - Fixed conditional logic for file/image-type fields - - Fixed "get_profile_photo_size" function (avoid PHP notice with array_combine) - - Fixed password reset/change form when other forms are initialized at the same page - - Fixed getting extension updates on multisites - - Fixed the 'wp_authenticate_user' filter's variables (changed username string to WP_User object) - - Fixed SEO link canonical for the profile page - - Fixed displaying error & notice when the text is empty - -* Deprecated: - - - Deprecated JS event 'um_before_modal_removed', use wp.hooks action 'um_before_modal_removed' instead - -= 2.1.6: June 1, 2020 = - -* Enhancements: - - - Added The profile page SEO meta tags for OG, Twitter and schema.org - - Added filter to the field's privacy option for the 3rd-party integrations 'um_field_privacy_options' - - Added layout changes to show email notification description in Settings > Email screen - - Added member directory option 'Exclude specific users' - - Added filter for the changing redirect after profile edited 'um_update_profile_redirect_after' - - Added JS filters for conditional logic - - Tweak: apply_shortcodes() function support - - Tweak: nav-menu custom fields using 'wp_nav_menu_item_custom_fields' hook - -* Bugfixes: - - - Fixed custom meta table fields migration (create, edit, remove field actions) - - Fixed wp-login.php and UM login form validation/errors triggers when using email for login - - Fixed profile form duplicates, show only the first form shortcode on the page for the user with selected role - - Fixed creating user uploads directory on registration - - Fixed Role fields validation on registration - - Fixed Erase User Data field on the Account page - - Fixed profile privacy - - Fixed SkypeID field - - Fixed clickable links in the UM forms which are displayed in a modal window - - Fixed disabling select and textarea fields in inactive tabs on Account - - Fixed compatibility with jQuery 3.x and 'load' event - - Fixed some translations - - Small PHP notices fixes - -= 2.1.5: April 2, 2020 = - -* Enhancements: - - - Added number field-type to member directory filters - - Changed export/erase personal data in account page - - Sanitizing variables in wp-admin - -* Bugfixes: - - - Fixed PHP notice 'form_id' on account submission - - Fixed birthday range for member directory filter - - Fixed fields visibility when user can edit other users - - Fixed honeypot JS - - Fixed edit mode for Role (Dropdown/Radio) fields (getting editable priority role) - -= 2.1.4: February 24, 2020 = - -* Enhancements: - - - Updated select2 JS library to 4.0.12 version - - Added a few member directories PHP and JS filters for 3rd-party integrations - - Added labels for member directories filters to increase Accessibility points in Audit - - Added formatting for submitted data - - Added fields notices functionality - - Added sanitizing $_GET variables in wp-admin side - -* Bugfixes: - - - Fixed activation licenses with sslverify - - Fixed fields' options if they contains spaces in the start and the end of option (added trim) - - Fixed getting range for slider filters - - Fixed 2.1.3-beta3 package upgrade - - Fixed resize image on registration form - - Fixed multiselect field styles - - Fixed issue with not editable fields and their visibility - - Fixed displaying header with member counts - - Fixed JS errors with not defined tinyMCE on Forms builder - - Fixed issues with "key => value" fields (dropdown + multiselect) if 'um_select_options_pair' filter is used - - Fixed social URLs validations - - Fixed Ultimate Member wrapper's visibility on add/edit user page (wp-admin) - - Fixed jQuery-UI library images - - Fixed vulnerability with sanitizing $_POST - - Fixed last login order on member directories when UM metatable is turned on - - Fixed RTL styles at Account page and Member Directory - -= 2.1.3: January 21, 2020 = - -* Enhancements: - - - Added sorting by Last & First name - - Added integrations with future extensions - - Added filter for changing the order of options in select-type filter - - Added GDPR template to get overwritten in the theme directory - - Added member directories' custom sorting labels - - Added ability to use custom metatable for faster requests for Member Directories - - Added ability to request Erase or Download user data via Privacy tab at the Account page - - Added an option to set the "Hide profile from directory" option by default - -* Bugfixes: - - - Fixed [um_loggedin] shortcode render with htmlspecialchars_decode - - Fixed checkbox options missing selections with conditional settings - - Fixed vulnerability with uploading cover/profile photo for other user ID - - Fixed integration with WPML for Account and User pages in case if there are different permalinks for different languages for these pages - - Fixed issues with pagination settings - - Fixed search line additional slashes - - Fixed issues with member results JS template - - Fixed getting posts count at the Posts tab for 3rd party integrations - - Fixed member directories' admin filtering - - Fixed issue with reset filters on member directory - - Fixed getting image/file custom fields values in form submission with not validated values - - Fixed JS handlers for select-type filters with callback and parent/child relations - - Fixed um_convert_tags for array-type values - - Fixed small CSS issues - -= 2.1.2: December 4, 2019 = - -* Enhancements: - - - Added text-type filters - - Added sorting for filters, tagline and reveal section fields - - Added universal hook for field's wrapper and improve rendering the field wrapper attributes - - Added returning only existed values for select-type filters - - Added checking privacy for custom fields in filters and general search, exclude private fields - - Added Form fields validation for E-mail( not unique ) - - Added $user_id attribute in update profile hooks for proper callbacks - -* Bugfixes: - - - Fixed fields privacy, editable and visibility attributes - - Fixed member directory styles - - Fixed random sorting - - Fixed conflict with 'php_data' variable in admin JS - - Fixed datepicker/timepicker filtering in the member directories - - Fixed initialization of datepicker, timepicker, slider filters when the "Show results only after search/filtration" option is active - - Fixed callback select-type filters handlers on member directories filters bar - - Fixed cover photo thumbnail sizes in member directory - - Fixed Role filter - - Fixed clearing filters with || condition - - Fixed endless recursion in the function um_check_conditions_on_submit() - - Fixed issue that appears if we try to update several plugins at once - - Fixed using different templates for different member directories - - Fixed form previews, added overlay and displayed buttons - - Fixed wp-admin/admin-post.php access issue - -= 2.1.1: November 12, 2019 = - -* Bugfixes: - - Fixed admin actions hook - - Fixed JS templates for list and grid view when user metakeys contain "-" symbol - - Fixed JS template list "$show_block" issue - - Fixed member directory search if 'roles_can_search' is set - - Fixed member directory filters bar animation - - Fixed save profile with Last Login field - - Fixed admin builder for profile form, show not editable fields - -= 2.1.0: November 11, 2019 = - -* Enhancements: - - Added member directory list view - - Added member directory search bar - - Added member directory filters by range, date and time - - Added AJAXed member directories - - Updated member directories' search engine - - Additional parameter 'user_id' to action hook 'um_user_after_updating_profile' - - Added ability to set profile/cover image sizes from Ultimate Member -> General -> Uploads settings or Original size - - Added ability edit cover photo HTML (e.g. for adding some HTML attributes. See how add srcset attribute based on all generated cover sizes [here](https://docs.ultimatemember.com/article/1519-change-cover-photo-html)) - - Added custom date format for Date Picker field - - Added hook 'um_show_meta_item_html' to customize user meta HTML at User Profile page - - Added "aria-label" attribute in Field icon - -* Bugfixes: - - Optimized usermeta for Account submit security - - Fixed flushing rewrite rules on every page reloading - - Fixed Gmail & Yahoo UTF-8 encoding of email notification subject - - Fixed ajax_resize_image() process - - Fixed country fields values - - Fixed dynamic_profile.php notice - - Fixed integration with WP native admin_post and admin_post_nopriv requests - - Fixed profile image settings - - Fixed profile privacy for not logged in users, if restriction options set for profile page as visible only for logged in and showing message instead of redirect - (it makes the same for {site_url}/user and {site_url}/user/{user_slug} ) - - Fixed security issue on registration form submission when username or email have conditional logic - - Fixed RTL styles issues on user profile and account pages - - Fixed upload profile/cover photos at the profile page, don't apply until the crop finished - - Fixed alphabetical field validation for cyrillic and not UTF-8 symbols - - Fixed user profile validation if username, username or email, password and email fields were added to form - - Fixed user profile preview in admin Form Builder - - Fixed getting templates function for some Windows servers - - Fixed plugin update process for multisites - - Fixed function "um_apply_conditions". An error appears with jQuery v2.1.3 - - Localized um-raty.js library - - Localized strings - -= 2.0.56: August 21, 2019 = - -* Enhancements: - - Added security fixes (XSS) - - Added hooks for 3rd party integrations - - Updated Datepicker & Timepicker library from 5.6 to 6.2 version - -* Bugfixes: - - Fixed validation of forms conditional fields at the backend (for the nesting fields) - - Fixed edit profile mode when profile menu is disabled - - Fixed RTL styles and layouts - - Fixed user profile description validation - - Fixed JS errors on some installs - - Fixed ability approve users by Administrator with special capabilities - - Fixed multiselects' retrieval of options from callback function - - Fixed save process and conditional logic for Appearances -> Profile Menu settings section - - Fixed uninstall process - - Fixed is_selected method for some cases - - Fixed form settings fields for default button labels in wp-admin metaboxes - - Fixed generate metakeys for the form's custom fields - - Fixed issue when UM Roles localized as object on Add/Edit User screen - - Fixed PHP notices - -= 2.0.55: August 16, 2019 = - -* Bugfixes: - - Fixed profile privacy for not logged in users, if restriction options set for profile page as visible only for logged in - -= 2.0.54: July 22, 2019 = - -* Enhancements: - - Added security fixes (XSS) - -* Bugfixes: - - Fixed update process for not UM custom role - - Fixed extensions licenses validation handler - - Fixed profile tabs handlers - -= 2.0.53: July 16, 2019 = - -* Enhancements: - - Added option to disable profile avatar uploader - - Moved extensions icons to core - -* Bugfixes: - - Fixed Profile Tabs Privacy settings - - Fixed Notifications Account tab view - - Fixed warnings on validation process - - Fixed slashes in some texts from options - - Fixed callback functions for select and multiselect fields - -= 2.0.52: July 11, 2019 = - -* Enhancements: - - Extended hooks for 3rd party integrations - -* Bugfixes: - - Fixed settings labels with CPT & Taxonomies - - Fixed UM Roles create/edit XSS security issue - - Fixed XSS security issue on account upgrade - -= 2.0.51: July 09, 2019 = - -* Bugfixes: - - Fixed UM Roles create/edit security issue - -= 2.0.50: July 02, 2019 = - -* Enhancements: - - Extended hooks for 3rd party integrations - -* Bugfixes: - - Fixed PHP notices when runs validation - - Fixed loop issue with Profile tabs - - Fixed home page restrictions - -= 2.0.49: May 29, 2019 = - -* Enhancements: - - Extended hooks for 3rd party integrations - -* Bugfixes: - - Fixed security vulnerability with registration form - - Fixed the using of deprecated send password hook - -= 2.0.48: May 16, 2019 = - -* Enhancements: - - Added an ability to 3rd party integration with cover image actions - -* Bugfixes: - - Fixed ability to edit profile on not predefined Profile Page - -= 2.0.47: May 14, 2019 = - -* Bugfixes: - - Fixed save special characters values - - Fixed trim fields options before validation - - Fixed save empty value at Profile Registration form in radio/checkbox/select/multiselect fields - - Fixed displaying empty value of multiselect field at Profile Page - - Fixed cover photo dropdown menus - -= 2.0.46: May 10, 2019 = - -* Bugfixes: - - Fixed extensions' upgrader - - Security vulnerabilities on Profile/Registration submit and file/images uploading - - Fixed session clean on logout - -= 2.0.45: May 08, 2019 = - -* Bugfixes: - - Fixed issues with Gutenberg scripts and UM blocks - - Security vulnerabilities on Profile/Registration submit and file/images uploading - -= 2.0.44: May 08, 2019 = - -* Enhancements: - - Added automatically template saver when you upgrade your theme - - Added default value for Date and Time user profile fields - - Updated Scroll library - - Added REST API v2 class with new query vars. There is an ability to select v1 or v2 for use. For old users v1 is default, for new users v2 - -* Bugfixes: - - Added nocache headers to reset password form - - Email templates saving to child theme, if parent theme already has email template files - - Email templates locate in the default plugin folder with active WPML - - Form builder with some predefined form fields, which had different keys/metakeys (currently use the same) - - Logout redirect with active WPML - - Fixed $_SERVER usage when WP-CLI using - - Extended integration for UM field value - - um_user function avoid loop when 'display name' and 'full name' used - - Restriction options for Terms and access on front-end - - Plugin/Theme upgrader - - Remove duplicate data 'user_login' from metadata - - Replace placeholders duplicates - - Password Reset link regeneration - - Fixed issues with scroll on mobile devices - - Fixed multisite activation - -* Deprecated: - - "Is Account page?" and "Is User page?" options for WPML integration ( because WPML translations works properly ) - -= 2.0.43: March 29, 2019 = - -* Bugfixes: - - Fixed Last Login order in Member Directory - -= 2.0.42: March 28, 2019 = - -* Enhancements: - - Added option for enable/disable Gutenberg blocks - -* Bugfixes: - - Fixed conflicts with themes, which not support custom Gutenberg blocks via the option - -= 2.0.41: March 27, 2019 = - -* Enhancements: - - Added Gutenberg blocks section with Ultimate Member shortcodes - - Clear temp directory on upload process 1 day files old - - Updated custom scrollbar JS library to jQuery 3 support - -* Bugfixes: - - Fixed vulnerability with Reset Password form - - Fixed Edit Row settings - - Fixed save profile fields with 0 values - - Fixed upload photo base URL for Windows servers - - Fixed displaying user Posts at Profile/Posts tab - - Fixed unique filename issue, upload avatar with high case extension - - Fixed member directory filter title - - Fixed duplicate delete user handler - - Fixed sorting by Last Login date for users without meta - - Fixed hook after password reset (issue #532) - - Fixed member directory user role filter - - Fixed restriction content WC Products integration - - Fixed words count for French in user description field - - Fixed is_selected function for dropdown/multi-select/checkbox profile fields - - Fixed disable email field at Edit Profile form via filter (disabled by default) - -= 2.0.40: March 12, 2019 = - -* Bugfixes: - - Fixed security issue on user Account Update - -= 2.0.39: February 11, 2019 = - -* Enhancements: - - Restored option for disable users cache - - Transposh plugin integration - -* Bugfixes: - - Fixed delete users handlers on single/multisite installs - - Fixed fields labels on member directory - - Fixed profile form cover photo ratio value - - Fixed profile and registration form default field's values - - Fixed "is_selected" function with empty value and default value option - - Fixed member directory notices with disabled metadata - - Fixed textarea profile field formatting - - Fixed registration without username field - - Fixed flush password reset limit after successfully login - - Fixed upload files handlers for avoid the conflicts with other plugins - -= 2.0.38: January 10, 2019 = - -* Enhancements: - - Added option to enable Gutenberg Blocks restriction - -= 2.0.37: January 8, 2019 = - -* Enhancements: - - Additional Block's restriction options - - Added column to show User Account Status - - Added filter for disabling Gutenberg blocks restriction to avoid themes conflicts - -= 2.0.36: January 7, 2019 = - -* Enhancements: - - Added Block's restriction options - - Added compatibility for upcoming User Events extension - -* Bugfixes: - - Fixed Live Preview form at wp-admin - - Fixed tinyMCE editor loading in form builder - - Fixed external function for dropdown options - - Fixed Add New Menu Item handler - - Fixed small notices at frontend - - Fixed a few admin settings fields - - Fixed displaying comments when they are disabled - -= 2.0.35: December 9, 2018 = - -* Bugfixes: - - Fixed JS/CSS enqueue at wp-admin - -= 2.0.34: December 7, 2018 = - -* Enhancements: - - Added new "Extensions" class for future integrations - -* Bugfixes: - - Fixed logout redirect vulnerability - - Fixed modal window responsive position - - Fixed class autoloader for Windows servers - - Fixed admin forms integration - - Fixed empty value for select2 selectbox - - Fixed unchecked Remember Me by default on login page - - Fixed admin forms esc_attr value - - Fixed admin forms buttons wp_unslash - - Fixed get/clean plugin upgrades on multisites - - Fixed verify nonce on $_GET requests - -* Deprecated: - - removed "UM_TEXTDOMAIN" constant - - removed function UM()->get_ajax_route() for AJAX vulnerability fix - -= 2.0.33: November 22, 2018 = - -* Bugfixes: - - Fixed AJAX vulnerabilities - - Fixed delete user email notification - - Fixed profile tabs displaying - -= 2.0.32: November 20, 2018 = - -* Bugfixes: - - Added compatibility with PHP7.2 (removed deprecated functions and ini variables) - - Fixed duplicated "redirect_to" field - - Fixed errors on the installs < PHP5.6 - - Fixed download files/images on the installs with the different home URL and site URL - - Fixed unique emails in admin email notifications - - Remove language notice, all translates are available on wp.org - -= 2.0.31: November 14, 2018 = - -* Bugfixes: - - Fixed compatibility with JS/CSS cache plugins - -= 2.0.30: November 12, 2018 = - -* Bugfixes: - - Fixed crop settings of the big images - - Fixed WPML integration with email notifications - - Fixed uppercase symbols using at profile page slug - - Fixed download files/images with cache - - Fixed download files/images with not closed buffers - - Fixed looping in case if set 'display_name' as custom fields for display name setting - - Fixed cover photo size - - Fixed date time internalization - - Fixed posts pagination for un-logged users - - Fixed conditional JS - - Fixed "um_" prefix for role data - - Added compatibility for upcoming User Bookmarks extension - -= 2.0.29: October 8, 2018 = - -* Bugfixes: - - Fixed User Profile Posts pagination - -= 2.0.28: October 5, 2018 = - -* Bugfixes: - - Fixed Email notifications - - Fixed Download files/images for multisites - - Fixed Profile/Cover image for multisites - - Fixed XSS vulnerabilities (detected by @Serhack) - - Fixed trim fields on submit forms - - Fixed submitted info - -= 2.0.27: October 2, 2018 = - -* Bugfixes: - - Fixed files class - -= 2.0.26: October 2, 2018 = - -* Enhancements: - - New files/images downloading process - - Added dependencies with User Photos and Groups extensions - -* Bugfixes: - - File/Image email placeholders after registration form submitting - - File/Image forms fields values on submit/edit - - Fixed multisite file/image upload process - - Fixed clearing old user sessions after the changing a password - - Made reset password process via WP native functions - -= 2.0.25: August 20, 2018 = - -* Enhancements: - - Upgrade minified scripts - -= 2.0.24: August 15, 2018 = - -* Bugfixes: - - WP native AJAX using - - Force purge temp files dir - -= 2.0.23: August 10, 2018 = - -* Bugfixes: - - Fixed File/Image uploader - -= 2.0.22: August 9, 2018 = - -* Enhancements: - - Added an ability to filter user's profile slug "um_change_user_profile_slug" - - Added an ability to filter pages for exclude restriction content settings "um_exclude_posts_from_privacy" - -* Bugfixes: - - Fixed callback functions in member directory search - - Fixed Profile Privacy Settings for different languages - - Fixed security vulnerabilities (File/Image uploader) - - Fixed security vulnerabilities (HTML arguments) - - Fixed search in members directory for some cases, when metadata format isn't correct - - Fixed some cases in conditional logic - - Fixed WP Capabilities list for Gravity Forms - - Fixed View Profile capabilities - -* Deprecated: - - Filters "um_before_user_upload", "um_after_user_upload" - -= 2.0.21: July 9, 2018 = - -* Bugfixes: - - Fixed search in members directory by User Tags field (other case) - -= 2.0.20: July 6, 2018 = - -* Bugfixes: - - Fixed search in members directory by User Tags field - -= 2.0.19: July 5, 2018 = - -* Bugfixes: - - Fixed few JS file's full versions - - Fixed search in members directory by multiselect/radio/checkbox field - - Fixed first activation role metadata reset - -= 2.0.18: July 4, 2018 = - -* Enhancements: - - Added an ability to create different email templates for each site on multisites installs - - Added major version notice - - Added an ability to make Profile Form visible for 2 or more roles - - Added ability to dismiss some UM notices - - Redesign some parts of field's conditional logic settings - -* Bugfixes: - - Fixed PHP memory limit issue on some installs. Created pseudo-constructor - - Disabled email notification to user, which wasn't approved about delete their account - - Fixed profile tabs privacy - - Fixed default avatars and Gravatar displaying - - Fixed get current URL function - - Fixed admin bar displaying - - Fixed members directory search - - Fixed nav-menu items restriction handlers - - Fixed user displaying on multisite (added 404 error in some cases) - - Fixed XSS at wp-admin settings screen - - Fixed user's "user_login" permalinks - - Fixed user's capabilities ("Edit", "Delete" user) and profile actions displaying - - Fixed field's conditional logic - - Fixed issue with account button ID's duplicates - -* Deprecated: - - REST API user's key option; - -= 2.0.17: May 30, 2018 = - -* Enhancements: - - Added UM dashboard widget for getting latest extension's upgrades - -* Bugfixes: - - Fixed User Profile restriction when the user isn't logged in - - Fixed Profile Tabs displaying on desktop/mobile - - Fixed set user status after registration on some installs - - Fixed PHP memory limit issue on some installs with small PHP memory limit - - Fixed PHP validation on submit UM Forms with conditional fields logic - -= 2.0.16: May 23, 2018 = - -* Bugfixes: - - Fixed Profile Tabs issues - -= 2.0.15: May 22, 2018 = - -* Bugfixes: - - Fixed GDPR min.js script - -= 2.0.14: May 22, 2018 = - -* Enhancements: - - Added support for GDPR Personal Data Exporter - - Added support for GDPR Personal Data Eraser - - Added new privacy field to form builder for GDPR consent collection - - Added GDPR privacy policy guide text - - Added GDPR compatibility on delete user process - - Added security to Restricted posts comments - - Added security to custom field type `Password` - - Deprecated time checking spam bot - -* Bugfixes: - - Fixed settings tabs for PHP7.1 - - Fixed issues with Profile Tabs - - Fixed User Avatars - - Fixed set user status on Registration process - - Fixed Account Privacy tab content - -= 2.0.13: May 2, 2018 = - -* Bugfixes: - - Fixed and optimized user avatars - - Fixed Profile Menu on some installs - - Fixed fields IDs duplicates - - Fixed cache users count - -= 2.0.12: April 30, 2018 = - -* Bugfixes: - - Fixed approving users with "Administrator" role - - Fixed problem with URLs for upload images - - Fixed not UM roles, which start from "um_" symbols - - Fixed content restriction logic - -= 2.0.11: April 19, 2018 = - -* Bugfixes: - - Fixed profile form JS - -= 2.0.10: April 17, 2018 = - -* Bugfixes: - - Fixed Profile Form field privacy - - Fixed conditional menu logic for 2 different nav menu hooks - - Fixed registration form preview on wp-admin screen - - Restored old CSS settings to "um_old_settings.css" - - Clean user's cache - -= 2.0.9: April 15, 2018 = - -* Bugfixes: - - Fixed registration form role - -= 2.0.8: April 13, 2018 = - -* Bugfixes: - - Fixed license activation - -= 2.0.7: April 13, 2018 = - -* Bugfixes: - - Fixed add rewrite rules for UM pages - - Fixed Profile Form, Registration Form use custom settings and role - - Fixed save settings security - -= 2.0.6: April 12, 2018 = - -* Bugfixes: - - Fixed nav-menu content restriction issues for Administrator role - -= 2.0.5: April 12, 2018 = - -* Bugfixes: - - Fixed old pre2.0 extensions notices - - Fixed nav-menu content restriction issues - - Fixed lost password URL in UM Login Form - - Fixed restriction message on taxonomy page, which is restricted - -= 2.0.4: April 10, 2018 = - -* Enhancements: - - Added activation dependencies for extensions - - Added Licenses checking and changed Licenses page - - Added uninstall.php file for delete permanently all UM settings - - Added ability to register users without WP Registration enabled - - Added visual integration WPML+UM email notifications - - Added Account Upgrade email notification - - Added ability to register users using role field on Registration Form - - Added Account page shortcodes for each tab content - - Changed UM Option View (deprecated/added options) - - Changed UM Roles, optimized for WP native logic - - Changed backend forms/fields to WP native styles - - Changed Content Restriction feature for posts, taxonomies, menus - - Changed Email Notifications settings and using templates logic - - Deprecated Redux Framework - - Deprecated old unusable options - - Deprecated old unusable forms metadata - - Deprecated old unusable member directories metadata - - Deprecated old unusable user roles metadata - - Optimized registration/upgrade profile process (some hook deprecated) - - Optimized some code parts, deprecated some functions - - Updated `FontAwesome` library - - Removed addons to separate extensions - - Created Plugin Updater for getting updates and license details from Shop - - Increased integration abilities, added new hooks (see new Hooks Docs + PHP documentation); - - Integrated plugin activation, user creation processes with multisite - - Make dependencies with extensions - - OOP structure without procedural methods for wp-admin side; - -* Bugfixes: - - Fixed avatars on some SSL installs - - Fixed some vulnerabilities - - Fixed integrations with core/extensions - - Fixed `Edit Profile` button at members directory - - Fixed conditional logic PHP validation and JS validation (for IE,Edge browsers) - - Fixed textdomains for translations - - Fixed integration with Woocommerce, SEO Framework, WPML - - Fixed navigation menu items custom fields (`Mega Menu`, etc. compatibility) - - Fixed theme conflicts with UM js libraries - - Fixed and optimized handlers for user permalinks - - Fixed replace placeholders for users - - Fixed conditional fields logic - - Fixed fields sanitize for remove XSS injections - -= 1.3.88: July 25, 2017 = - -* Enhancements: - - Add new filter hook `um_add_user_frontend_submitted` - - Add class for member tagline in directory grid `um-member-tagline-` - - Add recaptcha support and submit button id - - Update extensions page layout - -* Bugfixes: - - Fix Conditional Logic fields - - Fix required field with specific roles in privacy - - Remove wpautop from biography - - Remove notices - -= 1.3.87: June 24, 2017 = - -* Bugfixes - - Fix system info - -= 1.3.86: June 19, 2017 = - -* Enhancements: - - Update readme.txt - - -= 1.3.85: June 19, 2017 = - -* Enhancements: - * Add new filter hook to modify the profile cancel uri for redirection - * `um_edit_profile_cancel_uri` - * Add new filter hook to modify the specific field type's value - * `um_edit_{$type}_field_value` - * Add new filter hook that modies the file name - * `um_upload_file_name` - * Update en_US translation files - -* Bugfixes: - * Fix file clean up with image/file fields on profile update - * Fix text domain slug for wp.org translation compatibility - * Fix change password email notification - * Fix double click submission in registration forms - * Fix custom field role validation - * Fix conditional logic 'content block' field - * Fix conditional logic field operators and visibility - * Fix textarea field sanitation - * Fix system info false positive virus scan results - * Fix field validation for minimum and maximum numeric values - * Fix used custom fields visibility in form builders - * Fix cache user's profile option description - * Fix double click for android device - * Fix png image upload with transparency - * Fix extra slashes in form edit view when invalid input fields occur - * Remove notices - - -= 1.3.84: April 18, 2017 = - -* Enhancements: - * Adds new action hooks before and after WP_User_Query. - * `um_user_before_query` - * `um_user_after_query` - * Adds a dismiss link in locale / language translation notices - * Adds correct user profile url in WPML language switcher - * Adds new option to disable name fields in account page - * `UM > Settings > Account > Disable First & Last Name fields` - * Add new filters to modify upload base directories - * `um_multisite_upload_sites_directory` - * `um_multisite_upload_directory` - * Adds new action hook in admin > user edit > Ultimate Member to append any customisation - * `um_user_profile_section` - * Adds H2 for UltimateMember section to Add/Edit User Form - -* Bugfixes - * Fix image url cache filter - * Fix PHP 7.1+ compatibility issues - * Fix UTF8 encoding in form fields - * Fix hide member directory option. - * Fix conditional logic fields. - * Fix login access settings for logged-in users. - * Fix WP role synchronisation on UM role update - * Fix WP authenticate filter hook - * Fix radio and checbox field active state colors when disabled. - * Fix Content Availability conditional fields in edit/add category screens - * Remove notices - -= 1.3.83: February 20, 2017 = - -* Enhancements: - * Adds user avatar's alternate text. The default text is set to `display_name` - * Adds new filter hook to modif the user avatar's alternate text. - * `um_avatar_image_alternate_text` - * Set gravatar for newly registered users - * Adds Tag archive page access settings - -* Bugfixes - * Remove pointer cursor from field areas in profile view mode - * Fix profile slug in permalinks - * Fix URL field 'nofollow' issue - * Fix field icons display - * Fix an issue with admin roles in editing fields - * Fix whitepspace issue with Email Address validation - * Fix profile visibility option in member directories - * Fix icon display as label in profile view - * Fix PHP 7.1.1 compatibility - * Fix redirection on update profile slug - * Fix dynamic CSS options in member directory - * Fix edit profile option by specific role - * Fix Vkontakte view - * Remove notices - -= 1.3.82: January 31, 2017 = - -* Enhancements: - * Add filter hook to disable secure account fields - * `um_account_secure_fields__enabled` - * Updates ReduxFramework to version 3.6.2 - * Adds a body class in profile/user page for the current loggedin user - * `um-own-profile` - -* Bugfixes - * Fix select/multi-select field options translation - * Fix profiles visibility and access permissions in member directories - * Fix User deletion in mobile browsers - * Fix WPML & PolyLang compatibility issues - * Fix field view and edit restriction - * Fix author name in recent comments widget - * Fix overwrite of multiple image and file uploads with the same filename - * Remove notices - -= 1.3.81: January 19, 2017 = - -* Bugfixes - * Fix conditional field option with 'contains' - * Fix WPML compatibility with UM logout - -= 1.3.80: January 18, 2017 = - -* Bugfixes: - * Fix loop email notifications on user creation in the back-end - -= 1.3.79: January 17, 2017 = - -* Enhancements: - * Adds new username and string validation filter hooks: - * um_validation_safe_username_regex - * um_validation_safe_string_regex - * Adds new filter hook to modify conditional fields - * um_get_field__{$field_key} - * Change max limit of users queue's count in cache - * Adds current logged in users WP and Community roles in the System Info - * Adds confirmation on user deletion - -* Bugfixes: - * Fix conditional fields - * Fix logout compatibility issues with WPML - * Fix select option's custom callback validation - * Fix translation strings of primary and secondary buttons on Login and Register forms. - * Fix gender filter and results - * Fix user deletion in account page for mobile browsers - * Fix form rows CSS options - * Fix default text autocomplete - * Remove notices - -= 1.3.78: December 08, 2016 = - -* Bugfixes: - * Fix menu settings compatibility issue with WP 4.7 - * Fix mobile class on account delete tab heading - * Fixes an issue where tagline shows the current users to all members - * Fixes notice on updating WP List Table quick edit - * Remove notices - - = 1.3.77: November 30, 2016 = - -* Bugfixes: - * Fix set and reset password validation. - * Remove notices - -= 1.3.76: November 30, 2016 = - -* Bugfixes: - * Fix invalid security notice in set password. - -= 1.3.75: November 29, 2016 = - -* Bugfixes: - * Fix 'Invalid user ID' on profile update - -= 1.3.74: November 29, 2016 = - -* Enhancements: - * Improves clear users cache. - * Removes user id from redirect URL on registration process for pending review and email activation statuses. - -* Bugfixes: - * Fix assigning of role on registration process - * Fix change email address in edit mode. - * Fix change password validation. - * Removes notices when role field is present in the profile form. - - -= 1.3.73: November 17, 2016 = - -* Enhancements: - * Adds a filter hook to modify the submitted details on registration process - * `um_before_save_filter_submitted` - * Adds a filter hook to disable canonical link in header - * `um_allow_canonical__filter` - * Adds a filter hook to modify the auto-generated email address on registration process - * `um_user_register_submitted__email` - * Adds filter hooks to modify locale, language file path and textdomain - * `um_language_textdomain` - * `um_language_locale` - * `um_language_file` - * Adds filter hook to modify the data of selected value: - * `um_is_selected_filter_data` - * Adds new select/multi-select options to retrieve options from a callback. - * In the form builder, edit or add a select/multi-select field and add your callback function in `Choices callback` field to get populated. - * Adds parent select field option to dynamically populate another select field. - * If `Choices Callback` option is set in the field settings, the `Parent Option` triggers an Ajax request to populate the child options on `change` event. - * Updates `um.min.js` file. - * Updates `en_US` translation file. - -* Bugfixes: - * Removes notices from WPCLI console. - * Removes notices from edit profile mode - * Removes autocomplete from search filter fields - * Fix translation strings of search filters on a member directory - * Fix email notifications not sending on registration process - * Fix field selection with special characters on form submission - * Fix assigning of role on register submission process - -= 1.3.72: October 10, 2016 = - -* Enhancements: - * Improves the bulk filters, actions and redirection in `User Screens` - * Adds new access options to disallow access on homepage and category pages. - * Adds Textarea to show in profile tagline on Member Directory - * Adds a filter hook `um_allow_frontend_image_uploads` to allow profile and cover photo uploads on front-end pages. - * Adds new filter hooks to modify image field data on upload: - * `um_image_handle_global__option` - * `um_image_handle_{$field}__option` - * Adds a new filter hook to modify the redirection of non logged in users who visit the parent user page. - * `um_locate_user_profile_not_loggedin__redirect` - * Improves generate dummies tool with `wp_remote_get` - * Adds a new action hook for a new section in cover area: - * `um_cover_area_content` - * Updates the English translation .po and .mo files. - * Improves the shortcode `um_show_content` to swap the `user_id` with the current profile. - -* Bugfixes: - * Fixes a bug where multi-select field options doesn't match the user selected options that contain html entities. - * Fixes a bug to display correct role slugs in radio and select fields. - * Fixes a bug where reset password form is conflicting with register and login form on a page. - * Fixes a bug where Users queue count in the Admin > `All Users / Users` menu doesn't update when a user account is in `pending user review` and gets deleted. - * Fixes a typo in Password Reset Email option's description - * Fixes a bug where conditional fields 'equals to' validation on registration process - * Fixes a bug to disable the query with hiding account on member directory - * Fixes a bug to retrieve specific number of members - * Fixes a bug to retrieve all members with `get_members` new parameter `number` - * Fixes a typo in Welcome Email template. - * Fixes a bug where login form redirection is set to `wp-admin/admin-ajax.php` instead of the current page when loaded via ajax. - * Fixes a bug where uninstall link doesn't load. - * Fixes a bug to redirect users to correct URL after login based from login options. - * Fixes a bug where non-logged in users are not able to access the profile page when `Global Site Access` is set to `Site accessible to Logged In Users`. - * Fixes a bug to modify the login redirection url especially when DOING_AJAX is defined. - * Fixes a bug to retrieve correct community roles per site in a Multisite Network setup. - -= 1.3.71: September 12, 2016 = - -* Enhancements: - * Adds a new filter hook to modify the `cover photo` uri. - * `um_user_cover_photo_uri__filter` -* Bugfixes: - * Fixes a bug to allow users change their password in account form - * Fixes a bug to allow role validation and assigning of roles to users on registration process - * Fixes a bug to avoid blank admin footer text all around WordPress - -= 1.3.70: September 09, 2016 = - -* Enhancements: - * Adds a new filter hook to modify the profile `cover photo` uri. - * `um_user_cover_photo_uri__filter` -* Bugfixes: - * Fixes a bug to allow users change their password in account form - * Fixes a bug to reset passwords - -= 1.3.69: September 08, 2016 = - -* Enhancements: - * Adds a system information tool for support purposes - * Adds a new option to disable generating profile slugs on every load of member directory pages. - * Located in UM > Settings > Advanced > Stop generating profile slugs in member directory. - * This improves the performance when loading profiles in directories. It generates profile slug on Profile Update ( front and back-end ), Registration Process and viewing the Users in the back-end. - * Adds new filter hook `um_activate_url` to modify the account activation url. - * Adds new filter hooks to modify first and last name cases - * `um_user_first_name_case` - * `um_user_last_name_case` - * Adds new filter hooks to modify nonces of image and file uploads - * `um_file_upload_nonce` - * `um_image_upload_nonce` - * Improves search member filters and keyword sensitivity - * Improves generation of profile slugs - * Improves force capitalization of display names with dash - * Improves the pagination and loading of profiles in member directory - -* Bugfixes: - * Fixes a bug where users in member directory are missing after updating their profile - * Fixes a bug to generate random email when email field is not added in a form. - * Fixes a bug to show hidden members in member directory for admins - * Fixes a bug to validate username length on registration process - * Fixes a bug to display profile name in dynamic menu and profile page title - * Fixes a bug where frequent security notices show on registration process - * Fixes a bug to assign correct role to a user on registration process - * Fixes a bug to display correct roles in radio and dropdown fields - * Fixes a bug to validate the reset password - * Fixes a bug to change the assign of role in navigation menu items - * Fixes a bug to select radio field in profile form - * Fixes a bug to allow frontpage and posts page to handle custom access settings - * Fixes a bug where profile role field's conditional logic doesn't show/hide the second field. - * Fixes a bug to show 'Last Login' field in profile edit and view mode. - * Fixes a bug to sync roles with users in Edit Roles. - * Fixes a bug to disable/enable UM profile cache - * Fixes a bug to disable biography field's character limit when added in form - - -= 1.3.68: August 02, 2016 = - -* Fixed: radio field in account page - -= 1.3.67: August 02, 2016 = - -* New: allow non-editable fields in registration form -* Fixed: member directory mobile pagination -* Fixed: biography field validation in profile header and forms -* Fixed: remove override 'birth date' label -* Fixed: html support in biography field -* Fixed: select options search -* Fixed: select field's search query -* Fixed: search filters and multi-select fields -* Fixed: select, radio and checkbox field options -* Fixed: multiple select in UM settings -* Fixed: member directory's pagination links -* Fixed: remove nonce and http referer from submitted user details -* Fixed: disallow direct access link to posts with enabled category access restriction -* Added: new filter hook: `um_get_default_cover_uri_filter` -* Added: new filter hook: `um_register_allow_nonce_verification` -* Added: new filter hook: `um_get_option_filter__{$option_id}` -* Added: new filter hook: ` um_profile_{$key}__filter` -* Added: new filter hook: `um_profile_{$key}_empty__filter` -* Added: new filter hook `um_enable_ajax_urls` -* Added: new filter hook `um_field_checkbox_item_title` - - -= 1.3.66: July 14, 2016 = - -* Tweak: update translation strings and English translation file. -* Fixed: alphabetic and lowercase validations -* Fixed: checkbox and radio label encoding -* Fixed: user_login field validation type -* Fixed: registration form process -* Fixed: remove comments with hidden/private posts from comment tab - -= 1.3.65: July 06, 2016 = - -* Tweak: update ReduxFramework to version 3.6.0.1 -* Added: new action hook 'um_registration_after_auto_login' -* Added: new option for Network Permalink Structure -* Added: an account option to require first and last name -* Fixed: account deletion and password confirmation -* Fixed: registration form submission process -* Fixed: access settings in home page and posts conflict -* Fixed: encoding non UTF8 strings - -= 1.3.64: June 29, 2016 = -* Fixed: edit profile permission - -= 1.3.63: June 28, 2016 = -* Fixed: admin navigation -* Fixed: profile access and redirection - -= 1.3.62: June 27, 2016 = -* Fixed: access settings and redirection for logged out users -* Fixed: global access settings -* Fixed: remove notice in permalink - -= 1.3.61: June 24, 2016 = -* Fixed: edit profile url in multi-site setup -* Fixed: global access settings - -= 1.3.60: June 23, 2016 = -* Fixed: change password -* Fixed: menu settings and roles -* Fixed: cropper issue with Avada theme -* Fixed: image cropper and modal -* Fixed: nonce in registration forms -* Fixed: user redirection for non-loggedin users -* Fixed: global access setting - -= 1.3.59: June 17, 2016 = -* Added: filter 'um_register_hidden_role_field' -* Added: filters and action hooks in form post -* Added: cache time filter in avatar url -* Fixed: Nonces added to file uploads -* Fixed: remove notices -* Fixed: upload image cropper -* Fixed: select field multiple select -* Fixed: changing community role by admin -* Fixed: current url method in multisite setup -* Fixed: access settings - -= 1.3.58: June 09, 2016 = -* Fixed: change password -* Fixed: select field overlay - -= 1.3.57: June 09, 2016 = -* Fixed: admin access restriction - -= 1.3.56: June 09, 2016 = -* Fixed: query of pages - -= 1.3.55: June 09, 2016 = -* Fixed: select fields styles -* Fixed: select fields with accented characters -* Fixed: select fields with accented text values -* Fixed: select fields in overlay -* Fixed: admin front-end access restriction -* Fixed: pages query - -= 1.3.54: June 02, 2016 = -* Fixed: remove quick edit from Built-in roles row actions -* Fixed: remove notices -* Fixed: dropdown/select fields -* Fixed: upload file extension's case sensitive issue -* Fixed: reset and change password - -= 1.3.53: June 01, 2016 = -* New: generate dummy users tool -* Added: filter 'um_submit_form_error' for custom error messages -* Tweak: update compressed CSS -* Tweak: update select2.js to version 4.0.2 -* Fixed: gravatar and transfer tool -* Fixed: permalink base for username -* Fixed: saving account fields -* Fixed: remove notice -* Fixed: upload form error logging -* Fixed: cache option -* Fixed: edit profile url -* Fixed: login redirection -* Fixed: remove account information from welcome email -* Fixed: form error with users tags -* Fixed: select fields with accented characters -* Fixed: image upload - -= 1.3.52: May 14, 2016 = -* Added: 'wp_authenticate_username_password_before' action hook -* Tweak: remove access settings in media screens -* Fixed: convert tags format -* Fixed: ReduxFramework notice -* Fixed: remove PHP notice - -= 1.3.51: May 10, 2016 = -* Added: 'um_form_fields_textarea_settings' filter -* Added: reset password limit options -* Added: option to force display name to be capitlized -* Fixed: remove notices -* Fixed: redirect url on login -* Fixed: optimize query and object caching -* Fixed: profile photo as required field -* Fixed: admin access in front-end login -* Fixed: typos in tooltips -* Fixed: embedding video fields -* Fixed: Flush rewrite rules - -= 1.3.50: April 21, 2016 = -* Fixed: menu incompatibility issue -* Fixed: username validation -* Fixed: admin css conflict -* Fixed: display name capitalization -* Fixed: search member filter and fields -* Fixed: member directory big SELECT query -* Added: action hook 'um_access_post_type' & 'um_access_post_type_{current_page_type}' for current page type in access settings - -= 1.3.49: April 14, 2016 = -* Fixed: remove core notices from ajax requests -* Fixed: upload form and media path - -= 1.3.48: April 11, 2016 = -* New: advanced option to disable profile object caching -* Added: ssl media uri function -* Added: first and last name initial as meta key -* Fixed: order by random and pagination -* Fixed: user sort by random -* Fixed: status message encoding -* Fixed: image upload and file name -* Fixed: user login with other provider -* Fixed: translation strings -* Fixed: dependencies fatal errors -* Fixed: remove notices - -= 1.3.47: April 6, 2016 = -* Fixed: Fatal errors with language filter file - -= 1.3.46: April 6, 2016 = -* Fixed: Search widget fatal error -* Fixed: image jpeg upload sizes - -= 1.3.45: April 6, 2016 = -* New: support for wordfence and limit login -* New: search widget -* New: secondary email address -* Added: hook to password reset form fields -* Added: privacy options for profile menu tabs -* Added: option to allow primary email editable in profile view -* Added: member directory sort randomly -* Fixed: user page redirection -* Fixed: admin script error -* Fixed: invalid image path -* Fixed: upload image png with transparency -* Fixed: permalink basename fallback -* Fixed: casting variable and add new filter -* Fixed: remove notices -* Fixed: search users by tag -* Fixed: force UT8 encoding option -* Fixed: email content type -* Fixed: WPML compatibility -* Fixed: permalink base name format and redirect loop in profile page -* Fixed: form labels textdomain -* Fixed: edit profile redirect -* Tweak: accept period in profile url - -= 1.3.44: March 11, 2016 = -* New: an option to force Strings to use UTF-8 encoding -* New: an option to change Gravatar default image -* New: South Sudan to the list of countries. -* Fixed: update profile edit -* Fixed: remove feed from content restriction -* Fixed: search username query -* Fixed: support for server query string data after user login -* Fixed: matching fields values -* Fixed: email template path -* Fixed: shortcode within [um_show_content] shortcode -* Tweak: remove notices - -= 1.3.43: March 5, 2016 = -* Fixed: redirect URL after login -* Fixed: security check in registration form -* Fixed: email template path string -* Fixed: member directory query - -= 1.3.42: March 3, 2016 = -* Fixed: email template and localization -* Fixed: redirect URL - -= 1.3.41: March 3, 2016 = -* Fixed: Registration form redirect url - -= 1.3.40: March 3, 2016 = - -* New: filter `um__form_show_field` for display field -* New: shortcode: show custom content to specific role [um_show_content roles='member'][/um_show_content] -* New: 'not' attribute to [um_show_content not='member,contributor'][/um_show_content] shortcode -* Tweak: update masonry script -* Tweak: sql concatenate with prepare statement -* Fixed: remove notices -* Fixed: missing mCSB_buttons.png -* Fixed: set Gravatar default image as UM default image -* Fixed: fix default gravatar image -* Fixed: select2 multi dropdown for wc orders -* Fixed: show admin bar option -* Fixed: session issue with logout -* Fixed: register using email address if it exists -* Fixed: duplicate full_name permalinks -* Fixed: duplicate profile -* Fixed: show admin bar for non-logged in users -* Fixed: honorifics in full name -* Fixed: unsynced wp role -* Fixed: display wp user role filters -* Fixed: select and radio invalid value -* Fixed: email template path -* Fixed: user profile url with single dash in the last name -* Fixed: function to check meta value existence by meta key -* Fixed: um-admin-dashboard warnings -* Fixed: community role field in profile edit screen -* Fixed: mismatched roles -* Fixed: admin access in profiles -* Fixed: allow multiple member directory shortcode in a page -* Fixed: datepicker for ios and safari -* Fixed: adding of members in wp-admin -* Fixed: Fix redirection and XSS issue in login form - -= 1.3.39: February 24, 2016 = - -* New: add gravatar transfer tool -* New: show users with gravatar photo in member directory -* New: add upgrade class for data migration -* Tweak: Set last login for new users to show in member directory -* Tweak: validate roles for forms without fields -* Tweak: cropper js update -* Tweak: update minified script -* Tweak: tooltip and comment -* Fixed: member search query -* Fixed: Registration process with pending and show message enabled -* Fixed: Fix form security validation -* Fixed: email content type, template and localization -* Fixed: remove php notices -* Fixed: custom columns for roles -* Fixed: admin bar visibility per user role -* Fixed: community role editing - -= 1.3.38: February 19, 2016 = - -* Tweak: remove username validation -* Tweak: update minified scripts -* Fixed: Fix email and user submitted data encoding -* Fixed: role validation on register submission -* Fixed: form role and validation -* Fixed: search form pagination visibility - -= 1.3.37: February 17, 2016 = - -* New: Add password confirmation validation -* New: Add VK url validation -* New: Add Vkontakte as predefined url field -* New: Add additional file types -* New: Add file size limit label in image field -* New: Added password reset limit -* New: Allow redirect_to param after registration -* New: Indonesian language support added -* New: Add bio characters limit -* Tweak: Use native WP masonry script instead of duplicating it -* Tweak: Add image upload notice -* Tweak: Add option to allow users to hide profiles from member page -* Tweak: Add filters to modify output field -* Tweak: Add filter hook for email template path -* Tweak: Tweak upload form styles -* Tweak: Remove masonry from core and gulp -* Tweak: Add admin assets and apply minification -* Tweak: Update pickadate assets -* Tweak: Allowing usertags in search filters -* Tweak: Allow members template to be customized/overridden -* Tweak: Option to login user after clicking the activation link -* Tweak: Remove bio count strings -* Fixed: bio limit javascript error -* Fixed: ssl checker for load balancers -* Fixed: redirect loop with wpml permalink -* Fixed: WPML permalink and form compatibility -* Fixed: blocked words -* Fixed: searching with space -* Fixed: change password -* Fixed: members grid override -* Fixed: tipsy.js error -* Fixed: Plugin conflict causing account page displaying wrong info -* Fixed: email locale tempalte path -* Fixed: invalid role -* Fixed: validation for change password -* Fixed: unchecked access roles -* Fixed: telno input styles -* Fixed: escape display name in title attributes -* Fixed: datepicker css issue with some themes -* Fixed: make sure the hash parameter is a string -* Fixed: loading core assets -* Fixed: title tags not updated -* Fixed: empty uneditable fields -* Fixed: account deletion on one submission -* Fixed: Fixed indentation -* Fixed: user_login fallbacks and remove email address -* Fixed: password changed email template - -= 1.3.36: January 6, 2016 = - -* New: added in-page content restriction to protect content for logged-in or logged out users -* New: added community role field to user creation in backend -* New: added community role field to user editing in backend -* New: show specific users in members directory -* New: added a new field type: Number -* New: added filter hooks to specific profile fields -* New: added custom admin bulk actions support -* New: added usermeta support to content locking feature in-page -* Tweak: several tweaks in core to be more WordPress native -* Tweak: added fallback for page setup selections -* Tweak: automatic clickable links in profile header bio -* Tweak: trim long field labels in backend fields modal -* Fixed: profile page SEO title -* Fixed: multi-site redirect support -* Fixed: activation hash comparison -* Fixed: page setup fallback field -* Fixed: prevents php warnings and notices -* Fixed: WP-CLI and cronjobs issues -* Fixed: category posts restriction and redirection -* Fixed: category access settings -* Fixed: activation link - -= 1.3.35: December 15, 2015 = - -* Fixed: registration/login issues resolved - -= 1.3.34: December 15, 2015 = - -* New: new privacy option for fields: allow profile owner & specific roles to view the field -* Fixed: wrong php syntax in admin notice - -= 1.3.33: December 15, 2015 = - -* Fixed: Member search on homepage -* Fixed: emoticons support -* Fixed: redux notices, css styles in admin -* Fixed: users not being deleted - -= 1.3.32: December 10, 2015 = - -* Fixed: array format and notices -* Fixed: users search, delete confirmation and role filter -* Fixed: unique key field validation - -= 1.3.31: December 9, 2015 = - -* Fixed: Add slash in base url filter for multisite -* Fixed: manage user roles, status and filters -* Fixed: Enable WPML support to all UM url/links -* Fixed: Sanitize referers and printing notices in admin screens - -= 1.3.30: December 3, 2015 = - -* New: added Simplified Chinese language support -* Tweak: added many new filters (for developers) -* Fixed: Display name update in profile -* Fixed: Photo upload unique IDs -* Fixed: Remove duplicated method um_convert_tags - -= 1.3.29: October 31, 2015 = - -* New: added new documentation links to plugin files -* New: added filters to control profile photo menu (for developers) -* Fixed: added security patch to remove decrypted passwords from database -* Fixed: bug with blocked words during registration -* Fixed: some localization strings -* Fixed: php warnings/bugs on specific installs - -= 1.3.28: October 13, 2015 = - -* Fixed: Bug with plugin folder structure - -= 1.3.27: October 13, 2015 = - -* Fixed: Role name display in Users dashboard - -= 1.3.26: September 25, 2015 = - -* New: added Greek language support -* Tweak: added custom class to every user meta in member directory -* Tweak: added option to stop flushing rewrite rules every load (performance tweak) -* Fixed: WPML issue on multisite install -* Fixed: Removed redux menu from tools -* Fixed: fix for wp_authenticate_username_password() -* Fixed: searching users by e-mail address -* Fixed: conflict with sites with thousands of pages - -= 1.3.25: September 7, 2015 = - -* Fixed: 404 error on UM pages - -= 1.3.24: September 6, 2015 = - -* Tweak: saved some database queries -* Tweak: plugin not compatible with cache plugins out of the box - needs to exclude dynamic urls from cache -* Tweak: added more development filters in backend - -= 1.3.23: September 2, 2015 = - -* Fixed: PHP strstr() notice on profile - -= 1.3.22: September 2, 2015 = - -* Fixed: compatibility bug with older PHP versions - -= 1.3.21: September 2, 2015 = - -* Tweak: added security by sanitizing file/image uploads -* Fixed: issue with account page > notifications tab -* Fixed: image upload path in email notification -* Fixed: php issue with displaying name -* Fixed: missing localisation strings -* Fixed: couple of php notices - -= 1.3.20: August 28, 2015 = - -* New: added security measure for profile photo uploads -* New: added filter to hook in registration details sent in email notification -* New: added core pages filter to allow you change pages of extensions within plugin settings (e.g. activity) -* Fixed: multi-select field filtering bug -* Fixed: strip slashes from field names in fields modal -* Fixed: show drag and drop footer content only in the drag and drop form builder page -* Fixed: profile photo crop/upload issue -* Fixed: category/post specific restriction conflict -* Fixed: display UM classes only in UM pages -* Fixed: minor code improvements - -= 1.3.19: August 20, 2015 = - -* Fixed: please update - profile issue - -= 1.3.18: August 20, 2015 = - -* New: filter for comment types tab in profile -* New: jQuery.scrollto script added (for developers and extensions support) -* Fixed: XSS vulnerability in text input -* Fixed: user goes to profile about tab after editing profile - -= 1.3.17: August 13, 2015 = - -* New: added Brazilian Portuguese language support -* Tweak: added support for upcoming social activity extension - -= 1.3.16: August 11, 2015 = - -* New: added option to restrict categories in addition to per post content restriction -* New: added support to use dynamic user/profile ID in shortcode field e.g. [your-shortcode user_id={profile_id}] -* New: added security feature to disable admin logging via frontend (optional) -* New: added filter to um_get_core_page() function (for developers) -* Tweak: removed delay from tooltips -* Fixed: conflict with Podcast feed - -= 1.3.15: August 4, 2015 = - -* Fixed: issue with logout from adminbar - -= 1.3.14: August 4, 2015 = - -* New: added last login date support -* New: show user's last login in profile -* New: added sorting members by last login date -* New: added option to re-assign core pages in plugin settings -* Fixed: issue with multi-select required field -* Fixed: URL validation for custom fields -* Fixed: backend user filtering by non-english role -* Fixed: RTL css bugs - -= 1.3.13: July 22, 2015 = - -* Fixed: Woocommerce manual order dropdown conflict - -= 1.3.12: July 22, 2015 = - -* New: ability to delete user cache from plugin dashboard -* New: function is_ultimatemember() checks if user is on UM page (developers) -* New: option to disallow editing email in account page -* New: added Spanish (Mexico) language support -* Fixed: bug with profile viewing and user roles -* Fixed: Woocommerce dropdown bugs/conflicts -* Fixed: ipad/tablet css fixes for profile columns -* Fixed: deleting users delete their content - -= 1.3.11: July 8, 2015 = - -* Fixed: Redux errors and popups in backend - -= 1.3.1: July 7, 2015 = - -* Fixed: major issue with showing HTML in profiles - -= 1.3.0: July 7, 2015 = - -* New: easily sync UM roles with WP roles with role settings -* New: first steps towards WPML compatibility -* New: option to show member results only If user has searched -* New: add .um-err class to UM form if the form contains errors -* New: updated redux framework to latest version -* Fixed: feed issue with private / access locked posts - -= 1.2.997: June 21, 2015 = - -* New: added support for Farsi / Romanian language -* Tweak: adapted core community roles to prevent conflicts -* Fixed: bug with search results pagination -* Fixed: issue with panic key usage and wp-admin screen -* Fixed: bug with custom field validation action - -= 1.2.996: June 11, 2015 = - -* Fixed: php notice causing errors to appear in both frontend and backend - -= 1.2.995: June 11, 2015 = - -* New: added required support for WooCommerce extension -* Tweak: added option to fix conflicts of user profile links using different server method to get current url -* Fixed: security fix for redux framework added -* Fixed: button appearance on tablets -* Fixed: member search by display name - -= 1.2.994: June 6, 2015 = - -* Tweak: added a filter hook to change priority of enqueued styles/scripts -* Fixed: UM forms and elements not appearing in IE -* Fixed: Skype field output -* Fixed: conflict with libraries using Mobile Detect -* Fixed: issue with WP locale (using get_locale() now instead) - -= 1.2.993: May 29, 2015 = - -* Fixed: correction to last update -* Fixed: Private messages extension bug - -= 1.2.99: May 29, 2015 = - -* New: added Czech language support -* Fixed: WooCommerce dropdown issues and bugs in backend - -= 1.2.98: May 18, 2015 = - -* New: added Google map field -* New: added Vimeo video field -* New: added YouTube video field -* New: added SoundCloud track field -* New: added Hebrew language support -* Tweak: do not show captcha response in submitted registration details -* Fixed: profile photo upload issue on profile view mode -* Fixed: user search in backend/frontend -* Fixed: UM login check -* Fixed: admin settings css issue on mobile -* Fixed: cache variable undefined issue - -= 1.2.97: May 13, 2015 = - -* Fixed: issue with image upload fields -* Fixed: date localization resolved -* Fixed: issue with image upload during registration -* Fixed: JS issues for PM extension - -= 1.2.96: May 12, 2015 = - -* New: hooks and compatibility with Private Messages extension -* Fixed: bug with empty password on welcome e-mail -* Fixed: bug with member search using default permalinks - -= 1.2.95: May 9, 2015 = - -* New: RESTful API methods update.user, get.stats, and delete.user -* New: added Danish (Dansk) support -* New: added Swedish (Svenska) support -* Tweak: minor account and logout redirection tweaks -* Fixed: issue with changing user role -* Fixed: bug with login form validation -* Fixed: issue with biography field and html - -= 1.2.94: May 6, 2015 = - -* Fixed: bug with activation e-mails -* Fixed: bug stopping password reset -* Fixed: bug with changing user role and status in backend - -= 1.2.93: May 5, 2015 = - -* New: user profiles are cached to speed up load time -* New: emoji support added to bio / user descriptions -* Fixed: issues with bio field HTML -* Fixed: WP-admin PHP warning -* Fixed: bug with localization of en_US.po file - -= 1.2.92: May 2, 2015 = - -* New: Important: Introduces the Ultimate Member RESTful API -* Tweak: improved um_user_ip() function -* Fixed: issue with invalid html on profile photo and cover photo - -= 1.2.91: April 30, 2015 = - -* New: added custom field validation support via hooks um_custom_field_validation_{$hook} -* Fixed: important bug with profile menu tabs / system - -= 1.2.9: April 29, 2015 = - -* New: display pending users count in backend -* Tweak: improved user deletion process from backend -* Tweak: tweaked filter for register/login buttons -* Tweak: disabled registration timebot for admins -* Fixed: wp-load.php path in image and file upload scripts -* Fixed: RTL compatibility bugs -* Fixed: bug with registration and role field -* Fixed: bug with edit profile and biography length in header - -= 1.2.8: April 25, 2015 = - -* Fixed: Important WP 4.2 conflict resolved: filtering users in backend - -= 1.2.7: April 25, 2015 = - -* Tweak: Compatible with WordPress 4.2 -* Tweak: general code tweaks and improvements -* Tweak: new action hook when user is deleted -* Tweak: new action/filter hooks for profiles (developers) -* Tweak: new filter hook for profile privacy option -* Fixed: permalink issues - -= 1.2.6: April 22, 2015 = - -* Fixed: password reset security fix ( do not reveal emails ) -* Fixed: bug with custom profile templates -* Fixed: display name in member directories -* Fixed: URL fields display in member directory -* Fixed: many bugs with previous version - -= 1.2.5: April 21, 2015 = - -* Fixed: e-mail activation bugs - -= 1.2.4: April 20, 2015 = - -* New: added Russian language support -* Fixed: Security patch related to add_query_arg() -* Fixed: bug with approval HTML e-mail - -= 1.2.3: April 16, 2015 = - -* Fixed: major bug with admin capability / editing user profiles via frontend - -= 1.2.2: April 15, 2015 = - -* New: added caching to user roles and user permissions to save queries -* New: added user switching feature to allow super admins to sign in as another user easily (without password) -* New: added new modal css/js for future support -* New: added custom scrollbar support for future development use -* Tweak: added form elements focus css -* Fixed: bug with required radio button -* Fixed: prevent access for backend login/register/lost password for a logged in user - -= 1.1.6: April 7, 2015 = - -* Fixed: major bug with datepicker (Update recommended) - -= 1.1.5: April 4, 2015 = - -* New: new action hook that runs when user role is changed um_member_role_upgrade -* Fixed: bug/compatibility issue with caching UM roles data -* Fixed: bug with changing role settings/permissions -* Fixed: bug with setting e-mail activation redirect URL - -= 1.1.4: April 2, 2015 = - -* Fixed: Major bug with dropdown and date fields (Update recommended) -* Fixed: hard-coded translation issues - -= 1.1.3: April 1, 2015 = - -* New: added option to manage if access control widgets can be edited by admins only -* Tweak: update to last security patch - deletes user who try to get unauthorized access - -= 1.1.2: March 30, 2015 = - -* Fixed: Important security patch - please update -* Fixed: conflict with The Events Calendar plugin -* Fixed: bug with edit profile link - -= 1.1.1: March 29, 2015 = - -* Fixed: bug where you user could use an already existing e-mail in account page -* Fixed: bug with special characaters in username -* Fixed: bug with showing draft posts in user profile - -= 1.1.0: March 27, 2015 = - -* New: added multi language support to assign different languages to different forms (beta feature) -* New: added RTL support (beta, still partial) -* New: added a dashboard widget to view latest blog posts from the plugin -* Tweak: changed manage_options permission to edit_users on some admin actions -* Fixed: corrected all active color references in the css -* Fixed: bug with user_row_actions filter -* Fixed: do not store user_pass in submitted metakey during registration - -= 1.0.96: March 25, 2015 = - -* New: Added Arabic language (ar) support -* Fixed: Date fields not working in Safari -* Fixed: issue with HTML e-mails -* Fixed: issue with showing sidebar logout widget on bbpress forums - -= 1.0.95: March 24, 2015 = - -* Tweak: added more hooks to mail function to allow for sending custom e-mails -* Fixed: issue with content lock settings in backend appearing for non-admins -* Fixed: issue with form errors handling - -= 1.0.94: March 23, 2015 = - -* Fixed: bug with member directory search -* Fixed: bug with custom role homepage - -= 1.0.93: March 22, 2015 = - -* Fixed: bug with showing register and login forms on same page - -= 1.0.92: March 20, 2015 = - -* New: added option to customize redirection URL after e-mail activation -* Fixed: issue with hardcoded ajax/upload URLs - they are now localized -* Fixed: issue with admin notification for a deleted account -* Fixed: admin notifications are in plain text format - -= 1.0.91: March 20, 2015 = - -* Tweak: featured image in user posts goes to post link -* Fixed: solved a bug with e-mail validation - -= 1.0.90: March 19, 2015 = - -* Tweak: minor admin css changes -* Tweak: error message for frontend upload with theme/plugin conflicts - -= 1.0.89: March 18, 2015 = - -* Tweak: Major Performance Improvements (beta) - -= 1.0.88: March 18, 2015 = - -* Fixed: bug with viewing member profiles - -= 1.0.87: March 17, 2015 = - -* Tweak: profile edit form tweaked to be processed for profile edit only. allows you to have custom (not nested) valid forms in other profile tabs - -= 1.0.86: March 16, 2015 = - -* Tweak: UM admins can see unapproved users on front-end members directory -* Fixed: few misspelling errors -* Fixed: bug with custom profile templates (showing blank) resolved - -= 1.0.85: March 14, 2015 = - -* New: added option to show user social links in profile header (optional) -* New: added option to display post featured image in profile "posts" tab -* Tweak: improved error reporting for theme conflicts on photo upload -* Fixed: issue with comments tab on profile - -= 1.0.84: March 13, 2015 = - -* New: adds automatic body class to UM core pages automatically -* Fixed: important jQuery issue -* Fixed: upload security issue - extension error was empty - -= 1.0.83: March 12, 2015 = - -* New: added a logout template If user is already logged in (customizable) -* New: strong password formula not required when resetting password (optional) -* Fixed: jQuery issue with live() method - Thanks to Jim Wetton - -= 1.0.82: March 11, 2015 = - -* Fixed: issue with saving user account general tab - -= 1.0.81: March 11, 2015 = - -* New: official support for plugin extensions released - -= 1.0.80: March 10, 2015 = - -* Tweak: added licensing support to plugin core -* Fixed: issue with account form - -= 1.0.79: March 10, 2015 = - -* Tweak: Redux up to date -* Fixed: security issue related to deleting a temp file via ajax -* Fixed: bug with a php warning on undefined field type - -Credits to "James Golovich http://www.pritect.net" for the security checks - -= 1.0.78: March 10, 2015 = - -* Fixed: important correction from previous version - -= 1.0.77: March 10, 2015 = - -* New: integration with comments to show user profile link instead of user link (not compatible with all themes) -* New: option to control maximum size of uploaded profile photo -* New: option to control maximum size of uploaded cover photo -* Tweak: URL fields will are now treated as hyperlinks -* Fixed: bug with member directory privacy option -* Fixed: bug with using # as a character in file or image upload - -= 1.0.76: March 7, 2015 = - -* New: added {user_avatar_small} tag to display user photo in menu (requires extra css work) -* Tweak: Removed !important css rules from colors and backgrounds -* Fixed: issue with content block field - -= 1.0.75: March 5, 2015 = - -* New: improved & modern html e-mail templates -* New: addon to transfer BuddyPress profile photos to Ultimate Member (user request) -* New: added option to turn off time bot feature (fixes conflict with plugins) -* New: added built-in addons support -* Tweak: improved backend design and css - -= 1.0.74: March 4, 2015 = - -* Fixed: bug with numeric validation for a field -* Fixed: bug with conditional logic rules with checkbox - -= 1.0.73: March 3, 2015 = - -* Tweak: general code improvements - -= 1.0.72: March 2, 2015 = - -* Fixed: bug with e-mail activation since last update - -= 1.0.71: March 2, 2015 = - -* Fixed: issue with password reset link -* Fixed: issue with social links showing but user did not fill them - -= 1.0.70: March 2, 2015 = - -* Tweak: added a filter hook to control profile photo url -* Tweak: harder random generated passwords by making the length 40 characters for a key/password -* Tweak: added option to enable/disable custom css tab (off by default) -* Tweak: changed rewrite rules to be compatible with some themes and plugins -* Fixed: bug with Role field not showing error when required and left empty -* Fixed: bug with showing incorrect age when users did not fill their age -* Fixed: issue with template name for custom profile templates - -= 1.0.69: February 28, 2015 = - -* Tweak: better WP logout handling -* Tweak: new action and filter hooks added - -= 1.0.68: February 27, 2015 = - -* New: added support for mp3 as allowed filetype / upload -* Fixed: bug with profile privacy option (on non-english sites) -* Fixed: uncommon php warning caused by um_get_user_avatar_url() function -* Fixed: new translation corrections - -= 1.0.67: February 26, 2015 = - -* New: Improved the default HTML e-mail templates design -* New: added a bunch of action hooks to account tabs and content -* Tweak: added a few template tags to use in email: {site_url}, {user_account_link} -* Fixed: issue with making a checkbox required prior to registering -* Fixed: issue with comments showing in posts tab under profile -* Fixed: issue with plugin uninstallation link not showing in multisite - -= 1.0.66: February 25, 2015 = - -* New: added option to send e-mails as HTML -* New: added default HTML templates for e-mail notifications - -= 1.0.65: February 24, 2015 = - -* New: added option to customize register form secondary button URL -* New: added option to customize login form secondary button URL -* Fixed: issue with global access lock when homepage is excluded -* Fixed: issue with custom account tabs -* Fixed: minor css conflict with profile photo - -= 1.0.64: February 22, 2015 = - -* Tweak: updated language files on server -* Tweak: modified account page hooks to accept custom hooks easily -* Fixed: important css issues with safari browser -* Fixed: language notice will no longer show on (English UK/Other) wordpress sites - -= 1.0.63: February 21, 2015 = - -* Tweak: minor changes to dashboard widgets -* Tweak: cleaned dashboard js -* Tweak: a few action hooks refined -* Tweak: added filters to registration form buttons -* Fixed: issue with delete account feature - -= 1.0.62: February 20, 2015 = - -* New: added Polish (Polski) language -* New: added option to disable Name fields from Account page -* New: added support for custom profile templates selectable from template dropdown -* Tweak: remove rows with no fields from profile view -* Tweak: remove empty rows/row headings from profile -* Fixed: removed plain password user meta key from all users -* Fixed: issue with image upload when form has errors -* Fixed: resolved issue with disabling profile menu / tabs - -= 1.0.61: February 20, 2015 = - -* Tweak: Upload button text is made translatable -* Fixed: conflicts with Divi theme -* Fixed: issue with Roles dropdown field - -= 1.0.60: February 18, 2015 = - -* Tweak: added a protection to prevent wp-admin lockout for admin users -* Tweak: new hook for account page form submitting (for developers) -* Tweak: added a few missing translations -* Fixed: issue with roles dropdown not saving its state -* Fixed: issue with roles dropdown when made required in form -* Fixed: issue with tabbing on form fields - -= 1.0.59: February 17, 2015 = - -* New added Finnish language (fi_FI) -* Tweak: show e-mail column in users backend -* Fixed: issue with showing members directory on frontpage - -= 1.0.58: February 16, 2015 = - -* Fixed: display name as search field in member directory -* Fixed: translation issues in backend settings -* Fixed: issue with non-english letters in display names -* Fixed: bug with multiple default values for multi-select and checkbox fields -* Fixed: bug with multiple conditional logic based on different checkbox values - -= 1.0.57: February 16, 2015 = - -* Tweak: Italian language up-to-date -* Fixed: issue with registration where it can trigger a php warning -* Fixed: some translation issues - -= 1.0.56: February 15, 2015 = - -* Fixed: issue with permalink changes - -= 1.0.55: February 15, 2015 = - -* New: added Dutch (Nederlands) language -* New: show user registration/joined date in profile and/or member directory -* New: added facebook meta tags on user profiles (You have to disable facebook og tags in your SEO plugin) -* Tweak: sort users by default in "backend" by newest users first -* Tweak: added a close icon to profile and account notices -* Fixed: changed all time features to reflect WordPress installation time -* Fixed: timestamp on registration info shows form submission date/day -* Fixed: updated language files and new translation words - -= 1.0.54: February 15, 2015 = - -* New: added a remember me checkbox to login forms by default (optional) -* Tweak: keep your users signed in even if they close browser (optional) -* Tweak: minor css changes -* Fixed: bug with double redirects (causing incorrect loop) after login on some sites - -= 1.0.53: February 14, 2015 = - -* Tweak: when deleting users in backend, users will be deleted upon confirmation only -* Tweak: deleted users content is assigned to admin by default (to avoid losing content) -* Fixed: include plugin js and css on specific pages only - -= 1.0.52: February 13, 2015 = - -* Fixed: issue with users backend **update recommended** -* Fixed: preview registration info in users backend - -= 1.0.51: February 13, 2015 = - -* New: show registration info for each user in users backend -* New: show user stats at a glance in plugin dashboard -* New: sort users in backend by account status -* New: sort users in backend by user role -* New: added option to disable plugin css and js on homepage -* Tweak: updated language and translations files -* Fixed: issue with changing user role from Profile page -* Fixed: php bug with user description that has links -* Fixed: small issue with rewrite rules - -= 1.0.50: February 12, 2015 = - -* New: added option to include plugin js/css only on specific pages (user suggestion) -* Tweak: image and file uploads tweaked -* Fixed: date and time picker localization -* Fixed: bug with date and time fields -* Fixed: issue with searching members with default permalinks used -* Fixed: minor css fixes - -= 1.0.49: February 10, 2015 = - -* New: added option to disable UM menu (fixes conflict with mega-menu on some themes/plugins) -* New: added option to disable strong password in Account / Password change tab -* New: added a notice to Account page when user updates account -* Fixed: issue with global access settings - -= 1.0.48: February 10, 2015 = - -* New: added translation downloader/updater in plugin dashboard -* New: added admin notice when language is updated or downloaded -* Tweak: redirect to login page by default if content is restricted -* Tweak: redirect back to the protected content after successful login -* Tweak: small modifications to plugin admin css -* Fixed: issue with registration form per role not appearing (when logged in) -* Fixed: image and file uploads strip illegal characters from file name -* Fixed: small issue with mandrill plugin -* Fixed: bug with role creation that have used slugs that exist in database - -= 1.0.47: February 9, 2015 = - -* New: A more native dashboard for Ultimate Member -* New: view your temp uploads directory size and purge it from dashboard -* Fixed: user uploads bug with handling photo uploads at once -* Fixed: issue with using UM role as search filter in directory -* Fixed: a little icon issue with directory backend -* Fixed: localized a few words from predefined fields - -= 1.0.46: February 8, 2015 = - -(Update Recommended) - -* New: added Spanish language pack -* Fixed: important JS conflict in admin when UM is active -* Fixed: profile permalink issue for e-mail usernames -* Fixed: installation issue on some WP databases - -= 1.0.45: February 8, 2015 = - -* Fixed: Multisite bug php Fatal error: call to undefined function wpmu_delete_user() - -= 1.0.44: February 8, 2015 = - -* Tweak: improved performance: unused user photos are deleted when user upload -* Tweak: cleaned up dashboard code -* Tweak: updated current translations -* Fixed: display name field should be updated with wp_update_user and not in usermeta -* Fixed: admin js and css should are loaded in UM backend only - -= 1.0.43: February 7, 2015 = - -* New: added German (Deutsch) language support -* Tweak: updated all translation packs -* Fixed: profile social links in member directory -* Fixed: prevent storing user_pass in usermeta table -* Fixed: php error triggered from um-access.php file - -= 1.0.42: February 6, 2015 = - -* New: added option to block specific e-mail domains from registering -* New: 2 new social profile fields: YouTube and SoundCloud -* New: added option to show field icons in profile header -* New: import/export plugin settings feature added to the backend -* New: added option to duplicate forms in backend with one click -* Tweak: cleaned up installation code -* Tweak: minor css modifications -* Fixed: adding HTML and iframe content to html-allowed textarea fields -* Fixed: upload folders permissions with some configurations and servers -* Fixed: live preview of profile forms in backend - -= 1.0.41: February 5, 2015 = - -* New: added access control settings to custom post types, you can have custom access settings applied to your custom post types now -* New: divider and spacing fields fully support conditional logic -* Tweak: Turkish language completed -* Tweak: updated some translations -* Fixed: a couple of PHP warnings and errors have been resolved -* Fixed: conflict with MailPoet plugin has been resolved - -= 1.0.40: February 4, 2015 = - -* Tweak: line-breaks and automatic urls are now working for textarea fields -* Tweak: updated ReduxFramework to latest version -* Tweak: backend sentences are now properly localized / updated translation -* Fixed: important issue with field positions in backend form builder -* Fixed: issue with usernames that have spaces resolved -* Fixed: conflict with page title in bbpress forums resolved -* Fixed: issue with escaping the apostrophes resolved -* Fixed: issue with loading more posts/comments in profile resolved - -= 1.0.39: February 3, 2015 = - -* New: added support for child templates to allow customizing the templates of plugin via theme or child theme. [See how](https://ultimatemember.com/codex/overriding-default-ultimate-member-profile-templates/) -* New: added French language pack -* Tweak: improved localization notification in backend -* Tweak: improved template loading -* Fixed: a minor css issue with multi-select field placeholder - -= 1.0.38: February 3, 2015 = - -* New: added a built-in automatic language pack downloader -* New: plugin now available in Italian, Turkish (40%) -* Tweak: If you need the plugin on available language pack you can download it automatically via the dashboard -* Tweak: when user updates account page the page will refresh and stay in the same tab -* Fixed: possible permalinks conflict with some wordpress themes - -= 1.0.37: February 2, 2015 = - -* Tweak: automatic line breaks in user description field -* Tweak: added gravatar rating parameter to the gravatar function -* Fixed: permalinks issue with customized slug for user and account pages - -= 1.0.36: February 1, 2015 = - -* New: URLs in user description are automatically converted to hyperlinks -* New: added option to redirect author archive to their UM profile automatically -* New: added option to show asterisk next to required fields (optional) -* New: Turkish language file (40% completed) -* Tweak: updated language file with missing sentences and words -* Tweak: auto redirect user/ base to user profile (e.g. user/username/) -* Fixed: issue with wrong comments count on user profile menu -* Fixed: issue with display name tags in nav menu -* Fixed: issue with conditional logic for select/multi-select fields -* Fixed: issue with conditional logic for content blocks and shortcode fields -* Fixed: conflict with Pods wordpress plugin - -= 1.0.35: January 31, 2015 = - -* Tweak: exif module is not required anymore and does not stop photo uploads (exif is highly recommended) -* Fixed: issue with changing a WP administrator role to a community administrator role -* Fixed: issue with plugin uploads directory on some multisite installations -* Fixed: conflict with default profile tab and editing profile -* Fixed: minor css conflict on account page with some themes when viewed on tablets - -= 1.0.34: January 31, 2015 = - -* New: added option to set a default cover photo -* New: added option to hide restricted content from search and archive -* Fixed: php error in title tab with ElegantThemes -* Fixed: theme conflict with photo/cover upload -* Fixed: issue with country field showing country code in profile -* Fixed: issue with setting default tab -* Fixed: issue with 2-name user roles - -= 1.0.33: January 30, 2015 = - -* New: Introducing profile menu / tab system (optional) -* New: display user posts and comments in profile menu (optional) -* New: added option to force hide adminbar on the frontend even for administrators -* Tweak: added profile menu options to plugin settings panel -* Tweak: added option to enable/disable profile menu and/or profile menu tabs -* Tweak: added option to show or hide post and comment counts (when the tabs are active) -* Tweak: account activation via e-mail redirects user to login page and displays a success message -* Fixed: issue with conditional logic on profile fields has been resolved -* Fixed: bug with searching members by gender -* Fixed: admin nav menus conditional logic conflict with some themes -* Fixed: bug with datepicker field on windows servers - -= 1.0.32: January 30, 2015 = - -* New: added 3 new tags to use in email templates {first_name}, {last_name}, and {gender} -* Fixed: Issue with account page permalink resolved - [view issue](https://ultimatemember.com/forums/topic/permalink-bug/) -* Fixed: Issue with conditional menu items showing for un-approved users resolved - [view issue](https://ultimatemember.com/forums/topic/registration/) - -= 1.0.31: January 29, 2015 = - -* Fixed: Issue with custom user page slug resolved [view issue](https://wordpress.org/support/topic/translate-plugin-9) -* Fixed: PHP warning in members directory resolved -* Fixed: Issue with hardcoded user profile URLs in menu - -= 1.0.30: January 29, 2015 = - -* New: added option to control number of profiles to display in members directory for mobile devices -* New: new admin action hook 'um_extend_admin_menu' to extend plugin administration menu -* New: Improved plugin accessbility e.g add alt text to links and images so people with disabilities can use screen readers -* New: added option to show/hide the message that appears if profile is empty (includes emoticon show/hide) -* Tweak: new translatable strings -* Tweak: added option to customize single-result text for members directory -* Tweak: removed unnecessary code from member directory backend -* Tweak: removed unnecessary js from admin head -* Fixed: Account page is now translatable -* Fixed: content restriction widget css in backend - -= 1.0.29: January 28, 2015 = - -* New: added feature to show user display name in menu (e.g. Welcome, {display_name}) -* New: added option to add text to dividers (which can be added using the drag-and-drop form builder) -* New: security improvement: added whitelisted IP(s) option to allow you to access the WP-admin screen always (prevents lockout) -* New: added filter hook um_whitelisted_wpadmin_access to control access to wp-admin login screens (for developers) -* New: added custom css option to apply extra css styling rules from plugin settings -* New: added custom css option to each form allowing you to apply extra styling rules per form -* New: added option to customize profile fields area width (per form basis) besides global option -* Tweak: compatibility with default permalinks (Pretty permalinks are strongly recommended though!) -* Tweak: improved the function that gets user IP address -* Tweak: performance: inline css from the plugin is automatically compressed/minified - -= 1.0.28: January 27, 2015 = - -* New: added compatibility with wpMandrill to handle email delivery -* Fixed: Issue with profile edit menu not appearing - -= 1.0.27: January 27, 2015 = - -* Fixed: WP admin bar issue with some plugins and themes -* Fixed: conflict with WP Recent Comments With Avatars plugin - -= 1.0.26: January 26, 2015 = - -* Fixed: Important issue fix (update recommended) - -= 1.0.25: January 26, 2015 = - -* New: addded support to use gravatars (optionally) If the user does not have a custom avatar -* New: um_user_permissions_filter hook (for developer use) -* Tweak: plugin uses get_avatar() properly now -* Fixed: user avatars in backend are fixed -* Fixed: Mobile_Detect class does not throw php error if it was previously called -* Fixed: corrected a few translations errors - -= 1.0.24: January 26, 2015 = - -* Tweak: predefined fields are now localized (translatable) -* Fixed: PHP warning in comments was fixed -* Fixed: avatars in comments - -= 1.0.23: January 25, 2015 = - -* Fixed: important bugfix with profile editing - -= 1.0.22: January 25, 2015 = - -* New: option to set maximum profile fields area width -* New: ajax functions for future development use -* Tweak: improved profile permalinks for e-mail based usernames -* Tweak: disable user from editing username (If admin put the username field by mistake in profile) -* Tweak: minor css changes -* Fixed: ability to clear conditional logic from fields in backend -* Fixed: corrected spacing issue in a multi-column layout in profile - -= 1.0.21: January 24, 2015 = - -* New: Added ajax action hook for development use -* New: Extended profile hooks -* New: you can restrict / apply access control to woocommerce shop page -* Fixed: content restriction for woocommerce shop page - -= 1.0.20: January 24, 2015 = - -* New: Custom email is sent to user after resetting/changing password -* New: Added action/filter hooks to profile -* Tweak: Improved a few core functions -* Fixed: Encoding issue with non-english sites fixed - -= 1.0.19: January 23, 2015 = - -* New: Border thickness option for members directory -* New: Option to show/hide forgot password link on login form -* Tweak: Capital initials on members directory -* Fixed: Issue with row styling in form builder -* Fixed: Conditional logic bug fixes -* Fixed: Icon for conditional rules in backend -* Fixed: php warning in debug mode -* Fixed: Mobile/phone number validation fixed - -= 1.0.18: January 23, 2015 = - -* Fixed: Issue with drag and drop form builder -* Fixed: Form builder trash icon in backend -* Fixed: Minor css adjustments in frontend - -= 1.0.17: January 22, 2015 = - -* New: WordPress Multi-site compatibility for user uploads and photos -* Fixed: Searching members by username or email in directory (partial search supported) -* Fixed: Anonymous tracking -* Fixed: Minor css fixes - -= 1.0.16: January 22, 2015 = - -* Fixed: Settings page: tracking popup removed - -= 1.0.15: January 22, 2015 = - -* New: User profiles now show a cool message if the user profile field area is empty -* New: Added 'visibility' setting to all field types in backend -* Tweak: Members search function supports partial search matching -* Tweak: Deleting photo or file removes file from server -* Tweak: Deleting a user will delete all his personal uploads from the server -* Fixed: Duplicate tooltip for password field has been removed - -= 1.0.10: January 22, 2015 = - -* Fixed: Template tags for welcome e-mail -* Fixed: {submitted_registration} e-mail template tag - -= 1.0.0: January, 2015 = - -* First official release! +* Refactored: wp-admin assets. Separated or merged some file based on the wp-admin screens +* Tweak: SASS pre-processor is used for wp-admin styles. +* Tweak: Using minified JS and CSS in wp-admin and frontend assets +* Tweak: Added PHP class UM()->admin()->screen() for screen control in wp-admin +* Updated: jquery-ui styles to 1.13.2 version. Prefixed with .um class. +* Updated: Cropper.JS to 1.6.1 version +* Note: Select2.JS version 4.0.13 +* Refreshed: Tipsy.JS to 1.0.0a version. Removed custom changes and restored library base code +* Refreshed: Raty.JS to 2.6.0 version. Restored library base code +* Refreshed: Pickadate.JS to 3.6.2 version. Restored library base code +* Updated: Used `um-tip-{x}` classes to make Tipsy.JS initialization commonly for wp-admin and frontend. +* Updated: wp-admin forms class and render icon type field +* Updated: Using `custom_submitdiv` on the UM Form and UM Member Directory screen to avoid custom styling for unnecessary metabox functionality. Just to render the necessary metabox content with only submission tools. + +**Bugfixes** + +* Fixed: Using fields with numeric keys in Form Builder +* Fixed: Pickadate.JS (datetime picker) localizations using +* Fixed: PHP notices on the SiteHealth and Form Builder pages +* Fixed: Using 'um_user_permissions_filter' hook and it's arguments. + +**Deprecated** + +* Removed Simplebar.JS library in Ultimate Member core. It's used only in extensions. +* Removed outdated styles and scripts for 1.3.x first install page +* `UM()->admin()->enqueue()->js_url` param. Please use `UM()->admin()->enqueue()::get_url( 'js' );` or `self::get_url( 'js' );` instead +* `UM()->admin()->enqueue()->css_url` param. Please use `UM()->admin()->enqueue()::get_url( 'css' );` or `self::get_url( 'js' );` instead +* `UM()->frontend()->enqueue()->js_url` param. Please use `UM()->frontend()->enqueue()::get_url( 'js' );` or `self::get_url( 'js' );` instead +* `UM()->frontend()->enqueue()->css_url` param. Please use `UM()->frontend()->enqueue()::get_url( 'css' );` or `self::get_url( 'js' );` instead +* Fully `UM()->permalinks()->um_rel_canonical_()` function. Because since version 2.1.7 there is used `um_profile_remove_wpseo();` alternative +* Fully `UM()->permalinks()->admin_act_url()` function. Since update for wp-admin links when there is nonce this function isn't used +* Fully `UM()->admin()->enqueue()->front_js_baseurl` param. +* Fully `UM()->admin()->enqueue()->front_css_baseurl` param. +* Fully `UM()->admin()->enqueue()->post_page` param. +* Fully `UM()->frontend()->enqueue()->load_google_charts()` function. Outdated. +* Fully `UM()->frontend()->enqueue()->load_fileupload()` function. Used scripts/styles dependencies to load script in the necessary place. +* Fully `UM()->frontend()->enqueue()->load_datetimepicker()` function. Used scripts/styles dependencies to load script in the necessary place. +* Fully `UM()->frontend()->enqueue()->load_scrollbar()` function. Outdated +* Fully `UM()->frontend()->enqueue()->load_imagecrop()` function. Used scripts/styles dependencies to load script in the necessary place. +* `UM()->is_um_screen()` function. Please use `UM()->admin()->screen()->is_own_screen()` instead +* `UM()->is_plugin_post_type()` function. Please use `UM()->admin()->screen()->is_own_post_type()` instead +* `UM()->is_restricted_entity()` function. Please use `UM()->admin()->screen()->is_restricted_entity()` instead +* `UM()->cpt_list()` function. Please use `UM()->common()->cpt()->get_list()` instead +* `um-admin-clear` CSS class. It duplicates WordPress native `clear`. Using WordPress native instead. +* `um-admin-tipsy-{x}` classes to make Tipsy.JS initialization commonly for wp-admin and frontend by `um-tip-{x}` class. + +**Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade** + +[See changelog for all versions](https://plugins.svn.wordpress.org/ultimate-member/trunk/changelog.txt). == Upgrade Notice == += 2.8.4 = +This version fixes a security related bug. Upgrade immediately. + += 2.8.3 = +This version fixes a security related bug. Upgrade immediately. + += 2.6.7 = +This version fixes a privilege escalation vulnerability used through UM Forms. Known in the wild that vulnerability allowed strangers to create administrator-level WordPress users. Please update immediately and check all administrator-level users on your website. + = 2.6.5 = This version fixes a security related bug. Upgrade immediately. Version <= 2.6.4 has a privilege escalation vulnerability with administrator-level users. diff --git a/templates/email/approved_email.php b/templates/email/approved_email.php index d5276526..c76c9bd6 100644 --- a/templates/email/approved_email.php +++ b/templates/email/approved_email.php @@ -29,7 +29,7 @@ if ( ! defined( 'ABSPATH' ) ) {
    Account Information
    -
    Your account e-mail: {email}
    +
    Your account email: {email}
    Your account username: {username}
    Set your password: {password_reset_link}
    diff --git a/templates/email/checkmail_email.php b/templates/email/checkmail_email.php index 92cb56fc..2c86633d 100644 --- a/templates/email/checkmail_email.php +++ b/templates/email/checkmail_email.php @@ -1,7 +1,7 @@ -
    {display_name} has just deleted their {site_name} account.
    +
    {display_name} has just deleted their {site_name} account.
    diff --git a/templates/email/notification_new_user.php b/templates/email/notification_new_user.php index 59be08f7..588a2f6b 100644 --- a/templates/email/notification_new_user.php +++ b/templates/email/notification_new_user.php @@ -5,7 +5,7 @@ * * This template can be overridden by copying it to {your-theme}/ultimate-member/email/notification_new_user.php * - * @version 2.6.1 + * @version 2.8.3 */ if ( ! defined( 'ABSPATH' ) ) { exit; @@ -22,7 +22,7 @@ if ( ! defined( 'ABSPATH' ) ) {
    -
    {display_name} has just created an account on {site_name}.
    +
    {display_name} has just created an account on {site_name}.
    To view their profile click here: {user_profile_link}
    diff --git a/templates/email/notification_review.php b/templates/email/notification_review.php index cab18131..cc195ddf 100644 --- a/templates/email/notification_review.php +++ b/templates/email/notification_review.php @@ -5,7 +5,7 @@ * * This template can be overridden by copying it to {your-theme}/ultimate-member/email/notification_review.php * - * @version 2.6.1 + * @version 2.8.3 */ if ( ! defined( 'ABSPATH' ) ) { exit; @@ -22,7 +22,7 @@ if ( ! defined( 'ABSPATH' ) ) {
    -
    {display_name} has just applied for membership to {site_name} and is waiting to be reviewed.
    +
    {display_name} has just applied for membership to {site_name} and is waiting to be reviewed.
    To review this member please click the following link: {user_profile_link}
    diff --git a/ultimate-member.php b/ultimate-member.php index b08fcaeb..2e0901db 100644 --- a/ultimate-member.php +++ b/ultimate-member.php @@ -3,7 +3,7 @@ * Plugin Name: Ultimate Member * Plugin URI: http://ultimatemember.com/ * Description: The easiest way to create powerful online communities and beautiful user profiles with WordPress - * Version: 2.8.3-alpha + * Version: 2.8.5-alpha * Author: Ultimate Member * Author URI: http://ultimatemember.com/ * Text Domain: ultimate-member