diff --git a/.wordpress-org/blueprints/blueprint.json b/.wordpress-org/blueprints/blueprint.json index 0d2c64e4..75651f33 100644 --- a/.wordpress-org/blueprints/blueprint.json +++ b/.wordpress-org/blueprints/blueprint.json @@ -15,7 +15,7 @@ "step": "installPlugin", "pluginZipFile": { "resource": "url", - "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.2.zip" + "url": "https:\/\/downloads.wordpress.org\/plugin\/ultimate-member.2.10.3.zip" }, "options": { "activate": true diff --git a/README.md b/README.md index 9412b326..45927cc6 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ GNU Version 2 or Any Later Version ### IMPORTANT: PLEASE UPDATE THE PLUGIN TO AT LEAST VERSION 2.6.7 IMMEDIATELY. VERSION 2.6.7 PATCHES SECURITY PRIVILEGE ESCALATION VULNERABILITY. PLEASE SEE [THIS ARTICLE](https://docs.ultimatemember.com/article/1866-security-incident-update-and-recommended-actions) FOR MORE INFORMATION -[Official Release Version: 2.10.2](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.2). +[Official Release Version: 2.10.3](https://github.com/ultimatemember/ultimatemember/releases/tag/2.10.3). ## Changelog diff --git a/assets/css/admin/builder.css b/assets/css/admin/builder.css index fe28aca1..83959bf3 100644 --- a/assets/css/admin/builder.css +++ b/assets/css/admin/builder.css @@ -495,6 +495,11 @@ line-height: 18px; margin: 0 0 10px 0; } +.um-admin-drag-col.cols-3 .um-admin-drag-fld-banned { + 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; @@ -600,6 +605,16 @@ color: #fff; } +.um-admin-drag-fld-banned { + float: left; + font-size: 13px; + height: 30px; + line-height: 30px; + margin: 0 0 0 20px; + font-weight: 400; + color: var(--um-blocks-error-color, #d92d20); +} + .um-admin-drag-fld-icons { float: right; } diff --git a/assets/css/admin/builder.min.css b/assets/css/admin/builder.min.css index 184ab039..83cc04a0 100644 --- a/assets/css/admin/builder.min.css +++ b/assets/css/admin/builder.min.css @@ -1 +1 @@ -@-webkit-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.um-admin-row-loading{position:absolute;width:100%;height:calc(100% + 30px);top:-30px;left:0;background:rgba(241,241,241,.6);z-index:999;display:none}.um-admin-row-loading>span{display:block;-webkit-transition:.1s opacity;-moz-transition:.1s opacity;-ms-transition:.1s opacity;-o-transition:.1s opacity;transition:.1s opacity;color:#c6c6c6!important;-webkit-animation:um-ajax-spinning 1.1s infinite linear;animation:um-ajax-spinning 1.1s infinite linear;border-top:.2em solid #000;border-right:.2em solid #000;border-bottom:.2em solid #000;border-left:.2em solid #c6c6c6;font-size:1.75em;-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}.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}.um-admin-tri{float:left;width:33%;position:relative}.um-admin-tri[data-select2-id]{position:relative}._heading_text[data-select2-id]{position:relative}.um-admin-error-block,.um-admin-success-block{display:none;width:100%;background:#c74a4a;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:13px;line-height:1em!important;margin:0 0 16px 0}.um-admin-success-block{background:#7acf58}.um-admin-cur-condition-template{display:none}.dynamic-mce-content{display:none}.um-admin-btns{line-height:1.5em;margin:0 0 5px 0;display:flex;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}.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}.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}.um-admin-builder i{font-size:15px!important;height:100%!important;line-height:100%!important;margin:0 5px 0 0!important}.um-admin-builder .um-admin-drag{margin-top:40px}.um-admin-drag-add-field{display:block;width:100%;height:30px;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}.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)}.um-admin-drag{width:100%;background:#f1f1f1;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;position:relative;padding:60px 20px 20px 20px}.um-admin-drag-row{width:100%;background:#fefefe;box-sizing:border-box;-moz-box-sizing:border-box;-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}.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}.um-admin-drag-rowsub{position:relative;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;background:#f1f1f1;padding:20px;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}.um-admin-drag-col{float:left;width:100%;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}.um-admin-drag-addrow{text-align:center;font-size:14px;color:#888;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}.um-admin-drag-fld{display:block;position:relative;border:1px solid #ddd;margin:0 0 15px 0;background:#f5f5f5;cursor:move!important}.um-admin-drag-fld.um-field-type-group{background:#555;border:0}.um-admin-drag-fld-title{float:left;font-weight:700;font-size:13px;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}.um-admin-drag-group{background:#fcfcfc;cursor:default;padding:20px;border:1px dashed #bbb}.um-admin-drag-fld-type{float:left;font-size:13px;height:30px;line-height:30px;margin:0 0 0 20px;font-weight:400;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}.um-row-placeholder{width:100%;border:2px dashed #aaa;box-sizing:border-box}.um-rowsub-placeholder{width:100%;border:2px dashed #ccc;box-sizing:border-box;display:block}.um-fld-placeholder{display:block;border:1px dashed #ddd;background:#fff;box-sizing:border-box;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} \ No newline at end of file +@-webkit-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes um-ajax-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.um-admin-row-loading{position:absolute;width:100%;height:calc(100% + 30px);top:-30px;left:0;background:rgba(241,241,241,.6);z-index:999;display:none}.um-admin-row-loading>span{display:block;-webkit-transition:.1s opacity;-moz-transition:.1s opacity;-ms-transition:.1s opacity;-o-transition:.1s opacity;transition:.1s opacity;color:#c6c6c6!important;-webkit-animation:um-ajax-spinning 1.1s infinite linear;animation:um-ajax-spinning 1.1s infinite linear;border-top:.2em solid #000;border-right:.2em solid #000;border-bottom:.2em solid #000;border-left:.2em solid #c6c6c6;font-size:1.75em;-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}.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}.um-admin-tri{float:left;width:33%;position:relative}.um-admin-tri[data-select2-id]{position:relative}._heading_text[data-select2-id]{position:relative}.um-admin-error-block,.um-admin-success-block{display:none;width:100%;background:#c74a4a;border-radius:3px;color:#fff;box-sizing:border-box;position:relative;padding:12px;font-size:13px;line-height:1em!important;margin:0 0 16px 0}.um-admin-success-block{background:#7acf58}.um-admin-cur-condition-template{display:none}.dynamic-mce-content{display:none}.um-admin-btns{line-height:1.5em;margin:0 0 5px 0;display:flex;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}.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}.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}.um-admin-builder i{font-size:15px!important;height:100%!important;line-height:100%!important;margin:0 5px 0 0!important}.um-admin-builder .um-admin-drag{margin-top:40px}.um-admin-drag-add-field{display:block;width:100%;height:30px;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}.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)}.um-admin-drag{width:100%;background:#f1f1f1;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;position:relative;padding:60px 20px 20px 20px}.um-admin-drag-row{width:100%;background:#fefefe;box-sizing:border-box;-moz-box-sizing:border-box;-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}.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}.um-admin-drag-rowsub{position:relative;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;background:#f1f1f1;padding:20px;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}.um-admin-drag-col{float:left;width:100%;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-banned{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;font-size:14px;color:#888;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}.um-admin-drag-fld{display:block;position:relative;border:1px solid #ddd;margin:0 0 15px 0;background:#f5f5f5;cursor:move!important}.um-admin-drag-fld.um-field-type-group{background:#555;border:0}.um-admin-drag-fld-title{float:left;font-weight:700;font-size:13px;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}.um-admin-drag-group{background:#fcfcfc;cursor:default;padding:20px;border:1px dashed #bbb}.um-admin-drag-fld-type{float:left;font-size:13px;height:30px;line-height:30px;margin:0 0 0 20px;font-weight:400;color:#999}.um-admin-drag-fld-type.um-field-type-group{color:#fff}.um-admin-drag-fld-banned{float:left;font-size:13px;height:30px;line-height:30px;margin:0 0 0 20px;font-weight:400;color:var(--um-blocks-error-color,#d92d20)}.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}.um-row-placeholder{width:100%;border:2px dashed #aaa;box-sizing:border-box}.um-rowsub-placeholder{width:100%;border:2px dashed #ccc;box-sizing:border-box;display:block}.um-fld-placeholder{display:block;border:1px dashed #ddd;background:#fff;box-sizing:border-box;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} \ No newline at end of file diff --git a/assets/css/admin/builder.sass b/assets/css/admin/builder.sass index f1356be4..18621495 100644 --- a/assets/css/admin/builder.sass +++ b/assets/css/admin/builder.sass @@ -400,6 +400,10 @@ height: auto line-height: 18px margin: 0 0 10px 0 + .#{$prefix}admin-drag-fld-banned + height: auto + line-height: 18px + margin: 0 0 10px 0 .#{$prefix}admin-drag-fld-icons float: none position: absolute @@ -492,6 +496,14 @@ &.um-field-type-group color: #fff +.#{$prefix}admin-drag-fld-banned + float: left + font-size: 13px + height: 30px + line-height: 30px + margin: 0 0 0 20px + font-weight: 400 + color: $error-text .#{$prefix}admin-drag-fld-icons float: right diff --git a/assets/css/um-members.css b/assets/css/um-members.css index edecd6cc..076cf73b 100644 --- a/assets/css/um-members.css +++ b/assets/css/um-members.css @@ -582,6 +582,7 @@ body #content .um-directory a:hover, body #content .um-directory a:focus { background-color: #eee; box-sizing: border-box; position: relative; + min-height: 50px; } .um-directory .um-members-wrapper .um-members.um-members-grid .um-member .um-member-cover[data-ratio] { overflow-y: hidden; @@ -1248,4 +1249,4 @@ body #content .um-directory a:hover, body #content .um-directory a:focus { .select2-container .select2-results li.select2-results__option[aria-disabled=true] { display: none; -} \ No newline at end of file +} diff --git a/assets/sass/um-members.sass b/assets/sass/um-members.sass index b7a5c602..01301d33 100644 --- a/assets/sass/um-members.sass +++ b/assets/sass/um-members.sass @@ -435,6 +435,7 @@ body background-color: #eee box-sizing: border-box position: relative + min-height: 50px &[data-ratio] overflow-y: hidden .um-member-cover-e @@ -1005,4 +1006,4 @@ body .select2-container .select2-results li.select2-results__option[aria-disabled=true] - display: none \ No newline at end of file + display: none diff --git a/blocks-src/um-member-directories/src/index.js b/blocks-src/um-member-directories/src/index.js index c5415fff..d7fd056d 100644 --- a/blocks-src/um-member-directories/src/index.js +++ b/blocks-src/um-member-directories/src/index.js @@ -89,7 +89,9 @@ jQuery(window).on( 'load', function($) { jQuery(mutation.addedNodes).find('.um-member').each(function() { let wrapper = document.querySelector('.um-member'); let directory = jQuery(this).parent(); - UM_Member_Grid(directory); + if (directory.hasClass('um-members-grid')) { + UM_Member_Grid(directory); + } if (wrapper) { wrapper.addEventListener('click', (event) => { diff --git a/changelog.txt b/changelog.txt index de589987..020e8c31 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,23 @@ == Changelog == += 2.10.3 April 24, 2025 = + +* Enhancements: + + - Added: The `Ignore the "User Role > Registration Options"` setting. It provides an ability to auto-approve users if they were created via wp-admin > Users screen. + - Tweak: Avoid email notifications to Administrator about user registration via wp-admin > Users screen. + - Tweak: Updated the Action Scheduler implementation to improve flexibility and clarity. Refactor Action Scheduler for not only email handling. + +* Bugfixes: + + - Fixed: Member Directory styles when it's rendered on the Gutenberg builder page. + - Fixed: Member Directory filtering query when the custom users metatable is used. + - Fixed: PHP Warning that occurs when using the `getimagesize` function with an image from an external source. + - Fixed: Reset Password email notification's the {password_reset_link}` placeholder. + - Fixed: Changed "Turkey" to the current official term "Türkiye". + +* Cached and optimized/minified assets(JS/CSS) must be flushed/re-generated after upgrade * + = 2.10.2 April 02, 2025 = * Enhancements: diff --git a/includes/action-scheduler/class-init.php b/includes/action-scheduler/class-init.php index 16b96bc3..27974be6 100644 --- a/includes/action-scheduler/class-init.php +++ b/includes/action-scheduler/class-init.php @@ -43,13 +43,13 @@ if ( ! class_exists( 'um\action_scheduler\Init' ) ) { public function __construct() { if ( ! $this->can_be_active() ) { add_action( 'init', array( $this, 'add_notice' ) ); + add_filter( 'um_site_health_extend', array( $this, 'change_site_health' ) ); } else { add_filter( 'um_settings_structure', array( $this, 'add_setting' ) ); - - if ( UM()->options()->get( 'enable_action_scheduler' ) ) { - $this->enabled = true; - $this->load_library( true ); - } + // Since 2.10.3 we load library as soon as there are required library files. + // Options above are used for enable/disable some Action Scheduler hooks e.g. um_dispatch_email. + $this->enabled = true; + $this->load_library( true ); } } @@ -68,6 +68,18 @@ if ( ! class_exists( 'um\action_scheduler\Init' ) ) { ); } + /** + * Adds the Action Scheduler setting to Ultimate Member feature settings + * + * @param array $settings + * + * @return array + */ + public function change_site_health( $site_health ) { + $site_health['ultimate-member']['fields']['enable_as_email_sending']['value'] = __( 'No', 'ultimate-member' ); + return $site_health; + } + /** * Adds the Action Scheduler setting to Ultimate Member feature settings * @@ -77,11 +89,11 @@ if ( ! class_exists( 'um\action_scheduler\Init' ) ) { */ public function add_setting( $settings ) { $settings['advanced']['sections']['features']['form_sections']['features']['fields'][] = array( - 'id' => 'enable_action_scheduler', + 'id' => 'enable_as_email_sending', 'type' => 'checkbox', - 'label' => __( 'Action Scheduler', 'ultimate-member' ), - 'checkbox_label' => __( 'Enable Action Scheduler', 'ultimate-member' ), - 'description' => __( 'Check this box if you want to use the Ultimate Member action scheduler. By enabling it, certain tasks like sending system emails will be scheduled to run at optimal times, which can help reduce the load on your server', 'ultimate-member' ), + 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ), + 'checkbox_label' => __( 'Enable Action Scheduler for Ultimate Member emails sending', 'ultimate-member' ), + 'description' => __( 'Check this box if you want to use the Action Scheduler for Ultimate Member emails sending. By enabling it, sending system emails will be scheduled to run at optimal times, which can help reduce the load on your server', 'ultimate-member' ), ); return $settings; @@ -131,6 +143,10 @@ if ( ! class_exists( 'um\action_scheduler\Init' ) ) { return $this->verify_wc_action_scheduler() || $this->load_library(); } + public function is_hook_enabled( $hook ) { + return apply_filters( 'um_action_scheduler_is_hook_enabled', $this->is_enabled(), $hook ); + } + /** * Enqueue an action to run one time, as soon as possible. * If Action Scheduler is disabled then do_action_ref_array is called to run action right away. @@ -144,11 +160,12 @@ if ( ! class_exists( 'um\action_scheduler\Init' ) ) { * @return int Еhe action’s ID. Zero if there was an error scheduling the action. The error will be sent to error_log */ public function enqueue_async_action( $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { - if ( $this->enabled ) { + if ( $this->is_hook_enabled( $hook ) ) { $group = $this->set_group( $group ); return as_enqueue_async_action( $hook, $args, $group, $unique, $priority ); } + // Make then standard action without Action Scheduler. do_action_ref_array( $hook, $args ); return 0; } @@ -166,11 +183,12 @@ if ( ! class_exists( 'um\action_scheduler\Init' ) ) { * @return int The action’s ID. Zero if there was an error scheduling the action. The error will be sent to error_log. */ public function schedule_single_action( $timestamp, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { - if ( $this->enabled ) { + if ( $this->is_hook_enabled( $hook ) ) { $group = $this->set_group( $group ); return as_schedule_single_action( $timestamp, $hook, $args, $group, $unique, $priority ); } + // Make then standard action without Action Scheduler. do_action_ref_array( $hook, $args ); return 0; } diff --git a/includes/admin/class-enqueue.php b/includes/admin/class-enqueue.php index 05c43246..51a53193 100644 --- a/includes/admin/class-enqueue.php +++ b/includes/admin/class-enqueue.php @@ -198,6 +198,7 @@ final class Enqueue extends \um\common\Enqueue { 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_misc', $css_url . 'um-misc' . $suffix . '.css', array( 'um_styles' ), 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' ); @@ -209,6 +210,7 @@ final class Enqueue extends \um\common\Enqueue { wp_enqueue_style( 'um_profile' ); wp_enqueue_style( 'um_responsive' ); wp_enqueue_style( 'um_account' ); + wp_enqueue_style( 'um_misc' ); wp_enqueue_style( 'um_datetime_date' ); wp_enqueue_style( 'um_datetime_time' ); diff --git a/includes/admin/class-site-health.php b/includes/admin/class-site-health.php index bc1a3558..45ceec2d 100644 --- a/includes/admin/class-site-health.php +++ b/includes/admin/class-site-health.php @@ -1,6 +1,8 @@ esc_html__( 'Are the banned custom fields?', 'ultimate-member' ), + 'test' => array( $this, 'banned_fields_test' ), + ); + break; + } + } + } + return $tests; } @@ -210,6 +226,132 @@ class Site_Health { return $result; } + private static function field_is_banned( $metakey ) { + return UM()->user()->is_metakey_banned( $metakey ) || in_array( strtolower( $metakey ), UM()->builtin()->blacklist_fields, true ); + } + + public function get_banned_fields() { + $result = array( + 'description' => '', + 'actions' => '', + ); + + $forms = get_posts( + array( + 'post_type' => 'um_form', + 'posts_per_page' => -1, + 'fields' => 'ids', + ) + ); + + $forms_count = 0; + $break_forms = array(); + if ( ! empty( $forms ) ) { + foreach ( $forms as $form_id ) { + $fields = UM()->query()->get_attr( 'custom_fields', $form_id ); + if ( empty( $fields ) ) { + continue; + } + foreach ( $fields as $field ) { + if ( empty( $field['metakey'] ) ) { + continue; + } + + if ( self::field_is_banned( $field['metakey'] ) ) { + if ( ! array_key_exists( $form_id, $break_forms ) ) { + $break_forms[ $form_id ] = array( + 'title' => get_the_title( $form_id ), + 'link' => get_edit_post_link( $form_id ), + 'fields' => array( + $field['metakey'] => isset( $field['title'] ) ? $field['title'] : __( 'Unknown title', 'ultimate-member' ), + ), + ); + + ++$forms_count; + } else { + $break_forms[ $form_id ]['fields'][ $field['metakey'] ] = isset( $field['title'] ) ? $field['title'] : __( 'Unknown title', 'ultimate-member' ); + } + } + } + } + } + + if ( 0 < $forms_count ) { + $result['description'] .= sprintf( + '
%s
', + __( 'Please note that some fields in your Ultimate Member Forms are currently on a restricted list that disallows their use. This is particularly related to the Ultimate Member Forms and their fields below.', 'ultimate-member' ) + ); + + if ( ! empty( $break_forms ) ) { + $forms_description = array(); + foreach ( $break_forms as $form_id => $form_data ) { + $fields = array(); + foreach ( $form_data['fields'] as $metakey => $field_title ) { + $fields[] = sprintf( __( '%s (%s)', 'ultimate-member' ), $field_title, $metakey );
+ }
+
+ $forms_description[] = '%s
', + __( 'The using meta keys from restricted list in Ultimate Member Forms may break the website\'s functionality and is unsecure.', 'ultimate-member' ) + ); + } + + if ( ! empty( $result['description'] ) && ! empty( $result['actions'] ) ) { + return $result; + } + + return false; + } + + public function banned_fields_test() { + $result = array( + 'label' => __( 'You have correct Ultimate Member fields', 'ultimate-member' ), + 'status' => 'good', + 'badge' => array( + 'label' => UM_PLUGIN_NAME, + 'color' => self::BADGE_COLOR, + ), + 'description' => sprintf( + '%s
', + __( 'Your all custom Ultimate Member fields are correct.', 'ultimate-member' ) + ), + 'actions' => '', + 'test' => 'um_banned_fields', + ); + + $banned_fields = $this->get_banned_fields(); + if ( false !== $banned_fields ) { + $result['label'] = __( 'Some field from Ultimate Member forms has banned meta key', 'ultimate-member' ); + $result['status'] = 'critical'; + $result['badge']['color'] = 'red'; + $result['description'] = $banned_fields['description']; + $result['actions'] = $banned_fields['actions']; + } + + return $result; + } + private function get_roles() { return UM()->roles()->get_roles(); } @@ -240,7 +382,7 @@ class Site_Health { } private function get_field_data( $info, $key, $field_key, $field ) { - $row = isset( $field['metakey'] ) ? false : true; + $row = array_key_exists( 'type', $field ) && 'row' === $field['type']; $title = $row ? __( 'Row: ', 'ultimate-member' ) . $field['id'] : __( 'Field: ', 'ultimate-member' ) . $field['metakey']; $field = array_map( array( &$this, 'array_map' ), $field ); $field_info = array( @@ -254,7 +396,7 @@ class Site_Health { } private function get_member_directories() { - $query = new \WP_Query(); + $query = new WP_Query(); $member_directories = $query->query( array( 'post_type' => 'um_directory', @@ -372,6 +514,10 @@ class Site_Health { 'label' => __( 'Use Gravatars?', 'ultimate-member' ), 'value' => UM()->options()->get( 'use_gravatars' ) ? $labels['yes'] : $labels['no'], ), + 'um-admin_ignore_user_status' => array( + 'label' => __( 'Ignore the "User Role > Registration Options" if this user is added from the wp-admin dashboard', 'ultimate-member' ), + 'value' => UM()->options()->get( 'admin_ignore_user_status' ) ? $labels['yes'] : $labels['no'], + ), 'um-delete_comments' => array( 'label' => __( 'Deleting user comments after deleting a user', 'ultimate-member' ), 'value' => UM()->options()->get( 'delete_comments' ) ? $labels['yes'] : $labels['no'], @@ -1080,6 +1226,10 @@ class Site_Health { 'label' => __( 'Enable Gutenberg Blocks', 'ultimate-member' ), 'value' => UM()->options()->get( 'enable_blocks' ) ? $labels['yes'] : $labels['no'], ), + 'um-enable_as_email_sending' => array( + 'label' => __( 'Email sending by Action Scheduler', 'ultimate-member' ), + 'value' => UM()->options()->get( 'enable_as_email_sending' ) ? $labels['yes'] : $labels['no'], + ), 'um-rest_api_version' => array( 'label' => __( 'REST API version', 'ultimate-member' ), 'value' => UM()->options()->get( 'rest_api_version' ), @@ -1627,10 +1777,8 @@ class Site_Health { ), ) ); - } - if ( array_key_exists( '_um_login_redirect_url', $rolemeta ) && 'redirect_url' === $rolemeta['_um_login_redirect_url'] ) { - if ( array_key_exists( '_um_pending_url', $rolemeta ) ) { + if ( 'redirect_url' === $rolemeta['_um_after_login'] && array_key_exists( '_um_login_redirect_url', $rolemeta ) ) { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( @@ -1660,10 +1808,8 @@ class Site_Health { ), ) ); - } - if ( 'redirect_url' === $rolemeta['_um_after_logout'] ) { - if ( array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) { + if ( 'redirect_url' === $rolemeta['_um_after_logout'] && array_key_exists( '_um_logout_redirect_url', $rolemeta ) ) { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( @@ -1689,10 +1835,8 @@ class Site_Health { ), ) ); - } - if ( 'redirect_url' === $rolemeta['_um_after_delete'] ) { - if ( array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) { + if ( 'redirect_url' === $rolemeta['_um_after_delete'] && array_key_exists( '_um_delete_redirect_url', $rolemeta ) ) { $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-' . $key ]['fields'], array( @@ -1706,17 +1850,15 @@ class Site_Health { } if ( ! empty( $rolemeta['wp_capabilities'] ) ) { - if ( array_key_exists( 'wp_capabilities', $rolemeta ) ) { - $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( - $info[ 'ultimate-member-' . $key ]['fields'], - array( - 'um-wp_capabilities' => array( - 'label' => __( 'WP Capabilities', 'ultimate-member' ), - 'value' => $rolemeta['wp_capabilities'], - ), - ) - ); - } + $info[ 'ultimate-member-' . $key ]['fields'] = array_merge( + $info[ 'ultimate-member-' . $key ]['fields'], + array( + 'um-wp_capabilities' => array( + 'label' => __( 'WP Capabilities', 'ultimate-member' ), + 'value' => $rolemeta['wp_capabilities'], + ), + ) + ); } $info = apply_filters( 'um_debug_information_user_role', $info, $key ); @@ -2160,11 +2302,7 @@ class Site_Health { ) ); } else { - if ( isset( $options[ $field ] ) ) { - $sortby_label = $options[ $field ]; - } else { - $sortby_label = $field; - } + $sortby_label = isset( $options[ $field ] ) ? $options[ $field ] : $field; $info[ 'ultimate-member-directory-' . $key ]['fields'] = array_merge( $info[ 'ultimate-member-directory-' . $key ]['fields'], array( @@ -2419,6 +2557,17 @@ class Site_Health { } } - return $info; + /** + * Filters the site health information. + * + * @hook um_site_health_extend + * + * @since 2.10.3 + * + * @param {array} $info The site health info to be filtered. + * + * @return {array} The filtered site health info. + */ + return apply_filters( 'um_site_health_extend', $info ); } } diff --git a/includes/admin/class-users-columns.php b/includes/admin/class-users-columns.php index 81165829..5ad62275 100644 --- a/includes/admin/class-users-columns.php +++ b/includes/admin/class-users-columns.php @@ -350,9 +350,6 @@ if ( ! class_exists( 'um\admin\Users_Columns' ) ) { return; } - // Set default statuses if not already done. - UM()->setup()->set_default_user_status(); - $id = 'um_user_status'; // need to add there additional nonce field because WordPress native _wpnonce field isn't visible on the users.php screen then custom actions diff --git a/includes/admin/core/class-admin-builder.php b/includes/admin/core/class-admin-builder.php index e0b49050..2a433c9f 100644 --- a/includes/admin/core/class-admin-builder.php +++ b/includes/admin/core/class-admin-builder.php @@ -546,6 +546,9 @@ if ( ! class_exists( 'um\admin\core\Admin_Builder' ) ) { + user()->is_metakey_banned( $key ) || in_array( strtolower( $key ), UM()->builtin()->blacklist_fields, true ) ) { ?> + +