diff --git a/README.md b/README.md index 41e84ce8e..f7818eb99 100755 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Normal compression is a "lossless" optimization. This means there is no loss of ### Is the EXIF data of images removed? -By default EXIF data is removed. It is however possible to keep it by enabling the option. +EXIF data is not removed. ### Will the original images be deleted? diff --git a/assets/css/bulk.css b/assets/css/bulk.css index 5e2cd1f42..cba82ecc3 100755 --- a/assets/css/bulk.css +++ b/assets/css/bulk.css @@ -88,7 +88,7 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress { body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent { position: absolute; top: 6px; - right: 0; + right: -28px; text-shadow: none; width: auto; padding: 0 5px; @@ -312,12 +312,6 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar { color: #40B1D0; } -.imagify-col-content { - background: #F4F7F9; - border-left: 1px solid #ddd; - border-right: 1px solid #ddd; -} - .imagify-col-content .imagify-block-secondary { margin-left: -1px; margin-right: -1px; @@ -669,11 +663,16 @@ body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar { background: #FFF; } -.imagify-bulk-table .imagify-row-progress { - display: none; +@media (max-width: 782px) { + .imagify-row-folder-type, + tr.imagify-row-working, + tr.imagify-row-waiting { + padding-top: 20px; + } } .imagify-bulk-table .imagify-row-progress { + display: none; height: 8px; padding: 0; } diff --git a/assets/css/bulk.min.css b/assets/css/bulk.min.css index ed796f855..b5c77714e 100755 --- a/assets/css/bulk.min.css +++ b/assets/css/bulk.min.css @@ -1 +1 @@ -#imagify-overview-chart-legend{overflow:hidden}.imagify-doughnut-legend{margin-top:38px;list-style:none}.imagify-doughnut-legend li{display:block;padding-left:30px;position:relative;margin-bottom:15px;border-radius:5px;padding:3px 8px 2px 31px;font-size:13px;cursor:default;-webkit-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;text-align:center}.imagify-total-percent{color:#46b1ce}.imagify-overview-chart-container{float:left;margin-right:20px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-.5em;line-height:1;text-align:center;font-size:55px;font-weight:700;color:#46b1ce}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .media-item,body[class*="_imagify-ngg-bulk-optimization"] .media-item{margin:0}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{float:none;width:100%;height:8px;margin:0;overflow:visible;background:#1f2331;-webkit-box-shadow:0;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{position:absolute;top:6px;right:0;text-shadow:none;width:auto;padding:0 5px;line-height:1.85;font-size:14px;font-weight:700;color:#40b1d0}.media_page_imagify-bulk-optimization .media-item .percent,.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{position:relative;width:1px;height:8px;margin-top:0;background:#46b1ce;border-radius:0;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}#imagify-bulk-action{padding:11px 20px}.imagify-columns .col-overview.col-overview{width:calc(100% - 465px);padding-left:20px}.imagify-columns .col-statistics.col-statistics{width:60%}.imagify-columns .col-chart.col-chart{width:40%}@media (max-width:1520px) and (min-width:1381px),(max-width:1086px){.imagify-columns .col-chart.col-chart,.imagify-columns .col-statistics.col-statistics{width:50%}}@media (max-width:1380px) and (min-width:1246px),(max-width:380px){.imagify-overview-chart-container{float:none;margin-right:0}.imagify-doughnut-legend{margin-top:18px}.imagify-global-optim-phrase{padding-top:0;width:auto}}@media (max-width:808px){.imagify-columns .col-chart.col-chart,.imagify-columns .col-statistics.col-statistics{width:auto;float:none;padding:0}.imagify-columns .col-chart.col-chart{margin-top:3em}}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:4.5em}.right-outside-number .imagify-barnb{display:block;margin-right:-5.25em;text-align:right;font-weight:700;line-height:.8}.imagify-h2-like{margin:0 0 .5em 0;padding-bottom:.5em;border-bottom:1px solid #e9eff2;font-size:24px;color:#000;font-weight:700}.imagify-h2-like .dashicons,.imagify-h2-like .dashicons:before{font-size:38px;height:38px;width:38px;margin-right:12px;vertical-align:-5px;color:#40b1d0}.imagify-info-block{position:relative;padding:10px;padding-left:42px;background:#d9e4eb;border-radius:4px;line-height:1.6}.imagify-list-infos{margin:0;padding:0}.imagify-list-infos li{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 5px;text-align:left;font-size:14px;line-height:1.5;color:#626e7b}.imagify-list-infos li:first-child{padding-top:5px}.imagify-list-infos li:last-child{padding-bottom:5px}.imagify-list-infos li+li{border-top:1px solid #e9eff2}.imagify-info-icon{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-preferred-size:50px;flex-basis:50px}.imagify-info-icon+span{padding-left:20px}.imagify-list-infos a:before{content:'';display:block}.imagify-bulk .imagify-settings-section{border:1px solid #d9d9d9;border-top:0;background:#fff;color:#4a4a4a}.imagify-bulk h3,.imagify-bulk li,.imagify-bulk p{color:#4a4a4a}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.imagify-account-info-col .imagify-options-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-account-info-col p.imagify-meteo-title{margin:0;font-size:24px;font-weight:700;color:#fff}.imagify-account-info-col .imagify-options-title>a{-ms-flex-preferred-size:100px;flex-basis:100px;margin-left:auto;margin-right:10px;text-decoration:underline;font-size:12px}.imagify-account-info-col .imagify-meteo-title .dashicons,.imagify-account-info-col .imagify-meteo-title .dashicons:before{font-size:38px;width:38px;height:38px;margin-right:4px;color:#40b1d0}.imagify-col-content{background:#f4f7f9;border-left:1px solid #ddd;border-right:1px solid #ddd}.imagify-col-content .imagify-block-secondary{margin-left:-1px;margin-right:-1px}.imagify-col-content .imagify-space-left{margin:15px 30px 15px 0}.imagify-col-content .imagify-space-left p{margin:0 0 10px 0;font-size:19px;font-weight:500;color:#343a49}.imagify-col-content .imagify-meteo-icon{height:64px;margin:15px 15px 15px 20px}.imagify-col-content .imagify-section-title+p{margin-top:10px}.imagify-account-info-col .imagify-h3-like.imagify-h3-like{color:inherit}.imagify-title .imagify-tooltips{position:absolute;top:100%;left:0}.imagify-tooltips .icon-round{float:left;display:inline-block;width:28px;height:28px;border:1px solid #fff;margin-right:8px;margin-bottom:8px;font-size:17px;font-style:italic;line-height:29px;font-weight:700;text-align:center;border-radius:50%}.imagify-tooltips .tooltip-content{display:block;position:relative;max-width:250px;padding:7px 15px 8px;background:#2e3242;color:#fff;font-size:10px;border-radius:3px}.imagify-tooltips.right .tooltip-content{margin-left:12px}.imagify-tooltips.bottom .tooltip-content{margin-top:4px}.imagify-inline-options label .tooltip-content{position:absolute;left:0;right:0;top:100%;text-transform:none;font-size:10px;letter-spacing:0;text-align:center}.imagify-tooltips .tooltip-content:after{content:"";position:absolute}.imagify-tooltips.right .tooltip-content:after{top:16px;left:-6px;border-right:8px solid #2e3242;border-top:6px solid transparent;border-bottom:6px solid transparent}.imagify-tooltips.bottom .tooltip-content:after{top:-5px;left:50%;margin-left:-3px;border-bottom:6px solid #2e3242;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-space-tooltips .tooltip-content{max-width:280px;margin-top:20px;margin-left:0;padding:5px 15px 5px;font-size:13px;background:#40b1d0;-webkit-box-shadow:0 3px 0 #338ea6;box-shadow:0 3px 0 #338ea6}.imagify-space-tooltips .tooltip-content:after{top:-14px;left:50%;margin-left:-7px;border:0 none;border-bottom:15px solid #40b1d0;border-left:15px solid transparent;border-right:15px solid transparent}.tooltip-content.tooltip-table{display:table;width:100%}.tooltip-content.tooltip-table>*{display:table-cell;vertical-align:middle}.tooltip-content .cell-icon{width:28px}.tooltip-content .cell-icon .icon{margin-bottom:0}.tooltip-content .cell-text{padding:5px 10px 5px 0;line-height:1.3}.tooltip-content .cell-sep{width:1px;background:rgba(255,255,255,.4)}.tooltip-content .cell-cta{padding-left:10px}.tooltip-content .cell-cta a{display:block;color:#fff;width:100%;height:100%;white-space:nowrap}.imagify-number-you-optimized{margin-bottom:1.35em;overflow:hidden}.imagify-number-you-optimized .number{display:table-cell;padding-right:15px;font-size:48px;font-weight:700;line-height:1;vertical-align:middle;white-space:nowrap;color:#000}.imagify-number-you-optimized [id=imagify-total-optimized-attachments-pct]{color:#40b1d0}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px;color:#626e7b}.imagify-number-you-optimized>p{display:table}.imagify-bars{padding-right:15px}.imagify-bars p{font-size:12px;margin-bottom:5px}.imagify-bars+.imagify-number-you-optimized{border-bottom:0;padding-top:.85em}.imagify-bars+.imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em}.imagify-table-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:15px 25px;background:#343a49;color:#fff}.imagify-newbie{margin-top:4em;position:relative;overflow:visible}.imagify-newbie .imagify-new-feature.imagify-new-feature{position:absolute;top:0;left:25px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);margin:0;padding:8px 20px;font-size:14px;letter-spacing:.02em;text-transform:uppercase;font-weight:700;color:#fff;background:#8bc34a}.imagify-newbie .imagify-table-header{padding:30px 25px;border:2px solid #8bc34a;background:#f3f9ec}.imagify-th-titles .dashicons,.imagify-th-titles .dashicons:before{width:38px;height:38px;margin-right:20px;font-size:38px;color:#40b1d0}.imagify-newbie .imagify-th-titles .dashicons:before{color:#8bc34a}.imagify-th-title.imagify-th-title.imagify-th-title{margin:0;font-size:24px;font-weight:500;color:#fff}.imagify-newbie .imagify-th-title.imagify-th-title{color:#343a49}.imagify-th-subtitle.imagify-th-subtitle.imagify-th-subtitle{margin:0 0 5px;font-size:14px;color:#7a8996;font-weight:500}.imagify-th-action .imagify-button-clean{font-size:12px;color:#7a8996}.imagify-th-action .imagify-is-active{color:#fff}.imagify-th-action .button:focus,.imagify-th-action .button:hover{color:#fff}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse}.imagify-bulk-table td{padding:20px}.imagify-bulk-table-details{border-bottom:2px solid #e5ebef}.imagify-bulk-table-details thead th,.imagify-bulk-table-details thead tr{background:#4a5362}.imagify-bulk-table-details thead th{padding:12px 20px;text-align:left;font-weight:700;color:#e5ebef;font-size:12px}.imagify-bulk-table-details tbody tr:nth-child(odd) td{background:#f2f5f7}.imagify-bulk-table-content{border:1px solid #d3d3d3;border-top:0}.imagify-bulk-table-footer{padding:20px;color:#626e7b;background:#f2f5f7}.imagify-bulk-table tbody tr+tr{border-top:3px solid #f2f5f7}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#fff}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress{height:8px;padding:0}.imagify-bulk-table .imagify-no-uploaded-yet td{height:200px;font-size:17px;letter-spacing:.1em;word-spacing:.12em;vertical-align:middle;text-transform:uppercase;font-weight:700;text-align:center;color:#999;background-color:#fff}.imagify-selector{position:relative}.imagify-selector-list{background:#fff;border:1px solid #f4f7f9;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.1);border-radius:3px;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.imagify-selector-list li:first-child label{border-radius:3px 3px 0 0}.imagify-selector-list li:last-child label{border-radius:0 0 3px 3px}.imagify-selector-list li{margin:0}.imagify-selector-list li+li{border-top:1px solid #f4f7f9}.imagify-selector-list svg{margin-right:5px}.imagify-selector-list .imagify-selector-current-value label,.imagify-selector-list input:checked+label{background:#343a49;color:#fff}.imagify-selector-list .imagify-selector-current-value input:focus+label,.imagify-selector-list .imagify-selector-current-value label:hover,.imagify-selector-list input:checked+label:hover,.imagify-selector-list input:focus+label,.imagify-selector-list label:hover{background:#40b1d0;color:#f4f7f9}.imagify-selector-list .imagify-selector-current-value input:focus+label polygon,.imagify-selector-list .imagify-selector-current-value label:hover polygon,.imagify-selector-list input:checked+label:hover polygon,.imagify-selector-list input:focus+label polygon,.imagify-selector-list label:hover polygon{fill:#FFF}.imagify-selector-list .imagify-selector-current-value input:focus+label polygon[fill="#CCD1D6"],.imagify-selector-list .imagify-selector-current-value label:hover polygon[fill="#CCD1D6"],.imagify-selector-list input:checked+label:hover polygon[fill="#CCD1D6"],.imagify-selector-list input:focus+label polygon[fill="#CCD1D6"],.imagify-selector-list label:hover polygon[fill="#CCD1D6"]{fill:#3694AE}.imagify-selector-list li label{display:block;padding:10px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-selector-list polygon{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-selector-list{position:absolute;top:0;left:0;right:0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.imagify-selector-list[aria-hidden=true]{opacity:0;visibility:hidden;-webkit-transform:translateY(-50%) scale(0);-ms-transform:translateY(-50%) scale(0);transform:translateY(-50%) scale(0)}.imagify-selector-list[aria-hidden=false]{opacity:1;visibility:visible;-webkit-transform:translateY(-50%) scale(1);-ms-transform:translateY(-50%) scale(1);transform:translateY(-50%) scale(1)}.button .imagify-selector-current-value-info{position:relative;padding-right:20px}.button .imagify-selector-current-value-info:after{content:'';position:absolute;right:0;top:50%;margin-top:-3px;border-top:6px solid #7a8996;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-row-complete{padding:35px 20px;margin-top:2em;background:#8bc34a;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.1)}.imagify-row-complete .imagify-ac-chart{margin-top:3px}.imagify-row-complete.imagify-row-complete p{color:#fff;margin:0}@-webkit-keyframes congrate{0%{opacity:0;-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);opacity:1}}@keyframes congrate{0%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate .5s ease-in-out;animation:congrate .5s ease-in-out}.imagify-all-complete{margin:1.5em 0}.imagify-all-complete>div{display:inline-block;vertical-align:middle}.imagify-ac-report{min-width:310px;margin-right:20px}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text{overflow:hidden}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-weight:700;font-size:24px;letter-spacing:.15em;word-spacing:0.15em;text-transform:uppercase}.imagify-ac-share{text-align:right}.imagify-ac-share-content{display:inline-block;padding:10px 15px;background:rgba(255,255,255,.2)}.imagify-ac-share-content>*{display:inline-block;vertical-align:middle}.imagify-bulk-table .imagify-ac-share-content p{margin-right:5px}.imagify-share-networks,.imagify-share-networks li{margin:0}.imagify-share-networks li{display:inline-block}.imagify-share-networks a{display:inline-block;vertical-align:-7px;margin:0 5px;text-decoration:none;color:#fff}.imagify-cell-checkbox{width:35px}.imagify-cell-checkbox p{margin:0}.imagify-cell-checkbox-loader{display:block;width:27px;height:28px;line-height:0;-webkit-animation:loading 4s infinite linear;animation:loading 4s infinite linear}@-webkit-keyframes loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-cell-checkbox-loader.hidden{display:none;-webkit-animation:none;animation:none}.imagify-cell-label,.imagify-cell-title label{font-size:14px;text-transform:uppercase;letter-spacing:.02em;font-weight:700}.imagify-cell-label{margin-right:10px}.imagify-cell-value{font-size:12px;font-weight:500;color:#7a8996}td.imagify-cell-title{padding-left:0}.imagify-cell-original-size .imagify-cell-label,.imagify-cell-title label{color:#1f2332}.imagify-cell-optimized-size,.imagify-cell-original-size{font-weight:500;color:#7a8996;font-size:12px}.imagify-cell-optimized-size .imagify-cell-label{color:#338ea6}.imagify-cell-count-optimized{font-size:14px;font-weight:700;color:#338ea6}.imagify-cell-count-errors{color:#c51162;font-weight:700;font-size:14px}.imagify-cell-count-errors a{margin-left:5px;color:#7a8996;font-weight:400;font-size:12px}.imagify-cell-filename{max-width:200px}.imagify-cell-status{max-width:145px}.imagify-cell-status .dashicons-warning{margin-right:2px}.imagify-cell-thumbnails{max-width:120px}td.imagify-cell-filename{-o-text-overflow:clip;text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46b1ce;font-weight:700}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagify-cell-totaloriginal{text-align:right}.imagify-cell-level{width:145px}.imagify-selector-button.imagify-selector-button{border:1px solid #fff;padding:2px 10px}.imagify-selector-button.imagify-selector-button:focus,.imagify-selector-button.imagify-selector-button:hover{border-color:#eee;-webkit-box-shadow:0 4px 8px rgba(0,0,0,.1);box-shadow:0 4px 8px rgba(0,0,0,.1)}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle;margin-left:5px;color:#626e7b;font-weight:500}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;overflow:hidden;background:url(../images/upload-image.png) 0 0 no-repeat;background-size:cover}.imagiuploaded img{max-width:100%;height:auto}.imagistatus{color:#8ca6b3;text-transform:uppercase;font-weight:700}.imagistatus .dashicons{margin-right:5px}.status-compressing{color:#46b1ce}.status-error{color:#ce0b24}.status-warning{color:#f5a623}.status-complete{color:#8cc152}.imagify-bulk-submit{padding:15px 0 8px 0}.imagify-settings .button-primary.button-primary[disabled]{color:#4a4a4a!important;background:#d9e4eb!important;text-shadow:none!important;cursor:not-allowed}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.imagify-cell-status .dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-col.imagify-col.imagify-account-info-col{width:465px}@media (max-width:1245px){.imagify-col.imagify-col.imagify-account-info-col{width:auto;max-width:none;float:none}.imagify-columns .col-overview.col-overview{float:none;width:auto;padding-left:0;padding-right:0}}@media (max-width:1200px){.imagify-settings .imagify-title .imagify-logo{display:none}}@media (max-width:940px){.imagify-bulk-table-container tbody,.imagify-bulk-table-container tr{text-align:left}.imagify-bulk-table-container tbody,.imagify-bulk-table-container tbody td,.imagify-bulk-table-container tbody tr{display:block}.imagify-bulk-table-container tbody td{padding:20px}.imagify-cell-checkbox,.imagify-cell-title{float:left}.imagify-cell-checkbox{width:26px}.imagify-bulk-table-container .imagify-cell-title{padding-left:10px;width:calc(100% - 96px)}.imagify-cell-count-optimized:before,.imagify-cell-title:after{content:'';display:table;clear:both;width:100%}.imagify-cell-count-optimized{clear:both}.imagify-bulk-table-container .imagify-cell-title~td{display:inline-block}.imagify-bulk-table-container td.imagify-cell-level{display:block}}@media (max-width:918px){.imagify-settings .imagify-title{display:block}.imagify-settings .imagify-documentation-link-box{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}}.hidden{display:none}@media (max-width:782px){.imagify-account-info-col .imagify-options-title,.imagify-newbie .imagify-table-header,.imagify-table-header{-ms-flex-direction:column;flex-direction:column;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-newbie .imagify-th-titles{width:100%}.imagify-newbie .imagify-th-title.imagify-th-title{color:#343a49;font-size:16px;padding-bottom:20px}.imagify-newbie .imagify-th-titles .dashicons,.imagify-newbie .imagify-th-titles .dashicons:before{margin:0}.imagify-newbie .imagify-th-action{display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%}.imagify-newbie .imagify-th-action a{max-width:100%;font-size:11px;padding:11px 12px}.imagify-columns .col-chart.col-chart{text-align:center}.imagify-doughnut-legend{margin-top:18px;width:60%;margin:10px auto}.imagify-account-info-col .imagify-options-title>a{-ms-flex-preferred-size:unset;flex-basis:unset;margin:auto}.imagify-th-title.imagify-th-title.imagify-th-title{font-size:20px}.imagify-account-info-col p.imagify-meteo-title{font-size:20px}.imagify-bulk-table-container tbody td{padding:10px}.imagify-col-content .imagify-space-left{width:auto;margin:0 0 15px 0}} \ No newline at end of file +#imagify-overview-chart-legend{overflow:hidden}.imagify-doughnut-legend{margin-top:38px;list-style:none}.imagify-doughnut-legend li{display:block;padding-left:30px;position:relative;margin-bottom:15px;border-radius:5px;padding:3px 8px 2px 31px;font-size:13px;cursor:default;-webkit-transition:background-color .2s ease-in-out;-o-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;text-align:center}.imagify-total-percent{color:#46b1ce}.imagify-overview-chart-container{float:left;margin-right:20px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-.5em;line-height:1;text-align:center;font-size:55px;font-weight:700;color:#46b1ce}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .media-item,body[class*="_imagify-ngg-bulk-optimization"] .media-item{margin:0}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{float:none;width:100%;height:8px;margin:0;overflow:visible;background:#1f2331;-webkit-box-shadow:0;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{position:absolute;top:6px;right:-28px;text-shadow:none;width:auto;padding:0 5px;line-height:1.85;font-size:14px;font-weight:700;color:#40b1d0}.media_page_imagify-bulk-optimization .media-item .percent,.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{position:relative;width:1px;height:8px;margin-top:0;background:#46b1ce;border-radius:0;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}#imagify-bulk-action{padding:11px 20px}.imagify-columns .col-overview.col-overview{width:calc(100% - 465px);padding-left:20px}.imagify-columns .col-statistics.col-statistics{width:60%}.imagify-columns .col-chart.col-chart{width:40%}@media (max-width:1520px) and (min-width:1381px),(max-width:1086px){.imagify-columns .col-chart.col-chart,.imagify-columns .col-statistics.col-statistics{width:50%}}@media (max-width:1380px) and (min-width:1246px),(max-width:380px){.imagify-overview-chart-container{float:none;margin-right:0}.imagify-doughnut-legend{margin-top:18px}.imagify-global-optim-phrase{padding-top:0;width:auto}}@media (max-width:808px){.imagify-columns .col-chart.col-chart,.imagify-columns .col-statistics.col-statistics{width:auto;float:none;padding:0}.imagify-columns .col-chart.col-chart{margin-top:3em}}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:4.5em}.right-outside-number .imagify-barnb{display:block;margin-right:-5.25em;text-align:right;font-weight:700;line-height:.8}.imagify-h2-like{margin:0 0 .5em 0;padding-bottom:.5em;border-bottom:1px solid #e9eff2;font-size:24px;color:#000;font-weight:700}.imagify-h2-like .dashicons,.imagify-h2-like .dashicons:before{font-size:38px;height:38px;width:38px;margin-right:12px;vertical-align:-5px;color:#40b1d0}.imagify-info-block{position:relative;padding:10px;padding-left:42px;background:#d9e4eb;border-radius:4px;line-height:1.6}.imagify-list-infos{margin:0;padding:0}.imagify-list-infos li{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 5px;text-align:left;font-size:14px;line-height:1.5;color:#626e7b}.imagify-list-infos li:first-child{padding-top:5px}.imagify-list-infos li:last-child{padding-bottom:5px}.imagify-list-infos li+li{border-top:1px solid #e9eff2}.imagify-info-icon{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-preferred-size:50px;flex-basis:50px}.imagify-info-icon+span{padding-left:20px}.imagify-list-infos a:before{content:'';display:block}.imagify-bulk .imagify-settings-section{border:1px solid #d9d9d9;border-top:0;background:#fff;color:#4a4a4a}.imagify-bulk h3,.imagify-bulk li,.imagify-bulk p{color:#4a4a4a}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.imagify-account-info-col .imagify-options-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-account-info-col p.imagify-meteo-title{margin:0;font-size:24px;font-weight:700;color:#fff}.imagify-account-info-col .imagify-options-title>a{-ms-flex-preferred-size:100px;flex-basis:100px;margin-left:auto;margin-right:10px;text-decoration:underline;font-size:12px}.imagify-account-info-col .imagify-meteo-title .dashicons,.imagify-account-info-col .imagify-meteo-title .dashicons:before{font-size:38px;width:38px;height:38px;margin-right:4px;color:#40b1d0}.imagify-col-content .imagify-block-secondary{margin-left:-1px;margin-right:-1px}.imagify-col-content .imagify-space-left{margin:15px 30px 15px 0}.imagify-col-content .imagify-space-left p{margin:0 0 10px 0;font-size:19px;font-weight:500;color:#343a49}.imagify-col-content .imagify-meteo-icon{height:64px;margin:15px 15px 15px 20px}.imagify-col-content .imagify-section-title+p{margin-top:10px}.imagify-account-info-col .imagify-h3-like.imagify-h3-like{color:inherit}.imagify-title .imagify-tooltips{position:absolute;top:100%;left:0}.imagify-tooltips .icon-round{float:left;display:inline-block;width:28px;height:28px;border:1px solid #fff;margin-right:8px;margin-bottom:8px;font-size:17px;font-style:italic;line-height:29px;font-weight:700;text-align:center;border-radius:50%}.imagify-tooltips .tooltip-content{display:block;position:relative;max-width:250px;padding:7px 15px 8px;background:#2e3242;color:#fff;font-size:10px;border-radius:3px}.imagify-tooltips.right .tooltip-content{margin-left:12px}.imagify-tooltips.bottom .tooltip-content{margin-top:4px}.imagify-inline-options label .tooltip-content{position:absolute;left:0;right:0;top:100%;text-transform:none;font-size:10px;letter-spacing:0;text-align:center}.imagify-tooltips .tooltip-content:after{content:"";position:absolute}.imagify-tooltips.right .tooltip-content:after{top:16px;left:-6px;border-right:8px solid #2e3242;border-top:6px solid transparent;border-bottom:6px solid transparent}.imagify-tooltips.bottom .tooltip-content:after{top:-5px;left:50%;margin-left:-3px;border-bottom:6px solid #2e3242;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-space-tooltips .tooltip-content{max-width:280px;margin-top:20px;margin-left:0;padding:5px 15px 5px;font-size:13px;background:#40b1d0;-webkit-box-shadow:0 3px 0 #338ea6;box-shadow:0 3px 0 #338ea6}.imagify-space-tooltips .tooltip-content:after{top:-14px;left:50%;margin-left:-7px;border:0 none;border-bottom:15px solid #40b1d0;border-left:15px solid transparent;border-right:15px solid transparent}.tooltip-content.tooltip-table{display:table;width:100%}.tooltip-content.tooltip-table>*{display:table-cell;vertical-align:middle}.tooltip-content .cell-icon{width:28px}.tooltip-content .cell-icon .icon{margin-bottom:0}.tooltip-content .cell-text{padding:5px 10px 5px 0;line-height:1.3}.tooltip-content .cell-sep{width:1px;background:rgba(255,255,255,.4)}.tooltip-content .cell-cta{padding-left:10px}.tooltip-content .cell-cta a{display:block;color:#fff;width:100%;height:100%;white-space:nowrap}.imagify-number-you-optimized{margin-bottom:1.35em;overflow:hidden}.imagify-number-you-optimized .number{display:table-cell;padding-right:15px;font-size:48px;font-weight:700;line-height:1;vertical-align:middle;white-space:nowrap;color:#000}.imagify-number-you-optimized [id=imagify-total-optimized-attachments-pct]{color:#40b1d0}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px;color:#626e7b}.imagify-number-you-optimized>p{display:table}.imagify-bars{padding-right:15px}.imagify-bars p{font-size:12px;margin-bottom:5px}.imagify-bars+.imagify-number-you-optimized{border-bottom:0;padding-top:.85em}.imagify-bars+.imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em}.imagify-table-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:15px 25px;background:#343a49;color:#fff}.imagify-newbie{margin-top:4em;position:relative;overflow:visible}.imagify-newbie .imagify-new-feature.imagify-new-feature{position:absolute;top:0;left:25px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);margin:0;padding:8px 20px;font-size:14px;letter-spacing:.02em;text-transform:uppercase;font-weight:700;color:#fff;background:#8bc34a}.imagify-newbie .imagify-table-header{padding:30px 25px;border:2px solid #8bc34a;background:#f3f9ec}.imagify-th-titles .dashicons,.imagify-th-titles .dashicons:before{width:38px;height:38px;margin-right:20px;font-size:38px;color:#40b1d0}.imagify-newbie .imagify-th-titles .dashicons:before{color:#8bc34a}.imagify-th-title.imagify-th-title.imagify-th-title{margin:0;font-size:24px;font-weight:500;color:#fff}.imagify-newbie .imagify-th-title.imagify-th-title{color:#343a49}.imagify-th-subtitle.imagify-th-subtitle.imagify-th-subtitle{margin:0 0 5px;font-size:14px;color:#7a8996;font-weight:500}.imagify-th-action .imagify-button-clean{font-size:12px;color:#7a8996}.imagify-th-action .imagify-is-active{color:#fff}.imagify-th-action .button:focus,.imagify-th-action .button:hover{color:#fff}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse}.imagify-bulk-table td{padding:20px}.imagify-bulk-table-details{border-bottom:2px solid #e5ebef}.imagify-bulk-table-details thead th,.imagify-bulk-table-details thead tr{background:#4a5362}.imagify-bulk-table-details thead th{padding:12px 20px;text-align:left;font-weight:700;color:#e5ebef;font-size:12px}.imagify-bulk-table-details tbody tr:nth-child(odd) td{background:#f2f5f7}.imagify-bulk-table-content{border:1px solid #d3d3d3;border-top:0}.imagify-bulk-table-footer{padding:20px;color:#626e7b;background:#f2f5f7}.imagify-bulk-table tbody tr+tr{border-top:3px solid #f2f5f7}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#fff}@media (max-width:782px){.imagify-row-folder-type,tr.imagify-row-waiting,tr.imagify-row-working{padding-top:20px}}.imagify-bulk-table .imagify-row-progress{display:none;height:8px;padding:0}.imagify-bulk-table .imagify-no-uploaded-yet td{height:200px;font-size:17px;letter-spacing:.1em;word-spacing:.12em;vertical-align:middle;text-transform:uppercase;font-weight:700;text-align:center;color:#999;background-color:#fff}.imagify-selector{position:relative}.imagify-selector-list{background:#fff;border:1px solid #f4f7f9;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.1);border-radius:3px;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.imagify-selector-list li:first-child label{border-radius:3px 3px 0 0}.imagify-selector-list li:last-child label{border-radius:0 0 3px 3px}.imagify-selector-list li{margin:0}.imagify-selector-list li+li{border-top:1px solid #f4f7f9}.imagify-selector-list svg{margin-right:5px}.imagify-selector-list .imagify-selector-current-value label,.imagify-selector-list input:checked+label{background:#343a49;color:#fff}.imagify-selector-list .imagify-selector-current-value input:focus+label,.imagify-selector-list .imagify-selector-current-value label:hover,.imagify-selector-list input:checked+label:hover,.imagify-selector-list input:focus+label,.imagify-selector-list label:hover{background:#40b1d0;color:#f4f7f9}.imagify-selector-list .imagify-selector-current-value input:focus+label polygon,.imagify-selector-list .imagify-selector-current-value label:hover polygon,.imagify-selector-list input:checked+label:hover polygon,.imagify-selector-list input:focus+label polygon,.imagify-selector-list label:hover polygon{fill:#FFF}.imagify-selector-list .imagify-selector-current-value input:focus+label polygon[fill="#CCD1D6"],.imagify-selector-list .imagify-selector-current-value label:hover polygon[fill="#CCD1D6"],.imagify-selector-list input:checked+label:hover polygon[fill="#CCD1D6"],.imagify-selector-list input:focus+label polygon[fill="#CCD1D6"],.imagify-selector-list label:hover polygon[fill="#CCD1D6"]{fill:#3694AE}.imagify-selector-list li label{display:block;padding:10px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-selector-list polygon{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-selector-list{position:absolute;top:0;left:0;right:0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.imagify-selector-list[aria-hidden=true]{opacity:0;visibility:hidden;-webkit-transform:translateY(-50%) scale(0);-ms-transform:translateY(-50%) scale(0);transform:translateY(-50%) scale(0)}.imagify-selector-list[aria-hidden=false]{opacity:1;visibility:visible;-webkit-transform:translateY(-50%) scale(1);-ms-transform:translateY(-50%) scale(1);transform:translateY(-50%) scale(1)}.button .imagify-selector-current-value-info{position:relative;padding-right:20px}.button .imagify-selector-current-value-info:after{content:'';position:absolute;right:0;top:50%;margin-top:-3px;border-top:6px solid #7a8996;border-left:6px solid transparent;border-right:6px solid transparent}.imagify-row-complete{padding:35px 20px;margin-top:2em;background:#8bc34a;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.1)}.imagify-row-complete .imagify-ac-chart{margin-top:3px}.imagify-row-complete.imagify-row-complete p{color:#fff;margin:0}@-webkit-keyframes congrate{0%{opacity:0;-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);opacity:1}}@keyframes congrate{0%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate .5s ease-in-out;animation:congrate .5s ease-in-out}.imagify-all-complete{margin:1.5em 0}.imagify-all-complete>div{display:inline-block;vertical-align:middle}.imagify-ac-report{min-width:310px;margin-right:20px}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text{overflow:hidden}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-weight:700;font-size:24px;letter-spacing:.15em;word-spacing:0.15em;text-transform:uppercase}.imagify-ac-share{text-align:right}.imagify-ac-share-content{display:inline-block;padding:10px 15px;background:rgba(255,255,255,.2)}.imagify-ac-share-content>*{display:inline-block;vertical-align:middle}.imagify-bulk-table .imagify-ac-share-content p{margin-right:5px}.imagify-share-networks,.imagify-share-networks li{margin:0}.imagify-share-networks li{display:inline-block}.imagify-share-networks a{display:inline-block;vertical-align:-7px;margin:0 5px;text-decoration:none;color:#fff}.imagify-cell-checkbox{width:35px}.imagify-cell-checkbox p{margin:0}.imagify-cell-checkbox-loader{display:block;width:27px;height:28px;line-height:0;-webkit-animation:loading 4s infinite linear;animation:loading 4s infinite linear}@-webkit-keyframes loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-cell-checkbox-loader.hidden{display:none;-webkit-animation:none;animation:none}.imagify-cell-label,.imagify-cell-title label{font-size:14px;text-transform:uppercase;letter-spacing:.02em;font-weight:700}.imagify-cell-label{margin-right:10px}.imagify-cell-value{font-size:12px;font-weight:500;color:#7a8996}td.imagify-cell-title{padding-left:0}.imagify-cell-original-size .imagify-cell-label,.imagify-cell-title label{color:#1f2332}.imagify-cell-optimized-size,.imagify-cell-original-size{font-weight:500;color:#7a8996;font-size:12px}.imagify-cell-optimized-size .imagify-cell-label{color:#338ea6}.imagify-cell-count-optimized{font-size:14px;font-weight:700;color:#338ea6}.imagify-cell-count-errors{color:#c51162;font-weight:700;font-size:14px}.imagify-cell-count-errors a{margin-left:5px;color:#7a8996;font-weight:400;font-size:12px}.imagify-cell-filename{max-width:200px}.imagify-cell-status{max-width:145px}.imagify-cell-status .dashicons-warning{margin-right:2px}.imagify-cell-thumbnails{max-width:120px}td.imagify-cell-filename{-o-text-overflow:clip;text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46b1ce;font-weight:700}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagify-cell-totaloriginal{text-align:right}.imagify-cell-level{width:145px}.imagify-selector-button.imagify-selector-button{border:1px solid #fff;padding:2px 10px}.imagify-selector-button.imagify-selector-button:focus,.imagify-selector-button.imagify-selector-button:hover{border-color:#eee;-webkit-box-shadow:0 4px 8px rgba(0,0,0,.1);box-shadow:0 4px 8px rgba(0,0,0,.1)}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle;margin-left:5px;color:#626e7b;font-weight:500}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;overflow:hidden;background:url(../images/upload-image.png) 0 0 no-repeat;background-size:cover}.imagiuploaded img{max-width:100%;height:auto}.imagistatus{color:#8ca6b3;text-transform:uppercase;font-weight:700}.imagistatus .dashicons{margin-right:5px}.status-compressing{color:#46b1ce}.status-error{color:#ce0b24}.status-warning{color:#f5a623}.status-complete{color:#8cc152}.imagify-bulk-submit{padding:15px 0 8px 0}.imagify-settings .button-primary.button-primary[disabled]{color:#4a4a4a!important;background:#d9e4eb!important;text-shadow:none!important;cursor:not-allowed}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.imagify-cell-status .dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.imagify-col.imagify-col.imagify-account-info-col{width:465px}@media (max-width:1245px){.imagify-col.imagify-col.imagify-account-info-col{width:auto;max-width:none;float:none}.imagify-columns .col-overview.col-overview{float:none;width:auto;padding-left:0;padding-right:0}}@media (max-width:1200px){.imagify-settings .imagify-title .imagify-logo{display:none}}@media (max-width:940px){.imagify-bulk-table-container tbody,.imagify-bulk-table-container tr{text-align:left}.imagify-bulk-table-container tbody,.imagify-bulk-table-container tbody td,.imagify-bulk-table-container tbody tr{display:block}.imagify-bulk-table-container tbody td{padding:20px}.imagify-cell-checkbox,.imagify-cell-title{float:left}.imagify-cell-checkbox{width:26px}.imagify-bulk-table-container .imagify-cell-title{padding-left:10px;width:calc(100% - 96px)}.imagify-cell-count-optimized:before,.imagify-cell-title:after{content:'';display:table;clear:both;width:100%}.imagify-cell-count-optimized{clear:both}.imagify-bulk-table-container .imagify-cell-title~td{display:inline-block}.imagify-bulk-table-container td.imagify-cell-level{display:block}}@media (max-width:918px){.imagify-settings .imagify-title{display:block}.imagify-settings .imagify-documentation-link-box{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}}.hidden{display:none}@media (max-width:782px){.imagify-account-info-col .imagify-options-title,.imagify-newbie .imagify-table-header,.imagify-table-header{-ms-flex-direction:column;flex-direction:column;-webkit-box-direction:normal;-webkit-box-orient:vertical;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-newbie .imagify-th-titles{width:100%}.imagify-newbie .imagify-th-title.imagify-th-title{color:#343a49;font-size:16px;padding-bottom:20px}.imagify-newbie .imagify-th-titles .dashicons,.imagify-newbie .imagify-th-titles .dashicons:before{margin:0}.imagify-newbie .imagify-th-action{display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%}.imagify-newbie .imagify-th-action a{max-width:100%;font-size:11px;padding:11px 12px}.imagify-columns .col-chart.col-chart{text-align:center}.imagify-doughnut-legend{margin-top:18px;width:60%;margin:10px auto}.imagify-account-info-col .imagify-options-title>a{-ms-flex-preferred-size:unset;flex-basis:unset;margin:auto}.imagify-th-title.imagify-th-title.imagify-th-title{font-size:20px}.imagify-account-info-col p.imagify-meteo-title{font-size:20px}.imagify-bulk-table-container tbody td{padding:10px}.imagify-col-content .imagify-space-left{width:auto;margin:0 0 15px 0}} \ No newline at end of file diff --git a/assets/css/files-list.css b/assets/css/files-list.css index b84a0a872..d566e4962 100644 --- a/assets/css/files-list.css +++ b/assets/css/files-list.css @@ -1,15 +1,24 @@ /* Filter block */ .imagify-files-list .wp-filter { - padding: 15px 20px; + padding: 0 20px 15px; } .imagify-files-list .filter-items select { height: auto; - padding: 6px; - margin-right: 12px; + padding: 2px 20px 3px 6px; + margin: 15px 12px 0 0; + max-width: 100%; } .imagify-files-list .filter-items .button { height: auto; padding: 2px 12px 3px; + margin-top: 15px; +} +@media screen and (max-width: 782px) { + .imagify-files-list .filter-items .button { + margin-bottom: 0; + line-height: 2.15384615; + padding: 0 12px; + } } /* Empty table */ diff --git a/assets/css/files-list.min.css b/assets/css/files-list.min.css index eea46e2c2..2c73fd0ae 100644 --- a/assets/css/files-list.min.css +++ b/assets/css/files-list.min.css @@ -1 +1 @@ -.imagify-files-list .wp-filter{padding:15px 20px}.imagify-files-list .filter-items select{height:auto;padding:6px;margin-right:12px}.imagify-files-list .filter-items .button{height:auto;padding:2px 12px 3px}.imagify-files-list .no-items td{padding:35px;text-align:center;font-size:18px}.imagify-files-list .no-items td a{text-decoration:underline}.imagify-files-list .sortable a{color:#000}.imagify-files-list a{color:#3694ae}.imagify-files-list tbody td,.imagify-files-list tbody th,.imagify-files-list.imagify-files-list tbody .check-column{vertical-align:middle;padding-top:20px;padding-bottom:20px;color:#626e7b}.imagify-files-list .column-title strong{font-weight:400;font-size:14px}.imagify-files-list .column-title strong a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;word-break:break-all;word-wrap:break-word;font-weight:400}.imagify-files-list .filename{font-size:12px;font-weight:700}.imagify-files-list .media-icon{position:relative;width:60px;overflow:hidden;-ms-flex-negative:0;flex-shrink:0}.media-icon .centered{position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:translate(50%,50%);-ms-transform:translate(50%,50%);transform:translate(50%,50%)}.media-icon .centered img{position:absolute;left:0;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}table.media .column-title .media-icon.landscape img{max-width:none;width:auto;height:60px}table.media .column-title .media-icon.portrait img{width:60px}.imagify-files-list ul.imagify-datas-list{font-size:11px}.imagify-files-list ul.imagify-datas-list .big{font-size:13px}.imagify-files-list ul.imagify-datas-list span.imagify-chart-value{font-size:12px}.imagify-files-list ul.imagify-datas-list .imagify-chart-container{margin-right:2px}.imagify-files-list ul.imagify-datas-list canvas{width:18px!important;height:18px!important}.imagify-files-list .optimization_level{text-align:center;font-weight:700;font-size:14px;text-transform:uppercase;letter-spacing:.02em}.imagify-files-list .column-optimization_level,.imagify-files-list .column-optimization_level a{text-align:center}.imagify-files-list .column-optimization_level a span{float:none;display:inline-block;vertical-align:middle}.imagify-files-list .column-optimization_level .sorting-indicator{vertical-align:-10px}.imagify-files-list .column-actions .button,.imagify-files-list .column-actions .button-primary{padding:5px 20px;font-size:14px;height:auto}.imagify-files-list .column-actions .button-primary{background:#3694ae;color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none}.imagify-files-list .column-actions a,.status a.button-imagify-refresh-status{display:inline-block;margin:.3em 0;font-size:12px;font-weight:700}.imagify-files-list .imagify-status-already_optimized{font-weight:700;color:#8bc34a}.imagify-files-list .column-actions a .dashicons,.imagify-files-list .column-actions a .dashicons:before,.status a.button-imagify-refresh-status .dashicons,.status a.button-imagify-refresh-status .dashicons:before{margin-right:2px;font-size:17px;height:17px;width:17px} \ No newline at end of file +.imagify-files-list .wp-filter{padding:0 20px 15px}.imagify-files-list .filter-items select{height:auto;padding:2px 20px 3px 6px;margin:15px 12px 0 0;max-width:100%}.imagify-files-list .filter-items .button{height:auto;padding:2px 12px 3px;margin-top:15px}@media screen and (max-width:782px){.imagify-files-list .filter-items .button{margin-bottom:0;line-height:2.15384615;padding:0 12px}}.imagify-files-list .no-items td{padding:35px;text-align:center;font-size:18px}.imagify-files-list .no-items td a{text-decoration:underline}.imagify-files-list .sortable a{color:#000}.imagify-files-list a{color:#3694ae}.imagify-files-list tbody td,.imagify-files-list tbody th,.imagify-files-list.imagify-files-list tbody .check-column{vertical-align:middle;padding-top:20px;padding-bottom:20px;color:#626e7b}.imagify-files-list .column-title strong{font-weight:400;font-size:14px}.imagify-files-list .column-title strong a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;word-break:break-all;word-wrap:break-word;font-weight:400}.imagify-files-list .filename{font-size:12px;font-weight:700}.imagify-files-list .media-icon{position:relative;width:60px;overflow:hidden;-ms-flex-negative:0;flex-shrink:0}.media-icon .centered{position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:translate(50%,50%);-ms-transform:translate(50%,50%);transform:translate(50%,50%)}.media-icon .centered img{position:absolute;left:0;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}table.media .column-title .media-icon.landscape img{max-width:none;width:auto;height:60px}table.media .column-title .media-icon.portrait img{width:60px}.imagify-files-list ul.imagify-datas-list{font-size:11px}.imagify-files-list ul.imagify-datas-list .big{font-size:13px}.imagify-files-list ul.imagify-datas-list span.imagify-chart-value{font-size:12px}.imagify-files-list ul.imagify-datas-list .imagify-chart-container{margin-right:2px}.imagify-files-list ul.imagify-datas-list canvas{width:18px!important;height:18px!important}.imagify-files-list .optimization_level{text-align:center;font-weight:700;font-size:14px;text-transform:uppercase;letter-spacing:.02em}.imagify-files-list .column-optimization_level,.imagify-files-list .column-optimization_level a{text-align:center}.imagify-files-list .column-optimization_level a span{float:none;display:inline-block;vertical-align:middle}.imagify-files-list .column-optimization_level .sorting-indicator{vertical-align:-10px}.imagify-files-list .column-actions .button,.imagify-files-list .column-actions .button-primary{padding:5px 20px;font-size:14px;height:auto}.imagify-files-list .column-actions .button-primary{background:#3694ae;color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none}.imagify-files-list .column-actions a,.status a.button-imagify-refresh-status{display:inline-block;margin:.3em 0;font-size:12px;font-weight:700}.imagify-files-list .imagify-status-already_optimized{font-weight:700;color:#8bc34a}.imagify-files-list .column-actions a .dashicons,.imagify-files-list .column-actions a .dashicons:before,.status a.button-imagify-refresh-status .dashicons,.status a.button-imagify-refresh-status .dashicons:before{margin-right:2px;font-size:17px;height:17px;width:17px} \ No newline at end of file diff --git a/assets/js/pricing-modal.js b/assets/js/pricing-modal.js index 68992b40c..5848a8d71 100755 --- a/assets/js/pricing-modal.js +++ b/assets/js/pricing-modal.js @@ -199,7 +199,7 @@ $offer.find('.imagify-approx-nb').text(quo * 5); if ('monthly' === type) { - // Additionnal price. + // Additional price. $offer.find('.imagify-price-add-data').text('$' + add); } diff --git a/classes/Context/AbstractContext.php b/classes/Context/AbstractContext.php index ca3d475aa..07dc59d26 100644 --- a/classes/Context/AbstractContext.php +++ b/classes/Context/AbstractContext.php @@ -1,8 +1,6 @@ can_backup; } - /** - * Tell if the optimization process is allowed to keep exif in this context. - * - * @since 1.9 - * @access public - * @author Grégory Viguier - * - * @return bool - */ - public function can_keep_exif() { - return $this->can_keep_exif; - } - /** * Tell if the current user is allowed to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $describer Capacity describer. See $this->get_capacity() for possible values. Can also be a "real" user capacity. @@ -205,7 +168,6 @@ public function current_user_can( $describer, $media_id = null ) { * Tell if a user is allowed to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param int|\WP_User $user_id A user ID or \WP_User object. Fallback to the current user ID. @@ -276,7 +238,6 @@ public function user_can( $user_id, $describer, $media_id = null ) { * Filter a user capacity used to operate Imagify in this context. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $capacity The user capacity. diff --git a/classes/Context/ContextInterface.php b/classes/Context/ContextInterface.php index ead8361c7..ae3fcac76 100644 --- a/classes/Context/ContextInterface.php +++ b/classes/Context/ContextInterface.php @@ -1,8 +1,6 @@ get_capacity() for possible values. Can also be a "real" user capacity. @@ -140,7 +118,6 @@ public function current_user_can( $describer, $media_id = null ); * Tell if a user is allowed to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param int $user_id A user ID. @@ -155,7 +132,6 @@ public function user_can( $user_id, $describer, $media_id = null ); * * @since 1.9 * @since 1.9 The describer 'auto-optimize' is not used anymore. - * @access public * @author Grégory Viguier * * @param string $describer Capacity describer. Possible values are like 'manage', 'bulk-optimize', 'manual-optimize', 'auto-optimize'. diff --git a/classes/Context/CustomFolders.php b/classes/Context/CustomFolders.php index a8ebb404c..333537295 100644 --- a/classes/Context/CustomFolders.php +++ b/classes/Context/CustomFolders.php @@ -1,7 +1,7 @@ can_backup; } - /** - * Tell if the optimization process is allowed to keep exif in this context. - * - * @since 1.9 - * @access public - * @author Grégory Viguier - * - * @return bool - */ - public function can_keep_exif() { - if ( isset( $this->can_keep_exif ) ) { - return $this->can_keep_exif; - } - - $this->can_keep_exif = get_imagify_option( 'exif' ); - - return $this->can_keep_exif; - } - /** * Get user capacity to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $describer Capacity describer. Possible values are like 'manage', 'bulk-optimize', 'manual-optimize', 'auto-optimize'. diff --git a/classes/Context/Noop.php b/classes/Context/Noop.php index 2cae5df62..caf84bf4e 100644 --- a/classes/Context/Noop.php +++ b/classes/Context/Noop.php @@ -1,7 +1,7 @@ get_capacity() for possible values. Can also be a "real" user capacity. @@ -135,7 +127,6 @@ public function current_user_can( $describer, $media_id = null ) { * Tell if a user is allowed to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param int $user_id A user ID. @@ -151,7 +142,6 @@ public function user_can( $user_id, $describer, $media_id = null ) { * Get user capacity to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $describer Capacity describer. Possible values are like 'manage', 'bulk-optimize', 'manual-optimize', 'auto-optimize'. diff --git a/classes/Context/WP.php b/classes/Context/WP.php index bd10e3fd8..311a39e81 100644 --- a/classes/Context/WP.php +++ b/classes/Context/WP.php @@ -1,8 +1,6 @@ can_backup; } - /** - * Tell if the optimization process is allowed to keep exif in this context. - * - * @since 1.9 - * @access public - * @author Grégory Viguier - * - * @return bool - */ - public function can_keep_exif() { - if ( isset( $this->can_keep_exif ) ) { - return $this->can_keep_exif; - } - - $this->can_keep_exif = get_imagify_option( 'exif' ); - - return $this->can_keep_exif; - } - /** * Get user capacity to operate Imagify in this context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $describer Capacity describer. Possible values are like 'manage', 'bulk-optimize', 'manual-optimize', 'auto-optimize'. diff --git a/classes/Optimization/File.php b/classes/Optimization/File.php index 991b76449..fdebf6b3d 100644 --- a/classes/Optimization/File.php +++ b/classes/Optimization/File.php @@ -3,8 +3,6 @@ use Imagify_Requirements; -defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' ); - /** * A generic optimization class focussed on the file itself. * @@ -18,7 +16,6 @@ class File { * * @var string * @since 1.9 - * @access protected * @author Grégory Viguier */ protected $path; @@ -28,7 +25,6 @@ class File { * * @var bool * @since 1.9 - * @access protected * @see $this->is_image() * @author Grégory Viguier */ @@ -39,7 +35,6 @@ class File { * * @var array * @since 1.9 - * @access protected * @see $this->get_file_type() * @author Grégory Viguier */ @@ -50,7 +45,6 @@ class File { * * @var \Imagify_Filesystem * @since 1.9 - * @access protected * @author Grégory Viguier */ protected $filesystem; @@ -60,7 +54,6 @@ class File { * * @var \WP_Image_Editor_Imagick|\WP_Image_Editor_GD|WP_Error. * @since 1.9 - * @access protected * @author Grégory Viguier */ protected $editor; @@ -70,7 +63,6 @@ class File { * * @var array * @since 1.9 - * @access protected * @author Grégory Viguier */ protected $options = []; @@ -79,7 +71,6 @@ class File { * The constructor. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $file_path Absolute path to the file. @@ -93,7 +84,6 @@ public function __construct( $file_path ) { * Tell if the file is valid. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool @@ -106,7 +96,6 @@ public function is_valid() { * Tell if the file can be processed. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool|WP_Error @@ -178,7 +167,6 @@ public function can_be_processed() { * Resize (and rotate) an image if it is bigger than the maximum width provided. * * @since 1.9 - * @access public * @author Grégory Viguier * @author Remy Perona * @@ -301,7 +289,6 @@ public function resize( $dimensions = [], $max_width = 0 ) { * Warning: If the destination file already exists, it will be overwritten. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param array $destination { @@ -386,7 +373,6 @@ public function create_thumbnail( $destination ) { * * @since 1.9 * @since 1.9.8 Added $backup_source argument. - * @access public * @author Grégory Viguier * * @param string $backup_path The backup path. @@ -444,7 +430,6 @@ public function backup( $backup_path = null, $backup_source = null ) { * Optimize a file with Imagify. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param array $args { @@ -453,7 +438,6 @@ public function backup( $backup_path = null, $backup_source = null ) { * @type bool $backup False to prevent backup. True to follow the user's setting. A backup can't be forced. * @type string $backup_path If a backup must be done, this is the path to use. Default is the backup path used for the WP Media Library. * @type int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal). - * @type bool $keep_exif To keep exif data or not. * @type string $convert Set to 'webp' to convert the image to WebP. * @type string $context The context. * @type int $original_size The file size, sent to the API. @@ -466,7 +450,6 @@ public function optimize( $args = [] ) { 'backup_path' => null, 'backup_source' => null, 'optimization_level' => 0, - 'keep_exif' => true, 'convert' => '', 'context' => 'wp', 'original_size' => 0, @@ -519,7 +502,7 @@ public function optimize( $args = [] ) { 'normal' => 0 === $args['optimization_level'], 'aggressive' => 1 === $args['optimization_level'], 'ultra' => 2 === $args['optimization_level'], - 'keep_exif' => $args['keep_exif'], + 'keep_exif' => true, 'original_size' => $args['original_size'], 'context' => $args['context'], ]; @@ -596,7 +579,6 @@ public function optimize( $args = [] ) { * Get an image editor instance (WP_Image_Editor_Imagick, WP_Image_Editor_GD). * * @since 1.9 - * @access protected * @author Grégory Viguier * * @return WP_Image_Editor_Imagick|WP_Image_Editor_GD|WP_Error @@ -631,7 +613,6 @@ protected function get_editor() { * Get the image editor methods we will use. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @return array @@ -666,7 +647,6 @@ protected function get_editor_methods() { * Check if a file exceeds the weight limit (> 5mo). * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool @@ -685,7 +665,6 @@ public function is_exceeded() { * Tell if the current file is supported for a given context. * * @since 1.9 - * @access public * @see imagify_get_mime_types() * @author Grégory Viguier * @@ -700,7 +679,6 @@ public function is_supported( $allowed_mime_types ) { * Tell if the file is an image. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool @@ -719,7 +697,6 @@ public function is_image() { * Tell if the file is a pdf. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool @@ -732,7 +709,6 @@ public function is_pdf() { * Get the file mime type. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return string @@ -745,7 +721,6 @@ public function get_mime_type() { * Get the file extension. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return string|null @@ -758,7 +733,6 @@ public function get_extension() { * Get the file path. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return string @@ -771,7 +745,6 @@ public function get_path() { * Replace the file extension by WebP. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return string|bool The file path on success. False if not an image or on failure. @@ -793,7 +766,6 @@ public function get_path_to_webp() { * Rejects "path/to/.webp" files. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool @@ -806,7 +778,6 @@ public function is_webp() { * Get the file mime type + file extension. * * @since 1.9 - * @access protected * @see wp_check_filetype() * @author Grégory Viguier * @@ -838,7 +809,6 @@ protected function get_file_type() { * If the media is an image, get its width and height. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return array @@ -863,7 +833,6 @@ public function get_dimensions() { * Get a plugin’s option. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $option_name The option nme. diff --git a/classes/Optimization/Process/AbstractProcess.php b/classes/Optimization/Process/AbstractProcess.php index bbff55249..a4b0820df 100644 --- a/classes/Optimization/Process/AbstractProcess.php +++ b/classes/Optimization/Process/AbstractProcess.php @@ -1,12 +1,11 @@ get_capacity() for possible values. Can also be a "real" user capacity. @@ -264,7 +250,6 @@ public function current_user_can( $describer ) { * Optimize a media files. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param int $optimization_level The optimization level (0=normal, 1=aggressive, 2=ultra). @@ -311,7 +296,6 @@ public function optimize( $optimization_level = null, $args = [] ) { * Re-optimize a media files with a different level. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param int $optimization_level The optimization level (0=normal, 1=aggressive, 2=ultra). @@ -356,7 +340,6 @@ public function reoptimize( $optimization_level = null, $args = [] ) { * Optimize several file sizes by pushing tasks into the queue. * * @since 1.9 - * @access public * @see MediaOptimization->task_before() * @see MediaOptimization->task_after() * @author Grégory Viguier @@ -479,7 +462,6 @@ public function optimize_sizes( $sizes, $optimization_level = null, $args = [] ) * Optimize one file with Imagify directly. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $size The media size. @@ -683,7 +665,7 @@ public function optimize_size( $size, $optimization_level = null ) { 'backup_source' => 'full' === $thumb_size ? $media->get_original_path() : null, 'optimization_level' => $optimization_level, 'convert' => $webp ? 'webp' : '', - 'keep_exif' => $this->can_keep_exif( $size ), + 'keep_exif' => true, 'context' => $media->get_context(), 'original_size' => $response['file_size'], ] ); @@ -740,7 +722,6 @@ public function optimize_size( $size, $optimization_level = null ) { * Compare the file size of a file and its WebP version: if the WebP version is heavier than the non-WebP file, delete it. * * @since 1.9.4 - * @access protected * @author Grégory Viguier * * @param array $args { @@ -850,7 +831,6 @@ protected function compare_webp_file_size( $args ) { * Restore the media files from the backup file. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool|WP_Error True on success. A \WP_Error instance on failure. @@ -963,7 +943,6 @@ public function restore() { * Restore the thumbnails. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @return bool|WP_Error True on success. A \WP_Error instance on failure. @@ -992,7 +971,6 @@ protected function restore_thumbnails() { * Delete the backup file. * * @since 1.9 - * @access public * @author Grégory Viguier */ public function delete_backup() { @@ -1022,7 +1000,6 @@ public function delete_backup() { * Create a temporary copy of a size file. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $size The image size name. @@ -1172,7 +1149,6 @@ protected function create_temporary_copy( $size, $sizes = null ) { * Get the path to a temporary copy of a size file. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $size The image size name. @@ -1212,7 +1188,6 @@ protected function get_temporary_copy_path( $size, $sizes = null ) { * Maybe resize an image. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $size The size name. @@ -1322,7 +1297,6 @@ public function maybe_resize( $size, $file ) { * Tell if a size should be resized. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $size The size name. @@ -1350,7 +1324,6 @@ protected function can_resize( $size, $file ) { * Tell if a size should be backuped. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $size The size name. @@ -1369,29 +1342,6 @@ protected function can_backup( $size ) { return $this->get_media()->get_context_instance()->can_backup(); } - /** - * Tell if a size should keep exif. - * - * @since 1.9 - * @access protected - * @author Grégory Viguier - * - * @param string $size The size name. - * @return bool - */ - protected function can_keep_exif( $size ) { - if ( ! $this->is_valid() ) { - return false; - } - - if ( 'full' !== $size && 'full' . static::WEBP_SUFFIX !== $size ) { - // We keep exif only on the main file and its WebP version. - return false; - } - - return $this->get_media()->get_context_instance()->can_keep_exif(); - } - /** ----------------------------------------------------------------------------------------- */ /** WEBP ==================================================================================== */ @@ -1401,7 +1351,6 @@ protected function can_keep_exif( $size ) { * Generate WebP images if they are missing. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool|WP_Error True if successfully launched. A \WP_Error instance on failure. @@ -1459,7 +1408,6 @@ public function generate_webp_versions() { * * @since 1.9 * @since 1.9.6 Return WP_Error or true. - * @access public * @author Grégory Viguier * * @param bool $keep_full Set to true to keep the full size. @@ -1518,7 +1466,6 @@ public function delete_webp_files( $keep_full = false ) { * * @since 1.9 * @since 1.9.6 Return WP_Error or true. - * @access protected * @author Grégory Viguier * * @param string $file_path Path to the non-WebP file. @@ -1582,7 +1529,6 @@ protected function delete_webp_file( $file_path ) { * Tell if a thumbnail size is an "Imagify WebP" size. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $size_name The size name. @@ -1606,7 +1552,6 @@ public function is_size_webp( $size_name ) { * Tell if the media has WebP versions. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return bool @@ -1637,7 +1582,6 @@ public function has_webp() { * Make sure the file is an image before using this method. * * @since 1.9.5 - * @access public * @author Grégory Viguier * * @param string $file_path Path to the file. @@ -1684,7 +1628,6 @@ public function can_create_webp_version( $file_path ) { * Tell if a process is running for this media. * * @since 1.9 - * @access public * @author Grégory Viguier * * @return string|bool The action if locked ('optimizing' or 'restoring'). False if not locked. @@ -1710,7 +1653,6 @@ public function is_locked() { * Set the running status to "running" for 10 minutes. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $action The action performed behind this lock: 'optimizing' or 'restoring'. @@ -1733,7 +1675,6 @@ public function lock( $action = 'optimizing' ) { * Unset the running status. * * @since 1.9 - * @access public * @author Grégory Viguier */ public function unlock() { @@ -1752,7 +1693,6 @@ public function unlock() { * Get the name of the transient that stores the lock status. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @return string|bool The name on success. False on failure. @@ -1775,7 +1715,6 @@ protected function get_lock_name() { * Validate the lock action. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $action The action performed behind this lock: 'optimizing' or 'restoring'. @@ -1804,7 +1743,6 @@ protected function validate_lock_action( $action ) { * Tell if a size already has optimization data. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $size The size name. @@ -1820,7 +1758,6 @@ public function size_has_optimization_data( $size ) { * Update the optimization data for a size. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param object $response The API response. @@ -1919,7 +1856,6 @@ public function update_size_optimization_data( $response, $size, $level ) { * Get a plugin’s option. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param string $option_name The option nme. @@ -1940,7 +1876,6 @@ protected function get_option( $option_name ) { * If not provided (false, null), fallback to the level set in the plugin's settings. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param mixed $optimization_level The optimization level. diff --git a/classes/Webp/Picture/Display.php b/classes/Webp/Picture/Display.php index 6287742c4..7a475327a 100644 --- a/classes/Webp/Picture/Display.php +++ b/classes/Webp/Picture/Display.php @@ -51,6 +51,7 @@ public function __construct() { */ public function init() { add_action( 'template_redirect', [ $this, 'start_content_process' ], -1000 ); + add_filter( 'imagify_process_webp_content', [ $this, 'process_content' ] ); } /** ----------------------------------------------------------------------------------------- */ @@ -148,7 +149,8 @@ public function process_content( $content ) { $content = str_replace( $image['tag'], $tag, $content ); } - return $content; } + return $content; + } /** * Remove pre-existing tags. diff --git a/composer.json b/composer.json index 2a017ddb7..ec5d79eb0 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,12 @@ "type": "wordpress-plugin", "config": { "classloader-suffix": "WPMediaImagifyWordPressPlugin", - "sort-packages": true + "sort-packages": true, + "allow-plugins": { + "composer/installers": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "dangoodman/composer-for-wordpress": true + } }, "support": { "issues": "https://github.com/wp-media/imagify-plugin/issues", diff --git a/imagify.php b/imagify.php index e6392b6ae..25c2b94b4 100644 --- a/imagify.php +++ b/imagify.php @@ -3,25 +3,23 @@ * Plugin Name: Imagify * Plugin URI: https://wordpress.org/plugins/imagify/ * Description: Dramatically reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your bandwidth using Imagify, the new most advanced image optimization tool. - * Version: 1.10 + * Version: 2.0 * Requires at least: 5.3 * Requires PHP: 7.0 - * Author: WP Media - * Author URI: https://wp-media.me/ + * Author: WP Rocket + * Author URI: https://wp-rocket.me/ * Licence: GPLv2 * * Text Domain: imagify * Domain Path: languages * - * Copyright 2019 WP Media - * - * @package WP-Media\Imagify\WordPress-Plugin + * Copyright 2022 WP Media */ defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' ); // Imagify defines. -define( 'IMAGIFY_VERSION', '1.10' ); +define( 'IMAGIFY_VERSION', '2.0' ); define( 'IMAGIFY_SLUG', 'imagify' ); define( 'IMAGIFY_FILE', __FILE__ ); define( 'IMAGIFY_PATH', realpath( plugin_dir_path( IMAGIFY_FILE ) ) . '/' ); @@ -37,7 +35,6 @@ } define( 'IMAGIFY_APP_API_URL', IMAGIFY_APP_DOMAIN . '/api/' ); -add_action( 'plugins_loaded', '_imagify_init' ); /** * Plugin init. * @@ -65,6 +62,7 @@ function _imagify_init() { $plugin->init(); } +add_action( 'plugins_loaded', '_imagify_init' ); /** * Check if Imagify is activated on the network. @@ -144,7 +142,6 @@ function imagify_load_translations() { load_plugin_textdomain( 'imagify', false, dirname( plugin_basename( IMAGIFY_FILE ) ) . '/languages/' ); } -register_activation_hook( IMAGIFY_FILE, 'imagify_set_activation' ); /** * Set a transient on plugin activation, it will be used later to trigger activation hooks after the plugin is loaded. * The transient contains the ID of the user that activated the plugin. @@ -164,8 +161,8 @@ function imagify_set_activation() { set_transient( 'imagify_activation', get_current_user_id(), 30 ); } } +register_activation_hook( IMAGIFY_FILE, 'imagify_set_activation' ); -register_deactivation_hook( IMAGIFY_FILE, 'imagify_deactivation' ); /** * Trigger a hook on plugin deactivation. * @@ -185,3 +182,5 @@ function imagify_deactivation() { */ do_action( 'imagify_deactivation' ); } +register_deactivation_hook( IMAGIFY_FILE, 'imagify_deactivation' ); + diff --git a/inc/3rd-party/3rd-party.php b/inc/3rd-party/3rd-party.php index 35190d7bb..35ca142a2 100755 --- a/inc/3rd-party/3rd-party.php +++ b/inc/3rd-party/3rd-party.php @@ -12,6 +12,7 @@ require IMAGIFY_PATH . 'inc/3rd-party/regenerate-thumbnails/regenerate-thumbnails.php'; require IMAGIFY_PATH . 'inc/3rd-party/screets-lc.php'; require IMAGIFY_PATH . 'inc/3rd-party/wp-real-media-library.php'; +require IMAGIFY_PATH . 'inc/3rd-party/wp-cloudflare-super-page-cache.php'; require IMAGIFY_PATH . 'inc/3rd-party/wp-rocket/wp-rocket.php'; require IMAGIFY_PATH . 'inc/3rd-party/yoast-seo.php'; require IMAGIFY_PATH . 'inc/3rd-party/WooCommerce/class-woocommerce.php'; diff --git a/inc/3rd-party/nextgen-gallery/classes/Context/NGG.php b/inc/3rd-party/nextgen-gallery/classes/Context/NGG.php index 103543b45..f780a3294 100644 --- a/inc/3rd-party/nextgen-gallery/classes/Context/NGG.php +++ b/inc/3rd-party/nextgen-gallery/classes/Context/NGG.php @@ -1,7 +1,8 @@ set( 'version', IMAGIFY_VERSION ); } } +add_action( 'admin_init', '_imagify_upgrader' ); /** * Upgrade the upgrader: @@ -160,7 +160,6 @@ function imagify_upgrader_upgrade() { Imagify_Data::get_instance()->set( 'version', $network_version ); } -add_action( 'imagify_first_network_install', '_imagify_first_install' ); /** * Keeps this function up to date at each version. * @@ -170,8 +169,8 @@ function _imagify_first_install() { // Set a transient to know when we will have to display a notice to ask the user to rate the plugin. set_site_transient( 'imagify_seen_rating_notice', true, DAY_IN_SECONDS * 3 ); } +add_action( 'imagify_first_network_install', '_imagify_first_install' ); -add_action( 'imagify_upgrade', '_imagify_new_upgrade', 10, 2 ); /** * What to do when Imagify is updated, depending on versions. * @@ -304,93 +303,13 @@ function _imagify_new_upgrade( $network_version, $site_version ) { if ( version_compare( $site_version, '1.9.11' ) < 0 ) { imagify_secure_custom_directories(); } -} - -add_action( 'upgrader_process_complete', 'imagify_maybe_reset_opcache', 20, 2 ); -/** - * Maybe reset opcache after Imagify update. - * - * @since 1.7.1.2 - * @author Grégory Viguier - * - * @param object $wp_upgrader Plugin_Upgrader instance. - * @param array $hook_extra { - * Array of bulk item update data. - * - * @type string $action Type of action. Default 'update'. - * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'. - * @type bool $bulk Whether the update process is a bulk update. Default true. - * @type array $plugins Array of the basename paths of the plugins' main files. - * } - */ -function imagify_maybe_reset_opcache( $wp_upgrader, $hook_extra ) { - static $imagify_path; - - if ( ! isset( $hook_extra['action'], $hook_extra['type'], $hook_extra['plugins'] ) ) { - return; - } - - if ( 'update' !== $hook_extra['action'] || 'plugin' !== $hook_extra['type'] || ! is_array( $hook_extra['plugins'] ) ) { - return; - } - - $plugins = array_flip( $hook_extra['plugins'] ); - - if ( ! isset( $imagify_path ) ) { - $imagify_path = plugin_basename( IMAGIFY_FILE ); - } - if ( ! isset( $plugins[ $imagify_path ] ) ) { - return; + if ( version_compare( $site_version, '2.0' ) < 0 ) { + Imagify_Options::get_instance()->set( 'optimization_level', 2 ); } - - imagify_reset_opcache(); -} - -/** - * Reset PHP opcache. - * - * @since 1.8.1 - * @since 1.9.9 Added $reset_function_cache parameter and return boolean. - * @author Grégory Viguier - * - * @param bool $reset_function_cache Set to true to bypass the cache. - * @return bool Return true if the opcode cache was reset (or reset in a previous call), or false if the opcode cache is disabled. - */ -function imagify_reset_opcache( $reset_function_cache = false ) { - static $can_reset; - - if ( $reset_function_cache || ! isset( $can_reset ) ) { - if ( ! function_exists( 'opcache_reset' ) ) { - $can_reset = false; - return false; - } - - $opcache_enabled = filter_var( ini_get( 'opcache.enable' ), FILTER_VALIDATE_BOOLEAN ); // phpcs:ignore PHPCompatibility.IniDirectives.NewIniDirectives.opcache_enableFound - - if ( ! $opcache_enabled ) { - $can_reset = false; - return false; - } - - $restrict_api = ini_get( 'opcache.restrict_api' ); // phpcs:ignore PHPCompatibility.IniDirectives.NewIniDirectives.opcache_restrict_apiFound - - if ( $restrict_api && strpos( __FILE__, $restrict_api ) !== 0 ) { - $can_reset = false; - return false; - } - - $can_reset = true; - } - - if ( ! $can_reset ) { - return false; - } - - return opcache_reset(); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.opcache_resetFound } +add_action( 'imagify_upgrade', '_imagify_new_upgrade', 10, 2 ); -add_action( 'imagify_activation', 'imagify_secure_custom_directories' ); /** * Scan imagify directories and add `index.php` files where missing. * @@ -409,3 +328,4 @@ function imagify_secure_custom_directories() { $backup_dir = get_imagify_backup_dir_path(); Imagify_Custom_Folders::add_indexes( $backup_dir ); } +add_action( 'imagify_activation', 'imagify_secure_custom_directories' ); diff --git a/inc/classes/class-imagify-admin-ajax-post.php b/inc/classes/class-imagify-admin-ajax-post.php index eb36da9dc..0f2b69a53 100755 --- a/inc/classes/class-imagify-admin-ajax-post.php +++ b/inc/classes/class-imagify-admin-ajax-post.php @@ -1,5 +1,6 @@ ajax_post_actions, $this->ajax_only_actions ); + $doing_ajax = wp_doing_ajax(); - foreach ( $actions as $action ) { - add_action( 'wp_ajax_' . $action, array( $this, $action . '_callback' ) ); + foreach ( $this->ajax_post_actions as $action ) { + $action_callback = "{$action}_callback"; + if ( $doing_ajax ) { + add_action( 'wp_ajax_' . $action, array( $this, $action_callback ) ); } + add_action( 'admin_post_' . $action, array( $this, $action_callback ) ); } - // Actions triggered on both admin ajax and admin post. - $actions = array_merge( $this->ajax_post_actions, $this->post_only_actions ); + // Actions triggered only on admin ajax. + if ( $doing_ajax ) { + foreach ( $this->ajax_only_actions as $action ) { + add_action( 'wp_ajax_' . $action, array( $this, $action . '_callback' ) ); + } + } - foreach ( $actions as $action ) { + // Actions triggered on admin post. + foreach ( $this->post_only_actions as $action ) { add_action( 'admin_post_' . $action, array( $this, $action . '_callback' ) ); } } @@ -151,7 +152,6 @@ public function init() { * Optimize one media. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -166,7 +166,6 @@ protected function optimize_media( $media_id, $context ) { * Re-optimize a media to a different optimization level. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -183,7 +182,6 @@ protected function reoptimize_media( $media_id, $context, $level ) { * This is used by the bulk optimization page. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -212,7 +210,6 @@ protected function force_optimize( $media_id, $context, $level ) { * Optimize one or some thumbnails that are not optimized yet. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -227,7 +224,6 @@ protected function optimize_missing_sizes( $media_id, $context ) { * Generate WebP images if they are missing. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -242,7 +238,6 @@ protected function generate_webp_versions( $media_id, $context ) { * Delete WebP images for media that are "already_optimize". * * @since 1.9.6 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -280,7 +275,6 @@ protected function delete_webp_versions( $media_id, $context ) { * Restore a media. * * @since 1.9 - * @access protected * @author Grégory Viguier * * @param int $media_id The media ID. @@ -300,7 +294,6 @@ protected function restore_media( $media_id, $context ) { * Get media ids for the requested imagify bulk action. * * @since 1.9 - * @access public * @author Grégory Viguier */ public function imagify_get_media_ids_callback() { @@ -355,7 +348,6 @@ public function imagify_get_media_ids_callback() { * Process a media with the requested imagify bulk action. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_bulk_optimize_callback() { @@ -397,7 +389,6 @@ public function imagify_bulk_optimize_callback() { * Get stats data for a specific folder type. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_get_folder_type_data_callback() { @@ -422,7 +413,6 @@ public function imagify_get_folder_type_data_callback() { * Set the "bulk info" popup state as "seen". * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_bulk_info_seen_callback() { @@ -447,7 +437,6 @@ public function imagify_bulk_info_seen_callback() { * Get generic stats to display in the bulk page. * * @since 1.7.1 - * @access public * @author Grégory Viguier */ public function imagify_bulk_get_stats_callback() { @@ -480,7 +469,6 @@ public function imagify_bulk_get_stats_callback() { * Optimize all thumbnails of a specific image with the manual method. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_manual_optimize_callback() { @@ -515,7 +503,6 @@ public function imagify_manual_optimize_callback() { * Optimize all thumbnails of a specific image with a different optimization level. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_manual_reoptimize_callback() { @@ -550,7 +537,6 @@ public function imagify_manual_reoptimize_callback() { * Optimize one or some thumbnails that are not optimized yet. * * @since 1.6.11 - * @access public * @author Grégory Viguier */ public function imagify_optimize_missing_sizes_callback() { @@ -585,7 +571,6 @@ public function imagify_optimize_missing_sizes_callback() { * Generate WebP images if they are missing. * * @since 1.9 - * @access public * @author Grégory Viguier */ public function imagify_generate_webp_versions_callback() { @@ -620,7 +605,6 @@ public function imagify_generate_webp_versions_callback() { * Generate WebP images if they are missing. * * @since 1.9.6 - * @access public * @author Grégory Viguier */ public function imagify_delete_webp_versions_callback() { @@ -655,7 +639,6 @@ public function imagify_delete_webp_versions_callback() { * Process a restoration to the original attachment. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_restore_callback() { @@ -703,7 +686,6 @@ public function imagify_restore_callback() { * Optimize a file. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_optimize_file_callback() { @@ -735,7 +717,6 @@ public function imagify_optimize_file_callback() { * Re-optimize a file. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_reoptimize_file_callback() { @@ -769,7 +750,6 @@ public function imagify_reoptimize_file_callback() { * Restore a file. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_restore_file_callback() { @@ -802,7 +782,6 @@ public function imagify_restore_file_callback() { * Check if a file has been modified, and update the database accordingly. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_refresh_file_modified_callback() { @@ -842,7 +821,6 @@ public function imagify_refresh_file_modified_callback() { * Look for new files in custom folders. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_scan_custom_folders_callback() { @@ -897,7 +875,6 @@ public function imagify_scan_custom_folders_callback() { * This is used to display an error message in the plugin's settings page. * * @since 1.6.11 - * @access public * @author Grégory Viguier */ public function imagify_check_backup_dir_is_writable_callback() { @@ -916,7 +893,6 @@ public function imagify_check_backup_dir_is_writable_callback() { * Get files and folders that are direct children of a given folder. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_get_files_tree_callback() { @@ -1010,7 +986,6 @@ public function imagify_get_files_tree_callback() { * Create a new Imagify account. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_signup_callback() { @@ -1049,7 +1024,6 @@ public function imagify_signup_callback() { * Check the API key validity. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_check_api_key_validity_callback() { @@ -1079,7 +1053,6 @@ public function imagify_check_api_key_validity_callback() { * Get admin bar profile output. * * @since 1.6.11 - * @access public * @author Jonathan Buttigieg */ public function imagify_get_admin_bar_profile_callback() { @@ -1158,7 +1131,6 @@ public function imagify_get_admin_bar_profile_callback() { * Get pricings from API for Onetime and Plans at the same time. * * @since 1.6.11 - * @access public * @author Geoffrey Crofte */ public function imagify_get_prices_callback() { @@ -1179,7 +1151,6 @@ public function imagify_get_prices_callback() { } wp_send_json_success( array( - 'onetimes' => $prices_all->Packs, 'monthlies' => $prices_all->Plans, ) ); } @@ -1188,7 +1159,6 @@ public function imagify_get_prices_callback() { * Check Coupon code on modal popin. * * @since 1.6.11 - * @access public * @author Geoffrey Crofte */ public function imagify_check_coupon_callback() { @@ -1235,7 +1205,6 @@ public function imagify_get_discount_callback() { * Get estimated sizes from the WordPress library. * * @since 1.6.11 - * @access public * @author Geoffrey Crofte */ public function imagify_get_images_counts_callback() { @@ -1269,7 +1238,6 @@ public function imagify_get_images_counts_callback() { * Estimate sizes and update the options values for them. * * @since 1.6.11 - * @access public * @author Remy Perona */ public function imagify_update_estimate_sizes_callback() { @@ -1294,7 +1262,6 @@ public function imagify_update_estimate_sizes_callback() { * Get the Imagify User data. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_get_user_data_callback() { @@ -1328,7 +1295,6 @@ public function imagify_get_user_data_callback() { * Delete the Imagify User data cache. * * @since 1.9.5 - * @access public * @author Grégory Viguier */ public function imagify_delete_user_data_cache_callback() { @@ -1353,7 +1319,6 @@ public function imagify_delete_user_data_cache_callback() { * When XML-RPC is used, a current user is set, but no cookies are set, so they cannot be sent with the request. Instead we stored the user ID in a transient. * * @since 1.6.11 - * @access public * @author Grégory Viguier * @see imagify_do_async_job() */ @@ -1404,7 +1369,6 @@ public function nopriv_imagify_rpc_callback() { * Store the "closed" status of the ads. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function imagify_dismiss_ad_callback() { @@ -1451,7 +1415,6 @@ public function imagify_dismiss_ad_callback() { * * @since 1.7 * @since 1.9 Added $method and $parameter parameters. - * @access public * @author Grégory Viguier * * @param string $method The method used: 'GET' (default), or 'POST'. @@ -1473,7 +1436,6 @@ public function get_optimization_level( $method = 'GET', $parameter = 'optimizat * Get the submitted context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $method The method used: 'GET' (default), or 'POST'. @@ -1491,7 +1453,6 @@ public function get_context( $method = 'GET', $parameter = 'context' ) { * Get the submitted media ID. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $method The method used: 'GET' (default), or 'POST'. @@ -1513,7 +1474,6 @@ public function get_media_id( $method = 'GET', $parameter = 'attachment_id' ) { * Get the submitted folder_type. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $method The method used: 'GET' (default), or 'POST'. @@ -1530,7 +1490,6 @@ public function get_folder_type( $method = 'GET', $parameter = 'folder_type' ) { * Get the submitted imagify action. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $method The method used: 'GET' (default), or 'POST'. @@ -1548,7 +1507,6 @@ public function get_imagify_action( $method = 'GET', $parameter = 'imagify_actio * Get the Bulk class name depending on a context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $context The context name. Default values are 'wp' and 'custom-folders'. @@ -1586,7 +1544,6 @@ public function get_bulk_class_name( $context ) { * Get the Bulk instance depending on a context. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param string $context The context name. Default values are 'wp' and 'custom-folders'. @@ -1601,7 +1558,6 @@ public function get_bulk_instance( $context ) { * Check if the user has a valid account and has quota. Die on failure. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function check_can_optimize() { @@ -1626,7 +1582,6 @@ public function check_can_optimize() { * Get a media columns for the "Other Media" page. * * @since 1.9 - * @access public * @author Grégory Viguier * * @param object $process A \Imagify\Optimization\Process\CustomFolders object. @@ -1652,7 +1607,6 @@ public function get_media_columns( $process, $list_table ) { * @since 1.7 * @since 1.9 Removed parameter $result. * @since 1.9 Added $folder in the returned JSON. - * @access protected * @author Grégory Viguier * * @param object $process A \Imagify\Optimization\Process\CustomFolders object. diff --git a/inc/classes/class-imagify-files-list-table.php b/inc/classes/class-imagify-files-list-table.php index d7fd213fb..a959522a2 100755 --- a/inc/classes/class-imagify-files-list-table.php +++ b/inc/classes/class-imagify-files-list-table.php @@ -33,7 +33,6 @@ class Imagify_Files_List_Table extends WP_List_Table { * * @var array * @since 1.7 - * @access protected * @author Grégory Viguier */ protected $folders = array(); @@ -43,7 +42,6 @@ class Imagify_Files_List_Table extends WP_List_Table { * * @var object Imagify_Filesystem * @since 1.7.1 - * @access protected * @author Grégory Viguier */ protected $filesystem; @@ -53,7 +51,6 @@ class Imagify_Files_List_Table extends WP_List_Table { * * @var object Imagify_Views * @since 1.9 - * @access protected * @author Grégory Viguier */ protected $views; @@ -62,7 +59,6 @@ class Imagify_Files_List_Table extends WP_List_Table { * Constructor. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param array $args An associative array of arguments. @@ -85,7 +81,6 @@ public function __construct( $args = array() ) { * Prepares the list of items for displaying. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function prepare_items() { @@ -233,7 +228,6 @@ public function prepare_items() { * Message to be displayed when there are no items. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function no_items() { @@ -302,7 +296,6 @@ public function no_items() { * Display views. * * @since 1.7 - * @access public * @author Grégory Viguier */ public function views() { @@ -420,7 +413,6 @@ public function views() { * Get an associative array ( option_name => option_title ) with the list of bulk actions available on this table. * * @since 1.7 - * @access public * @author Grégory Viguier * * @return array @@ -436,7 +428,6 @@ public function get_bulk_actions() { * 'internal-name' => 'Title' * * @since 1.7 - * @access public * @author Grégory Viguier * * @return array @@ -462,7 +453,6 @@ public function get_columns() { * The second format will make the initial sorting order be descending. * * @since 1.7 - * @access public * @author Grégory Viguier * * @return array @@ -480,7 +470,6 @@ public function get_sortable_columns() { * Get a column contents. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param string $column The column "name": "cb", "title", "optimization_level", etc. @@ -501,7 +490,6 @@ public function get_column( $column, $item ) { * Handles the checkbox column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -518,7 +506,6 @@ public function column_cb( $item ) { * Handles the title column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -569,7 +556,6 @@ public function column_title( $item ) { * Handles the parent folder column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -605,7 +591,6 @@ public function column_folder( $item ) { * Handles the optimization data column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -658,7 +643,6 @@ public function column_optimization( $item ) { * Handles the status column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -694,7 +678,6 @@ public function column_status( $item ) { * Handles the optimization level column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -711,7 +694,6 @@ public function column_optimization_level( $item ) { * Handles the actions column output. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -749,7 +731,6 @@ public function column_actions( $item ) { * Prints a button to optimize the file. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -778,7 +759,6 @@ protected function optimize_button( $item ) { * Prints a button to retry to optimize the file. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -810,7 +790,6 @@ protected function retry_button( $item ) { * Prints buttons to re-optimize the file to other levels. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -836,20 +815,18 @@ protected function reoptimize_buttons( $item ) { $data = []; $url_args = [ 'attachment_id' => $media->get_id() ]; - foreach ( [ 2, 1, 0 ] as $level ) { - /** - * Display a link if: - * - the level is lower than the one used to optimize the media, - * - or, the level is higher and the media is not already optimized. - */ - if ( $media_level < $level || ( $media_level > $level && ! $is_already_optimized ) ) { - $url_args['optimization_level'] = $level; - $data['optimization_level'] = $level; - $data['url'] = get_imagify_admin_url( 'reoptimize-file', $url_args ); - - echo $this->views->get_template( 'button/re-optimize', $data ); - echo '
'; - } + if ( $media_level < 1 ) { + $url_args['optimization_level'] = 2; + $data['optimization_level'] = 2; + $data['url'] = get_imagify_admin_url( 'reoptimize-file', $url_args ); + + echo $this->views->get_template( 'button/re-optimize', $data ); + } elseif ( $media_level > 0 ) { + $url_args['optimization_level'] = 0; + $data['optimization_level'] = 0; + $data['url'] = get_imagify_admin_url( 'reoptimize-file', $url_args ); + + echo $this->views->get_template( 'button/re-optimize', $data ); } } @@ -857,7 +834,6 @@ protected function reoptimize_buttons( $item ) { * Prints a button to generate WebP versions if they are missing. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -874,7 +850,6 @@ protected function generate_webp_versions_button( $item ) { * Prints a button to delete WebP versions when the status is "already_optimized". * * @since 1.9.6 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -891,7 +866,6 @@ protected function delete_webp_versions_button( $item ) { * Prints a button to restore the file. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -915,7 +889,6 @@ protected function restore_button( $item ) { * Prints a button to check if the file has been modified or not. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -933,7 +906,6 @@ protected function refresh_status_button( $item ) { * Prints a button for the comparison tool (before / after optimization). * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -981,7 +953,6 @@ protected function comparison_tool_button( $item ) { * It may happen if the $item doesn't come from the prepare() method. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @param object $item The current item. It must contain at least a $process property. @@ -1018,7 +989,6 @@ protected function maybe_set_item_folder( $item ) { * Get the name of the default primary column. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @return string Name of the default primary column, in this case, 'title'. @@ -1031,7 +1001,6 @@ protected function get_default_primary_column_name() { * Get a list of CSS classes for the WP_List_Table table tag. * * @since 1.7 - * @access protected * @author Grégory Viguier * * @return array List of CSS classes for the table tag. @@ -1044,7 +1013,6 @@ protected function get_table_classes() { * Allow to save the screen options when submitted by the user. * * @since 1.7 - * @access public * @author Grégory Viguier * * @param bool|int $status Screen option value. Default false to skip. @@ -1064,7 +1032,6 @@ public static function save_screen_options( $status, $option, $value ) { * Get the requested folder filter. * * @since 1.7 - * @access public * @author Grégory Viguier * * @return string @@ -1084,7 +1051,6 @@ public static function get_folder_filter() { * Get the requested status filter. * * @since 1.7 - * @access public * @author Grégory Viguier * * @return string diff --git a/inc/classes/class-imagify-notices.php b/inc/classes/class-imagify-notices.php index 4cee6f3ea..2a9fb4505 100755 --- a/inc/classes/class-imagify-notices.php +++ b/inc/classes/class-imagify-notices.php @@ -608,7 +608,9 @@ public function display_wp_rocket() { return $display; } - if ( defined( 'WP_ROCKET_VERSION' ) || self::notice_is_dismissed( 'wp-rocket' ) ) { + $plugins = get_plugins(); + + if ( isset( $plugins['wp-rocket/wp-rocket.php'] ) || self::notice_is_dismissed( 'wp-rocket' ) ) { return $display; } diff --git a/inc/classes/class-imagify-options.php b/inc/classes/class-imagify-options.php index 9a903a299..f0fe1f7ca 100644 --- a/inc/classes/class-imagify-options.php +++ b/inc/classes/class-imagify-options.php @@ -1,5 +1,4 @@ '', - 'optimization_level' => 0, + 'optimization_level' => 2, 'auto_optimize' => 0, 'backup' => 0, 'resize_larger' => 0, @@ -45,7 +42,6 @@ class Imagify_Options extends Imagify_Abstract_Options { 'display_webp' => 0, 'display_webp_method' => 'picture', 'cdn_url' => '', - 'exif' => 0, 'disallowed-sizes' => array(), 'admin_bar_menu' => 0, 'partner_links' => 0, @@ -57,10 +53,9 @@ class Imagify_Options extends Imagify_Abstract_Options { * * @var array * @since 1.7 - * @access protected */ protected $reset_values = array( - 'optimization_level' => 1, + 'optimization_level' => 2, 'auto_optimize' => 1, 'backup' => 1, 'convert_to_webp' => 1, @@ -73,7 +68,6 @@ class Imagify_Options extends Imagify_Abstract_Options { * * @var object * @since 1.7 - * @access protected */ protected static $_instance; @@ -83,7 +77,6 @@ class Imagify_Options extends Imagify_Abstract_Options { * * @since 1.7 * @author Grégory Viguier - * @access protected */ protected function __construct() { if ( defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) { @@ -119,7 +112,6 @@ protected function __construct() { * * @since 1.7 * @author Grégory Viguier - * @access public * * @return object Main instance. */ @@ -141,7 +133,6 @@ public static function get_instance() { * * @since 1.7 * @author Grégory Viguier - * @access public * * @param string $key The option key. * @param mixed $value The value. @@ -171,7 +162,6 @@ public function sanitize_and_validate_value( $key, $value, $default ) { case 'resize_larger': case 'convert_to_webp': case 'display_webp': - case 'exif': case 'admin_bar_menu': case 'partner_links': return 1; @@ -233,7 +223,6 @@ public function sanitize_and_validate_value( $key, $value, $default ) { * * @since 1.7 * @author Grégory Viguier - * @access public * * @param string $values The option value. * @return array diff --git a/inc/classes/class-imagify.php b/inc/classes/class-imagify.php index 80905142a..317b7c299 100644 --- a/inc/classes/class-imagify.php +++ b/inc/classes/class-imagify.php @@ -1,11 +1,11 @@ headers = $this->all_headers; - - return $this->http_call( 'pricing/pack/' ); - } - - /** - * Get all prices (packs & plans included). - * - * @access public * @since 1.6.5 * * @return object @@ -341,9 +315,8 @@ public function get_all_prices() { } /** - * Get all prices (packs & plans included). + * Get coupon code data. * - * @access public * @since 1.6.5 * * @param string $coupon A coupon code. @@ -358,7 +331,6 @@ public function check_coupon_code( $coupon ) { /** * Get information about current discount. * - * @access public * @since 1.6.5 * * @return object @@ -372,7 +344,6 @@ public function check_discount() { /** * Make an HTTP call using curl. * - * @access private * @since 1.6.5 * @since 1.6.7 Use `wp_remote_request()` when possible (when we don't need to send an image). * @@ -451,7 +422,6 @@ private function http_call( $url, $args = [] ) { /** * Make an HTTP call using curl. * - * @access private * @since 1.6.7 * @throws Exception When curl_init() fails. * @author Grégory Viguier @@ -504,7 +474,7 @@ private function curl_http_call( $url, $args = [] ) { curl_setopt( $ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS ); } - $user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ) ); + $user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ), $url ); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); @@ -580,7 +550,6 @@ private function curl_http_call( $url, $args = [] ) { /** * Handle the request response and maybe trigger an error. * - * @access private * @since 1.6.7 * @author Grégory Viguier * @@ -629,7 +598,6 @@ private function handle_response( $response, $http_code, $error = '' ) { * Generate a random key. * Similar to wp_generate_password() but without filter. * - * @access private * @since 1.8.4 * @see wp_generate_password() * @author Grégory Viguier @@ -651,7 +619,6 @@ private function generate_secure_key() { /** * Filter the arguments used in an HTTP request, to make sure our API key has not been overwritten by some other plugin. * - * @access public * @since 1.8.4 * @author Grégory Viguier * diff --git a/inc/deprecated/deprecated.php b/inc/deprecated/deprecated.php index 8f427b19f..aef5cadac 100644 --- a/inc/deprecated/deprecated.php +++ b/inc/deprecated/deprecated.php @@ -1663,3 +1663,92 @@ function imagify_get_modified_optimization_statusses( $data ) { } endif; + +/** + * Maybe reset opcache after Imagify update. + * + * @since 1.7.1.2 + * @since 2.0 + * @author Grégory Viguier + * + * @param object $wp_upgrader Plugin_Upgrader instance. + * @param array $hook_extra { + * Array of bulk item update data. + * + * @type string $action Type of action. Default 'update'. + * @type string $type Type of update process. Accepts 'plugin', 'theme', 'translation', or 'core'. + * @type bool $bulk Whether the update process is a bulk update. Default true. + * @type array $plugins Array of the basename paths of the plugins' main files. + * } + */ +function imagify_maybe_reset_opcache( $wp_upgrader, $hook_extra ) { + _deprecated_function( __FUNCTION__ . '()', '2.0' ); + + static $imagify_path; + + if ( ! isset( $hook_extra['action'], $hook_extra['type'], $hook_extra['plugins'] ) ) { + return; + } + + if ( 'update' !== $hook_extra['action'] || 'plugin' !== $hook_extra['type'] || ! is_array( $hook_extra['plugins'] ) ) { + return; + } + + $plugins = array_flip( $hook_extra['plugins'] ); + + if ( ! isset( $imagify_path ) ) { + $imagify_path = plugin_basename( IMAGIFY_FILE ); + } + + if ( ! isset( $plugins[ $imagify_path ] ) ) { + return; + } + + imagify_reset_opcache(); +} + +/** + * Reset PHP opcache. + * + * @since 1.8.1 + * @since 1.9.9 Added $reset_function_cache parameter and return boolean. + * @since 2.0 deprecated + * @author Grégory Viguier + * + * @param bool $reset_function_cache Set to true to bypass the cache. + * @return bool Return true if the opcode cache was reset (or reset in a previous call), or false if the opcode cache is disabled. + */ +function imagify_reset_opcache( $reset_function_cache = false ) { + _deprecated_function( __FUNCTION__ . '()', '2.0' ); + + static $can_reset; + + if ( $reset_function_cache || ! isset( $can_reset ) ) { + if ( ! function_exists( 'opcache_reset' ) ) { + $can_reset = false; + return false; + } + + $opcache_enabled = filter_var( ini_get( 'opcache.enable' ), FILTER_VALIDATE_BOOLEAN ); // phpcs:ignore PHPCompatibility.IniDirectives.NewIniDirectives.opcache_enableFound + + if ( ! $opcache_enabled ) { + $can_reset = false; + return false; + } + + $restrict_api = ini_get( 'opcache.restrict_api' ); // phpcs:ignore PHPCompatibility.IniDirectives.NewIniDirectives.opcache_restrict_apiFound + + if ( $restrict_api && strpos( __FILE__, $restrict_api ) !== 0 ) { + $can_reset = false; + return false; + } + + $can_reset = true; + } + + if ( ! $can_reset ) { + return false; + } + + return opcache_reset(); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.opcache_resetFound +} diff --git a/inc/functions/admin-ui.php b/inc/functions/admin-ui.php index 8476b768e..ab548d55a 100644 --- a/inc/functions/admin-ui.php +++ b/inc/functions/admin-ui.php @@ -232,20 +232,18 @@ function get_imagify_attachment_reoptimize_link( $process ) { ]; } - foreach ( [ 2, 1, 0 ] as $level ) { - /** - * Display a link if: - * - the level is lower than the one used to optimize the media, - * - or, the level is higher and the media is not already optimized. - */ - if ( $media_level < $level || ( $media_level > $level && ! $is_already_optimized ) ) { - $url_args['optimization_level'] = $level; - $data['optimization_level'] = $level; - $data['url'] = get_imagify_admin_url( 'manual-reoptimize', $url_args ); - - $output .= $views->get_template( 'button/re-optimize', $data ); - $output .= '
'; - } + if ( $media_level < 1 ) { + $url_args['optimization_level'] = 2; + $data['optimization_level'] = 2; + $data['url'] = get_imagify_admin_url( 'manual-reoptimize', $url_args ); + + $output .= $views->get_template( 'button/re-optimize', $data ); + } elseif ( $media_level > 0 ) { + $url_args['optimization_level'] = 0; + $data['optimization_level'] = 0; + $data['url'] = get_imagify_admin_url( 'manual-reoptimize', $url_args ); + + $output .= $views->get_template( 'button/re-optimize', $data ); } return $output; diff --git a/inc/functions/api.php b/inc/functions/api.php index 30e852c96..1bb203f15 100755 --- a/inc/functions/api.php +++ b/inc/functions/api.php @@ -96,19 +96,7 @@ function get_imagify_plans_prices() { } /** - * Get Imagify Plans Prices. - * - * @since 1.5 - * @author Geoffrey Crofte - * - * @return object - */ -function get_imagify_packs_prices() { - return imagify()->get_packs_prices(); -} - -/** - * Get Imagify All Prices (plan & packs). + * Get Imagify All Prices (plans). * * @since 1.5.4 * @author Geoffrey Crofte diff --git a/inc/functions/common.php b/inc/functions/common.php index 680c27d65..dbc24f470 100755 --- a/inc/functions/common.php +++ b/inc/functions/common.php @@ -246,11 +246,6 @@ function imagify_get_external_url( $target, $query_args = array() ) { $url = 'https://www.facebook.com/sharer/sharer.php?u=' . $url; break; - case 'exif': - /* translators: URL to a Wikipedia page explaining what EXIF means. */ - $url = __( 'https://en.wikipedia.org/wiki/Exchangeable_image_file_format', 'imagify' ); - break; - case 'contact': $lang = imagify_get_current_lang_in( 'fr' ); $paths = array( @@ -370,10 +365,8 @@ function imagify_get_optimization_level_label( $level, $format = '%s' ) { switch ( $level ) { case 2: - $icon .= ''; - break; case 1: - $icon .= ''; + $icon .= ''; break; case 0: $icon .= ''; @@ -386,11 +379,10 @@ function imagify_get_optimization_level_label( $level, $format = '%s' ) { switch ( $level ) { case 2: - return sprintf( $format, __( 'Ultra', 'imagify' ) ); case 1: - return sprintf( $format, __( 'Aggressive', 'imagify' ) ); + return sprintf( $format, __( 'Smart', 'imagify' ) ); case 0: - return sprintf( $format, __( 'Normal', 'imagify' ) ); + return sprintf( $format, __( 'Lossless', 'imagify' ) ); } return ''; diff --git a/inc/functions/i18n.php b/inc/functions/i18n.php index e694c9eb7..79f9ab623 100755 --- a/inc/functions/i18n.php +++ b/inc/functions/i18n.php @@ -40,7 +40,7 @@ function get_imagify_localize_script_translations( $context ) { 'saveApiKeyTitle' => __( 'Connect to Imagify!', 'imagify' ), 'saveApiKeyText' => __( 'Paste your API key below:', 'imagify' ), 'saveApiKeyConfirmButtonText' => __( 'Connect me', 'imagify' ), - 'ApiKeyErrorEmpty' => __( 'You need to specify your api key!', 'imagify' ), + 'ApiKeyErrorEmpty' => __( 'You need to specify your API key!', 'imagify' ), 'ApiKeyCheckSuccessTitle' => __( 'Congratulations!', 'imagify' ), 'ApiKeyCheckSuccessText' => __( 'Your API key is valid. You can now configure the Imagify settings to optimize your images.', 'imagify' ), ], diff --git a/phpcs.xml b/phpcs.xml index aee22fdfc..3cf3ce42c 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -28,8 +28,8 @@ - - + + @@ -48,6 +48,7 @@ + diff --git a/readme.txt b/readme.txt index 12bc988c6..e2a0b6d2e 100755 --- a/readme.txt +++ b/readme.txt @@ -2,7 +2,7 @@ Contributors: wp_rocket Tags: optimize images, convert webp, webp converter, image optimization, compress images, image compressor, resize images, reduce image size, performance, image optimizer, core web vitals, best image optimization plugin Tested up to: 6.0 -Stable tag: 1.10 +Stable tag: 2.0 Compress images & convert WebP with the best WordPress image optimization plugin. Optimize images in 1-click & resize images with our image optimizer! @@ -12,7 +12,7 @@ Compress images & convert WebP with the best WordPress image optimization plugin [Imagify](https://imagify.io/) is the most advanced image optimization plugin to help you resize and compress images. You can now use its power directly in WordPress to optimize images and reduce the weight of the photos you want to add to your site – all in just one click and without sacrificing their quality. -Imagify is the best WordPress image optimizer. The plugin lets you optimize images in one go with its bulk optimization option. You can resize your images on the fly and, with 3 compression levels to choose from, your images are automatically optimized in the selected compression level. If needed, you can always restore your images to their original versions. +Imagify is the best WordPress image optimizer. The plugin lets you optimize images in one go with its bulk optimization option. You can resize your images on the fly – they will be automatically optimized at the best compression level. If needed, you can always restore your images to their original versions. On top of optimizing images, you’ll choose the best WebP plugin for WordPress. Imagify also converts your images to WebP, a next-gen format for lighter images that will speed up your WordPress site, improve user experience, and even SEO. Convert WebP will make a difference in images optimization, you’ll see that from yourself. @@ -24,7 +24,7 @@ Imagify is a great image compressor and the ultimate solution to optimize images Many of your high-quality images may be in sizes that are much too large. To reduce image size and compress large images, Imagify has a setting that allows you to choose a maximum width for all of your images, and if you upload images that are larger than that size, it will resize large images for you during optimization. Imagify will resize images proportionally without cropping them. -With such a great image optimizer like Imagify, you can choose between two types of image compression: [lossy compression and lossless compression](https://imagify.io/blog/lossless-vs-lossy-image-compression/). The Normal image compression level uses lossless compression, meaning there should be no difference in image quality after image optimization. The Aggressive and Ultra levels both use lossy compression, meaning you could notice some slight differences in image quality, but you will reduce image size even more! +With such a great image optimizer like Imagify, you’ll get your images automatically optimized at the best compression level and quality – thanks to the Smart Compression Mode. When using our image compression tool, Imagify, you will enjoy smaller file sizes and faster loading times. But the best part is that you will optimize images and reduce their weight without losing quality: why should you have to choose between beauty and speed? If you want to compress images, it’s now easier than ever with Imagify! @@ -50,7 +50,7 @@ Even Google tells you to take care of your images! If you have ever run a perfor Here’s what our users have to say about us after optimizing their images with Imagify: ->"Images are other media are the largest parts on your web pages (most likely). Therefore don't forget to optimise images for the web before adding to your site. For WordPress there are many optimisation plugins available. My favourite is Imagify" — [Mark Wilkinson](https://twitter.com/wpmark/status/1479128422395830273) +>"Images and other media are the largest parts on your web pages (most likely). Therefore don't forget to optimize images for the web before adding to your site. For WordPress there are many optimisation plugins available. My favourite is Imagify" — [Mark Wilkinson](https://twitter.com/wpmark/status/1479128422395830273) > >”To give your images a slimming treatment, without altering them aesthetically, there is a great plugin on WordPress: Imagify. Simple, efficient and functional, it’s really worth a look.”— [WP Marmite](https://twitter.com/wpmarmite_en/status/1383072818649255937) @@ -103,7 +103,7 @@ Our mission is to improve the web, we are making it faster with [WP Rocket](http = Related Plugins = * [WP Rocket](https://wp-rocket.me/): Best caching plugin to speed-up your WordPress website. -* [Lazy Load](https://wordpress.org/plugins/rocket-lazy-load/): Best Lazy Load script to reduce the number of HTTP requests and improves the website's loading time. +* [Lazy Load](https://wordpress.org/plugins/rocket-lazy-load/): Best Lazy Load script to reduce the number of HTTP requests and improve the website's loading time. License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -162,15 +162,7 @@ When you optimize JPG, PNG, and GIF files, Imagify will also create WebP version = How should I know which image compression level is best for me? = -There are three image compression levels available - Normal, Aggressive and Ultra. - -Normal compression is a "lossless" image optimization. This means there is no loss of image quality after compression. - -Aggressive and Ultra compression are more powerful, so the picture quality will be somewhat reduced. The weight of the compressed image will be much less. - -We recommend Aggressive as the best balanced level that reduces the size of the image but does not affect the quality. - -It would be best, however, to test the 3 levels of compression on a smaller amount of images and see how it affects the quality of your image. Once you see which compression level suits your needs, you can easily run the others via Bulk optimization or Media Library page. +Don’t worry! Imagify comes with the Smart Compression Mode. It means that your images will be automatically optimized for the best possible compression ratio and quality. There’s nothing else to do – just enjoy your lighter and faster images. =How does the optimization process work?= @@ -178,7 +170,7 @@ The image optimization process is performed on our servers. Once done, Imagify r =How long are images stored by Imagify?= -Once your images have been optimized via the WP plugin, compressed images stay on your end forever (even if you delete the Imagify account). +Once your images have been optimized via the WP plugin, the compressed images stay on your end forever (even if you delete the Imagify account). During the optimization process, compressed images sent via the API or WordPress plugin are stored for one hour on our server (they are already sent back to your site and stay there safely). @@ -198,7 +190,7 @@ Do not waste your time resizing and optimizing your images in Photoshop. Imagify =Is the EXIF data of images removed?= -By default EXIF data is removed. It is possible to keep it with the WordPress plugin by enabling the option in the Imagify Settings page. +EXIF data is not removed. =I used Kraken, Optimus, EWWW or WP Smush, will Imagify further optimize my images?= @@ -210,7 +202,7 @@ No. Imagify automatically replaces the original images with an optimized image. = Is it possible to re-optimize images with a different level? = -Yes. By activating the backup option in the plugin, you can re-optimize each compressed image with a different image compression level. +Yes. By activating the backup option in the plugin, you can re-optimize each image to lossless compression with a single click. = What happens when the plugin is disabled? = @@ -255,6 +247,16 @@ No. However, you get 20MB of quota per month for free to optimize your images (a 4. Other Media Page == Changelog == += 2.0 = +- Enhancement: Add compatibility with our new smart compression system (#663) +- Enhancement: Optimize initialization of some of the code (#473) +- Enhancement: Add new filter `imagify_process_webp_content` (#653) +- Bugfix: Prevent PHP warning when displaying the pricing modal (#666) +- 3rd party compatibility: Pass missing parameter to the `http_headers_useragent` filter (#612) +- 3rd party compatibility: Prevent conflict with WP Cloudflare super page cache (#609) +- Bugfix: Fix various UI issues (#604, #586, #592, #594) +- i18n: Fix typos & improve strings (#621) + = 1.10 - 2021/07/15 = * The plugin minimum compatible versions are now PHP 7.0 and WordPress 5.3 * Enhancement: Correctly display WordPress cover blocks when WebP and picture tag replacement is enabled (#546) diff --git a/views/button/re-optimize.php b/views/button/re-optimize.php index 3e80ba78c..3d9d1adc4 100755 --- a/views/button/re-optimize.php +++ b/views/button/re-optimize.php @@ -18,9 +18,9 @@ } $level_labels = [ - __( 'Normal', 'imagify' ), - __( 'Aggressive', 'imagify' ), - __( 'Ultra', 'imagify' ), + 0 => __( 'Lossless', 'imagify' ), + 1 => __( 'Smart', 'imagify' ), + 2 => __( 'Smart', 'imagify' ), ]; $level_label = $level_labels[ $data['optimization_level'] ]; @@ -33,7 +33,7 @@ ' . esc_html( $level_label ) . '' ); ?> diff --git a/views/modal-payment.php b/views/modal-payment.php index e1ea1b65b..9e21fbfe7 100755 --- a/views/modal-payment.php +++ b/views/modal-payment.php @@ -281,13 +281,13 @@ - +

additionnal Gb', 'imagify' ), + __( '%s per
additional Gb', 'imagify' ), '' ); ?> @@ -342,7 +342,7 @@ $ - +

diff --git a/views/page-settings.php b/views/page-settings.php index fa06bff92..8ef7d489c 100755 --- a/views/page-settings.php +++ b/views/page-settings.php @@ -8,11 +8,12 @@ $lang = imagify_get_current_lang_in( array( 'de', 'es', 'fr', 'it' ) ); /* Ads notice */ +$plugins = get_plugins(); $notice = 'wp-rocket'; $user_id = get_current_user_id(); $notices = get_user_meta( $user_id, '_imagify_ignore_ads', true ); $notices = $notices && is_array( $notices ) ? array_flip( $notices ) : array(); -$wrapper_class = isset( $notices[ $notice ] ) || defined( 'WP_ROCKET_VERSION' ) ? 'imagify-have-rocket' : 'imagify-dont-have-rocket'; +$wrapper_class = isset( $notices[ $notice ] ) || isset( $plugins['wp-rocket/wp-rocket.php'] ) ? 'imagify-have-rocket' : 'imagify-dont-have-rocket'; ?>
@@ -40,45 +41,6 @@

-

- - - - - - -

- -
-

- get( 'optimization_level' ), 0 ); ?> aria-describedby="imagify-optimization-level-label"> - - - get( 'optimization_level' ), 1 ); ?> aria-describedby="imagify-optimization-level-label"> - - - get( 'optimization_level' ), 2 ); ?> aria-describedby="imagify-optimization-level-label"> - -

- -

- ', - '' - ); - ?> -

-
-

field_checkbox( array( @@ -107,20 +69,6 @@ ?>

- -

- ' . __( 'Learn more', 'imagify' ) . '

'; - $info .= __( 'If you are a photographer, you may be interested in this option if you are displaying info like the model of your camera on your pages. Also, keeping EXIF data can fix some colorimetric problems.', 'imagify' ); - - $settings->field_checkbox( array( - 'option_name' => 'exif', - 'label' => __( 'Keep all EXIF data from your images', 'imagify' ), - 'info' => $info, - ) ); - ?> -

diff --git a/views/part-bulk-optimization-table-row-folder-type.php b/views/part-bulk-optimization-table-row-folder-type.php index c077bd2b6..79553f35c 100755 --- a/views/part-bulk-optimization-table-row-folder-type.php +++ b/views/part-bulk-optimization-table-row-folder-type.php @@ -1,7 +1,5 @@ get( 'optimization_level' ); ?> @@ -27,20 +25,6 @@ - - print_template( 'input/selector', [ - 'current_label' => __( 'Current level:', 'imagify' ), - 'name' => 'level[' . $data['group_id'] . ']', - 'value' => $default_level, - 'values' => [ - 0 => imagify_get_optimization_level_label( 0, '%ICON% %s' ), - 1 => imagify_get_optimization_level_label( 1, '%ICON% %s' ), - 2 => imagify_get_optimization_level_label( 2, '%ICON% %s' ), - ], - ] ); - ?> - diff --git a/views/part-bulk-optimization-table.php b/views/part-bulk-optimization-table.php index bfd165503..0b74bffcd 100755 --- a/views/part-bulk-optimization-table.php +++ b/views/part-bulk-optimization-table.php @@ -45,7 +45,6 @@ - diff --git a/views/part-rocket-ad.php b/views/part-rocket-ad.php index c732f1c02..40fe16e34 100755 --- a/views/part-rocket-ad.php +++ b/views/part-rocket-ad.php @@ -1,7 +1,9 @@ ', '' ); + /* translators: 1 is a "bold" tag opening, 2 is the "bold" tag closing. Please use a non-breaking space for WP Rocket. */ + printf( __( 'WP Rocket is a %1$sspeed optimization plugin for WordPress%2$s helping you to implement a variety of speed-boosting features to your WordPress site.', 'imagify' ), '', '' ); ?>