Version Description
- Improvement: Code quality of the whole plugin has been improved to fit more WordPress coding standards.
- Improvement: Lots of internationalisation improvements. Now the plugin's internationalisation fully rely on the repository system.
- Bug Fix: Fixed an error with php 7.1:
Uncaught Error: [] operator not supported for strings in /wp-content/plugins/imagify/inc/functions/admin.php:134
.
Download this release
Release Info
Developer | wp_media |
Plugin | Imagify Image Optimizer |
Version | 1.6.5 |
Comparing to | |
See all releases |
Code changes from version 1.6.4 to 1.6.5
- assets/css/admin-bar.min.css +1 -1
- assets/css/admin.min.css +1 -1
- assets/css/sweetalert2.min.css +1 -1
- assets/css/twentytwenty.min.css +1 -1
- assets/images/big-blue-check.png +0 -0
- assets/images/check-1.svg +0 -0
- assets/images/check-mini-1.svg +0 -0
- assets/images/icon-arrow-choice.png +0 -0
- assets/images/icon-arrow-choice.svg +0 -0
- assets/images/icon-lock.png +0 -0
- assets/images/icon-lock.svg +0 -0
- assets/images/icon-pack.png +0 -0
- assets/images/icon-pack.svg +0 -0
- assets/images/mushrooms-aggressive.jpg +0 -0
- assets/images/mushrooms-normal.jpg +0 -0
- assets/images/mushrooms-original.jpg +0 -0
- assets/images/mushrooms-ultra.jpg +0 -0
- assets/images/pic-ericwaltr.jpg +0 -0
- assets/images/pic-srhdesign.jpg +0 -0
- assets/js/admin.js +1054 -931
- assets/js/admin.min.js +1 -36
- assets/js/bulk.js +352 -337
- assets/js/bulk.min.js +1 -17
- assets/js/imagify.js +290 -0
- assets/js/imagify.min.js +1 -5
- assets/js/jquery.twentytwenty.js +477 -456
- assets/js/jquery.twentytwenty.min.js +1 -28
- assets/js/options.js +80 -60
- assets/js/options.min.js +1 -4
- assets/js/upload.js +159 -128
- assets/js/upload.min.js +1 -6
- contributors.txt +3 -2
- imagify.php +81 -78
- inc/3rd-party/3rd-party.php +4 -4
- inc/3rd-party/enable-media-replace.php +31 -28
- inc/3rd-party/hosting/wpengine.php +13 -13
- inc/3rd-party/nextgen-gallery/inc/admin/ajax.php +73 -70
- inc/3rd-party/nextgen-gallery/inc/admin/bulk.php +15 -13
- inc/3rd-party/nextgen-gallery/inc/admin/db.php +7 -8
- inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php +16 -16
- inc/3rd-party/nextgen-gallery/inc/admin/gallery.php +27 -6
- inc/3rd-party/nextgen-gallery/inc/admin/heartbeat.php +32 -26
- inc/3rd-party/nextgen-gallery/inc/admin/menu.php +6 -6
- inc/3rd-party/nextgen-gallery/inc/classes/class-attachment.php +0 -480
- inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-attachment.php +515 -0
- inc/3rd-party/nextgen-gallery/inc/classes/{class-db.php → class-imagify-ngg-db.php} +76 -50
- inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-storage.php +92 -0
- inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg.php +100 -0
- inc/3rd-party/nextgen-gallery/inc/classes/class-ngg-storage.php +0 -72
- inc/3rd-party/nextgen-gallery/inc/classes/class-ngg.php +0 -32
- inc/3rd-party/nextgen-gallery/inc/common/attachments.php +54 -41
- inc/3rd-party/nextgen-gallery/inc/functions/admin-stats.php +35 -41
- inc/3rd-party/nextgen-gallery/nextgen-gallery.php +16 -13
- inc/3rd-party/wp-retina-2x.php +72 -42
- inc/admin/ajax.php +456 -444
- inc/admin/enqueue.php +46 -40
- inc/admin/heartbeat.php +38 -30
- inc/admin/media.php +37 -17
- inc/admin/menu.php +8 -9
- inc/admin/meta-boxes.php +44 -33
- inc/admin/options.php +102 -83
- inc/admin/plugins.php +12 -11
- inc/admin/ui/bulk.php +192 -119
- inc/admin/ui/notices.php +184 -108
- inc/admin/ui/options.php +188 -139
- inc/admin/upgrader.php +101 -98
- inc/admin/upload.php +62 -52
- inc/api/imagify.php +54 -344
- inc/classes/abstracts/{abstract-attachment.php → class-imagify-abstract-attachment.php} +181 -156
- inc/classes/abstracts/{abstract-db.php → class-imagify-abstract-db.php} +115 -63
- inc/classes/class-attachment.php +0 -408
- inc/classes/class-imagify-attachment.php +436 -0
- inc/classes/{class-user.php → class-imagify-user.php} +62 -47
- inc/classes/class-imagify.php +368 -0
- inc/common/admin-bar.php +23 -22
- inc/common/attachments.php +37 -26
- inc/common/cron.php +36 -36
- inc/compat.php +230 -19
- inc/functions/admin-stats.php +319 -308
- inc/functions/admin-ui.php +250 -158
- inc/functions/admin.php +120 -81
- inc/functions/api.php +25 -27
- inc/functions/attachments.php +66 -63
- inc/functions/common.php +30 -0
- inc/functions/deprecated.php +185 -0
- inc/functions/files.php +39 -9
- inc/functions/formatting.php +30 -27
- inc/functions/i18n.php +89 -66
- inc/functions/options.php +39 -32
- inc/functions/process.php +69 -69
- languages/imagify-de_DE.mo +0 -0
- languages/imagify-de_DE.po +0 -1203
- languages/imagify-de_DE_formal.mo +0 -0
- languages/imagify-de_DE_formal.po +0 -1223
- languages/imagify-es_ES.mo +0 -0
- languages/imagify-es_ES.po +0 -1228
- languages/imagify-fr_FR.mo +0 -0
- languages/imagify-fr_FR.po +0 -478
assets/css/admin-bar.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top
|
1 |
+
#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:0 0;color:#FFF;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover{background:#FFF;color:#888}#wpadminbar .imagify-warning *{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.2)}
|
assets/css/admin.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.imagify-start{float:left}.imagify-end{float:right}.imagify-txt-start.imagify-txt-start.imagify-txt-start{text-align:left}.imagify-txt-center.imagify-txt-center.imagify-txt-center{text-align:center}.imagify-txt-end.imagify-txt-end.imagify-txt-end{text-align:right}.imagify-mt1.imagify-mt1{margin-top:1em}.imagify-mb1.imagify-mb1{margin-bottom:1em}.imagify-mr1.imagify-mr1{margin-right:1em}.imagify-ml2.imagify-ml2{margin-left:2em}.imagify-mr2.imagify-mr2{margin-right:2em}.imagify-pl0.imagify-pl0.imagify-pl0{padding-left:0}.imagify-pr1.imagify-pr1{padding-right:1em}.imagify-oh{overflow:hidden}.imagify-clear{clear:both}.imagify-clearfix:after,.imagify-inline-options:after{content:"";display:table;clear:both}.imagify-count.imagify-count{counter-reset:num}.imagify-count .imagify-count-title{font-weight:bold}.imagify-default-settings{color:#73818c;font-weight:normal}.imagify-count .imagify-count-title:before{counter-increment:num 1;content:counter(num) ". "}.imagify-table{display:table;width:100%}.imagify-cell{display:table-cell;padding:10px;vertical-align:top}.imagify-cell.va-top,.va-top .imagify-cell{vertical-align:top}.imagify-bulk-submit .imagify-cell{padding-top:0}body.imagify-modal-is-open{overflow:hidden}.imagify-plugins-error{overflow:hidden;padding-left:20px;list-style-type:disc}.imagify-plugins-error li{width:300px;line-height:30px}@media (max-width:570px){.imagify-plugins-error li{width:auto}}.imagify-notice-dismiss.notice-dismiss{text-decoration:none}.imagify-spinner{display:inline-block;width:20px;height:20px;margin-right:5px;vertical-align:middle;background:rgba(0,0,0,0) url("../images/spinner.gif") no-repeat scroll 0 0 / 20px 20px;opacity:0.7}.spinner.imagify-hidden{width:0;margin:4px 0 0 0}.misc-pub-section.misc-pub-imagify h4{font-size:14px;margin-top:5px;margin-bottom:0}.imagify-sweet-alert button{margin-top:17px !important;height:45px !important;letter-spacing:3px;text-transform:uppercase !important;border-radius:3px !important;background-color:#40b1d0 !important;box-shadow:0 3px 0 #338ea6 !important}.imagify-sweet-alert button.loading{border-radius:100% !important;height:40px !important;padding:0!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{background:#777 !important;box-shadow:0 3px 0 #444 !important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup button{width:100%;padding:0 !important}.imagify-sweet-alert .sa-input-error:before,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .la-ball-fall{top:25% !important}#wpwrap{transition:all .4s}.stop-scrolling #wpwrap{filter:blur(2px)}.stop-scrolling #wpwrap #wpadminbar{top:-32px}.imagify-primary.imagify-primary.imagify-primary{color:#40b1d0}.imagify-secondary.imagify-secondary.imagify-secondary{color:#8cc152}#imagify-check-api-container{font-weight:bold}#imagify-check-api-container .dashicons{font-size:25px}#imagify-check-api-container .dashicons-no:before{color:#f06e57;vertical-align:-1px}#imagify-check-api-container .dashicons-yes:before{color:#8BC34A;vertical-align:-1px}.imagify-valid{color:#8BC34A}.imagify-chart{width:33.33%;position:relative}#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:14px;font-weight:600;cursor:default;-webkit-transition:background-color 200ms ease-in-out;-moz-transition:background-color 200ms ease-in-out;-o-transition:background-color 200ms ease-in-out;transition:background-color 200ms ease-in-out}.imagify-doughnut-legend li span{display:block;position:absolute;left:0;top:0;width:25px;height:25px;border-radius:50%}.imagify-chart{float:left;margin-bottom:20px}td .imagify-chart{float:none;margin-bottom:0}.imagify-chart-container{position:relative;width:180px;float:left;margin-right:20px}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;font-weight:bold;text-align:center}.imagify-total-percent{color:#46b1ce}td .imagify-chart-container{width:18px;height:18px;float:none;margin-right:10px}td .imagify-chart{top:4px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-14px;text-align:center;font-size:55px;font-weight:bold;color:#46B1CE}.imagify-chart-percent span{font-size:20px;vertical-align:super}.media_page_imagify-bulk-optimization .notice,body[class*="_imagify-ngg-bulk-optimization"] .notice,.settings_page_imagify .notice{margin-right:20px;margin-left:2px}.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%;margin:0;background:#1F2331;box-shadow:0;border-radius:0}.media_page_imagify-bulk-optimization .media-item .percent,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent{width:auto;padding:0 5px;line-height:1.85;font-size:12px}.media_page_imagify-bulk-optimization .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress,body[class*="_imagify-ngg-bulk-optimization"] .media-item .percent,.media_page_imagify-bulk-optimization .media-item .percent{text-align:right}.media_page_imagify-bulk-optimization .media-item .progress .bar,body[class*="_imagify-ngg-bulk-optimization"] .media-item .progress .bar{width:1px;height:22px;margin-top:0;background:#46B1CE;border-radius:0;overflow:visible;-webkit-transition:width .5s;transition:width .5s}.imagify-settings a,.imagify-settings .button,.imagify-settings input,.imagify-welcome a,.imagify-welcome .button,.imagify-weolcome input{-webkit-transition:all .275s;transition:all .275s}.imagify-settings a{color:#40b1d0}.imagify-options-title{padding-bottom:.5em;border-bottom:3px solid #F2F2F2;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:0.025em;color:#40b1d0}.imagify-settings,.imagify-settings p,.imagify-settings th{color:#5F758E}@media (max-width:782px){.imagify-settings .form-table th{padding-top:2em;padding-bottom:.5em}}.imagify-settings .form-table td{vertical-align:top}.imagify-settings .form-table th span{cursor:pointer}.imagify-middle th{padding-top:35px}.imagify-settings .button,.imagify-welcome .button,.imagify-notice .button,.imagify-button.imagify-button,.imagify-button-primary.imagify-button-primary,.imagify-button-secondary.imagify-button-secondary{height:auto;padding:8px 20px;border:0 none;font-size:14px;font-weight:600;box-shadow:0 3px 0 rgba(0,0,0,.15);border-radius:3px;cursor:pointer;transition:all .275s}.imagify-notice .button-mini{padding:2px 10px;font-size:13px}.button-primary.button-mini{padding:2px 10px}.imagify-settings .button.button-mini-flat{padding:3px 6px 5px;font-size:12px;box-shadow:none!important;line-height:1.2}.imagify-settings .button.button-mini-flat:hover,.imagify-settings .button.button-mini-flat:focus{box-shadow:none!important}.imagify-title .button-ghost.button-ghost,.imagify-button-ghost.imagify-button-ghost{padding:2px 9px;border:1px solid #40B1D0;font-size:12px;font-weight:normal;color:#40B1D0;background:transparent;box-shadow:none}.imagify-title .button-ghost.button-ghost:hover,.imagify-title .button-ghost.button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover,.imagify-button-ghost.imagify-button-ghost:focus{border-color:transparent;color:#000;background:#40B1D0}.imagify-button-ghost.imagify-button-ghost:hover,.imagify-button-ghost.imagify-button-ghost:focus{color:#FFF}.imagify-button-medium.imagify-button-medium{text-transform:uppercase;letter-spacing:0.1em;padding:3px 10px;font-weight:bold}.imagify-button-medium.imagify-button-ghost{border-width:2px}.button .dashicons{margin-right:5px;vertical-align:middle}.imagify-settings .button-primary.button-primary,.imagify-welcome .button-primary.button-primary,.imagify-button-primary.imagify-button-primary{background:#40B1D0;color:#FFF;box-shadow:0 3px 0 rgba(51,142,166,1);text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799!important}.imagify-button-secondary.imagify-button-secondary{background:#8BC34A;color:#FFF;box-shadow:0 3px 0 #6F9C3B;text-shadow:0 -1px 1px #6F9C3B,1px 0 1px #6F9C3B,0 1px 1px #6F9C3B!important}.imagify-settings .button-primary:hover,.imagify-settings .button-primary:focus,.imagify-welcome .button-primary:hover,.imagify-welcome .button-primary:focus,.imagify-button-primary.imagify-button-primary:hover,.imagify-button-primary.imagify-button-primary:focus{background:rgb(51,142,166);box-shadow:0 3px 0 rgb(31,122,146)}.imagify-button-secondary.imagify-button-secondary:hover,.imagify-button-secondary.imagify-button-secondary:focus{background:#6F9C3B;color:#FFF}.imagify-button-light.imagify-button-light{background:#FFF;color:#4a4a4a;box-shadow:0 2px 0 rgba(0,0,0,.2)}.imagify-button-light.imagify-button-light:hover,.imagify-button-light.imagify-button-light:focus{color:#FFF;background:rgba(0,0,0,.2)}.imagify-section-positive .imagify-button-light{color:#709A41}.imagify-button.imagify-button-big{font-size:15px;padding:11px 30px}.imagify-button-big .dashicons{font-size:1.45em;margin-right:6px;margin-left:-4px}.imagify-settings .button .dashicons,.imagify-welcome .button .dashicons,.imagify-notice .button .dashicons,.imagify-button.imagify-button .dashicons,.imagify-button-primary.imagify-button-primary .dashicons,.imagify-button-secondary.imagify-button-secondary .dashicons{vertical-align:middle}.button-text{display:inline-block;vertical-align:middle}#imagify-bulk-action{padding:11px 20px}.wp_attachment_image .imagify-button-primary,.media-frame-content .imagify-button-primary{float:left;padding:0 10px 1px;margin:0 5px 2px 0;font-size:13px;line-height:26px;box-shadow:0 3px 0 rgba(51,142,166,1)}.imagify-settings input[type="text"]{color:#4A4A4A;font-weight:600;box-shadow:none}.imagify-settings div.submit.submit{padding-left:235px;padding-top:40px}.imagify-settings p.submit{float:left;margin-top:0}.imagify-settings p.submit .button{margin:0 5px}@media (max-width:850px){.imagify-settings div.submit{padding-left:0}.imagify-settings p.submit{text-align:center}}.imagify-title.imagify-title{position:relative;padding:30px 50px;font-size:23px;background:#2E3243;color:#FFF}.imagify-settings .imagify-title + .imagify-notice{margin:0;border-right:1px solid #D9D9D9;padding-top:15px;padding-bottom:15px}.imagify-logo{vertical-align:top}.imagify-sub-header,.imagify-sub-title.imagify-sub-title,.imagify-settings div.submit,.imagify-section{margin:0;padding:20px;background:#F2F5F7}.imagify-sub-title.imagify-sub-title,.imagify-section-positive{padding-left:40px}.imagify-section-positive{background:#8cc152;color:#FFF}.imagify-section-positive p{color:#FFF}.imagify-section-gray{background:#D9E4EB}.imagify-section-gray .imagify-count-title{color:#4a4a4a}.imagify-section p:first-child{margin-top:0}.imagify-section p:last-child{margin-bottom:0}p.imagify-section-title.imagify-section-title{font-size:20px;margin-top:-.3em;margin-bottom:-.6em}.imagify-bulk-info{margin:1em 1em 1em 5px;transition:margin .3s}@media (max-width:850px){.imagify-bulk-info{margin:1em}}.imagify-bulk-info p{display:inline-block;text-align:left;width:400px;max-width:100%;font-weight:bold}@media (min-width:1500px){.imagify-settings div.submit{display:table;width:100%}.imagify-settings div.submit > *{display:table-cell;vertical-align:middle}.imagify-bulk-info{padding:0 25px;text-align:right}}.imagify-settings div.submit{margin-top:2em;padding:20px 0}.imagify-sub-header th{text-align:right}.imagify-sub-header .form-table{margin:0}.imagify-sub-header th,.imagify-sub-header td{padding-top:0;padding-bottom:0}[for="api_key"]{padding-top:5px}.imagify-notice .imagify-rate-us.imagify-rate-us{position:relative;bottom:0;right:0;text-align:left}.imagify-notice .imagify-rate-us .stars{margin:0}.imagify-rate-us.imagify-rate-us{position:absolute;bottom:50%;right:20px;text-align:right;margin-bottom:-2.4em;color:#FFF}.imagify-rate-us a{color:#40B1D0}.imagify-rate-us .stars{display:inline-block;margin:2px 0 0 10px;text-decoration:none;letter-spacing:.2em;vertical-align:-1px}.imagify-rate-us .stars .dashicons:before{font-size:18px}.imagify-rate-us a:hover,.imagify-rate-us a:focus{color:#FEE102}@media (max-width:1220px){.imagify-rate-us.imagify-rate-us{position:static;margin-bottom:0;text-align:left}.imagify-rate-us.imagify-rate-us br{display:none}.imagify-rate-us .stars{display:block;margin-left:0}}.imagify-rkt-notice.imagify-rkt-notice{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:10px 45px 10px 0;border:0 none;box-shadow:none;color:#FFF;background:#412355}.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:2px;margin-right:20px}@media (max-width:782px){.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:0;margin-right:12px}}.imagify-rkt-notice .imagify-cross{position:absolute;right:8px;top:50%;width:22px;height:22px;padding:0;margin-top:-11px;background:transparent;color:#FD7300;border-radius:50%;transition:all .275s}.imagify-rkt-notice .imagify-cross .dashicons{position:relative;top:2px;left:1px;transition:all .275s}.imagify-rkt-notice .imagify-cross:hover{background:#FFF}.imagify-rkt-notice .imagify-cross:hover .dashicons{color:#412355}.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo,.imagify-rkt-notice .imagify-rkt-coupon{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.imagify-rkt-notice .imagify-rkt-logo{width:150px!important;text-align:center;padding:0 25px 0 30px;line-height:0.8}.imagify-rkt-notice .imagify-rkt-msg{width:100%!important;padding:0 15px;font-size:14px;line-height:1.6}.imagify-rkt-notice .imagify-rkt-coupon{width:150px!important;padding:0 15px}.imagify-rkt-notice .imagify-rkt-coupon-code{padding:5px 10px;font-size:23px;font-weight:bold;border:1px dashed #F7A933;color:#F7A933}.imagify-rkt-notice .imagify-rkt-cta{width:250px!important;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.imagify-rkt-notice .button.button{position:relative;top:-1px;height:auto;font-weight:600;font-size:14px;box-shadow:0 4px 0 #B27A27;border:0 none;padding:9px 18px 9px;background:#F7A933;text-shadow:1px 1px 1px rgba(0,0,0,.2)}@media (max-width:880px){.imagify-rkt-notice{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.imagify-rkt-notice .imagify-rkt-msg,.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo{text-align:left;padding:5px 15px}.imagify-cross.imagify-cross{top:8px;margin-top:0}.imagify-rkt-notice .imagify-cross .dashicons{top:1px}}.imagify-settings-section{padding:10px 20px}[id="imagify-settings"],.imagify-welcome .imagify-settings-section{border:1px solid #D9D9D9;border-top:0 none;background:#FFF}.imagify-br{line-height:2}.imagify-important{color:#F5A623}.imagify-info,.imagify-info a{color:#40B1D0;font-size:12px}.imagify-info{position:relative;display:inline-block;padding-left:25px;vertical-align:top}.imagify-info .dashicons{position:absolute;left:0;top:-1px}label + .imagify-info,label + .imagify-options-line,.imagify-visual-label{display:inline-block;max-width:70%;margin-left:15px;margin-top:2px!important;-webkit-transition:opacity .3s;transition:opacity .3s}.imagify-visual-label{vertical-align:-5px}label[for="imagify_sizes_full"] + .imagify-info{vertical-align:middle}.imagify-settings.imagify-settings [type="checkbox"]:not(:checked) + label + .imagify-options-line,.imagify-settings.imagify-settings [type="checkbox"]:not(:checked) + label .imagify-visual-label{opacity:.5}.imagify-settings.imagify-settings [type="checkbox"]:checked + label + .imagify-options-line,.imagify-settings.imagify-settings [type="checkbox"]:checked + label .imagify-visual-label{opacity:1}.imagify-checkbox-marged{max-width:500px;margin-left:45px}.imagify-settings.imagify-settings [type="checkbox"]:not(:checked),.imagify-settings.imagify-settings [type="checkbox"]:checked,.imagify-checkbox.imagify-checkbox:not(:checked),.imagify-checkbox.imagify-checkbox:checked{opacity:0.01}.imagify-settings.imagify-settings [type="checkbox"]:not(:checked):focus,.imagify-settings.imagify-settings [type="checkbox"]:checked:focus,.imagify-checkbox.imagify-checkbox:not(:checked):focus,.imagify-checkbox.imagify-checkbox:checked:focus{box-shadow:none!important;outline:none!important;border:0 none!important}.imagify-settings [type="checkbox"]:not(:checked) + label,.imagify-settings [type="checkbox"]:checked + label,.imagify-checkbox.imagify-checkbox:not(:checked) + label,.imagify-checkbox.imagify-checkbox:checked + label{position:relative;padding-left:6px;cursor:pointer;vertical-align:top}.imagify-settings [type="checkbox"]:not(:checked) + label:before,.imagify-settings [type="checkbox"]:checked + label:before,.imagify-checkbox.imagify-checkbox:not(:checked) + label:before,.imagify-checkbox.imagify-checkbox:checked + label:before{content:'';position:absolute;left:0;top:0;width:28px;height:28px;margin:0 0 0 -24px;border:2px solid #8BA6B4;background:#FFFFFF;border-radius:4px}.imagify-settings [type="checkbox"]:not(:checked) + label:after,.imagify-settings [type="checkbox"]:checked + label:after,.imagify-checkbox.imagify-checkbox:not(:checked) + label:after,.imagify-checkbox.imagify-checkbox:checked + label:after{content:"✓";position:absolute;font-size:1.4em;top:3px;left:-16px;-webkit-transition:all .2s;-moz-transition:all .2s;-ms-transition:all .2s;transition:all .2s}.imagify-settings [type="checkbox"][disabled]:not(:checked) + label:before,.imagify-settings [type="checkbox"][disabled]:checked + label:before,.imagify-checkbox.imagify-checkbox[disabled]:not(:checked) + label:before,.imagify-checkbox.imagify-checkbox[disabled]:checked + label:before{border-color:#ccc;background:#ddd}.imagify-settings [type="checkbox"]:not(:checked) + label:after,.imagify-checkbox.imagify-checkbox:not(:checked) + label:after{opacity:0;-webkit-transform:scale(0);-moz-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.imagify-settings [type="checkbox"]:checked + label:after,.imagify-checkbox.imagify-checkbox:checked + label:after{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}input[id^="imagify_sizes_"]:checked + label{font-weight:bold}.medium.imagify-checkbox:not(:checked) + label:before,.medium.imagify-checkbox:checked + label:before{width:22px;height:22px;border-width:1.5px;border-radius:2px;margin-top:0}.medium.imagify-checkbox:not(:checked) + label:after,.medium.imagify-checkbox:checked + label:after{font-size:1.1em;left:-17px;top:3px}.imagify-settings .mini[type="checkbox"]:not(:checked) + label:before,.imagify-settings .mini[type="checkbox"]:checked + label:before,.mini.imagify-checkbox:not(:checked) + label:before,.mini.imagify-checkbox:checked + label:before{width:15px;height:15px;border-width:1px;border-radius:2px;margin-top:0}.imagify-settings .mini[type="checkbox"]:not(:checked) + label:after,.imagify-settings .mini[type="checkbox"]:checked + label:after,.mini.imagify-checkbox:not(:checked) + label:after,.mini.imagify-checkbox:checked + label:after{font-size:.9em;left:-21px;top:1px}.imagify-settings [type="checkbox"]:not(:checked):focus + label:before,.imagify-settings [type="checkbox"]:checked:focus + label:before,.imagify-checkbox.imagify-checkbox:not(:checked):focus + label:before,.imagify-checkbox.imagify-checkbox:checked:focus + label:before{border-style:dotted;border-color:#40b1d0}.imagify-inline-options{position:relative;display:table;width:100%;max-width:600px;border-collapse:collapse}.imagify-small-options{width:300px;margin:1em auto .5em;background:#338EA6;border-radius:4px}.imagify-inline-options input[type="radio"]:not(:checked),.imagify-inline-options input[type="radio"]:checked{position:absolute;left:5px;top:5px;display:none}.imagify-inline-options input[type="radio"]:not(:checked) + label,.imagify-inline-options input[type="radio"]:checked + label{position:relative;display:table-cell;padding:13px 10px;text-align:center;font-weight:600;font-size:16px;text-transform:uppercase;letter-spacing:0.1em;color:#FFF;background:#2E3243;border-left:1px solid rgba(255,255,255,0.2);box-shadow:0 -3px 0 rgba(0,0,0,0.1) inset,inset -1px 0 0 rgba(255,255,255,0.2);z-index:2;-webkit-transition:all .275s;transition:all .275s}.imagify-small-options input[type="radio"]:not(:checked) + label,.imagify-small-options input[type="radio"]:checked + label{padding:8px 10px;font-size:13px;color:#FFF;box-shadow:none;border-left:0}.imagify-bulk-submit .imagify-inline-options input[type="radio"]:not(:checked) + label,.imagify-bulk-submit .imagify-inline-options input[type="radio"]:checked + label{margin-bottom:1.75em}.imagify-inline-options input[type="radio"]:not(:checked) + label:first-of-type,.imagify-inline-options input[type="radio"]:checked + label:first-of-type{border-radius:3px 0 0 3px}.imagify-inline-options input[type="radio"]:not(:checked) + label:last-of-type,.imagify-inline-options input[type="radio"]:checked + label:last-of-type{border-radius:0 3px 3px 0}.imagify-inline-options input[type="radio"]:checked + label{background:#8BC34A}.imagify-small-options input[type="radio"]:not(:checked) + label{background:#338EA6;color:rgba(255,255,255,.4)}.imagify-small-options input[type="radio"]:checked + label{background:#40B1D0}.imagify-inline-options .imagify-info{margin-top:15px}.imagify-btn-info{display:block;font-size:0.7em;letter-spacing:0;line-height:1;text-transform:none}#describe-resize-larger input{width:5em}.imagify-cols:after{content:"";display:table;clear:both}.imagify-col{float:left;width:50%}.imagify-main{float:left;width:70%}.imagify-sidebar{float:right;width:28%;max-width:300px}.imagify-sidebar-section{border:1px solid #BBB;background:#FFF}.imagify-sidebar-section + .imagify-sidebar-section{margin-top:2em}@media (max-width:820px){.imagify-settings{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-main{width:auto;float:none}.imagify-sidebar{order:2;float:none;width:auto;max-width:none;margin-left:0;margin-top:25px}.wp-media-products{text-align:center}.wp-media-products li{display:inline-block;width:100%;max-width:276px}}@media (min-width:1400px){.imagify-main{width:74%}}.imagify-sidebar-title{display:block;padding:20px 15px;border-bottom:1px solid #BBB;font-size:14px;font-weight:bold;color:#23282d;background:#F2F5F7}.imagify-sidebar-title img{vertical-align:top;margin-right:5px}.imagify-sidebar .wp-media-products{margin-top:0;margin-bottom:-.5em}.imagify-sidebar .wp-media-products .links{display:block;padding:85px 25px 24px;text-align:center;background-color:#2E3243;background-size:contain;background-repeat:no-repeat;background-position:50% 0;text-decoration:none}.imagify-sidebar .wp-media-products .links p{margin:1.5em auto;color:#FFF}.imagify-sidebar .wp-media-products .wprocket-link{background-image:linear-gradient(to bottom,rgba(59,30,78,0),rgba(59,30,78,0) 130px,rgba(59,30,78,1) 210px),url("../images/sidebar-wp-rocket.jpg");background-color:#3B1E4E;background-repeat:repeat-x,no-repeat}.imagify-sidebar-content{padding:10px 20px}.imagify-mark-styled{display:inline-block;padding:1px 2px 1px 4px;line-height:1.3;font-weight:bold;background:#F7A933;transform-origin:50% 50%;transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.imagify-mark-styled span{display:inline-block;transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg)}.imagify-discount-code{margin:0.35em 0 .5em;display:block;font-size:2em;letter-spacing:.05em;font-weight:bold;text-align:center;text-shadow:1px 1px 0 rgba(0,0,0,0.2)}.imagify-big-text{font-size:15px;font-weight:bold}.imagify-big-text strong{font-size:20px}a.btn-rocket{display:block;font-size:1.15em;padding:12px;background:#F7A933;box-shadow:0 3px 0 #D69626;border-radius:3px;color:#FFF;text-transform:uppercase;font-weight:bold;text-shadow:1px 1px 0 rgba(0,0,0,0.2);text-decoration:none}a.btn-rocket:hover,a.btn-rocket:focus{background:darkorange;box-shadow:0 3px 0 darkorange}.imagify-welcome{margin:30px 20px 0 0}.imagify-welcome .baseline{display:inline-block;margin:.2em 0 0 2em;font-size:17px}.imagify-welcome .imagify-logo{vertical-align:middle}.imagify-welcome-remove{position:absolute;top:50%;right:15px;margin-top:-8px;color:#FFF;text-decoration:none}.imagify-columns{overflow:hidden;padding:15px 0;counter-reset:cols}.imagify-columns [class^="col-"]{float:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.imagify-columns .col-1-3{width:33.333%;padding-left:28px}.imagify-columns .col-2-3{width:66.666%;padding-left:28px}.imagify-columns .col-1-2{width:50%;padding:0 20px}.imagify-columns .col-overview{padding-left:20px}.imagify-columns .col-informations{width:36.6%;padding-right:30px}.imagify-columns .col-statistics{width:30%}@media (max-width:830px){.imagify-columns [class^="col-"]{float:none;margin-bottom:1.5em}.imagify-columns .col-1-3,.imagify-columns .col-1-2{width:auto;padding:0 28px;clear:both;padding-top:1em}}.imagify-columns [class^="col-"] img{float:left;margin-right:18px}.imagify-col-content{overflow:hidden}.imagify-col-title{margin:0 0 15px 0;font-size:23px}.counter .imagify-col-title:before{counter-increment:cols;content:counter(cols) ". ";color:#40B1D0}.imagify-col-desc{color:#5F758E;margin-bottom:2em}.imagify-notice.imagify-notice{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0;margin:10px 20px 10px 2px;border:0 none;background:#2E3243;box-shadow:none;color:#FFF}@media (max-width:782px){.imagify-notice.imagify-notice,.imagify-welcome{margin-right:12px}}@media (max-width:450px){.imagify-notice.imagify-notice{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.wrap .imagify-notice{margin:5px 15px 2px;position:relative}.imagify-notice-logo{padding:18px 23px;background:#40B1D0}.updated .imagify-notice-logo{background:#8BC34A}.error .imagify-notice-logo{background:#D0021B}.imagify-popin-message{padding:5px 15px;text-align:left}.imagify-popin-message.imagify-error p{color:#FFF}.imagify-notice-title{font-size:15px}.imagify-notice-content{padding:5px 23px}.imagify-notice-content.imagify-notice-content p{margin:0.65em 0}.imagify-notice a{color:#40B1D0}.imagify-notice a:hover,.imagify-notice a:focus{color:#FEE102}.imagify-notice code{background:rgba(0,0,0,0.4) none repeat scroll 0 0}.column-imagify_optimized_file.column-imagify_optimized_file{width:300px;text-align:center;vertical-align:middle}.column-imagify_optimized_file > *{max-width:235px;margin:0 auto}ul.imagify-datas-list.imagify-datas-list{margin:0 auto;color:#555;font-size:10px}.compat-field-imagify .label{vertical-align:top}.compat-field-imagify ul.imagify-datas-list{margin-top:7px;font-size:11px}ul.imagify-datas-list .big{font-size:12px;color:#40B1D0}.imagify-data-item{overflow:hidden}.imagify-data-item .imagify-chart{display:inline-block;top:1px;width:20px;vertical-align:middle;margin-bottom:0}li.imagify-data-item{clear:both;margin-bottom:2px}ul.imagify-datas-list .imagify-data-item span.data,ul.imagify-datas-list .imagify-data-item strong{float:left;width:50%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}ul.imagify-datas-list .imagify-data-item span.data{text-align:left;padding-right:5px}.compat-field-imagify .imagify-datas-list .imagify-data-item .data{width:130px;text-align:left;font-weight:bold}.media-sidebar .imagify-datas-list .imagify-data-item .data{width:auto;float:none}ul.imagify-datas-list .imagify-data-item strong{text-align:left;padding-left:5px}.media-sidebar .imagify-datas-list .imagify-data-item strong{width:auto;float:none}.imagify-datas-more-action.imagify-datas-more-action{margin:.4em auto;background:linear-gradient(to bottom,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent)}.imagify-datas-more-action a{display:inline-block;padding:0 5px;background:#40B1D0;color:#FFF;text-transform:uppercase;font-size:9px;font-weight:bold;line-height:1.9;text-decoration:none}.imagify-datas-more-action a.is-open{background:#555}.imagify-datas-more-action a.is-open .dashicons{transform:rotate(180deg)}.imagify-datas-more-action a .dashicons{font-size:14px;vertical-align:middle;line-height:.8}.imagify-datas-more-action a .dashicons:before{vertical-align:middle;line-height:20px}.imagify-datas-more-action .the-text{display:inline-block;vertical-align:middle;height:20px;line-height:20px}ul.imagify-datas-details.imagify-datas-details{margin:.7em auto}.imagify-datas-details strong{color:#40B1D0}.imagify-datas-details .original{color:#555}.imagify-datas-actions-links{overflow:hidden;border-top:2px solid transparent;padding-top:5px;font-size:8px}.imagify-datas-actions-links a{position:relative;display:inline-block;padding-left:17px;text-decoration:none;font-weight:600}.compat-field-imagify .imagify-datas-actions-links{max-width:300px}.misc-pub-imagify .imagify-datas-actions-links{border-top:2px solid #f2f2f2;padding-bottom:5px}.compat-field-imagify .imagify-datas-actions-links a,.misc-pub-imagify .imagify-datas-actions-links a{font-size:10px;float:left;width:50%}.media-sidebar .compat-field-imagify .imagify-datas-actions-links a,.submitbox .misc-pub-imagify .imagify-datas-actions-links a{display:block;width:auto;float:none}.column-imagify_optimized_file .imagify-datas-actions-links a{margin:0 .7em;padding-left:15px}.imagify-datas-actions-links a:only-child{float:none;width:auto}.imagify-datas-details.is-open + .imagify-datas-actions-links{border-top-color:rgba(0,0,0,.075)}.imagify-datas-actions-links .dashicons{position:absolute;left:0;top:4px;width:12px;margin-right:2px;font-size:11px}.imagify-title > h1{padding:0}.imagify-title-right{display:table;float:right;margin-top:-10px}.imagify-title-right p{margin:0}.imagify-title-right a{font-weight:bold;text-decoration:none}.imagify-title-right > div{display:table-cell;vertical-align:middle}.imagify-title-right .dashicons-arrow-down-alt2{vertical-align:-4px;margin-left:2px}@media (max-width:1200px){.imagify-bulk .imagify-title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.imagify-title-right{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-top:20px}}.imagify-account,.imagify-account-link{padding-right:15px}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.imagify-credit-left{position:relative;min-width:280px;padding-left:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}@media (max-width:630px){.imagify-title-right{display:block;width:auto}.imagify-title-right > div{display:block;width:auto;margin-top:10px;max-width:100%}.imagify-credit-left{padding-left:0}}.imagify-meteo-title.imagify-meteo-title{color:#FFF;font-size:17px}.imagify-space-left{display:inline-block;min-height:38px;min-width:245px;vertical-align:middle}.imagify-space-left > p{color:#FFF}[class^="imagify-bar-"],#wp-admin-bar-imagify-profile [class^="imagify-bar-"]{position:relative;height:15px;width:100%;background:#60758D;color:#FFF;font-size:10px}.base-transparent{background:transparent}[class^="imagify-bar-"].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:45px}.right-outside-number .imagify-barnb{display:block;margin-right:-45px;text-align:right;font-weight:bold;line-height:15px}.imagify-progress-value,#wp-admin-bar-imagify-profile .imagify-progress-value{position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:13px;font-weight:bold}.imagify-progress,#wp-admin-bar-imagify-profile .imagify-progress{height:15px}.imagify-progress{transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8CC152}.imagify-bar-positive .imagify-barnb{color:#8CC152}.imagify-bar-negative .imagify-progress{background:#73818C}.imagify-bar-negative .imagify-barnb{color:#73818C}.imagify-bar-neutral .imagify-progress{background:#F5A623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#D0021B}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:0.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:"dashicons";font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row + .imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row > *{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:bold}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link > *{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p + p,#wp-admin-bar-imagify-profile .imagify-warning p + p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p + p + p,#wp-admin-bar-imagify-profile .imagify-warning p + p + p{margin-top:1em}.btn-ghost,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:transparent;color:#FFF;border-radius:3px;transition:all .275s}.btn-ghost:hover,.btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus{background:#FFF;color:#888}.imagify-list-infos{max-width:100%;width:415px}.imagify-list-infos li,.imagify-info-block{position:relative;padding:10px;padding-left:42px;background:#D9E4EB;border-radius:4px;line-height:1.6}.imagify-list-infos .imagify-alt.imagify-alt{background:#8BA7B5;color:#FFF;font-weight:bold}.imagify-list-infos li + li{margin-top:1em}.imagify-list-infos li:before,.imagify-info-block:before{content:"";position:absolute;left:13px;top:14px;height:16px;width:16px;border:1px solid #46b1ce;border-radius:10px}.imagify-list-infos li:after,.imagify-info-block:after{content:"i";position:absolute;left:20px;top:13px;font-style:italic;color:#46b1ce}.imagify-cell .imagify-info-block{padding-top:0}.imagify-cell .imagify-info-block:after{top:6px}.imagify-cell .imagify-info-block:before{top:7px}.imagify-list-infos .imagify-alt:before,.imagify-list-infos .imagify-alt:after{color:#fff;border-color:#fff}.imagify-sub-title.imagify-sub-title{font-size:23px;background:#FFF;color:#2E3243;border-left:1px solid #D9D9D9;border-right:1px solid #D9D9D9;font-weight:lighter}.imagify-sub-title .icon-bulk{margin-right:10px;vertical-align:middle}.imagify-sub-title .title-text{display:inline-block;line-height:1;vertical-align:middle}.imagify-bulk .imagify-settings-section{border:1px solid #D9D9D9;border-top:0;background:#F2F5F7;color:#4A4A4A}.imagify-bulk .imagify-settings-section p,.imagify-bulk .imagify-settings-section li,.imagify-bulk .imagify-settings-section h3{color:#4A4A4A}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.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:bold;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;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 .number{display:table-cell;padding-right:15px;font-size:36px;font-weight:bold;line-height:1.1;vertical-align:middle;white-space:nowrap}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px}.imagify-number-you-optimized .text br{display:none}.imagify-number-you-optimized > p{display:table}.imagify-number-you-optimized{padding-bottom:0.85em;margin-bottom:1.35em;overflow:hidden;border-bottom:1px solid rgba(0,0,0,0.05)}.imagify-bars p{font-weight:bold;font-size:12px;margin-bottom:0}.imagify-bars + .imagify-number-you-optimized{border-bottom:0;padding-top:0.85em}.imagify-bars + .imagify-number-you-optimized p{color:#46b1ce}.imagify-bulk-table{margin-top:2em;max-height:600px;max-height:60vh;overflow:auto}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse;border:1px solid #D3D3D3}.imagify-bulk-table td{padding:8px 15px}.imagify-bulk-table thead tr,.imagify-bulk-table thead th{background:#2E3242}.imagify-bulk-table tfoot tr,.imagify-bulk-table tfoot th{background:#73818C}.imagify-bulk-table thead th{padding:14px 15px;text-align:left;color:#F2F5F7;font-weight:bold;font-size:14px}.imagify-bulk-table tfoot td{padding:14px 15px;color:#F9FAFA}.imagify-bulk-table tbody tr,.imagify-bulk-table tbody td{background:#FFF}.imagify-bulk-table tbody tr:nth-child(odd),.imagify-bulk-table tbody tr:nth-child(odd) td{background:#F2F5F7}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress,.imagify-bulk-table .imagify-row-progress td{height:15px;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:bold;text-align:center;color:#999;background-color:#FFF}.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 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;transform:scale(1)}50%{transform:scale(1.05);opacity:1}100%{transform:scale(1);opacity:1}}.imagify-row-complete.done{-webkit-animation:congrate 500ms ease-in-out;animation:congrate 500ms 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}.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:bold;font-size:24px;letter-spacing:0.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-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{text-overflow:clip;white-space:nowrap;overflow:hidden}.imagify-bulk-table td.imagify-cell-totaloriginal{padding-right:78px}.imagiuploaded,.imagifilename{display:inline-block;vertical-align:middle}.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-widht:100%;height:auto}.imagistatus{color:#8CA6B3;text-transform:uppercase;font-weight:bold}.status-compressing{color:#46B1CE}.status-error{color:#CE0B24}.status-warning{color:#f5a623}.status-complete{color:#8CC152}.imagify-error{background:#D0021B;color:#FFF}.imagify-warning,#wpadminbar .imagify-warning *{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,0.2)}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46B1CE;font-weight:bold}.imagify-cell-optimized{font-weight:bold}.imagify-cell-totaloriginal{text-align:right}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.dashicons-admin-generic{transform-origin:48.75% 51.75%}.imagify-modal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.js .imagify-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#1F2332;background-color:rgba(31,35,50,.95);z-index:99999}.imagify-modal-content{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;width:800px;max-width:95%;max-height:90vw;overflow:auto;padding:20px 25px;margin:1em auto;background:#FFF;box-shadow:1px 1px 4px rgba(0,0,0,.7);border-radius:3px}#imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{max-width:1400px;background:transparent;padding:5px;box-shadow:none;border-radius:0}.imagify-modal .h2{margin:.5em 0;color:#8ba6b4;font-weight:normal;font-size:24px;letter-spacing:0.075em;text-align:center}.imagify-modal .h3{color:#40b1d0;font-weight:normal;font-size:18px;letter-spacing:0.075em;text-align:center}.text-justify{text-align:justify}.imagify-modal .close-btn{display:none;visibility:hidden;position:absolute;right:20px;top:20px;font-size:1.2em;border:0;background:transparent none;border-radius:0;cursor:pointer}.imagify-modal .close-btn i{margin-left:-2px}.imagify-modal .close-btn:hover,.imagify-modal .close-btn:focus{color:#40b1d0}.js .imagify-modal .close-btn{display:block;visibility:visible}.js .imagify-iframe-viewing .close-btn{display:none}#imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:50px;right:5px;width:33px;height:33px;padding:1px 0 0 2px;border:1px solid #F2F2F2;color:#F2F2F2;line-height:19px;text-align:center;border-radius:50%}.wp_attachment_image #imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:0}.wp_attachment_image #imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{padding-top:40px}.imagify-modal .imagify-comparison-title{font-size:28px;margin-bottom:1em;color:#F2F2F2;text-align:left}.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons{position:static;margin:0 10px 0 15px}.imagify-comparison-title .twentytwenty-duo-buttons button{float:none;padding:6px 12px;font-size:16px;text-transform:none;border:1px solid #40B1D0;color:#888899;letter-spacing:0}.imagify-comparison-title .twentytwenty-duo-buttons button:focus{outline:none;box-shadow:none}.imagify-comparison-title .twentytwenty-duo-buttons .selected{border:1px solid #40B1D0;color:#FFF;background:#40B1D0}.imagify-comparison-levels{margin:15px 0;overflow:hidden}.imagify-comparison-levels div{display:none;min-width:175px;font-size:11px}.imagify-comparison-levels .imagify-chart,.imagify-comparison-levels .imagify-chart-container{width:25px;float:none;margin:0}.imagify-visual-comparison .imagify-chart-container canvas{width:15px!important;height:15px!important;margin-right:5px}.imagify-c-level.go-left{float:left}.imagify-c-level.go-right{float:right}.imagify-c-level.go-right,.imagify-c-level.go-left{display:table}.imagify-c-level .imagify-c-level-row{display:table-row;margin:0;color:#FFF}.imagify-c-level-row > span{display:table-cell;padding:2px 0}.imagify-c-level-row .value{text-align:right;padding-left:5px}.imagify-c-level-row .value.level{color:#40b1d0}.imagify-c-level-row .value.size{color:#8bc34a;font-weight:bold}.imagify-c-level-row .value .imagify-chart{top:1px}@-webkit-keyframes icon-rotate{from{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-rotate{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.imagify-menu-bar-img{margin-top:1em}.imagify-modal .loader{position:absolute;top:50%;left:50%;margin:-32px 0 0 -32px;opacity:0;visibility:hidden;transition:opacity .4s}.imagify-modal .loading .loader{visibility:visible;opacity:1}.imagify-settings .imagify-visual-comparison-text{margin-top:1em;color:#40b1d0;font-weight:bold}.imagify-modal-cols,.imagify-border-styled,.imagify-offer-header,.imagify-payment-modal .imagify-modal-content,.imagify-flex-table,.imagify-tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.imagify-modal-cols,.imagify-border-styled{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.imagify-payment-modal{text-align:center;color:#7A8996}.imagify-payment-modal *{box-sizing:border-box}.imagify-modal-loader{position:absolute;top:0;left:0;right:0;bottom:0;background:#fff url('../images/loader-balls.svg') center no-repeat;z-index:10}.imagify-payment-modal .imagify-modal-content{width:980px;max-width:100%;min-width:925px;padding:0}.imagify-modal-content.imagify-iframe-viewing{width:980px;height:672px;overflow:hidden}.imagify-iframe-viewing #imagify-payment-process-view{width:980px;height:668px}.imagify-payment-modal .imagify-modal-main{width:70%}.imagify-iframe-viewing .imagify-modal-main{width:auto}.imagify-payment-modal .imagify-modal-content.imagify-success-viewing{min-width:auto;width:450px;min-height:300px}.imagify-success-viewing .imagify-modal-main{width:100%}.imagify-payment-modal .imagify-modal-sidebar{width:30%;padding:15px 20px;background:#1F2332;color:#FFF}.imagify-modal-content.imagify-iframe-viewing .imagify-modal-sidebar,.imagify-modal-content.imagify-success-viewing .imagify-modal-sidebar{display:none}.imagify-modal-section{padding:0 25px}.imagify-modal-section.section-gray{margin:0 0 1em;padding:10px 25px 15px;background:#F6F7FB}.imagify-tabs-contents .section-gray{padding:8px 25px 10px}.imagify-modal-section .imagify-modal-title:first-child{margin-top:1em;margin-bottom:1.5em}.imagify-modal-section.section-gray .imagify-modal-title{margin-top:.5em;margin-bottom:.5em}.imagify-modal-title{font-size:1.8em}.imagify-analyzing .imagify-numbers-calc,.imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-modal-cols,.imagify-modal-section .imagify-loader{display:none}.imagify-analyzing .imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-loader{display:block}.imagify-modal-section .imagify-loader{margin:2em auto}.imagify-border-styled{width:200px;margin:0 auto;color:#8BC34A;font-weight:bold;font-size:0.925em}.imagify-big-number{font-size:3.7em;font-weight:bold;margin:-3px 0;color:#4A4A4A;line-height:1}.imagify-border-styled:before,.imagify-border-styled:after{content:"";height:1px;background:rgba(0,0,0,.1);-webkit-flex-basis:40px;-ms-flex-preferred-size:40px;flex-basis:40px}.imagify-border-styled:before{margin-right:5px}.imagify-border-styled:after{margin-left:5px}.imagify-payment-modal strong{font-weight:bold;color:#4A4A4A}.imagify-col{-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.imagify-modal .imagify-cols{padding:0 20px}.imagify-payment-modal .imagify-iconed{margin:1.5em 5em 1.5em 0}.imagify-iconed{position:relative;text-align:left;padding-left:42px;margin-right:15px;font-weight:500}.imagify-iconed .dashicons,.imagify-iconed .icon{position:absolute;font-size:2em;left:0;top:2px;color:#40B1D0}.imagify-payment-modal .close-btn{top:10px;right:10px;width:24px;height:24px;padding:2px 0 0 4.5px;color:#FFF;background:#40B1D0;border-radius:50%;-webkit-transition:all .275s;transition:all .275s}.imagify-payment-modal .close-btn i{margin-left:-3.5px;margin-top:-0.5px}.imagify-payment-modal .close-btn:hover{background:#F6F7FB}.imagify-offer-line{margin-top:1.5em}.imagify-offer-line + .imagify-offer-line{margin-top:0.75em}.imagify-offer-header{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:0 0 0 15px;border-radius:4px 4px 0 0;-webkit-transition:all .275s;transition:all .275s}.imagify-offer-header.imagify-offer-header.imagify-offer-header .imagify-inline-options label:last-child{border-radius:0 4px 0 0}.imagify-offer-header .imagify-inline-options{width:auto}.imagify-offer-title{font-weight:bold;margin:0}.imagify-offer-header,.imagify-offer-header .imagify-inline-options input[type="radio"]:not(:checked) + label{background:#E5EBEF}.imagify-offer-onetime .imagify-offer-header{padding-top:8px;padding-bottom:8px}.imagify-offer-onetimes > div{padding-top:15px;padding-bottom:15px}.imagify-offer-header .imagify-inline-options input[type="radio"]:not(:checked) + label,.imagify-offer-header .imagify-inline-options input[type="radio"]:checked + label{position:relative;padding:7px 30px;font-size:1em;letter-spacing:0.05em;color:inherit;box-shadow:0 0 0;border-radius:0}.imagify-offer-header .imagify-inline-options input[type="radio"]:checked + label{background:#F6F7FB}.imagify-2-free{position:absolute;bottom:100%;left:0;right:0;padding:2px 10px;margin-bottom:8px;font-size:0.8em;letter-spacing:0;text-transform:none;text-align:center;color:#FFF;background:#10121A;border-radius:2px}.imagify-2-free:after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3px;border-top:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent}.imagify-2-free.imagify-b-right{bottom:auto;left:100%;right:-100%;margin-bottom:0;margin-left:8px}.imagify-2-free.imagify-b-right:after{left:-3px;bottom:auto;top:50%;margin-top:-3px;margin-left:0;border-right:3px solid #10121A;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:0}.imagify-2-free.imagify-b-bottom{bottom:-100%;left:0;right:0;margin-top:8px}.imagify-2-free.imagify-b-bottom:after{top:-3px;bottom:auto;border-bottom:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent;border-top:0}.imagify-offer-content{text-align:left;background:#F6F7FB;border-radius:0 0 4px 4px;-webkit-transition:all .275s;transition:all .275s}.imagify-offer-onetime .imagify-offer-content{padding:10px 0}div.imagify-col-checkbox{position:relative;width:25.5%;padding-top:10px;padding-bottom:7px}.imagify-col-checkbox label{display:block}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked),.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked{position:absolute;top:50%;left:6px;margin:-8px 0 0 0}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked) + label:before,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked + label:before{margin:0;top:-2px;left:6px;-webkit-transition:all .275s;transition:all .275s}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked) + label:after,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked + label:after{top:1px;left:13px}.imagify-col-checkbox label{padding-left:55px!important}.imagify-offer-size{font-size:30px;color:#2E3243;font-weight:bold;-webkit-transition:all .275s;transition:all .275s}.imagify-offer-by{font-size:10px;-webkit-transition:all .275s;transition:all .275s}.imagify-approx{display:none;font-size:11px;line-height:1.2;-webkit-transition:all .275s;transition:all .275s}div.imagify-col-price{width:35%}.imagify-flex-table .imagify-price-block{padding-left:0;padding-right:0}.imagify-offer-monthly .imagify-flex-table .imagify-price-block,.imagify-offer-monthlies .imagify-price-block{padding-top:0}.imagify-flex-table .imagify-price-complement{padding-right:0;font-size:10px;font-weight:bold}.imagify-price-block,.imagify-price-discount{white-space:nowrap}.imagify-price-block span,.imagify-price-discount span{display:inline-block;vertical-align:middle}.imagify-price-discount.imagify-price-discount{position:relative;flex-grow:0;padding-top:15px;font-weight:bold;width:70px}.imagify-price-discount:before{content:"";position:absolute;top:25px;width:62%;height:2px;background:#2E3243;transform:rotate(-15deg)}.imagify-offer-onetimes .imagify-price-discount:before{width:100%}.imagify-price-discount-dollar{color:#2E3243}.imagify-price-discount-number{color:#8BA6B4}.imagify-offer-selected .imagify-price-discount-number{color:#FFF}span.imagify-dollars{color:#1F2332;font-size:18px;font-weight:bold;vertical-align:-2px}.imagify-offer-onetime .imagify-col-price{padding-top:0}.imagify-offer-onetime .imagify-dollars{vertical-align:-1px}.imagify-price-big,.imagify-price-mini{color:#40B1D0;font-weight:bold}.imagify-price-big{font-size:36px}span.imagify-price-mini{font-size:18px;vertical-align:2px}span.imagify-price-by{font-size:10px;color:#1F2332;vertical-align:-13px;text-indent:-27px}.imagify-col-other-actions{width:18.5%;text-align:right}.imagify-col-other-actions a{font-size:11px}.imagify-offer-selected,.imagify-offer-selected .imagify-offer-title,.imagify-offer-selected .imagify-offer-size,.imagify-offer-selected .imagify-price-big,.imagify-offer-selected .imagify-price-mini,.imagify-offer-selected .imagify-price-complement,.imagify-offer-selected .imagify-col-other-actions a{color:#FFF}.imagify-offer-selected .imagify-offer-header,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type="radio"]:not(:checked) + label{background:#338EA6}.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type="radio"]:checked + label{background:#40B1D0}.imagify-offer-selected .imagify-offer-content{background:#40B1D0}.imagify-offer-selected .imagify-checkbox.imagify-checkbox:not(:checked) + label:before,.imagify-offer-selected .imagify-checkbox.imagify-checkbox:checked + label:before{border-color:#FFF;background:#40B1D0}.imagify-offer-selected .imagify-offer-by{color:#2E3243}.imagify-enough-title{display:none}.imagify-enough-free .imagify-not-enough-title{display:none}.imagify-enough-free .imagify-enough-title{display:block}.imagify-submit-line{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:2em 0;text-align:left}.imagify-coupon-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-coupon-section p{margin:0;line-height:1.3}.imagify-coupon-text{width:200px;max-width:100%;padding-right:15px}.imagify-coupon-loader{display:none}.imagify-coupon-text.checking{text-align:right}.imagify-coupon-text.checking .imagify-coupon-loader{display:inline}.imagify-coupon-text.checking label{display:none}.imagify-coupon-input{position:relative}.imagify-coupon-input input{position:relative;z-index:1}[id="imagify-coupon-validate"].button-secondary{position:absolute;top:1px;right:3px;bottom:2px;box-shadow:none;padding:4px 10px;z-index:0;transition:transform .275s}.imagify-canbe-validate [id="imagify-coupon-validate"]{transform:translateX(45px)}.imagify-modal-section + .imagify-modal-promotion{margin-top:-1em}.imagify-modal-promotion{position:relative;overflow:hidden;display:none;align-items:center;padding:15px 25px;background:#604D90;text-shadow:0 0 3px rgba(0,0,0,0.3)}.imagify-modal-promotion.active{display:-webkit-box;display:-ms-flexbox;display:flex}[id="imagify-pricing-tab-onetime"] .imagify-modal-promotion{margin-bottom:4em}.imagify-modal-promotion:before{content:"\f488";position:absolute;top:28px;left:8%;font-family:"dashicons";font-size:90px;color:#8476A9;text-shadow:none}.imagify-modal-promotion p{position:relative;margin:.2em 0;color:#FFF}.imagify-promo-title{-ms-flex-preferred-size:100%;flex-basis:100%;text-transform:uppercase;font-size:20px;font-weight:bold;letter-spacing:0.125em}.imagify-until-date{-ms-flex-preferred-size:200px;flex-basis:200px;text-align:right}.imagify-until-date strong{color:#FFF}.imagify-submit-line button{font-size:16px}input.imagify-coupon-code{padding:10px;border:2px solid #7A8996;font-size:0.875em;font-weight:bold;border-radius:3px}.validated.imagify-coupon-section .imagify-coupon-text,.validated.imagify-coupon-section strong{color:#8BC34A}.validated.imagify-coupon-section .imagify-coupon-code{color:#8BC34A;border-color:#8BC34A}.invalid.imagify-coupon-section .imagify-coupon-text,.invalid.imagify-coupon-section strong{color:#d0021b}.invalid.imagify-coupon-section .imagify-coupon-code{color:#d0021b;border-color:#d0021b}.imagify-footer-lines{width:500px;max-width:100%;margin:2em auto 2.5em;font-size:0.85em;line-height:1.5}.imagify-year-selected .imagify-switch-my .imagify-yearly{display:block}.imagify-year-selected .imagify-switch-my .imagify-monthly{display:none}.imagify-month-selected .imagify-switch-my .imagify-yearly{display:none}.imagify-month-selected .imagify-switch-my .imagify-monthly{display:block}.imagify-flex-table{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.imagify-flex-table > *{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:7px 15px}div.imagify-col-details{width:22%;padding-left:25px}.imagify-col-details p{margin:0}.imagify-pricing-table{margin:0 20px}.imagify-pricing-table .imagify-offer-line{padding:.6em 0;border:2px solid #E8EEF0;text-align:left;border-radius:3px}.imagify-pricing-table .imagify-offer-line:first-child{margin-top:.75em}.imagify-pricing-table .imagify-offer-line.imagify-offer-selected:first-child{margin-top:1.75em}.imagify-pricing-table .imagify-offer-line + .imagify-offer-line{margin-top:-2px}.imagify-pricing-table .imagify-col-other-actions{width:20.5%}.imagify-pricing-table .imagify-approx{margin-left:0;line-height:0.5;margin-bottom:1em}.imagify-pricing-table .imagify-offer-selected{-webkit-transform:scale(1.03);transform:scale(1.03);background:#40B1D0;border-width:0}.imagify-pricing-table .imagify-offer-selected .imagify-approx{color:#FFF}.imagify-pricing-table .imagify-button-secondary{padding:3px 20px;box-shadow:none;text-transform:uppercase;font-size:12px;letter-spacing:0.025em}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary{border:2px solid #FFF;background:#40B1D0;box-shadow:none;text-shadow:none!important}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:hover,.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:focus{background:#FFF;color:#40B1D0}.imagify-col .imagify-special-needs{margin-left:25px}.imagify-special-needs strong{font-size:25px;font-weight:bold;color:#40B1D0}.imagify-special-needs span{display:block;font-size:12px;margin-top:-.5em}div.imagify-col-price{position:relative}.imagify-recommend{display:none;position:absolute;left:-20px;bottom:100%;padding:0;margin-bottom:8px;color:#1F2332;font-weight:bold;font-style:italic}.imagify-offer-selected .imagify-recommend{display:block}[class*="imagify-onetime-"] .imagify-recommend{left:65px;margin-bottom:20px}.imagify-recommend:before{content:"";position:absolute;top:7px;left:-35px;width:29px;height:30px;background:url("../images/icon-arrow-choice.png") scroll 0 no-repeat;background-size:contain}@media only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.imagify-recommend:before{background-image:url("../images/icon-arrow-choice.svg")}}.imagify-offer-line[class*="imagify-onetime-"]{padding:0;margin:.3em 0 0}.imagify-offer-line.imagify-offer-line[class*="imagify-onetime-"]:first-child{margin-top:2em}.imagify-offer-line[class*="imagify-onetime-"] + .imagify-offer-line{margin-top:.5em}.imagify-offer-selected.imagify-offer-line[class*="imagify-onetime-"]{-webkit-transform:scale(1);transform:scale(1);border-width:2px}.imagify-offer-line[class*="imagify-onetime-"] .imagify-col-details{position:relative;overflow:hidden;width:21%;background:#1F2332;color:#FFF}.imagify-offer-selected.imagify-offer-line[class*="imagify-onetime-"] .imagify-col-details{background:#338EA6}.imagify-offer-line[class*="imagify-onetime-"] .imagify-col-details:before{content:"";position:absolute;bottom:0;right:25px;width:75px;height:54px;background:url("../images/icon-pack.png")}.imagify-offer-line[class*="imagify-onetime-"] .imagify-col-other-actions{width:30%}.imagify-offer-line[class*="imagify-onetime-"] .imagify-offer-size,.imagify-offer-line[class*="imagify-onetime-"] .imagify-approx{color:#FFF}.imagify-offer-line[class*="imagify-onetime-"] .imagify-offer-size{font-size:24px}.imagify-offer-line[class*="imagify-onetime-"] .imagify-approx{font-size:12px}.imagify-offer-line[class*="imagify-onetime-"] .imagify-price-block{padding-left:10px}.imagify-offer-line[class*="imagify-onetime-"] .imagify-dollars{vertical-align:middle}.imagify-offer-line[class*="imagify-onetime-"] .imagify-price-big{vertical-align:-5px}.imagify-offer-line[class*="imagify-onetime-"] .imagify-price-mini{vertical-align:7px}.imagify-tabs{margin-bottom:0;list-style:none;background:#E5EBEF}.imagify-modal-content .imagify-tabs{margin:1em 0 0}.imagify-tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;width:50%;margin:0;font-size:23px}.imagify-tab a{display:block;padding:15px 10px;color:inherit;text-decoration:none}.imagify-tab a:focus{box-shadow:none;outline:none;color:#40B1D8}.imagify-tab.imagify-current a{background:#F6F7FB}.imagify-tab-content.imagify-current{display:block}.imagify-tab-content{display:none}.imagify-tab-content .imagify-modal-section:first-child{margin-top:0}.imagify-modal-sidebar-content,.imagify-payment-modal .imagify-modal-sidebar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.imagify-modal-sidebar-content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}p.imagify-modal-sidebar-title{margin-top:5px;padding-right:40px;font-size:18px;color:#FFF}.imagify-modal-testimony{margin-top:1em}.imagify-modal-testimony + .imagify-modal-testimony{margin-top:2em}@media (max-height:620px){.imagify-modal-testimony + .imagify-modal-testimony{display:none}}.imagify-modal-testimony-person{display:table;width:100%}.imagify-modal-testimony-person > *{display:table-cell;vertical-align:middle}.imagify-modal-avatar{width:114px;line-height:0}.imagify-modal-avatar img{border:2px solid #FFF;border-radius:50%;width:96px;height:96px}.imagify-modal-identity a{text-decoration:none;font-weight:bold}.imagify-modal-identity a:first-child{font-size:13px}.imagify-modal-identity a:first-child + a{display:block;font-size:10px;color:#7A8996}.imagify-modal-testimony-content p{font-size:13px;font-style:italic;line-height:1.7;color:#7A8996}.imagify-modal-sidebar-trust{margin-top:auto;padding-top:1.5em}.imagify-modal-sidebar-trust p{margin:0;font-weight:bold;font-size:12px;line-height:1.7}.imagify-modal-sidebar-trust p img{margin-right:3px;vertical-align:-2px}.imagify-modal-sidebar-trust p + p{font-size:11px}.imagify-cart{text-align:left}.imagify-cart .imagify-cart-list{border-top:1px solid rgba(122,137,150,.2);border-bottom:1px solid rgba(122,137,150,.2)}.imagify-cart .imagify-cart-label{margin-bottom:0.5em;font-size:10px;color:#2E3243}.imagify-cart-list p{margin:0;font-weight:bold}.imagify-cart-item{margin:.4em 0}.imagify-cart .imagify-cart-suggestion{margin-top:-.3em}.imagify-cart-suggestion a,.imagify-cl-description p{font-size:10px}.imagify-remove-from-cart{border:0;padding:0;width:14px;height:14px;line-height:13px;border-radius:50%;background:#40B1D0;cursor:pointer;transition:background .3s}.imagify-remove-from-cart i:before{position:relative;top:-6px;left:-3px;font-size:13px;color:#FFF}.imagify-remove-from-cart:hover,.imagify-remove-from-cart:focus{background:#D0021B}.imagify-cart .imagify-cl-remove{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:45px}.imagify-cart .imagify-cl-name{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:200px}.imagify-cart .imagify-cl-description{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:10px}.imagify-cart .imagify-cl-price{text-align:right}#imagify-payment-iframe{width:980px;height:672px;background:#f6f7fb url(../images/loader-balls.svg) 50% 50% no-repeat}.imagify-success-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;height:100%}.imagify-success-view p{font-weight:bold;font-size:16px}.imagify-cart-emptied-item{margin:.3em auto;padding:6px 20px;background:#E6EBEF;border-radius:20px}.imagify-cart-emptied-item.imagify-cart-emptied-item p{font-weight:bold}.imagify-cart-emptied-item a{color:#40b1d0;float:right;font-weight:bold}
|
1 |
+
.imagify-cell,.imagify-cell.va-top,.va-top .imagify-cell{vertical-align:top}#imagify-overview-chart-legend,.imagify-oh,body.imagify-modal-is-open{overflow:hidden}.imagify-start{float:left}.imagify-end{float:right}.imagify-txt-start.imagify-txt-start.imagify-txt-start{text-align:left}.imagify-txt-center.imagify-txt-center.imagify-txt-center{text-align:center}.imagify-txt-end.imagify-txt-end.imagify-txt-end{text-align:right}.imagify-mt1.imagify-mt1{margin-top:1em}.imagify-mb1.imagify-mb1{margin-bottom:1em}.imagify-mr1.imagify-mr1{margin-right:1em}.imagify-ml2.imagify-ml2{margin-left:2em}.imagify-mr2.imagify-mr2{margin-right:2em}.imagify-pl0.imagify-pl0.imagify-pl0{padding-left:0}.imagify-pr1.imagify-pr1{padding-right:1em}.imagify-clear{clear:both}.imagify-clearfix:after,.imagify-inline-options:after{content:"";display:table;clear:both}.imagify-count.imagify-count{counter-reset:num}.imagify-count .imagify-count-title{font-weight:700}.imagify-default-settings{color:#73818c;font-weight:400}.imagify-count .imagify-count-title:before{counter-increment:num 1;content:counter(num) ". "}.imagify-table{display:table;width:100%}.imagify-cell{display:table-cell;padding:10px}.imagify-bulk-submit .imagify-cell{padding-top:0}.imagify-plugins-error{overflow:hidden;padding-left:20px;list-style-type:disc}.imagify-plugins-error li{width:300px;line-height:30px}@media (max-width:570px){.imagify-plugins-error li{width:auto}}.imagify-notice-dismiss.notice-dismiss{text-decoration:none}.imagify-spinner{display:inline-block;width:20px;height:20px;margin-right:5px;vertical-align:middle;background:url(../images/spinner.gif) 0 0/20px 20px no-repeat rgba(0,0,0,0);opacity:.7}.spinner.imagify-hidden{width:0;margin:4px 0 0}.misc-pub-section.misc-pub-imagify h4{font-size:14px;margin-top:5px;margin-bottom:0}.imagify-sweet-alert button{margin-top:17px!important;height:45px!important;letter-spacing:3px;text-transform:uppercase!important;border-radius:3px!important;background-color:#40b1d0!important;-webkit-box-shadow:0 3px 0 #338ea6!important;box-shadow:0 3px 0 #338ea6!important}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{background:#777!important;-webkit-box-shadow:0 3px 0 #444!important;box-shadow:0 3px 0 #444!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup button{width:100%;padding:0!important}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}#wpwrap{-webkit-transition:all .4s;-o-transition:all .4s;transition:all .4s}.stop-scrolling #wpwrap{-webkit-filter:blur(2px);filter:blur(2px)}.stop-scrolling #wpwrap #wpadminbar{top:-32px}.imagify-primary.imagify-primary.imagify-primary{color:#40b1d0}.imagify-secondary.imagify-secondary.imagify-secondary{color:#8cc152}#imagify-check-api-container{font-weight:700}#imagify-check-api-container .dashicons{font-size:25px}#imagify-check-api-container .dashicons-no:before{color:#f06e57;vertical-align:-1px}#imagify-check-api-container .dashicons-yes:before{color:#8BC34A;vertical-align:-1px}.imagify-valid{color:#8BC34A}.imagify-chart{width:33.33%;position:relative}.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:14px;font-weight:600;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%}.button-text,.imagify-bulk-info p{display:inline-block}.imagify-chart{float:left;margin-bottom:20px}td .imagify-chart{float:none;margin-bottom:0;top:4px}.imagify-chart-container{position:relative;width:180px;float:left;margin-right:20px}.imagify-global-optim-phrase{width:180px;padding-top:20px;font-size:14px;font-weight:700;text-align:center}.imagify-total-percent{color:#46b1ce}td .imagify-chart-container{width:18px;height:18px;float:none;margin-right:10px}.imagify-chart-percent{position:absolute;left:0;right:0;top:50%;margin-top:-14px;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 .notice,.settings_page_imagify .notice,body[class*="_imagify-ngg-bulk-optimization"] .notice{margin-right:20px;margin-left:2px}.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%;margin:0;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{width:auto;padding:0 5px;line-height:1.85;font-size:12px}.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{width:1px;height:22px;margin-top:0;background:#46B1CE;border-radius:0;overflow:visible;-webkit-transition:width .5s;-o-transition:width .5s;transition:width .5s}.imagify-settings .button,.imagify-settings a,.imagify-settings input,.imagify-welcome .button,.imagify-welcome a,.imagify-weolcome input{-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-settings a{color:#40b1d0}.imagify-options-title{padding-bottom:.5em;border-bottom:3px solid #F2F2F2;font-size:13px;font-weight:500;text-transform:uppercase;letter-spacing:.025em;color:#40b1d0}.imagify-settings,.imagify-settings p,.imagify-settings th{color:#5F758E}@media (max-width:782px){.imagify-settings .form-table th{padding-top:2em;padding-bottom:.5em}}.imagify-settings .form-table td{vertical-align:top}.button .dashicons,.button-text,.imagify-button-primary.imagify-button-primary .dashicons,.imagify-button-secondary.imagify-button-secondary .dashicons,.imagify-button.imagify-button .dashicons,.imagify-notice .button .dashicons,.imagify-settings .button .dashicons,.imagify-welcome .button .dashicons{vertical-align:middle}.imagify-settings .form-table th span{cursor:pointer}.imagify-middle th{padding-top:35px}.imagify-button-primary.imagify-button-primary,.imagify-button-secondary.imagify-button-secondary,.imagify-button.imagify-button,.imagify-notice .button,.imagify-settings .button,.imagify-welcome .button{height:auto;padding:8px 20px;border:0;font-size:14px;font-weight:600;-webkit-box-shadow:0 3px 0 rgba(0,0,0,.15);box-shadow:0 3px 0 rgba(0,0,0,.15);border-radius:3px;cursor:pointer;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-notice .button-mini{padding:2px 10px;font-size:13px}.button-primary.button-mini{padding:2px 10px}.imagify-settings .button.button-mini-flat{padding:3px 6px 5px;font-size:12px;-webkit-box-shadow:none!important;box-shadow:none!important;line-height:1.2}.imagify-settings .button.button-mini-flat:focus,.imagify-settings .button.button-mini-flat:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-button-ghost.imagify-button-ghost,.imagify-title .button-ghost.button-ghost{padding:2px 9px;border:1px solid #40B1D0;font-size:12px;font-weight:400;color:#40B1D0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover,.imagify-title .button-ghost.button-ghost:focus,.imagify-title .button-ghost.button-ghost:hover{border-color:transparent;color:#000;background:#40B1D0}.imagify-button-ghost.imagify-button-ghost:focus,.imagify-button-ghost.imagify-button-ghost:hover{color:#FFF}.imagify-button-medium.imagify-button-medium{text-transform:uppercase;letter-spacing:.1em;padding:3px 10px;font-weight:700}.imagify-button-medium.imagify-button-ghost{border-width:2px}.button .dashicons{margin-right:5px}.imagify-button-primary.imagify-button-primary,.imagify-settings .button-primary.button-primary,.imagify-welcome .button-primary.button-primary{background:#40B1D0;color:#FFF;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1);text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799!important}.imagify-button-secondary.imagify-button-secondary{background:#8BC34A;color:#FFF;-webkit-box-shadow:0 3px 0 #6F9C3B;box-shadow:0 3px 0 #6F9C3B;text-shadow:0 -1px 1px #6F9C3B,1px 0 1px #6F9C3B,0 1px 1px #6F9C3B!important}.imagify-button-primary.imagify-button-primary:focus,.imagify-button-primary.imagify-button-primary:hover,.imagify-settings .button-primary:focus,.imagify-settings .button-primary:hover,.imagify-welcome .button-primary:focus,.imagify-welcome .button-primary:hover{background:#338ea6;-webkit-box-shadow:0 3px 0 #1f7a92;box-shadow:0 3px 0 #1f7a92}.imagify-button-secondary.imagify-button-secondary:focus,.imagify-button-secondary.imagify-button-secondary:hover{background:#6F9C3B;color:#FFF}.imagify-button-light.imagify-button-light{background:#FFF;color:#4a4a4a;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.2);box-shadow:0 2px 0 rgba(0,0,0,.2)}.imagify-button-light.imagify-button-light:focus,.imagify-button-light.imagify-button-light:hover{color:#FFF;background:rgba(0,0,0,.2)}.imagify-section-positive .imagify-button-light{color:#709A41}.imagify-button.imagify-button-big{font-size:15px;padding:11px 30px}.imagify-button-big .dashicons{font-size:1.45em;margin-right:6px;margin-left:-4px}.imagify-info,.imagify-logo{vertical-align:top}#imagify-bulk-action{padding:11px 20px}.media-frame-content .imagify-button-primary,.wp_attachment_image .imagify-button-primary{float:left;padding:0 10px 1px;margin:0 5px 2px 0;font-size:13px;line-height:26px;-webkit-box-shadow:0 3px 0 rgba(51,142,166,1);box-shadow:0 3px 0 rgba(51,142,166,1)}.imagify-settings input[type=text]{color:#4A4A4A;font-weight:600;-webkit-box-shadow:none;box-shadow:none}.imagify-settings div.submit.submit{padding-left:235px;padding-top:40px}.imagify-settings p.submit{float:left;margin-top:0}.imagify-settings p.submit .button{margin:0 5px}@media (max-width:850px){.imagify-settings div.submit{padding-left:0}.imagify-settings p.submit{text-align:center}}.imagify-title.imagify-title{position:relative;padding:30px 50px;font-size:23px;background:#2E3243;color:#FFF}.imagify-settings .imagify-title+.imagify-notice{margin:0;border-right:1px solid #D9D9D9;padding-top:15px;padding-bottom:15px}.imagify-section,.imagify-settings div.submit,.imagify-sub-header,.imagify-sub-title.imagify-sub-title{margin:0;padding:20px;background:#F2F5F7}.imagify-section-positive,.imagify-sub-title.imagify-sub-title{padding-left:40px}.imagify-section-positive{background:#8cc152;color:#FFF}.imagify-section-positive p{color:#FFF}.imagify-section-gray{background:#D9E4EB}.imagify-section-gray .imagify-count-title{color:#4a4a4a}.imagify-section p:first-child{margin-top:0}.imagify-section p:last-child{margin-bottom:0}p.imagify-section-title.imagify-section-title{font-size:20px;margin-top:-.3em;margin-bottom:-.6em}.imagify-bulk-info{margin:1em 1em 1em 5px;-webkit-transition:margin .3s;-o-transition:margin .3s;transition:margin .3s}@media (max-width:850px){.imagify-bulk-info{margin:1em}}.imagify-bulk-info p{text-align:left;width:400px;max-width:100%;font-weight:700}@media (min-width:1500px){.imagify-settings div.submit{display:table;width:100%}.imagify-settings div.submit>*{display:table-cell;vertical-align:middle}.imagify-bulk-info{padding:0 25px;text-align:right}}.imagify-settings div.submit{margin-top:2em;padding:20px 0}.imagify-notice .imagify-rate-us .stars,.imagify-sub-header .form-table{margin:0}.imagify-sub-header th{text-align:right}.imagify-sub-header td,.imagify-sub-header th{padding-top:0;padding-bottom:0}[for=api_key]{padding-top:5px}.imagify-notice .imagify-rate-us.imagify-rate-us{position:relative;bottom:0;right:0;text-align:left}.imagify-rate-us.imagify-rate-us{position:absolute;bottom:50%;right:20px;text-align:right;margin-bottom:-2.4em;color:#FFF}.imagify-rate-us a{color:#40B1D0}.imagify-rate-us .stars{display:inline-block;margin:2px 0 0 10px;text-decoration:none;letter-spacing:.2em;vertical-align:-1px}.imagify-rate-us .stars .dashicons:before{font-size:18px}.imagify-rate-us a:focus,.imagify-rate-us a:hover{color:#FEE102}@media (max-width:1220px){.imagify-rate-us.imagify-rate-us{position:static;margin-bottom:0;text-align:left}.imagify-rate-us.imagify-rate-us br{display:none}.imagify-rate-us .stars{display:block;margin-left:0}}.imagify-rkt-notice.imagify-rkt-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center;padding:10px 45px 10px 0;border:0;-webkit-box-shadow:none;box-shadow:none;color:#FFF;background:#412355}.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:2px;margin-right:20px}@media (max-width:782px){.media_page_imagify-bulk-optimization .imagify-rkt-notice{margin-left:0;margin-right:12px}}.imagify-rkt-notice .imagify-cross{position:absolute;right:8px;top:50%;width:22px;height:22px;padding:0;margin-top:-11px;background:0 0;color:#FD7300;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross .dashicons{position:relative;top:2px;left:1px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-rkt-notice .imagify-cross:hover{background:#FFF}.imagify-rkt-notice .imagify-cross:hover .dashicons{color:#412355}.imagify-rkt-notice .imagify-rkt-coupon,.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo{-ms-flex-negative:0;flex-shrink:0}.imagify-rkt-notice .imagify-rkt-logo{width:150px!important;text-align:center;padding:0 25px 0 30px;line-height:.8}.imagify-rkt-notice .imagify-rkt-msg{width:100%!important;padding:0 15px;font-size:14px;line-height:1.6}.imagify-rkt-notice .imagify-rkt-coupon{width:150px!important;padding:0 15px}.imagify-rkt-notice .imagify-rkt-coupon-code{padding:5px 10px;font-size:23px;font-weight:700;border:1px dashed #F7A933;color:#F7A933}.imagify-rkt-notice .imagify-rkt-cta{width:250px!important;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:200px;flex-basis:200px}.imagify-rkt-notice .button.button{position:relative;top:-1px;height:auto;font-weight:600;font-size:14px;-webkit-box-shadow:0 4px 0 #B27A27;box-shadow:0 4px 0 #B27A27;border:0;padding:9px 18px;background:#F7A933;text-shadow:1px 1px 1px rgba(0,0,0,.2)}@media (max-width:880px){.imagify-rkt-notice{-ms-flex-wrap:wrap;flex-wrap:wrap}.imagify-rkt-notice .imagify-rkt-cta,.imagify-rkt-notice .imagify-rkt-logo,.imagify-rkt-notice .imagify-rkt-msg{text-align:left;padding:5px 15px}.imagify-cross.imagify-cross{top:8px;margin-top:0}.imagify-rkt-notice .imagify-cross .dashicons{top:1px}}.imagify-settings-section{padding:10px 20px}.imagify-welcome .imagify-settings-section,[id=imagify-settings]{border:1px solid #D9D9D9;border-top:0 none;background:#FFF}.imagify-br{line-height:2}.imagify-important{color:#F5A623}.imagify-info,.imagify-info a{color:#40B1D0;font-size:12px}.imagify-info{position:relative;display:inline-block;padding-left:25px}.imagify-info .dashicons{position:absolute;left:0;top:-1px}.imagify-visual-label,label+.imagify-info,label+.imagify-options-line{display:inline-block;max-width:70%;margin-left:15px;margin-top:2px!important;-webkit-transition:opacity .3s;-o-transition:opacity .3s;transition:opacity .3s}.imagify-visual-label{vertical-align:-5px}label[for=imagify_sizes_full]+.imagify-info{vertical-align:middle}.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:not(:checked)+label+.imagify-options-line{opacity:.5}.imagify-settings.imagify-settings [type=checkbox]:checked+label .imagify-visual-label,.imagify-settings.imagify-settings [type=checkbox]:checked+label+.imagify-options-line{opacity:1}.imagify-checkbox-marged{max-width:500px;margin-left:45px}.imagify-checkbox.imagify-checkbox:checked,.imagify-checkbox.imagify-checkbox:not(:checked),.imagify-settings.imagify-settings [type=checkbox]:checked,.imagify-settings.imagify-settings [type=checkbox]:not(:checked){opacity:.01}.imagify-checkbox.imagify-checkbox:checked:focus,.imagify-checkbox.imagify-checkbox:not(:checked):focus,.imagify-settings.imagify-settings [type=checkbox]:checked:focus,.imagify-settings.imagify-settings [type=checkbox]:not(:checked):focus{-webkit-box-shadow:none!important;box-shadow:none!important;outline:0!important;border:0!important}.imagify-checkbox.imagify-checkbox:checked+label,.imagify-checkbox.imagify-checkbox:not(:checked)+label,.imagify-settings [type=checkbox]:checked+label,.imagify-settings [type=checkbox]:not(:checked)+label{position:relative;padding-left:6px;cursor:pointer;vertical-align:top}.imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-checkbox.imagify-checkbox:not(:checked)+label:before,.imagify-settings [type=checkbox]:checked+label:before,.imagify-settings [type=checkbox]:not(:checked)+label:before{content:'';position:absolute;left:0;top:0;width:28px;height:28px;margin:0 0 0 -24px;border:2px solid #8BA6B4;background:#FFF;border-radius:4px}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:checked+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{content:"✓";position:absolute;font-size:1.4em;top:3px;left:-16px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.imagify-checkbox.imagify-checkbox[disabled]:checked+label:before,.imagify-checkbox.imagify-checkbox[disabled]:not(:checked)+label:before,.imagify-settings [type=checkbox][disabled]:checked+label:before,.imagify-settings [type=checkbox][disabled]:not(:checked)+label:before{border-color:#ccc;background:#ddd}.imagify-checkbox.imagify-checkbox:not(:checked)+label:after,.imagify-settings [type=checkbox]:not(:checked)+label:after{opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}.imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-settings [type=checkbox]:checked+label:after{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}input[id^=imagify_sizes_]:checked+label{font-weight:700}.medium.imagify-checkbox:checked+label:before,.medium.imagify-checkbox:not(:checked)+label:before{width:22px;height:22px;border-width:1.5px;border-radius:2px;margin-top:0}.medium.imagify-checkbox:checked+label:after,.medium.imagify-checkbox:not(:checked)+label:after{font-size:1.1em;left:-17px;top:3px}.imagify-settings .mini[type=checkbox]:checked+label:before,.imagify-settings .mini[type=checkbox]:not(:checked)+label:before,.mini.imagify-checkbox:checked+label:before,.mini.imagify-checkbox:not(:checked)+label:before{width:15px;height:15px;border-width:1px;border-radius:2px;margin-top:0}.imagify-settings .mini[type=checkbox]:checked+label:after,.imagify-settings .mini[type=checkbox]:not(:checked)+label:after,.mini.imagify-checkbox:checked+label:after,.mini.imagify-checkbox:not(:checked)+label:after{font-size:.9em;left:-21px;top:1px}.imagify-checkbox.imagify-checkbox:checked:focus+label:before,.imagify-checkbox.imagify-checkbox:not(:checked):focus+label:before,.imagify-settings [type=checkbox]:checked:focus+label:before,.imagify-settings [type=checkbox]:not(:checked):focus+label:before{border-style:dotted;border-color:#40b1d0}.imagify-inline-options{position:relative;display:table;width:100%;max-width:600px;border-collapse:collapse}.imagify-small-options{width:300px;margin:1em auto .5em;background:#338EA6;border-radius:4px}.imagify-inline-options input[type=radio]:checked,.imagify-inline-options input[type=radio]:not(:checked){position:absolute;left:5px;top:5px;display:none}.imagify-inline-options input[type=radio]:checked+label,.imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;display:table-cell;padding:13px 10px;text-align:center;font-weight:600;font-size:16px;text-transform:uppercase;letter-spacing:.1em;color:#FFF;background:#2E3243;border-left:1px solid rgba(255,255,255,.2);-webkit-box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);box-shadow:0 -3px 0 rgba(0,0,0,.1) inset,inset -1px 0 0 rgba(255,255,255,.2);z-index:2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-small-options input[type=radio]:checked+label,.imagify-small-options input[type=radio]:not(:checked)+label{padding:8px 10px;font-size:13px;color:#FFF;-webkit-box-shadow:none;box-shadow:none;border-left:0}.imagify-bulk-submit .imagify-inline-options input[type=radio]:checked+label,.imagify-bulk-submit .imagify-inline-options input[type=radio]:not(:checked)+label{margin-bottom:1.75em}.imagify-inline-options input[type=radio]:checked+label:first-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:first-of-type{border-radius:3px 0 0 3px}.imagify-inline-options input[type=radio]:checked+label:last-of-type,.imagify-inline-options input[type=radio]:not(:checked)+label:last-of-type{border-radius:0 3px 3px 0}.imagify-inline-options input[type=radio]:checked+label{background:#8BC34A}.imagify-small-options input[type=radio]:not(:checked)+label{background:#338EA6;color:rgba(255,255,255,.4)}.imagify-small-options input[type=radio]:checked+label{background:#40B1D0}.imagify-inline-options .imagify-info{margin-top:15px}.imagify-btn-info{display:block;font-size:.7em;letter-spacing:0;line-height:1;text-transform:none}.imagify-datas-more-action a,a.btn-rocket{text-transform:uppercase;text-decoration:none}#describe-resize-larger input{width:5em}.imagify-cols:after{content:"";display:table;clear:both}.imagify-col{float:left;width:50%}.imagify-main{float:left;width:70%}.imagify-sidebar{float:right;width:28%;max-width:300px}.imagify-sidebar-section{border:1px solid #BBB;background:#FFF}.imagify-sidebar-section+.imagify-sidebar-section{margin-top:2em}@media (max-width:820px){.imagify-main,.imagify-sidebar{float:none;width:auto}.imagify-settings{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-sidebar{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;max-width:none;margin-left:0;margin-top:25px}.wp-media-products{text-align:center}.wp-media-products li{display:inline-block;width:100%;max-width:276px}}@media (min-width:1400px){.imagify-main{width:74%}}.imagify-sidebar-title{display:block;padding:20px 15px;border-bottom:1px solid #BBB;font-size:14px;font-weight:700;color:#23282d;background:#F2F5F7}.imagify-sidebar-title img{vertical-align:top;margin-right:5px}.imagify-sidebar .wp-media-products{margin-top:0;margin-bottom:-.5em}.imagify-sidebar .wp-media-products .links{display:block;padding:85px 25px 24px;text-align:center;background-color:#2E3243;background-size:contain;background-repeat:no-repeat;background-position:50% 0;text-decoration:none}.imagify-sidebar .wp-media-products .links p{margin:1.5em auto;color:#FFF}.imagify-sidebar .wp-media-products .wprocket-link{background-image:-o-linear-gradient(top,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-image:linear-gradient(to bottom,rgba(59,30,78 ,0),rgba(59,30,78 ,0) 130px,rgba(59 ,30 ,78 ,1) 210px),url(../images/sidebar-wp-rocket.jpg);background-color:#3B1E4E;background-repeat:repeat-x,no-repeat}.imagify-sidebar-content{padding:10px 20px}.imagify-mark-styled{display:inline-block;padding:1px 2px 1px 4px;line-height:1.3;font-weight:700;background:#F7A933;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);transform:rotateZ(-2deg) rotateX(-10deg) skewX(-2deg) skewY(-3deg);text-shadow:1px 1px 0 rgba(0,0,0,.2)}.imagify-mark-styled span{display:inline-block;-webkit-transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg);transform:rotateZ(2deg) rotateX(10deg) skewX(2deg) skewY(3deg)}.imagify-discount-code,a.btn-rocket{display:block;text-shadow:1px 1px 0 rgba(0,0,0,.2);font-weight:700}.imagify-discount-code{margin:.35em 0 .5em;font-size:2em;letter-spacing:.05em;text-align:center}.imagify-big-text{font-size:15px;font-weight:700}.imagify-big-text strong{font-size:20px}a.btn-rocket{font-size:1.15em;padding:12px;background:#F7A933;-webkit-box-shadow:0 3px 0 #D69626;box-shadow:0 3px 0 #D69626;border-radius:3px;color:#FFF}a.btn-rocket:focus,a.btn-rocket:hover{background:#ff8c00;-webkit-box-shadow:0 3px 0 #ff8c00;box-shadow:0 3px 0 #ff8c00}.imagify-welcome{margin:30px 20px 0 0}.imagify-welcome .baseline{display:inline-block;margin:.2em 0 0 2em;font-size:17px}.imagify-welcome .imagify-logo{vertical-align:middle}.imagify-welcome-remove{position:absolute;top:50%;right:15px;margin-top:-8px;color:#FFF;text-decoration:none}.imagify-columns{overflow:hidden;padding:15px 0;counter-reset:cols}.imagify-columns [class^=col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-columns .col-1-3{width:33.333%;padding-left:28px}.imagify-columns .col-2-3{width:66.666%;padding-left:28px}.imagify-columns .col-1-2{width:50%;padding:0 20px}.imagify-columns .col-overview{padding-left:20px}.imagify-columns .col-informations{width:36.6%;padding-right:30px}.imagify-columns .col-statistics{width:30%}@media (max-width:830px){.imagify-columns [class^=col-]{float:none;margin-bottom:1.5em}.imagify-columns .col-1-2,.imagify-columns .col-1-3{width:auto;padding:0 28px;clear:both;padding-top:1em}}.imagify-columns [class^=col-] img{float:left;margin-right:18px}.imagify-col-content{overflow:hidden}.imagify-col-title{margin:0 0 15px;font-size:23px}.counter .imagify-col-title:before{counter-increment:cols;content:counter(cols) ". ";color:#40B1D0}.imagify-col-desc{color:#5F758E;margin-bottom:2em}.imagify-notice.imagify-notice{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;padding:0;margin:10px 20px 10px 2px;border:0;background:#2E3243;-webkit-box-shadow:none;box-shadow:none;color:#FFF}@media (max-width:782px){.imagify-notice.imagify-notice,.imagify-welcome{margin-right:12px}}@media (max-width:450px){.imagify-notice.imagify-notice{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wrap .imagify-notice{margin:5px 15px 2px;position:relative}.imagify-notice-logo{padding:18px 23px;background:#40B1D0}.updated .imagify-notice-logo{background:#8BC34A}.error .imagify-notice-logo{background:#D0021B}.imagify-popin-message{padding:5px 15px;text-align:left}.imagify-popin-message.imagify-error p{color:#FFF}.imagify-notice-title{font-size:15px}.imagify-notice-content{padding:5px 23px}.imagify-notice-content.imagify-notice-content p{margin:.65em 0}.imagify-notice a{color:#40B1D0}.imagify-notice a:focus,.imagify-notice a:hover{color:#FEE102}.imagify-notice code{background:rgba(0,0,0,.4)}.column-imagify_optimized_file.column-imagify_optimized_file{width:300px;text-align:center;vertical-align:middle}.column-imagify_optimized_file>*{max-width:235px;margin:0 auto}ul.imagify-datas-list.imagify-datas-list{margin:0 auto;color:#555;font-size:10px}.compat-field-imagify .label{vertical-align:top}.compat-field-imagify ul.imagify-datas-list{margin-top:7px;font-size:11px}ul.imagify-datas-list .big{font-size:12px;color:#40B1D0}.imagify-data-item{overflow:hidden}.imagify-data-item .imagify-chart{display:inline-block;top:1px;width:20px;vertical-align:middle;margin-bottom:0}li.imagify-data-item{clear:both;margin-bottom:2px}ul.imagify-datas-list .imagify-data-item span.data,ul.imagify-datas-list .imagify-data-item strong{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}ul.imagify-datas-list .imagify-data-item span.data{text-align:left;padding-right:5px}.compat-field-imagify .imagify-datas-list .imagify-data-item .data{width:130px;text-align:left;font-weight:700}.media-sidebar .imagify-datas-list .imagify-data-item .data,.media-sidebar .imagify-datas-list .imagify-data-item strong{width:auto;float:none}ul.imagify-datas-list .imagify-data-item strong{text-align:left;padding-left:5px}.imagify-datas-more-action.imagify-datas-more-action{margin:.4em auto;background:-webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(49%,transparent),color-stop(50%,rgba(0,0,0,.075)),color-stop(58%,rgba(0,0,0,.075)),color-stop(58%,transparent),to(transparent));background:-o-linear-gradient(top,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent);background:linear-gradient(to bottom,transparent,transparent 49%,rgba(0,0,0,.075) 50%,rgba(0,0,0,.075) 58%,transparent 58%,transparent)}.imagify-datas-more-action a{display:inline-block;padding:0 5px;background:#40B1D0;color:#FFF;font-size:9px;font-weight:700;line-height:1.9}.imagify-datas-more-action a.is-open{background:#555}.imagify-datas-more-action a.is-open .dashicons{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.imagify-datas-more-action a .dashicons{font-size:14px;vertical-align:middle;line-height:.8}.imagify-datas-more-action .the-text,.imagify-datas-more-action a .dashicons:before{line-height:20px;vertical-align:middle}.imagify-datas-more-action .the-text{display:inline-block;height:20px}ul.imagify-datas-details.imagify-datas-details{margin:.7em auto}.imagify-datas-details strong{color:#40B1D0}.imagify-datas-details .original{color:#555}.imagify-datas-actions-links{overflow:hidden;border-top:2px solid transparent;padding-top:5px;font-size:8px}.imagify-datas-actions-links a{position:relative;display:inline-block;padding-left:17px;text-decoration:none;font-weight:600}.compat-field-imagify .imagify-datas-actions-links{max-width:300px}.misc-pub-imagify .imagify-datas-actions-links{border-top:2px solid #f2f2f2;padding-bottom:5px}.compat-field-imagify .imagify-datas-actions-links a,.misc-pub-imagify .imagify-datas-actions-links a{font-size:10px;float:left;width:50%}.media-sidebar .compat-field-imagify .imagify-datas-actions-links a,.submitbox .misc-pub-imagify .imagify-datas-actions-links a{display:block;width:auto;float:none}.column-imagify_optimized_file .imagify-datas-actions-links a{margin:0 .7em;padding-left:15px}.imagify-datas-actions-links a:only-child{float:none;width:auto}.imagify-datas-details.is-open+.imagify-datas-actions-links{border-top-color:rgba(0,0,0,.075)}.imagify-datas-actions-links .dashicons{position:absolute;left:0;top:4px;width:12px;margin-right:2px;font-size:11px}.imagify-title>h1{padding:0}.imagify-title-right{display:table;float:right;margin-top:-10px}.imagify-title-right p{margin:0}.imagify-title-right a{font-weight:700;text-decoration:none}.imagify-title-right>div{display:table-cell;vertical-align:middle}.imagify-title-right .dashicons-arrow-down-alt2{vertical-align:-4px;margin-left:2px}@media (max-width:1200px){.imagify-bulk .imagify-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-title-right{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-top:20px}}.imagify-account,.imagify-account-link{padding-right:15px}.imagify-sep-v{width:1px;background:rgba(255,255,255,.2)}.imagify-credit-left{position:relative;min-width:280px;padding-left:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}@media (max-width:630px){.imagify-title-right,.imagify-title-right>div{display:block;width:auto}.imagify-title-right>div{margin-top:10px;max-width:100%}.imagify-credit-left{padding-left:0}}.imagify-meteo-title.imagify-meteo-title{color:#FFF;font-size:17px}.imagify-space-left{display:inline-block;min-height:38px;min-width:245px;vertical-align:middle}.imagify-space-left>p{color:#FFF}#wp-admin-bar-imagify-profile [class^=imagify-bar-],[class^=imagify-bar-]{position:relative;height:15px;width:100%;background:#60758D;color:#FFF;font-size:10px}.base-transparent{background:0 0}[class^=imagify-bar-].right-outside-number{-webkit-box-sizing:border-box;box-sizing:border-box;padding-right:45px}.right-outside-number .imagify-barnb{display:block;margin-right:-45px;text-align:right;font-weight:700;line-height:15px}#wp-admin-bar-imagify-profile .imagify-progress-value,.imagify-progress-value{position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:13px;font-weight:700}#wp-admin-bar-imagify-profile .imagify-progress,.imagify-progress{height:15px}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8CC152}.imagify-bar-positive .imagify-barnb{color:#8CC152}.imagify-bar-negative .imagify-progress{background:#73818C}.imagify-bar-negative .imagify-barnb{color:#73818C}.imagify-bar-neutral .imagify-progress{background:#F5A623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#D0021B}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889F}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40B1D0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p,.imagify-list-infos li+li{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost,.btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #FFF;text-align:center;background:0 0;color:#FFF;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .btn-ghost:hover,.btn-ghost:focus,.btn-ghost:hover{background:#FFF;color:#888}.imagify-list-infos{max-width:100%;width:415px}.imagify-info-block,.imagify-list-infos li{position:relative;padding:10px;padding-left:42px;background:#D9E4EB;border-radius:4px;line-height:1.6}.imagify-list-infos .imagify-alt.imagify-alt{background:#8BA7B5;color:#FFF;font-weight:700}.imagify-info-block:before,.imagify-list-infos li:before{content:"";position:absolute;left:13px;top:14px;height:16px;width:16px;border:1px solid #46b1ce;border-radius:10px}.imagify-info-block:after,.imagify-list-infos li:after{content:"i";position:absolute;left:20px;top:13px;font-style:italic;color:#46b1ce}.imagify-cell .imagify-info-block{padding-top:0}.imagify-cell .imagify-info-block:after{top:6px}.imagify-cell .imagify-info-block:before{top:7px}.imagify-list-infos .imagify-alt:after,.imagify-list-infos .imagify-alt:before{color:#fff;border-color:#fff}.imagify-sub-title.imagify-sub-title{font-size:23px;background:#FFF;color:#2E3243;border-left:1px solid #D9D9D9;border-right:1px solid #D9D9D9;font-weight:lighter}.imagify-sub-title .icon-bulk{margin-right:10px;vertical-align:middle}.imagify-sub-title .title-text{display:inline-block;line-height:1;vertical-align:middle}.imagify-bulk .imagify-settings-section{border:1px solid #D9D9D9;border-top:0;background:#F2F5F7;color:#4A4A4A}.imagify-bulk .imagify-settings-section h3,.imagify-bulk .imagify-settings-section li,.imagify-bulk .imagify-settings-section p{color:#4A4A4A}.imagify-bulk .imagify-settings-section h3{margin-bottom:2em}.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-ac-rt-big,.imagistatus{text-transform:uppercase;font-weight:700}.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;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;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 .number{display:table-cell;padding-right:15px;font-size:36px;font-weight:700;line-height:1.1;vertical-align:middle;white-space:nowrap}.imagify-number-you-optimized .text{display:table-cell;vertical-align:middle;overflow:hidden;font-size:12px}.imagify-number-you-optimized .text br{display:none}.imagify-number-you-optimized>p{display:table}.imagify-number-you-optimized{padding-bottom:.85em;margin-bottom:1.35em;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.05)}.imagify-bars p{font-weight:700;font-size:12px;margin-bottom:0}.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;max-height:600px;max-height:60vh;overflow:auto}.imagify-ac-report-text,.imagiuploaded{overflow:hidden}.imagify-bulk-table table{width:100%;border-spacing:0;border-collapse:collapse;border:1px solid #D3D3D3}.imagify-bulk-table td{padding:8px 15px}.imagify-bulk-table thead th,.imagify-bulk-table thead tr{background:#2E3242}.imagify-bulk-table tfoot th,.imagify-bulk-table tfoot tr{background:#73818C}.imagify-bulk-table thead th{padding:14px 15px;text-align:left;color:#F2F5F7;font-weight:700;font-size:14px}.imagify-bulk-table tfoot td{padding:14px 15px;color:#F9FAFA}.imagify-bulk-table tbody td,.imagify-bulk-table tbody tr{background:#FFF}.imagify-bulk-table tbody tr:nth-child(odd),.imagify-bulk-table tbody tr:nth-child(odd) td{background:#F2F5F7}.imagify-bulk-table .imagify-row-progress{display:none}.imagify-bulk-table .imagify-row-progress,.imagify-bulk-table .imagify-row-progress td{height:15px;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-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 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);-ms-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05);opacity:1}100%{-webkit-transform:scale(1);-ms-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}.imagify-ac-chart{width:46px;height:46px;float:left;margin:0 20px 0 10px}.imagify-ac-report-text p{line-height:1.3}.imagify-ac-rt-big{font-size:24px;letter-spacing:.15em;word-spacing:.15em}.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-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 td.imagify-cell-totaloriginal{padding-right:78px}.imagifilename,.imagiuploaded{display:inline-block;vertical-align:middle}.imagifilename{font-size:12px}.imagiuploaded{width:33px;height:33px;margin-right:5px;margin-left:-8px;background:url(../images/upload-image.png) no-repeat;background-size:cover}.imagiuploaded img{max-widht:100%;height:auto}.imagistatus{color:#8CA6B3}.status-compressing{color:#46B1CE}.status-error{color:#CE0B24}.status-warning{color:#f5a623}.status-complete{color:#8CC152}.imagify-error{background:#D0021B;color:#FFF}#wpadminbar .imagify-warning *,.imagify-warning{background:#f5a623;color:#FFF;text-shadow:0 0 2px rgba(0,0,0,.2)}.imagify-bulk-table .imagify-cell-thumbnails{text-align:center}.imagify-cell-percentage,.imagify-cell-savings{color:#46B1CE;font-weight:700}.imagify-cell-optimized{font-weight:700}.imagify-cell-totaloriginal{text-align:right}.imagify-modal .h2,.imagify-modal .h3{font-weight:400;letter-spacing:.075em;text-align:center}.dashicons.rotate{-webkit-animation:icon-rotate 2.6s infinite linear;animation:icon-rotate 2.6s infinite linear}.dashicons-admin-generic{-webkit-transform-origin:48.75% 51.75%;-ms-transform-origin:48.75% 51.75%;transform-origin:48.75% 51.75%}.imagify-modal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.js .imagify-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background-color:#1F2332;background-color:rgba(31,35,50,.95);z-index:99999}.imagify-modal-content{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;width:800px;max-width:95%;max-height:90vw;overflow:auto;padding:20px 25px;margin:1em auto;background:#FFF;-webkit-box-shadow:1px 1px 4px rgba(0,0,0,.7);box-shadow:1px 1px 4px rgba(0,0,0,.7);border-radius:3px}#imagify-visual-comparison .imagify-modal-content,.imagify-visual-comparison .imagify-modal-content{max-width:1400px;background:0 0;padding:5px;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.imagify-modal .h2{margin:.5em 0;color:#8ba6b4;font-size:24px}.imagify-modal .h3{color:#40b1d0;font-size:18px}.text-justify{text-align:justify}.imagify-modal .close-btn{display:none;visibility:hidden;position:absolute;right:20px;top:20px;font-size:1.2em;border:0;background:0 0;border-radius:0;cursor:pointer}.imagify-modal .close-btn i{margin-left:-2px}.imagify-modal .close-btn:focus,.imagify-modal .close-btn:hover{color:#40b1d0}.js .imagify-modal .close-btn{display:block;visibility:visible}.js .imagify-iframe-viewing .close-btn{display:none}#imagify-visual-comparison .close-btn,.imagify-visual-comparison .close-btn{top:50px;right:5px;width:33px;height:33px;padding:1px 0 0 2px;border:1px solid #F2F2F2;color:#F2F2F2;line-height:19px;text-align:center;border-radius:50%}.imagify-visual-comparison .close-btn,.wp_attachment_image #imagify-visual-comparison .close-btn{top:0}.imagify-visual-comparison .imagify-modal-content,.wp_attachment_image #imagify-visual-comparison .imagify-modal-content{padding-top:40px}.imagify-modal .imagify-comparison-title{font-size:28px;margin-bottom:1em;color:#F2F2F2;text-align:left}.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons{position:static;margin:0 10px 0 15px}.imagify-comparison-title .twentytwenty-duo-buttons button{float:none;padding:6px 12px;font-size:16px;text-transform:none;border:1px solid #40B1D0;color:#889;letter-spacing:0}.imagify-comparison-title .twentytwenty-duo-buttons button:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.imagify-comparison-title .twentytwenty-duo-buttons .selected{border:1px solid #40B1D0;color:#FFF;background:#40B1D0}.imagify-comparison-levels{margin:15px 0;overflow:hidden}.imagify-comparison-levels div{display:none;min-width:175px;font-size:11px}.imagify-comparison-levels .imagify-chart,.imagify-comparison-levels .imagify-chart-container{width:25px;float:none;margin:0}.imagify-visual-comparison .imagify-chart-container canvas{width:15px!important;height:15px!important;margin-right:5px}.imagify-c-level.go-left{float:left}.imagify-c-level.go-right{float:right}.imagify-c-level.go-left,.imagify-c-level.go-right{display:table}.imagify-c-level .imagify-c-level-row{display:table-row;margin:0;color:#FFF}.imagify-c-level-row>span{display:table-cell;padding:2px 0}.imagify-c-level-row .value{text-align:right;padding-left:5px}.imagify-c-level-row .value.level{color:#40b1d0}.imagify-c-level-row .value.size{color:#8bc34a;font-weight:700}.imagify-c-level-row .value .imagify-chart{top:1px}@-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-menu-bar-img{margin-top:1em}.imagify-modal .loader{position:absolute;top:50%;left:50%;margin:-32px 0 0 -32px;opacity:0;visibility:hidden;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.imagify-modal .loading .loader{visibility:visible;opacity:1}.imagify-settings .imagify-visual-comparison-text{margin-top:1em;color:#40b1d0;font-weight:700}.imagify-border-styled,.imagify-flex-table,.imagify-modal-cols,.imagify-offer-header,.imagify-payment-modal .imagify-modal-content,.imagify-tabs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.imagify-analyzing .imagify-numbers-calc,.imagify-modal-content.imagify-iframe-viewing .imagify-modal-sidebar,.imagify-modal-content.imagify-success-viewing .imagify-modal-sidebar,.imagify-modal-section .imagify-loader,.imagify-modal-section.imagify-analyzing .imagify-modal-cols,.imagify-numbers-notcalc{display:none}.imagify-border-styled,.imagify-modal-cols{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-payment-modal{text-align:center;color:#7A8996}.imagify-payment-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.imagify-modal-loader{position:absolute;top:0;left:0;right:0;bottom:0;background:url(../images/loader-balls.svg) center no-repeat #fff;z-index:10}.imagify-payment-modal .imagify-modal-content{width:980px;max-width:100%;min-width:925px;padding:0}.imagify-modal-content.imagify-iframe-viewing{width:980px;height:672px;overflow:hidden}.imagify-iframe-viewing #imagify-payment-process-view{width:980px;height:668px}.imagify-payment-modal .imagify-modal-main{width:70%}.imagify-iframe-viewing .imagify-modal-main{width:auto}.imagify-payment-modal .imagify-modal-content.imagify-success-viewing{min-width:auto;width:450px;min-height:300px}.imagify-success-viewing .imagify-modal-main{width:100%}.imagify-payment-modal .imagify-modal-sidebar{width:30%;padding:15px 20px;background:#1F2332;color:#FFF}.imagify-modal-section{padding:0 25px}.imagify-modal-section.section-gray{margin:0 0 1em;padding:10px 25px 15px;background:#F6F7FB}.imagify-tabs-contents .section-gray{padding:8px 25px 10px}.imagify-modal-section .imagify-modal-title:first-child{margin-top:1em;margin-bottom:1.5em}.imagify-modal-section.section-gray .imagify-modal-title{margin-top:.5em;margin-bottom:.5em}.imagify-modal-title{font-size:1.8em}.imagify-analyzing .imagify-numbers-notcalc,.imagify-modal-section.imagify-analyzing .imagify-loader{display:block}.imagify-modal-section .imagify-loader{margin:2em auto}.imagify-border-styled{width:200px;margin:0 auto;color:#8BC34A;font-weight:700;font-size:.925em}.imagify-big-number,.imagify-payment-modal strong{font-weight:700;color:#4A4A4A}.imagify-big-number{font-size:3.7em;margin:-3px 0;line-height:1}.imagify-border-styled:after,.imagify-border-styled:before{content:"";height:1px;background:rgba(0,0,0,.1);-ms-flex-preferred-size:40px;flex-basis:40px}.imagify-border-styled:before{margin-right:5px}.imagify-border-styled:after{margin-left:5px}.imagify-col{-ms-flex-preferred-size:50%;flex-basis:50%}.imagify-modal .imagify-cols{padding:0 20px}.imagify-payment-modal .imagify-iconed{margin:1.5em 5em 1.5em 0}.imagify-iconed{position:relative;text-align:left;padding-left:42px;margin-right:15px;font-weight:500}.imagify-iconed .dashicons,.imagify-iconed .icon{position:absolute;font-size:2em;left:0;top:2px;color:#40B1D0}.imagify-payment-modal .close-btn{top:10px;right:10px;width:24px;height:24px;padding:2px 0 0 4.5px;color:#FFF;background:#40B1D0;border-radius:50%;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-payment-modal .close-btn i{margin-left:-3.5px;margin-top:-.5px}.imagify-payment-modal .close-btn:hover{background:#F6F7FB}.imagify-offer-line{margin-top:1.5em}.imagify-offer-line+.imagify-offer-line{margin-top:.75em}.imagify-offer-header{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 0 0 15px;border-radius:4px 4px 0 0;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-header.imagify-offer-header.imagify-offer-header .imagify-inline-options label:last-child{border-radius:0 4px 0 0}.imagify-offer-header .imagify-inline-options{width:auto}.imagify-offer-title{font-weight:700;margin:0}.imagify-offer-header,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#E5EBEF}.imagify-offer-onetime .imagify-offer-header{padding-top:8px;padding-bottom:8px}.imagify-offer-onetimes>div{padding-top:15px;padding-bottom:15px}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label,.imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{position:relative;padding:7px 30px;font-size:1em;letter-spacing:.05em;color:inherit;-webkit-box-shadow:0 0 0;box-shadow:0 0 0;border-radius:0}.imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#F6F7FB}.imagify-2-free{position:absolute;bottom:100%;left:0;right:0;padding:2px 10px;margin-bottom:8px;font-size:.8em;letter-spacing:0;text-transform:none;text-align:center;color:#FFF;background:#10121A;border-radius:2px}.imagify-2-free:after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3px;border-top:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent}.imagify-2-free.imagify-b-right{bottom:auto;left:100%;right:-100%;margin-bottom:0;margin-left:8px}.imagify-2-free.imagify-b-right:after{left:-3px;bottom:auto;top:50%;margin-top:-3px;margin-left:0;border-right:3px solid #10121A;border-top:3px solid transparent;border-bottom:3px solid transparent;border-left:0}.imagify-2-free.imagify-b-bottom{bottom:-100%;left:0;right:0;margin-top:8px}.imagify-2-free.imagify-b-bottom:after{top:-3px;bottom:auto;border-bottom:3px solid #10121A;border-left:3px solid transparent;border-right:3px solid transparent;border-top:0}.imagify-offer-content{text-align:left;background:#F6F7FB;border-radius:0 0 4px 4px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-onetime .imagify-offer-content{padding:10px 0}div.imagify-col-checkbox{position:relative;width:25.5%;padding-top:10px;padding-bottom:7px}.imagify-col-checkbox label{display:block;padding-left:55px!important}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked){position:absolute;top:50%;left:6px;margin:-8px 0 0}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{margin:0;top:-2px;left:6px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}.imagify-offer-by,.imagify-offer-size{-webkit-transition:all .275s;-o-transition:all .275s}.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:checked+label:after,.imagify-col-checkbox .imagify-checkbox.imagify-checkbox:not(:checked)+label:after{top:1px;left:13px}.imagify-offer-size{font-size:30px;color:#2E3243;font-weight:700;transition:all .275s}.imagify-offer-by{font-size:10px;transition:all .275s}.imagify-approx{display:none;font-size:11px;line-height:1.2;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}div.imagify-col-price{width:35%}.imagify-flex-table .imagify-price-block{padding-left:0;padding-right:0}.imagify-offer-monthlies .imagify-price-block,.imagify-offer-monthly .imagify-flex-table .imagify-price-block{padding-top:0}.imagify-flex-table .imagify-price-complement{padding-right:0;font-size:10px;font-weight:700}.imagify-price-block,.imagify-price-discount{white-space:nowrap}.imagify-price-block span,.imagify-price-discount span{display:inline-block;vertical-align:middle}.imagify-price-discount.imagify-price-discount{position:relative;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;padding-top:15px;font-weight:700;width:70px}.imagify-price-discount:before{content:"";position:absolute;top:25px;width:62%;height:2px;background:#2E3243;-webkit-transform:rotate(-15deg);-ms-transform:rotate(-15deg);transform:rotate(-15deg)}.imagify-offer-onetimes .imagify-price-discount:before{width:100%}.imagify-price-discount-dollar{color:#2E3243}.imagify-price-discount-number{color:#8BA6B4}.imagify-offer-selected .imagify-price-discount-number{color:#FFF}span.imagify-dollars{color:#1F2332;font-size:18px;font-weight:700;vertical-align:-2px}.imagify-offer-onetime .imagify-col-price{padding-top:0}.imagify-offer-onetime .imagify-dollars{vertical-align:-1px}.imagify-price-big,.imagify-price-mini{color:#40B1D0;font-weight:700}.imagify-price-big{font-size:36px}span.imagify-price-mini{font-size:18px;vertical-align:2px}span.imagify-price-by{font-size:10px;color:#1F2332;vertical-align:-13px;text-indent:-27px}.imagify-col-other-actions{width:18.5%;text-align:right}.imagify-col-other-actions a{font-size:11px}.imagify-offer-selected,.imagify-offer-selected .imagify-col-other-actions a,.imagify-offer-selected .imagify-offer-size,.imagify-offer-selected .imagify-offer-title,.imagify-offer-selected .imagify-price-big,.imagify-offer-selected .imagify-price-complement,.imagify-offer-selected .imagify-price-mini{color:#FFF}.imagify-offer-selected .imagify-offer-header,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:not(:checked)+label{background:#338EA6}.imagify-offer-selected .imagify-offer-content,.imagify-offer-selected .imagify-offer-header .imagify-inline-options input[type=radio]:checked+label{background:#40B1D0}.imagify-offer-selected .imagify-checkbox.imagify-checkbox:checked+label:before,.imagify-offer-selected .imagify-checkbox.imagify-checkbox:not(:checked)+label:before{border-color:#FFF;background:#40B1D0}.imagify-offer-selected .imagify-offer-by{color:#2E3243}.imagify-enough-free .imagify-not-enough-title,.imagify-enough-title{display:none}.imagify-enough-free .imagify-enough-title{display:block}.imagify-submit-line{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:2em 0;text-align:left}.imagify-coupon-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-coupon-section p{margin:0;line-height:1.3}.imagify-coupon-text{width:200px;max-width:100%;padding-right:15px}.imagify-coupon-loader{display:none}.imagify-coupon-text.checking{text-align:right}.imagify-coupon-text.checking .imagify-coupon-loader{display:inline}.imagify-coupon-text.checking label{display:none}.imagify-coupon-input{position:relative}.imagify-coupon-input input{position:relative;z-index:1}[id=imagify-coupon-validate].button-secondary{position:absolute;top:1px;right:3px;bottom:2px;-webkit-box-shadow:none;box-shadow:none;padding:4px 10px;z-index:0;-webkit-transition:-webkit-transform .275s;-o-transition:transform .275s;transition:transform .275s;transition:transform .275s,-webkit-transform .275s}.imagify-canbe-validate [id=imagify-coupon-validate]{-webkit-transform:translateX(45px);-ms-transform:translateX(45px);transform:translateX(45px)}.imagify-modal-section+.imagify-modal-promotion{margin-top:-1em}.imagify-modal-promotion{position:relative;overflow:hidden;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:15px 25px;background:#604D90;text-shadow:0 0 3px rgba(0,0,0,.3)}.imagify-modal-promotion.active{display:-webkit-box;display:-ms-flexbox;display:flex}[id=imagify-pricing-tab-onetime] .imagify-modal-promotion{margin-bottom:4em}.imagify-modal-promotion:before{content:"\f488";position:absolute;top:28px;left:8%;font-family:dashicons;font-size:90px;color:#8476A9;text-shadow:none}.imagify-modal-promotion p{position:relative;margin:.2em 0;color:#FFF}.imagify-promo-title{-ms-flex-preferred-size:100%;flex-basis:100%;text-transform:uppercase;font-size:20px;font-weight:700;letter-spacing:.125em}.imagify-until-date{-ms-flex-preferred-size:200px;flex-basis:200px;text-align:right}.imagify-until-date strong{color:#FFF}.imagify-submit-line button{font-size:16px}input.imagify-coupon-code{padding:10px;border:2px solid #7A8996;font-size:.875em;font-weight:700;border-radius:3px}.validated.imagify-coupon-section .imagify-coupon-text,.validated.imagify-coupon-section strong{color:#8BC34A}.validated.imagify-coupon-section .imagify-coupon-code{color:#8BC34A;border-color:#8BC34A}.invalid.imagify-coupon-section .imagify-coupon-text,.invalid.imagify-coupon-section strong{color:#d0021b}.invalid.imagify-coupon-section .imagify-coupon-code{color:#d0021b;border-color:#d0021b}.imagify-footer-lines{width:500px;max-width:100%;margin:2em auto 2.5em;font-size:.85em;line-height:1.5}.imagify-year-selected .imagify-switch-my .imagify-yearly{display:block}.imagify-month-selected .imagify-switch-my .imagify-yearly,.imagify-year-selected .imagify-switch-my .imagify-monthly{display:none}.imagify-month-selected .imagify-switch-my .imagify-monthly{display:block}.imagify-flex-table{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.imagify-flex-table>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:7px 15px}div.imagify-col-details{width:22%;padding-left:25px}.imagify-col-details p{margin:0}.imagify-pricing-table{margin:0 20px}.imagify-pricing-table .imagify-offer-line{padding:.6em 0;border:2px solid #E8EEF0;text-align:left;border-radius:3px}.imagify-pricing-table .imagify-offer-line:first-child{margin-top:.75em}.imagify-pricing-table .imagify-offer-line.imagify-offer-selected:first-child{margin-top:1.75em}.imagify-pricing-table .imagify-offer-line+.imagify-offer-line{margin-top:-2px}.imagify-pricing-table .imagify-col-other-actions{width:20.5%}.imagify-pricing-table .imagify-approx{margin-left:0;line-height:.5;margin-bottom:1em}.imagify-pricing-table .imagify-offer-selected{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03);background:#40B1D0;border-width:0}.imagify-pricing-table .imagify-offer-selected .imagify-approx{color:#FFF}.imagify-pricing-table .imagify-button-secondary{padding:3px 20px;-webkit-box-shadow:none;box-shadow:none;text-transform:uppercase;font-size:12px;letter-spacing:.025em}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary{border:2px solid #FFF;background:#40B1D0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none!important}.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:focus,.imagify-offer-selected.imagify-offer-selected .imagify-button-secondary:hover{background:#FFF;color:#40B1D0}.imagify-col .imagify-special-needs{margin-left:25px}.imagify-special-needs strong{font-size:25px;font-weight:700;color:#40B1D0}.imagify-special-needs span{display:block;font-size:12px;margin-top:-.5em}div.imagify-col-price{position:relative}.imagify-recommend{display:none;position:absolute;left:-20px;bottom:100%;padding:0;margin-bottom:8px;color:#1F2332;font-weight:700;font-style:italic}.imagify-offer-selected .imagify-recommend,.imagify-tab-content.imagify-current{display:block}[class*=imagify-onetime-] .imagify-recommend{left:65px;margin-bottom:20px}.imagify-recommend:before{content:"";position:absolute;top:7px;left:-35px;width:29px;height:30px;background:url(../images/icon-arrow-choice.png) 0 no-repeat;background-size:contain}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.imagify-recommend:before{background-image:url(../images/icon-arrow-choice.svg)}}.imagify-offer-line[class*=imagify-onetime-]{padding:0;margin:.3em 0 0}.imagify-offer-line.imagify-offer-line[class*=imagify-onetime-]:first-child{margin-top:2em}.imagify-offer-line[class*=imagify-onetime-]+.imagify-offer-line{margin-top:.5em}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-]{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);border-width:2px}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{position:relative;overflow:hidden;width:21%;background:#1F2332;color:#FFF}.imagify-offer-selected.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details{background:#338EA6}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-details:before{content:"";position:absolute;bottom:0;right:25px;width:75px;height:54px;background:url(../images/icon-pack.png)}.imagify-offer-line[class*=imagify-onetime-] .imagify-col-other-actions{width:30%}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx,.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{color:#FFF}.imagify-offer-line[class*=imagify-onetime-] .imagify-offer-size{font-size:24px}.imagify-offer-line[class*=imagify-onetime-] .imagify-approx{font-size:12px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-block{padding-left:10px}.imagify-offer-line[class*=imagify-onetime-] .imagify-dollars{vertical-align:middle}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-big{vertical-align:-5px}.imagify-offer-line[class*=imagify-onetime-] .imagify-price-mini{vertical-align:7px}.imagify-tabs{margin-bottom:0;list-style:none;background:#E5EBEF}.imagify-modal-content .imagify-tabs{margin:1em 0 0}.imagify-tab{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;width:50%;margin:0;font-size:23px}.imagify-tab a{display:block;padding:15px 10px;color:inherit;text-decoration:none}.imagify-tab a:focus{-webkit-box-shadow:none;box-shadow:none;outline:0;color:#40B1D8}.imagify-tab.imagify-current a{background:#F6F7FB}.imagify-tab-content{display:none}.imagify-tab-content .imagify-modal-section:first-child{margin-top:0}.imagify-modal-sidebar-content,.imagify-payment-modal .imagify-modal-sidebar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.imagify-modal-sidebar-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}p.imagify-modal-sidebar-title{margin-top:5px;padding-right:40px;font-size:18px;color:#FFF}.imagify-modal-testimony{margin-top:1em}.imagify-modal-testimony+.imagify-modal-testimony{margin-top:2em}@media (max-height:620px){.imagify-modal-testimony+.imagify-modal-testimony{display:none}}.imagify-modal-testimony-person{display:table;width:100%}.imagify-modal-testimony-person>*{display:table-cell;vertical-align:middle}.imagify-modal-avatar{width:114px;line-height:0}.imagify-modal-avatar img{border:2px solid #FFF;border-radius:50%;width:96px;height:96px}.imagify-modal-identity a{text-decoration:none;font-weight:700}.imagify-modal-identity a:first-child{font-size:13px}.imagify-modal-identity a:first-child+a{display:block;font-size:10px;color:#7A8996}.imagify-modal-testimony-content p{font-size:13px;font-style:italic;line-height:1.7;color:#7A8996}.imagify-modal-sidebar-trust{margin-top:auto;padding-top:1.5em}.imagify-modal-sidebar-trust p{margin:0;font-weight:700;font-size:12px;line-height:1.7}.imagify-modal-sidebar-trust p img{margin-right:3px;vertical-align:-2px}.imagify-modal-sidebar-trust p+p{font-size:11px}.imagify-cart{text-align:left}.imagify-cart .imagify-cart-list{border-top:1px solid rgba(122,137,150,.2);border-bottom:1px solid rgba(122,137,150,.2)}.imagify-cart .imagify-cart-label{margin-bottom:.5em;font-size:10px;color:#2E3243}.imagify-cart-list p{margin:0;font-weight:700}.imagify-cart-item{margin:.4em 0}.imagify-cart .imagify-cart-suggestion{margin-top:-.3em}.imagify-cart-suggestion a,.imagify-cl-description p{font-size:10px}.imagify-remove-from-cart{border:0;padding:0;width:14px;height:14px;line-height:13px;border-radius:50%;background:#40B1D0;cursor:pointer;-webkit-transition:background .3s;-o-transition:background .3s;transition:background .3s}.imagify-remove-from-cart i:before{position:relative;top:-6px;left:-3px;font-size:13px;color:#FFF}.imagify-remove-from-cart:focus,.imagify-remove-from-cart:hover{background:#D0021B}.imagify-cart .imagify-cl-remove{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:45px}.imagify-cart .imagify-cl-name{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:200px}.imagify-cart .imagify-cl-description{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;padding-top:10px}.imagify-cart .imagify-cl-price{text-align:right}#imagify-payment-iframe{width:980px;height:672px;background:url(../images/loader-balls.svg) 50% 50% no-repeat #f6f7fb}.imagify-success-view{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.imagify-success-view p{font-weight:700;font-size:16px}.imagify-cart-emptied-item{margin:.3em auto;padding:6px 20px;background:#E6EBEF;border-radius:20px}.imagify-cart-emptied-item.imagify-cart-emptied-item p{font-weight:700}.imagify-cart-emptied-item a{color:#40b1d0;float:right;font-weight:700}
|
assets/css/sweetalert2.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.swal2-modal,.swal2-overlay{position:fixed;display:none}.swal2-overlay{background-color:rgba(0,0,0,.4);left:0;right:0;top:0;bottom:0;z-index:1000}.swal2-modal{background-color:#fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;border-radius:5px;box-sizing:border-box;text-align:center;left:50%;top:50%;margin-top:-200px;max-height:90%;overflow-x:hidden;overflow-y:auto;z-index:2000}.swal2-modal.loading{overflow-y:hidden}.swal2-modal h2{color:#575757;font-size:30px;text-align:center;font-weight:600;text-transform:none;position:relative;margin:0;padding:0;line-height:60px;display:block}.swal2-modal hr{height:10px;color:transparent;border:0}.swal2-modal button.styled{color:#fff;border:0;box-shadow:none;font-size:17px;font-weight:500;border-radius:3px;padding:10px 32px;margin:0 5px;cursor:pointer}.swal2-content,.swal2-icon{padding:0;position:relative}.swal2-modal button.styled:not(.loading)[disabled]{opacity:.4;cursor:no-drop}.swal2-modal button.styled.loading{box-sizing:border-box;border:4px solid transparent;width:40px;height:40px;padding:0;margin:-2px 30px;vertical-align:top;background-color:transparent!important;color:transparent;cursor:default;border-radius:100%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-modal button:not(.styled).loading:after{display:inline-block;content:"";margin-left:5px;vertical-align:-1px;height:6px;width:6px;border:3px solid #999;border-right-color:transparent;border-radius:50%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-checkbox input,.swal2-checkbox span,.swal2-radio input,.swal2-radio span{vertical-align:middle}.swal2-modal .swal2-image{margin:20px auto;max-width:100%}.swal2-modal .swal2-close{font-size:36px;line-height:36px;font-family:serif;position:absolute;top:5px;right:13px;cursor:pointer;color:#cfcfcf;-webkit-transition:all .1s ease;transition:all .1s ease}.swal2-modal .swal2-close:hover{color:#d55}.swal2-modal>.swal2-checkbox,.swal2-modal>.swal2-input,.swal2-modal>.swal2-radio,.swal2-modal>.swal2-select,.swal2-modal>.swal2-textarea{display:none}.swal2-content{font-size:18px;text-align:center;font-weight:300;float:none;margin:0;line-height:normal;color:#555}.swal2-icon.swal2-info,.swal2-icon.swal2-question,.swal2-icon.swal2-warning{font-size:60px;line-height:80px;text-align:center}.swal2-icon{width:80px;height:80px;border:4px solid grey;border-radius:50%;margin:20px auto 30px;box-sizing:content-box;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .x-mark{position:relative;display:block}.swal2-icon.swal2-error .line{position:absolute;height:5px;width:47px;background-color:#f27474;display:block;top:37px;border-radius:2px}.swal2-icon.swal2-error .line.left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}.swal2-icon.swal2-error .line.right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}.swal2-icon.swal2-warning{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#f8bb86;border-color:#f8bb86}.swal2-icon.swal2-info{font-family:"Open Sans",sans-serif;color:#3fc3ee;border-color:#3fc3ee}.swal2-icon.swal2-question{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#c9dae1;border-color:#c9dae1}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success::after,.swal2-icon.swal2-success::before{content:'';position:absolute;width:60px;height:120px;background:#fff}.swal2-icon.swal2-success::before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.swal2-icon.swal2-success::after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px}.swal2-icon.swal2-success .placeholder{width:80px;height:80px;border:4px solid rgba(165,220,134,.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.swal2-icon.swal2-success .fix{width:7px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-success .line{height:5px;background-color:#a5dc86;display:block;border-radius:2px;position:absolute;z-index:2}.swal2-icon.swal2-success .line.tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success .line.long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-checkbox,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:20px auto}.swal2-input:not([type=file]),.swal2-textarea{width:100%;box-sizing:border-box;border-radius:3px;border:1px solid #d7d7d7;font-size:18px;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);-webkit-transition:all .3s;transition:all .3s}.swal2-input:not([type=file]).error,.swal2-textarea.error{border-color:#f06e57!important}.swal2-input:not([type=file]):focus,.swal2-textarea:focus{outline:0;box-shadow:0 0 3px #c4e6f5;border:1px solid #b4dbed}.swal2-input:not([type=file]):focus::-moz-placeholder,.swal2-textarea:focus::-moz-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus:-ms-input-placeholder,.swal2-textarea:focus:-ms-input-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus::-webkit-input-placeholder,.swal2-textarea:focus::-webkit-input-placeholder{-webkit-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file])::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#bdbdbd}.swal2-input:not([type=file]):-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file])::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file]){height:43px;padding:0 12px}.swal2-input[type=file]{font-size:20px}.swal2-textarea{height:108px;padding:12px}.swal2-select{color:#555;font-size:inherit;padding:5px 10px;min-width:40%;max-width:100%}.swal2-radio{border:0}.swal2-radio label:not(:first-child){margin-left:20px}.swal2-radio input{margin:0 3px 0 0}.swal2-checkbox{color:#555}.swal2-validationerror{background-color:#f1f1f1;margin:0 -20px;overflow:hidden;padding:10px;color:#797979;font-size:16px;font-weight:300;display:none}.swal2-validationerror::before{content:"!";display:inline-block;width:24px;height:24px;border-radius:50%;background-color:#ea7d7d;color:#fff;line-height:24px;text-align:center;margin-right:10px}@-webkit-keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}.show-swal2{-webkit-animation:showSweetAlert .3s;animation:showSweetAlert .3s}.show-swal2.no-animation{-webkit-animation:none;animation:none}.hide-swal2{-webkit-animation:hideSweetAlert .15s;animation:hideSweetAlert .15s}.hide-swal2.no-animation{-webkit-animation:none;animation:none}@-webkit-keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@-webkit-keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@-webkit-keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}.animate-success-tip{-webkit-animation:animate-success-tip .75s;animation:animate-success-tip .75s}.animate-success-long{-webkit-animation:animate-success-long .75s;animation:animate-success-long .75s}.swal2-icon.swal2-success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}@-webkit-keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}@keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}.animate-error-icon{-webkit-animation:animate-error-icon .5s;animation:animate-error-icon .5s}@-webkit-keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}@keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}.animate-x-mark{-webkit-animation:animate-x-mark .5s;animation:animate-x-mark .5s}@-webkit-keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}@keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}.pulse-warning{-webkit-animation:pulse-warning .75s infinite alternate;animation:pulse-warning .75s infinite alternate}@-webkit-keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}
|
1 |
+
.swal2-modal,.swal2-overlay{position:fixed;display:none}.swal2-overlay{background-color:rgba(0,0,0,.4);left:0;right:0;top:0;bottom:0;z-index:1000}.swal2-modal{background-color:#fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;border-radius:5px;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;left:50%;top:50%;margin-top:-200px;max-height:90%;overflow-x:hidden;overflow-y:auto;z-index:2000}.swal2-modal.loading{overflow-y:hidden}.swal2-modal h2{color:#575757;font-size:30px;text-align:center;font-weight:600;text-transform:none;position:relative;margin:0;padding:0;line-height:60px;display:block}.swal2-modal hr{height:10px;color:transparent;border:0}.swal2-modal button.styled{color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;font-size:17px;font-weight:500;border-radius:3px;padding:10px 32px;margin:0 5px;cursor:pointer}.swal2-content,.swal2-icon{padding:0;position:relative}.swal2-modal button.styled:not(.loading)[disabled]{opacity:.4;cursor:no-drop}.swal2-modal button.styled.loading{-webkit-box-sizing:border-box;box-sizing:border-box;border:4px solid transparent;border-color:transparent;width:40px;height:40px;padding:0;margin:-2px 30px;vertical-align:top;background-color:transparent!important;color:transparent;cursor:default;border-radius:100%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-modal button:not(.styled).loading:after{display:inline-block;content:"";margin-left:5px;vertical-align:-1px;height:6px;width:6px;border:3px solid #999;border-right-color:transparent;border-radius:50%;-webkit-animation:rotate-loading 1.5s linear 0s infinite normal;animation:rotate-loading 1.5s linear 0s infinite normal}.swal2-checkbox input,.swal2-checkbox span,.swal2-radio input,.swal2-radio span{vertical-align:middle}.swal2-modal .swal2-image{margin:20px auto;max-width:100%}.swal2-modal .swal2-close{font-size:36px;line-height:36px;font-family:serif;position:absolute;top:5px;right:13px;cursor:pointer;color:#cfcfcf;-webkit-transition:all .1s ease;-o-transition:all .1s ease;transition:all .1s ease}.swal2-modal .swal2-close:hover{color:#d55}.swal2-modal>.swal2-checkbox,.swal2-modal>.swal2-input,.swal2-modal>.swal2-radio,.swal2-modal>.swal2-select,.swal2-modal>.swal2-textarea{display:none}.swal2-content{font-size:18px;text-align:center;font-weight:300;float:none;margin:0;line-height:normal;color:#555}.swal2-icon.swal2-info,.swal2-icon.swal2-question,.swal2-icon.swal2-warning{font-size:60px;line-height:80px;text-align:center}.swal2-icon{width:80px;height:80px;border:4px solid grey;border-radius:50%;margin:20px auto 30px;-webkit-box-sizing:content-box;box-sizing:content-box;cursor:default;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .x-mark{position:relative;display:block}.swal2-icon.swal2-error .line{position:absolute;height:5px;width:47px;background-color:#f27474;display:block;top:37px;border-radius:2px}.swal2-icon.swal2-error .line.left{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);left:17px}.swal2-icon.swal2-error .line.right{-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}.swal2-icon.swal2-warning{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#f8bb86;border-color:#f8bb86}.swal2-icon.swal2-info{font-family:"Open Sans",sans-serif;color:#3fc3ee;border-color:#3fc3ee}.swal2-icon.swal2-question{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#c9dae1;border-color:#c9dae1}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success::after,.swal2-icon.swal2-success::before{content:'';position:absolute;width:60px;height:120px;background:#fff}.swal2-icon.swal2-success::before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;-ms-transform-origin:60px 60px;transform-origin:60px 60px}.swal2-icon.swal2-success::after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;-ms-transform-origin:0 60px;transform-origin:0 60px}.swal2-icon.swal2-success .placeholder{width:80px;height:80px;border:4px solid rgba(165,220,134,.2);border-radius:50%;-webkit-box-sizing:content-box;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.swal2-icon.swal2-success .fix{width:7px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-icon.swal2-success .line{height:5px;background-color:#a5dc86;display:block;border-radius:2px;position:absolute;z-index:2}.swal2-icon.swal2-success .line.tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.swal2-icon.swal2-success .line.long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.swal2-checkbox,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:20px auto}.swal2-input:not([type=file]),.swal2-textarea{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:3px;border:1px solid #d7d7d7;font-size:18px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.06);box-shadow:inset 0 1px 1px rgba(0,0,0,.06);-webkit-transition:all .3s;-o-transition:all .3s;transition:all .3s}.swal2-input:not([type=file]).error,.swal2-textarea.error{border-color:#f06e57!important}.swal2-input:not([type=file]):focus,.swal2-textarea:focus{outline:0;-webkit-box-shadow:0 0 3px #c4e6f5;box-shadow:0 0 3px #c4e6f5;border:1px solid #b4dbed}.swal2-input:not([type=file]):focus::-moz-placeholder,.swal2-textarea:focus::-moz-placeholder{-webkit-transition:opacity .3s 30ms ease;-o-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus:-ms-input-placeholder,.swal2-textarea:focus:-ms-input-placeholder{-webkit-transition:opacity .3s 30ms ease;-o-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file]):focus::-webkit-input-placeholder,.swal2-textarea:focus::-webkit-input-placeholder{-webkit-transition:opacity .3s 30ms ease;-o-transition:opacity .3s 30ms ease;transition:opacity .3s 30ms ease;opacity:.8}.swal2-input:not([type=file])::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#bdbdbd}.swal2-input:not([type=file]):-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file])::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#bdbdbd}.swal2-input:not([type=file]){height:43px;padding:0 12px}.swal2-input[type=file]{font-size:20px}.swal2-textarea{height:108px;padding:12px}.swal2-select{color:#555;font-size:inherit;padding:5px 10px;min-width:40%;max-width:100%}.swal2-radio{border:0}.swal2-radio label:not(:first-child){margin-left:20px}.swal2-radio input{margin:0 3px 0 0}.swal2-checkbox{color:#555}.swal2-validationerror{background-color:#f1f1f1;margin:0 -20px;overflow:hidden;padding:10px;color:#797979;font-size:16px;font-weight:300;display:none}.swal2-validationerror::before{content:"!";display:inline-block;width:24px;height:24px;border-radius:50%;background-color:#ea7d7d;color:#fff;line-height:24px;text-align:center;margin-right:10px}@-webkit-keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes showSweetAlert{0%{-webkit-transform:scale(.7);transform:scale(.7)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}@keyframes hideSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{-webkit-transform:scale(.5);transform:scale(.5);opacity:0}}.show-swal2{-webkit-animation:showSweetAlert .3s;animation:showSweetAlert .3s}.show-swal2.no-animation{-webkit-animation:none;animation:none}.hide-swal2{-webkit-animation:hideSweetAlert .15s;animation:hideSweetAlert .15s}.hide-swal2.no-animation{-webkit-animation:none;animation:none}@-webkit-keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@keyframes animate-success-tip{0%,54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}100%{width:25px;left:14px;top:45px}}@-webkit-keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@keyframes animate-success-long{0%,65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}100%{width:47px;right:8px;top:38px}}@-webkit-keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%,5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}100%,12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}.animate-success-tip{-webkit-animation:animate-success-tip .75s;animation:animate-success-tip .75s}.animate-success-long{-webkit-animation:animate-success-long .75s;animation:animate-success-long .75s}.swal2-icon.swal2-success.animate::after{-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}@-webkit-keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}@keyframes animate-error-icon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}100%{-webkit-transform:rotateX(0);transform:rotateX(0);opacity:1}}.animate-error-icon{-webkit-animation:animate-error-icon .5s;animation:animate-error-icon .5s}@-webkit-keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}@keyframes animate-x-mark{0%,50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}100%{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}.animate-x-mark{-webkit-animation:animate-x-mark .5s;animation:animate-x-mark .5s}@-webkit-keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}@keyframes pulse-warning{0%{border-color:#f8d486}100%{border-color:#f8bb86}}.pulse-warning{-webkit-animation:pulse-warning .75s infinite alternate;animation:pulse-warning .75s infinite alternate}@-webkit-keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate-loading{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}
|
assets/css/twentytwenty.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.twentytwenty-handle{z-index:40;position:absolute;left:50%;top:50%;height:64px;width:64px;margin-left:-32px;margin-top:-32px;border-radius:50
|
1 |
+
.twentytwenty-handle{z-index:40;position:absolute;left:50%;top:50%;height:64px;width:64px;margin-left:-32px;margin-top:-32px;border-radius:50%;-webkit-box-shadow:0 3px 0 #338EA6;box-shadow:0 3px 0 #338EA6;background:#40B1D0;cursor:pointer}.twentytwenty-horizontal .twentytwenty-handle:after,.twentytwenty-horizontal .twentytwenty-handle:before{left:50%;width:2px;height:9999px;margin-left:-1px;content:"";position:absolute;z-index:30;display:block;background:#F2F5F7;-webkit-box-shadow:0 0 12px rgba(51,51,51,.5);box-shadow:0 0 12px rgba(51,51,51,.5)}.twentytwenty-horizontal .twentytwenty-handle:before{bottom:50%;margin-bottom:32px}.twentytwenty-horizontal .twentytwenty-handle:after{top:50%;margin-top:34px}.twentytwenty-labels,.twentytwenty-overlay{position:absolute;top:0;width:100%;height:100%;-webkit-transition-duration:.5s;-o-transition-duration:.5s;transition-duration:.5s}.twentytwenty-labels{opacity:1;-webkit-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.twentytwenty-labels .twentytwenty-label-content{position:absolute;padding:0 12px;font-size:13px;letter-spacing:.1em;line-height:38px;color:#fff;background:#1F2332;border-radius:2px}.twentytwenty-horizontal .twentytwenty-labels .twentytwenty-label-content{bottom:15px}.twentytwenty-after-label .twentytwenty-label-content{background:#40B1D0}.twentytwenty-left-arrow,.twentytwenty-right-arrow{position:absolute;width:0;height:0;border:8px inset transparent;top:50%;margin-top:-8px}.twentytwenty-container{-webkit-box-sizing:content-box;box-sizing:content-box;position:relative;z-index:0;overflow:hidden;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.15);box-shadow:0 5px 10px rgba(0,0,0,.15);opacity:0;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s;-webkit-user-select:none;-moz-user-select:none}.twentytwenty-container *{-webkit-box-sizing:content-box;box-sizing:content-box}.twentytwenty-container img{position:absolute;top:0;display:block;width:100%;height:auto}.loaded .twentytwenty-container{opacity:1}.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-labels,.twentytwenty-container.active .twentytwenty-overlay:hover .twentytwenty-labels{opacity:0}.twentytwenty-horizontal .twentytwenty-before-label .twentytwenty-label-content{left:15px}.twentytwenty-horizontal .twentytwenty-after-label .twentytwenty-label-content{right:15px}.twentytwenty-overlay{z-index:25}.twentytwenty-before{z-index:20}.twentytwenty-after{z-index:10}.twentytwenty-duo-buttons{position:absolute;top:10px;z-index:30;overflow:hidden}.twentytwenty-duo-buttons button{float:left;padding:2px 6px;font-size:11px;text-transform:uppercase;letter-spacing:.125em;font-weight:700;border:0;background:#1f2332;color:#FFF;-webkit-transition:all .3s;-o-transition:all .3s;transition:all .3s;cursor:pointer}.twentytwenty-duo-buttons button:focus,.twentytwenty-duo-buttons button:hover{background:#444}.twentytwenty-duo-buttons button:first-child{border-radius:3px 0 0 3px}.twentytwenty-duo-buttons button:last-child{border-radius:0 3px 3px 0}.twentytwenty-duo-buttons button.selected{background:#8bc34a;text-shadow:0 0 1px rgba(0,0,0,.2);cursor:default}.twentytwenty-duo-left{left:10px}.twentytwenty-duo-right{right:10px}.twentytwenty-left-arrow{left:50%;margin-left:-22px;border-right:8px solid #fff}.twentytwenty-right-arrow{right:50%;margin-right:-22px;border-left:8px solid #fff}.modal-is-too-high .imagify-comparison-levels{position:absolute;padding:15px 20px;background:rgba(31,35,50,.95);bottom:0;left:0;right:0;margin-bottom:0}
|
assets/images/big-blue-check.png
CHANGED
File without changes
|
assets/images/check-1.svg
CHANGED
File without changes
|
assets/images/check-mini-1.svg
CHANGED
File without changes
|
assets/images/icon-arrow-choice.png
CHANGED
File without changes
|
assets/images/icon-arrow-choice.svg
CHANGED
File without changes
|
assets/images/icon-lock.png
CHANGED
File without changes
|
assets/images/icon-lock.svg
CHANGED
File without changes
|
assets/images/icon-pack.png
CHANGED
File without changes
|
assets/images/icon-pack.svg
CHANGED
File without changes
|
assets/images/mushrooms-aggressive.jpg
CHANGED
File without changes
|
assets/images/mushrooms-normal.jpg
CHANGED
File without changes
|
assets/images/mushrooms-original.jpg
CHANGED
File without changes
|
assets/images/mushrooms-ultra.jpg
CHANGED
File without changes
|
assets/images/pic-ericwaltr.jpg
CHANGED
File without changes
|
assets/images/pic-srhdesign.jpg
CHANGED
File without changes
|
assets/js/admin.js
CHANGED
@@ -1,1066 +1,1189 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
var concat = ajaxurl.indexOf("?") > 0 ? "&" : "?",
|
4 |
-
imagify = {
|
5 |
-
log: function ( content ) {
|
6 |
-
if (console !== 'undefined') console.log( content );
|
7 |
-
},
|
8 |
-
info: function ( content ) {
|
9 |
-
if (console !== 'undefined') console.info( content );
|
10 |
-
}
|
11 |
-
};
|
12 |
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
15 |
*/
|
16 |
-
$('#imagify-signup').
|
17 |
e.preventDefault();
|
18 |
|
19 |
-
// Display the sign up form
|
20 |
-
swal({
|
21 |
-
title:
|
22 |
-
html:
|
23 |
-
confirmButtonText:
|
24 |
-
input:
|
25 |
-
|
26 |
-
allowOutsideClick: true,
|
27 |
showLoaderOnConfirm: true,
|
28 |
-
customClass:
|
29 |
-
inputValidator:
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
preConfirm:
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
},
|
52 |
-
}).then(function(
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
});
|
61 |
-
|
62 |
-
|
|
|
63 |
*/
|
64 |
-
$('#imagify-save-api-key').
|
65 |
e.preventDefault();
|
66 |
|
67 |
-
// Display the
|
68 |
-
swal({
|
69 |
-
title:
|
70 |
-
html:
|
71 |
-
confirmButtonText:
|
72 |
-
input:
|
73 |
-
allowOutsideClick:
|
74 |
showLoaderOnConfirm: true,
|
75 |
-
customClass:
|
76 |
-
inputValidator:
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
},
|
85 |
-
preConfirm:
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
},
|
97 |
-
}).then(function(
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
});
|
105 |
-
});
|
106 |
-
|
107 |
-
|
108 |
-
*
|
109 |
*/
|
110 |
-
$('.imagify-notice-dismiss').
|
|
|
|
|
|
|
|
|
111 |
e.preventDefault();
|
112 |
-
|
113 |
-
var obj = $(this),
|
114 |
-
parent = obj.parents('.imagify-welcome, .imagify-notice'),
|
115 |
-
href = obj.attr('href');
|
116 |
-
|
117 |
-
// Hide the notice
|
118 |
-
parent.fadeTo( 100 , 0, function() {
|
119 |
-
$(this).slideUp( 100, function() {
|
120 |
-
$(this).remove();
|
121 |
-
});
|
122 |
-
});
|
123 |
-
|
124 |
-
// Save the dismiss notice
|
125 |
-
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) );
|
126 |
-
});
|
127 |
-
|
128 |
-
|
129 |
-
/*
|
130 |
-
* Imagify Light modal
|
131 |
-
*/
|
132 |
-
var imagify_open_modal = function( $the_link ){
|
133 |
|
134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
|
136 |
-
$( the_target ).css('display', 'flex').hide().fadeIn(400).attr('aria-hidden', 'false').attr('tabindex', '0').focus().removeAttr('tabindex').addClass('modal-is-open');
|
137 |
-
$('body').addClass('imagify-modal-is-open');
|
138 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
};
|
140 |
|
141 |
-
//
|
142 |
$( '.imagify-modal' ).attr( 'aria-hidden', 'true' );
|
143 |
|
144 |
-
|
145 |
-
|
146 |
-
|
|
|
147 |
return false;
|
148 |
-
})
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
// in Payment modal case
|
155 |
-
if ( $(this).closest( '.imagify-modal' ).hasClass( 'imagify-payment-modal' ) ) {
|
156 |
-
|
157 |
-
// reset viewing class & aria-labelledby
|
158 |
-
$(this).closest( '.imagify-modal-content' ).removeClass( 'imagify-success-viewing imagify-iframe-viewing' );
|
159 |
-
|
160 |
-
// reset first view after fadeout ~= 300 ms
|
161 |
-
setTimeout( function() {
|
162 |
-
$( '.imagify-modal-views' ).hide();
|
163 |
-
$( '#imagify-pre-checkout-view' ).show();
|
164 |
-
}, 300 );
|
165 |
-
}
|
166 |
|
167 |
$( 'body' ).removeClass( 'imagify-modal-is-open' );
|
168 |
-
})
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
$modal.attr('tabindex', '0').focus().removeAttr('tabindex');
|
173 |
-
}
|
174 |
-
});
|
175 |
|
176 |
-
|
177 |
-
|
|
|
|
|
|
|
|
|
178 |
$( e.target ).filter( '.modal-is-open' ).find( '.close-btn' ).trigger( 'click.imagify' );
|
179 |
-
})
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
if ( e.keyCode == 27 && $('.imagify-modal.modal-is-open').length > 0 ) {
|
184 |
-
|
185 |
e.preventDefault();
|
186 |
-
|
187 |
-
|
188 |
-
$('.imagify-modal.modal-is-open').find('.close-btn').trigger('click.imagify');
|
189 |
|
190 |
return false;
|
191 |
}
|
192 |
-
});
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
return;
|
200 |
-
}
|
201 |
-
|
202 |
-
busy = true;
|
203 |
-
|
204 |
-
var $adminBarProfile = $('#wp-admin-bar-imagify-profile-content');
|
205 |
-
|
206 |
-
if( $adminBarProfile.is(':empty') ) {
|
207 |
-
xhr = $.get(ajaxurl + concat + "action=imagify_get_admin_bar_profile&imagifygetadminbarprofilenonce="+ $('#imagifygetadminbarprofilenonce').val())
|
208 |
-
.done(function(response){
|
209 |
-
$adminBarProfile.html(response.data);
|
210 |
-
$('#wp-admin-bar-imagify-profile-loading').remove();
|
211 |
-
busy = false;
|
212 |
-
});
|
213 |
-
}
|
214 |
-
});
|
215 |
|
216 |
/**
|
217 |
-
* Payment Modal
|
218 |
-
*
|
219 |
* @since 1.6
|
220 |
* @since 1.6.3 include discount campaign
|
221 |
* @author Geoffrey
|
222 |
*/
|
223 |
-
|
224 |
-
if ( $('#imagify-pricing-modal').length ) {
|
225 |
-
var $modal = $('#imagify-pricing-modal'),
|
226 |
-
imagify_get_html_price = function( content, period ) {
|
227 |
-
if ( ! period ) period = null;
|
228 |
-
output = '';
|
229 |
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
m = monthly.split('.'),
|
234 |
-
y = yearly.split('.');
|
235 |
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
240 |
|
241 |
-
|
242 |
-
|
|
|
|
|
|
|
|
|
|
|
243 |
|
244 |
return output;
|
245 |
-
}
|
246 |
-
|
247 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
248 |
output = '';
|
249 |
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
output += '<span class="imagify-price-discount">'
|
255 |
-
+ '<span class="imagify-price-discount-dollar">$</span>'
|
256 |
-
+ '<span class="imagify-switch-my">'
|
257 |
-
+ '<span aria-hidden="' + ( period === 'monthly' ? 'false' : 'true' ) + '" class="imagify-monthly">'
|
258 |
-
+ '<span class="imagify-price-discount-number">' + monthly + '</span>'
|
259 |
-
+ '</span>'
|
260 |
-
+ '<span aria-hidden="' + ( period === 'yearly' ? 'false' : 'true' ) + '" class="imagify-yearly">'
|
261 |
-
+ '<span class="imagify-price-discount-number">' + yearly + '</span>'
|
262 |
-
+ '</span>'
|
263 |
-
+ '</span>'
|
264 |
-
+ '</span>';
|
265 |
-
} else {
|
266 |
-
var content = content + ""; // be sure content is a string
|
267 |
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
273 |
|
274 |
-
|
275 |
-
|
276 |
-
imagify_populate_offer = function ( $offer, datas, type, classes ) {
|
277 |
-
var promo = window.imagify_discount_datas,
|
278 |
-
add = datas.additional_gb, // 4 (monthly)
|
279 |
-
ann = datas.annual_cost, // 49.9 (monthly)
|
280 |
-
id = datas.id, // 3 (monthly/onetime)
|
281 |
-
lab = datas.label, // 'lite' (monthly/onetime)
|
282 |
-
mon = datas.monthly_cost, // 4.99 (monthly)
|
283 |
-
quo = datas.quota, // 1000 (MB) - 5000 images (monthly/onetime)
|
284 |
-
cos = datas.cost, // 3.49 (onetime)
|
285 |
-
name = ( quo >= 1000 ? quo/1000 + ' GB' : quo + ' MB' ),
|
286 |
-
pcs = type === 'monthly' ? { monthly: mon, yearly: Math.round( ann / 12 * 100 ) / 100 } : cos,
|
287 |
-
pcsd = pcs; // used if discount is active
|
288 |
-
|
289 |
-
// change pricing value only if discount in percentage is active
|
290 |
-
// and if offer is a monthly and not a onetime
|
291 |
-
if ( promo.is_active && promo.coupon_type === 'percentage' && type === 'monthly' ) {
|
292 |
-
var percent = ( 100 - promo.coupon_value ) / 100;
|
293 |
-
pcs = type === 'monthly' ? { monthly: mon * percent, yearly: Math.round( ( ann * percent ) / 12 * 100 ) / 100 } : cos * percent;
|
294 |
-
}
|
295 |
|
296 |
-
|
297 |
-
|
298 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
299 |
|
300 |
-
|
301 |
-
$offer.
|
302 |
-
|
303 |
-
// main prices (pcs can be an object or a string)
|
304 |
-
$offer.find('.imagify-number-block').html( imagify_get_html_price( pcs, 'monthly' ) );
|
305 |
-
|
306 |
-
// discount prices
|
307 |
-
if ( promo.is_active && promo.coupon_type === 'percentage' && type === 'monthly' ) {
|
308 |
-
|
309 |
-
$offer.find('.imagify-price-block').prev( '.imagify-price-discount' ).remove();
|
310 |
-
$offer.find('.imagify-price-block').before( imagify_get_html_discount_price( pcsd, 'monthly' ) );
|
311 |
-
}
|
312 |
|
313 |
-
|
314 |
-
|
315 |
|
316 |
-
|
317 |
-
|
318 |
-
$offer.find('.imagify-price-add-data').text( '$' + add );
|
319 |
-
}
|
320 |
|
321 |
-
|
322 |
-
|
323 |
-
datas_content = ( type === 'monthly' )
|
324 |
-
?
|
325 |
-
'{"' + lab + '":{"id":' + id + ',"name":"' + name + '","data":' + quo + ',"dataf":"' + name + '","imgs":' + ( quo * 5 ) + ',"prices":{"monthly":' + pcs.monthly + ',"yearly":' + pcs.yearly + ',"add":' + add + '}}}'
|
326 |
-
:
|
327 |
-
'{"ot' + lab + '":{"id":' + id + ',"name":"' + name + '","data":' + quo + ',"dataf":"' + name + '","imgs":' + ( quo * 5 ) + ',"price":' + pcs + '}}'
|
328 |
-
;
|
329 |
|
330 |
-
$
|
|
|
|
|
331 |
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
}
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
|
|
349 |
|
350 |
-
|
351 |
-
|
352 |
|
353 |
-
|
354 |
-
|
|
|
|
|
|
|
|
|
355 |
|
356 |
-
|
357 |
-
|
|
|
|
|
358 |
} else {
|
359 |
-
|
360 |
}
|
|
|
361 |
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
action: 'imagify_get_prices',
|
367 |
-
imagifynonce: nonce
|
368 |
-
},
|
369 |
-
imgs_rq_datas = {
|
370 |
-
action: 'imagify_get_images_counts',
|
371 |
-
imagifynonce: nonce
|
372 |
-
},
|
373 |
-
prices_rq_discount = {
|
374 |
-
action: 'imagify_get_discount',
|
375 |
-
imagifynonce: nonce
|
376 |
-
};
|
377 |
-
|
378 |
-
$modal.find('.imagify-modal-loader').hide().show();
|
379 |
-
|
380 |
-
/*
|
381 |
-
TODO: change the way to waterfall requests
|
382 |
-
Use setInterval + counter instead
|
383 |
-
*/
|
384 |
-
|
385 |
-
// get the true prices
|
386 |
-
$.post( ajaxurl, prices_rq_datas, function( prices_response ) {
|
387 |
-
|
388 |
-
if ( prices_response.success ) {
|
389 |
-
|
390 |
-
// get the image estimates sizes
|
391 |
-
$.post( ajaxurl, imgs_rq_datas, function( imgs_response ) {
|
392 |
-
|
393 |
-
if ( imgs_response.success ) {
|
394 |
-
|
395 |
-
// get the discount informations
|
396 |
-
$.post( ajaxurl, prices_rq_discount, function( discount_response ) {
|
397 |
-
|
398 |
-
if ( discount_response.success ) {
|
399 |
-
|
400 |
-
var images_datas = imgs_response.data
|
401 |
-
prices_datas = prices_response.data,
|
402 |
-
promo_datas = discount_response.data,
|
403 |
-
monthlies = prices_datas.monthlies,
|
404 |
-
onetimes = prices_datas.onetimes,
|
405 |
-
mo_user_cons = Math.round( images_datas.average_month_size.raw / 1000000 ), // 1000000 in MB,
|
406 |
-
ot_user_cons = Math.round( images_datas.total_library_size.raw / 1000000 ), // in MB,
|
407 |
-
$mo_tpl = $('#imagify-offer-monthly-template'),
|
408 |
-
$ot_tpl = $('#imagify-offer-onetime-template'),
|
409 |
-
ot_clone = $ot_tpl.html(),
|
410 |
-
mo_clone = $mo_tpl.html(),
|
411 |
-
ot_html = '',
|
412 |
-
mo_html = '',
|
413 |
-
ot_suggested = false,
|
414 |
-
mo_suggested = false,
|
415 |
-
$estim_block = $( '.imagify-estimation-block' );
|
416 |
-
|
417 |
-
// Refresh Analyzing block
|
418 |
-
$estim_block.removeClass( 'imagify-analyzing' );
|
419 |
-
$estim_block.find( '.average-month-size' ).text( images_datas.average_month_size.human );
|
420 |
-
$estim_block.find( '.total-library-size' ).text( images_datas.total_library_size.human );
|
421 |
-
|
422 |
-
// Switch offers title is < 25mb
|
423 |
-
if ( mo_user_cons < 25 && ot_user_cons < 25 ) {
|
424 |
-
$( '.imagify-pre-checkout-offers .imagify-modal-title' ).addClass( 'imagify-enough-free' );
|
425 |
-
$('.imagify-offer-selected' ).removeClass( 'imagify-offer-selected' ).find( '.imagify-checkbox' ).removeAttr( 'checked' );
|
426 |
-
} else {
|
427 |
-
$( '.imagify-enough-free' ).removeClass( 'imagify-enough-free' );
|
428 |
-
$('.imagify-offer-selected' ).addClass( 'imagify-offer-selected' ).find( '.imagify-checkbox' ).attr( 'checked', 'checked' );
|
429 |
-
}
|
430 |
-
|
431 |
-
// Don't create prices table if something went wrong during request
|
432 |
-
if ( monthlies === null || onetimes === null ) {
|
433 |
-
var $offers_block = $( '.imagify-pre-checkout-offers' );
|
434 |
-
|
435 |
-
// hide main content
|
436 |
-
$offers_block.hide().attr( 'aria-hidden', true );
|
437 |
-
|
438 |
-
// show error message
|
439 |
-
$offers_block.closest('.imagify-modal-views').find('.imagify-popin-message').remove();
|
440 |
-
$offers_block.after('<div class="imagify-popin-message imagify-error"><p>' + imagifyAdmin.labels.errorPriceAPI + '</p></div>');
|
441 |
-
|
442 |
-
// show the modal content
|
443 |
-
$modal.find('.imagify-modal-loader').fadeOut(300);
|
444 |
-
|
445 |
-
return;
|
446 |
-
}
|
447 |
-
|
448 |
-
// Autofill coupon code & Show banner if discount is active
|
449 |
-
window.imagify_discount_datas = promo_datas;
|
450 |
-
|
451 |
-
if ( promo_datas.is_active ) {
|
452 |
-
var $banners = $( '.imagify-modal-promotion' ),
|
453 |
-
date_end = promo_datas.date_end.split('T')[0],
|
454 |
-
promo = promo_datas.coupon_value;
|
455 |
-
discount = promo_datas.coupon_type === 'percentage' ? promo + '%' : '$' + promo;
|
456 |
-
|
457 |
-
// fill coupon code
|
458 |
-
$( '#imagify-coupon-code' ).val( promo_datas.label ).attr( 'readonly', true );
|
459 |
-
|
460 |
-
// show banners
|
461 |
-
$banners.addClass( 'active' ).attr( 'aria-hidden', 'false' );
|
462 |
-
|
463 |
-
// populate banners
|
464 |
-
$banners.find( '.imagify-promotion-number' ).text( discount );
|
465 |
-
$banners.find( '.imagify-promotion-date' ).text( date_end );
|
466 |
-
|
467 |
-
|
468 |
-
// auto validate coupon
|
469 |
-
imagify_check_coupon();
|
470 |
-
}
|
471 |
-
|
472 |
-
/**
|
473 |
-
* Below lines will build Plan and Onetime offers lists
|
474 |
-
* It will also pre-select a Plan and Onetime in both of views: pre-checkout and pricing tables
|
475 |
-
*/
|
476 |
-
|
477 |
-
// Now, do the MONTHLIES Markup
|
478 |
-
$.each( monthlies, function( index, value ) {
|
479 |
-
|
480 |
-
// if it's free, don't show it
|
481 |
-
if ( value.label === 'free' ) {
|
482 |
-
return true; // continue-like (but $.each is not a loop… so)
|
483 |
-
}
|
484 |
-
|
485 |
-
var $tpl= $( mo_clone ).clone();
|
486 |
-
|
487 |
-
// if offer is too big (far) than estimated needs, don't show the offer
|
488 |
-
if ( mo_suggested !== false && ( index - mo_suggested ) > 2 ) {
|
489 |
-
return true;
|
490 |
-
}
|
491 |
-
|
492 |
-
// parent classes
|
493 |
-
classes = '';
|
494 |
-
if ( ( mo_user_cons < value.quota && mo_suggested === false ) ) {
|
495 |
-
classes = ' imagify-offer-selected';
|
496 |
-
mo_suggested = index;
|
497 |
-
|
498 |
-
// add this offer as pre-selected item in pre-checkout view
|
499 |
-
var $offer = $('.imagify-pre-checkout-offers').find('.imagify-offer-monthly');
|
500 |
-
|
501 |
-
// populate the Pre-checkout view depending on user_cons
|
502 |
-
imagify_populate_offer( $offer, value, 'monthly' );
|
503 |
-
}
|
504 |
-
|
505 |
-
// populate each offer
|
506 |
-
$tpl = imagify_populate_offer( $tpl, value, 'monthly', classes );
|
507 |
-
|
508 |
-
// complete Monthlies HTML
|
509 |
-
mo_html += $tpl[0].outerHTML;
|
510 |
-
|
511 |
-
});
|
512 |
-
|
513 |
-
// Deal with the case of too much small offers (before recommanded one)
|
514 |
-
var prev_offers = $( mo_html ).filter('.imagify-offer-selected').prevAll();
|
515 |
-
|
516 |
-
// if we have more than 1 previous offer
|
517 |
-
if ( prev_offers.length > 1 ) {
|
518 |
-
var nb_to_remove = prev_offers.length - 1,
|
519 |
-
$total_offers = $( mo_html );
|
520 |
-
|
521 |
-
// remove too far previous offer
|
522 |
-
for ( i = 0; i < nb_to_remove; i++ ) {
|
523 |
-
delete $total_offers[ i ]
|
524 |
-
}
|
525 |
-
|
526 |
-
// rebuild mo_html with removed items
|
527 |
-
mo_html = '';
|
528 |
-
for ( j = 0; j < $total_offers.length; j++) {
|
529 |
-
mo_html += $( '<div/>' ).append($total_offers[j]).html();
|
530 |
-
}
|
531 |
-
}
|
532 |
-
|
533 |
-
// Do the ONETIMES Markup
|
534 |
-
$.each( onetimes, function( index, value ) {
|
535 |
-
var $tpl = $( ot_clone ).clone(),
|
536 |
-
$offer = $( '.imagify-pre-checkout-offers' ).find( '.imagify-offer-onetime' );
|
537 |
-
|
538 |
-
// parent classes
|
539 |
-
classes = '';
|
540 |
-
if ( ( ot_user_cons < value.quota && ot_suggested === false ) ) {
|
541 |
-
classes = ' imagify-offer-selected';
|
542 |
-
ot_suggested = true;
|
543 |
-
|
544 |
-
// populate the Pre-checkout view depending on user_cons
|
545 |
-
imagify_populate_offer( $offer, value, 'onetime' );
|
546 |
-
}
|
547 |
-
|
548 |
-
// if too big, populate with the biggest offer available
|
549 |
-
// TODO: create custom offers at this point
|
550 |
-
if ( index === onetimes.length-1 && ot_suggested === false ) {
|
551 |
-
// populate the Pre-checkout view depending on user_cons
|
552 |
-
var tvalue = onetimes[ onetimes.length - 1 ];
|
553 |
-
imagify_populate_offer( $offer, tvalue, 'onetime' );
|
554 |
-
}
|
555 |
-
|
556 |
-
// populate each offer
|
557 |
-
$tpl = imagify_populate_offer( $tpl, value, 'onetime', classes );
|
558 |
-
|
559 |
-
// complete Onetimes HTML
|
560 |
-
ot_html += $tpl[0].outerHTML;
|
561 |
-
});
|
562 |
-
|
563 |
-
// Fill pricing tables
|
564 |
-
if ( $mo_tpl.parent().find( '.imagify-offer-line' ) ) {
|
565 |
-
$mo_tpl.parent().find( '.imagify-offer-line' ).remove();
|
566 |
-
}
|
567 |
-
$mo_tpl.before( mo_html );
|
568 |
-
|
569 |
-
if ( $ot_tpl.parent().find( '.imagify-offer-line' ) ) {
|
570 |
-
$ot_tpl.parent().find( '.imagify-offer-line' ).remove();
|
571 |
-
}
|
572 |
-
$ot_tpl.before( ot_html );
|
573 |
-
|
574 |
-
// Show the content
|
575 |
-
$modal.find( '.imagify-modal-loader' ).fadeOut( 300 );
|
576 |
-
|
577 |
-
} else {
|
578 |
-
// TODO: replace modal content by any information
|
579 |
-
// an error occurred
|
580 |
-
}
|
581 |
-
|
582 |
-
}); // third AJAX request to get discount information
|
583 |
|
584 |
-
|
585 |
-
|
586 |
-
// an error occurred
|
587 |
-
}
|
588 |
|
589 |
-
|
|
|
590 |
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
|
|
|
|
595 |
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
},
|
600 |
-
imagify_check_check = function( $checkbox ) {
|
601 |
-
var sel_class = 'imagify-offer-selected';
|
602 |
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
}
|
607 |
-
else {
|
608 |
-
$(this).closest('.imagify-offer-line').removeClass( sel_class );
|
609 |
-
}
|
610 |
-
});
|
611 |
|
612 |
-
|
613 |
-
|
614 |
-
|
615 |
-
|
616 |
-
|
617 |
-
|
618 |
-
|
619 |
-
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
|
628 |
-
|
629 |
-
|
630 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
631 |
|
632 |
-
|
|
|
633 |
|
634 |
-
if (
|
635 |
-
|
636 |
-
|
637 |
-
|
638 |
-
} else {
|
639 |
-
$parent.addClass( month_class ).removeClass( year_class );
|
640 |
-
$to_switch.find('.imagify-monthly').attr('aria-hidden', 'false');
|
641 |
-
$to_switch.find('.imagify-yearly').attr('aria-hidden', 'true');
|
642 |
}
|
643 |
-
});
|
644 |
|
645 |
-
|
646 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
647 |
|
648 |
-
|
649 |
-
|
650 |
-
|
651 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
652 |
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
$section = $( '.imagify-coupon-section' ),
|
657 |
-
nonce = $( '#imagify-get-pricing-modal' ).data( 'nonce' );
|
658 |
|
659 |
-
|
|
|
660 |
|
661 |
-
|
662 |
-
|
|
|
663 |
|
664 |
-
|
|
|
|
|
|
|
665 |
|
666 |
-
//
|
667 |
-
|
668 |
|
669 |
-
|
670 |
-
$
|
|
|
|
|
|
|
671 |
|
672 |
-
|
673 |
-
|
674 |
-
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
681 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
682 |
}
|
683 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
684 |
}
|
685 |
-
});
|
686 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
687 |
}
|
688 |
-
}
|
689 |
-
|
690 |
-
|
691 |
-
|
692 |
-
|
693 |
-
|
694 |
-
|
695 |
-
|
696 |
-
|
697 |
-
|
698 |
-
|
699 |
-
|
700 |
-
|
701 |
-
|
702 |
-
|
703 |
-
|
704 |
-
|
705 |
-
|
706 |
-
|
707 |
-
|
708 |
-
|
709 |
-
|
710 |
-
|
711 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
712 |
|
713 |
/**
|
714 |
-
*
|
715 |
-
*
|
716 |
*/
|
717 |
-
|
718 |
-
|
719 |
-
})
|
720 |
|
721 |
/**
|
722 |
* 1) Modal Payment change/select plan
|
723 |
* 2) Checkout selection(s)
|
724 |
* 3) Payment process
|
725 |
*/
|
726 |
-
|
727 |
-
// plans selection view & payment process view hidden by default
|
728 |
-
var $plans_view = $('#imagify-plans-selection-view'),
|
729 |
-
$payment_view = $('#imagify-payment-process-view'),
|
730 |
-
$pre_view = $('#imagify-pre-checkout-view'),
|
731 |
-
$success_view = $('#imagify-success-view'),
|
732 |
-
speedFadeIn = 300,
|
733 |
-
$another_btn = $('.imagify-choose-another-plan'),
|
734 |
-
imagify_iframe_set_src = function( params ) {
|
735 |
-
/*
|
736 |
-
params = {
|
737 |
-
'monthly': {
|
738 |
-
'lite': {
|
739 |
-
name: 'something',
|
740 |
-
id: ''
|
741 |
-
}
|
742 |
-
},
|
743 |
-
'onetime': {
|
744 |
-
'recommended': {
|
745 |
-
name: 'Recommend',
|
746 |
-
id: ''
|
747 |
-
}
|
748 |
-
},
|
749 |
-
'period': 'monthly'|'yearly'
|
750 |
-
}
|
751 |
-
*/
|
752 |
-
var $iframe = $('#imagify-payment-iframe'),
|
753 |
-
iframe_src = $iframe.attr('src'),
|
754 |
-
pay_src = $iframe.data('src'),
|
755 |
-
monthly_id = 0,
|
756 |
-
onetime_id = 0;
|
757 |
-
|
758 |
-
// if we get new informations about products
|
759 |
-
if ( typeof params === 'object' ) {
|
760 |
-
if ( params.monthly ) {
|
761 |
-
monthly_id = params.monthly[ Object.keys( params.monthly )[0] ].id;
|
762 |
-
}
|
763 |
-
if ( params.onetime ) {
|
764 |
-
onetime_id = params.onetime[ Object.keys( params.onetime )[0] ].id;
|
765 |
-
// if onetime ID === 999 it's a custom plan, send datas instead
|
766 |
-
onetime_id = ( onetime_id == 999 ? params.onetime[ Object.keys( params.onetime )[0] ].data : onetime_id );
|
767 |
-
}
|
768 |
-
|
769 |
-
if ( params.period ) {
|
770 |
-
var key = imagify_get_api_key(),
|
771 |
-
rt_onetime = onetime_id,
|
772 |
-
rt_yearly = params.period === 'yearly' ? monthly_id : 0,
|
773 |
-
rt_monthly = params.period === 'monthly' ? monthly_id : 0,
|
774 |
-
coupon = $('#imagify-coupon-code').val(),
|
775 |
-
rt_coupon = coupon === '' ? 'none' : coupon,
|
776 |
-
// not used but…
|
777 |
-
amount = parseFloat( $( '.imagify-global-amount' ).text() ).toFixed(2);
|
778 |
-
|
779 |
-
// compose route
|
780 |
-
// pay_src + :ontimeplan(0)/:monthlyplan(0)/:yearlyplan(0)/:coupon(none)/
|
781 |
-
pay_src = pay_src + rt_onetime + '/' + rt_monthly + '/' + rt_yearly + '/' + rt_coupon + '/';
|
782 |
-
|
783 |
-
// iFrame sort of cache fix
|
784 |
-
$iframeClone = $iframe.clone();
|
785 |
-
$iframe.remove();
|
786 |
-
|
787 |
-
$iframeClone.attr( 'src', pay_src );
|
788 |
-
$payment_view.html( $iframeClone );
|
789 |
|
790 |
-
|
791 |
-
|
792 |
-
|
793 |
-
}
|
794 |
-
// if we only change monthly/yearly payment mode
|
795 |
-
else if ( typeof params === 'string' && iframe_src !== '' ) {
|
796 |
-
tofind = params === 'monthly' ? 'yearly' : 'monthly';
|
797 |
-
iframe_src = iframe_src.replace( tofind, params );
|
798 |
-
$iframe.attr( 'src', iframe_src );
|
799 |
-
}
|
800 |
-
},
|
801 |
-
imagify_get_period = function() {
|
802 |
-
return ( $('.imagify-offer-monthly').hasClass('imagify-month-selected') ? 'monthly' : 'yearly' );
|
803 |
-
},
|
804 |
-
imagify_get_api_key = function(){
|
805 |
-
return $('#imagify-payment-iframe').data('imagify-api');
|
806 |
-
};
|
807 |
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
813 |
-
|
814 |
-
|
815 |
-
|
816 |
-
|
817 |
-
|
818 |
-
|
|
|
|
|
819 |
}
|
820 |
-
|
821 |
-
|
822 |
-
|
823 |
-
|
824 |
-
|
825 |
-
|
826 |
-
if ( $(this).val().length >= 3 ) {
|
827 |
-
$(this).closest( '.imagify-coupon-input' ).addClass( 'imagify-canbe-validate' );
|
828 |
-
} else {
|
829 |
-
$(this).closest( '.imagify-coupon-input' ).removeClass( 'imagify-canbe-validate' );
|
830 |
-
}
|
831 |
}
|
832 |
-
} );
|
833 |
|
834 |
-
|
835 |
-
|
836 |
-
|
837 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
838 |
/**
|
839 |
-
*
|
840 |
*/
|
841 |
-
|
842 |
-
|
843 |
-
|
844 |
-
|
845 |
-
|
846 |
-
|
847 |
-
|
848 |
-
|
849 |
-
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
$
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
-
|
868 |
-
|
|
|
|
|
|
|
|
|
|
|
869 |
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
// 1.b) on click in a choice, return to pre-checkout step
|
874 |
-
$modal.on('click.imagify', '.imagify-payment-btn-select-plan', function(){
|
875 |
-
|
876 |
-
var $_this = $(this),
|
877 |
-
$offer_line = $_this.closest('.imagify-offer-line'),
|
878 |
-
datas = $_this.data('offer'),
|
879 |
-
datas_str = $_this.attr('data-offer'),
|
880 |
-
is_onetime = ( $_this.closest('.imagify-tab-content').attr('id') === 'imagify-pricing-tab-monthly' ? false : true ),
|
881 |
-
$target_line = ( is_onetime ? $pre_view.find('.imagify-offer-onetime') : $pre_view.find('.imagify-offer-monthly') ),
|
882 |
-
period = ( is_onetime ? null : ( ( $_this.closest('.imagify-pricing-table').hasClass('imagify-month-selected') ) ? 'monthly' : 'yearly') ),
|
883 |
-
price = ( is_onetime ? imagify_get_html_price( datas[ Object.keys( datas )[0] ].price ) : imagify_get_html_price ( datas[ Object.keys( datas )[0] ].prices, period ) ),
|
884 |
-
discount = $offer_line.find('.imagify-price-discount').html(),
|
885 |
-
imgs = $offer_line.find('.imagify-approx-nb').text(),
|
886 |
-
offer_size = $offer_line.find('.imagify-offer-size').text(),
|
887 |
-
monthly_txt = ( ! is_onetime ? '<span class="imagify-price-by">' + $offer_line.find('.imagify-price-by').text() + '</span>' : '' );
|
888 |
-
|
889 |
-
// change views to go back pre-checkout
|
890 |
-
$plans_view.hide().attr('aria-hidden', 'true');
|
891 |
-
$pre_view.fadeIn(speedFadeIn).attr('aria-hidden', 'false');
|
892 |
-
|
893 |
-
// change price (+ "/month" if found in monthly plans)
|
894 |
-
$target_line.find('.imagify-number-block').html( price + monthly_txt )
|
895 |
-
|
896 |
-
// change discount
|
897 |
-
$target_line.find('.imagify-price-discount').html( discount );
|
898 |
-
|
899 |
-
// change approx images nb
|
900 |
-
$target_line.find('.imagify-approx-nb').text( imgs );
|
901 |
-
|
902 |
-
// change offer size name
|
903 |
-
$target_line.find('.imagify-offer-size').text( offer_size );
|
904 |
-
|
905 |
-
// change datas (json)
|
906 |
-
$target_line.attr('data-offer', datas_str );
|
907 |
-
|
908 |
-
if ( ! is_onetime ) {
|
909 |
-
$target_line.find('.imagify-price-add-data').text( $offer_line.find('.imagify-price-add-data').text() );
|
910 |
-
|
911 |
-
// trigger period selected from offer selection view to pre-checkout view
|
912 |
-
if ( period === 'monthly' ) {
|
913 |
-
$target_line.find('#imagify-subscription-monthly').trigger('click.imagify');
|
914 |
-
}
|
915 |
-
else {
|
916 |
-
$target_line.find('#imagify-subscription-yearly').trigger('click.imagify');
|
917 |
-
}
|
918 |
-
$target_line.find('.imagify-inline-options').find('input:radio:checked').trigger('change.imagify');
|
919 |
}
|
920 |
|
921 |
-
|
922 |
-
|
|
|
923 |
|
924 |
-
|
925 |
-
|
|
|
|
|
|
|
926 |
|
|
|
|
|
|
|
|
|
927 |
|
928 |
-
|
929 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
930 |
|
931 |
-
//
|
932 |
-
|
933 |
-
|
934 |
-
}
|
935 |
|
936 |
-
|
937 |
-
|
938 |
-
checkout_datas = {},
|
939 |
-
period_choosen = $monthly_offer.hasClass( 'imagify-year-selected' ) ? 'year' : 'month';
|
940 |
|
941 |
-
|
942 |
-
|
943 |
-
|
944 |
-
checkout_datas.monthly = JSON.parse( $monthly_offer.attr( 'data-offer' ) );
|
945 |
-
$( '.imagify-cart-list-my-choice' ).show();
|
946 |
|
947 |
-
|
948 |
-
|
949 |
-
|
950 |
-
|
|
|
|
|
|
|
951 |
|
952 |
-
|
953 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
954 |
}
|
955 |
|
956 |
-
|
957 |
-
|
958 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
959 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
960 |
|
961 |
-
|
962 |
-
|
963 |
-
|
964 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
965 |
|
966 |
-
|
|
|
|
|
|
|
|
|
|
|
967 |
|
968 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
969 |
return false;
|
970 |
-
}
|
971 |
-
|
972 |
-
|
973 |
-
|
974 |
-
|
975 |
-
|
976 |
-
|
977 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
978 |
|
979 |
-
|
980 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
981 |
} else {
|
982 |
-
$
|
983 |
}
|
|
|
|
|
984 |
|
985 |
-
|
986 |
-
|
|
|
|
|
987 |
|
988 |
-
|
989 |
-
|
990 |
-
|
991 |
-
|
992 |
-
|
993 |
-
|
994 |
-
|
995 |
-
|
996 |
-
|
997 |
-
$( '.imagify-iframe-viewing' ).removeClass( 'imagify-iframe-viewing' );
|
998 |
-
return false;
|
999 |
-
},
|
1000 |
-
paymentBack = function() {
|
1001 |
-
$( '.imagify-iframe-viewing' ).removeClass( 'imagify-iframe-viewing' );
|
1002 |
-
$payment_view.hide();
|
1003 |
-
$pre_view.fadeIn(200);
|
1004 |
-
return false;
|
1005 |
-
},
|
1006 |
-
paymentSuccess = function() {
|
1007 |
-
$( '.imagify-iframe-viewing' ).removeClass( 'imagify-iframe-viewing' );
|
1008 |
-
$payment_view.hide();
|
1009 |
-
$success_view.closest( '.imagify-modal-content' ).addClass( 'imagify-success-viewing' );
|
1010 |
-
$success_view.closest( '.imagify-modal' ).attr( 'aria-labelledby', 'imagify-success-view' );
|
1011 |
-
$success_view.fadeIn(200);
|
1012 |
-
return false;
|
1013 |
-
},
|
1014 |
-
checkPluginMessage = function(event) {
|
1015 |
-
var origin = event.origin || event.originalEvent.origin;
|
1016 |
-
|
1017 |
-
if ( origin === 'https://app.imagify.io' || origin === 'http://dapp.imagify.io' ) {
|
1018 |
-
switch (event.data) {
|
1019 |
-
case 'cancel': paymentClose(); break;
|
1020 |
-
case 'back': paymentBack(); break;
|
1021 |
-
case 'success': paymentSuccess(); break;
|
1022 |
-
}
|
1023 |
-
}
|
1024 |
-
};
|
1025 |
|
1026 |
-
//
|
1027 |
-
|
|
|
|
|
1028 |
|
1029 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1030 |
|
1031 |
/**
|
1032 |
-
*
|
1033 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1034 |
* @Markup:
|
1035 |
* ul.imagify-tabs
|
1036 |
-
*
|
1037 |
-
*
|
1038 |
* div.imagify-tabs-contents
|
1039 |
-
*
|
1040 |
*/
|
1041 |
-
|
1042 |
-
|
1043 |
-
|
|
|
1044 |
|
1045 |
-
|
1046 |
-
|
1047 |
-
var $_this = $(this);
|
1048 |
|
1049 |
-
|
1050 |
-
|
1051 |
-
|
1052 |
|
1053 |
-
|
1054 |
-
$_this.closest('.imagify-tabs').next('.imagify-tabs-contents').find('.imagify-tab-content').hide().attr('aria-hidden', 'true');
|
1055 |
-
$( target ).fadeIn(275).attr('aria-hidden', 'false');
|
1056 |
|
1057 |
-
|
1058 |
-
|
1059 |
-
|
1060 |
-
}
|
1061 |
|
1062 |
-
|
1063 |
-
|
|
|
|
|
1064 |
|
1065 |
-
|
1066 |
-
});
|
1 |
+
/* globals ajaxurl: false, console: false, imagify: true, imagifyAdmin: true, swal: false, Promise: false */
|
2 |
+
|
3 |
+
window.imagify = window.imagify || {
|
4 |
+
concat: ajaxurl.indexOf( '?' ) > 0 ? '&' : '?',
|
5 |
+
log: function( content ) {
|
6 |
+
if ( undefined !== console ) {
|
7 |
+
console.log( content );
|
8 |
+
}
|
9 |
+
},
|
10 |
+
info: function( content ) {
|
11 |
+
if ( undefined !== console ) {
|
12 |
+
console.info( content );
|
13 |
+
}
|
14 |
+
}
|
15 |
+
};
|
16 |
+
|
17 |
+
// Admin bar =======================================================================================
|
18 |
+
(function($, d, w, undefined) {
|
19 |
+
|
20 |
+
var busy = false;
|
21 |
+
|
22 |
+
$( '#wp-admin-bar-imagify' ).hover( function() {
|
23 |
+
var $adminBarProfile;
|
24 |
+
|
25 |
+
if ( true === busy ) {
|
26 |
+
return;
|
27 |
+
}
|
28 |
+
|
29 |
+
busy = true;
|
30 |
+
|
31 |
+
$adminBarProfile = $( '#wp-admin-bar-imagify-profile-content' );
|
32 |
+
|
33 |
+
if ( ! $adminBarProfile.is( ':empty' ) ) {
|
34 |
+
return;
|
35 |
+
}
|
36 |
+
|
37 |
+
$.get( ajaxurl + imagify.concat + 'action=imagify_get_admin_bar_profile&imagifygetadminbarprofilenonce=' + $( '#imagifygetadminbarprofilenonce' ).val() )
|
38 |
+
.done( function( response ) {
|
39 |
+
$adminBarProfile.html( response.data );
|
40 |
+
$( '#wp-admin-bar-imagify-profile-loading' ).remove();
|
41 |
+
busy = false;
|
42 |
+
} );
|
43 |
+
} );
|
44 |
+
|
45 |
+
} )(jQuery, document, window);
|
46 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
|
48 |
+
// The big welcome notice ==========================================================================
|
49 |
+
(function($, d, w, undefined) {
|
50 |
+
|
51 |
+
/**
|
52 |
+
* 1. Create a new Imagify account.
|
53 |
*/
|
54 |
+
$( '#imagify-signup' ).on( 'click.imagify', function( e ) {
|
55 |
e.preventDefault();
|
56 |
|
57 |
+
// Display the sign up form.
|
58 |
+
swal( {
|
59 |
+
title: imagifyAdmin.labels.signupTitle,
|
60 |
+
html: imagifyAdmin.labels.signupText,
|
61 |
+
confirmButtonText: imagifyAdmin.labels.signupConfirmButtonText,
|
62 |
+
input: 'email',
|
63 |
+
allowOutsideClick: true,
|
|
|
64 |
showLoaderOnConfirm: true,
|
65 |
+
customClass: 'imagify-sweet-alert imagify-sweet-alert-signup',
|
66 |
+
inputValidator: function( inputValue ) {
|
67 |
+
return new Promise( function( resolve, reject ) {
|
68 |
+
if ( $.trim( inputValue ) === '' || ! inputValue ) {
|
69 |
+
reject( imagifyAdmin.labels.signupErrorEmptyEmail );
|
70 |
+
} else {
|
71 |
+
resolve();
|
72 |
+
}
|
73 |
+
} );
|
74 |
+
},
|
75 |
+
preConfirm: function( inputValue ) {
|
76 |
+
return new Promise( function( resolve, reject ) {
|
77 |
+
setTimeout( function() {
|
78 |
+
$.get( ajaxurl + imagify.concat + 'action=imagify_signup&email=' + inputValue + '&imagifysignupnonce=' + $( '#imagifysignupnonce' ).val() )
|
79 |
+
.done( function( response ) {
|
80 |
+
if ( ! response.success ) {
|
81 |
+
reject( response.data );
|
82 |
+
} else {
|
83 |
+
resolve();
|
84 |
+
}
|
85 |
+
} );
|
86 |
+
}, 2000 );
|
87 |
+
} );
|
88 |
},
|
89 |
+
} ).then( function() {
|
90 |
+
swal( {
|
91 |
+
title: imagifyAdmin.labels.signupSuccessTitle,
|
92 |
+
html: imagifyAdmin.labels.signupSuccessText,
|
93 |
+
type: 'success',
|
94 |
+
customClass: 'imagify-sweet-alert'
|
95 |
+
} );
|
96 |
+
} );
|
97 |
+
} );
|
98 |
+
|
99 |
+
/**
|
100 |
+
* 2. Check and save the Imagify API Key.
|
101 |
*/
|
102 |
+
$( '#imagify-save-api-key' ).on( 'click.imagify', function( e ) {
|
103 |
e.preventDefault();
|
104 |
|
105 |
+
// Display the API key form.
|
106 |
+
swal( {
|
107 |
+
title: imagifyAdmin.labels.saveApiKeyTitle,
|
108 |
+
html: imagifyAdmin.labels.saveApiKeyText,
|
109 |
+
confirmButtonText: imagifyAdmin.labels.saveApiKeyConfirmButtonText,
|
110 |
+
input: 'text',
|
111 |
+
allowOutsideClick: true,
|
112 |
showLoaderOnConfirm: true,
|
113 |
+
customClass: 'imagify-sweet-alert imagify-sweet-alert-signup',
|
114 |
+
inputValidator: function( inputValue ) {
|
115 |
+
return new Promise( function( resolve, reject ) {
|
116 |
+
if ( $.trim( inputValue ) === '' || ! inputValue ) {
|
117 |
+
reject( imagifyAdmin.labels.ApiKeyErrorEmpty );
|
118 |
+
} else {
|
119 |
+
resolve();
|
120 |
+
}
|
121 |
+
} );
|
122 |
},
|
123 |
+
preConfirm: function( inputValue ) {
|
124 |
+
return new Promise( function( resolve, reject ) {
|
125 |
+
$.get( ajaxurl + imagify.concat + 'action=imagify_check_api_key_validity&api_key=' + inputValue + '&imagifycheckapikeynonce=' + $( '#imagifycheckapikeynonce' ).val() )
|
126 |
+
.done( function( response ) {
|
127 |
+
if ( ! response.success ) {
|
128 |
+
reject( response.data );
|
129 |
+
} else {
|
130 |
+
resolve();
|
131 |
+
}
|
132 |
+
} );
|
133 |
+
} );
|
134 |
},
|
135 |
+
} ).then( function() {
|
136 |
+
swal( {
|
137 |
+
title: imagifyAdmin.labels.ApiKeyCheckSuccessTitle,
|
138 |
+
html: imagifyAdmin.labels.ApiKeyCheckSuccessText,
|
139 |
+
type: 'success',
|
140 |
+
customClass: 'imagify-sweet-alert'
|
141 |
+
} );
|
142 |
+
} );
|
143 |
+
} );
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Close an Imagify notice.
|
147 |
*/
|
148 |
+
$( '.imagify-notice-dismiss' ).on( 'click.imagify', function( e ) {
|
149 |
+
var $this = $( this ),
|
150 |
+
$parent = $this.parents( '.imagify-welcome, .imagify-notice' ),
|
151 |
+
href = $this.attr( 'href' );
|
152 |
+
|
153 |
e.preventDefault();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
|
155 |
+
// Hide the notice.
|
156 |
+
$parent.fadeTo( 100 , 0, function() {
|
157 |
+
$( this ).slideUp( 100, function() {
|
158 |
+
$( this ).remove();
|
159 |
+
} );
|
160 |
+
} );
|
161 |
+
|
162 |
+
// Save the dismiss notice.
|
163 |
+
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) );
|
164 |
+
} );
|
165 |
+
|
166 |
+
} )(jQuery, document, window);
|
167 |
|
|
|
|
|
168 |
|
169 |
+
// Imagify light modal =============================================================================
|
170 |
+
(function($, d, w, undefined) {
|
171 |
+
|
172 |
+
var imagify_open_modal = function( $the_link ) {
|
173 |
+
var the_target = $the_link.data( 'target' ) || $the_link.attr( 'href' );
|
174 |
+
|
175 |
+
$( the_target ).css( 'display', 'flex' ).hide().fadeIn( 400 ).attr( 'aria-hidden', 'false' ).attr( 'tabindex', '0' ).focus().removeAttr( 'tabindex' ).addClass( 'modal-is-open' );
|
176 |
+
$( 'body' ).addClass( 'imagify-modal-is-open' );
|
177 |
};
|
178 |
|
179 |
+
// Accessibility.
|
180 |
$( '.imagify-modal' ).attr( 'aria-hidden', 'true' );
|
181 |
|
182 |
+
$( d )
|
183 |
+
// On click on modal trigger.
|
184 |
+
.on( 'click.imagify', '.imagify-modal-trigger', function() {
|
185 |
+
imagify_open_modal( $( this ) );
|
186 |
return false;
|
187 |
+
} )
|
188 |
+
// On click on close button.
|
189 |
+
.on( 'click.imagify', '.imagify-modal .close-btn', function() {
|
190 |
+
var $modal = $( this ).closest( '.imagify-modal' );
|
191 |
+
|
192 |
+
$modal.fadeOut( 400 ).attr( 'aria-hidden', 'true' ).removeClass( 'modal-is-open' ).trigger( 'modalClosed.imagify' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
193 |
|
194 |
$( 'body' ).removeClass( 'imagify-modal-is-open' );
|
195 |
+
} )
|
196 |
+
// On close button blur, improve accessibility.
|
197 |
+
.on( 'blur.imagify', '.imagify-modal .close-btn', function() {
|
198 |
+
var $modal = $( this ).closest( '.imagify-modal' );
|
|
|
|
|
|
|
199 |
|
200 |
+
if ( $modal.attr( 'aria-hidden' ) === 'false' ) {
|
201 |
+
$modal.attr( 'tabindex', '0' ).focus().removeAttr( 'tabindex' );
|
202 |
+
}
|
203 |
+
} )
|
204 |
+
// On click on dropped layer of modal.
|
205 |
+
.on( 'click.imagify', '.imagify-modal', function( e ) {
|
206 |
$( e.target ).filter( '.modal-is-open' ).find( '.close-btn' ).trigger( 'click.imagify' );
|
207 |
+
} )
|
208 |
+
// `Esc` key binding.
|
209 |
+
.on( 'keydown.imagify', function( e ) {
|
210 |
+
if ( 27 === e.keyCode && $( '.imagify-modal.modal-is-open' ).length > 0 ) {
|
|
|
|
|
211 |
e.preventDefault();
|
212 |
+
// Trigger the event.
|
213 |
+
$( '.imagify-modal.modal-is-open' ).find( '.close-btn' ).trigger( 'click.imagify' );
|
|
|
214 |
|
215 |
return false;
|
216 |
}
|
217 |
+
} );
|
218 |
+
|
219 |
+
} )(jQuery, document, window);
|
220 |
+
|
221 |
+
|
222 |
+
// Imagify payment modal ===========================================================================
|
223 |
+
(function($, d, w, undefined) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
|
225 |
/**
|
226 |
+
* Payment Modal.
|
227 |
+
*
|
228 |
* @since 1.6
|
229 |
* @since 1.6.3 include discount campaign
|
230 |
* @author Geoffrey
|
231 |
*/
|
232 |
+
var imagifyModal = {};
|
|
|
|
|
|
|
|
|
|
|
233 |
|
234 |
+
if ( ! $( '#imagify-pricing-modal' ).length ) {
|
235 |
+
return;
|
236 |
+
}
|
|
|
|
|
237 |
|
238 |
+
imagifyModal = {
|
239 |
+
$modal: $( '#imagify-pricing-modal' ),
|
240 |
+
$checkboxes: $( '.imagify-offer-line .imagify-checkbox' ),
|
241 |
+
$radios: $( '.imagify-payment-modal .imagify-radio-line input' ),
|
242 |
+
// Plans selection view & payment process view hidden by default.
|
243 |
+
$preView: $( '#imagify-pre-checkout-view' ),
|
244 |
+
$plansView: $( '#imagify-plans-selection-view' ).hide(),
|
245 |
+
$paymentView: $( '#imagify-payment-process-view' ).hide(),
|
246 |
+
$successView: $( '#imagify-success-view' ).hide(),
|
247 |
+
$anotherBtn: $( '.imagify-choose-another-plan' ),
|
248 |
+
speedFadeIn: 300,
|
249 |
+
|
250 |
+
getHtmlPrice: function( content, period ) {
|
251 |
+
var monthly, yearly, m, y, output;
|
252 |
+
|
253 |
+
if ( ! period ) {
|
254 |
+
period = null;
|
255 |
+
}
|
256 |
|
257 |
+
if ( typeof content !== 'object' ) {
|
258 |
+
content += ''; // Be sure content is a string.
|
259 |
+
content = content.split( '.' );
|
260 |
+
content[1] = content[1].length === 1 ? content[1] + '0' : ( '' + content[1] ).substring( 0, 2 );
|
261 |
+
|
262 |
+
output = '<span class="imagify-price-big">' + content[0] + '</span> ';
|
263 |
+
output += '<span class="imagify-price-mini">.' + content[1] + '</span>';
|
264 |
|
265 |
return output;
|
266 |
+
}
|
267 |
+
|
268 |
+
monthly = content.monthly + '';
|
269 |
+
yearly = content.yearly + '';
|
270 |
+
m = monthly.split( '.' );
|
271 |
+
y = yearly.split( '.' );
|
272 |
+
output = '<span class="imagify-switch-my">';
|
273 |
+
output += '<span aria-hidden="' + ( period === 'monthly' ? 'false' : 'true' ) + '" class="imagify-monthly">';
|
274 |
+
output += '<span class="imagify-price-big">' + m[0] + '</span> ';
|
275 |
+
output += '<span class="imagify-price-mini">.' + ( m[1].length === 1 ? m[1] + '0' : ( '' + m[1] ).substring( 0, 2 ) ) + '</span>';
|
276 |
+
output += '</span> ';
|
277 |
+
output += '<span aria-hidden="' + ( period === 'yearly' ? 'false' : 'true' ) + '" class="imagify-yearly">';
|
278 |
+
output += '<span class="imagify-price-big">' + y[0] + '</span> ';
|
279 |
+
output += '<span class="imagify-price-mini">.' + ( y[1].length === 1 ? y[1] + '0' : ( '' + y[1] ).substring( 0, 2 ) ) + '</span>';
|
280 |
+
output += '</span>';
|
281 |
+
output += '</span>';
|
282 |
+
|
283 |
+
return output;
|
284 |
+
},
|
285 |
+
|
286 |
+
getHtmlDiscountPrice: function( content, period ) {
|
287 |
+
var monthly, yearly,
|
288 |
output = '';
|
289 |
|
290 |
+
if ( ! period ) {
|
291 |
+
period = null;
|
292 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
293 |
|
294 |
+
if ( typeof content === 'object' ) {
|
295 |
+
monthly = content.monthly + '';
|
296 |
+
yearly = content.yearly + '';
|
297 |
+
|
298 |
+
output += '<span class="imagify-price-discount">';
|
299 |
+
output += '<span class="imagify-price-discount-dollar">$</span>';
|
300 |
+
output += '<span class="imagify-switch-my">';
|
301 |
+
output += '<span aria-hidden="' + ( period === 'monthly' ? 'false' : 'true' ) + '" class="imagify-monthly">';
|
302 |
+
output += '<span class="imagify-price-discount-number">' + monthly + '</span>';
|
303 |
+
output += '</span>';
|
304 |
+
output += '<span aria-hidden="' + ( period === 'yearly' ? 'false' : 'true' ) + '" class="imagify-yearly">';
|
305 |
+
output += '<span class="imagify-price-discount-number">' + yearly + '</span>';
|
306 |
+
output += '</span>';
|
307 |
+
output += '</span>';
|
308 |
+
output += '</span>';
|
309 |
+
} else {
|
310 |
+
content += ''; // Be sure content is a string.
|
311 |
+
output += '<span class="imagify-price-discount">';
|
312 |
+
output += '<span class="imagify-price-discount-dollar">$</span>';
|
313 |
+
output += '<span class="imagify-price-discount-number">' + content + '</span>';
|
314 |
+
output += '</span>';
|
315 |
+
}
|
316 |
|
317 |
+
return output;
|
318 |
+
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
319 |
|
320 |
+
/**
|
321 |
+
* @uses imagifyModal.getHtmlPrice()
|
322 |
+
* @uses imagifyModal.getHtmlDiscountPrice()
|
323 |
+
*/
|
324 |
+
populateOffer: function ( $offer, datas, type, classes ) {
|
325 |
+
var promo = w.imagify_discount_datas,
|
326 |
+
add = datas.additional_gb, // 4 (monthly)
|
327 |
+
ann = datas.annual_cost, // 49.9 (monthly)
|
328 |
+
id = datas.id, // 3 (monthly/onetime)
|
329 |
+
lab = datas.label, // 'lite' (monthly/onetime)
|
330 |
+
mon = datas.monthly_cost, // 4.99 (monthly)
|
331 |
+
quo = datas.quota, // 1000 (MB) - 5000 images (monthly/onetime)
|
332 |
+
cos = datas.cost, // 3.49 (onetime)
|
333 |
+
name = ( quo >= 1000 ? quo/1000 + ' GB' : quo + ' MB' ),
|
334 |
+
pcs = type === 'monthly' ? { monthly: mon, yearly: Math.round( ann / 12 * 100 ) / 100 } : cos,
|
335 |
+
pcsd = pcs, // Used if discount is active.
|
336 |
+
percent, $datas_c, datas_content;
|
337 |
+
|
338 |
+
// Change pricing value only if discount in percentage is active and if offer is a monthly and not a onetime.
|
339 |
+
if ( promo.is_active && 'percentage' === promo.coupon_type && 'monthly' === type ) {
|
340 |
+
percent = ( 100 - promo.coupon_value ) / 100;
|
341 |
+
pcs = 'monthly' === type ? { monthly: mon * percent, yearly: Math.round( ( ann * percent ) / 12 * 100 ) / 100 } : cos * percent;
|
342 |
+
}
|
343 |
|
344 |
+
if ( typeof classes !== 'undefined' ) {
|
345 |
+
$offer.addClass( 'imagify-' + type + '-' + lab + classes);
|
346 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
347 |
|
348 |
+
// Name.
|
349 |
+
$offer.find( '.imagify-offer-size' ).text( name );
|
350 |
|
351 |
+
// Main prices (pcs can be an object or a string).
|
352 |
+
$offer.find( '.imagify-number-block' ).html( imagifyModal.getHtmlPrice( pcs, 'monthly' ) );
|
|
|
|
|
353 |
|
354 |
+
// discount prices
|
355 |
+
if ( promo.is_active && 'percentage' === promo.coupon_type && 'monthly' === type ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
356 |
|
357 |
+
$offer.find( '.imagify-price-block' ).prev( '.imagify-price-discount' ).remove();
|
358 |
+
$offer.find( '.imagify-price-block' ).before( imagifyModal.getHtmlDiscountPrice( pcsd, 'monthly' ) );
|
359 |
+
}
|
360 |
|
361 |
+
// Nb images.
|
362 |
+
$offer.find( '.imagify-approx-nb' ).text( quo * 5 );
|
363 |
+
|
364 |
+
if ( 'monthly' === type ) {
|
365 |
+
// Additionnal price.
|
366 |
+
$offer.find( '.imagify-price-add-data' ).text( '$' + add );
|
367 |
+
}
|
368 |
+
|
369 |
+
// Button data-offer attr.
|
370 |
+
$datas_c = $offer.find( '.imagify-payment-btn-select-plan' ).length ? $offer.find( '.imagify-payment-btn-select-plan' ) : $offer;
|
371 |
+
|
372 |
+
if ( 'monthly' === type ) {
|
373 |
+
datas_content = '{"' + lab + '":{"id":' + id + ',"name":"' + name + '","data":' + quo + ',"dataf":"' + name + '","imgs":' + ( quo * 5 ) + ',"prices":{"monthly":' + pcs.monthly + ',"yearly":' + pcs.yearly + ',"add":' + add + '}}}';
|
374 |
+
} else {
|
375 |
+
datas_content = '{"ot' + lab + '":{"id":' + id + ',"name":"' + name + '","data":' + quo + ',"dataf":"' + name + '","imgs":' + ( quo * 5 ) + ',"price":' + pcs + '}}';
|
376 |
+
}
|
377 |
+
|
378 |
+
$datas_c.attr( 'data-offer', datas_content );
|
379 |
|
380 |
+
return $offer;
|
381 |
+
},
|
382 |
|
383 |
+
populatePayBtn: function() {
|
384 |
+
var pl_datas = JSON.parse( $( '.imagify-offer-monthly' ).attr( 'data-offer' ) ),
|
385 |
+
ot_datas = JSON.parse( $( '.imagify-offer-onetime' ).attr( 'data-offer' ) ),
|
386 |
+
price = 0,
|
387 |
+
price_pl = 0,
|
388 |
+
price_ot = 0;
|
389 |
|
390 |
+
// Calculate price_pl only if that offer is selected.
|
391 |
+
if ( $( '.imagify-offer-monthly' ).hasClass( 'imagify-offer-selected' ) ) {
|
392 |
+
if ( $( '#imagify-subscription-monthly' ).filter( ':checked' ).length ) {
|
393 |
+
price_pl = pl_datas[ Object.keys( pl_datas )[0] ].prices.monthly;
|
394 |
} else {
|
395 |
+
price_pl = pl_datas[ Object.keys( pl_datas )[0] ].prices.yearly * 12;
|
396 |
}
|
397 |
+
}
|
398 |
|
399 |
+
// Calculate price_ot only if that offer is selected.
|
400 |
+
if ( $( '.imagify-offer-onetime' ).hasClass( 'imagify-offer-selected' ) ) {
|
401 |
+
price_ot = ot_datas[ Object.keys( ot_datas )[0] ].price;
|
402 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
403 |
|
404 |
+
// Calculate price.
|
405 |
+
price = parseFloat( price_ot + price_pl ).toFixed( 2 );
|
|
|
|
|
406 |
|
407 |
+
// Edit button price.
|
408 |
+
//$( '.imagify-global-amount' ).text( price ); // Not used.
|
409 |
|
410 |
+
if ( '0.00' === price || 0 === price ) {
|
411 |
+
$( '#imagify-modal-checkout-btn' ).attr( 'disabled', 'disabled' ).addClass( 'imagify-button-disabled' );
|
412 |
+
} else {
|
413 |
+
$( '#imagify-modal-checkout-btn' ).removeAttr( 'disabled' ).removeClass( 'imagify-button-disabled' );
|
414 |
+
}
|
415 |
+
},
|
416 |
|
417 |
+
checkCoupon: function() {
|
418 |
+
var code = $( '#imagify-coupon-code' ).val(),
|
419 |
+
$cptext, $label, $section, nonce;
|
|
|
|
|
|
|
420 |
|
421 |
+
if ( '' === code ) {
|
422 |
+
return;
|
423 |
+
}
|
|
|
|
|
|
|
|
|
|
|
424 |
|
425 |
+
$cptext = $( '.imagify-coupon-text' );
|
426 |
+
$label = $cptext.find( 'label' );
|
427 |
+
$section = $( '.imagify-coupon-section' );
|
428 |
+
nonce = $( '#imagify-get-pricing-modal' ).data( 'nonce' );
|
429 |
+
|
430 |
+
$cptext.addClass( 'checking' );
|
431 |
+
|
432 |
+
// Get the true prices.
|
433 |
+
$.post( ajaxurl, { action: 'imagify_check_coupon', coupon: code, imagifynonce: nonce }, function( response ) {
|
434 |
+
var coupon_value;
|
435 |
+
|
436 |
+
$cptext.removeClass( 'checking' );
|
437 |
+
|
438 |
+
// Error during the request.
|
439 |
+
if ( ! response.success ) {
|
440 |
+
$section.removeClass( 'validated' ).addClass( 'invalid' );
|
441 |
+
$label.text( imagifyAdmin.labels.errorCouponAPI );
|
442 |
+
} else if ( response.data.success ) {
|
443 |
+
coupon_value = 'percentage' === response.data.coupon_type ? response.data.value + '%' : '$' + response.data.value;
|
444 |
+
$section.removeClass( 'invalid' ).addClass( 'validated' );
|
445 |
+
$label.html( imagifyAdmin.labels.successCouponAPI );
|
446 |
+
$label.find( '.imagify-coupon-offer' ).text( coupon_value );
|
447 |
+
$label.find( '.imagify-coupon-word' ).text( code );
|
448 |
+
} else {
|
449 |
+
$section.removeClass( 'validated' ).addClass( 'invalid' );
|
450 |
+
$label.text( response.data.detail );
|
451 |
+
}
|
452 |
+
} );
|
453 |
+
},
|
454 |
+
|
455 |
+
/**
|
456 |
+
* @uses imagifyModal.populateOffer()
|
457 |
+
* @uses imagifyModal.populatePayBtn()
|
458 |
+
* @uses imagifyModal.checkCoupon()
|
459 |
+
*/
|
460 |
+
getPricing: function( $button ){
|
461 |
+
var nonce = $button.data( 'nonce' ),
|
462 |
+
prices_rq_datas = {
|
463 |
+
action: 'imagify_get_prices',
|
464 |
+
imagifynonce: nonce
|
465 |
+
},
|
466 |
+
imgs_rq_datas = {
|
467 |
+
action: 'imagify_get_images_counts',
|
468 |
+
imagifynonce: nonce
|
469 |
+
},
|
470 |
+
prices_rq_discount = {
|
471 |
+
action: 'imagify_get_discount',
|
472 |
+
imagifynonce: nonce
|
473 |
+
};
|
474 |
+
|
475 |
+
imagifyModal.$modal.find( '.imagify-modal-loader' ).hide().show();
|
476 |
+
|
477 |
+
/**
|
478 |
+
* TODO: change the way to waterfall requests.
|
479 |
+
* Use setInterval + counter instead.
|
480 |
+
*/
|
481 |
+
|
482 |
+
// Get the true prices.
|
483 |
+
$.post( ajaxurl, prices_rq_datas, function( prices_response ) {
|
484 |
+
|
485 |
+
if ( ! prices_response.success ) {
|
486 |
+
// TODO: replace modal content by any information.
|
487 |
+
// An error occurred.
|
488 |
+
|
489 |
+
// Populate Pay button.
|
490 |
+
imagifyModal.populatePayBtn();
|
491 |
+
return;
|
492 |
+
}
|
493 |
|
494 |
+
// get the image estimates sizes
|
495 |
+
$.post( ajaxurl, imgs_rq_datas, function( imgs_response ) {
|
496 |
|
497 |
+
if ( ! imgs_response.success ) {
|
498 |
+
// TODO: replace modal content by any information.
|
499 |
+
// An error occurred.
|
500 |
+
return;
|
|
|
|
|
|
|
|
|
501 |
}
|
|
|
502 |
|
503 |
+
// Get the discount informations.
|
504 |
+
$.post( ajaxurl, prices_rq_discount, function( discount_response ) {
|
505 |
+
var images_datas, prices_datas, promo_datas, monthlies, onetimes,
|
506 |
+
mo_user_cons, ot_user_cons,
|
507 |
+
$mo_tpl, $ot_tpl,
|
508 |
+
ot_clone, mo_clone,
|
509 |
+
ot_html = '',
|
510 |
+
mo_html = '',
|
511 |
+
ot_suggested = false,
|
512 |
+
mo_suggested = false,
|
513 |
+
$estim_block, $offers_block,
|
514 |
+
$banners, date_end, promo, discount,
|
515 |
+
prev_offers, nb_to_remove, $total_offers,
|
516 |
+
i, j;
|
517 |
+
|
518 |
+
if ( ! discount_response.success ) {
|
519 |
+
// TODO: replace modal content by any information.
|
520 |
+
// An error occurred.
|
521 |
+
return;
|
522 |
+
}
|
523 |
|
524 |
+
images_datas = imgs_response.data;
|
525 |
+
prices_datas = prices_response.data;
|
526 |
+
promo_datas = discount_response.data;
|
527 |
+
monthlies = prices_datas.monthlies;
|
528 |
+
onetimes = prices_datas.onetimes;
|
529 |
+
mo_user_cons = Math.round( images_datas.average_month_size.raw / 1000000 ); // 1000000 in MB,
|
530 |
+
ot_user_cons = Math.round( images_datas.total_library_size.raw / 1000000 ); // in MB,
|
531 |
+
$mo_tpl = $( '#imagify-offer-monthly-template' );
|
532 |
+
$ot_tpl = $( '#imagify-offer-onetime-template' );
|
533 |
+
ot_clone = $ot_tpl.html();
|
534 |
+
mo_clone = $mo_tpl.html();
|
535 |
+
$estim_block = $( '.imagify-estimation-block' );
|
536 |
+
|
537 |
+
// Refresh Analyzing block.
|
538 |
+
$estim_block.removeClass( 'imagify-analyzing' );
|
539 |
+
$estim_block.find( '.average-month-size' ).text( images_datas.average_month_size.human );
|
540 |
+
$estim_block.find( '.total-library-size' ).text( images_datas.total_library_size.human );
|
541 |
+
|
542 |
+
// Switch offers title is < 25mb.
|
543 |
+
if ( mo_user_cons < 25 && ot_user_cons < 25 ) {
|
544 |
+
$( '.imagify-pre-checkout-offers .imagify-modal-title' ).addClass( 'imagify-enough-free' );
|
545 |
+
$( '.imagify-offer-selected' ).removeClass( 'imagify-offer-selected' ).find( '.imagify-checkbox' ).removeAttr( 'checked' );
|
546 |
+
} else {
|
547 |
+
$( '.imagify-enough-free' ).removeClass( 'imagify-enough-free' );
|
548 |
+
$( '.imagify-offer-selected' ).addClass( 'imagify-offer-selected' ).find( '.imagify-checkbox' ).attr( 'checked', 'checked' );
|
549 |
+
}
|
550 |
|
551 |
+
// Don't create prices table if something went wrong during request.
|
552 |
+
if ( null === monthlies || null === onetimes ) {
|
553 |
+
$offers_block = $( '.imagify-pre-checkout-offers' );
|
|
|
|
|
554 |
|
555 |
+
// Hide main content.
|
556 |
+
$offers_block.hide().attr( 'aria-hidden', true );
|
557 |
|
558 |
+
// Show error message.
|
559 |
+
$offers_block.closest( '.imagify-modal-views' ).find( '.imagify-popin-message' ).remove();
|
560 |
+
$offers_block.after( '<div class="imagify-popin-message imagify-error"><p>' + imagifyAdmin.labels.errorPriceAPI + '</p></div>' );
|
561 |
|
562 |
+
// Show the modal content.
|
563 |
+
imagifyModal.$modal.find( '.imagify-modal-loader' ).fadeOut( 300 );
|
564 |
+
return;
|
565 |
+
}
|
566 |
|
567 |
+
// Autofill coupon code & Show banner if discount is active.
|
568 |
+
w.imagify_discount_datas = promo_datas;
|
569 |
|
570 |
+
if ( promo_datas.is_active ) {
|
571 |
+
$banners = $( '.imagify-modal-promotion' );
|
572 |
+
date_end = promo_datas.date_end.split( 'T' )[0];
|
573 |
+
promo = promo_datas.coupon_value;
|
574 |
+
discount = 'percentage' === promo_datas.coupon_type ? promo + '%' : '$' + promo;
|
575 |
|
576 |
+
// Fill coupon code.
|
577 |
+
$( '#imagify-coupon-code' ).val( promo_datas.label ).attr( 'readonly', true );
|
578 |
+
|
579 |
+
// Show banners.
|
580 |
+
$banners.addClass( 'active' ).attr( 'aria-hidden', 'false' );
|
581 |
+
|
582 |
+
// Populate banners.
|
583 |
+
$banners.find( '.imagify-promotion-number' ).text( discount );
|
584 |
+
$banners.find( '.imagify-promotion-date' ).text( date_end );
|
585 |
+
|
586 |
+
// Auto validate coupon.
|
587 |
+
imagifyModal.checkCoupon();
|
588 |
+
}
|
589 |
+
|
590 |
+
/**
|
591 |
+
* Below lines will build Plan and Onetime offers lists.
|
592 |
+
* It will also pre-select a Plan and Onetime in both of views: pre-checkout and pricing tables.
|
593 |
+
*/
|
594 |
+
|
595 |
+
// Now, do the MONTHLIES Markup.
|
596 |
+
$.each( monthlies, function( index, value ) {
|
597 |
+
var $tpl, $offer,
|
598 |
+
classes = '';
|
599 |
+
|
600 |
+
// If it's free, don't show it.
|
601 |
+
if ( 'free' === value.label ) {
|
602 |
+
return true; // Continue-like (but $.each is not a loop... so).
|
603 |
+
}
|
604 |
+
|
605 |
+
$tpl = $( mo_clone ).clone();
|
606 |
+
|
607 |
+
// If offer is too big (far) than estimated needs, don't show the offer.
|
608 |
+
if ( false !== mo_suggested && ( index - mo_suggested ) > 2 ) {
|
609 |
+
return true;
|
610 |
+
}
|
611 |
+
|
612 |
+
// Parent classes.
|
613 |
+
if ( ( mo_user_cons < value.quota && false === mo_suggested ) ) {
|
614 |
+
classes = ' imagify-offer-selected';
|
615 |
+
mo_suggested = index;
|
616 |
+
|
617 |
+
// Add this offer as pre-selected item in pre-checkout view.
|
618 |
+
$offer = $( '.imagify-pre-checkout-offers' ).find( '.imagify-offer-monthly' );
|
619 |
+
|
620 |
+
// Populate the Pre-checkout view depending on user_cons.
|
621 |
+
imagifyModal.populateOffer( $offer, value, 'monthly' );
|
622 |
+
}
|
623 |
+
|
624 |
+
// Populate each offer.
|
625 |
+
$tpl = imagifyModal.populateOffer( $tpl, value, 'monthly', classes );
|
626 |
+
|
627 |
+
// Complete Monthlies HTML.
|
628 |
+
mo_html += $tpl[0].outerHTML;
|
629 |
+
} );
|
630 |
+
|
631 |
+
// Deal with the case of too much small offers (before recommanded one).
|
632 |
+
prev_offers = $( mo_html ).filter( '.imagify-offer-selected' ).prevAll();
|
633 |
+
|
634 |
+
// If we have more than 1 previous offer.
|
635 |
+
if ( prev_offers.length > 1 ) {
|
636 |
+
nb_to_remove = prev_offers.length - 1;
|
637 |
+
$total_offers = $( mo_html );
|
638 |
+
|
639 |
+
// Remove too far previous offer.
|
640 |
+
for ( i = 0; i < nb_to_remove; i++ ) {
|
641 |
+
delete $total_offers[ i ];
|
642 |
+
}
|
643 |
+
|
644 |
+
// Rebuild mo_html with removed items.
|
645 |
+
mo_html = '';
|
646 |
+
for ( j = 0; j < $total_offers.length; j++) {
|
647 |
+
mo_html += $( '<div/>' ).append( $total_offers[ j ] ).html();
|
648 |
+
}
|
649 |
+
}
|
650 |
+
|
651 |
+
// Do the ONETIMES Markup.
|
652 |
+
$.each( onetimes, function( index, value ) {
|
653 |
+
var $tpl = $( ot_clone ).clone(),
|
654 |
+
$offer = $( '.imagify-pre-checkout-offers' ).find( '.imagify-offer-onetime' ),
|
655 |
+
classes = '',
|
656 |
+
tvalue;
|
657 |
+
|
658 |
+
// Parent classes.
|
659 |
+
if ( ( ot_user_cons < value.quota && ot_suggested === false ) ) {
|
660 |
+
classes = ' imagify-offer-selected';
|
661 |
+
ot_suggested = true;
|
662 |
+
|
663 |
+
// Populate the Pre-checkout view depending on user_cons.
|
664 |
+
imagifyModal.populateOffer( $offer, value, 'onetime' );
|
665 |
+
}
|
666 |
+
|
667 |
+
// If too big, populate with the biggest offer available.
|
668 |
+
// TODO: create custom offers at this point.
|
669 |
+
if ( ( onetimes.length - 1 ) === index && false === ot_suggested ) {
|
670 |
+
// populate the Pre-checkout view depending on user_cons
|
671 |
+
tvalue = onetimes[ onetimes.length - 1 ];
|
672 |
+
imagifyModal.populateOffer( $offer, tvalue, 'onetime' );
|
673 |
}
|
674 |
|
675 |
+
// Populate each offer.
|
676 |
+
$tpl = imagifyModal.populateOffer( $tpl, value, 'onetime', classes );
|
677 |
+
|
678 |
+
// complete Onetimes HTML
|
679 |
+
ot_html += $tpl[0].outerHTML;
|
680 |
+
} );
|
681 |
+
|
682 |
+
// Fill pricing tables.
|
683 |
+
if ( $mo_tpl.parent().find( '.imagify-offer-line' ) ) {
|
684 |
+
$mo_tpl.parent().find( '.imagify-offer-line' ).remove();
|
685 |
+
}
|
686 |
+
|
687 |
+
$mo_tpl.before( mo_html );
|
688 |
+
|
689 |
+
if ( $ot_tpl.parent().find( '.imagify-offer-line' ) ) {
|
690 |
+
$ot_tpl.parent().find( '.imagify-offer-line' ).remove();
|
691 |
}
|
|
|
692 |
|
693 |
+
$ot_tpl.before( ot_html );
|
694 |
+
|
695 |
+
// Show the content.
|
696 |
+
imagifyModal.$modal.find( '.imagify-modal-loader' ).fadeOut( 300 );
|
697 |
+
|
698 |
+
} ); // Third AJAX request to get discount information.
|
699 |
+
|
700 |
+
} ); // Second AJAX request for image estimation sizes.
|
701 |
+
|
702 |
+
// Populate Pay button.
|
703 |
+
imagifyModal.populatePayBtn();
|
704 |
+
} ); // End $.post.
|
705 |
+
},
|
706 |
+
|
707 |
+
/**
|
708 |
+
* @uses imagifyModal.populatePayBtn()
|
709 |
+
*/
|
710 |
+
checkCheckbox: function( $checkbox ) {
|
711 |
+
var sel_class = 'imagify-offer-selected';
|
712 |
+
|
713 |
+
$checkbox.each( function() {
|
714 |
+
var $this = $( this );
|
715 |
+
|
716 |
+
if ( $this.is( ':checked' ) ) {
|
717 |
+
$this.closest( '.imagify-offer-line' ).addClass( sel_class );
|
718 |
+
} else {
|
719 |
+
$this.closest( '.imagify-offer-line' ).removeClass( sel_class );
|
720 |
}
|
721 |
+
} );
|
722 |
+
|
723 |
+
// Update pay button.
|
724 |
+
imagifyModal.populatePayBtn();
|
725 |
+
},
|
726 |
+
|
727 |
+
/**
|
728 |
+
* @uses imagifyModal.populatePayBtn()
|
729 |
+
*/
|
730 |
+
checkRadio: function( $radio ) {
|
731 |
+
var year_class = 'imagify-year-selected',
|
732 |
+
month_class = 'imagify-month-selected';
|
733 |
+
|
734 |
+
$radio.each( function() {
|
735 |
+
// To handle modal pricing & modal suggestion.
|
736 |
+
var $_this = $( this ),
|
737 |
+
$parent, $to_switch;
|
738 |
+
|
739 |
+
if ( $_this.parent( '.imagify-cart-list-switcher' ).length ) {
|
740 |
+
$parent = $_this.closest( '.imagify-cart' );
|
741 |
+
} else if ( $_this.parent( '.imagify-small-options' ).length ) {
|
742 |
+
$parent = $_this.parent( '.imagify-small-options' ).next( '.imagify-pricing-table' );
|
743 |
+
} else {
|
744 |
+
$parent = $_this.closest( '.imagify-offer-line' );
|
745 |
+
}
|
746 |
+
|
747 |
+
$to_switch = $parent.find( '.imagify-switch-my' );
|
748 |
+
|
749 |
+
if ( $_this.val() === 'yearly' ) {
|
750 |
+
$parent.addClass( year_class ).removeClass( month_class );
|
751 |
+
$to_switch.find( '.imagify-monthly' ).attr( 'aria-hidden', 'true' );
|
752 |
+
$to_switch.find( '.imagify-yearly' ).attr( 'aria-hidden', 'false' );
|
753 |
+
} else {
|
754 |
+
$parent.addClass( month_class ).removeClass( year_class );
|
755 |
+
$to_switch.find( '.imagify-monthly' ).attr( 'aria-hidden', 'false' );
|
756 |
+
$to_switch.find( '.imagify-yearly' ).attr( 'aria-hidden', 'true' );
|
757 |
+
}
|
758 |
+
} );
|
759 |
+
|
760 |
+
// Update Pay button information.
|
761 |
+
imagifyModal.populatePayBtn();
|
762 |
+
|
763 |
+
return $radio;
|
764 |
+
},
|
765 |
|
766 |
/**
|
767 |
+
* Currently not used.
|
768 |
+
* @uses imagifyModal.populatePayBtn()
|
769 |
*/
|
770 |
+
populateBtnPrice: setInterval( function() {
|
771 |
+
imagifyModal.populatePayBtn();
|
772 |
+
}, 1000 ),
|
773 |
|
774 |
/**
|
775 |
* 1) Modal Payment change/select plan
|
776 |
* 2) Checkout selection(s)
|
777 |
* 3) Payment process
|
778 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
779 |
|
780 |
+
getPeriod: function() {
|
781 |
+
return $( '.imagify-offer-monthly' ).hasClass( 'imagify-month-selected' ) ? 'monthly' : 'yearly';
|
782 |
+
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
783 |
|
784 |
+
getApiKey: function() {
|
785 |
+
return $( '#imagify-payment-iframe' ).data( 'imagify-api' );
|
786 |
+
},
|
787 |
+
|
788 |
+
switchToView: function( $view, data ) {
|
789 |
+
var viewId = $view.attr( 'id' ),
|
790 |
+
$modalContent = imagifyModal.$modal.children( '.imagify-modal-content' );
|
791 |
+
|
792 |
+
$view.siblings( '.imagify-modal-views' ).hide().attr( 'aria-hidden', 'true' );
|
793 |
+
|
794 |
+
// Plans view has tabs: display the right one.
|
795 |
+
if ( data && data.tab ) {
|
796 |
+
$view.find( 'a[href="#' + data.tab + '"]' ).trigger( 'click.imagify' );
|
797 |
}
|
798 |
+
|
799 |
+
// Payment view: it's an iframe.
|
800 |
+
if ( 'imagify-payment-process-view' === viewId ) {
|
801 |
+
$modalContent.addClass( 'imagify-iframe-viewing' );
|
802 |
+
} else {
|
803 |
+
$modalContent.removeClass( 'imagify-iframe-viewing' );
|
|
|
|
|
|
|
|
|
|
|
804 |
}
|
|
|
805 |
|
806 |
+
// Success view: some tweaks.
|
807 |
+
if ( 'imagify-success-view' === viewId ) {
|
808 |
+
$modalContent.addClass( 'imagify-success-viewing' );
|
809 |
+
imagifyModal.$modal.attr( 'aria-labelledby', 'imagify-success-view' );
|
810 |
+
} else {
|
811 |
+
$modalContent.removeClass( 'imagify-success-viewing' );
|
812 |
+
imagifyModal.$modal.removeAttr( 'aria-labelledby' );
|
813 |
+
}
|
814 |
+
|
815 |
+
$view.fadeIn( imagifyModal.speedFadeIn ).attr( 'aria-hidden', 'false' );
|
816 |
+
},
|
817 |
+
|
818 |
/**
|
819 |
+
* @uses imagifyModal.getApiKey()
|
820 |
*/
|
821 |
+
iframeSetSrc: function( params ) {
|
822 |
+
/**
|
823 |
+
* params = {
|
824 |
+
* 'monthly': {
|
825 |
+
* 'lite': {
|
826 |
+
* name: 'something',
|
827 |
+
* id: ''
|
828 |
+
* }
|
829 |
+
* },
|
830 |
+
* 'onetime': {
|
831 |
+
* 'recommended': {
|
832 |
+
* name: 'Recommend',
|
833 |
+
* id: ''
|
834 |
+
* }
|
835 |
+
* },
|
836 |
+
* 'period': 'monthly'|'yearly'
|
837 |
+
* }
|
838 |
+
*/
|
839 |
+
|
840 |
+
var $iframe = $( '#imagify-payment-iframe' ),
|
841 |
+
iframe_src = $iframe.attr( 'src' ),
|
842 |
+
pay_src = $iframe.data( 'src' ),
|
843 |
+
monthly_id = 0,
|
844 |
+
onetime_id = 0,
|
845 |
+
key, rt_onetime, rt_yearly, rt_monthly, coupon, rt_coupon, amount, $iframeClone, tofind;
|
846 |
+
|
847 |
+
// If we only change monthly/yearly payment mode.
|
848 |
+
if ( typeof params === 'string' && '' !== iframe_src ) {
|
849 |
+
tofind = 'monthly' === params ? 'yearly' : 'monthly';
|
850 |
+
iframe_src = iframe_src.replace( tofind, params );
|
851 |
+
$iframe.attr( 'src', iframe_src );
|
852 |
+
return;
|
853 |
+
}
|
854 |
|
855 |
+
// If we get new informations about products.
|
856 |
+
if ( typeof params !== 'object' ) {
|
857 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
858 |
}
|
859 |
|
860 |
+
if ( params.monthly ) {
|
861 |
+
monthly_id = params.monthly[ Object.keys( params.monthly )[0] ].id;
|
862 |
+
}
|
863 |
|
864 |
+
if ( params.onetime ) {
|
865 |
+
onetime_id = params.onetime[ Object.keys( params.onetime )[0] ].id;
|
866 |
+
// If onetime ID === 999 it's a custom plan, send datas instead.
|
867 |
+
onetime_id = ( onetime_id + '' === '999' ? params.onetime[ Object.keys( params.onetime )[0] ].data : onetime_id );
|
868 |
+
}
|
869 |
|
870 |
+
if ( ! params.period ) {
|
871 |
+
imagify.info( 'No period defined' );
|
872 |
+
return;
|
873 |
+
}
|
874 |
|
875 |
+
key = imagifyModal.getApiKey();
|
876 |
+
rt_onetime = onetime_id;
|
877 |
+
rt_yearly = 'yearly' === params.period ? monthly_id : 0;
|
878 |
+
rt_monthly = 'monthly' === params.period ? monthly_id : 0;
|
879 |
+
coupon = $( '#imagify-coupon-code' ).val();
|
880 |
+
rt_coupon = '' === coupon ? 'none' : coupon;
|
881 |
+
// Not used but...
|
882 |
+
amount = parseFloat( $( '.imagify-global-amount' ).text() ).toFixed( 2 );
|
883 |
|
884 |
+
// Compose route.
|
885 |
+
// pay_src + :ontimeplan(0)/:monthlyplan(0)/:yearlyplan(0)/:coupon(none)/
|
886 |
+
pay_src = pay_src + rt_onetime + '/' + rt_monthly + '/' + rt_yearly + '/' + rt_coupon + '/';
|
|
|
887 |
|
888 |
+
// iFrame sort of cache fix.
|
889 |
+
$iframeClone = $iframe.remove().attr( 'src', pay_src );
|
|
|
|
|
890 |
|
891 |
+
imagifyModal.$paymentView.html( $iframeClone );
|
892 |
+
},
|
|
|
|
|
|
|
893 |
|
894 |
+
/**
|
895 |
+
* Public function triggered by payement iframe.
|
896 |
+
*/
|
897 |
+
paymentClose: function() {
|
898 |
+
$( '.imagify-iframe-viewing .close-btn' ).trigger( 'click.imagify' );
|
899 |
+
$( '.imagify-iframe-viewing' ).removeClass( 'imagify-iframe-viewing' );
|
900 |
+
},
|
901 |
|
902 |
+
/**
|
903 |
+
* @uses imagifyModal.switchToView()
|
904 |
+
*/
|
905 |
+
paymentBack: function() {
|
906 |
+
imagifyModal.switchToView( imagifyModal.$preView );
|
907 |
+
},
|
908 |
+
|
909 |
+
/**
|
910 |
+
* @uses imagifyModal.switchToView()
|
911 |
+
*/
|
912 |
+
paymentSuccess: function() {
|
913 |
+
imagifyModal.switchToView( imagifyModal.$successView );
|
914 |
+
},
|
915 |
+
|
916 |
+
/**
|
917 |
+
* @uses imagifyModal.paymentClose()
|
918 |
+
* @uses imagifyModal.paymentBack()
|
919 |
+
* @uses imagifyModal.paymentSuccess()
|
920 |
+
*/
|
921 |
+
checkPluginMessage: function( event ) {
|
922 |
+
var origin = event.origin || event.originalEvent.origin;
|
923 |
+
|
924 |
+
if ( 'https://app.imagify.io' !== origin && 'http://dapp.imagify.io' !== origin ) {
|
925 |
+
return;
|
926 |
}
|
927 |
|
928 |
+
switch ( event.data ) {
|
929 |
+
case 'cancel':
|
930 |
+
imagifyModal.paymentClose();
|
931 |
+
break;
|
932 |
+
case 'back':
|
933 |
+
imagifyModal.paymentBack();
|
934 |
+
break;
|
935 |
+
case 'success':
|
936 |
+
imagifyModal.paymentSuccess();
|
937 |
+
break;
|
938 |
}
|
939 |
+
}
|
940 |
+
};
|
941 |
+
|
942 |
+
/**
|
943 |
+
* INIT.
|
944 |
+
*/
|
945 |
+
|
946 |
+
// Check all boxes on load.
|
947 |
+
imagifyModal.checkCheckbox( imagifyModal.$checkboxes );
|
948 |
+
imagifyModal.checkRadio( imagifyModal.$radios.filter( ':checked' ) );
|
949 |
+
|
950 |
+
// Check coupon onload.
|
951 |
+
imagifyModal.checkCoupon();
|
952 |
+
|
953 |
+
// Check the changed box.
|
954 |
+
imagifyModal.$checkboxes.on( 'change.imagify', function() {
|
955 |
+
imagifyModal.checkCheckbox( $( this ) );
|
956 |
+
} );
|
957 |
+
|
958 |
+
// Check the radio box.
|
959 |
+
imagifyModal.$radios.on( 'change.imagify', function() {
|
960 |
+
imagifyModal.checkRadio( $( this ) );
|
961 |
+
} );
|
962 |
|
963 |
+
/**
|
964 |
+
* Get pricings on modal opening.
|
965 |
+
* Build the pricing tables inside modal.
|
966 |
+
*/
|
967 |
+
$( '#imagify-get-pricing-modal' ).on( 'click.imagify-ajax', function() {
|
968 |
+
imagifyModal.getPricing( $( this ) );
|
969 |
+
} );
|
970 |
+
|
971 |
+
/**
|
972 |
+
* Reset the modal on close.
|
973 |
+
*/
|
974 |
+
$( d ).on( 'modalClosed.imagify', '.imagify-payment-modal', function() {
|
975 |
+
// Reset viewing class & aria-labelledby.
|
976 |
+
$( this ).find( '.imagify-modal-content' ).removeClass( 'imagify-success-viewing imagify-iframe-viewing' );
|
977 |
|
978 |
+
// Reset first view after fadeout ~= 300 ms.
|
979 |
+
setTimeout( function() {
|
980 |
+
$( '.imagify-modal-views' ).hide();
|
981 |
+
$( '#imagify-pre-checkout-view' ).show();
|
982 |
+
}, 300 );
|
983 |
+
} );
|
984 |
|
985 |
+
/**
|
986 |
+
* Get validation for Coupon Code
|
987 |
+
* - On blur
|
988 |
+
* - On Enter or Spacebar press
|
989 |
+
* - On click OK button
|
990 |
+
*
|
991 |
+
* @since 1.6.3 Only if field hasn't readonly attribute (discount auto-applied).
|
992 |
+
*/
|
993 |
+
$( '#imagify-coupon-code' ).on( 'blur.imagify', function() {
|
994 |
+
if ( ! $( this ).attr('readonly') ) {
|
995 |
+
imagifyModal.checkCoupon();
|
996 |
+
}
|
997 |
+
} ).on( 'keydown.imagify', function( e ) {
|
998 |
+
var $this = $( this );
|
999 |
+
|
1000 |
+
if ( $this.attr( 'readonly' ) ) {
|
1001 |
+
return;
|
1002 |
+
}
|
1003 |
+
if ( 13 === e.keyCode || 32 === e.keyCode ) {
|
1004 |
+
imagifyModal.checkCoupon();
|
1005 |
return false;
|
1006 |
+
}
|
1007 |
+
if ( $this.val().length >= 3 ) {
|
1008 |
+
$this.closest( '.imagify-coupon-input' ).addClass( 'imagify-canbe-validate' );
|
1009 |
+
} else {
|
1010 |
+
$this.closest( '.imagify-coupon-input' ).removeClass( 'imagify-canbe-validate' );
|
1011 |
+
}
|
1012 |
+
} );
|
1013 |
+
|
1014 |
+
$( '#imagify-coupon-validate' ).on( 'click.imagify', function() {
|
1015 |
+
imagifyModal.checkCoupon();
|
1016 |
+
$( this ).closest( '.imagify-canbe-validate' ).removeClass( 'imagify-canbe-validate' );
|
1017 |
+
} );
|
1018 |
+
|
1019 |
+
/**
|
1020 |
+
* View game, step by step.
|
1021 |
+
*/
|
1022 |
+
|
1023 |
+
// 1) when you decide to choose another plan.
|
1024 |
|
1025 |
+
/**
|
1026 |
+
* 1.a) on click, display choices.
|
1027 |
+
*
|
1028 |
+
* @uses imagifyModal.switchToView()
|
1029 |
+
*/
|
1030 |
+
imagifyModal.$anotherBtn.on( 'click.imagify', function() {
|
1031 |
+
var type = $( this ).data( 'imagify-choose' ),
|
1032 |
+
tab = 'imagify-pricing-tab-' + ( 'plan' === type ? 'monthly' : 'onetime' );
|
1033 |
+
|
1034 |
+
imagifyModal.switchToView( imagifyModal.$plansView, { tab: tab } );
|
1035 |
+
|
1036 |
+
return false;
|
1037 |
+
} );
|
1038 |
+
|
1039 |
+
/**
|
1040 |
+
* 1.b) on click in a choice, return to pre-checkout step.
|
1041 |
+
*
|
1042 |
+
* @uses imagifyModal.getHtmlPrice()
|
1043 |
+
* @uses imagifyModal.switchToView()
|
1044 |
+
* @uses imagifyModal.populatePayBtn()
|
1045 |
+
*/
|
1046 |
+
imagifyModal.$modal.on( 'click.imagify', '.imagify-payment-btn-select-plan', function() {
|
1047 |
+
var $_this = $( this ),
|
1048 |
+
$offer_line = $_this.closest( '.imagify-offer-line' ),
|
1049 |
+
datas = $_this.data( 'offer' ),
|
1050 |
+
datas_str = $_this.attr( 'data-offer' ),
|
1051 |
+
is_onetime = $_this.closest( '.imagify-tab-content' ).attr( 'id' ) !== 'imagify-pricing-tab-monthly',
|
1052 |
+
$target_line = is_onetime ? imagifyModal.$preView.find( '.imagify-offer-onetime' ) : imagifyModal.$preView.find( '.imagify-offer-monthly' ),
|
1053 |
+
period = is_onetime ? null : ( $_this.closest( '.imagify-pricing-table' ).hasClass( 'imagify-month-selected' ) ? 'monthly' : 'yearly' ),
|
1054 |
+
price = is_onetime ? imagifyModal.getHtmlPrice( datas[ Object.keys( datas )[0] ].price ) : imagifyModal.getHtmlPrice ( datas[ Object.keys( datas )[0] ].prices, period ),
|
1055 |
+
monthly_txt = is_onetime ? '' : '<span class="imagify-price-by">' + $offer_line.find( '.imagify-price-by' ).text() + '</span>',
|
1056 |
+
discount = $offer_line.find( '.imagify-price-discount' ).html(),
|
1057 |
+
imgs = $offer_line.find( '.imagify-approx-nb' ).text(),
|
1058 |
+
offer_size = $offer_line.find( '.imagify-offer-size' ).text();
|
1059 |
+
|
1060 |
+
// Change views to go back pre-checkout.
|
1061 |
+
imagifyModal.switchToView( imagifyModal.$preView );
|
1062 |
+
|
1063 |
+
// Change price (+ "/month" if found in monthly plans).
|
1064 |
+
$target_line.find( '.imagify-number-block' ).html( price + monthly_txt );
|
1065 |
+
|
1066 |
+
// Change discount.
|
1067 |
+
$target_line.find( '.imagify-price-discount' ).html( discount );
|
1068 |
+
|
1069 |
+
// Change approx images nb.
|
1070 |
+
$target_line.find( '.imagify-approx-nb' ).text( imgs );
|
1071 |
+
|
1072 |
+
// Change offer size name.
|
1073 |
+
$target_line.find( '.imagify-offer-size' ).text( offer_size );
|
1074 |
+
|
1075 |
+
// Change datas (json).
|
1076 |
+
$target_line.attr( 'data-offer', datas_str );
|
1077 |
+
|
1078 |
+
if ( ! is_onetime ) {
|
1079 |
+
$target_line.find( '.imagify-price-add-data' ).text( $offer_line.find( '.imagify-price-add-data' ).text() );
|
1080 |
+
|
1081 |
+
// Trigger period selected from offer selection view to pre-checkout view.
|
1082 |
+
if ( 'monthly' === period ) {
|
1083 |
+
$target_line.find( '#imagify-subscription-monthly' ).trigger( 'click.imagify' );
|
1084 |
} else {
|
1085 |
+
$target_line.find( '#imagify-subscription-yearly' ).trigger( 'click.imagify' );
|
1086 |
}
|
1087 |
+
$target_line.find( '.imagify-inline-options' ).find( 'input:radio:checked' ).trigger( 'change.imagify' );
|
1088 |
+
}
|
1089 |
|
1090 |
+
// Update price information in button.
|
1091 |
+
imagifyModal.populatePayBtn();
|
1092 |
+
return false;
|
1093 |
+
} );
|
1094 |
|
1095 |
+
/**
|
1096 |
+
* 2) when you checkout.
|
1097 |
+
*
|
1098 |
+
* @uses imagifyModal.switchToView()
|
1099 |
+
* @uses imagifyModal.getPeriod()
|
1100 |
+
* @uses imagifyModal.iframeSetSrc()
|
1101 |
+
*/
|
1102 |
+
$( '#imagify-modal-checkout-btn' ).on( 'click.imagify', function() {
|
1103 |
+
var $monthly_offer, $onetime_offer, checkout_datas;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1104 |
|
1105 |
+
// Do nothing if button disabled.
|
1106 |
+
if ( $( this ).hasClass( 'imagify-button-disabled' ) ) {
|
1107 |
+
return;
|
1108 |
+
}
|
1109 |
|
1110 |
+
$monthly_offer = $( '.imagify-offer-monthly' );
|
1111 |
+
$onetime_offer = $( '.imagify-offer-onetime' );
|
1112 |
+
checkout_datas = {};
|
1113 |
+
|
1114 |
+
// If user choose a monthly plan.
|
1115 |
+
if ( $monthly_offer.hasClass( 'imagify-offer-selected' ) ) {
|
1116 |
+
checkout_datas.monthly = JSON.parse( $monthly_offer.attr( 'data-offer' ) );
|
1117 |
+
}
|
1118 |
+
|
1119 |
+
// If user choose a one time plan.
|
1120 |
+
if ( $onetime_offer.hasClass( 'imagify-offer-selected' ) ) {
|
1121 |
+
checkout_datas.onetime = JSON.parse( $onetime_offer.attr( 'data-offer' ) );
|
1122 |
+
}
|
1123 |
+
|
1124 |
+
// Change views to go to checkout/payment view.
|
1125 |
+
imagifyModal.switchToView( imagifyModal.$paymentView );
|
1126 |
+
|
1127 |
+
checkout_datas.period = imagifyModal.getPeriod();
|
1128 |
+
|
1129 |
+
imagifyModal.iframeSetSrc( checkout_datas );
|
1130 |
+
return false;
|
1131 |
+
} );
|
1132 |
|
1133 |
/**
|
1134 |
+
* Go back to previous step ("Choose Another Plan" links).
|
1135 |
+
*/
|
1136 |
+
$( '.imagify-back-to-plans' ).on( 'click.imagify', function() {
|
1137 |
+
var $_this = $( this ),
|
1138 |
+
is_onetime = $_this.closest( '.imagify-cart-item' ).hasClass( 'imagify-cart-item-onetime' );
|
1139 |
+
|
1140 |
+
if ( is_onetime ) {
|
1141 |
+
$( '.imagify-offer-onetime' ).find( '.imagify-choose-another-plan' ).trigger( 'click.imagify' );
|
1142 |
+
} else {
|
1143 |
+
$( '.imagify-offer-monthly' ).find( '.imagify-choose-another-plan' ).trigger( 'click.imagify' );
|
1144 |
+
}
|
1145 |
+
|
1146 |
+
return false;
|
1147 |
+
} );
|
1148 |
+
|
1149 |
+
// Message/communication API.
|
1150 |
+
w.addEventListener( 'message', imagifyModal.checkPluginMessage, true );
|
1151 |
+
|
1152 |
+
} )(jQuery, document, window);
|
1153 |
+
|
1154 |
+
|
1155 |
+
(function($, d, w, undefined) {
|
1156 |
+
|
1157 |
+
/**
|
1158 |
+
* Tabs.
|
1159 |
+
*
|
1160 |
* @Markup:
|
1161 |
* ul.imagify-tabs
|
1162 |
+
* li.imagify-tab.imagify-current
|
1163 |
+
* a[href="#target"]
|
1164 |
* div.imagify-tabs-contents
|
1165 |
+
* div.imagify-tab-content#target
|
1166 |
*/
|
1167 |
+
$( '.imagify-tab' ).on( 'click.imagify', function( e ) {
|
1168 |
+
var $_this = $( this ),
|
1169 |
+
curr_class = 'imagify-current',
|
1170 |
+
target;
|
1171 |
|
1172 |
+
e.preventDefault();
|
|
|
|
|
1173 |
|
1174 |
+
if ( $_this.hasClass( 'imagify-current' ) ) {
|
1175 |
+
return;
|
1176 |
+
}
|
1177 |
|
1178 |
+
target = $_this.find( 'a' ).attr( 'href' ) || '#' + $_this.find( 'a' ).attr( 'aria-controls' );
|
|
|
|
|
1179 |
|
1180 |
+
// Show right tab content.
|
1181 |
+
$_this.closest( '.imagify-tabs' ).next( '.imagify-tabs-contents' ).find( '.imagify-tab-content' ).hide().attr( 'aria-hidden', 'true' );
|
1182 |
+
$( target ).fadeIn( 275 ).attr( 'aria-hidden', 'false' );
|
|
|
1183 |
|
1184 |
+
// Change active tabs.
|
1185 |
+
$_this.closest( '.imagify-tabs' ).find( '.imagify-tab' ).removeClass( curr_class ).attr( 'aria-selected', 'false' );
|
1186 |
+
$_this.addClass( curr_class ).attr( 'aria-selected', 'true' );
|
1187 |
+
} );
|
1188 |
|
1189 |
+
} )(jQuery, document, window);
|
|
assets/js/admin.min.js
CHANGED
@@ -1,36 +1 @@
|
|
1 |
-
jQuery(function(a){var w=0<ajaxurl.indexOf("?")?"&":"?",H={log:function(a){"undefined"!==console&&console.log(a)},info:function(a){"undefined"!==console&&console.info(a)}};a("#imagify-signup").click(function(b){b.preventDefault();swal({title:imagifyAdmin.labels.signupTitle,html:imagifyAdmin.labels.signupText,confirmButtonText:imagifyAdmin.labels.signupConfirmButtonText,input:"email",closeOnConfirm:!1,allowOutsideClick:!0,showLoaderOnConfirm:!0,customClass:"imagify-sweet-alert imagify-sweet-alert-signup",
|
2 |
-
inputValidator:function(b){return new Promise(function(d,e){""!=a.trim(b)&&b?d():e(imagifyAdmin.labels.signupErrorEmptyEmail)})},preConfirm:function(b){return new Promise(function(d,e){setTimeout(function(){a.get(ajaxurl+w+"action=imagify_signup&email="+b+"&imagifysignupnonce="+a("#imagifysignupnonce").val()).done(function(a){a.success?d():e(a.data)})},2E3)})}}).then(function(a){swal({title:imagifyAdmin.labels.signupSuccessTitle,html:imagifyAdmin.labels.signupSuccessText,type:"success",customClass:"imagify-sweet-alert"})})});
|
3 |
-
a("#imagify-save-api-key").click(function(b){b.preventDefault();swal({title:imagifyAdmin.labels.saveApiKeyTitle,html:imagifyAdmin.labels.saveApiKeyText,confirmButtonText:imagifyAdmin.labels.saveApiKeyConfirmButtonText,input:"text",allowOutsideClick:!0,showLoaderOnConfirm:!0,customClass:"imagify-sweet-alert imagify-sweet-alert-signup",inputValidator:function(b){return new Promise(function(d,e){""!=a.trim(b)&&b?d():e(imagifyAdmin.labels.ApiKeyErrorEmpty)})},preConfirm:function(b){return new Promise(function(d,
|
4 |
-
e){a.get(ajaxurl+w+"action=imagify_check_api_key_validity&api_key="+b+"&imagifycheckapikeynonce="+a("#imagifycheckapikeynonce").val()).done(function(a){a.success?d():e(a.data)})})}}).then(function(a){swal({title:imagifyAdmin.labels.ApiKeyCheckSuccessTitle,html:imagifyAdmin.labels.ApiKeyCheckSuccessText,type:"success",customClass:"imagify-sweet-alert"})})});a(".imagify-notice-dismiss").click(function(b){b.preventDefault();var d=a(this);b=d.parents(".imagify-welcome, .imagify-notice");d=d.attr("href");
|
5 |
-
b.fadeTo(100,0,function(){a(this).slideUp(100,function(){a(this).remove()})});a.get(d.replace("admin-post.php","admin-ajax.php"))});a(".imagify-modal").attr("aria-hidden","true");a(".imagify-modal-trigger").on("click.imagify",function(){var b=a(this),b=b.data("target")||b.attr("href");a(b).css("display","flex").hide().fadeIn(400).attr("aria-hidden","false").attr("tabindex","0").focus().removeAttr("tabindex").addClass("modal-is-open");a("body").addClass("imagify-modal-is-open");return!1});a(document).on("click.imagify",
|
6 |
-
".imagify-modal .close-btn",function(){a(this).closest(".imagify-modal").fadeOut(400).attr("aria-hidden","true").removeClass("modal-is-open");a(this).closest(".imagify-modal").hasClass("imagify-payment-modal")&&(a(this).closest(".imagify-modal-content").removeClass("imagify-success-viewing imagify-iframe-viewing"),setTimeout(function(){a(".imagify-modal-views").hide();a("#imagify-pre-checkout-view").show()},300));a("body").removeClass("imagify-modal-is-open")}).on("blur.imagify",".imagify-modal .close-btn",
|
7 |
-
function(){var b=a(this).closest(".imagify-modal");"false"===b.attr("aria-hidden")&&b.attr("tabindex","0").focus().removeAttr("tabindex")});a(document).on("click.imagify",".imagify-modal",function(b){a(b.target).filter(".modal-is-open").find(".close-btn").trigger("click.imagify")});a(window).on("keydown.imagify",function(b){if(27==b.keyCode&&0<a(".imagify-modal.modal-is-open").length)return b.preventDefault(),a(".imagify-modal.modal-is-open").find(".close-btn").trigger("click.imagify"),!1});var x=
|
8 |
-
!1;a("#wp-admin-bar-imagify").hover(function(){if(!0!==x){x=!0;var b=a("#wp-admin-bar-imagify-profile-content");b.is(":empty")&&a.get(ajaxurl+w+"action=imagify_get_admin_bar_profile&imagifygetadminbarprofilenonce="+a("#imagifygetadminbarprofilenonce").val()).done(function(d){b.html(d.data);a("#wp-admin-bar-imagify-profile-loading").remove();x=!1})}});if(a("#imagify-pricing-modal").length){var y=a("#imagify-pricing-modal"),z=function(a,d){d||(d=null);output="";if("object"===typeof a){var b=a.yearly+
|
9 |
-
"",e=(a.monthly+"").split("."),b=b.split(".");output+='<span class="imagify-switch-my"><span aria-hidden="'+("monthly"===d?"false":"true")+'" class="imagify-monthly"><span class="imagify-price-big">'+e[0]+'</span> <span class="imagify-price-mini">.'+(1===e[1].length?e[1]+"0":(""+e[1]).substring(0,2))+'</span></span> <span aria-hidden="'+("yearly"===d?"false":"true")+'" class="imagify-yearly"><span class="imagify-price-big">'+b[0]+'</span> <span class="imagify-price-mini">.'+(1===b[1].length?b[1]+
|
10 |
-
"0":(""+b[1]).substring(0,2))+"</span></span></span>"}else e=(a+"").split("."),output+='<span class="imagify-price-big">'+e[0]+'</span> <span class="imagify-price-mini">.'+(1===e[1].length?e[1]+"0":(""+e[1]).substring(0,2))+"</span>";return output},I=function(a,d){d||(d=null);output="";return output="object"===typeof a?output+('<span class="imagify-price-discount"><span class="imagify-price-discount-dollar">$</span><span class="imagify-switch-my"><span aria-hidden="'+("monthly"===d?"false":"true")+
|
11 |
-
'" class="imagify-monthly"><span class="imagify-price-discount-number">'+(a.monthly+"")+'</span></span><span aria-hidden="'+("yearly"===d?"false":"true")+'" class="imagify-yearly"><span class="imagify-price-discount-number">'+(a.yearly+"")+"</span></span></span></span>"):output+('<span class="imagify-price-discount"><span class="imagify-price-discount-dollar">$</span><span class="imagify-price-discount-number">'+(a+"")+"</span></span>")},m=function(a,d,c,e){var b=window.imagify_discount_datas,f=d.additional_gb,
|
12 |
-
B=d.annual_cost,C=d.id,A=d.label,D=d.monthly_cost,l=d.quota;d=d.cost;var q=1E3<=l?l/1E3+" GB":l+" MB",h="monthly"===c?{monthly:D,yearly:Math.round(B/12*100)/100}:d,k=h;b.is_active&&"percentage"===b.coupon_type&&"monthly"===c&&(h=(100-b.coupon_value)/100,h="monthly"===c?{monthly:D*h,yearly:Math.round(B*h/12*100)/100}:d*h);"undefined"!==typeof e&&a.addClass("imagify-"+c+"-"+A+e);a.find(".imagify-offer-size").text(q);a.find(".imagify-number-block").html(z(h,"monthly"));b.is_active&&"percentage"===b.coupon_type&&
|
13 |
-
"monthly"===c&&(a.find(".imagify-price-block").prev(".imagify-price-discount").remove(),a.find(".imagify-price-block").before(I(k,"monthly")));a.find(".imagify-approx-nb").text(5*l);"monthly"===c&&a.find(".imagify-price-add-data").text("$"+f);(a.find(".imagify-payment-btn-select-plan").length?a.find(".imagify-payment-btn-select-plan"):a).attr("data-offer","monthly"===c?'{"'+A+'":{"id":'+C+',"name":"'+q+'","data":'+l+',"dataf":"'+q+'","imgs":'+5*l+',"prices":{"monthly":'+h.monthly+',"yearly":'+h.yearly+
|
14 |
-
',"add":'+f+"}}}":'{"ot'+A+'":{"id":'+C+',"name":"'+q+'","data":'+l+',"dataf":"'+q+'","imgs":'+5*l+',"price":'+h+"}}");return a},r=function(){var b=JSON.parse(a(".imagify-offer-monthly").attr("data-offer")),d=JSON.parse(a(".imagify-offer-onetime").attr("data-offer")),c=0,e=0;a(".imagify-offer-monthly").hasClass("imagify-offer-selected")&&(c=a("#imagify-subscription-monthly").filter(":checked").length?b[Object.keys(b)[0]].prices.monthly:12*b[Object.keys(b)[0]].prices.yearly);a(".imagify-offer-onetime").hasClass("imagify-offer-selected")&&
|
15 |
-
(e=d[Object.keys(d)[0]].price);b=parseFloat(e+c).toFixed(2);a(".imagify-global-amount").text(b);"0.00"==b||0===b?a("#imagify-modal-checkout-btn").attr("disabled","disabled").addClass("imagify-button-disabled"):a("#imagify-modal-checkout-btn").removeAttr("disabled").removeClass("imagify-button-disabled")},J=function(b){b=b.data("nonce");var d={action:"imagify_get_prices",imagifynonce:b},c={action:"imagify_get_images_counts",imagifynonce:b},e={action:"imagify_get_discount",imagifynonce:b};y.find(".imagify-modal-loader").hide().show();
|
16 |
-
a.post(ajaxurl,d,function(b){b.success&&a.post(ajaxurl,c,function(d){d.success&&a.post(ajaxurl,e,function(c){if(c.success){var e=d.data;prices_datas=b.data;promo_datas=c.data;monthlies=prices_datas.monthlies;onetimes=prices_datas.onetimes;mo_user_cons=Math.round(e.average_month_size.raw/1E6);ot_user_cons=Math.round(e.total_library_size.raw/1E6);$mo_tpl=a("#imagify-offer-monthly-template");$ot_tpl=a("#imagify-offer-onetime-template");ot_clone=$ot_tpl.html();mo_clone=$mo_tpl.html();mo_html=ot_html=
|
17 |
-
"";mo_suggested=ot_suggested=!1;$estim_block=a(".imagify-estimation-block");$estim_block.removeClass("imagify-analyzing");$estim_block.find(".average-month-size").text(e.average_month_size.human);$estim_block.find(".total-library-size").text(e.total_library_size.human);25>mo_user_cons&&25>ot_user_cons?(a(".imagify-pre-checkout-offers .imagify-modal-title").addClass("imagify-enough-free"),a(".imagify-offer-selected").removeClass("imagify-offer-selected").find(".imagify-checkbox").removeAttr("checked")):
|
18 |
-
(a(".imagify-enough-free").removeClass("imagify-enough-free"),a(".imagify-offer-selected").addClass("imagify-offer-selected").find(".imagify-checkbox").attr("checked","checked"));if(null===monthlies||null===onetimes)c=a(".imagify-pre-checkout-offers"),c.hide().attr("aria-hidden",!0),c.closest(".imagify-modal-views").find(".imagify-popin-message").remove(),c.after('<div class="imagify-popin-message imagify-error"><p>'+imagifyAdmin.labels.errorPriceAPI+"</p></div>");else{window.imagify_discount_datas=
|
19 |
-
promo_datas;if(promo_datas.is_active){c=a(".imagify-modal-promotion");var e=promo_datas.date_end.split("T")[0],f=promo_datas.coupon_value;discount="percentage"===promo_datas.coupon_type?f+"%":"$"+f;a("#imagify-coupon-code").val(promo_datas.label).attr("readonly",!0);c.addClass("active").attr("aria-hidden","false");c.find(".imagify-promotion-number").text(discount);c.find(".imagify-promotion-date").text(e);n()}a.each(monthlies,function(b,d){if("free"===d.label)return!0;var c=a(mo_clone).clone();if(!1!==
|
20 |
-
mo_suggested&&2<b-mo_suggested)return!0;classes="";if(mo_user_cons<d.quota&&!1===mo_suggested){classes=" imagify-offer-selected";mo_suggested=b;var e=a(".imagify-pre-checkout-offers").find(".imagify-offer-monthly");m(e,d,"monthly")}c=m(c,d,"monthly",classes);mo_html+=c[0].outerHTML});c=a(mo_html).filter(".imagify-offer-selected").prevAll();if(1<c.length){c=c.length-1;e=a(mo_html);for(i=0;i<c;i++)delete e[i];mo_html="";for(j=0;j<e.length;j++)mo_html+=a("<div/>").append(e[j]).html()}a.each(onetimes,
|
21 |
-
function(b,d){var c=a(ot_clone).clone(),e=a(".imagify-pre-checkout-offers").find(".imagify-offer-onetime");classes="";ot_user_cons<d.quota&&!1===ot_suggested&&(classes=" imagify-offer-selected",ot_suggested=!0,m(e,d,"onetime"));b===onetimes.length-1&&!1===ot_suggested&&m(e,onetimes[onetimes.length-1],"onetime");c=m(c,d,"onetime",classes);ot_html+=c[0].outerHTML});$mo_tpl.parent().find(".imagify-offer-line")&&$mo_tpl.parent().find(".imagify-offer-line").remove();$mo_tpl.before(mo_html);$ot_tpl.parent().find(".imagify-offer-line")&&
|
22 |
-
$ot_tpl.parent().find(".imagify-offer-line").remove();$ot_tpl.before(ot_html)}y.find(".imagify-modal-loader").fadeOut(300)}})});r()})},E=function(b){b.each(function(){a(this).is(":checked")?a(this).closest(".imagify-offer-line").addClass("imagify-offer-selected"):a(this).closest(".imagify-offer-line").removeClass("imagify-offer-selected")});r()},F=function(b){b.each(function(){var b=a(this),c;c=b.parent(".imagify-cart-list-switcher").length?b.closest(".imagify-cart"):b.parent(".imagify-small-options").length?
|
23 |
-
b.parent(".imagify-small-options").next(".imagify-pricing-table"):b.closest(".imagify-offer-line");var e=c.find(".imagify-switch-my");"yearly"===b.val()?(c.addClass("imagify-year-selected").removeClass("imagify-month-selected"),e.find(".imagify-monthly").attr("aria-hidden","true"),e.find(".imagify-yearly").attr("aria-hidden","false")):(c.addClass("imagify-month-selected").removeClass("imagify-year-selected"),e.find(".imagify-monthly").attr("aria-hidden","false"),e.find(".imagify-yearly").attr("aria-hidden",
|
24 |
-
"true"))});r();return b},n=function(){var b=a("#imagify-coupon-code").val();if(""!==b){var d=a(".imagify-coupon-text"),c=d.find("label"),e=a(".imagify-coupon-section"),g=a("#imagify-get-pricing-modal").data("nonce");d.addClass("checking");a.post(ajaxurl,{action:"imagify_check_coupon",coupon:b,imagifynonce:g},function(a){d.removeClass("checking");"false"===a.success?(c.text(imagifyAdmin.labels.errorCouponAPI),e.removeClass("validated").addClass("invalid")):a.data.success?(a="percentage"===a.data.coupon_type?
|
25 |
-
a.data.value+"%":"$"+a.data.value,e.removeClass("invalid").addClass("validated"),c.html(imagifyAdmin.labels.successCouponAPI),c.find(".imagify-coupon-offer").text(a),c.find(".imagify-coupon-word").text(b)):(e.removeClass("validated").addClass("invalid"),c.text(a.data.detail))})}},p=a(".imagify-offer-line").find(".imagify-checkbox"),G=a(".imagify-payment-modal").find(".imagify-radio-line").find("input");E(p);F(G.filter(":checked"));n();setInterval(function(){r()},1E3);p.on("change.imagify",function(){E(a(this))});
|
26 |
-
G.on("change.imagify",function(){F(a(this))});a("#imagify-get-pricing-modal").on("click.imagify-ajax",function(){J(a(this))});var u=a("#imagify-plans-selection-view"),k=a("#imagify-payment-process-view"),t=a("#imagify-pre-checkout-view"),v=a("#imagify-success-view"),p=a(".imagify-choose-another-plan");a("#imagify-coupon-code").on("blur.imagify",function(){a(this).attr("readonly")||n()}).on("keydown.imagify",function(b){if(!a(this).attr("readonly")){if(13===b.keyCode||32===b.keyCode)return n(),!1;
|
27 |
-
3<=a(this).val().length?a(this).closest(".imagify-coupon-input").addClass("imagify-canbe-validate"):a(this).closest(".imagify-coupon-input").removeClass("imagify-canbe-validate")}});a("#imagify-coupon-validate").on("click.imagify",function(){n();a(this).closest(".imagify-canbe-validate").removeClass("imagify-canbe-validate")});u.hide();k.hide();v.hide();p.on("click.imagify",function(){var b=a(this),d=b.data("imagify-choose");b.closest(".imagify-modal-views").hide().attr("aria-hidden","true");k.hide().attr("aria-hidden",
|
28 |
-
"true");u.fadeIn(300).attr("aria-hidden","false");var c=setInterval(function(){u.find('a[href="#imagify-pricing-tab-'+("plan"==d?"monthly":"onetime")+'"]').trigger("click.imagify");clearInterval(c);c=null},60);return!1});y.on("click.imagify",".imagify-payment-btn-select-plan",function(){var b=a(this),d=b.closest(".imagify-offer-line"),c=b.data("offer"),e=b.attr("data-offer"),g="imagify-pricing-tab-monthly"===b.closest(".imagify-tab-content").attr("id")?!1:!0,f=g?t.find(".imagify-offer-onetime"):t.find(".imagify-offer-monthly"),
|
29 |
-
b=g?null:b.closest(".imagify-pricing-table").hasClass("imagify-month-selected")?"monthly":"yearly",c=g?z(c[Object.keys(c)[0]].price):z(c[Object.keys(c)[0]].prices,b),k=d.find(".imagify-price-discount").html(),m=d.find(".imagify-approx-nb").text(),n=d.find(".imagify-offer-size").text(),p=g?"":'<span class="imagify-price-by">'+d.find(".imagify-price-by").text()+"</span>";u.hide().attr("aria-hidden","true");t.fadeIn(300).attr("aria-hidden","false");f.find(".imagify-number-block").html(c+p);f.find(".imagify-price-discount").html(k);
|
30 |
-
f.find(".imagify-approx-nb").text(m);f.find(".imagify-offer-size").text(n);f.attr("data-offer",e);g||(f.find(".imagify-price-add-data").text(d.find(".imagify-price-add-data").text()),"monthly"===b?f.find("#imagify-subscription-monthly").trigger("click.imagify"):f.find("#imagify-subscription-yearly").trigger("click.imagify"),f.find(".imagify-inline-options").find("input:radio:checked").trigger("change.imagify"));r();return!1});a("#imagify-modal-checkout-btn").on("click.imagify",function(){if(!a(this).hasClass("imagify-button-disabled")){var b=
|
31 |
-
a(".imagify-offer-monthly"),d=a(".imagify-offer-onetime"),c={};b.hasClass("imagify-year-selected");b.hasClass("imagify-offer-selected")?(c.monthly=JSON.parse(b.attr("data-offer")),a(".imagify-cart-list-my-choice").show(),prices=c.monthly[Object.keys(c.monthly)[0]].prices,save_price=Math.round(1200*(prices.monthly-prices.yearly))/100,a(".imagify-nb-save-per-year").text("$"+save_price)):a(".imagify-cart-list-my-choice").hide();d.hasClass("imagify-offer-selected")&&(c.onetime=JSON.parse(d.attr("data-offer")));
|
32 |
-
t.hide().attr("aria-hidden","true");k.fadeIn(300).attr("aria-hidden","false").closest(".imagify-modal-content").addClass("imagify-iframe-viewing");c.period=a(".imagify-offer-monthly").hasClass("imagify-month-selected")?"monthly":"yearly";var b=a("#imagify-payment-iframe"),e=b.attr("src"),d=b.data("src"),g=0,f=0;"object"===typeof c?(c.monthly&&(g=c.monthly[Object.keys(c.monthly)[0]].id),c.onetime&&(f=c.onetime[Object.keys(c.onetime)[0]].id,f=999==f?c.onetime[Object.keys(c.onetime)[0]].data:f),c.period?
|
33 |
-
(a("#imagify-payment-iframe").data("imagify-api"),e=f,f="yearly"===c.period?g:0,c="monthly"===c.period?g:0,g=a("#imagify-coupon-code").val(),g=""===g?"none":g,parseFloat(a(".imagify-global-amount").text()).toFixed(2),d=d+e+"/"+c+"/"+f+"/"+g+"/",$iframeClone=b.clone(),b.remove(),$iframeClone.attr("src",d),k.html($iframeClone)):H.info("No period defined")):"string"===typeof c&&""!==e&&(tofind="monthly"===c?"yearly":"monthly",e=e.replace(tofind,c),b.attr("src",e));return!1}});a(".imagify-back-to-plans").on("click.imagify",
|
34 |
-
function(){a(this).closest(".imagify-cart-item").hasClass("imagify-cart-item-onetime")?a(".imagify-offer-onetime").find(".imagify-choose-another-plan").trigger("click.imagify"):a(".imagify-offer-monthly").find(".imagify-choose-another-plan").trigger("click.imagify");return!1});window.addEventListener("message",function(b){var d=b.origin||b.originalEvent.origin;if("https://app.imagify.io"===d||"http://dapp.imagify.io"===d)switch(b.data){case "cancel":a(".imagify-iframe-viewing .close-btn").trigger("click.imagify");
|
35 |
-
a(".imagify-iframe-viewing").removeClass("imagify-iframe-viewing");break;case "back":a(".imagify-iframe-viewing").removeClass("imagify-iframe-viewing");k.hide();t.fadeIn(200);break;case "success":a(".imagify-iframe-viewing").removeClass("imagify-iframe-viewing"),k.hide(),v.closest(".imagify-modal-content").addClass("imagify-success-viewing"),v.closest(".imagify-modal").attr("aria-labelledby","imagify-success-view"),v.fadeIn(200)}},!0)}if(a(".imagify-tabs").length)a(".imagify-tab").on("click.imagify",
|
36 |
-
function(){var b=a(this);if(!b.hasClass("imagify-current")){var d=b.find("a").attr("href")||"#"+b.find("a").attr("aria-controls");b.closest(".imagify-tabs").next(".imagify-tabs-contents").find(".imagify-tab-content").hide().attr("aria-hidden","true");a(d).fadeIn(275).attr("aria-hidden","false");b.closest(".imagify-tabs").find(".imagify-tab").removeClass("imagify-current").attr("aria-selected","false");b.addClass("imagify-current").attr("aria-selected","true")}return!1})});
|
1 |
+
window.imagify=window.imagify||{concat:ajaxurl.indexOf("?")>0?"&":"?",log:function(a){void 0!==console&&console.log(a)},info:function(a){void 0!==console&&console.info(a)}},function(a,b,c,d){var e=!1;a("#wp-admin-bar-imagify").hover(function(){var b;!0!==e&&(e=!0,b=a("#wp-admin-bar-imagify-profile-content"),b.is(":empty")&&a.get(ajaxurl+imagify.concat+"action=imagify_get_admin_bar_profile&imagifygetadminbarprofilenonce="+a("#imagifygetadminbarprofilenonce").val()).done(function(c){b.html(c.data),a("#wp-admin-bar-imagify-profile-loading").remove(),e=!1}))})}(jQuery,document,window),function(a,b,c,d){a("#imagify-signup").on("click.imagify",function(b){b.preventDefault(),swal({title:imagifyAdmin.labels.signupTitle,html:imagifyAdmin.labels.signupText,confirmButtonText:imagifyAdmin.labels.signupConfirmButtonText,input:"email",allowOutsideClick:!0,showLoaderOnConfirm:!0,customClass:"imagify-sweet-alert imagify-sweet-alert-signup",inputValidator:function(b){return new Promise(function(c,d){""!==a.trim(b)&&b?c():d(imagifyAdmin.labels.signupErrorEmptyEmail)})},preConfirm:function(b){return new Promise(function(c,d){setTimeout(function(){a.get(ajaxurl+imagify.concat+"action=imagify_signup&email="+b+"&imagifysignupnonce="+a("#imagifysignupnonce").val()).done(function(a){a.success?c():d(a.data)})},2e3)})}}).then(function(){swal({title:imagifyAdmin.labels.signupSuccessTitle,html:imagifyAdmin.labels.signupSuccessText,type:"success",customClass:"imagify-sweet-alert"})})}),a("#imagify-save-api-key").on("click.imagify",function(b){b.preventDefault(),swal({title:imagifyAdmin.labels.saveApiKeyTitle,html:imagifyAdmin.labels.saveApiKeyText,confirmButtonText:imagifyAdmin.labels.saveApiKeyConfirmButtonText,input:"text",allowOutsideClick:!0,showLoaderOnConfirm:!0,customClass:"imagify-sweet-alert imagify-sweet-alert-signup",inputValidator:function(b){return new Promise(function(c,d){""!==a.trim(b)&&b?c():d(imagifyAdmin.labels.ApiKeyErrorEmpty)})},preConfirm:function(b){return new Promise(function(c,d){a.get(ajaxurl+imagify.concat+"action=imagify_check_api_key_validity&api_key="+b+"&imagifycheckapikeynonce="+a("#imagifycheckapikeynonce").val()).done(function(a){a.success?c():d(a.data)})})}}).then(function(){swal({title:imagifyAdmin.labels.ApiKeyCheckSuccessTitle,html:imagifyAdmin.labels.ApiKeyCheckSuccessText,type:"success",customClass:"imagify-sweet-alert"})})}),a(".imagify-notice-dismiss").on("click.imagify",function(b){var c=a(this),d=c.parents(".imagify-welcome, .imagify-notice"),e=c.attr("href");b.preventDefault(),d.fadeTo(100,0,function(){a(this).slideUp(100,function(){a(this).remove()})}),a.get(e.replace("admin-post.php","admin-ajax.php"))})}(jQuery,document,window),function(a,b,c,d){var e=function(b){var c=b.data("target")||b.attr("href");a(c).css("display","flex").hide().fadeIn(400).attr("aria-hidden","false").attr("tabindex","0").focus().removeAttr("tabindex").addClass("modal-is-open"),a("body").addClass("imagify-modal-is-open")};a(".imagify-modal").attr("aria-hidden","true"),a(b).on("click.imagify",".imagify-modal-trigger",function(){return e(a(this)),!1}).on("click.imagify",".imagify-modal .close-btn",function(){a(this).closest(".imagify-modal").fadeOut(400).attr("aria-hidden","true").removeClass("modal-is-open").trigger("modalClosed.imagify"),a("body").removeClass("imagify-modal-is-open")}).on("blur.imagify",".imagify-modal .close-btn",function(){var b=a(this).closest(".imagify-modal");"false"===b.attr("aria-hidden")&&b.attr("tabindex","0").focus().removeAttr("tabindex")}).on("click.imagify",".imagify-modal",function(b){a(b.target).filter(".modal-is-open").find(".close-btn").trigger("click.imagify")}).on("keydown.imagify",function(b){if(27===b.keyCode&&a(".imagify-modal.modal-is-open").length>0)return b.preventDefault(),a(".imagify-modal.modal-is-open").find(".close-btn").trigger("click.imagify"),!1})}(jQuery,document,window),function(a,b,c,d){var e={};a("#imagify-pricing-modal").length&&(e={$modal:a("#imagify-pricing-modal"),$checkboxes:a(".imagify-offer-line .imagify-checkbox"),$radios:a(".imagify-payment-modal .imagify-radio-line input"),$preView:a("#imagify-pre-checkout-view"),$plansView:a("#imagify-plans-selection-view").hide(),$paymentView:a("#imagify-payment-process-view").hide(),$successView:a("#imagify-success-view").hide(),$anotherBtn:a(".imagify-choose-another-plan"),speedFadeIn:300,getHtmlPrice:function(a,b){var c,d,e,f,g;return b||(b=null),"object"!=typeof a?(a+="",a=a.split("."),a[1]=1===a[1].length?a[1]+"0":(""+a[1]).substring(0,2),g='<span class="imagify-price-big">'+a[0]+"</span> ",g+='<span class="imagify-price-mini">.'+a[1]+"</span>"):(c=a.monthly+"",d=a.yearly+"",e=c.split("."),f=d.split("."),g='<span class="imagify-switch-my">',g+='<span aria-hidden="'+("monthly"===b?"false":"true")+'" class="imagify-monthly">',g+='<span class="imagify-price-big">'+e[0]+"</span> ",g+='<span class="imagify-price-mini">.'+(1===e[1].length?e[1]+"0":(""+e[1]).substring(0,2))+"</span>",g+="</span> ",g+='<span aria-hidden="'+("yearly"===b?"false":"true")+'" class="imagify-yearly">',g+='<span class="imagify-price-big">'+f[0]+"</span> ",g+='<span class="imagify-price-mini">.'+(1===f[1].length?f[1]+"0":(""+f[1]).substring(0,2))+"</span>",g+="</span>",g+="</span>")},getHtmlDiscountPrice:function(a,b){var c,d,e="";return b||(b=null),"object"==typeof a?(c=a.monthly+"",d=a.yearly+"",e+='<span class="imagify-price-discount">',e+='<span class="imagify-price-discount-dollar">$</span>',e+='<span class="imagify-switch-my">',e+='<span aria-hidden="'+("monthly"===b?"false":"true")+'" class="imagify-monthly">',e+='<span class="imagify-price-discount-number">'+c+"</span>",e+="</span>",e+='<span aria-hidden="'+("yearly"===b?"false":"true")+'" class="imagify-yearly">',e+='<span class="imagify-price-discount-number">'+d+"</span>",e+="</span>",e+="</span>",e+="</span>"):(a+="",e+='<span class="imagify-price-discount">',e+='<span class="imagify-price-discount-dollar">$</span>',e+='<span class="imagify-price-discount-number">'+a+"</span>",e+="</span>"),e},populateOffer:function(a,b,d,f){var g,h,i,j=c.imagify_discount_datas,k=b.additional_gb,l=b.annual_cost,m=b.id,n=b.label,o=b.monthly_cost,p=b.quota,q=b.cost,r=p>=1e3?p/1e3+" GB":p+" MB",s="monthly"===d?{monthly:o,yearly:Math.round(l/12*100)/100}:q,t=s;return j.is_active&&"percentage"===j.coupon_type&&"monthly"===d&&(g=(100-j.coupon_value)/100,s="monthly"===d?{monthly:o*g,yearly:Math.round(l*g/12*100)/100}:q*g),void 0!==f&&a.addClass("imagify-"+d+"-"+n+f),a.find(".imagify-offer-size").text(r),a.find(".imagify-number-block").html(e.getHtmlPrice(s,"monthly")),j.is_active&&"percentage"===j.coupon_type&&"monthly"===d&&(a.find(".imagify-price-block").prev(".imagify-price-discount").remove(),a.find(".imagify-price-block").before(e.getHtmlDiscountPrice(t,"monthly"))),a.find(".imagify-approx-nb").text(5*p),"monthly"===d&&a.find(".imagify-price-add-data").text("$"+k),h=a.find(".imagify-payment-btn-select-plan").length?a.find(".imagify-payment-btn-select-plan"):a,i="monthly"===d?'{"'+n+'":{"id":'+m+',"name":"'+r+'","data":'+p+',"dataf":"'+r+'","imgs":'+5*p+',"prices":{"monthly":'+s.monthly+',"yearly":'+s.yearly+',"add":'+k+"}}}":'{"ot'+n+'":{"id":'+m+',"name":"'+r+'","data":'+p+',"dataf":"'+r+'","imgs":'+5*p+',"price":'+s+"}}",h.attr("data-offer",i),a},populatePayBtn:function(){var b=JSON.parse(a(".imagify-offer-monthly").attr("data-offer")),c=JSON.parse(a(".imagify-offer-onetime").attr("data-offer")),d=0,e=0,f=0;a(".imagify-offer-monthly").hasClass("imagify-offer-selected")&&(e=a("#imagify-subscription-monthly").filter(":checked").length?b[Object.keys(b)[0]].prices.monthly:12*b[Object.keys(b)[0]].prices.yearly),a(".imagify-offer-onetime").hasClass("imagify-offer-selected")&&(f=c[Object.keys(c)[0]].price),d=parseFloat(f+e).toFixed(2),"0.00"===d||0===d?a("#imagify-modal-checkout-btn").attr("disabled","disabled").addClass("imagify-button-disabled"):a("#imagify-modal-checkout-btn").removeAttr("disabled").removeClass("imagify-button-disabled")},checkCoupon:function(){var b,c,d,e,f=a("#imagify-coupon-code").val();""!==f&&(b=a(".imagify-coupon-text"),c=b.find("label"),d=a(".imagify-coupon-section"),e=a("#imagify-get-pricing-modal").data("nonce"),b.addClass("checking"),a.post(ajaxurl,{action:"imagify_check_coupon",coupon:f,imagifynonce:e},function(a){var e;b.removeClass("checking"),a.success?a.data.success?(e="percentage"===a.data.coupon_type?a.data.value+"%":"$"+a.data.value,d.removeClass("invalid").addClass("validated"),c.html(imagifyAdmin.labels.successCouponAPI),c.find(".imagify-coupon-offer").text(e),c.find(".imagify-coupon-word").text(f)):(d.removeClass("validated").addClass("invalid"),c.text(a.data.detail)):(d.removeClass("validated").addClass("invalid"),c.text(imagifyAdmin.labels.errorCouponAPI))}))},getPricing:function(b){var d=b.data("nonce"),f={action:"imagify_get_prices",imagifynonce:d},g={action:"imagify_get_images_counts",imagifynonce:d},h={action:"imagify_get_discount",imagifynonce:d};e.$modal.find(".imagify-modal-loader").hide().show(),a.post(ajaxurl,f,function(b){if(!b.success)return void e.populatePayBtn();a.post(ajaxurl,g,function(d){d.success&&a.post(ajaxurl,h,function(f){var g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C="",D="",E=!1,F=!1;if(f.success){if(g=d.data,h=b.data,i=f.data,j=h.monthlies,k=h.onetimes,l=Math.round(g.average_month_size.raw/1e6),m=Math.round(g.total_library_size.raw/1e6),n=a("#imagify-offer-monthly-template"),o=a("#imagify-offer-onetime-template"),p=o.html(),q=n.html(),r=a(".imagify-estimation-block"),r.removeClass("imagify-analyzing"),r.find(".average-month-size").text(g.average_month_size.human),r.find(".total-library-size").text(g.total_library_size.human),l<25&&m<25?(a(".imagify-pre-checkout-offers .imagify-modal-title").addClass("imagify-enough-free"),a(".imagify-offer-selected").removeClass("imagify-offer-selected").find(".imagify-checkbox").removeAttr("checked")):(a(".imagify-enough-free").removeClass("imagify-enough-free"),a(".imagify-offer-selected").addClass("imagify-offer-selected").find(".imagify-checkbox").attr("checked","checked")),null===j||null===k)return s=a(".imagify-pre-checkout-offers"),s.hide().attr("aria-hidden",!0),s.closest(".imagify-modal-views").find(".imagify-popin-message").remove(),s.after('<div class="imagify-popin-message imagify-error"><p>'+imagifyAdmin.labels.errorPriceAPI+"</p></div>"),void e.$modal.find(".imagify-modal-loader").fadeOut(300);if(c.imagify_discount_datas=i,i.is_active&&(t=a(".imagify-modal-promotion"),u=i.date_end.split("T")[0],v=i.coupon_value,w="percentage"===i.coupon_type?v+"%":"$"+v,a("#imagify-coupon-code").val(i.label).attr("readonly",!0),t.addClass("active").attr("aria-hidden","false"),t.find(".imagify-promotion-number").text(w),t.find(".imagify-promotion-date").text(u),e.checkCoupon()),a.each(j,function(b,c){var d,f,g="";return"free"===c.label||(d=a(q).clone(),!1!==F&&b-F>2||(l<c.quota&&!1===F&&(g=" imagify-offer-selected",F=b,f=a(".imagify-pre-checkout-offers").find(".imagify-offer-monthly"),e.populateOffer(f,c,"monthly")),d=e.populateOffer(d,c,"monthly",g),void(D+=d[0].outerHTML)))}),x=a(D).filter(".imagify-offer-selected").prevAll(),x.length>1){for(y=x.length-1,z=a(D),A=0;A<y;A++)delete z[A];for(D="",B=0;B<z.length;B++)D+=a("<div/>").append(z[B]).html()}a.each(k,function(b,c){var d,f=a(p).clone(),g=a(".imagify-pre-checkout-offers").find(".imagify-offer-onetime"),h="";m<c.quota&&!1===E&&(h=" imagify-offer-selected",E=!0,e.populateOffer(g,c,"onetime")),k.length-1===b&&!1===E&&(d=k[k.length-1],e.populateOffer(g,d,"onetime")),f=e.populateOffer(f,c,"onetime",h),C+=f[0].outerHTML}),n.parent().find(".imagify-offer-line")&&n.parent().find(".imagify-offer-line").remove(),n.before(D),o.parent().find(".imagify-offer-line")&&o.parent().find(".imagify-offer-line").remove(),o.before(C),e.$modal.find(".imagify-modal-loader").fadeOut(300)}})}),e.populatePayBtn()})},checkCheckbox:function(b){b.each(function(){var b=a(this);b.is(":checked")?b.closest(".imagify-offer-line").addClass("imagify-offer-selected"):b.closest(".imagify-offer-line").removeClass("imagify-offer-selected")}),e.populatePayBtn()},checkRadio:function(b){return b.each(function(){var b,c,d=a(this);b=d.parent(".imagify-cart-list-switcher").length?d.closest(".imagify-cart"):d.parent(".imagify-small-options").length?d.parent(".imagify-small-options").next(".imagify-pricing-table"):d.closest(".imagify-offer-line"),c=b.find(".imagify-switch-my"),"yearly"===d.val()?(b.addClass("imagify-year-selected").removeClass("imagify-month-selected"),c.find(".imagify-monthly").attr("aria-hidden","true"),c.find(".imagify-yearly").attr("aria-hidden","false")):(b.addClass("imagify-month-selected").removeClass("imagify-year-selected"),c.find(".imagify-monthly").attr("aria-hidden","false"),c.find(".imagify-yearly").attr("aria-hidden","true"))}),e.populatePayBtn(),b},populateBtnPrice:setInterval(function(){e.populatePayBtn()},1e3),getPeriod:function(){return a(".imagify-offer-monthly").hasClass("imagify-month-selected")?"monthly":"yearly"},getApiKey:function(){return a("#imagify-payment-iframe").data("imagify-api")},switchToView:function(a,b){var c=a.attr("id"),d=e.$modal.children(".imagify-modal-content");a.siblings(".imagify-modal-views").hide().attr("aria-hidden","true"),b&&b.tab&&a.find('a[href="#'+b.tab+'"]').trigger("click.imagify"),"imagify-payment-process-view"===c?d.addClass("imagify-iframe-viewing"):d.removeClass("imagify-iframe-viewing"),"imagify-success-view"===c?(d.addClass("imagify-success-viewing"),e.$modal.attr("aria-labelledby","imagify-success-view")):(d.removeClass("imagify-success-viewing"),e.$modal.removeAttr("aria-labelledby")),a.fadeIn(e.speedFadeIn).attr("aria-hidden","false")},iframeSetSrc:function(b){var c,d,f,g,h,i,j,k=a("#imagify-payment-iframe"),l=k.attr("src"),m=k.data("src"),n=0,o=0;if("string"==typeof b&&""!==l)return j="monthly"===b?"yearly":"monthly",l=l.replace(j,b),void k.attr("src",l);if("object"==typeof b){if(b.monthly&&(n=b.monthly[Object.keys(b.monthly)[0]].id),b.onetime&&(o=b.onetime[Object.keys(b.onetime)[0]].id,o=o+""=="999"?b.onetime[Object.keys(b.onetime)[0]].data:o),!b.period)return void imagify.info("No period defined");e.getApiKey(),c=o,d="yearly"===b.period?n:0,f="monthly"===b.period?n:0,g=a("#imagify-coupon-code").val(),h=""===g?"none":g,parseFloat(a(".imagify-global-amount").text()).toFixed(2),m=m+c+"/"+f+"/"+d+"/"+h+"/",i=k.remove().attr("src",m),e.$paymentView.html(i)}},paymentClose:function(){a(".imagify-iframe-viewing .close-btn").trigger("click.imagify"),a(".imagify-iframe-viewing").removeClass("imagify-iframe-viewing")},paymentBack:function(){e.switchToView(e.$preView)},paymentSuccess:function(){e.switchToView(e.$successView)},checkPluginMessage:function(a){var b=a.origin||a.originalEvent.origin;if("https://app.imagify.io"===b||"http://dapp.imagify.io"===b)switch(a.data){case"cancel":e.paymentClose();break;case"back":e.paymentBack();break;case"success":e.paymentSuccess()}}},e.checkCheckbox(e.$checkboxes),e.checkRadio(e.$radios.filter(":checked")),e.checkCoupon(),e.$checkboxes.on("change.imagify",function(){e.checkCheckbox(a(this))}),e.$radios.on("change.imagify",function(){e.checkRadio(a(this))}),a("#imagify-get-pricing-modal").on("click.imagify-ajax",function(){e.getPricing(a(this))}),a(b).on("modalClosed.imagify",".imagify-payment-modal",function(){a(this).find(".imagify-modal-content").removeClass("imagify-success-viewing imagify-iframe-viewing"),setTimeout(function(){a(".imagify-modal-views").hide(),a("#imagify-pre-checkout-view").show()},300)}),a("#imagify-coupon-code").on("blur.imagify",function(){a(this).attr("readonly")||e.checkCoupon()}).on("keydown.imagify",function(b){var c=a(this);if(!c.attr("readonly"))return 13===b.keyCode||32===b.keyCode?(e.checkCoupon(),!1):void(c.val().length>=3?c.closest(".imagify-coupon-input").addClass("imagify-canbe-validate"):c.closest(".imagify-coupon-input").removeClass("imagify-canbe-validate"))}),a("#imagify-coupon-validate").on("click.imagify",function(){e.checkCoupon(),a(this).closest(".imagify-canbe-validate").removeClass("imagify-canbe-validate")}),e.$anotherBtn.on("click.imagify",function(){var b=a(this).data("imagify-choose"),c="imagify-pricing-tab-"+("plan"===b?"monthly":"onetime");return e.switchToView(e.$plansView,{tab:c}),!1}),e.$modal.on("click.imagify",".imagify-payment-btn-select-plan",function(){var b=a(this),c=b.closest(".imagify-offer-line"),d=b.data("offer"),f=b.attr("data-offer"),g="imagify-pricing-tab-monthly"!==b.closest(".imagify-tab-content").attr("id"),h=g?e.$preView.find(".imagify-offer-onetime"):e.$preView.find(".imagify-offer-monthly"),i=g?null:b.closest(".imagify-pricing-table").hasClass("imagify-month-selected")?"monthly":"yearly",j=g?e.getHtmlPrice(d[Object.keys(d)[0]].price):e.getHtmlPrice(d[Object.keys(d)[0]].prices,i),k=g?"":'<span class="imagify-price-by">'+c.find(".imagify-price-by").text()+"</span>",l=c.find(".imagify-price-discount").html(),m=c.find(".imagify-approx-nb").text(),n=c.find(".imagify-offer-size").text();return e.switchToView(e.$preView),h.find(".imagify-number-block").html(j+k),h.find(".imagify-price-discount").html(l),h.find(".imagify-approx-nb").text(m),h.find(".imagify-offer-size").text(n),h.attr("data-offer",f),g||(h.find(".imagify-price-add-data").text(c.find(".imagify-price-add-data").text()),"monthly"===i?h.find("#imagify-subscription-monthly").trigger("click.imagify"):h.find("#imagify-subscription-yearly").trigger("click.imagify"),h.find(".imagify-inline-options").find("input:radio:checked").trigger("change.imagify")),e.populatePayBtn(),!1}),a("#imagify-modal-checkout-btn").on("click.imagify",function(){var b,c,d;if(!a(this).hasClass("imagify-button-disabled"))return b=a(".imagify-offer-monthly"),c=a(".imagify-offer-onetime"),d={},b.hasClass("imagify-offer-selected")&&(d.monthly=JSON.parse(b.attr("data-offer"))),c.hasClass("imagify-offer-selected")&&(d.onetime=JSON.parse(c.attr("data-offer"))),e.switchToView(e.$paymentView),d.period=e.getPeriod(),e.iframeSetSrc(d),!1}),a(".imagify-back-to-plans").on("click.imagify",function(){return a(this).closest(".imagify-cart-item").hasClass("imagify-cart-item-onetime")?a(".imagify-offer-onetime").find(".imagify-choose-another-plan").trigger("click.imagify"):a(".imagify-offer-monthly").find(".imagify-choose-another-plan").trigger("click.imagify"),!1}),c.addEventListener("message",e.checkPluginMessage,!0))}(jQuery,document,window),function(a,b,c,d){a(".imagify-tab").on("click.imagify",function(b){var c,d=a(this);b.preventDefault(),d.hasClass("imagify-current")||(c=d.find("a").attr("href")||"#"+d.find("a").attr("aria-controls"),d.closest(".imagify-tabs").next(".imagify-tabs-contents").find(".imagify-tab-content").hide().attr("aria-hidden","true"),a(c).fadeIn(275).attr("aria-hidden","false"),d.closest(".imagify-tabs").find(".imagify-tab").removeClass("imagify-current").attr("aria-selected","false"),d.addClass("imagify-current").attr("aria-selected","true"))})}(jQuery,document,window);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/bulk.js
CHANGED
@@ -1,382 +1,397 @@
|
|
1 |
-
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
log
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
overviewData = [
|
14 |
-
{
|
15 |
-
value: imagifyBulk.labels.totalUnoptimizedAttachments,
|
16 |
-
color:"#D9E4EB",
|
17 |
-
highlight: "#D9E4EB",
|
18 |
-
label: imagifyBulk.labels.overviewChartLabels.unoptimized
|
19 |
-
},
|
20 |
-
{
|
21 |
-
value: imagifyBulk.labels.totalOptimizedAttachments,
|
22 |
-
color: "#46B1CE",
|
23 |
-
highlight: "#46B1CE",
|
24 |
-
label: imagifyBulk.labels.overviewChartLabels.optimized
|
25 |
-
},
|
26 |
-
{
|
27 |
-
value: imagifyBulk.labels.totalErrorsAttachments,
|
28 |
-
color: "#2E3242",
|
29 |
-
highlight: "#2E3242",
|
30 |
-
label: imagifyBulk.labels.overviewChartLabels.error
|
31 |
}
|
32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
-
// to avoid JS error
|
35 |
if ( overviewCanvas ) {
|
36 |
-
|
37 |
-
segmentStrokeColor
|
38 |
-
segmentStrokeWidth
|
39 |
-
animateRotate
|
40 |
-
animation:
|
41 |
percentageInnerCutout: 85,
|
42 |
-
legendTemplate
|
43 |
-
tooltipTemplate:
|
44 |
-
});
|
45 |
|
46 |
-
|
47 |
-
|
48 |
-
|
|
|
|
|
49 |
|
50 |
-
//
|
51 |
overviewLegend = '<ul class="imagify-doughnut-legend">';
|
52 |
-
|
53 |
-
$(overviewData).each(function(i){
|
54 |
-
overviewLegend += '<li><span style="background-color:' + overviewData[i].color + '"></span>' + overviewData[i].label + '</li>';
|
55 |
-
});
|
56 |
|
57 |
overviewLegend += '</ul>';
|
58 |
-
|
59 |
-
|
60 |
}
|
61 |
-
|
62 |
-
// Heartbeat
|
63 |
-
$(
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
// Listen for the custom event "heartbeat-tick" on $(document).
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
$('#imagify-overview-chart-percent').html(data.optimized_attachments_percent + '<span>%</span>');
|
77 |
-
$('.imagify-total-percent').html(data.optimized_attachments_percent + '%' );
|
78 |
-
|
79 |
-
// The comsuption bar
|
80 |
-
$('.imagify-unconsumed-percent').html(data.unconsumed_quota + '%');
|
81 |
-
$('.imagify-unconsumed-bar').css('width', data.unconsumed_quota + '%');
|
82 |
-
|
83 |
-
// The total optimized images
|
84 |
-
$('#imagify-total-optimized-attachments').html(data.already_optimized_attachments);
|
85 |
-
|
86 |
-
// The original bar
|
87 |
-
$('#imagify-original-bar').find('.imagify-barnb')
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
// The Percent data
|
96 |
-
$('#imagify-total-optimized-attachments-pct').html( data.optimized_percent + '%' );
|
97 |
|
98 |
overviewDoughnut.segments[0].value = data.unoptimized_attachments;
|
99 |
overviewDoughnut.segments[1].value = data.optimized_attachments;
|
100 |
overviewDoughnut.segments[2].value = data.errors_attachments;
|
101 |
overviewDoughnut.update();
|
102 |
-
|
103 |
|
104 |
// Simulate a click on the "Imagif'em all" button
|
105 |
-
$('#imagify-simulate-bulk-action').click
|
106 |
e.preventDefault();
|
107 |
-
$('#imagify-bulk-action').trigger('click');
|
108 |
-
});
|
109 |
|
110 |
-
$('#imagify-bulk-action').click
|
111 |
-
var $obj = $(this),
|
112 |
-
|
|
|
113 |
|
114 |
-
if (
|
115 |
-
|
116 |
}
|
117 |
-
|
118 |
-
if ( $obj.attr('disabled') ) {
|
119 |
return false;
|
120 |
}
|
121 |
|
122 |
-
$obj.attr('disabled', 'disabled');
|
123 |
-
$obj.find('.dashicons').addClass('rotate');
|
124 |
-
|
125 |
-
|
126 |
-
confirmMessage = function(){
|
127 |
return imagifyBulk.labels.processing;
|
128 |
};
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
|
|
135 |
showConfirmButton: false,
|
136 |
-
imageUrl:
|
137 |
-
});
|
138 |
-
|
139 |
-
$.get(ajaxurl+concat+
|
140 |
-
.done(function(response) {
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
|
|
|
|
|
|
|
|
|
|
152 |
swal_title = imagifyBulk.labels.invalidAPIKeyTitle;
|
153 |
}
|
154 |
-
|
155 |
-
if ( response.data.message
|
156 |
swal_title = imagifyBulk.labels.overQuotaTitle;
|
157 |
-
text
|
158 |
}
|
159 |
-
|
160 |
-
if ( response.data.message
|
161 |
swal_title = imagifyBulk.labels.noAttachmentToOptimizeTitle;
|
162 |
swal_text = imagifyBulk.labels.noAttachmentToOptimizeText;
|
163 |
}
|
164 |
-
|
165 |
-
// Display an alert to warn that all images has been optimized
|
166 |
-
swal({
|
167 |
-
title: swal_title,
|
168 |
-
html: swal_text,
|
169 |
-
type: "info",
|
170 |
-
customClass: "imagify-sweet-alert"
|
171 |
-
});
|
172 |
-
|
173 |
-
} else {
|
174 |
-
swal.close();
|
175 |
-
|
176 |
-
var config = {
|
177 |
-
'lib': ajaxurl+concat+"action=imagify_bulk_upload&imagifybulkuploadnonce="+$('#imagifybulkuploadnonce').val(),
|
178 |
-
'images': response.data,
|
179 |
-
'context': imagifyBulk.ajax_context
|
180 |
-
}
|
181 |
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
Optimizer = new ImagifyGulp(config);
|
192 |
-
|
193 |
-
// before the attachment optimization
|
194 |
-
Optimizer.before(function(data) {
|
195 |
-
table.find('.imagify-row-progress').after('<tr id="attachment-'+data.id+'"><td class="imagify-cell-filename"><span class="imagiuploaded"><img src="'+data.thumbnail+'"/>"</span><span class="imagifilename">'+data.filename+'</span></td><td class="imagify-cell-status"><span class="imagistatus status-compressing"><span class="dashicons dashicons-admin-generic rotate"></span>Compressing<span></span></span></td><td class="imagify-cell-original"></td><td class="imagify-cell-optimized"></td><td class="imagify-cell-percentage"></td><td class="imagify-cell-thumbnails"></td><td class="imagify-cell-savings"></td></tr>');
|
196 |
-
})
|
197 |
-
// after the attachment optimization
|
198 |
-
.each(function (data) {
|
199 |
-
var $progress = $('#imagify-progress-bar');
|
200 |
-
$progress.css({'width': data.progress + '%'});
|
201 |
-
$progress.find('.percent').html(data.progress + '%');
|
202 |
-
|
203 |
-
if ( data.success ) {
|
204 |
-
$('#attachment-'+data.image+' .imagify-cell-status').html('<span class="imagistatus status-complete"><span class="dashicons dashicons-yes"></span>Complete</span>');
|
205 |
-
$('#attachment-'+data.image+' .imagify-cell-original').html(data.original_size_human);
|
206 |
-
$('#attachment-'+data.image+' .imagify-cell-optimized').html(data.new_size_human);
|
207 |
-
$('#attachment-'+data.image+' .imagify-cell-percentage').html('<span class="imagify-chart"><span class="imagify-chart-container"><canvas height="18" width="18" id="imagify-consumption-chart" style="width: 18px; height: 18px;"></canvas></span></span><span class="imagipercent">'+data.percent+'</span>%');
|
208 |
-
draw_me_a_chart( $('#attachment-'+data.image+' .imagify-cell-percentage').find('canvas') );
|
209 |
-
$('#attachment-'+data.image+' .imagify-cell-thumbnails').html(data.thumbnails);
|
210 |
-
$('#attachment-'+data.image+' .imagify-cell-savings').html(Optimizer.humanSize(data.overall_saving, 1));
|
211 |
-
|
212 |
-
// The table footer total optimized files
|
213 |
-
files = files + data.thumbnails + 1;
|
214 |
-
$('.imagify-cell-nb-files').html(files + ' file(s)');
|
215 |
-
|
216 |
-
// The table footer original size
|
217 |
-
original_overall_size = original_overall_size + data.original_overall_size;
|
218 |
-
$('.imagify-total-original').html(Optimizer.humanSize(original_overall_size, 1));
|
219 |
-
|
220 |
-
// The table footer overall saving
|
221 |
-
overall_saving = overall_saving + data.overall_saving;
|
222 |
-
$('.imagify-total-gain').html(Optimizer.humanSize(overall_saving, 1));
|
223 |
-
|
224 |
-
} else {
|
225 |
-
error_class = 'error';
|
226 |
-
error_dashicon = 'dismiss';
|
227 |
-
error_message = 'Error';
|
228 |
-
|
229 |
-
if ( data.error.indexOf("You've consumed all your data") >= 0 ) {
|
230 |
-
swal({
|
231 |
-
title: imagifyBulk.labels.overQuotaTitle,
|
232 |
-
html: imagifyBulk.labels.overQuotaText,
|
233 |
-
type: "error",
|
234 |
-
customClass: "imagify-sweet-alert",
|
235 |
-
}).then( function() {
|
236 |
-
location.reload();
|
237 |
-
});
|
238 |
-
}
|
239 |
-
|
240 |
-
if ( data.error.indexOf("This image is already compressed") >=0 ) {
|
241 |
-
error_class = 'warning';
|
242 |
-
error_dashicon = 'warning';
|
243 |
-
error_message = 'Notice';
|
244 |
-
} else {
|
245 |
-
errors++;
|
246 |
-
$('.imagify-cell-errors').html(errors + ' error(s)');
|
247 |
-
}
|
248 |
-
|
249 |
-
$('#attachment-'+data.image).after('<tr><td colspan="7"><span class="status-'+error_class+'">'+data.error+'</span></td></tr>');
|
250 |
-
|
251 |
-
$('#attachment-'+data.image+' .imagify-cell-status').html('<span class="imagistatus status-'+error_class+'"><span class="dashicons dashicons-'+error_dashicon+'"></span>'+error_message+'</span>');
|
252 |
-
}
|
253 |
-
})
|
254 |
-
// after all attachments optimization
|
255 |
-
.done(function (data) {
|
256 |
-
$obj.removeAttr('disabled');
|
257 |
-
$obj.find('.dashicons').removeClass('rotate');
|
258 |
-
|
259 |
-
// remove confirm dialog before quit the page
|
260 |
-
$(window).off('beforeunload', confirmMessage);
|
261 |
-
|
262 |
-
// Hide the progress bar
|
263 |
-
$('.imagify-row-progress').slideUp();
|
264 |
-
|
265 |
-
if ( data.global_percent !== 'NaN' ) {
|
266 |
-
// Display the complete section
|
267 |
-
$('.imagify-row-complete').removeClass('hidden')
|
268 |
-
.addClass( 'done' )
|
269 |
-
.attr('aria-hidden', 'false');
|
270 |
-
$('html, body').animate({
|
271 |
-
scrollTop: $('.imagify-row-complete').offset().top
|
272 |
-
}, 200);
|
273 |
-
|
274 |
-
$('.imagify-ac-rt-total-gain').html(data.global_gain_human);
|
275 |
-
$('.imagify-ac-rt-total-original').html(data.global_original_size_human);
|
276 |
-
|
277 |
-
text2share = imagifyBulk.labels.textToShare;
|
278 |
-
text2share = text2share.replace( '%1$s', data.global_gain_human );
|
279 |
-
text2share = text2share.replace( '%2$s', data.global_original_size_human );
|
280 |
-
text2share = encodeURIComponent(text2share);
|
281 |
-
|
282 |
-
$('.imagify-sn-twitter').attr( 'href', 'https://twitter.com/intent/tweet?source=webclient&original_referer=' + imagifyBulk.labels.pluginURL + '&text=' + text2share + '&url=' + imagifyBulk.labels.pluginURL + '&related=imagify&hastags=performance,web,wordpress' );
|
283 |
-
|
284 |
-
$('.imagify-ac-chart').attr('data-percent', data.global_percent);
|
285 |
-
draw_me_complete_chart( $('.imagify-ac-chart').find('canvas') );
|
286 |
-
}
|
287 |
-
})
|
288 |
-
.error(function (id) {
|
289 |
-
imagify.log('Can\'t optimize image with id ' + id);
|
290 |
-
})
|
291 |
-
.run();
|
292 |
}
|
293 |
-
})
|
294 |
-
.fail(function () {
|
295 |
-
swal({
|
296 |
-
title: imagifyBulk.labels.getUnoptimizedImagesErrorTitle,
|
297 |
-
html: imagifyBulk.labels.getUnoptimizedImagesErrorText,
|
298 |
-
type: "error",
|
299 |
-
customClass: "imagify-sweet-alert"
|
300 |
-
}).then(function(){
|
301 |
-
location.reload();
|
302 |
-
});
|
303 |
-
});
|
304 |
-
});
|
305 |
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
314 |
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
}
|
325 |
-
],
|
326 |
-
overviewDoughnut = new Chart( $(this)[0].getContext("2d")).Doughnut(overviewData, {
|
327 |
-
segmentStrokeColor : "#FFF",
|
328 |
-
segmentStrokeWidth : 1,
|
329 |
-
animateRotate : true,
|
330 |
-
tooltipEvents: []
|
331 |
-
});
|
332 |
-
});
|
333 |
-
}
|
334 |
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
353 |
}
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
364 |
}
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
}
|
372 |
-
|
373 |
-
|
374 |
-
var clientTop = (document.body.clientHeight-height)/2;
|
375 |
-
}
|
376 |
-
|
377 |
-
[].forEach.call( document.querySelectorAll('.imagify-share-networks a'), function(el) {
|
378 |
-
el.addEventListener('click', function(evt) {
|
379 |
-
window.open(this.href,'',"status=no, scrollbars=no, menubar=no, top="+clientTop+", left="+clientLeft+", width="+width+", height="+height);
|
380 |
-
evt.preventDefault();
|
381 |
-
}, false);
|
382 |
-
});
|
1 |
+
/* globals ajaxurl: false, console: false, imagify: true, ImagifyGulp: false, swal: false */
|
2 |
|
3 |
+
window.imagify = window.imagify || {
|
4 |
+
concat: ajaxurl.indexOf( '?' ) > 0 ? '&' : '?',
|
5 |
+
log: function( content ) {
|
6 |
+
if ( undefined !== console ) {
|
7 |
+
console.log( content );
|
8 |
+
}
|
9 |
+
},
|
10 |
+
info: function( content ) {
|
11 |
+
if ( undefined !== console ) {
|
12 |
+
console.info( content );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
}
|
14 |
+
}
|
15 |
+
};
|
16 |
+
|
17 |
+
(function($, d, w, undefined) {
|
18 |
+
var overviewCanvas = d.getElementById( 'imagify-overview-chart' ),
|
19 |
+
overviewData = [
|
20 |
+
{
|
21 |
+
value: imagifyBulk.labels.totalUnoptimizedAttachments,
|
22 |
+
color: '#D9E4EB',
|
23 |
+
highlight: '#D9E4EB',
|
24 |
+
label: imagifyBulk.labels.overviewChartLabels.unoptimized
|
25 |
+
},
|
26 |
+
{
|
27 |
+
value: imagifyBulk.labels.totalOptimizedAttachments,
|
28 |
+
color: '#46B1CE',
|
29 |
+
highlight: '#46B1CE',
|
30 |
+
label: imagifyBulk.labels.overviewChartLabels.optimized
|
31 |
+
},
|
32 |
+
{
|
33 |
+
value: imagifyBulk.labels.totalErrorsAttachments,
|
34 |
+
color: '#2E3242',
|
35 |
+
highlight: '#2E3242',
|
36 |
+
label: imagifyBulk.labels.overviewChartLabels.error
|
37 |
+
}
|
38 |
+
],
|
39 |
+
overviewDoughnut, overviewLegend;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Mini chart.
|
43 |
+
* You can use drawMeAChart() function with AJAX calls.
|
44 |
+
*
|
45 |
+
* @param {element} canvas
|
46 |
+
*/
|
47 |
+
function drawMeAChart( canvas ) {
|
48 |
+
canvas.each( function() {
|
49 |
+
var $this = $( this ),
|
50 |
+
theValue = parseInt( $this.closest( '.imagify-chart' ).next( '.imagipercent' ).text(), 10 ),
|
51 |
+
overviewData = [
|
52 |
+
{
|
53 |
+
value: theValue,
|
54 |
+
color: '#00B3D3'
|
55 |
+
},
|
56 |
+
{
|
57 |
+
value: 100 - theValue,
|
58 |
+
color:'#D8D8D8'
|
59 |
+
}
|
60 |
+
];
|
61 |
+
|
62 |
+
new Chart( $this[0].getContext( '2d' ) ).Doughnut( overviewData, {
|
63 |
+
segmentStrokeColor: '#FFF',
|
64 |
+
segmentStrokeWidth: 1,
|
65 |
+
animateRotate: true,
|
66 |
+
tooltipEvents: []
|
67 |
+
} );
|
68 |
+
} );
|
69 |
+
}
|
70 |
+
|
71 |
+
/*
|
72 |
+
* Complete Chart.
|
73 |
+
* You can use drawMeCompleteChart() function with AJAX calls.
|
74 |
+
*
|
75 |
+
* @param {element} canvas
|
76 |
+
*/
|
77 |
+
function drawMeCompleteChart( canvas ) {
|
78 |
+
canvas.each( function() {
|
79 |
+
var $this = $( this ),
|
80 |
+
theValue = parseInt( $this.closest( '.imagify-ac-chart' ).attr( 'data-percent' ), 10 ),
|
81 |
+
overviewData = [
|
82 |
+
{
|
83 |
+
value: theValue,
|
84 |
+
color: '#40B1D0'
|
85 |
+
},
|
86 |
+
{
|
87 |
+
value: 100 - theValue,
|
88 |
+
color: '#FFFFFF'
|
89 |
+
}
|
90 |
+
];
|
91 |
+
|
92 |
+
new Chart( $this[0].getContext( '2d' ) ).Doughnut( overviewData, {
|
93 |
+
segmentStrokeColor: 'transparent',
|
94 |
+
segmentStrokeWidth: 0,
|
95 |
+
animateRotate: true,
|
96 |
+
animation: true,
|
97 |
+
percentageInnerCutout: 70,
|
98 |
+
tooltipEvents: []
|
99 |
+
} );
|
100 |
+
} );
|
101 |
+
}
|
102 |
|
|
|
103 |
if ( overviewCanvas ) {
|
104 |
+
overviewDoughnut = new Chart( overviewCanvas.getContext( '2d' ) ).Doughnut( overviewData, {
|
105 |
+
segmentStrokeColor: 'transparent',
|
106 |
+
segmentStrokeWidth: 0,
|
107 |
+
animateRotate: true,
|
108 |
+
animation: true,
|
109 |
percentageInnerCutout: 85,
|
110 |
+
legendTemplate: '<ul class="imagify-<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>',
|
111 |
+
tooltipTemplate: '<%= value %>'
|
112 |
+
} );
|
113 |
|
114 |
+
/**
|
115 |
+
* Then you just need to generate the legend.
|
116 |
+
* var overviewLegend = overviewDoughnut.generateLegend();
|
117 |
+
* bugged `segments undefined` ?
|
118 |
+
*/
|
119 |
|
120 |
+
// And append it to your page somewhere.
|
121 |
overviewLegend = '<ul class="imagify-doughnut-legend">';
|
122 |
+
|
123 |
+
$( overviewData ).each( function( i ) {
|
124 |
+
overviewLegend += '<li><span style="background-color:' + overviewData[ i ].color + '"></span>' + overviewData[ i ].label + '</li>';
|
125 |
+
} );
|
126 |
|
127 |
overviewLegend += '</ul>';
|
128 |
+
|
129 |
+
d.getElementById( 'imagify-overview-chart-legend' ).innerHTML = overviewLegend;
|
130 |
}
|
131 |
+
|
132 |
+
// Heartbeat.
|
133 |
+
$( d ).on( 'heartbeat-send', function( e, data ) {
|
134 |
+
data.imagify_heartbeat = imagifyBulk.heartbeat_id;
|
135 |
+
} );
|
136 |
+
|
137 |
// Listen for the custom event "heartbeat-tick" on $(document).
|
138 |
+
$( d ).on( 'heartbeat-tick', function( e, data ) {
|
139 |
+
if ( ! data.imagify_bulk_data ) {
|
140 |
+
return;
|
141 |
+
}
|
142 |
+
|
143 |
+
data = data.imagify_bulk_data;
|
144 |
+
|
145 |
+
// The overview chart percent.
|
146 |
+
$( '#imagify-overview-chart-percent' ).html( data.optimized_attachments_percent + '<span>%</span>' );
|
147 |
+
$( '.imagify-total-percent' ).html( data.optimized_attachments_percent + '%' );
|
148 |
+
|
149 |
+
// The comsuption bar.
|
150 |
+
$( '.imagify-unconsumed-percent' ).html( data.unconsumed_quota + '%' );
|
151 |
+
$( '.imagify-unconsumed-bar' ).css( 'width', data.unconsumed_quota + '%' );
|
152 |
+
|
153 |
+
// The total optimized images.
|
154 |
+
$( '#imagify-total-optimized-attachments' ).html( data.already_optimized_attachments );
|
155 |
+
|
156 |
+
// The original bar.
|
157 |
+
$( '#imagify-original-bar' ).find( '.imagify-barnb' ).html( data.original_human );
|
158 |
+
|
159 |
+
// The optimized bar.
|
160 |
+
$( '#imagify-optimized-bar' ).css( 'width', data.optimized_percent + '%' ).find( '.imagify-barnb' ).html( data.optimized_human );
|
161 |
+
|
162 |
+
// The Percent data.
|
163 |
+
$( '#imagify-total-optimized-attachments-pct' ).html( data.optimized_percent + '%' );
|
|
|
|
|
|
|
164 |
|
165 |
overviewDoughnut.segments[0].value = data.unoptimized_attachments;
|
166 |
overviewDoughnut.segments[1].value = data.optimized_attachments;
|
167 |
overviewDoughnut.segments[2].value = data.errors_attachments;
|
168 |
overviewDoughnut.update();
|
169 |
+
} );
|
170 |
|
171 |
// Simulate a click on the "Imagif'em all" button
|
172 |
+
$( '#imagify-simulate-bulk-action' ).on( 'click', function( e ) {
|
173 |
e.preventDefault();
|
174 |
+
$( '#imagify-bulk-action' ).trigger( 'click' );
|
175 |
+
} );
|
176 |
|
177 |
+
$( '#imagify-bulk-action' ).on( 'click', function() {
|
178 |
+
var $obj = $( this ),
|
179 |
+
optimizationLevel = $( '[name="optimization_level"]:checked' ).val(),
|
180 |
+
confirmMessage;
|
181 |
|
182 |
+
if ( optimizationLevel === undefined ) {
|
183 |
+
optimizationLevel = -1;
|
184 |
}
|
185 |
+
|
186 |
+
if ( $obj.attr( 'disabled' ) ) {
|
187 |
return false;
|
188 |
}
|
189 |
|
190 |
+
$obj.attr( 'disabled', 'disabled' );
|
191 |
+
$obj.find( '.dashicons' ).addClass( 'rotate' );
|
192 |
+
|
193 |
+
confirmMessage = function() {
|
|
|
194 |
return imagifyBulk.labels.processing;
|
195 |
};
|
196 |
+
|
197 |
+
$( w ).on( 'beforeunload', confirmMessage );
|
198 |
+
|
199 |
+
// Display an alert to wait.
|
200 |
+
swal( {
|
201 |
+
title: imagifyBulk.labels.waitTitle,
|
202 |
+
html: imagifyBulk.labels.waitText,
|
203 |
showConfirmButton: false,
|
204 |
+
imageUrl: imagifyBulk.labels.waitImageUrl
|
205 |
+
} );
|
206 |
+
|
207 |
+
$.get( ajaxurl + imagify.concat + 'action=' + imagifyBulk.ajax_action + '&optimization_level=' + optimizationLevel + '&imagifybulkuploadnonce=' + $( '#imagifybulkuploadnonce' ).val() )
|
208 |
+
.done( function( response ) {
|
209 |
+
var swal_title = '',
|
210 |
+
swal_text = '',
|
211 |
+
text, Optimizer, table,
|
212 |
+
files = 0,
|
213 |
+
errors = 0,
|
214 |
+
original_overall_size = 0,
|
215 |
+
overall_saving = 0;
|
216 |
+
|
217 |
+
if ( ! response.success ) {
|
218 |
+
$obj.removeAttr( 'disabled' );
|
219 |
+
$obj.find( '.dashicons' ).removeClass( 'rotate' );
|
220 |
+
|
221 |
+
// Remove confirm dialog before quit the page.
|
222 |
+
$( w ).off( 'beforeunload', confirmMessage );
|
223 |
+
|
224 |
+
if ( 'invalid-api-key' === response.data.message ) {
|
225 |
swal_title = imagifyBulk.labels.invalidAPIKeyTitle;
|
226 |
}
|
227 |
+
|
228 |
+
if ( 'over-quota' === response.data.message ) {
|
229 |
swal_title = imagifyBulk.labels.overQuotaTitle;
|
230 |
+
text = imagifyBulk.labels.overQuotaText;
|
231 |
}
|
232 |
+
|
233 |
+
if ( 'no-images' === response.data.message ) {
|
234 |
swal_title = imagifyBulk.labels.noAttachmentToOptimizeTitle;
|
235 |
swal_text = imagifyBulk.labels.noAttachmentToOptimizeText;
|
236 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
|
238 |
+
// Display an alert to warn that all images has been optimized.
|
239 |
+
swal( {
|
240 |
+
title: swal_title,
|
241 |
+
html: swal_text,
|
242 |
+
type: 'info',
|
243 |
+
customClass: 'imagify-sweet-alert'
|
244 |
+
} );
|
245 |
+
|
246 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
248 |
|
249 |
+
swal.close();
|
250 |
+
|
251 |
+
$( '.imagify-row-progress' ).slideDown();
|
252 |
+
$( '.imagify-no-uploaded-yet, .imagify-row-complete' ).hide( 200 );
|
253 |
+
|
254 |
+
table = $( '.imagify-bulk-table table tbody' );
|
255 |
+
Optimizer = new ImagifyGulp( {
|
256 |
+
'lib': ajaxurl + imagify.concat + 'action=imagify_bulk_upload&imagifybulkuploadnonce=' + $( '#imagifybulkuploadnonce' ).val(),
|
257 |
+
'images': response.data,
|
258 |
+
'context': imagifyBulk.ajax_context
|
259 |
+
} );
|
260 |
+
|
261 |
+
// Before the attachment optimization.
|
262 |
+
Optimizer.before( function( data ) {
|
263 |
+
table.find( '.imagify-row-progress' ).after( '<tr id="attachment-' + data.id + '"><td class="imagify-cell-filename"><span class="imagiuploaded"><img src="' + data.thumbnail + '"/>"</span><span class="imagifilename">' + data.filename + '</span></td><td class="imagify-cell-status"><span class="imagistatus status-compressing"><span class="dashicons dashicons-admin-generic rotate"></span>Compressing<span></span></span></td><td class="imagify-cell-original"></td><td class="imagify-cell-optimized"></td><td class="imagify-cell-percentage"></td><td class="imagify-cell-thumbnails"></td><td class="imagify-cell-savings"></td></tr>' );
|
264 |
+
} )
|
265 |
+
// After the attachment optimization.
|
266 |
+
.each( function( data ) {
|
267 |
+
var $progress = $( '#imagify-progress-bar' ),
|
268 |
+
errorClass = 'error',
|
269 |
+
errorDashicon = 'dismiss',
|
270 |
+
errorMessage = 'Error';
|
271 |
+
|
272 |
+
$progress.css( { 'width': data.progress + '%' } );
|
273 |
+
$progress.find( '.percent' ).html( data.progress + '%' );
|
274 |
+
|
275 |
+
if ( data.success ) {
|
276 |
+
$( '#attachment-' + data.image + ' .imagify-cell-status' ).html( '<span class="imagistatus status-complete"><span class="dashicons dashicons-yes"></span>Complete</span>' );
|
277 |
+
$( '#attachment-' + data.image + ' .imagify-cell-original' ).html( data.original_size_human );
|
278 |
+
$( '#attachment-' + data.image + ' .imagify-cell-optimized' ).html( data.new_size_human );
|
279 |
+
$( '#attachment-' + data.image + ' .imagify-cell-percentage' ).html( '<span class="imagify-chart"><span class="imagify-chart-container"><canvas height="18" width="18" id="imagify-consumption-chart" style="width: 18px; height: 18px;"></canvas></span></span><span class="imagipercent">' + data.percent + '</span>%' );
|
280 |
+
drawMeAChart( $( '#attachment-' + data.image + ' .imagify-cell-percentage' ).find( 'canvas' ) );
|
281 |
+
$( '#attachment-' + data.image + ' .imagify-cell-thumbnails' ).html( data.thumbnails );
|
282 |
+
$( '#attachment-' + data.image + ' .imagify-cell-savings' ).html( Optimizer.humanSize( data.overall_saving, 1 ) );
|
283 |
+
|
284 |
+
// The table footer total optimized files.
|
285 |
+
files = files + data.thumbnails + 1;
|
286 |
+
$( '.imagify-cell-nb-files' ).html( files + ' file(s)' );
|
287 |
+
|
288 |
+
// The table footer original size.
|
289 |
+
original_overall_size = original_overall_size + data.original_overall_size;
|
290 |
+
$( '.imagify-total-original' ).html( Optimizer.humanSize( original_overall_size, 1 ) );
|
291 |
+
|
292 |
+
// The table footer overall saving.
|
293 |
+
overall_saving = overall_saving + data.overall_saving;
|
294 |
+
$( '.imagify-total-gain' ).html( Optimizer.humanSize( overall_saving, 1 ) );
|
295 |
+
|
296 |
+
return;
|
297 |
+
}
|
298 |
|
299 |
+
if ( data.error.indexOf( "You've consumed all your data" ) >= 0 ) {
|
300 |
+
swal( {
|
301 |
+
title: imagifyBulk.labels.overQuotaTitle,
|
302 |
+
html: imagifyBulk.labels.overQuotaText,
|
303 |
+
type: 'error',
|
304 |
+
customClass: 'imagify-sweet-alert',
|
305 |
+
} ).then( function() {
|
306 |
+
location.reload();
|
307 |
+
} );
|
308 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
309 |
|
310 |
+
if ( data.error.indexOf( 'This image is already compressed' ) >= 0 ) {
|
311 |
+
errorClass = 'warning';
|
312 |
+
errorDashicon = 'warning';
|
313 |
+
errorMessage = 'Notice';
|
314 |
+
} else {
|
315 |
+
errors++;
|
316 |
+
$( '.imagify-cell-errors' ).html( errors + ' error(s)' );
|
317 |
+
}
|
318 |
|
319 |
+
$( '#attachment-' + data.image ).after( '<tr><td colspan="7"><span class="status-' + errorClass + '">' + data.error + '</span></td></tr>' );
|
320 |
+
|
321 |
+
$( '#attachment-' + data.image + ' .imagify-cell-status' ).html( '<span class="imagistatus status-' + errorClass + '"><span class="dashicons dashicons-' + errorDashicon + '"></span>' + errorMessage + '</span>' );
|
322 |
+
} )
|
323 |
+
// After all attachments optimization.
|
324 |
+
.done( function( data ) {
|
325 |
+
var text2share;
|
326 |
+
|
327 |
+
$obj.removeAttr( 'disabled' ).find( '.dashicons' ).removeClass( 'rotate' );
|
328 |
+
|
329 |
+
// Remove confirm dialog before quit the page.
|
330 |
+
$( w ).off( 'beforeunload', confirmMessage );
|
331 |
+
|
332 |
+
// Hide the progress bar.
|
333 |
+
$( '.imagify-row-progress' ).slideUp();
|
334 |
+
|
335 |
+
if ( 'NaN' !== data.global_percent ) {
|
336 |
+
// Display the complete section.
|
337 |
+
$( '.imagify-row-complete' ).removeClass( 'hidden' ).addClass( 'done' ).attr( 'aria-hidden', 'false' );
|
338 |
+
$( 'html, body' ).animate( {
|
339 |
+
scrollTop: $( '.imagify-row-complete' ).offset().top
|
340 |
+
}, 200 );
|
341 |
+
|
342 |
+
$( '.imagify-ac-rt-total-gain' ).html( data.global_gain_human );
|
343 |
+
$( '.imagify-ac-rt-total-original' ).html( data.global_original_size_human );
|
344 |
+
|
345 |
+
text2share = imagifyBulk.labels.textToShare;
|
346 |
+
text2share = text2share.replace( '%1$s', data.global_gain_human );
|
347 |
+
text2share = text2share.replace( '%2$s', data.global_original_size_human );
|
348 |
+
text2share = encodeURIComponent( text2share );
|
349 |
+
|
350 |
+
$( '.imagify-sn-twitter' ).attr( 'href', 'https://twitter.com/intent/tweet?source=webclient&original_referer=' + imagifyBulk.labels.pluginURL + '&text=' + text2share + '&url=' + imagifyBulk.labels.pluginURL + '&related=imagify&hastags=performance,web,wordpress' );
|
351 |
+
|
352 |
+
$( '.imagify-ac-chart' ).attr( 'data-percent', data.global_percent );
|
353 |
+
drawMeCompleteChart( $( '.imagify-ac-chart' ).find( 'canvas' ) );
|
354 |
}
|
355 |
+
} )
|
356 |
+
.error( function( id ) {
|
357 |
+
imagify.log( 'Can\'t optimize image with id ' + id );
|
358 |
+
} )
|
359 |
+
.run();
|
360 |
+
} )
|
361 |
+
.fail( function() {
|
362 |
+
swal( {
|
363 |
+
title: imagifyBulk.labels.getUnoptimizedImagesErrorTitle,
|
364 |
+
html: imagifyBulk.labels.getUnoptimizedImagesErrorText,
|
365 |
+
type: 'error',
|
366 |
+
customClass: 'imagify-sweet-alert'
|
367 |
+
} ).then( function() {
|
368 |
+
location.reload();
|
369 |
+
} );
|
370 |
+
} );
|
371 |
+
} );
|
372 |
+
|
373 |
+
} )(jQuery, document, window);
|
374 |
+
|
375 |
+
|
376 |
+
(function($, d, w, undefined) {
|
377 |
+
|
378 |
+
var width = 700,
|
379 |
+
height = 290,
|
380 |
+
clientLeft, clientTop;
|
381 |
+
|
382 |
+
if ( w.innerWidth ) {
|
383 |
+
clientLeft = ( w.innerWidth - width ) / 2;
|
384 |
+
clientTop = ( w.innerHeight - height ) / 2;
|
385 |
+
} else {
|
386 |
+
clientLeft = ( d.body.clientWidth - width ) / 2;
|
387 |
+
clientTop = ( d.body.clientHeight - height ) / 2;
|
388 |
}
|
389 |
+
|
390 |
+
[].forEach.call( d.querySelectorAll( '.imagify-share-networks a' ), function( el ) {
|
391 |
+
el.addEventListener( 'click', function( evt ) {
|
392 |
+
w.open( this.href, '', 'status=no, scrollbars=no, menubar=no, top=' + clientTop + ', left=' + clientLeft + ', width=' + width + ', height=' + height );
|
393 |
+
evt.preventDefault();
|
394 |
+
}, false );
|
395 |
+
} );
|
396 |
+
|
397 |
+
} )(jQuery, document, window);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/bulk.min.js
CHANGED
@@ -1,17 +1 @@
|
|
1 |
-
|
2 |
-
{segmentStrokeColor:"transparent",segmentStrokeWidth:0,animateRotate:!0,animation:!0,percentageInnerCutout:70,tooltipEvents:[]})})}var g=0<ajaxurl.indexOf("?")?"&":"?",n={log:function(b){"undefined"!==console&&console.log(b)}},f=document.getElementById("imagify-overview-chart"),e=[{value:imagifyBulk.labels.totalUnoptimizedAttachments,color:"#D9E4EB",highlight:"#D9E4EB",label:imagifyBulk.labels.overviewChartLabels.unoptimized},{value:imagifyBulk.labels.totalOptimizedAttachments,color:"#46B1CE",highlight:"#46B1CE",
|
3 |
-
label:imagifyBulk.labels.overviewChartLabels.optimized},{value:imagifyBulk.labels.totalErrorsAttachments,color:"#2E3242",highlight:"#2E3242",label:imagifyBulk.labels.overviewChartLabels.error}];if(f){var d=(new Chart(f.getContext("2d"))).Doughnut(e,{segmentStrokeColor:"transparent",segmentStrokeWidth:0,animateRotate:!0,animation:!0,percentageInnerCutout:85,legendTemplate:'<ul class="imagify-<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>',
|
4 |
-
tooltipTemplate:"<%= value %>"});overviewLegend='<ul class="imagify-doughnut-legend">';b(e).each(function(b){overviewLegend+='<li><span style="background-color:'+e[b].color+'"></span>'+e[b].label+"</li>"});overviewLegend+="</ul>";document.getElementById("imagify-overview-chart-legend").innerHTML=overviewLegend}b(document).on("heartbeat-send",function(b,a){a.imagify_heartbeat=imagifyBulk.heartbeat_id});b(document).on("heartbeat-tick",function(c,a){a.imagify_bulk_data&&(a=a.imagify_bulk_data,b("#imagify-overview-chart-percent").html(a.optimized_attachments_percent+
|
5 |
-
"<span>%</span>"),b(".imagify-total-percent").html(a.optimized_attachments_percent+"%"),b(".imagify-unconsumed-percent").html(a.unconsumed_quota+"%"),b(".imagify-unconsumed-bar").css("width",a.unconsumed_quota+"%"),b("#imagify-total-optimized-attachments").html(a.already_optimized_attachments),b("#imagify-original-bar").find(".imagify-barnb").html(a.original_human),b("#imagify-optimized-bar").css("width",a.optimized_percent+"%").find(".imagify-barnb").html(a.optimized_human),b("#imagify-total-optimized-attachments-pct").html(a.optimized_percent+
|
6 |
-
"%"),d.segments[0].value=a.unoptimized_attachments,d.segments[1].value=a.optimized_attachments,d.segments[2].value=a.errors_attachments,d.update())});b("#imagify-simulate-bulk-action").click(function(c){c.preventDefault();b("#imagify-bulk-action").trigger("click")});b("#imagify-bulk-action").click(function(){var c=b(this),a=b('[name="optimization_level"]:checked').val();"undefined"===typeof a&&(a=-1);if(c.attr("disabled"))return!1;c.attr("disabled","disabled");c.find(".dashicons").addClass("rotate");
|
7 |
-
confirmMessage=function(){return imagifyBulk.labels.processing};b(window).on("beforeunload",confirmMessage);swal({title:imagifyBulk.labels.waitTitle,html:imagifyBulk.labels.waitText,showConfirmButton:!1,imageUrl:imagifyBulk.labels.waitImageUrl});b.get(ajaxurl+g+"action="+imagifyBulk.ajax_action+"&optimization_level="+a+"&imagifybulkuploadnonce="+b("#imagifybulkuploadnonce").val()).done(function(a){if(a.success){swal.close();a={lib:ajaxurl+g+"action=imagify_bulk_upload&imagifybulkuploadnonce="+b("#imagifybulkuploadnonce").val(),
|
8 |
-
images:a.data,context:imagifyBulk.ajax_context};var e=b(".imagify-bulk-table table tbody"),d=0,f=0,h=0,k=0;b(".imagify-row-progress").slideDown();b(".imagify-no-uploaded-yet, .imagify-row-complete").hide(200);Optimizer=new ImagifyGulp(a);Optimizer.before(function(b){e.find(".imagify-row-progress").after('<tr id="attachment-'+b.id+'"><td class="imagify-cell-filename"><span class="imagiuploaded"><img src="'+b.thumbnail+'"/>"</span><span class="imagifilename">'+b.filename+'</span></td><td class="imagify-cell-status"><span class="imagistatus status-compressing"><span class="dashicons dashicons-admin-generic rotate"></span>Compressing<span></span></span></td><td class="imagify-cell-original"></td><td class="imagify-cell-optimized"></td><td class="imagify-cell-percentage"></td><td class="imagify-cell-thumbnails"></td><td class="imagify-cell-savings"></td></tr>')}).each(function(a){var c=
|
9 |
-
b("#imagify-progress-bar");c.css({width:a.progress+"%"});c.find(".percent").html(a.progress+"%");a.success?(b("#attachment-"+a.image+" .imagify-cell-status").html('<span class="imagistatus status-complete"><span class="dashicons dashicons-yes"></span>Complete</span>'),b("#attachment-"+a.image+" .imagify-cell-original").html(a.original_size_human),b("#attachment-"+a.image+" .imagify-cell-optimized").html(a.new_size_human),b("#attachment-"+a.image+" .imagify-cell-percentage").html('<span class="imagify-chart"><span class="imagify-chart-container"><canvas height="18" width="18" id="imagify-consumption-chart" style="width: 18px; height: 18px;"></canvas></span></span><span class="imagipercent">'+
|
10 |
-
a.percent+"</span>%"),l(b("#attachment-"+a.image+" .imagify-cell-percentage").find("canvas")),b("#attachment-"+a.image+" .imagify-cell-thumbnails").html(a.thumbnails),b("#attachment-"+a.image+" .imagify-cell-savings").html(Optimizer.humanSize(a.overall_saving,1)),d=d+a.thumbnails+1,b(".imagify-cell-nb-files").html(d+" file(s)"),h+=a.original_overall_size,b(".imagify-total-original").html(Optimizer.humanSize(h,1)),k+=a.overall_saving,b(".imagify-total-gain").html(Optimizer.humanSize(k,1))):(error_class=
|
11 |
-
"error",error_dashicon="dismiss",error_message="Error",0<=a.error.indexOf("You've consumed all your data")&&swal({title:imagifyBulk.labels.overQuotaTitle,html:imagifyBulk.labels.overQuotaText,type:"error",customClass:"imagify-sweet-alert"}).then(function(){location.reload()}),0<=a.error.indexOf("This image is already compressed")?(error_dashicon=error_class="warning",error_message="Notice"):(f++,b(".imagify-cell-errors").html(f+" error(s)")),b("#attachment-"+a.image).after('<tr><td colspan="7"><span class="status-'+
|
12 |
-
error_class+'">'+a.error+"</span></td></tr>"),b("#attachment-"+a.image+" .imagify-cell-status").html('<span class="imagistatus status-'+error_class+'"><span class="dashicons dashicons-'+error_dashicon+'"></span>'+error_message+"</span>"))}).done(function(a){c.removeAttr("disabled");c.find(".dashicons").removeClass("rotate");b(window).off("beforeunload",confirmMessage);b(".imagify-row-progress").slideUp();"NaN"!==a.global_percent&&(b(".imagify-row-complete").removeClass("hidden").addClass("done").attr("aria-hidden",
|
13 |
-
"false"),b("html, body").animate({scrollTop:b(".imagify-row-complete").offset().top},200),b(".imagify-ac-rt-total-gain").html(a.global_gain_human),b(".imagify-ac-rt-total-original").html(a.global_original_size_human),text2share=imagifyBulk.labels.textToShare,text2share=text2share.replace("%1$s",a.global_gain_human),text2share=text2share.replace("%2$s",a.global_original_size_human),text2share=encodeURIComponent(text2share),b(".imagify-sn-twitter").attr("href","https://twitter.com/intent/tweet?source=webclient&original_referer="+
|
14 |
-
imagifyBulk.labels.pluginURL+"&text="+text2share+"&url="+imagifyBulk.labels.pluginURL+"&related=imagify&hastags=performance,web,wordpress"),b(".imagify-ac-chart").attr("data-percent",a.global_percent),m(b(".imagify-ac-chart").find("canvas")))}).error(function(a){n.log("Can't optimize image with id "+a)}).run()}else c.removeAttr("disabled"),c.find(".dashicons").removeClass("rotate"),swal_text=swal_title="",b(window).off("beforeunload",confirmMessage),"invalid-api-key"==a.data.message&&
|
15 |
-
(swal_title=imagifyBulk.labels.invalidAPIKeyTitle),"over-quota"==a.data.message&&(swal_title=imagifyBulk.labels.overQuotaTitle,text=imagifyBulk.labels.overQuotaText),"no-images"==a.data.message&&(swal_title=imagifyBulk.labels.noAttachmentToOptimizeTitle,swal_text=imagifyBulk.labels.noAttachmentToOptimizeText),swal({title:swal_title,html:swal_text,type:"info",customClass:"imagify-sweet-alert"})}).fail(function(){swal({title:imagifyBulk.labels.getUnoptimizedImagesErrorTitle,html:imagifyBulk.labels.getUnoptimizedImagesErrorText,
|
16 |
-
type:"error",customClass:"imagify-sweet-alert"}).then(function(){location.reload()})})})});var width=700,height=290;if(window.innerWidth)var clientLeft=(window.innerWidth-width)/2,clientTop=(window.innerHeight-height)/2;else clientLeft=(document.body.clientWidth-width)/2,clientTop=(document.body.clientHeight-height)/2;
|
17 |
-
[].forEach.call(document.querySelectorAll(".imagify-share-networks a"),function(b){b.addEventListener("click",function(b){window.open(this.href,"","status=no, scrollbars=no, menubar=no, top="+clientTop+", left="+clientLeft+", width="+width+", height="+height);b.preventDefault()},!1)});
|
1 |
+
window.imagify=window.imagify||{concat:ajaxurl.indexOf("?")>0?"&":"?",log:function(a){void 0!==console&&console.log(a)},info:function(a){void 0!==console&&console.info(a)}},function(a,b,c,d){function e(b){b.each(function(){var b=a(this),c=parseInt(b.closest(".imagify-chart").next(".imagipercent").text(),10),d=[{value:c,color:"#00B3D3"},{value:100-c,color:"#D8D8D8"}];new Chart(b[0].getContext("2d")).Doughnut(d,{segmentStrokeColor:"#FFF",segmentStrokeWidth:1,animateRotate:!0,tooltipEvents:[]})})}function f(b){b.each(function(){var b=a(this),c=parseInt(b.closest(".imagify-ac-chart").attr("data-percent"),10),d=[{value:c,color:"#40B1D0"},{value:100-c,color:"#FFFFFF"}];new Chart(b[0].getContext("2d")).Doughnut(d,{segmentStrokeColor:"transparent",segmentStrokeWidth:0,animateRotate:!0,animation:!0,percentageInnerCutout:70,tooltipEvents:[]})})}var g,h,i=b.getElementById("imagify-overview-chart"),j=[{value:imagifyBulk.labels.totalUnoptimizedAttachments,color:"#D9E4EB",highlight:"#D9E4EB",label:imagifyBulk.labels.overviewChartLabels.unoptimized},{value:imagifyBulk.labels.totalOptimizedAttachments,color:"#46B1CE",highlight:"#46B1CE",label:imagifyBulk.labels.overviewChartLabels.optimized},{value:imagifyBulk.labels.totalErrorsAttachments,color:"#2E3242",highlight:"#2E3242",label:imagifyBulk.labels.overviewChartLabels.error}];i&&(g=new Chart(i.getContext("2d")).Doughnut(j,{segmentStrokeColor:"transparent",segmentStrokeWidth:0,animateRotate:!0,animation:!0,percentageInnerCutout:85,legendTemplate:'<ul class="imagify-<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>',tooltipTemplate:"<%= value %>"}),h='<ul class="imagify-doughnut-legend">',a(j).each(function(a){h+='<li><span style="background-color:'+j[a].color+'"></span>'+j[a].label+"</li>"}),h+="</ul>",b.getElementById("imagify-overview-chart-legend").innerHTML=h),a(b).on("heartbeat-send",function(a,b){b.imagify_heartbeat=imagifyBulk.heartbeat_id}),a(b).on("heartbeat-tick",function(b,c){c.imagify_bulk_data&&(c=c.imagify_bulk_data,a("#imagify-overview-chart-percent").html(c.optimized_attachments_percent+"<span>%</span>"),a(".imagify-total-percent").html(c.optimized_attachments_percent+"%"),a(".imagify-unconsumed-percent").html(c.unconsumed_quota+"%"),a(".imagify-unconsumed-bar").css("width",c.unconsumed_quota+"%"),a("#imagify-total-optimized-attachments").html(c.already_optimized_attachments),a("#imagify-original-bar").find(".imagify-barnb").html(c.original_human),a("#imagify-optimized-bar").css("width",c.optimized_percent+"%").find(".imagify-barnb").html(c.optimized_human),a("#imagify-total-optimized-attachments-pct").html(c.optimized_percent+"%"),g.segments[0].value=c.unoptimized_attachments,g.segments[1].value=c.optimized_attachments,g.segments[2].value=c.errors_attachments,g.update())}),a("#imagify-simulate-bulk-action").on("click",function(b){b.preventDefault(),a("#imagify-bulk-action").trigger("click")}),a("#imagify-bulk-action").on("click",function(){var b,d=a(this),g=a('[name="optimization_level"]:checked').val();if(void 0===g&&(g=-1),d.attr("disabled"))return!1;d.attr("disabled","disabled"),d.find(".dashicons").addClass("rotate"),b=function(){return imagifyBulk.labels.processing},a(c).on("beforeunload",b),swal({title:imagifyBulk.labels.waitTitle,html:imagifyBulk.labels.waitText,showConfirmButton:!1,imageUrl:imagifyBulk.labels.waitImageUrl}),a.get(ajaxurl+imagify.concat+"action="+imagifyBulk.ajax_action+"&optimization_level="+g+"&imagifybulkuploadnonce="+a("#imagifybulkuploadnonce").val()).done(function(g){var h,i,j="",k="",l=0,m=0,n=0,o=0;if(!g.success)return d.removeAttr("disabled"),d.find(".dashicons").removeClass("rotate"),a(c).off("beforeunload",b),"invalid-api-key"===g.data.message&&(j=imagifyBulk.labels.invalidAPIKeyTitle),"over-quota"===g.data.message&&(j=imagifyBulk.labels.overQuotaTitle,imagifyBulk.labels.overQuotaText),"no-images"===g.data.message&&(j=imagifyBulk.labels.noAttachmentToOptimizeTitle,k=imagifyBulk.labels.noAttachmentToOptimizeText),void swal({title:j,html:k,type:"info",customClass:"imagify-sweet-alert"});swal.close(),a(".imagify-row-progress").slideDown(),a(".imagify-no-uploaded-yet, .imagify-row-complete").hide(200),i=a(".imagify-bulk-table table tbody"),h=new ImagifyGulp({lib:ajaxurl+imagify.concat+"action=imagify_bulk_upload&imagifybulkuploadnonce="+a("#imagifybulkuploadnonce").val(),images:g.data,context:imagifyBulk.ajax_context}),h.before(function(a){i.find(".imagify-row-progress").after('<tr id="attachment-'+a.id+'"><td class="imagify-cell-filename"><span class="imagiuploaded"><img src="'+a.thumbnail+'"/>"</span><span class="imagifilename">'+a.filename+'</span></td><td class="imagify-cell-status"><span class="imagistatus status-compressing"><span class="dashicons dashicons-admin-generic rotate"></span>Compressing<span></span></span></td><td class="imagify-cell-original"></td><td class="imagify-cell-optimized"></td><td class="imagify-cell-percentage"></td><td class="imagify-cell-thumbnails"></td><td class="imagify-cell-savings"></td></tr>')}).each(function(b){var c=a("#imagify-progress-bar"),d="error",f="dismiss",g="Error";if(c.css({width:b.progress+"%"}),c.find(".percent").html(b.progress+"%"),b.success)return a("#attachment-"+b.image+" .imagify-cell-status").html('<span class="imagistatus status-complete"><span class="dashicons dashicons-yes"></span>Complete</span>'),a("#attachment-"+b.image+" .imagify-cell-original").html(b.original_size_human),a("#attachment-"+b.image+" .imagify-cell-optimized").html(b.new_size_human),a("#attachment-"+b.image+" .imagify-cell-percentage").html('<span class="imagify-chart"><span class="imagify-chart-container"><canvas height="18" width="18" id="imagify-consumption-chart" style="width: 18px; height: 18px;"></canvas></span></span><span class="imagipercent">'+b.percent+"</span>%"),e(a("#attachment-"+b.image+" .imagify-cell-percentage").find("canvas")),a("#attachment-"+b.image+" .imagify-cell-thumbnails").html(b.thumbnails),a("#attachment-"+b.image+" .imagify-cell-savings").html(h.humanSize(b.overall_saving,1)),l=l+b.thumbnails+1,a(".imagify-cell-nb-files").html(l+" file(s)"),n+=b.original_overall_size,a(".imagify-total-original").html(h.humanSize(n,1)),o+=b.overall_saving,void a(".imagify-total-gain").html(h.humanSize(o,1));b.error.indexOf("You've consumed all your data")>=0&&swal({title:imagifyBulk.labels.overQuotaTitle,html:imagifyBulk.labels.overQuotaText,type:"error",customClass:"imagify-sweet-alert"}).then(function(){location.reload()}),b.error.indexOf("This image is already compressed")>=0?(d="warning",f="warning",g="Notice"):(m++,a(".imagify-cell-errors").html(m+" error(s)")),a("#attachment-"+b.image).after('<tr><td colspan="7"><span class="status-'+d+'">'+b.error+"</span></td></tr>"),a("#attachment-"+b.image+" .imagify-cell-status").html('<span class="imagistatus status-'+d+'"><span class="dashicons dashicons-'+f+'"></span>'+g+"</span>")}).done(function(e){var g;d.removeAttr("disabled").find(".dashicons").removeClass("rotate"),a(c).off("beforeunload",b),a(".imagify-row-progress").slideUp(),"NaN"!==e.global_percent&&(a(".imagify-row-complete").removeClass("hidden").addClass("done").attr("aria-hidden","false"),a("html, body").animate({scrollTop:a(".imagify-row-complete").offset().top},200),a(".imagify-ac-rt-total-gain").html(e.global_gain_human),a(".imagify-ac-rt-total-original").html(e.global_original_size_human),g=imagifyBulk.labels.textToShare,g=g.replace("%1$s",e.global_gain_human),g=g.replace("%2$s",e.global_original_size_human),g=encodeURIComponent(g),a(".imagify-sn-twitter").attr("href","https://twitter.com/intent/tweet?source=webclient&original_referer="+imagifyBulk.labels.pluginURL+"&text="+g+"&url="+imagifyBulk.labels.pluginURL+"&related=imagify&hastags=performance,web,wordpress"),a(".imagify-ac-chart").attr("data-percent",e.global_percent),f(a(".imagify-ac-chart").find("canvas")))}).error(function(a){imagify.log("Can't optimize image with id "+a)}).run()}).fail(function(){swal({title:imagifyBulk.labels.getUnoptimizedImagesErrorTitle,html:imagifyBulk.labels.getUnoptimizedImagesErrorText,type:"error",customClass:"imagify-sweet-alert"}).then(function(){location.reload()})})})}(jQuery,document,window),function(a,b,c,d){var e,f;c.innerWidth?(e=(c.innerWidth-700)/2,f=(c.innerHeight-290)/2):(e=(b.body.clientWidth-700)/2,f=(b.body.clientHeight-290)/2),[].forEach.call(b.querySelectorAll(".imagify-share-networks a"),function(a){a.addEventListener("click",function(a){c.open(this.href,"","status=no, scrollbars=no, menubar=no, top="+f+", left="+e+", width=700, height=290"),a.preventDefault()},!1)})}(jQuery,document,window);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/imagify.js
ADDED
@@ -0,0 +1,290 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*
|
2 |
+
* imagify-gulpjs - version 0.0.1 - 2016-04-07
|
3 |
+
* WP Media <contact@wp-media.me>
|
4 |
+
*/
|
5 |
+
(function () {
|
6 |
+
'use strict';
|
7 |
+
|
8 |
+
var _createClass = function () {
|
9 |
+
function defineProperties( target, props ) {
|
10 |
+
for ( var i = 0; i < props.length; i++ ) {
|
11 |
+
var descriptor = props[i];
|
12 |
+
descriptor.enumerable = descriptor.enumerable || false;
|
13 |
+
descriptor.configurable = true;
|
14 |
+
|
15 |
+
if ( 'value' in descriptor ) {
|
16 |
+
descriptor.writable = true;
|
17 |
+
}
|
18 |
+
Object.defineProperty( target, descriptor.key, descriptor );
|
19 |
+
}
|
20 |
+
}
|
21 |
+
|
22 |
+
return function ( Constructor, protoProps, staticProps ) {
|
23 |
+
if ( protoProps ) {
|
24 |
+
defineProperties( Constructor.prototype, protoProps );
|
25 |
+
}
|
26 |
+
if ( staticProps ) {
|
27 |
+
defineProperties( Constructor, staticProps );
|
28 |
+
}
|
29 |
+
|
30 |
+
return Constructor;
|
31 |
+
};
|
32 |
+
}();
|
33 |
+
|
34 |
+
function _classCallCheck( instance, Constructor ) {
|
35 |
+
if ( ! ( instance instanceof Constructor ) ) {
|
36 |
+
throw new TypeError( 'Cannot call a class as a function' );
|
37 |
+
}
|
38 |
+
}
|
39 |
+
|
40 |
+
window.ImagifyGulp = function () {
|
41 |
+
function ImagifyGulp( settings ) {
|
42 |
+
_classCallCheck( this, ImagifyGulp );
|
43 |
+
|
44 |
+
this.buffer_size = 1;
|
45 |
+
this.lib_url = settings.lib;
|
46 |
+
this.default_thumb = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==";
|
47 |
+
this.images = settings.images;
|
48 |
+
this.images_ids = Object.keys( settings.images );
|
49 |
+
this.total_images = this.images_ids.length;
|
50 |
+
this.processed_images = 0;
|
51 |
+
this.inprocess_images = 0;
|
52 |
+
this._before = function() {};
|
53 |
+
this._each = function() {};
|
54 |
+
this._done = function() {};
|
55 |
+
this._error = function() {};
|
56 |
+
this.total_original_size = 0;
|
57 |
+
this.total_optimized_size = 0;
|
58 |
+
this.total_gain = 0;
|
59 |
+
this.total_percent = 0;
|
60 |
+
this.global_original_size = 0;
|
61 |
+
this.global_optimized_size = 0;
|
62 |
+
this.global_gain = 0;
|
63 |
+
this.global_percent = 0;
|
64 |
+
this.context = settings.context || 'wp';
|
65 |
+
}
|
66 |
+
|
67 |
+
_createClass( ImagifyGulp, [ {
|
68 |
+
key: 'before',
|
69 |
+
value: function before( fnc ) {
|
70 |
+
this._before = fnc;
|
71 |
+
return this;
|
72 |
+
}
|
73 |
+
}, {
|
74 |
+
key: 'each',
|
75 |
+
value: function each( fnc ) {
|
76 |
+
this._each = fnc;
|
77 |
+
return this;
|
78 |
+
}
|
79 |
+
}, {
|
80 |
+
key: 'done',
|
81 |
+
value: function done( fnc ) {
|
82 |
+
this._done = fnc;
|
83 |
+
return this;
|
84 |
+
}
|
85 |
+
}, {
|
86 |
+
key: 'error',
|
87 |
+
value: function error( fnc ) {
|
88 |
+
this._error = fnc;
|
89 |
+
return this;
|
90 |
+
}
|
91 |
+
}, {
|
92 |
+
key: 'humanSize',
|
93 |
+
value: function humanSize( bytes ) {
|
94 |
+
if ( 0 === bytes ) {
|
95 |
+
return '0kb';
|
96 |
+
}
|
97 |
+
|
98 |
+
var sizes = [ 'b', 'kb', 'mb' ],
|
99 |
+
i = parseInt( Math.floor( Math.log( bytes ) / Math.log( 1024 ) ) );
|
100 |
+
|
101 |
+
return ( bytes / Math.pow( 1024, i ) ).toFixed( 2 ) + sizes[ i ];
|
102 |
+
}
|
103 |
+
}, {
|
104 |
+
key: 'run',
|
105 |
+
value: function run() {
|
106 |
+
var cpt = this.images_ids.length > this.buffer_size ? this.buffer_size : this.images_ids.length;
|
107 |
+
|
108 |
+
for ( var i = 0; i < cpt; i++ ) {
|
109 |
+
var id = this.images_ids.shift();
|
110 |
+
this.process( id );
|
111 |
+
}
|
112 |
+
|
113 |
+
return this;
|
114 |
+
}
|
115 |
+
}, {
|
116 |
+
key: 'process',
|
117 |
+
value: function process( id ) {
|
118 |
+
this.inprocess_images++;
|
119 |
+
|
120 |
+
var data = {
|
121 |
+
id: id,
|
122 |
+
image_id: parseInt( id.toString().substr( 1 ), 10 ),
|
123 |
+
image_src: this.images[ id ],
|
124 |
+
filename: this.images[ id ].split( '/' ).pop(),
|
125 |
+
thumbnail: this.default_thumb,
|
126 |
+
error: ''
|
127 |
+
};
|
128 |
+
|
129 |
+
this.createThumb( data );
|
130 |
+
}
|
131 |
+
}, {
|
132 |
+
key: 'createThumb',
|
133 |
+
value: function createThumb( data ) {
|
134 |
+
var self = this,
|
135 |
+
image = new Image();
|
136 |
+
|
137 |
+
image.onerror = function () {
|
138 |
+
var data_before = data;
|
139 |
+
data_before.id = data.image_id;
|
140 |
+
|
141 |
+
self._before(data_before);
|
142 |
+
self.send(data);
|
143 |
+
};
|
144 |
+
|
145 |
+
image.onload = function () {
|
146 |
+
var maxWidth = 33,
|
147 |
+
maxHeight = 33,
|
148 |
+
imageWidth = image.width,
|
149 |
+
imageHeight = image.height,
|
150 |
+
ratio = 1,
|
151 |
+
newHeight = 0,
|
152 |
+
newWidth = 0,
|
153 |
+
canvas = null,
|
154 |
+
ctx = null;
|
155 |
+
|
156 |
+
if ( imageWidth < imageHeight ) {
|
157 |
+
ratio = maxWidth / imageWidth;
|
158 |
+
newWidth = maxWidth;
|
159 |
+
newHeight = imageHeight * ratio;
|
160 |
+
} else {
|
161 |
+
ratio = maxHeight / imageHeight;
|
162 |
+
newHeight = maxHeight;
|
163 |
+
newWidth = imageWidth * ratio;
|
164 |
+
}
|
165 |
+
|
166 |
+
canvas = document.createElement( 'canvas' );
|
167 |
+
|
168 |
+
canvas.width = newWidth;
|
169 |
+
canvas.height = newHeight;
|
170 |
+
image.width = newWidth;
|
171 |
+
image.height = newHeight;
|
172 |
+
|
173 |
+
ctx = canvas.getContext( '2d' );
|
174 |
+
ctx.drawImage( this, 0, 0, newWidth, newHeight );
|
175 |
+
|
176 |
+
try {
|
177 |
+
data.thumbnail = canvas.toDataURL( 'image/jpeg' );
|
178 |
+
} catch ( e ) {
|
179 |
+
data.thumbnail = self.default_thumb;
|
180 |
+
}
|
181 |
+
|
182 |
+
var before_data = data;
|
183 |
+
before_data.id = data.image_id;
|
184 |
+
|
185 |
+
self._before(before_data);
|
186 |
+
|
187 |
+
self.send(data);
|
188 |
+
|
189 |
+
canvas = null;
|
190 |
+
};
|
191 |
+
|
192 |
+
image.src = data.image_src;
|
193 |
+
}
|
194 |
+
}, {
|
195 |
+
key: 'send',
|
196 |
+
value: function send( data ) {
|
197 |
+
|
198 |
+
var self = this,
|
199 |
+
transport = new XMLHttpRequest(),
|
200 |
+
err = false,
|
201 |
+
json = {},
|
202 |
+
response = {
|
203 |
+
filename: data.filename,
|
204 |
+
image: data.image_id,
|
205 |
+
error: ''
|
206 |
+
};
|
207 |
+
|
208 |
+
transport.onreadystatechange = function () {
|
209 |
+
if ( 4 === this.readyState ) {
|
210 |
+
|
211 |
+
self.processed_images++;
|
212 |
+
|
213 |
+
try {
|
214 |
+
json = JSON.parse( this.responseText );
|
215 |
+
err = false;
|
216 |
+
} catch ( e ) {
|
217 |
+
response.success = false;
|
218 |
+
response.error = 'Unknown error occured';
|
219 |
+
err = true;
|
220 |
+
}
|
221 |
+
|
222 |
+
response.progress = Math.floor( self.processed_images / self.total_images * 100 );
|
223 |
+
|
224 |
+
if ( ! err ) {
|
225 |
+
var json_data = json.data;
|
226 |
+
|
227 |
+
response.success = json.success;
|
228 |
+
|
229 |
+
if ( true === json.success ) {
|
230 |
+
self.total_original_size += json_data.original_size;
|
231 |
+
self.total_optimized_size += json_data.new_size;
|
232 |
+
self.total_gain += json_data.original_size - json_data.new_size;
|
233 |
+
self.total_percent = ( self.total_optimized_size / self.total_original_size * 100 ).toFixed( 2 );
|
234 |
+
self.global_original_size += json_data.original_overall_size;
|
235 |
+
self.global_optimized_size += json_data.new_overall_size;
|
236 |
+
self.global_gain += json_data.overall_saving;
|
237 |
+
self.global_percent = ( 100 - self.global_optimized_size / self.global_optimized_size * 100 ).toFixed( 2 );
|
238 |
+
|
239 |
+
response.original_size = json_data.original_size;
|
240 |
+
response.original_size_human = self.humanSize( json_data.original_size );
|
241 |
+
|
242 |
+
response.new_size = json_data.new_size;
|
243 |
+
response.new_size_human = self.humanSize( json_data.new_size );
|
244 |
+
|
245 |
+
response.percent = json_data.percent;
|
246 |
+
response.thumbnails = json_data.thumbnails;
|
247 |
+
|
248 |
+
response.overall_saving = json_data.overall_saving;
|
249 |
+
response.overall_saving_human = self.humanSize( json_data.overall_saving );
|
250 |
+
|
251 |
+
response.original_overall_size = json_data.original_overall_size;
|
252 |
+
response.original_overall_size_human = self.humanSize( json_data.original_overall_size );
|
253 |
+
} else {
|
254 |
+
response.error = json_data.error;
|
255 |
+
}
|
256 |
+
}
|
257 |
+
|
258 |
+
self._each( response );
|
259 |
+
|
260 |
+
if ( self.inprocess_images < self.total_images ) {
|
261 |
+
self.process( self.images_ids.shift() );
|
262 |
+
}
|
263 |
+
|
264 |
+
if ( self.processed_images === self.total_images ) {
|
265 |
+
|
266 |
+
var tmp_global_percent = 0;
|
267 |
+
|
268 |
+
if ( 0 !== self.global_original_size ) {
|
269 |
+
tmp_global_percent = ( 100 - 100 * ( self.global_optimized_size / self.global_original_size ) ).toFixed( 2 );
|
270 |
+
}
|
271 |
+
|
272 |
+
self._done( {
|
273 |
+
global_original_size_human: self.humanSize( self.global_original_size ),
|
274 |
+
global_gain_human: self.humanSize( self.global_gain ),
|
275 |
+
global_percent: tmp_global_percent
|
276 |
+
} );
|
277 |
+
}
|
278 |
+
}
|
279 |
+
};
|
280 |
+
|
281 |
+
transport.open( 'POST', this.lib_url, true );
|
282 |
+
transport.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
|
283 |
+
transport.send( 'image=' + data.image_id + '&context=' + this.context );
|
284 |
+
}
|
285 |
+
} ] );
|
286 |
+
|
287 |
+
return ImagifyGulp;
|
288 |
+
}();
|
289 |
+
//# sourceMappingURL=imagify-gulp.js.map
|
290 |
+
}());
|
assets/js/imagify.min.js
CHANGED
@@ -1,5 +1 @@
|
|
1 |
-
|
2 |
-
* imagify-gulpjs - version 0.0.1 - 2016-04-07
|
3 |
-
* WP Media <contact@wp-media.me>
|
4 |
-
*/
|
5 |
-
"use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),ImagifyGulp=function(){function a(b){_classCallCheck(this,a),this.buffer_size=imagifyBulk.buffer_size,this.lib_url=b.lib,this.default_thumb="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==",this.images=b.images,this.images_ids=Object.keys(b.images),this.total_images=this.images_ids.length,this.processed_images=0,this.inprocess_images=0,this._before=new Function,this._each=new Function,this._done=new Function,this._error=new Function,this.total_original_size=0,this.total_optimized_size=0,this.total_gain=0,this.total_percent=0,this.global_original_size=0,this.global_optimized_size=0,this.global_gain=0,this.global_percent=0,this.context=b.context||"wp"}return _createClass(a,[{key:"before",value:function(a){return this._before=a,this}},{key:"each",value:function(a){return this._each=a,this}},{key:"done",value:function(a){return this._done=a,this}},{key:"error",value:function(a){return this._error=a,this}},{key:"humanSize",value:function(a){if(0==a)return"0kb";var b=["b","kb","mb"],c=parseInt(Math.floor(Math.log(a)/Math.log(1024)));return(a/Math.pow(1024,c)).toFixed(2)+b[c]}},{key:"run",value:function(){for(var a=this.images_ids.length>this.buffer_size?this.buffer_size:this.images_ids.length,b=0;a>b;b++){var c=this.images_ids.shift();this.process(c)}return this}},{key:"process",value:function(a){this.inprocess_images++;var b={id:a,image_id:parseInt(a.toString().substr(1)),image_src:this.images[a],filename:this.images[a].split("/").pop(),thumbnail:this.default_thumb,error:""};this.createThumb(b)}},{key:"createThumb",value:function(a){var b=this,c=new Image;c.onerror=function(){var c=a;c.id=a.image_id,b._before(c),b.send(a)},c.onload=function(){var d=33,e=33,f=c.width,g=c.height,h=1,i=0,j=0,k=null,l=null;g>f?(h=d/f,j=d,i=g*h):(h=e/g,i=e,j=f*h),k=document.createElement("canvas"),k.width=j,k.height=i,c.width=j,c.height=i,l=k.getContext("2d"),l.drawImage(this,0,0,j,i);try{a.thumbnail=k.toDataURL("image/jpeg")}catch(m){a.thumbnail=b.default_thumb}var n=a;n.id=a.image_id,b._before(n),b.send(a),k=null},c.src=a.image_src}},{key:"send",value:function(a){var b=this,c=new XMLHttpRequest,d=!1,e={},f={filename:a.filename,image:a.image_id,error:""};c.onreadystatechange=function(){if(4===this.readyState){b.processed_images++;try{e=JSON.parse(this.responseText),d=!1}catch(a){f.success=!1,f.error="Unknown error occured",d=!0}if(f.progress=Math.floor(b.processed_images/b.total_images*100),!d){var c=e.data;f.success=e.success,e.success===!0?(b.total_original_size+=c.original_size,b.total_optimized_size+=c.new_size,b.total_gain+=c.original_size-c.new_size,b.total_percent=(b.total_optimized_size/b.total_original_size*100).toFixed(2),b.global_original_size+=c.original_overall_size,b.global_optimized_size+=c.new_overall_size,b.global_gain+=c.overall_saving,b.global_percent=(100-b.global_optimized_size/b.global_optimized_size*100).toFixed(2),f.original_size=c.original_size,f.original_size_human=b.humanSize(c.original_size),f.new_size=c.new_size,f.new_size_human=b.humanSize(c.new_size),f.percent=c.percent,f.thumbnails=c.thumbnails,f.overall_saving=c.overall_saving,f.overall_saving_human=b.humanSize(c.overall_saving),f.original_overall_size=c.original_overall_size,f.original_overall_size_human=b.humanSize(c.original_overall_size)):f.error=c.error}if(b._each(f),b.inprocess_images<b.total_images&&b.process(b.images_ids.shift()),b.processed_images==b.total_images){var g=0;0!=b.global_original_size&&(g=(100-100*(b.global_optimized_size/b.global_original_size)).toFixed(2)),b._done({global_original_size_human:b.humanSize(b.global_original_size),global_gain_human:b.humanSize(b.global_gain),global_percent:g})}}},c.open("POST",this.lib_url,!0),c.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),c.send("image="+a.image_id+"&context="+this.context)}}]),a}();
|
1 |
+
!function(){"use strict";function a(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var b=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();window.ImagifyGulp=function(){function c(b){a(this,c),this.buffer_size=1,this.lib_url=b.lib,this.default_thumb="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAIAAACRuyQOAAACy0lEQVRIx+1XS1PTUBTuT/MB1NGF3bhyhys3Pv+Ai8pCF6Bb3bsWq8xAh8441I2TSlKwPIKQJsI40IbSV0pJ6qe3OeZ1b9PaYViQyaJzc+757j3nO985TVx5v3o+b+IS6XyQUgtrj/NqWtJmZf3lavnpl53bC2vjRLqRUV4pxqbZcnrBx3F6G2ZzTjFg879IMwWtanV7g56K1Z2RtBGRpj7IWb0a8HhqOz9O2rjHfrOD34GvWcPEruGQkhmlcFgnF7bjABVJmvA4uj4vY2VJr545/yClw/okBywaadF/m63j1gT/sNO5DbXW8t4sLtJzSQtnAme/ys/BrU9FpdIgY2R3MBLidtQ+ZRt2T9qZvQrtf/N9X5BwbEQKmSVIFGZjEGlWNojB93KbCBolDNl49nVPAIYwUs5QGAOQwCtmuuyGG5ExGhZbtM7s+5+3BGC5nyazhB8RElSAePRwRaX1u9nScadfVYjtncV1HtKDlW0KQMqvID4kCAydHST2fgKhu24B7dTaSY4oYBf2MjN44yK9+FZmRnrdCnuhr3jyB7Vr89G8L9f7oU77VSPhp4POjNarzUgv77Z/ERh+R9oUXbqDXFyktFtJ5ag74cU9cBsCwy3DNoht5Fcf0pO8ysuTt27IFzKH/Hm/Qopi5ekP99zzgkU8goF7VN21ThfM9BKHylHEPbzoQ8wUlSGoG1QVnR3Vhppj66hCtgg/Ayr3tdLXCFQ7al4ABr2gAEBHoCbQFDu+RkCvqPVBx5LCZvq2dEDsgELuDqV7rM/SfvmocfNjkYcEdV8Kdcu4Wh6QLzzoPQKtQ9DQvQL9ZYhOiCYteXougo/9UEIv9YHxKK+iZ9qenouE8QIunCMMMzxHYIIomU2ksBOaI5ZHmCO8OavEnI0K2hjmvTnevPe3bjBlTvKvMsoMi4kVAgO/qBXMGvidGu8Me/lf4yIg/QYbLcmjDg4bKwAAAABJRU5ErkJggg==",this.images=b.images,this.images_ids=Object.keys(b.images),this.total_images=this.images_ids.length,this.processed_images=0,this.inprocess_images=0,this._before=function(){},this._each=function(){},this._done=function(){},this._error=function(){},this.total_original_size=0,this.total_optimized_size=0,this.total_gain=0,this.total_percent=0,this.global_original_size=0,this.global_optimized_size=0,this.global_gain=0,this.global_percent=0,this.context=b.context||"wp"}return b(c,[{key:"before",value:function(a){return this._before=a,this}},{key:"each",value:function(a){return this._each=a,this}},{key:"done",value:function(a){return this._done=a,this}},{key:"error",value:function(a){return this._error=a,this}},{key:"humanSize",value:function(a){if(0===a)return"0kb";var b=["b","kb","mb"],c=parseInt(Math.floor(Math.log(a)/Math.log(1024)));return(a/Math.pow(1024,c)).toFixed(2)+b[c]}},{key:"run",value:function(){for(var a=this.images_ids.length>this.buffer_size?this.buffer_size:this.images_ids.length,b=0;b<a;b++){var c=this.images_ids.shift();this.process(c)}return this}},{key:"process",value:function(a){this.inprocess_images++;var b={id:a,image_id:parseInt(a.toString().substr(1),10),image_src:this.images[a],filename:this.images[a].split("/").pop(),thumbnail:this.default_thumb,error:""};this.createThumb(b)}},{key:"createThumb",value:function(a){var b=this,c=new Image;c.onerror=function(){var c=a;c.id=a.image_id,b._before(c),b.send(a)},c.onload=function(){var d=c.width,e=c.height,f=1,g=0,h=0,i=null,j=null;d<e?(f=33/d,h=33,g=e*f):(f=33/e,g=33,h=d*f),i=document.createElement("canvas"),i.width=h,i.height=g,c.width=h,c.height=g,j=i.getContext("2d"),j.drawImage(this,0,0,h,g);try{a.thumbnail=i.toDataURL("image/jpeg")}catch(c){a.thumbnail=b.default_thumb}var k=a;k.id=a.image_id,b._before(k),b.send(a),i=null},c.src=a.image_src}},{key:"send",value:function(a){var b=this,c=new XMLHttpRequest,d=!1,e={},f={filename:a.filename,image:a.image_id,error:""};c.onreadystatechange=function(){if(4===this.readyState){b.processed_images++;try{e=JSON.parse(this.responseText),d=!1}catch(a){f.success=!1,f.error="Unknown error occured",d=!0}if(f.progress=Math.floor(b.processed_images/b.total_images*100),!d){var a=e.data;f.success=e.success,!0===e.success?(b.total_original_size+=a.original_size,b.total_optimized_size+=a.new_size,b.total_gain+=a.original_size-a.new_size,b.total_percent=(b.total_optimized_size/b.total_original_size*100).toFixed(2),b.global_original_size+=a.original_overall_size,b.global_optimized_size+=a.new_overall_size,b.global_gain+=a.overall_saving,b.global_percent=(100-b.global_optimized_size/b.global_optimized_size*100).toFixed(2),f.original_size=a.original_size,f.original_size_human=b.humanSize(a.original_size),f.new_size=a.new_size,f.new_size_human=b.humanSize(a.new_size),f.percent=a.percent,f.thumbnails=a.thumbnails,f.overall_saving=a.overall_saving,f.overall_saving_human=b.humanSize(a.overall_saving),f.original_overall_size=a.original_overall_size,f.original_overall_size_human=b.humanSize(a.original_overall_size)):f.error=a.error}if(b._each(f),b.inprocess_images<b.total_images&&b.process(b.images_ids.shift()),b.processed_images===b.total_images){var c=0;0!==b.global_original_size&&(c=(100-b.global_optimized_size/b.global_original_size*100).toFixed(2)),b._done({global_original_size_human:b.humanSize(b.global_original_size),global_gain_human:b.humanSize(b.global_gain),global_percent:c})}}},c.open("POST",this.lib_url,!0),c.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),c.send("image="+a.image_id+"&context="+this.context)}}]),c}()}();
|
|
|
|
|
|
|
|
assets/js/jquery.twentytwenty.js
CHANGED
@@ -1,13 +1,29 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
$.fn.twentytwenty = function(options, callback) {
|
4 |
-
|
5 |
handlePosition : 0.5,
|
6 |
orientation : 'horizontal',
|
7 |
labelBefore : 'Before',
|
8 |
labelAfter : 'After'
|
9 |
-
}
|
10 |
-
|
11 |
return this.each(function() {
|
12 |
|
13 |
var sliderPct = options.handlePosition,
|
@@ -17,12 +33,12 @@
|
|
17 |
afterDirection = (sliderOrientation === 'vertical') ? 'up' : 'right',
|
18 |
$beforeImg = $container.find('img:first'),
|
19 |
$afterImg = $container.find('img:last');
|
20 |
-
|
21 |
-
|
22 |
$container.wrap('<div class="twentytwenty-wrapper twentytwenty-' + sliderOrientation + '"></div>');
|
23 |
$container.append('<div class="twentytwenty-overlay"></div>');
|
24 |
$container.append('<div class="twentytwenty-handle"></div>');
|
25 |
-
|
26 |
var $slider = $container.find('.twentytwenty-handle');
|
27 |
|
28 |
$slider.append('<span class="twentytwenty-' + beforeDirection + '-arrow"></span>');
|
@@ -30,7 +46,7 @@
|
|
30 |
$container.addClass('twentytwenty-container');
|
31 |
$beforeImg.addClass('twentytwenty-before');
|
32 |
$afterImg.addClass('twentytwenty-after');
|
33 |
-
|
34 |
var $overlay = $container.find('.twentytwenty-overlay');
|
35 |
|
36 |
$overlay.append('<div class="twentytwenty-labels twentytwenty-before-label"><span class="twentytwenty-label-content">' + options.labelBefore + '</span></div>');
|
@@ -38,7 +54,7 @@
|
|
38 |
|
39 |
|
40 |
// some usefull function and vars declarations
|
41 |
-
|
42 |
var calcOffset = function(dimensionPct) {
|
43 |
var w = $beforeImg.width();
|
44 |
var h = $beforeImg.height();
|
@@ -76,10 +92,10 @@
|
|
76 |
imgWidth = 0,
|
77 |
imgHeight = 0;
|
78 |
|
79 |
-
$(window).on('resize.twentytwenty', function(
|
80 |
adjustSlider( sliderPct );
|
81 |
});
|
82 |
-
|
83 |
$slider.on('movestart', function(e) {
|
84 |
if ( ( ( e.distX > e.distY && e.distX < -e.distY ) || ( e.distX < e.distY && e.distX > -e.distY ) ) && sliderOrientation !== 'vertical' ) {
|
85 |
e.preventDefault();
|
@@ -90,11 +106,11 @@
|
|
90 |
$container.addClass('active');
|
91 |
offsetX = $container.offset().left;
|
92 |
offsetY = $container.offset().top;
|
93 |
-
imgWidth = $beforeImg.width();
|
94 |
-
imgHeight = $beforeImg.height();
|
95 |
});
|
96 |
|
97 |
-
$slider.on('moveend', function(
|
98 |
$container.removeClass('active');
|
99 |
});
|
100 |
|
@@ -121,519 +137,524 @@
|
|
121 |
});
|
122 |
};
|
123 |
|
124 |
-
})(
|
125 |
|
126 |
/**
|
127 |
* Twentytwenty Imagify Init
|
128 |
*/
|
129 |
-
(function($,
|
130 |
|
131 |
/*
|
132 |
* Mini chart
|
133 |
*
|
134 |
* @param {element} canvas
|
135 |
-
*/
|
136 |
-
var draw_me_a_chart = function ( canvas ) {
|
137 |
-
canvas.each(function(){
|
138 |
-
var the_value = parseInt( $(this).closest('.imagify-chart').next('.imagify-chart-value').text() ),
|
139 |
-
overviewData = [
|
140 |
-
{
|
141 |
-
value: the_value,
|
142 |
-
color: '#00B3D3'
|
143 |
-
},
|
144 |
-
{
|
145 |
-
value: 100 - the_value,
|
146 |
-
color: '#D8D8D8'
|
147 |
-
}
|
148 |
-
],
|
149 |
-
overviewDoughnut = new Chart( $(this)[0].getContext('2d')).Doughnut(overviewData, {
|
150 |
-
segmentStrokeColor : '#2A2E3C',
|
151 |
-
segmentStrokeWidth : 1,
|
152 |
-
animateRotate : true,
|
153 |
-
percentageInnerCutout: 60,
|
154 |
-
tooltipEvents : []
|
155 |
-
});
|
156 |
-
});
|
157 |
-
};
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Dynamic modal
|
161 |
-
*
|
162 |
-
* @param {object} Parameters to build modal with datas
|
163 |
*/
|
164 |
-
var
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
170 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
},
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
192 |
|
193 |
-
|
194 |
-
|
195 |
-
+ '<div id="' + settings.modal_id + '" class="imagify-modal imagify-visual-comparison" aria-hidden="true">'
|
196 |
-
+ '<div class="imagify-modal-content loading">'
|
197 |
-
+ '<div class="twentytwenty-container">'
|
198 |
-
+ '<img class="imagify-img-before" alt="" width="' + settings.width + '" height="' + settings.height + '">'
|
199 |
-
+ '<img class="imagify-img-after" alt="" width="' + settings.width + '" height="' + settings.height + '">'
|
200 |
-
+ '</div>'
|
201 |
-
+ '<div class="imagify-comparison-levels">'
|
202 |
-
+ '<div class="imagify-c-level imagify-level-original go-left">'
|
203 |
-
+ '<p class="imagify-c-level-row">'
|
204 |
-
+ '<span class="label">' + imagifyTTT.labels.filesize + '</span>'
|
205 |
-
+ '<span class="value level">' + settings.original_size + '</span>'
|
206 |
-
+ '</p>'
|
207 |
-
+ '</div>'
|
208 |
-
+ '<div class="imagify-c-level imagify-level-optimized go-right">'
|
209 |
-
+ '<p class="imagify-c-level-row">'
|
210 |
-
+ '<span class="label">' + imagifyTTT.labels.filesize + '</span>'
|
211 |
-
+ '<span class="value level">' + settings.optimized_size + '</span>'
|
212 |
-
+ '</p>'
|
213 |
-
+ '<p class="imagify-c-level-row">'
|
214 |
-
+ '<span class="label">' + imagifyTTT.labels.saving + '</span>'
|
215 |
-
+ '<span class="value"><span class="imagify-chart"><span class="imagify-chart-container"><canvas id="imagify-consumption-chart-normal" width="15" height="15"></canvas></span></span><span class="imagify-chart-value">' + settings.saving + '</span>%</span>'
|
216 |
-
+ '</p>'
|
217 |
-
+'</div>'
|
218 |
-
+ '</div>'
|
219 |
-
+ '<button class="close-btn absolute" type="button"><i aria-hidden="true" class="dashicons dashicons-no-alt"></i><span class="screen-reader-text">' + imagifyTTT.labels.close + '</span></button>'
|
220 |
-
+ '</div>'
|
221 |
-
+ '</div>'
|
222 |
-
);
|
223 |
-
|
224 |
-
settings.trigger.on('click.imagify', function(){
|
225 |
-
|
226 |
-
var $modal = $( $(this).data('target') ),
|
227 |
-
imgs_loaded = 0;
|
228 |
-
|
229 |
-
if ( typeof imagify_open_modal === 'function' && settings.open_modal ) {
|
230 |
-
imagify_open_modal( $(this) );
|
231 |
}
|
232 |
|
233 |
-
|
234 |
-
|
235 |
-
'
|
236 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
}, function(){
|
258 |
-
|
259 |
-
var windowH = $(window).height(),
|
260 |
-
ttH = $modal.find('.twentytwenty-container').height(),
|
261 |
-
ttTop = $modal.find('.twentytwenty-wrapper').position().top;
|
262 |
-
|
263 |
-
if ( ! $tt.closest('.imagify-modal-content').hasClass('loaded') ) {
|
264 |
-
$tt.closest('.imagify-modal-content').removeClass('loading').addClass('loaded');
|
265 |
-
draw_me_a_chart( $modal.find('.imagify-level-optimized').find('.imagify-chart').find('canvas') );
|
266 |
-
}
|
267 |
-
|
268 |
-
// check if image height is to big
|
269 |
-
if ( windowH < ttH && ! $modal.hasClass('modal-is-too-high') ) {
|
270 |
-
$modal.addClass('modal-is-too-high');
|
271 |
-
|
272 |
-
var $handle = $modal.find('.twentytwenty-handle'),
|
273 |
-
$labels = $modal.find('.twentytwenty-label-content'),
|
274 |
-
$datas = $modal.find('.imagify-comparison-levels'),
|
275 |
-
datasH = $datas.outerHeight(),
|
276 |
-
handle_pos = ( windowH - ttTop - $handle.height() ) / 2,
|
277 |
-
labels_pos = ( windowH - ttTop * 3 - datasH );
|
278 |
-
|
279 |
-
$handle.css({
|
280 |
-
top: handle_pos
|
281 |
-
});
|
282 |
-
$labels.css({
|
283 |
-
top: labels_pos,
|
284 |
-
bottom: 'auto'
|
285 |
-
});
|
286 |
-
$modal.find('.twentytwenty-wrapper').css({
|
287 |
-
paddingBottom: datasH
|
288 |
-
});
|
289 |
-
|
290 |
-
$modal.find('.imagify-modal-content').on('scroll.imagify', function(){
|
291 |
-
$handle.css({
|
292 |
-
top: handle_pos + $(this).scrollTop()
|
293 |
-
});
|
294 |
-
$labels.css({
|
295 |
-
top: labels_pos + $(this).scrollTop()
|
296 |
-
});
|
297 |
-
$datas.css({
|
298 |
-
bottom: - ( $(this).scrollTop() )
|
299 |
-
});
|
300 |
-
});
|
301 |
-
}
|
302 |
-
|
303 |
-
});
|
304 |
-
clearInterval( check_load );
|
305 |
-
check_load = null;
|
306 |
-
return 'done';
|
307 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
308 |
}, 75 );
|
309 |
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
|
314 |
|
315 |
/**
|
316 |
* The complexe visual comparison
|
317 |
*/
|
318 |
-
$('.imagify-visual-comparison-btn').on('click', function(){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
319 |
|
320 |
-
if ( $('.twentytwenty-
|
321 |
return;
|
322 |
}
|
323 |
-
|
324 |
-
$( $(this).data('target') ).find('.imagify-modal-content').css('width', ($(window).outerWidth()*0.95) + 'px');
|
325 |
-
|
326 |
-
if ( $('.twentytwenty-container').length > 0 && $(window).outerWidth() > 800 ) {
|
327 |
-
|
328 |
-
var $tt = $('.twentytwenty-container'),
|
329 |
-
imgs_loaded = 0,
|
330 |
-
loader = $tt.data('loader'),
|
331 |
-
label_original = $tt.data('label-original'),
|
332 |
-
label_normal = $tt.data('label-normal'),
|
333 |
-
label_aggressive = $tt.data('label-aggressive'),
|
334 |
-
label_ultra = $tt.data('label-ultra'),
|
335 |
-
|
336 |
-
original_label = $tt.data('original-label').replace(/\*\*/, '<strong>').replace(/\*\*/, '</strong>'),
|
337 |
-
original_alt = $tt.data('original-alt'),
|
338 |
-
original_src = $tt.data('original-img'),
|
339 |
-
original_dim = $tt.data('original-dim').split('x'),
|
340 |
-
|
341 |
-
normal_label = $tt.data('normal-label').replace(/\*\*/, '<strong>').replace(/\*\*/, '</strong>'),
|
342 |
-
normal_alt = $tt.data('normal-alt'),
|
343 |
-
normal_src = $tt.data('normal-img'),
|
344 |
-
normal_dim = $tt.data('normal-dim').split('x'),
|
345 |
-
|
346 |
-
aggressive_label = $tt.data('aggressive-label').replace(/\*\*/, '<strong>').replace(/\*\*/, '</strong>'),
|
347 |
-
aggressive_alt = $tt.data('aggressive-alt'),
|
348 |
-
aggressive_src = $tt.data('aggressive-img'),
|
349 |
-
aggressive_dim = $tt.data('aggressive-dim').split('x'),
|
350 |
-
|
351 |
-
ultra_label = $tt.data('ultra-label').replace(/\*\*/, '<strong>').replace(/\*\*/, '</strong>'),
|
352 |
-
ultra_alt = $tt.data('ultra-alt'),
|
353 |
-
ultra_src = $tt.data('ultra-img'),
|
354 |
-
ultra_dim = $tt.data('ultra-dim').split('x'),
|
355 |
-
|
356 |
-
tt_before_buttons = '<span class="twentytwenty-duo-buttons twentytwenty-duo-left">' +
|
357 |
-
'<button type="button" class="imagify-comparison-original selected" data-img="original">' + label_original + '</button>' +
|
358 |
-
'<button type="button" class="imagify-comparison-normal" data-img="normal">' + label_normal + '</button>' +
|
359 |
-
'<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">' + label_aggressive + '</button>' +
|
360 |
-
'</span>',
|
361 |
-
tt_after_buttons = '<span class="twentytwenty-duo-buttons twentytwenty-duo-right">' +
|
362 |
-
'<button type="button" class="imagify-comparison-normal" data-img="normal">' + label_normal + '</button>' +
|
363 |
-
'<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">' + label_aggressive + '</button>' +
|
364 |
-
'<button type="button" class="imagify-comparison-ultra selected" data-img="ultra">' + label_ultra + '</button>' +
|
365 |
-
'</span>';
|
366 |
-
|
367 |
-
// loader
|
368 |
-
$tt.before('<img class="loader" src="' + loader + '" alt="Loading…" width="64" height="64">')
|
369 |
-
|
370 |
-
// add switchers button only if needed
|
371 |
-
// should be more locally integrate...
|
372 |
-
var duo_buttons = ( $('.twentytwenty-left-buttons').lenght ) ? tt_before_buttons + tt_after_buttons : '';
|
373 |
-
// should be more locally integrate...
|
374 |
-
$('.twentytwenty-left-buttons').append(tt_before_buttons);
|
375 |
-
$('.twentytwenty-right-buttons').append(tt_after_buttons);
|
376 |
-
|
377 |
-
// add images to 50/50 area
|
378 |
-
$tt.closest('.imagify-modal-content').addClass('loading').find('.twentytwenty-container').append(
|
379 |
-
'<img class="img-original" alt="' + original_alt + '" width="' + original_dim[0] + '" height="' + original_dim[1] + '">' +
|
380 |
-
'<img class="img-normal" alt="' + normal_alt + '" width="' + normal_dim[0] + '" height="' + normal_dim[1] + '">' +
|
381 |
-
'<img class="img-aggressive" alt="' + aggressive_alt + '" width="' + aggressive_dim[0] + '" height="' + aggressive_dim[1] + '">' +
|
382 |
-
'<img class="img-ultra" alt="' + ultra_alt + '" width="' + ultra_dim[0] + '" height="' + ultra_dim[1] + '">' +
|
383 |
-
duo_buttons
|
384 |
-
);
|
385 |
-
|
386 |
-
// load image original
|
387 |
-
$('.img-original').on('load', function(){
|
388 |
-
imgs_loaded++;
|
389 |
-
}).attr('src', original_src);
|
390 |
-
|
391 |
-
// load image normal
|
392 |
-
$('.img-normal').on('load', function(){
|
393 |
-
imgs_loaded++;
|
394 |
-
}).attr('src', normal_src);
|
395 |
-
|
396 |
-
// load image aggressive
|
397 |
-
$('.img-aggressive').on('load', function(){
|
398 |
-
imgs_loaded++;
|
399 |
-
}).attr('src', aggressive_src);
|
400 |
-
|
401 |
-
// load image ultra
|
402 |
-
$('.img-ultra').on('load', function(){
|
403 |
-
imgs_loaded++;
|
404 |
-
}).attr('src', ultra_src);
|
405 |
-
|
406 |
-
var twenty_me = setInterval(function(){
|
407 |
-
if ( imgs_loaded === 4 ) {
|
408 |
-
$tt.twentytwenty({
|
409 |
-
handlePosition: 0.6,
|
410 |
-
orientation: 'horizontal',
|
411 |
-
labelBefore: original_label,
|
412 |
-
labelAfter: ultra_label
|
413 |
-
}, function(){
|
414 |
-
// fires on initialisation & each time the handle is moving
|
415 |
-
if ( ! $tt.closest('.imagify-modal-content').hasClass('loaded') ) {
|
416 |
-
$tt.closest('.imagify-modal-content').removeClass('loading').addClass('loaded');
|
417 |
-
draw_me_a_chart( $('.imagify-level-ultra').find('.imagify-chart').find('canvas') );
|
418 |
-
}
|
419 |
-
});
|
420 |
-
clearInterval( twenty_me );
|
421 |
-
twenty_me = null;
|
422 |
-
}
|
423 |
-
}, 75);
|
424 |
-
|
425 |
-
// on click on button choices
|
426 |
-
|
427 |
-
$('.imagify-comparison-title').on('click', '.twentytwenty-duo-buttons button:not(.selected)', function(e){
|
428 |
-
|
429 |
-
e.stopPropagation();
|
430 |
-
|
431 |
-
var $_this = $(this),
|
432 |
-
$container = $_this.closest('.imagify-comparison-title').nextAll('.twentytwenty-wrapper').find('.twentytwenty-container'),
|
433 |
-
side = $_this.closest('.twentytwenty-duo-buttons').hasClass('twentytwenty-duo-left') ? 'left' : 'right',
|
434 |
-
$other_side = side === 'left' ? $_this.closest('.imagify-comparison-title').find('.twentytwenty-duo-right') : $_this.closest('.imagify-comparison-title').find('.twentytwenty-duo-left'),
|
435 |
-
$duo = $_this.closest('.twentytwenty-duo-buttons').find('button'),
|
436 |
-
$img_before = $container.find('.twentytwenty-before'),
|
437 |
-
$img_after = $container.find('.twentytwenty-after'),
|
438 |
-
image = $_this.data('img');
|
439 |
-
|
440 |
-
// button coloration
|
441 |
-
$duo.removeClass('selected');
|
442 |
-
$_this.addClass('selected');
|
443 |
-
|
444 |
-
// other side action (to not compare same images)
|
445 |
-
if ( $other_side.find('.selected').data('img') === image ) {
|
446 |
-
$other_side.find('button:not(.selected)').eq(0).trigger('click');
|
447 |
-
}
|
448 |
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
459 |
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
|
|
|
|
|
|
467 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
468 |
|
469 |
-
|
470 |
-
|
471 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
472 |
|
473 |
-
|
474 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
475 |
|
476 |
-
|
|
|
|
|
|
|
477 |
|
478 |
|
479 |
/**
|
480 |
-
* Imagify comparison inside Media post visualization
|
481 |
*/
|
482 |
-
if ( $('.post-php').find('.wp_attachment_image').find('.thumbnail').length > 0 ) {
|
483 |
-
|
484 |
-
var $
|
485 |
-
$thumbnail
|
486 |
-
thumb
|
487 |
-
|
488 |
-
$
|
489 |
-
|
490 |
-
|
491 |
-
|
492 |
-
|
493 |
-
|
494 |
-
|
495 |
-
|
496 |
-
|
497 |
-
|
498 |
-
//
|
499 |
-
$('[id^="imgedit-open-btn-"]').before('<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-visual-comparison" id="imagify-start-comparison">' + imagifyTTT.labels.compare + '</button>')
|
500 |
-
|
501 |
-
// Modal and trigger event creation
|
502 |
-
|
503 |
-
width:
|
504 |
-
height:
|
505 |
-
|
506 |
-
|
507 |
-
|
508 |
-
|
509 |
-
saving:
|
510 |
-
|
511 |
-
trigger:
|
512 |
-
|
513 |
-
});
|
514 |
}
|
515 |
-
//
|
516 |
-
else if ( thumb.width <
|
517 |
// TODO
|
518 |
}
|
519 |
-
//
|
520 |
-
else if ( $('#imagify-full-original').length > 0 && $('#imagify-full-original').val() === '' ) {
|
521 |
// do nothing ?
|
522 |
}
|
523 |
-
//
|
524 |
else {
|
525 |
-
//
|
526 |
-
if ( $('#misc-publishing-actions').find('.misc-pub-imagify').find('.button-primary').length === 1 ) {
|
527 |
-
$('[id^="imgedit-open-btn-"]').before('<span class="spinner imagify-hidden"></span><a class="imagify-button-primary button-primary imagify-optimize-trigger" id="imagify-optimize-trigger" href="' + $
|
528 |
|
529 |
-
$('#imagify-optimize-trigger').on('click', function(){
|
530 |
-
$(this).prev('.spinner').removeClass('imagify-hidden').addClass('is-active');
|
531 |
-
});
|
532 |
}
|
533 |
}
|
534 |
|
535 |
}
|
536 |
|
537 |
/**
|
538 |
-
* Images comparison in attachments list page (upload.php)
|
539 |
*/
|
540 |
-
if ( $('.upload-php').find('.imagify-compare-images').length > 0 ) {
|
541 |
-
|
542 |
-
$('.imagify-compare-images').each(function(){
|
543 |
-
|
544 |
-
|
545 |
-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
|
554 |
-
|
555 |
-
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
});
|
563 |
}
|
564 |
|
565 |
/**
|
566 |
-
* Images Comparison in Grid View modal
|
567 |
*/
|
568 |
if ( $('.upload-php').length > 0 ) {
|
569 |
|
570 |
-
|
571 |
-
var get_var = function (param) {
|
572 |
var vars = {};
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
|
|
577 |
}
|
578 |
);
|
579 |
|
580 |
if ( param ) {
|
581 |
-
return vars[param] ? vars[param] : null;
|
582 |
}
|
583 |
return vars;
|
584 |
},
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
594 |
-
|
595 |
-
|
596 |
-
|
597 |
-
|
598 |
-
|
599 |
-
|
600 |
-
|
601 |
-
|
602 |
-
|
603 |
-
|
604 |
-
|
605 |
-
|
606 |
-
|
607 |
-
|
608 |
-
|
609 |
-
|
610 |
-
|
611 |
-
|
612 |
-
|
613 |
-
|
614 |
-
tempTimer = null;
|
615 |
}
|
|
|
|
|
|
|
616 |
}, 20 );
|
617 |
},
|
618 |
waitContent = setInterval( function() {
|
619 |
-
if ( $('.upload-php').find('.media-frame.mode-grid').find('.attachments').length
|
620 |
-
|
621 |
-
|
622 |
-
|
623 |
-
|
624 |
-
|
625 |
-
|
626 |
-
|
627 |
-
if ( get_var('item') ){
|
628 |
-
imagify_content_in_modal();
|
629 |
-
}
|
630 |
|
631 |
-
|
632 |
-
|
|
|
633 |
}
|
634 |
-
}, 100);
|
635 |
|
636 |
-
|
|
|
|
|
|
|
637 |
}
|
638 |
|
639 |
-
})(jQuery,
|
1 |
+
/* globals ajaxurl: false, console: false, imagifyTTT: true */
|
2 |
+
|
3 |
+
window.imagify = window.imagify || {
|
4 |
+
concat: ajaxurl.indexOf( '?' ) > 0 ? '&' : '?',
|
5 |
+
log: function( content ) {
|
6 |
+
if ( undefined !== console ) {
|
7 |
+
console.log( content );
|
8 |
+
}
|
9 |
+
},
|
10 |
+
info: function( content ) {
|
11 |
+
if ( undefined !== console ) {
|
12 |
+
console.info( content );
|
13 |
+
}
|
14 |
+
}
|
15 |
+
};
|
16 |
+
|
17 |
+
(function($, d, w, undefined) {
|
18 |
|
19 |
$.fn.twentytwenty = function(options, callback) {
|
20 |
+
options = $.extend({
|
21 |
handlePosition : 0.5,
|
22 |
orientation : 'horizontal',
|
23 |
labelBefore : 'Before',
|
24 |
labelAfter : 'After'
|
25 |
+
}, options);
|
26 |
+
|
27 |
return this.each(function() {
|
28 |
|
29 |
var sliderPct = options.handlePosition,
|
33 |
afterDirection = (sliderOrientation === 'vertical') ? 'up' : 'right',
|
34 |
$beforeImg = $container.find('img:first'),
|
35 |
$afterImg = $container.find('img:last');
|
36 |
+
|
37 |
+
|
38 |
$container.wrap('<div class="twentytwenty-wrapper twentytwenty-' + sliderOrientation + '"></div>');
|
39 |
$container.append('<div class="twentytwenty-overlay"></div>');
|
40 |
$container.append('<div class="twentytwenty-handle"></div>');
|
41 |
+
|
42 |
var $slider = $container.find('.twentytwenty-handle');
|
43 |
|
44 |
$slider.append('<span class="twentytwenty-' + beforeDirection + '-arrow"></span>');
|
46 |
$container.addClass('twentytwenty-container');
|
47 |
$beforeImg.addClass('twentytwenty-before');
|
48 |
$afterImg.addClass('twentytwenty-after');
|
49 |
+
|
50 |
var $overlay = $container.find('.twentytwenty-overlay');
|
51 |
|
52 |
$overlay.append('<div class="twentytwenty-labels twentytwenty-before-label"><span class="twentytwenty-label-content">' + options.labelBefore + '</span></div>');
|
54 |
|
55 |
|
56 |
// some usefull function and vars declarations
|
57 |
+
|
58 |
var calcOffset = function(dimensionPct) {
|
59 |
var w = $beforeImg.width();
|
60 |
var h = $beforeImg.height();
|
92 |
imgWidth = 0,
|
93 |
imgHeight = 0;
|
94 |
|
95 |
+
$(window).on('resize.twentytwenty', function() {
|
96 |
adjustSlider( sliderPct );
|
97 |
});
|
98 |
+
|
99 |
$slider.on('movestart', function(e) {
|
100 |
if ( ( ( e.distX > e.distY && e.distX < -e.distY ) || ( e.distX < e.distY && e.distX > -e.distY ) ) && sliderOrientation !== 'vertical' ) {
|
101 |
e.preventDefault();
|
106 |
$container.addClass('active');
|
107 |
offsetX = $container.offset().left;
|
108 |
offsetY = $container.offset().top;
|
109 |
+
imgWidth = $beforeImg.width();
|
110 |
+
imgHeight = $beforeImg.height();
|
111 |
});
|
112 |
|
113 |
+
$slider.on('moveend', function() {
|
114 |
$container.removeClass('active');
|
115 |
});
|
116 |
|
137 |
});
|
138 |
};
|
139 |
|
140 |
+
} )(jQuery, document, window);
|
141 |
|
142 |
/**
|
143 |
* Twentytwenty Imagify Init
|
144 |
*/
|
145 |
+
(function($, d, w, undefined) {
|
146 |
|
147 |
/*
|
148 |
* Mini chart
|
149 |
*
|
150 |
* @param {element} canvas
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
*/
|
152 |
+
var drawMeAChart = function ( canvas ) {
|
153 |
+
canvas.each( function() {
|
154 |
+
var $this = $( this ),
|
155 |
+
theValue = parseInt( $this.closest( '.imagify-chart' ).next( '.imagify-chart-value' ).text() ),
|
156 |
+
overviewData = [
|
157 |
+
{
|
158 |
+
value: theValue,
|
159 |
+
color: '#00B3D3'
|
160 |
+
},
|
161 |
+
{
|
162 |
+
value: 100 - theValue,
|
163 |
+
color: '#D8D8D8'
|
164 |
+
}
|
165 |
+
];
|
166 |
|
167 |
+
new Chart( $this[0].getContext( '2d' ) ).Doughnut( overviewData, {
|
168 |
+
segmentStrokeColor : '#2A2E3C',
|
169 |
+
segmentStrokeWidth : 1,
|
170 |
+
animateRotate : true,
|
171 |
+
percentageInnerCutout: 60,
|
172 |
+
tooltipEvents : []
|
173 |
+
} );
|
174 |
+
} );
|
175 |
},
|
176 |
+
/**
|
177 |
+
* Dynamic modal
|
178 |
+
*
|
179 |
+
* @param {object} Parameters to build modal with datas
|
180 |
+
*/
|
181 |
+
imagifyOpenModal = function( $theLink ) {
|
182 |
+
var theTarget = $theLink.data( 'target' ) || $theLink.attr( 'href' );
|
183 |
+
|
184 |
+
$( theTarget ).css( 'display', 'flex' ).hide().fadeIn( 400 ).attr( 'aria-hidden', 'false' ).attr( 'tabindex', '0' ).focus().removeAttr( 'tabindex' ).addClass( 'modal-is-open' );
|
185 |
+
$( 'body' ).addClass( 'imagify-modal-is-open' );
|
186 |
+
},
|
187 |
+
imagifyTwentyModal = function( options ) {
|
188 |
+
var defaults = {
|
189 |
+
width: 0, //px
|
190 |
+
height: 0, //px
|
191 |
+
originalUrl: '', //url
|
192 |
+
optimizedUrl: '', //url
|
193 |
+
originalSize: 0, //mb
|
194 |
+
optimizedSize: 0, // mb
|
195 |
+
saving: 0, //percent
|
196 |
+
modalAppendTo: $( 'body' ), // jQuery element
|
197 |
+
trigger: $( '[data-target="imagify-visual-comparison"]' ), // jQuery element (button, link) with data-target="modalId"
|
198 |
+
modalId: 'imagify-visual-comparison', // should be dynamic if multiple modals
|
199 |
+
openModal: false
|
200 |
+
},
|
201 |
+
settings = $.extend( {}, defaults, options ),
|
202 |
+
modalHtml;
|
203 |
|
204 |
+
if ( 0 === settings.width || 0 === settings.height || '' === settings.originalUrl || '' === settings.optimizedUrl || 0 === settings.originalSize || 0 === settings.optimizedSize || 0 === settings.saving ) {
|
205 |
+
return 'error';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
}
|
207 |
|
208 |
+
// create modal box
|
209 |
+
modalHtml = '<div id="' + settings.modalId + '" class="imagify-modal imagify-visual-comparison" aria-hidden="true">';
|
210 |
+
modalHtml += '<div class="imagify-modal-content loading">';
|
211 |
+
modalHtml += '<div class="twentytwenty-container">';
|
212 |
+
modalHtml += '<img class="imagify-img-before" alt="" width="' + settings.width + '" height="' + settings.height + '">';
|
213 |
+
modalHtml += '<img class="imagify-img-after" alt="" width="' + settings.width + '" height="' + settings.height + '">';
|
214 |
+
modalHtml += '</div>';
|
215 |
+
modalHtml += '<div class="imagify-comparison-levels">';
|
216 |
+
modalHtml += '<div class="imagify-c-level imagify-level-original go-left">';
|
217 |
+
modalHtml += '<p class="imagify-c-level-row">';
|
218 |
+
modalHtml += '<span class="label">' + imagifyTTT.labels.filesize + '</span>';
|
219 |
+
modalHtml += '<span class="value level">' + settings.originalSize + '</span>';
|
220 |
+
modalHtml += '</p>';
|
221 |
+
modalHtml += '</div>';
|
222 |
+
modalHtml += '<div class="imagify-c-level imagify-level-optimized go-right">';
|
223 |
+
modalHtml += '<p class="imagify-c-level-row">';
|
224 |
+
modalHtml += '<span class="label">' + imagifyTTT.labels.filesize + '</span>';
|
225 |
+
modalHtml += '<span class="value level">' + settings.optimizedSize + '</span>';
|
226 |
+
modalHtml += '</p>';
|
227 |
+
modalHtml += '<p class="imagify-c-level-row">';
|
228 |
+
modalHtml += '<span class="label">' + imagifyTTT.labels.saving + '</span>';
|
229 |
+
modalHtml += '<span class="value"><span class="imagify-chart"><span class="imagify-chart-container"><canvas id="imagify-consumption-chart-normal" width="15" height="15"></canvas></span></span><span class="imagify-chart-value">' + settings.saving + '</span>%</span>';
|
230 |
+
modalHtml += '</p>';
|
231 |
+
modalHtml += '</div>';
|
232 |
+
modalHtml += '</div>';
|
233 |
+
modalHtml += '<button class="close-btn absolute" type="button"><i aria-hidden="true" class="dashicons dashicons-no-alt"></i><span class="screen-reader-text">' + imagifyTTT.labels.close + '</span></button>';
|
234 |
+
modalHtml += '</div>';
|
235 |
+
modalHtml += '</div>';
|
236 |
+
|
237 |
+
settings.modalAppendTo.append( modalHtml );
|
238 |
+
|
239 |
+
settings.trigger.on( 'click.imagify', function() {
|
240 |
+
var $modal = $( $( this ).data( 'target' ) ),
|
241 |
+
imgsLoaded = 0,
|
242 |
+
$tt, checkLoad;
|
243 |
+
|
244 |
+
if ( typeof imagifyOpenModal === 'function' && settings.openModal ) {
|
245 |
+
imagifyOpenModal( $( this ) );
|
246 |
+
}
|
247 |
|
248 |
+
$modal.find( '.imagify-modal-content').css( {
|
249 |
+
'width' : ( $( w ).outerWidth() * 0.85 ) + 'px',
|
250 |
+
'max-width': settings.width
|
251 |
+
} );
|
252 |
+
|
253 |
+
// Load before img.
|
254 |
+
$modal.find( '.imagify-img-before').on( 'load', function() {
|
255 |
+
imgsLoaded++;
|
256 |
+
} ).attr( 'src', settings.originalUrl );
|
257 |
+
|
258 |
+
// Load after img.
|
259 |
+
$modal.find( '.imagify-img-after' ).on( 'load', function() {
|
260 |
+
imgsLoaded++;
|
261 |
+
} ).attr( 'src', settings.optimizedUrl );
|
262 |
+
|
263 |
+
$tt = $modal.find( '.twentytwenty-container' );
|
264 |
+
checkLoad = setInterval( function() {
|
265 |
+
if ( 2 !== imgsLoaded ) {
|
266 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
267 |
}
|
268 |
+
|
269 |
+
$tt.twentytwenty( {
|
270 |
+
handlePosition: 0.3,
|
271 |
+
orientation: 'horizontal',
|
272 |
+
labelBefore: imagifyTTT.labels.original_l,
|
273 |
+
labelAfter: imagifyTTT.labels.optimized_l
|
274 |
+
}, function() {
|
275 |
+
var windowH = $( w ).height(),
|
276 |
+
ttH = $modal.find( '.twentytwenty-container' ).height(),
|
277 |
+
ttTop = $modal.find( '.twentytwenty-wrapper' ).position().top,
|
278 |
+
$handle, $labels, $datas, datasH, handlePos, labelsPos;
|
279 |
+
|
280 |
+
if ( ! $tt.closest( '.imagify-modal-content' ).hasClass( 'loaded' ) ) {
|
281 |
+
$tt.closest( '.imagify-modal-content' ).removeClass( 'loading' ).addClass( 'loaded' );
|
282 |
+
drawMeAChart( $modal.find( '.imagify-level-optimized' ).find( '.imagify-chart' ).find( 'canvas' ) );
|
283 |
+
}
|
284 |
+
|
285 |
+
// Check if image height is to big.
|
286 |
+
if ( windowH < ttH && ! $modal.hasClass( 'modal-is-too-high' ) ) {
|
287 |
+
$modal.addClass( 'modal-is-too-high' );
|
288 |
+
|
289 |
+
$handle = $modal.find( '.twentytwenty-handle' );
|
290 |
+
$labels = $modal.find( '.twentytwenty-label-content' );
|
291 |
+
$datas = $modal.find( '.imagify-comparison-levels' );
|
292 |
+
datasH = $datas.outerHeight();
|
293 |
+
handlePos = ( windowH - ttTop - $handle.height() ) / 2;
|
294 |
+
labelsPos = ( windowH - ttTop * 3 - datasH );
|
295 |
+
|
296 |
+
$handle.css( {
|
297 |
+
top: handlePos
|
298 |
+
} );
|
299 |
+
$labels.css( {
|
300 |
+
top: labelsPos,
|
301 |
+
bottom: 'auto'
|
302 |
+
} );
|
303 |
+
$modal.find( '.twentytwenty-wrapper' ).css( {
|
304 |
+
paddingBottom: datasH
|
305 |
+
} );
|
306 |
+
$modal.find( '.imagify-modal-content' ).on( 'scroll.imagify', function() {
|
307 |
+
var scrollTop = $( this ).scrollTop();
|
308 |
+
|
309 |
+
$handle.css( {
|
310 |
+
top: handlePos + scrollTop
|
311 |
+
} );
|
312 |
+
$labels.css( {
|
313 |
+
top: labelsPos + scrollTop
|
314 |
+
} );
|
315 |
+
$datas.css( {
|
316 |
+
bottom: - scrollTop
|
317 |
+
} );
|
318 |
+
} );
|
319 |
+
}
|
320 |
+
} );
|
321 |
+
|
322 |
+
clearInterval( checkLoad );
|
323 |
+
checkLoad = null;
|
324 |
+
return 'done';
|
325 |
}, 75 );
|
326 |
|
327 |
+
return false;
|
328 |
+
} );
|
329 |
+
}; // imagifyTwentyModal( options );
|
330 |
|
331 |
|
332 |
/**
|
333 |
* The complexe visual comparison
|
334 |
*/
|
335 |
+
$( '.imagify-visual-comparison-btn' ).on( 'click', function() {
|
336 |
+
var $tt, imgsLoaded, loader,
|
337 |
+
labelOriginal, labelNormal, labelAggressive, labelUltra,
|
338 |
+
originalLabel, originalAlt, originalSrc, originalDim,
|
339 |
+
normalAlt, normalSrc, normalDim,
|
340 |
+
aggressiveAlt, aggressiveSrc, aggressiveDim,
|
341 |
+
ultraLabel, ultraAlt, ultraSrc, ultraDim,
|
342 |
+
ttBeforeButtons, ttAfterButtons, image50, twentyMe;
|
343 |
+
|
344 |
+
if ( $( '.twentytwenty-wrapper' ).length === 1 ) {
|
345 |
+
return;
|
346 |
+
}
|
347 |
+
|
348 |
+
$( $( this ).data( 'target' ) ).find( '.imagify-modal-content' ).css( 'width', ( $( w ).outerWidth() * 0.95 ) + 'px' );
|
349 |
|
350 |
+
if ( $( '.twentytwenty-container' ).length > 0 && $( w ).outerWidth() <= 800 ) {
|
351 |
return;
|
352 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
353 |
|
354 |
+
$tt = $( '.twentytwenty-container' );
|
355 |
+
imgsLoaded = 0;
|
356 |
+
loader = $tt.data( 'loader' );
|
357 |
+
labelOriginal = $tt.data( 'label-original' );
|
358 |
+
labelNormal = $tt.data( 'label-normal' );
|
359 |
+
labelAggressive = $tt.data( 'label-aggressive' );
|
360 |
+
labelUltra = $tt.data( 'label-ultra' );
|
361 |
+
|
362 |
+
originalLabel = $tt.data( 'original-label' ).replace( /\*\*/, '<strong>' ).replace( /\*\*/, '</strong>' );
|
363 |
+
originalAlt = $tt.data( 'original-alt' );
|
364 |
+
originalSrc = $tt.data( 'original-img' );
|
365 |
+
originalDim = $tt.data( 'original-dim' ).split( 'x' );
|
366 |
+
|
367 |
+
normalAlt = $tt.data( 'normal-alt' );
|
368 |
+
normalSrc = $tt.data( 'normal-img' );
|
369 |
+
normalDim = $tt.data( 'normal-dim' ).split( 'x' );
|
370 |
+
|
371 |
+
aggressiveAlt = $tt.data( 'aggressive-alt' );
|
372 |
+
aggressiveSrc = $tt.data( 'aggressive-img' );
|
373 |
+
aggressiveDim = $tt.data( 'aggressive-dim' ).split( 'x' );
|
374 |
+
|
375 |
+
ultraLabel = $tt.data( 'ultra-label' ).replace( /\*\*/, '<strong>' ).replace( /\*\*/, '</strong>' );
|
376 |
+
ultraAlt = $tt.data( 'ultra-alt' );
|
377 |
+
ultraSrc = $tt.data( 'ultra-img' );
|
378 |
+
ultraDim = $tt.data( 'ultra-dim' ).split( 'x' );
|
379 |
+
|
380 |
+
ttBeforeButtons = '<span class="twentytwenty-duo-buttons twentytwenty-duo-left">';
|
381 |
+
ttBeforeButtons += '<button type="button" class="imagify-comparison-original selected" data-img="original">' + labelOriginal + '</button>';
|
382 |
+
ttBeforeButtons += '<button type="button" class="imagify-comparison-normal" data-img="normal">' + labelNormal + '</button>';
|
383 |
+
ttBeforeButtons += '<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">' + labelAggressive + '</button>';
|
384 |
+
ttBeforeButtons += '</span>';
|
385 |
+
ttAfterButtons = '<span class="twentytwenty-duo-buttons twentytwenty-duo-right">';
|
386 |
+
ttAfterButtons += '<button type="button" class="imagify-comparison-normal" data-img="normal">' + labelNormal + '</button>';
|
387 |
+
ttAfterButtons += '<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">' + labelAggressive + '</button>';
|
388 |
+
ttAfterButtons += '<button type="button" class="imagify-comparison-ultra selected" data-img="ultra">' + labelUltra + '</button>';
|
389 |
+
ttAfterButtons += '</span>';
|
390 |
+
|
391 |
+
// Loader.
|
392 |
+
$tt.before( '<img class="loader" src="' + loader + '" alt="Loading…" width="64" height="64">' );
|
393 |
+
|
394 |
+
// Should be more locally integrated...
|
395 |
+
$( '.twentytwenty-left-buttons' ).append( ttBeforeButtons );
|
396 |
+
$( '.twentytwenty-right-buttons' ).append( ttAfterButtons );
|
397 |
+
|
398 |
+
image50 = '<img class="img-original" alt="' + originalAlt + '" width="' + originalDim[0] + '" height="' + originalDim[1] + '">';
|
399 |
+
image50 += '<img class="img-normal" alt="' + normalAlt + '" width="' + normalDim[0] + '" height="' + normalDim[1] + '">';
|
400 |
+
image50 += '<img class="img-aggressive" alt="' + aggressiveAlt + '" width="' + aggressiveDim[0] + '" height="' + aggressiveDim[1] + '">';
|
401 |
+
image50 += '<img class="img-ultra" alt="' + ultraAlt + '" width="' + ultraDim[0] + '" height="' + ultraDim[1] + '">';
|
402 |
+
// Add switchers button only if needed.
|
403 |
+
// Should be more locally integrated...
|
404 |
+
image50 += $( '.twentytwenty-left-buttons' ).lenght ? ttBeforeButtons + ttAfterButtons : '';
|
405 |
+
|
406 |
+
// Add images to 50/50 area.
|
407 |
+
$tt.closest( '.imagify-modal-content' ).addClass( 'loading' ).find( '.twentytwenty-container' ).append( image50 );
|
408 |
+
|
409 |
+
// Load image original.
|
410 |
+
$( '.img-original' ).on( 'load', function() {
|
411 |
+
imgsLoaded++;
|
412 |
+
} ).attr( 'src', originalSrc );
|
413 |
+
|
414 |
+
// Load image normal.
|
415 |
+
$( '.img-normal' ).on( 'load', function() {
|
416 |
+
imgsLoaded++;
|
417 |
+
} ).attr( 'src', normalSrc );
|
418 |
+
|
419 |
+
// Load image aggressive.
|
420 |
+
$( '.img-aggressive' ).on( 'load', function() {
|
421 |
+
imgsLoaded++;
|
422 |
+
} ).attr( 'src', aggressiveSrc );
|
423 |
+
|
424 |
+
// Load image ultra.
|
425 |
+
$( '.img-ultra' ).on( 'load', function() {
|
426 |
+
imgsLoaded++;
|
427 |
+
} ).attr( 'src', ultraSrc );
|
428 |
+
|
429 |
+
twentyMe = setInterval( function() {
|
430 |
+
if ( 4 !== imgsLoaded ) {
|
431 |
+
return;
|
432 |
+
}
|
433 |
|
434 |
+
$tt.twentytwenty({
|
435 |
+
handlePosition: 0.6,
|
436 |
+
orientation: 'horizontal',
|
437 |
+
labelBefore: originalLabel,
|
438 |
+
labelAfter: ultraLabel
|
439 |
+
}, function() {
|
440 |
+
// Fires on initialisation & each time the handle is moving.
|
441 |
+
if ( ! $tt.closest( '.imagify-modal-content' ).hasClass( 'loaded' ) ) {
|
442 |
+
$tt.closest( '.imagify-modal-content' ).removeClass( 'loading' ).addClass( 'loaded' );
|
443 |
+
drawMeAChart( $( '.imagify-level-ultra' ).find( '.imagify-chart' ).find( 'canvas' ) );
|
444 |
}
|
445 |
+
} );
|
446 |
+
|
447 |
+
clearInterval( twentyMe );
|
448 |
+
twentyMe = null;
|
449 |
+
}, 75);
|
450 |
+
|
451 |
+
// On click on button choices.
|
452 |
+
$( '.imagify-comparison-title' ).on( 'click', '.twentytwenty-duo-buttons button:not(.selected)', function( e ) {
|
453 |
+
var $this = $( this ),
|
454 |
+
$container = $this.closest( '.imagify-comparison-title' ).nextAll( '.twentytwenty-wrapper' ).find( '.twentytwenty-container' ),
|
455 |
+
side = $this.closest( '.twentytwenty-duo-buttons' ).hasClass( 'twentytwenty-duo-left' ) ? 'left' : 'right',
|
456 |
+
$otherSide = 'left' === side ? $this.closest( '.imagify-comparison-title' ).find( '.twentytwenty-duo-right' ) : $this.closest( '.imagify-comparison-title' ).find( '.twentytwenty-duo-left' ),
|
457 |
+
$duo = $this.closest( '.twentytwenty-duo-buttons' ).find( 'button' ),
|
458 |
+
$imgBefore = $container.find( '.twentytwenty-before' ),
|
459 |
+
$imgAfter = $container.find( '.twentytwenty-after' ),
|
460 |
+
image = $this.data( 'img' ),
|
461 |
+
clipStyles;
|
462 |
+
|
463 |
+
e.stopPropagation();
|
464 |
+
|
465 |
+
// Button coloration.
|
466 |
+
$duo.removeClass( 'selected' );
|
467 |
+
$this.addClass( 'selected' );
|
468 |
+
|
469 |
+
// Other side action (to not compare same images).
|
470 |
+
if ( $otherSide.find( '.selected' ).data( 'img' ) === image ) {
|
471 |
+
$otherSide.find( 'button:not(.selected)' ).eq( 0 ).trigger( 'click' );
|
472 |
+
}
|
473 |
|
474 |
+
// Left buttons.
|
475 |
+
if ( 'left' === side ) {
|
476 |
+
clipStyles = $imgBefore.css( 'clip' );
|
477 |
+
$imgBefore.attr( 'style', '' );
|
478 |
+
$imgBefore.removeClass( 'twentytwenty-before' );
|
479 |
+
$container.find( '.img-' + image ).addClass( 'twentytwenty-before' ).css( 'clip', clipStyles );
|
480 |
+
$( '.twentytwenty-before-label' ).find( '.twentytwenty-label-content' ).text( $container.data( image + '-label' ) );
|
481 |
+
$( '.imagify-c-level.go-left' ).attr( 'aria-hidden', 'true' ).removeClass( 'go-left go-right' );
|
482 |
+
$( '.imagify-level-' + image ).attr( 'aria-hidden', 'false' ).addClass( 'go-left' );
|
483 |
+
}
|
484 |
|
485 |
+
// Right buttons.
|
486 |
+
if ( 'right' === side ) {
|
487 |
+
$imgAfter.removeClass( 'twentytwenty-after' );
|
488 |
+
$container.find( '.img-' + image ).addClass( 'twentytwenty-after' );
|
489 |
+
$( '.twentytwenty-after-label' ).find( '.twentytwenty-label-content' ).text( $container.data( image + '-label' ) );
|
490 |
+
$( '.imagify-c-level.go-right' ).attr( 'aria-hidden', 'true' ).removeClass( 'go-left go-right' );
|
491 |
+
$( '.imagify-level-' + image ).attr( 'aria-hidden', 'false' ).addClass( 'go-right' );
|
492 |
+
}
|
493 |
|
494 |
+
drawMeAChart( $( '.imagify-level-' + image ).find( '.imagify-chart' ).find( 'canvas' ) );
|
495 |
+
return false;
|
496 |
+
} );
|
497 |
+
} );
|
498 |
|
499 |
|
500 |
/**
|
501 |
+
* Imagify comparison inside Media post visualization.
|
502 |
*/
|
503 |
+
if ( $( '.post-php' ).find( '.wp_attachment_image' ).find( '.thumbnail' ).length > 0 ) {
|
504 |
+
|
505 |
+
var $oriParent = $( '.post-php' ).find( '.wp_attachment_image' ),
|
506 |
+
$thumbnail = $oriParent.find( '.thumbnail' ),
|
507 |
+
thumb = { src: $thumbnail.prop( 'src' ), width: $thumbnail.width(), height: $thumbnail.height() },
|
508 |
+
oriSource = { src: $( '#imagify-full-original' ).val(), size: $( '#imagify-full-original-size' ).val() },
|
509 |
+
$optimizeBtn = $( '#misc-publishing-actions' ).find( '.misc-pub-imagify' ).find( '.button-primary' ),
|
510 |
+
widthLimit = 360,
|
511 |
+
filesize, saving;
|
512 |
+
|
513 |
+
// If shown image > 360, use twentytwenty.
|
514 |
+
if ( thumb.width > widthLimit && $( '#imagify-full-original' ).length > 0 && $( '#imagify-full-original' ).val() !== '' ) {
|
515 |
+
|
516 |
+
filesize = $( '.misc-pub-filesize' ).find( 'strong' ).text();
|
517 |
+
saving = $( '.imagify-data-item' ).find( '.imagify-chart-value' ).text();
|
518 |
+
|
519 |
+
// Create button to trigger.
|
520 |
+
$( '[id^="imgedit-open-btn-"]' ).before( '<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-visual-comparison" id="imagify-start-comparison">' + imagifyTTT.labels.compare + '</button>' );
|
521 |
+
|
522 |
+
// Modal and trigger event creation.
|
523 |
+
imagifyTwentyModal( {
|
524 |
+
width: thumb.width,
|
525 |
+
height: thumb.height,
|
526 |
+
originalUrl: oriSource.src,
|
527 |
+
optimizedUrl: thumb.src,
|
528 |
+
originalSize: oriSource.size,
|
529 |
+
optimizedSize: filesize,
|
530 |
+
saving: saving,
|
531 |
+
modalAppendTo: $oriParent,
|
532 |
+
trigger: $( '#imagify-start-comparison' ),
|
533 |
+
modalId: 'imagify-visual-comparison'
|
534 |
+
} );
|
535 |
}
|
536 |
+
// Else put images next to next.
|
537 |
+
else if ( thumb.width < widthLimit && $( '#imagify-full-original' ).length > 0 && $( '#imagify-full-original' ).val() !== '' ) {
|
538 |
// TODO
|
539 |
}
|
540 |
+
// If image has no backup.
|
541 |
+
else if ( $( '#imagify-full-original' ).length > 0 && $( '#imagify-full-original' ).val() === '' ) {
|
542 |
// do nothing ?
|
543 |
}
|
544 |
+
// In case image is not optimized.
|
545 |
else {
|
546 |
+
// If is not in optimizing process, propose the Optimize button trigger.
|
547 |
+
if ( $( '#misc-publishing-actions' ).find( '.misc-pub-imagify' ).find( '.button-primary' ).length === 1 ) {
|
548 |
+
$( '[id^="imgedit-open-btn-"]' ).before( '<span class="spinner imagify-hidden"></span><a class="imagify-button-primary button-primary imagify-optimize-trigger" id="imagify-optimize-trigger" href="' + $optimizeBtn.attr( 'href' ) + '">' + imagifyTTT.labels.optimize + '</a>' );
|
549 |
|
550 |
+
$( '#imagify-optimize-trigger' ).on('click', function() {
|
551 |
+
$( this ).prev( '.spinner' ).removeClass( 'imagify-hidden' ).addClass( 'is-active' );
|
552 |
+
} );
|
553 |
}
|
554 |
}
|
555 |
|
556 |
}
|
557 |
|
558 |
/**
|
559 |
+
* Images comparison in attachments list page (upload.php).
|
560 |
*/
|
561 |
+
if ( $( '.upload-php' ).find( '.imagify-compare-images' ).length > 0 ) {
|
562 |
+
|
563 |
+
$( '.imagify-compare-images' ).each( function() {
|
564 |
+
var $this = $( this ),
|
565 |
+
id = $this.data( 'id' ),
|
566 |
+
$datas = $this.closest( '#post-' + id ).find( '.column-imagify_optimized_file' );
|
567 |
+
|
568 |
+
// Modal and trigger event creation.
|
569 |
+
imagifyTwentyModal( {
|
570 |
+
width: $this.data( 'full-width' ),
|
571 |
+
height: $this.data( 'full-height' ),
|
572 |
+
originalUrl: $this.data( 'backup-src' ),
|
573 |
+
optimizedUrl: $this.data( 'full-src' ),
|
574 |
+
originalSize: $datas.find( '.original' ).text(),
|
575 |
+
optimizedSize: $datas.find( '.imagify-data-item' ).find( '.big' ).text(),
|
576 |
+
saving: $datas.find( '.imagify-chart-value' ).text(),
|
577 |
+
modalAppendTo: $this.closest( '.column-primary' ),
|
578 |
+
trigger: $this,
|
579 |
+
modalId: 'imagify-comparison-' + id
|
580 |
+
} );
|
581 |
+
} );
|
|
|
|
|
582 |
}
|
583 |
|
584 |
/**
|
585 |
+
* Images Comparison in Grid View modal.
|
586 |
*/
|
587 |
if ( $('.upload-php').length > 0 ) {
|
588 |
|
589 |
+
var getVar = function ( param ) {
|
|
|
590 |
var vars = {};
|
591 |
+
|
592 |
+
w.location.href.replace(
|
593 |
+
/[?&]+([^=&]+)=?([^&]*)?/gi,//
|
594 |
+
function( m, key, value ) {
|
595 |
+
vars[ key ] = undefined !== value ? value : '';
|
596 |
}
|
597 |
);
|
598 |
|
599 |
if ( param ) {
|
600 |
+
return vars[ param ] ? vars[ param ] : null;
|
601 |
}
|
602 |
return vars;
|
603 |
},
|
604 |
+
imagifyContentInModal = function() {
|
605 |
+
var tempTimer = setInterval( function() {
|
606 |
+
var $datas;
|
607 |
+
|
608 |
+
if ( ! $( '.media-modal' ).find( '.imagify-datas-details' ).length ) {
|
609 |
+
return;
|
610 |
+
}
|
611 |
+
|
612 |
+
if ( $( '#imagify-original-src' ).length > 0 && $( '#imagify-original-src' ) !== '' ) {
|
613 |
+
// Trigger creation.
|
614 |
+
$( '.media-frame-content' ).find( '.attachment-actions' ).prepend( '<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-comparison-modal" id="imagify-media-frame-comparison-btn">' + imagifyTTT.labels.compare + '</button>' );
|
615 |
+
|
616 |
+
// Get datas.
|
617 |
+
$datas = $( '.media-frame-content' ).find( '.compat-field-imagify' );
|
618 |
+
|
619 |
+
// Modal and trigger event creation.
|
620 |
+
imagifyTwentyModal( {
|
621 |
+
width: $( '#imagify-full-width' ).val(),
|
622 |
+
height: $( '#imagify-full-height' ).val(),
|
623 |
+
originalUrl: $( '#imagify-original-src' ).val(),
|
624 |
+
optimizedUrl: $( '#imagify-full-src' ).val(),
|
625 |
+
originalSize: $( '#imagify-original-size' ).val(),
|
626 |
+
optimizedSize: $datas.find( '.imagify-data-item' ).find( '.big' ).text(),
|
627 |
+
saving: $datas.find( '.imagify-chart-value' ).text(),
|
628 |
+
modalAppendTo: $( '.media-frame-content' ).find( '.thumbnail-image' ),
|
629 |
+
trigger: $( '#imagify-media-frame-comparison-btn' ),
|
630 |
+
modalId: 'imagify-comparison-modal',
|
631 |
+
openModal: true
|
632 |
+
} );
|
|
|
633 |
}
|
634 |
+
|
635 |
+
clearInterval( tempTimer );
|
636 |
+
tempTimer = null;
|
637 |
}, 20 );
|
638 |
},
|
639 |
waitContent = setInterval( function() {
|
640 |
+
if ( ! $('.upload-php').find('.media-frame.mode-grid').find('.attachments').length ) {
|
641 |
+
return;
|
642 |
+
}
|
643 |
+
|
644 |
+
// If attachment is clicked, build the modal inside the modal.
|
645 |
+
$( '.upload-php' ).find( '.media-frame.mode-grid' ).on( 'click', '.attachment', function() {
|
646 |
+
imagifyContentInModal();
|
647 |
+
} );
|
|
|
|
|
|
|
648 |
|
649 |
+
// If attachment is mentionned in URL, build the modal inside the modal.
|
650 |
+
if ( getVar( 'item' ) ) {
|
651 |
+
imagifyContentInModal();
|
652 |
}
|
|
|
653 |
|
654 |
+
clearInterval( waitContent );
|
655 |
+
waitContent = null;
|
656 |
+
}, 100 );
|
657 |
+
// If URL contain item, that will open the WP Modal View.
|
658 |
}
|
659 |
|
660 |
+
} )(jQuery, document, window);
|
assets/js/jquery.twentytwenty.min.js
CHANGED
@@ -1,28 +1 @@
|
|
1 |
-
(function(a,n,q){n.fn.twentytwenty=function(k,v){k=n.extend({handlePosition:.5,orientation:"horizontal",labelBefore:"Before",labelAfter:"After"},k);return this.each(function(){var f=k.handlePosition,c=n(this),d=k.orientation,p="vertical"===d?"down":"left",t="vertical"===d?"up":"right",l=c.find("img:first"),q=c.find("img:last");c.wrap('<div class="twentytwenty-wrapper twentytwenty-'+d+'"></div>');c.append('<div class="twentytwenty-overlay"></div>');c.append('<div class="twentytwenty-handle"></div>');
|
2 |
-
var h=c.find(".twentytwenty-handle");h.append('<span class="twentytwenty-'+p+'-arrow"></span>');h.append('<span class="twentytwenty-'+t+'-arrow"></span>');c.addClass("twentytwenty-container");l.addClass("twentytwenty-before");q.addClass("twentytwenty-after");p=c.find(".twentytwenty-overlay");p.append('<div class="twentytwenty-labels twentytwenty-before-label"><span class="twentytwenty-label-content">'+k.labelBefore+"</span></div>");p.append('<div class="twentytwenty-labels twentytwenty-after-label"><span class="twentytwenty-label-content">'+
|
3 |
-
k.labelAfter+"</span></div>");var w=function(a){var b,A,g;g=l.width();var y=l.height();b=g+"px";A=y+"px";g=a*g+"px";a=a*y+"px";h.css("vertical"===d?"top":"left","vertical"===d?a:g);y=c.find(".twentytwenty-before");"vertical"===d?y.css("clip","rect(0,"+b+","+a+",0)"):y.css("clip","rect(0,"+g+","+A+",0)");c.css("height",A);"function"===typeof v&&v()},x=0,u=0,r=0,b=0;n(a).on("resize.twentytwenty",function(a){w(f)});h.on("movestart",function(a){(a.distX>a.distY&&a.distX<-a.distY||a.distX<a.distY&&a.distX>
|
4 |
-
-a.distY)&&"vertical"!==d?a.preventDefault():(a.distX<a.distY&&a.distX<-a.distY||a.distX>a.distY&&a.distX>-a.distY)&&"vertical"===d&&a.preventDefault();c.addClass("active");x=c.offset().left;u=c.offset().top;r=l.width();b=l.height()});h.on("moveend",function(a){c.removeClass("active")});h.on("move",function(a){c.hasClass("active")&&(f="vertical"===d?(a.pageY-u)/b:(a.pageX-x)/r,0>f&&(f=0),1<f&&(f=1),w(f))});c.find("img").on("mousedown",function(a){a.preventDefault()});n(a).trigger("resize.twentytwenty")})}})(window,
|
5 |
-
jQuery);
|
6 |
-
(function(a,n,q,k){var v=function(b){b.each(function(){var b=parseInt(a(this).closest(".imagify-chart").next(".imagify-chart-value").text()),b=[{value:b,color:"#00B3D3"},{value:100-b,color:"#D8D8D8"}];(new Chart(a(this)[0].getContext("2d"))).Doughnut(b,{segmentStrokeColor:"#2A2E3C",segmentStrokeWidth:1,animateRotate:!0,percentageInnerCutout:60,tooltipEvents:[]})})},f=function(b){b=b.data("target")||b.attr("href");a(b).css("display","flex").hide().fadeIn(400).attr("aria-hidden","false").attr("tabindex","0").focus().removeAttr("tabindex").addClass("modal-is-open");
|
7 |
-
a("body").addClass("imagify-modal-is-open")},c=function(b){var c={width:0,height:0,original_url:"",optimized_url:"",original_size:0,optimized_size:0,saving:0,modal_append_to:a("body"),trigger:a('[data-target="imagify-visual-comparison"]'),modal_id:"imagify-visual-comparison",open_modal:!1},e=a.extend({},c,b);if(0===e.width||0===e.height||""===e.original_url||""===e.optimized_url||0===e.original_size||0===e.optimized_size||0===e.saving)return"error";e.modal_append_to.append('<div id="'+e.modal_id+
|
8 |
-
'" class="imagify-modal imagify-visual-comparison" aria-hidden="true"><div class="imagify-modal-content loading"><div class="twentytwenty-container"><img class="imagify-img-before" alt="" width="'+e.width+'" height="'+e.height+'"><img class="imagify-img-after" alt="" width="'+e.width+'" height="'+e.height+'"></div><div class="imagify-comparison-levels"><div class="imagify-c-level imagify-level-original go-left"><p class="imagify-c-level-row"><span class="label">'+imagifyTTT.labels.filesize+'</span><span class="value level">'+
|
9 |
-
e.original_size+'</span></p></div><div class="imagify-c-level imagify-level-optimized go-right"><p class="imagify-c-level-row"><span class="label">'+imagifyTTT.labels.filesize+'</span><span class="value level">'+e.optimized_size+'</span></p><p class="imagify-c-level-row"><span class="label">'+imagifyTTT.labels.saving+'</span><span class="value"><span class="imagify-chart"><span class="imagify-chart-container"><canvas id="imagify-consumption-chart-normal" width="15" height="15"></canvas></span></span><span class="imagify-chart-value">'+
|
10 |
-
e.saving+'</span>%</span></p></div></div><button class="close-btn absolute" type="button"><i aria-hidden="true" class="dashicons dashicons-no-alt"></i><span class="screen-reader-text">'+imagifyTTT.labels.close+"</span></button></div></div>");e.trigger.on("click.imagify",function(){var b=a(a(this).data("target")),c=0;"function"===typeof f&&e.open_modal&&f(a(this));b.find(".imagify-modal-content").css({width:.85*a(n).outerWidth()+"px","max-width":e.width});b.find(".imagify-img-before").on("load",function(){c++}).attr("src",
|
11 |
-
e.original_url);b.find(".imagify-img-after").on("load",function(){c++}).attr("src",e.optimized_url);var m=b.find(".twentytwenty-container"),d=setInterval(function(){if(2===c)return m.twentytwenty({handlePosition:.3,orientation:"horizontal",labelBefore:imagifyTTT.labels.original_l,labelAfter:imagifyTTT.labels.optimized_l},function(){var e=a(n).height(),c=b.find(".twentytwenty-container").height(),d=b.find(".twentytwenty-wrapper").position().top;m.closest(".imagify-modal-content").hasClass("loaded")||
|
12 |
-
(m.closest(".imagify-modal-content").removeClass("loading").addClass("loaded"),v(b.find(".imagify-level-optimized").find(".imagify-chart").find("canvas")));if(e<c&&!b.hasClass("modal-is-too-high")){b.addClass("modal-is-too-high");var g=b.find(".twentytwenty-handle"),f=b.find(".twentytwenty-label-content"),h=b.find(".imagify-comparison-levels"),c=h.outerHeight(),k=(e-d-g.height())/2,l=e-3*d-c;g.css({top:k});f.css({top:l,bottom:"auto"});b.find(".twentytwenty-wrapper").css({paddingBottom:c});b.find(".imagify-modal-content").on("scroll.imagify",
|
13 |
-
function(){g.css({top:k+a(this).scrollTop()});f.css({top:l+a(this).scrollTop()});h.css({bottom:-a(this).scrollTop()})})}}),clearInterval(d),d=null,"done"},75);return!1})};a(".imagify-visual-comparison-btn").on("click",function(){if(1!==a(".twentytwenty-wrapper").length&&(a(a(this).data("target")).find(".imagify-modal-content").css("width",.95*a(n).outerWidth()+"px"),0<a(".twentytwenty-container").length&&800<a(n).outerWidth())){var b=a(".twentytwenty-container"),c=0,e=b.data("loader"),d=b.data("label-original"),
|
14 |
-
g=b.data("label-normal"),f=b.data("label-aggressive"),h=b.data("label-ultra"),k=b.data("original-label").replace(/\*\*/,"<strong>").replace(/\*\*/,"</strong>"),l=b.data("original-alt"),q=b.data("original-img"),p=b.data("original-dim").split("x");b.data("normal-label").replace(/\*\*/,"<strong>").replace(/\*\*/,"</strong>");var t=b.data("normal-alt"),u=b.data("normal-img"),r=b.data("normal-dim").split("x");b.data("aggressive-label").replace(/\*\*/,"<strong>").replace(/\*\*/,"</strong>");var w=b.data("aggressive-alt"),
|
15 |
-
x=b.data("aggressive-img"),B=b.data("aggressive-dim").split("x"),z=b.data("ultra-label").replace(/\*\*/,"<strong>").replace(/\*\*/,"</strong>"),E=b.data("ultra-alt"),F=b.data("ultra-img"),C=b.data("ultra-dim").split("x"),d='<span class="twentytwenty-duo-buttons twentytwenty-duo-left"><button type="button" class="imagify-comparison-original selected" data-img="original">'+d+'</button><button type="button" class="imagify-comparison-normal" data-img="normal">'+g+'</button><button type="button" class="imagify-comparison-aggressive" data-img="aggressive">'+
|
16 |
-
f+"</button></span>",g='<span class="twentytwenty-duo-buttons twentytwenty-duo-right"><button type="button" class="imagify-comparison-normal" data-img="normal">'+g+'</button><button type="button" class="imagify-comparison-aggressive" data-img="aggressive">'+f+'</button><button type="button" class="imagify-comparison-ultra selected" data-img="ultra">'+h+"</button></span>";b.before('<img class="loader" src="'+e+'" alt="Loading\u2026" width="64" height="64">');e=a(".twentytwenty-left-buttons").lenght?
|
17 |
-
d+g:"";a(".twentytwenty-left-buttons").append(d);a(".twentytwenty-right-buttons").append(g);b.closest(".imagify-modal-content").addClass("loading").find(".twentytwenty-container").append('<img class="img-original" alt="'+l+'" width="'+p[0]+'" height="'+p[1]+'"><img class="img-normal" alt="'+t+'" width="'+r[0]+'" height="'+r[1]+'"><img class="img-aggressive" alt="'+w+'" width="'+B[0]+'" height="'+B[1]+'"><img class="img-ultra" alt="'+E+'" width="'+C[0]+'" height="'+C[1]+'">'+e);a(".img-original").on("load",
|
18 |
-
function(){c++}).attr("src",q);a(".img-normal").on("load",function(){c++}).attr("src",u);a(".img-aggressive").on("load",function(){c++}).attr("src",x);a(".img-ultra").on("load",function(){c++}).attr("src",F);var D=setInterval(function(){4===c&&(b.twentytwenty({handlePosition:.6,orientation:"horizontal",labelBefore:k,labelAfter:z},function(){b.closest(".imagify-modal-content").hasClass("loaded")||(b.closest(".imagify-modal-content").removeClass("loading").addClass("loaded"),v(a(".imagify-level-ultra").find(".imagify-chart").find("canvas")))}),
|
19 |
-
clearInterval(D),D=null)},75);a(".imagify-comparison-title").on("click",".twentytwenty-duo-buttons button:not(.selected)",function(b){b.stopPropagation();var c=a(this);b=c.closest(".imagify-comparison-title").nextAll(".twentytwenty-wrapper").find(".twentytwenty-container");var e=c.closest(".twentytwenty-duo-buttons").hasClass("twentytwenty-duo-left")?"left":"right",d="left"===e?c.closest(".imagify-comparison-title").find(".twentytwenty-duo-right"):c.closest(".imagify-comparison-title").find(".twentytwenty-duo-left"),
|
20 |
-
g=c.closest(".twentytwenty-duo-buttons").find("button"),f=b.find(".twentytwenty-before"),h=b.find(".twentytwenty-after"),m=c.data("img");g.removeClass("selected");c.addClass("selected");d.find(".selected").data("img")===m&&d.find("button:not(.selected)").eq(0).trigger("click");"left"===e&&(c=f.css("clip"),f.attr("style",""),f.removeClass("twentytwenty-before"),b.find(".img-"+m).addClass("twentytwenty-before").css("clip",c),a(".twentytwenty-before-label").find(".twentytwenty-label-content").text(b.data(m+
|
21 |
-
"-label")),a(".imagify-c-level.go-left").attr("aria-hidden","true").removeClass("go-left go-right"),a(".imagify-level-"+m).attr("aria-hidden","false").addClass("go-left"));"right"===e&&(h.removeClass("twentytwenty-after"),b.find(".img-"+m).addClass("twentytwenty-after"),a(".twentytwenty-after-label").find(".twentytwenty-label-content").text(b.data(m+"-label")),a(".imagify-c-level.go-right").attr("aria-hidden","true").removeClass("go-left go-right"),a(".imagify-level-"+m).attr("aria-hidden","false").addClass("go-right"));
|
22 |
-
v(a(".imagify-level-"+m).find(".imagify-chart").find("canvas"));return!1})}});if(0<a(".post-php").find(".wp_attachment_image").find(".thumbnail").length){q=a(".post-php").find(".wp_attachment_image");var d=q.find(".thumbnail"),p=d.prop("src"),t=d.width(),d=d.height(),l=a("#imagify-full-original").val(),z=a("#imagify-full-original-size").val(),h=a("#misc-publishing-actions").find(".misc-pub-imagify").find(".button-primary");if(360<t&&0<a("#imagify-full-original").length&&""!==a("#imagify-full-original").val()){var h=
|
23 |
-
a(".misc-pub-filesize").find("strong").text(),w=a(".imagify-data-item").find(".imagify-chart-value").text();a('[id^="imgedit-open-btn-"]').before('<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-visual-comparison" id="imagify-start-comparison">'+imagifyTTT.labels.compare+"</button>");c({width:t,height:d,original_url:l,optimized_url:p,original_size:z,optimized_size:h,saving:w,modal_append_to:q,trigger:a("#imagify-start-comparison"),modal_id:"imagify-visual-comparison"})}else 360>
|
24 |
-
t&&0<a("#imagify-full-original").length&&""!==a("#imagify-full-original").val()||0<a("#imagify-full-original").length&&""===a("#imagify-full-original").val()||1!==a("#misc-publishing-actions").find(".misc-pub-imagify").find(".button-primary").length||(a('[id^="imgedit-open-btn-"]').before('<span class="spinner imagify-hidden"></span><a class="imagify-button-primary button-primary imagify-optimize-trigger" id="imagify-optimize-trigger" href="'+h.attr("href")+'">'+imagifyTTT.labels.optimize+"</a>"),
|
25 |
-
a("#imagify-optimize-trigger").on("click",function(){a(this).prev(".spinner").removeClass("imagify-hidden").addClass("is-active")}))}0<a(".upload-php").find(".imagify-compare-images").length&&a(".imagify-compare-images").each(function(){var b=a(this),d=b.data("id"),e=b.closest("#post-"+d).find(".column-imagify_optimized_file");c({width:b.data("full-width"),height:b.data("full-height"),original_url:b.data("backup-src"),optimized_url:b.data("full-src"),original_size:e.find(".original").text(),optimized_size:e.find(".imagify-data-item").find(".big").text(),
|
26 |
-
saving:e.find(".imagify-chart-value").text(),modal_append_to:b.closest(".column-primary"),trigger:b,modal_id:"imagify-comparison-"+d})});if(0<a(".upload-php").length)var x=function(a){var c={};n.location.href.replace(/[?&]+([^=&]+)=?([^&]*)?/gi,function(a,b,d){c[b]=d!==k?d:""});return a?c[a]?c[a]:null:c},u=function(){var b=setInterval(function(){if(a(".media-modal").find(".imagify-datas-details").length){if(0<a("#imagify-original-src").length&&""!==a("#imagify-original-src")){a(".media-frame-content").find(".attachment-actions").prepend('<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-comparison-modal" id="imagify-media-frame-comparison-btn">'+
|
27 |
-
imagifyTTT.labels.compare+"</button>");var d=a(".media-frame-content").find(".compat-field-imagify");c({width:a("#imagify-full-width").val(),height:a("#imagify-full-height").val(),original_url:a("#imagify-original-src").val(),optimized_url:a("#imagify-full-src").val(),original_size:a("#imagify-original-size").val(),optimized_size:d.find(".imagify-data-item").find(".big").text(),saving:d.find(".imagify-chart-value").text(),modal_append_to:a(".media-frame-content").find(".thumbnail-image"),trigger:a("#imagify-media-frame-comparison-btn"),
|
28 |
-
modal_id:"imagify-comparison-modal",open_modal:!0})}clearInterval(b);b=null}},20)},r=setInterval(function(){0<a(".upload-php").find(".media-frame.mode-grid").find(".attachments").length&&(a(".upload-php").find(".media-frame.mode-grid").on("click",".attachment",function(){u()}),x("item")&&u(),clearInterval(r),r=null)},100)})(jQuery,window,document);
|
1 |
+
window.imagify=window.imagify||{concat:ajaxurl.indexOf("?")>0?"&":"?",log:function(a){void 0!==console&&console.log(a)},info:function(a){void 0!==console&&console.info(a)}},function(a,b,c,d){a.fn.twentytwenty=function(b,c){return b=a.extend({handlePosition:.5,orientation:"horizontal",labelBefore:"Before",labelAfter:"After"},b),this.each(function(){var d=b.handlePosition,e=a(this),f=b.orientation,g="vertical"===f?"down":"left",h="vertical"===f?"up":"right",i=e.find("img:first"),j=e.find("img:last");e.wrap('<div class="twentytwenty-wrapper twentytwenty-'+f+'"></div>'),e.append('<div class="twentytwenty-overlay"></div>'),e.append('<div class="twentytwenty-handle"></div>');var k=e.find(".twentytwenty-handle");k.append('<span class="twentytwenty-'+g+'-arrow"></span>'),k.append('<span class="twentytwenty-'+h+'-arrow"></span>'),e.addClass("twentytwenty-container"),i.addClass("twentytwenty-before"),j.addClass("twentytwenty-after");var l=e.find(".twentytwenty-overlay");l.append('<div class="twentytwenty-labels twentytwenty-before-label"><span class="twentytwenty-label-content">'+b.labelBefore+"</span></div>"),l.append('<div class="twentytwenty-labels twentytwenty-after-label"><span class="twentytwenty-label-content">'+b.labelAfter+"</span></div>");var m=function(a){var b=i.width(),c=i.height();return{w:b+"px",h:c+"px",cw:a*b+"px",ch:a*c+"px"}},n=function(a){var b=e.find(".twentytwenty-before");"vertical"===f?b.css("clip","rect(0,"+a.w+","+a.ch+",0)"):b.css("clip","rect(0,"+a.cw+","+a.h+",0)"),e.css("height",a.h),"function"==typeof c&&c()},o=function(a){var b=m(a);k.css("vertical"===f?"top":"left","vertical"===f?b.ch:b.cw),n(b)},p=0,q=0,r=0,s=0;a(window).on("resize.twentytwenty",function(){o(d)}),k.on("movestart",function(a){(a.distX>a.distY&&a.distX<-a.distY||a.distX<a.distY&&a.distX>-a.distY)&&"vertical"!==f?a.preventDefault():(a.distX<a.distY&&a.distX<-a.distY||a.distX>a.distY&&a.distX>-a.distY)&&"vertical"===f&&a.preventDefault(),e.addClass("active"),p=e.offset().left,q=e.offset().top,r=i.width(),s=i.height()}),k.on("moveend",function(){e.removeClass("active")}),k.on("move",function(a){e.hasClass("active")&&(d="vertical"===f?(a.pageY-q)/s:(a.pageX-p)/r,d<0&&(d=0),d>1&&(d=1),o(d))}),e.find("img").on("mousedown",function(a){a.preventDefault()}),a(window).trigger("resize.twentytwenty")})}}(jQuery,document,window),function(a,b,c,d){var e=function(b){b.each(function(){var b=a(this),c=parseInt(b.closest(".imagify-chart").next(".imagify-chart-value").text()),d=[{value:c,color:"#00B3D3"},{value:100-c,color:"#D8D8D8"}];new Chart(b[0].getContext("2d")).Doughnut(d,{segmentStrokeColor:"#2A2E3C",segmentStrokeWidth:1,animateRotate:!0,percentageInnerCutout:60,tooltipEvents:[]})})},f=function(b){var c=b.data("target")||b.attr("href");a(c).css("display","flex").hide().fadeIn(400).attr("aria-hidden","false").attr("tabindex","0").focus().removeAttr("tabindex").addClass("modal-is-open"),a("body").addClass("imagify-modal-is-open")},g=function(b){var d,g={width:0,height:0,originalUrl:"",optimizedUrl:"",originalSize:0,optimizedSize:0,saving:0,modalAppendTo:a("body"),trigger:a('[data-target="imagify-visual-comparison"]'),modalId:"imagify-visual-comparison",openModal:!1},h=a.extend({},g,b);if(0===h.width||0===h.height||""===h.originalUrl||""===h.optimizedUrl||0===h.originalSize||0===h.optimizedSize||0===h.saving)return"error";d='<div id="'+h.modalId+'" class="imagify-modal imagify-visual-comparison" aria-hidden="true">',d+='<div class="imagify-modal-content loading">',d+='<div class="twentytwenty-container">',d+='<img class="imagify-img-before" alt="" width="'+h.width+'" height="'+h.height+'">',d+='<img class="imagify-img-after" alt="" width="'+h.width+'" height="'+h.height+'">',d+="</div>",d+='<div class="imagify-comparison-levels">',d+='<div class="imagify-c-level imagify-level-original go-left">',d+='<p class="imagify-c-level-row">',d+='<span class="label">'+imagifyTTT.labels.filesize+"</span>",d+='<span class="value level">'+h.originalSize+"</span>",d+="</p>",d+="</div>",d+='<div class="imagify-c-level imagify-level-optimized go-right">',d+='<p class="imagify-c-level-row">',d+='<span class="label">'+imagifyTTT.labels.filesize+"</span>",d+='<span class="value level">'+h.optimizedSize+"</span>",d+="</p>",d+='<p class="imagify-c-level-row">',d+='<span class="label">'+imagifyTTT.labels.saving+"</span>",d+='<span class="value"><span class="imagify-chart"><span class="imagify-chart-container"><canvas id="imagify-consumption-chart-normal" width="15" height="15"></canvas></span></span><span class="imagify-chart-value">'+h.saving+"</span>%</span>",d+="</p>",d+="</div>",d+="</div>",d+='<button class="close-btn absolute" type="button"><i aria-hidden="true" class="dashicons dashicons-no-alt"></i><span class="screen-reader-text">'+imagifyTTT.labels.close+"</span></button>",d+="</div>",d+="</div>",h.modalAppendTo.append(d),h.trigger.on("click.imagify",function(){var b,d,g=a(a(this).data("target")),i=0;return"function"==typeof f&&h.openModal&&f(a(this)),g.find(".imagify-modal-content").css({width:.85*a(c).outerWidth()+"px","max-width":h.width}),g.find(".imagify-img-before").on("load",function(){i++}).attr("src",h.originalUrl),g.find(".imagify-img-after").on("load",function(){i++}).attr("src",h.optimizedUrl),b=g.find(".twentytwenty-container"),d=setInterval(function(){if(2===i)return b.twentytwenty({handlePosition:.3,orientation:"horizontal",labelBefore:imagifyTTT.labels.original_l,labelAfter:imagifyTTT.labels.optimized_l},function(){var d,f,h,i,j,k,l=a(c).height(),m=g.find(".twentytwenty-container").height(),n=g.find(".twentytwenty-wrapper").position().top;b.closest(".imagify-modal-content").hasClass("loaded")||(b.closest(".imagify-modal-content").removeClass("loading").addClass("loaded"),e(g.find(".imagify-level-optimized").find(".imagify-chart").find("canvas"))),l<m&&!g.hasClass("modal-is-too-high")&&(g.addClass("modal-is-too-high"),d=g.find(".twentytwenty-handle"),f=g.find(".twentytwenty-label-content"),h=g.find(".imagify-comparison-levels"),i=h.outerHeight(),j=(l-n-d.height())/2,k=l-3*n-i,d.css({top:j}),f.css({top:k,bottom:"auto"}),g.find(".twentytwenty-wrapper").css({paddingBottom:i}),g.find(".imagify-modal-content").on("scroll.imagify",function(){var b=a(this).scrollTop();d.css({top:j+b}),f.css({top:k+b}),h.css({bottom:-b})}))}),clearInterval(d),d=null,"done"},75),!1})};if(a(".imagify-visual-comparison-btn").on("click",function(){var b,d,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B;1!==a(".twentytwenty-wrapper").length&&(a(a(this).data("target")).find(".imagify-modal-content").css("width",.95*a(c).outerWidth()+"px"),a(".twentytwenty-container").length>0&&a(c).outerWidth()<=800||(b=a(".twentytwenty-container"),d=0,f=b.data("loader"),g=b.data("label-original"),h=b.data("label-normal"),i=b.data("label-aggressive"),j=b.data("label-ultra"),k=b.data("original-label").replace(/\*\*/,"<strong>").replace(/\*\*/,"</strong>"),l=b.data("original-alt"),m=b.data("original-img"),n=b.data("original-dim").split("x"),o=b.data("normal-alt"),p=b.data("normal-img"),q=b.data("normal-dim").split("x"),r=b.data("aggressive-alt"),s=b.data("aggressive-img"),t=b.data("aggressive-dim").split("x"),u=b.data("ultra-label").replace(/\*\*/,"<strong>").replace(/\*\*/,"</strong>"),v=b.data("ultra-alt"),w=b.data("ultra-img"),x=b.data("ultra-dim").split("x"),y='<span class="twentytwenty-duo-buttons twentytwenty-duo-left">',y+='<button type="button" class="imagify-comparison-original selected" data-img="original">'+g+"</button>",y+='<button type="button" class="imagify-comparison-normal" data-img="normal">'+h+"</button>",y+='<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">'+i+"</button>",y+="</span>",z='<span class="twentytwenty-duo-buttons twentytwenty-duo-right">',z+='<button type="button" class="imagify-comparison-normal" data-img="normal">'+h+"</button>",z+='<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">'+i+"</button>",z+='<button type="button" class="imagify-comparison-ultra selected" data-img="ultra">'+j+"</button>",z+="</span>",b.before('<img class="loader" src="'+f+'" alt="Loading…" width="64" height="64">'),a(".twentytwenty-left-buttons").append(y),a(".twentytwenty-right-buttons").append(z),A='<img class="img-original" alt="'+l+'" width="'+n[0]+'" height="'+n[1]+'">',A+='<img class="img-normal" alt="'+o+'" width="'+q[0]+'" height="'+q[1]+'">',A+='<img class="img-aggressive" alt="'+r+'" width="'+t[0]+'" height="'+t[1]+'">',A+='<img class="img-ultra" alt="'+v+'" width="'+x[0]+'" height="'+x[1]+'">',A+=a(".twentytwenty-left-buttons").lenght?y+z:"",b.closest(".imagify-modal-content").addClass("loading").find(".twentytwenty-container").append(A),a(".img-original").on("load",function(){d++}).attr("src",m),a(".img-normal").on("load",function(){d++}).attr("src",p),a(".img-aggressive").on("load",function(){d++}).attr("src",s),a(".img-ultra").on("load",function(){d++}).attr("src",w),B=setInterval(function(){4===d&&(b.twentytwenty({handlePosition:.6,orientation:"horizontal",labelBefore:k,labelAfter:u},function(){b.closest(".imagify-modal-content").hasClass("loaded")||(b.closest(".imagify-modal-content").removeClass("loading").addClass("loaded"),e(a(".imagify-level-ultra").find(".imagify-chart").find("canvas")))}),clearInterval(B),B=null)},75),a(".imagify-comparison-title").on("click",".twentytwenty-duo-buttons button:not(.selected)",function(b){var c,d=a(this),f=d.closest(".imagify-comparison-title").nextAll(".twentytwenty-wrapper").find(".twentytwenty-container"),g=d.closest(".twentytwenty-duo-buttons").hasClass("twentytwenty-duo-left")?"left":"right",h="left"===g?d.closest(".imagify-comparison-title").find(".twentytwenty-duo-right"):d.closest(".imagify-comparison-title").find(".twentytwenty-duo-left"),i=d.closest(".twentytwenty-duo-buttons").find("button"),j=f.find(".twentytwenty-before"),k=f.find(".twentytwenty-after"),l=d.data("img");return b.stopPropagation(),i.removeClass("selected"),d.addClass("selected"),h.find(".selected").data("img")===l&&h.find("button:not(.selected)").eq(0).trigger("click"),"left"===g&&(c=j.css("clip"),j.attr("style",""),j.removeClass("twentytwenty-before"),f.find(".img-"+l).addClass("twentytwenty-before").css("clip",c),a(".twentytwenty-before-label").find(".twentytwenty-label-content").text(f.data(l+"-label")),a(".imagify-c-level.go-left").attr("aria-hidden","true").removeClass("go-left go-right"),a(".imagify-level-"+l).attr("aria-hidden","false").addClass("go-left")),"right"===g&&(k.removeClass("twentytwenty-after"),f.find(".img-"+l).addClass("twentytwenty-after"),a(".twentytwenty-after-label").find(".twentytwenty-label-content").text(f.data(l+"-label")),a(".imagify-c-level.go-right").attr("aria-hidden","true").removeClass("go-left go-right"),a(".imagify-level-"+l).attr("aria-hidden","false").addClass("go-right")),e(a(".imagify-level-"+l).find(".imagify-chart").find("canvas")),!1})))}),a(".post-php").find(".wp_attachment_image").find(".thumbnail").length>0){var h,i,j=a(".post-php").find(".wp_attachment_image"),k=j.find(".thumbnail"),l={src:k.prop("src"),width:k.width(),height:k.height()},m={src:a("#imagify-full-original").val(),size:a("#imagify-full-original-size").val()},n=a("#misc-publishing-actions").find(".misc-pub-imagify").find(".button-primary");l.width>360&&a("#imagify-full-original").length>0&&""!==a("#imagify-full-original").val()?(h=a(".misc-pub-filesize").find("strong").text(),i=a(".imagify-data-item").find(".imagify-chart-value").text(),a('[id^="imgedit-open-btn-"]').before('<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-visual-comparison" id="imagify-start-comparison">'+imagifyTTT.labels.compare+"</button>"),g({width:l.width,height:l.height,originalUrl:m.src,optimizedUrl:l.src,originalSize:m.size,optimizedSize:h,saving:i,modalAppendTo:j,trigger:a("#imagify-start-comparison"),modalId:"imagify-visual-comparison"})):l.width<360&&a("#imagify-full-original").length>0&&""!==a("#imagify-full-original").val()||a("#imagify-full-original").length>0&&""===a("#imagify-full-original").val()||1===a("#misc-publishing-actions").find(".misc-pub-imagify").find(".button-primary").length&&(a('[id^="imgedit-open-btn-"]').before('<span class="spinner imagify-hidden"></span><a class="imagify-button-primary button-primary imagify-optimize-trigger" id="imagify-optimize-trigger" href="'+n.attr("href")+'">'+imagifyTTT.labels.optimize+"</a>"),a("#imagify-optimize-trigger").on("click",function(){a(this).prev(".spinner").removeClass("imagify-hidden").addClass("is-active")}))}if(a(".upload-php").find(".imagify-compare-images").length>0&&a(".imagify-compare-images").each(function(){var b=a(this),c=b.data("id"),d=b.closest("#post-"+c).find(".column-imagify_optimized_file");g({width:b.data("full-width"),height:b.data("full-height"),originalUrl:b.data("backup-src"),optimizedUrl:b.data("full-src"),originalSize:d.find(".original").text(),optimizedSize:d.find(".imagify-data-item").find(".big").text(),saving:d.find(".imagify-chart-value").text(),modalAppendTo:b.closest(".column-primary"),trigger:b,modalId:"imagify-comparison-"+c})}),a(".upload-php").length>0)var o=function(a){var b={};return c.location.href.replace(/[?&]+([^=&]+)=?([^&]*)?/gi,function(a,c,d){b[c]=void 0!==d?d:""}),a?b[a]?b[a]:null:b},p=function(){var b=setInterval(function(){var c;a(".media-modal").find(".imagify-datas-details").length&&(a("#imagify-original-src").length>0&&""!==a("#imagify-original-src")&&(a(".media-frame-content").find(".attachment-actions").prepend('<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-comparison-modal" id="imagify-media-frame-comparison-btn">'+imagifyTTT.labels.compare+"</button>"),c=a(".media-frame-content").find(".compat-field-imagify"),g({width:a("#imagify-full-width").val(),height:a("#imagify-full-height").val(),originalUrl:a("#imagify-original-src").val(),optimizedUrl:a("#imagify-full-src").val(),originalSize:a("#imagify-original-size").val(),optimizedSize:c.find(".imagify-data-item").find(".big").text(),saving:c.find(".imagify-chart-value").text(),modalAppendTo:a(".media-frame-content").find(".thumbnail-image"),trigger:a("#imagify-media-frame-comparison-btn"),modalId:"imagify-comparison-modal",openModal:!0})),clearInterval(b),b=null)},20)},q=setInterval(function(){a(".upload-php").find(".media-frame.mode-grid").find(".attachments").length&&(a(".upload-php").find(".media-frame.mode-grid").on("click",".attachment",function(){p()}),o("item")&&p(),clearInterval(q),q=null)},100)}(jQuery,document,window);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/options.js
CHANGED
@@ -1,103 +1,123 @@
|
|
1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
/*
|
3 |
* Process an API key check validity.
|
4 |
*/
|
5 |
var busy = false,
|
6 |
-
xhr
|
7 |
-
|
8 |
-
var concat = ajaxurl.indexOf("?") > 0 ? "&" : "?";
|
9 |
|
10 |
-
$('#imagify-settings #api_key').blur
|
11 |
-
var obj = $(this),
|
12 |
value = obj.val();
|
13 |
|
14 |
-
if( $.trim(value) === '' ) {
|
15 |
return false;
|
16 |
}
|
17 |
|
18 |
-
if( $('#check_api_key').val() === value ) {
|
19 |
-
$('#imagify-check-api-container').html('<span class="dashicons dashicons-yes"></span> ' + imagifyAdmin.labels.ValidApiKeyText);
|
20 |
return false;
|
21 |
}
|
22 |
|
23 |
if ( true === busy ) {
|
24 |
xhr.abort();
|
25 |
} else {
|
26 |
-
$('#imagify-check-api-container').remove();
|
27 |
-
obj.after( '<span id="imagify-check-api-container"><span class="imagify-spinner"></span>' + imagifyAdmin.labels.waitApiKeyCheckText +
|
28 |
}
|
29 |
|
30 |
busy = true;
|
31 |
|
32 |
-
xhr = $.get(ajaxurl+concat+
|
33 |
-
.done(function(response){
|
34 |
-
if( !response.success ) {
|
35 |
-
$('#imagify-check-api-container').html( '<span class="dashicons dashicons-no"></span> ' + response.data);
|
36 |
} else {
|
37 |
-
$('#imagify-check-api-container').remove();
|
38 |
-
swal({
|
39 |
-
title:
|
40 |
-
html:
|
41 |
-
type:
|
42 |
-
customClass:
|
43 |
-
}).then(
|
44 |
-
function(){
|
45 |
location.reload();
|
46 |
-
});
|
47 |
}
|
48 |
|
49 |
busy = false;
|
50 |
-
});
|
51 |
-
});
|
52 |
|
53 |
/**
|
54 |
-
* Check the boxes by clicking "labels" (aria-describedby items)
|
55 |
*/
|
56 |
-
$('.imagify-options-line').css('cursor', 'pointer').on('click', function(e){
|
57 |
-
if ( e.target.nodeName
|
58 |
return;
|
59 |
}
|
60 |
-
$('input[aria-describedby="' + $(this).attr('id') + '"]').trigger('click');
|
61 |
return false;
|
62 |
-
});
|
|
|
|
|
|
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
$(this).parent().next('td').find('input:checkbox').trigger('click');
|
67 |
}
|
68 |
-
})
|
69 |
|
70 |
/**
|
71 |
-
* Auto check on options-line input value change
|
72 |
*/
|
73 |
-
$('.imagify-options-line').find('input').on('change focus', function(){
|
74 |
-
var $checkbox = $(this).closest('.imagify-options-line').prev('label').prev('input');
|
|
|
75 |
if ( ! $checkbox[0].checked ) {
|
76 |
-
$checkbox.prop('checked', true);
|
77 |
}
|
78 |
-
});
|
79 |
|
80 |
/**
|
81 |
-
* Imagify Backup alert
|
82 |
*/
|
83 |
-
$('.imagify-settings-section').find('#backup').on('change', function(){
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
html: imagifyOptions.noBackupText,
|
89 |
-
type: "warning",
|
90 |
-
customClass: "imagify-sweet-alert",
|
91 |
-
showCancelButton: true,
|
92 |
-
cancelButtonText: imagifyAdmin.labels.swalCancel,
|
93 |
-
reverseButtons: true,
|
94 |
-
}).then(
|
95 |
-
function() {
|
96 |
-
},
|
97 |
-
function(dismiss){
|
98 |
-
$_this.prop('checked', true);
|
99 |
-
});
|
100 |
}
|
101 |
-
});
|
102 |
|
103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* globals ajaxurl: false, console: false, imagify: true, imagifyAdmin: true, imagifyOptions: true, swal: false */
|
2 |
+
|
3 |
+
window.imagify = window.imagify || {
|
4 |
+
concat: ajaxurl.indexOf( '?' ) > 0 ? '&' : '?',
|
5 |
+
log: function( content ) {
|
6 |
+
if ( undefined !== console ) {
|
7 |
+
console.log( content );
|
8 |
+
}
|
9 |
+
},
|
10 |
+
info: function( content ) {
|
11 |
+
if ( undefined !== console ) {
|
12 |
+
console.info( content );
|
13 |
+
}
|
14 |
+
}
|
15 |
+
};
|
16 |
+
|
17 |
+
(function($, d, w, undefined) {
|
18 |
/*
|
19 |
* Process an API key check validity.
|
20 |
*/
|
21 |
var busy = false,
|
22 |
+
xhr = false;
|
|
|
|
|
23 |
|
24 |
+
$( '#imagify-settings #api_key' ).on( 'blur', function() {
|
25 |
+
var obj = $( this ),
|
26 |
value = obj.val();
|
27 |
|
28 |
+
if ( $.trim( value ) === '' ) {
|
29 |
return false;
|
30 |
}
|
31 |
|
32 |
+
if ( $( '#check_api_key' ).val() === value ) {
|
33 |
+
$( '#imagify-check-api-container' ).html( '<span class="dashicons dashicons-yes"></span> ' + imagifyAdmin.labels.ValidApiKeyText );
|
34 |
return false;
|
35 |
}
|
36 |
|
37 |
if ( true === busy ) {
|
38 |
xhr.abort();
|
39 |
} else {
|
40 |
+
$( '#imagify-check-api-container' ).remove();
|
41 |
+
obj.after( '<span id="imagify-check-api-container"><span class="imagify-spinner"></span>' + imagifyAdmin.labels.waitApiKeyCheckText + '</span>' );
|
42 |
}
|
43 |
|
44 |
busy = true;
|
45 |
|
46 |
+
xhr = $.get( ajaxurl + imagify.concat + 'action=imagify_check_api_key_validity&api_key=' + obj.val() + '&imagifycheckapikeynonce=' + $( '#imagifycheckapikeynonce' ).val() )
|
47 |
+
.done( function( response ) {
|
48 |
+
if ( ! response.success ) {
|
49 |
+
$( '#imagify-check-api-container' ).html( '<span class="dashicons dashicons-no"></span> ' + response.data );
|
50 |
} else {
|
51 |
+
$( '#imagify-check-api-container' ).remove();
|
52 |
+
swal( {
|
53 |
+
title: imagifyAdmin.labels.ApiKeyCheckSuccessTitle,
|
54 |
+
html: imagifyAdmin.labels.ApiKeyCheckSuccessText,
|
55 |
+
type: 'success',
|
56 |
+
customClass: 'imagify-sweet-alert'
|
57 |
+
} ).then(
|
58 |
+
function() {
|
59 |
location.reload();
|
60 |
+
} );
|
61 |
}
|
62 |
|
63 |
busy = false;
|
64 |
+
} );
|
65 |
+
} );
|
66 |
|
67 |
/**
|
68 |
+
* Check the boxes by clicking "labels" (aria-describedby items).
|
69 |
*/
|
70 |
+
$( '.imagify-options-line' ).css( 'cursor', 'pointer' ).on( 'click', function( e ) {
|
71 |
+
if ( 'INPUT' === e.target.nodeName ) {
|
72 |
return;
|
73 |
}
|
74 |
+
$( 'input[aria-describedby="' + $( this ).attr( 'id' ) + '"]' ).trigger( 'click' );
|
75 |
return false;
|
76 |
+
} );
|
77 |
+
|
78 |
+
$( '.imagify-settings th span' ).on( 'click', function() {
|
79 |
+
var $input = $( this ).parent().next( 'td' ).find( 'input:checkbox' );
|
80 |
|
81 |
+
if ( $input.length === 1 ) {
|
82 |
+
$input.trigger( 'click' );
|
|
|
83 |
}
|
84 |
+
} );
|
85 |
|
86 |
/**
|
87 |
+
* Auto check on options-line input value change.
|
88 |
*/
|
89 |
+
$( '.imagify-options-line' ).find( 'input' ).on( 'change focus', function() {
|
90 |
+
var $checkbox = $( this ).closest( '.imagify-options-line' ).prev( 'label' ).prev( 'input' );
|
91 |
+
|
92 |
if ( ! $checkbox[0].checked ) {
|
93 |
+
$checkbox.prop( 'checked', true );
|
94 |
}
|
95 |
+
} );
|
96 |
|
97 |
/**
|
98 |
+
* Imagify Backup alert.
|
99 |
*/
|
100 |
+
$( '.imagify-settings-section' ).find( '#backup' ).on( 'change', function() {
|
101 |
+
var $_this = $( this );
|
102 |
+
|
103 |
+
if ( $_this.is( ':checked' ) ) {
|
104 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
}
|
|
|
106 |
|
107 |
+
swal( {
|
108 |
+
title: imagifyOptions.noBackupTitle,
|
109 |
+
html: imagifyOptions.noBackupText,
|
110 |
+
type: 'warning',
|
111 |
+
customClass: 'imagify-sweet-alert',
|
112 |
+
showCancelButton: true,
|
113 |
+
cancelButtonText: imagifyAdmin.labels.swalCancel,
|
114 |
+
reverseButtons: true
|
115 |
+
} ).then(
|
116 |
+
function() {},
|
117 |
+
function() {
|
118 |
+
$_this.prop( 'checked', true );
|
119 |
+
}
|
120 |
+
);
|
121 |
+
} );
|
122 |
+
|
123 |
+
} )(jQuery, document, window);
|
assets/js/options.min.js
CHANGED
@@ -1,4 +1 @@
|
|
1 |
-
|
2 |
-
"</span>"));c=!0;d=a.get(ajaxurl+f+"action=imagify_check_api_key_validity&api_key="+b.val()+"&imagifycheckapikeynonce="+a("#imagifycheckapikeynonce").val()).done(function(b){b.success?(a("#imagify-check-api-container").remove(),swal({title:imagifyAdmin.labels.ApiKeyCheckSuccessTitle,html:imagifyAdmin.labels.ApiKeyCheckSuccessText,type:"success",customClass:"imagify-sweet-alert"}).then(function(){location.reload()})):a("#imagify-check-api-container").html('<span class="dashicons dashicons-no"></span> '+
|
3 |
-
b.data);c=!1})});a(".imagify-options-line").css("cursor","pointer").on("click",function(b){if("INPUT"!==b.target.nodeName)return a('input[aria-describedby="'+a(this).attr("id")+'"]').trigger("click"),!1});a(".imagify-settings th span").on("click",function(b){1===a(this).parent().next("td").find("input:checkbox").length&&a(this).parent().next("td").find("input:checkbox").trigger("click")});a(".imagify-options-line").find("input").on("change focus",function(){var b=a(this).closest(".imagify-options-line").prev("label").prev("input");
|
4 |
-
b[0].checked||b.prop("checked",!0)});a(".imagify-settings-section").find("#backup").on("change",function(){if(!a(this).is(":checked")){var b=a(this);swal({title:imagifyOptions.noBackupTitle,html:imagifyOptions.noBackupText,type:"warning",customClass:"imagify-sweet-alert",showCancelButton:!0,cancelButtonText:imagifyAdmin.labels.swalCancel,reverseButtons:!0}).then(function(){},function(a){b.prop("checked",!0)})}})});
|
1 |
+
window.imagify=window.imagify||{concat:ajaxurl.indexOf("?")>0?"&":"?",log:function(a){void 0!==console&&console.log(a)},info:function(a){void 0!==console&&console.info(a)}},function(a,b,c,d){var e=!1,f=!1;a("#imagify-settings #api_key").on("blur",function(){var b=a(this),c=b.val();return""!==a.trim(c)&&(a("#check_api_key").val()===c?(a("#imagify-check-api-container").html('<span class="dashicons dashicons-yes"></span> '+imagifyAdmin.labels.ValidApiKeyText),!1):(!0===e?f.abort():(a("#imagify-check-api-container").remove(),b.after('<span id="imagify-check-api-container"><span class="imagify-spinner"></span>'+imagifyAdmin.labels.waitApiKeyCheckText+"</span>")),e=!0,void(f=a.get(ajaxurl+imagify.concat+"action=imagify_check_api_key_validity&api_key="+b.val()+"&imagifycheckapikeynonce="+a("#imagifycheckapikeynonce").val()).done(function(b){b.success?(a("#imagify-check-api-container").remove(),swal({title:imagifyAdmin.labels.ApiKeyCheckSuccessTitle,html:imagifyAdmin.labels.ApiKeyCheckSuccessText,type:"success",customClass:"imagify-sweet-alert"}).then(function(){location.reload()})):a("#imagify-check-api-container").html('<span class="dashicons dashicons-no"></span> '+b.data),e=!1}))))}),a(".imagify-options-line").css("cursor","pointer").on("click",function(b){if("INPUT"!==b.target.nodeName)return a('input[aria-describedby="'+a(this).attr("id")+'"]').trigger("click"),!1}),a(".imagify-settings th span").on("click",function(){var b=a(this).parent().next("td").find("input:checkbox");1===b.length&&b.trigger("click")}),a(".imagify-options-line").find("input").on("change focus",function(){var b=a(this).closest(".imagify-options-line").prev("label").prev("input");b[0].checked||b.prop("checked",!0)}),a(".imagify-settings-section").find("#backup").on("change",function(){var b=a(this);b.is(":checked")||swal({title:imagifyOptions.noBackupTitle,html:imagifyOptions.noBackupText,type:"warning",customClass:"imagify-sweet-alert",showCancelButton:!0,cancelButtonText:imagifyAdmin.labels.swalCancel,reverseButtons:!0}).then(function(){},function(){b.prop("checked",!0)})})}(jQuery,document,window);
|
|
|
|
|
|
assets/js/upload.js
CHANGED
@@ -1,157 +1,188 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
*/
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
|
19 |
-
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
-
e.preventDefault();
|
24 |
-
|
25 |
-
action = value[2];
|
26 |
-
ids = $('input[name^="media"]:checked').map( function(){
|
27 |
-
return this.value;
|
28 |
-
}).get();
|
29 |
-
|
30 |
-
ids.forEach( function( id, index ) {
|
31 |
-
setTimeout(function(){
|
32 |
-
$('#imagify-' + action + '-' + id ).trigger('click');
|
33 |
-
}, index*300);
|
34 |
-
});
|
35 |
-
|
36 |
-
});
|
37 |
-
|
38 |
-
/*
|
39 |
-
* Process to one of these actions: restore, optimize or re-optimize
|
40 |
-
*/
|
41 |
-
$(document).on('click', '.button-imagify-restore, .button-imagify-manual-upload, .button-imagify-manual-override-upload', function(e){
|
42 |
e.preventDefault();
|
43 |
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
|
48 |
-
$parent.html('<div class="button"><span class="imagify-spinner"></span>' + $obj.data('waiting-label') + '</div>');
|
49 |
|
50 |
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) )
|
51 |
.done( function( response ){
|
52 |
$parent.html( response.data );
|
53 |
-
$parent.find('.imagify-datas-more-action a').addClass('is-open').find('.the-text').text( $parent.find('.imagify-datas-more-action a').data('close') );
|
54 |
-
$parent.find('.imagify-datas-details').addClass('is-open');
|
55 |
-
|
56 |
-
draw_me_a_chart( $parent.find('.imagify-chart-container').find('canvas') );
|
57 |
} );
|
58 |
} );
|
59 |
|
60 |
-
|
61 |
-
* Toggle slide in custom column
|
62 |
*/
|
63 |
-
$('.imagify-datas-details').hide();
|
64 |
|
65 |
-
$(
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
$(this
|
|
|
73 |
}
|
74 |
return false;
|
75 |
-
});
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
}
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
tempTimer = null;
|
101 |
-
}
|
102 |
-
}, 20 );
|
103 |
-
};
|
104 |
-
|
105 |
-
// Intercept the right moment if media details is clicked (mode grid)
|
106 |
-
// Bear Feint
|
107 |
-
|
108 |
-
$('.upload-php').find('.media-frame.mode-grid').on('click', '.attachment', function(){
|
109 |
check_modal();
|
110 |
-
});
|
111 |
|
112 |
-
// On page load in upload.php check if item param exists
|
113 |
-
if ( $('.upload-php').length
|
114 |
check_modal();
|
115 |
}
|
116 |
|
117 |
-
// On media clicked
|
118 |
-
$('#insert-media-button').on('click.imagify', function() {
|
119 |
var waitContent = setInterval( function() {
|
120 |
-
|
121 |
-
|
|
|
|
|
122 |
check_modal();
|
123 |
-
});
|
124 |
-
clearInterval(waitContent);
|
|
|
125 |
}
|
126 |
}, 100);
|
127 |
-
});
|
128 |
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
* @param {element} canvas
|
133 |
-
*/
|
134 |
-
function draw_me_a_chart( canvas ) {
|
135 |
-
canvas.each(function(){
|
136 |
-
|
137 |
-
var the_value = parseInt( $(this).closest('.imagify-chart').next('.imagify-chart-value').text() ),
|
138 |
-
overviewData = [
|
139 |
-
{
|
140 |
-
value: the_value,
|
141 |
-
color: '#00B3D3'
|
142 |
-
},
|
143 |
-
{
|
144 |
-
value: 100 - the_value,
|
145 |
-
color: '#D8D8D8'
|
146 |
-
}
|
147 |
-
],
|
148 |
-
overviewDoughnut = new Chart( $(this)[0].getContext('2d')).Doughnut(overviewData, {
|
149 |
-
segmentStrokeColor : '#FFF',
|
150 |
-
segmentStrokeWidth : 1,
|
151 |
-
animateRotate : true,
|
152 |
-
tooltipEvents : []
|
153 |
-
});
|
154 |
-
});
|
155 |
-
}
|
156 |
-
draw_me_a_chart( $('.imagify-chart-container').find('canvas') );
|
157 |
-
});
|
1 |
+
/* globals ajaxurl: false, console: false, imagifyUpload: true, Chart: false */
|
2 |
+
|
3 |
+
window.imagify = window.imagify || {
|
4 |
+
concat: ajaxurl.indexOf( '?' ) > 0 ? '&' : '?',
|
5 |
+
log: function( content ) {
|
6 |
+
if ( undefined !== console ) {
|
7 |
+
console.log( content );
|
8 |
+
}
|
9 |
+
},
|
10 |
+
info: function( content ) {
|
11 |
+
if ( undefined !== console ) {
|
12 |
+
console.info( content );
|
13 |
+
}
|
14 |
+
}
|
15 |
+
};
|
16 |
+
|
17 |
+
(function($, d, w, undefined) {
|
18 |
+
/**
|
19 |
+
* Add a "Imagify'em all" in the select list.
|
20 |
*/
|
21 |
+
var bulk_opt, get_var, check_modal;
|
22 |
+
|
23 |
+
bulk_opt = '<option value="imagify-bulk-upload">' + imagifyUpload.bulkActionsLabels.optimize + '</option>';
|
24 |
+
bulk_opt += '<option value="imagify-bulk-restore">' + imagifyUpload.bulkActionsLabels.restore + '</option>';
|
25 |
|
26 |
+
$( '.bulkactions select[name="action"]' ).find( 'option:last-child' ).before( bulk_opt );
|
27 |
+
$( '.bulkactions select[name="action2"]' ).find( 'option:last-child' ).before( bulk_opt );
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Mini chart.
|
31 |
+
*
|
32 |
+
* @param {element} canvas
|
33 |
+
*/
|
34 |
+
function draw_me_a_chart( canvas ) {
|
35 |
+
canvas.each( function() {
|
36 |
+
var the_value = parseInt( $( this ).closest( '.imagify-chart' ).next( '.imagify-chart-value' ).text() ),
|
37 |
+
overviewData = [
|
38 |
+
{
|
39 |
+
value: the_value,
|
40 |
+
color: '#00B3D3'
|
41 |
+
},
|
42 |
+
{
|
43 |
+
value: 100 - the_value,
|
44 |
+
color: '#D8D8D8'
|
45 |
}
|
46 |
+
];
|
47 |
+
|
48 |
+
new Chart( $( this )[0].getContext( '2d' ) ).Doughnut( overviewData, {
|
49 |
+
segmentStrokeColor : '#FFF',
|
50 |
+
segmentStrokeWidth : 1,
|
51 |
+
animateRotate : true,
|
52 |
+
tooltipEvents : []
|
53 |
+
} );
|
54 |
+
} );
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Process optimization for all selected images.
|
59 |
+
*/
|
60 |
+
$( '#doaction' )
|
61 |
+
.add( '#doaction2' )
|
62 |
+
.on( 'click', function( e ) {
|
63 |
+
var value = $( this ).prev( 'select' ).val().split( '-' ),
|
64 |
+
action, ids;
|
65 |
+
|
66 |
+
if ( value[0] !== 'imagify' ) {
|
67 |
+
return;
|
68 |
+
}
|
69 |
+
|
70 |
+
e.preventDefault();
|
71 |
+
|
72 |
+
action = value[2];
|
73 |
+
ids = $( 'input[name^="media"]:checked' ).map( function() {
|
74 |
+
return this.value;
|
75 |
+
} ).get();
|
76 |
+
|
77 |
+
ids.forEach( function( id, index ) {
|
78 |
+
setTimeout( function() {
|
79 |
+
$( '#imagify-' + action + '-' + id ).trigger( 'click' );
|
80 |
+
}, index * 300 );
|
81 |
+
} );
|
82 |
+
} );
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Process to one of these actions: restore, optimize or re-optimize.
|
86 |
+
*/
|
87 |
+
$( d ).on( 'click', '.button-imagify-restore, .button-imagify-manual-upload, .button-imagify-manual-override-upload', function( e ) {
|
88 |
+
var $obj = $( this ),
|
89 |
+
$parent = $obj.parents( '.column-imagify_optimized_file, .compat-field-imagify .field' ),
|
90 |
+
href = $obj.attr( 'href' );
|
91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
e.preventDefault();
|
93 |
|
94 |
+
if ( ! $parent.length ) {
|
95 |
+
$parent = $obj.closest( '.column' );
|
96 |
+
}
|
97 |
|
98 |
+
$parent.html( '<div class="button"><span class="imagify-spinner"></span>' + $obj.data( 'waiting-label' ) + '</div>' );
|
99 |
|
100 |
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) )
|
101 |
.done( function( response ){
|
102 |
$parent.html( response.data );
|
103 |
+
$parent.find( '.imagify-datas-more-action a' ).addClass( 'is-open' ).find( '.the-text' ).text( $parent.find( '.imagify-datas-more-action a' ).data( 'close' ) );
|
104 |
+
$parent.find( '.imagify-datas-details' ).addClass( 'is-open' );
|
105 |
+
|
106 |
+
draw_me_a_chart( $parent.find( '.imagify-chart-container' ).find( 'canvas' ) );
|
107 |
} );
|
108 |
} );
|
109 |
|
110 |
+
/**
|
111 |
+
* Toggle slide in custom column.
|
112 |
*/
|
113 |
+
$( '.imagify-datas-details' ).hide();
|
114 |
|
115 |
+
$( d ).on( 'click', '.imagify-datas-more-action a', function() {
|
116 |
+
var $this = $( this );
|
117 |
+
|
118 |
+
if ( $this.hasClass( 'is-open' ) ) {
|
119 |
+
$( $this.attr( 'href' ) ).slideUp( 300 ).removeClass( 'is-open' );
|
120 |
+
$this.removeClass( 'is-open' ).find( '.the-text' ).text( $this.data( 'open' ) );
|
121 |
+
} else {
|
122 |
+
$( $this.attr( 'href' ) ).slideDown( 300 ).addClass( 'is-open' );
|
123 |
+
$this.addClass( 'is-open' ).find( '.the-text' ).text( $this.data( 'close' ) );
|
124 |
}
|
125 |
return false;
|
126 |
+
} );
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Some usefull functions to help us with media modal.
|
130 |
+
*/
|
131 |
+
get_var = function ( param ) {
|
132 |
+
var vars = {};
|
133 |
+
|
134 |
+
w.location.href.replace( /[?&]+([^=&]+)=?([^&]*)?/gi, function( m, key, value ) {
|
135 |
+
vars[ key ] = undefined !== value ? value : '';
|
136 |
+
} );
|
137 |
+
|
138 |
+
if ( param ) {
|
139 |
+
return vars[ param ] ? vars[ param ] : null;
|
140 |
+
}
|
141 |
+
|
142 |
+
return vars;
|
143 |
+
};
|
144 |
+
|
145 |
+
check_modal = function() {
|
146 |
+
var tempTimer = setInterval( function() {
|
147 |
+
var $details = $( '.media-modal .imagify-datas-details' );
|
148 |
+
|
149 |
+
if ( $details.length ) {
|
150 |
+
$details.hide();
|
151 |
+
draw_me_a_chart( $( '#imagify-consumption-chart' ) );
|
152 |
+
clearInterval( tempTimer );
|
153 |
+
tempTimer = null;
|
154 |
}
|
155 |
+
}, 20 );
|
156 |
+
};
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Intercept the right moment if media details is clicked (mode grid).
|
160 |
+
* Bear Feint.
|
161 |
+
*/
|
162 |
+
$( '.upload-php' ).find( '.media-frame.mode-grid' ).on( 'click', '.attachment', function() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
check_modal();
|
164 |
+
} );
|
165 |
|
166 |
+
// On page load in upload.php check if item param exists.
|
167 |
+
if ( $( '.upload-php' ).length && get_var( 'item' ) ) {
|
168 |
check_modal();
|
169 |
}
|
170 |
|
171 |
+
// On media clicked.
|
172 |
+
$( '#insert-media-button' ).on( 'click.imagify', function() {
|
173 |
var waitContent = setInterval( function() {
|
174 |
+
var $attachments = $( '.media-frame-content .attachments' );
|
175 |
+
|
176 |
+
if ( $attachments.length ) {
|
177 |
+
$attachments.on( 'click.imagify', '.attachment', function() {
|
178 |
check_modal();
|
179 |
+
} );
|
180 |
+
clearInterval( waitContent );
|
181 |
+
waitContent = null;
|
182 |
}
|
183 |
}, 100);
|
184 |
+
} );
|
185 |
|
186 |
+
draw_me_a_chart( $( '.imagify-chart-container' ).find( 'canvas' ) );
|
187 |
+
|
188 |
+
} )(jQuery, document, window);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/js/upload.min.js
CHANGED
@@ -1,6 +1 @@
|
|
1 |
-
|
2 |
-
"</option>");a('.bulkactions select[name="action"]').find("option:last-child").before(c);a('.bulkactions select[name="action2"]').find("option:last-child").before(c);a("#doaction").add("#doaction2").on("click",function(b){value=a(this).prev("select").val();value=value.split("-");"imagify"===value[0]&&(b.preventDefault(),action=value[2],ids=a('input[name^="media"]:checked').map(function(){return this.value}).get(),ids.forEach(function(b,c){setTimeout(function(){a("#imagify-"+action+"-"+b).trigger("click")},
|
3 |
-
300*c)}))});a(document).on("click",".button-imagify-restore, .button-imagify-manual-upload, .button-imagify-manual-override-upload",function(b){b.preventDefault();b=a(this);var d=b.parents(".column-imagify_optimized_file, .compat-field-imagify .field").length?b.parents(".column-imagify_optimized_file, .compat-field-imagify .field"):b.closest(".column"),c=b.attr("href");d.html('<div class="button"><span class="imagify-spinner"></span>'+b.data("waiting-label")+"</div>");a.get(c.replace("admin-post.php",
|
4 |
-
"admin-ajax.php")).done(function(a){d.html(a.data);d.find(".imagify-datas-more-action a").addClass("is-open").find(".the-text").text(d.find(".imagify-datas-more-action a").data("close"));d.find(".imagify-datas-details").addClass("is-open");e(d.find(".imagify-chart-container").find("canvas"))})});a(".imagify-datas-details").hide();a(document).on("click",".imagify-datas-more-action a",function(){a(this).hasClass("is-open")?(a(a(this).attr("href")).slideUp("300").removeClass("is-open"),a(this).removeClass("is-open").find(".the-text").text(a(this).data("open"))):
|
5 |
-
(a(a(this).attr("href")).slideDown("300").addClass("is-open"),a(this).addClass("is-open").find(".the-text").text(a(this).data("close")));return!1});var c=function(a){var d={};window.location.href.replace(/[?&]+([^=&]+)=?([^&]*)?/gi,function(a,b,c){d[b]=void 0!==c?c:""});return a?d[a]?d[a]:null:d},f=function(){var b=setInterval(function(){a(".media-modal").find(".imagify-datas-details").length&&(a(".media-modal").find(".imagify-datas-details").hide(),e(a(".media-modal").find("#imagify-consumption-chart")),
|
6 |
-
clearInterval(b),b=null)},20)};a(".upload-php").find(".media-frame.mode-grid").on("click",".attachment",function(){f()});0<a(".upload-php").length&&c("item")&&f();a("#insert-media-button").on("click.imagify",function(){var b=setInterval(function(){0<a(".media-frame-content").find(".attachments").length&&(a(".media-frame-content").find(".attachments").on("click.imagify",".attachment",function(){f()}),clearInterval(b))},100)});e(a(".imagify-chart-container").find("canvas"))});
|
1 |
+
window.imagify=window.imagify||{concat:ajaxurl.indexOf("?")>0?"&":"?",log:function(a){void 0!==console&&console.log(a)},info:function(a){void 0!==console&&console.info(a)}},function(a,b,c,d){function e(b){b.each(function(){var b=parseInt(a(this).closest(".imagify-chart").next(".imagify-chart-value").text()),c=[{value:b,color:"#00B3D3"},{value:100-b,color:"#D8D8D8"}];new Chart(a(this)[0].getContext("2d")).Doughnut(c,{segmentStrokeColor:"#FFF",segmentStrokeWidth:1,animateRotate:!0,tooltipEvents:[]})})}var f,g,h;f='<option value="imagify-bulk-upload">'+imagifyUpload.bulkActionsLabels.optimize+"</option>",f+='<option value="imagify-bulk-restore">'+imagifyUpload.bulkActionsLabels.restore+"</option>",a('.bulkactions select[name="action"]').find("option:last-child").before(f),a('.bulkactions select[name="action2"]').find("option:last-child").before(f),a("#doaction").add("#doaction2").on("click",function(b){var c,d,e=a(this).prev("select").val().split("-");"imagify"===e[0]&&(b.preventDefault(),c=e[2],d=a('input[name^="media"]:checked').map(function(){return this.value}).get(),d.forEach(function(b,d){setTimeout(function(){a("#imagify-"+c+"-"+b).trigger("click")},300*d)}))}),a(b).on("click",".button-imagify-restore, .button-imagify-manual-upload, .button-imagify-manual-override-upload",function(b){var c=a(this),d=c.parents(".column-imagify_optimized_file, .compat-field-imagify .field"),f=c.attr("href");b.preventDefault(),d.length||(d=c.closest(".column")),d.html('<div class="button"><span class="imagify-spinner"></span>'+c.data("waiting-label")+"</div>"),a.get(f.replace("admin-post.php","admin-ajax.php")).done(function(a){d.html(a.data),d.find(".imagify-datas-more-action a").addClass("is-open").find(".the-text").text(d.find(".imagify-datas-more-action a").data("close")),d.find(".imagify-datas-details").addClass("is-open"),e(d.find(".imagify-chart-container").find("canvas"))})}),a(".imagify-datas-details").hide(),a(b).on("click",".imagify-datas-more-action a",function(){var b=a(this);return b.hasClass("is-open")?(a(b.attr("href")).slideUp(300).removeClass("is-open"),b.removeClass("is-open").find(".the-text").text(b.data("open"))):(a(b.attr("href")).slideDown(300).addClass("is-open"),b.addClass("is-open").find(".the-text").text(b.data("close"))),!1}),g=function(a){var b={};return c.location.href.replace(/[?&]+([^=&]+)=?([^&]*)?/gi,function(a,c,d){b[c]=void 0!==d?d:""}),a?b[a]?b[a]:null:b},h=function(){var b=setInterval(function(){var c=a(".media-modal .imagify-datas-details");c.length&&(c.hide(),e(a("#imagify-consumption-chart")),clearInterval(b),b=null)},20)},a(".upload-php").find(".media-frame.mode-grid").on("click",".attachment",function(){h()}),a(".upload-php").length&&g("item")&&h(),a("#insert-media-button").on("click.imagify",function(){var b=setInterval(function(){var c=a(".media-frame-content .attachments");c.length&&(c.on("click.imagify",".attachment",function(){h()}),clearInterval(b),b=null)},100)}),e(a(".imagify-chart-container").find("canvas"))}(jQuery,document,window);
|
|
|
|
|
|
|
|
|
|
contributors.txt
CHANGED
@@ -6,7 +6,8 @@ Developers:
|
|
6 |
Geoffrey Crofte <geoffrey@wp-media.me>
|
7 |
Sébastien Decamme <sebastien@wp-media.me>
|
8 |
Julio Potier <julio@wp-media.me>
|
9 |
-
Caspar
|
|
|
10 |
Grégory Viguier <gregory@wp-rocket.me>
|
11 |
|
12 |
Interface Design:
|
@@ -16,4 +17,4 @@ Interface Design:
|
|
16 |
Translation:
|
17 |
Alice Orrù (Italian & Spanish) <alice@wp-rocket.me>
|
18 |
Caspar Hübinger (German) <caspar@wp-rocket.me>
|
19 |
-
Lucy Beer (English) <lucy@wp-rocket.me>
|
6 |
Geoffrey Crofte <geoffrey@wp-media.me>
|
7 |
Sébastien Decamme <sebastien@wp-media.me>
|
8 |
Julio Potier <julio@wp-media.me>
|
9 |
+
Caspar Hübinger <caspar@wp-rocket.me>
|
10 |
+
Remy Perona <remy@wp-rocket.me>
|
11 |
Grégory Viguier <gregory@wp-rocket.me>
|
12 |
|
13 |
Interface Design:
|
17 |
Translation:
|
18 |
Alice Orrù (Italian & Spanish) <alice@wp-rocket.me>
|
19 |
Caspar Hübinger (German) <caspar@wp-rocket.me>
|
20 |
+
Lucy Beer (English) <lucy@wp-rocket.me>
|
imagify.php
CHANGED
@@ -1,37 +1,37 @@
|
|
1 |
<?php
|
2 |
-
|
3 |
-
Plugin Name: Imagify
|
4 |
-
Plugin URI: https://wordpress.org/plugins/imagify/
|
5 |
-
Description: Dramaticaly reduce image file sizes without losing quality, make your website load faster, boost your SEO and save money on your
|
6 |
-
Version: 1.6.
|
7 |
-
Author: WP Media
|
8 |
-
Author URI: http://wp-media.me
|
9 |
-
Licence: GPLv2
|
10 |
-
|
11 |
-
Text Domain: imagify
|
12 |
-
Domain Path: languages
|
13 |
-
|
14 |
-
Copyright
|
15 |
-
*/
|
16 |
|
17 |
-
defined( 'ABSPATH' )
|
18 |
|
19 |
-
// Imagify defines
|
20 |
-
define( 'IMAGIFY_VERSION'
|
21 |
-
define( 'IMAGIFY_SLUG'
|
22 |
-
define( 'IMAGIFY_SETTINGS_SLUG'
|
23 |
-
define( 'IMAGIFY_WEB_MAIN'
|
24 |
-
define( 'IMAGIFY_APP_MAIN'
|
25 |
define( 'IMAGIFY_PAYMENT_URL' , IMAGIFY_APP_MAIN . '/#/plugin/' );
|
26 |
-
define( 'IMAGIFY_FILE'
|
27 |
-
define( 'IMAGIFY_PATH'
|
28 |
-
define( 'IMAGIFY_INC_PATH'
|
29 |
-
define( 'IMAGIFY_API_PATH'
|
30 |
-
define( 'IMAGIFY_ADMIN_PATH'
|
31 |
-
define( 'IMAGIFY_ADMIN_UI_PATH'
|
32 |
-
define( 'IMAGIFY_COMMON_PATH'
|
33 |
-
define( 'IMAGIFY_FUNCTIONS_PATH'
|
34 |
-
define( 'IMAGIFY_CLASSES_PATH'
|
35 |
define( 'IMAGIFY_CLASSES_ABSTRACTS_PATH' , realpath( IMAGIFY_CLASSES_PATH . 'abstracts' ) . '/' );
|
36 |
define( 'IMAGIFY_3RD_PARTY_PATH' , realpath( IMAGIFY_INC_PATH . '3rd-party' ) . '/' );
|
37 |
define( 'IMAGIFY_URL' , plugin_dir_url( IMAGIFY_FILE ) );
|
@@ -43,62 +43,65 @@ define( 'IMAGIFY_ASSETS_CSS_URL' , IMAGIFY_ASSETS_URL . 'css/' );
|
|
43 |
define( 'IMAGIFY_ASSETS_IMG_URL' , IMAGIFY_ASSETS_URL . 'images/' );
|
44 |
define( 'IMAGIFY_MAX_BYTES' , 5242880 );
|
45 |
|
46 |
-
|
47 |
-
|
|
|
48 |
*
|
49 |
* @since 1.0
|
50 |
*/
|
51 |
-
add_action( 'plugins_loaded', '_imagify_init' );
|
52 |
function _imagify_init() {
|
53 |
-
|
54 |
-
|
55 |
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
|
|
|
|
|
|
81 |
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
*/
|
103 |
do_action( 'imagify_loaded' );
|
104 |
}
|
1 |
<?php
|
2 |
+
/**
|
3 |
+
* Plugin Name: Imagify
|
4 |
+
* Plugin URI: https://wordpress.org/plugins/imagify/
|
5 |
+
* Description: Dramaticaly 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.
|
6 |
+
* Version: 1.6.5
|
7 |
+
* Author: WP Media
|
8 |
+
* Author URI: http://wp-media.me
|
9 |
+
* Licence: GPLv2
|
10 |
+
*
|
11 |
+
* Text Domain: imagify
|
12 |
+
* Domain Path: languages
|
13 |
+
*
|
14 |
+
* Copyright 2017 WP Media
|
15 |
+
*/
|
16 |
|
17 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
18 |
|
19 |
+
// Imagify defines.
|
20 |
+
define( 'IMAGIFY_VERSION' , '1.6.5' );
|
21 |
+
define( 'IMAGIFY_SLUG' , 'imagify' );
|
22 |
+
define( 'IMAGIFY_SETTINGS_SLUG' , IMAGIFY_SLUG . '_settings' );
|
23 |
+
define( 'IMAGIFY_WEB_MAIN' , 'https://imagify.io' );
|
24 |
+
define( 'IMAGIFY_APP_MAIN' , 'https://app.imagify.io' );
|
25 |
define( 'IMAGIFY_PAYMENT_URL' , IMAGIFY_APP_MAIN . '/#/plugin/' );
|
26 |
+
define( 'IMAGIFY_FILE' , __FILE__ );
|
27 |
+
define( 'IMAGIFY_PATH' , realpath( plugin_dir_path( IMAGIFY_FILE ) ) . '/' );
|
28 |
+
define( 'IMAGIFY_INC_PATH' , realpath( IMAGIFY_PATH . 'inc/' ) . '/' );
|
29 |
+
define( 'IMAGIFY_API_PATH' , realpath( IMAGIFY_INC_PATH . 'api/' ) . '/' );
|
30 |
+
define( 'IMAGIFY_ADMIN_PATH' , realpath( IMAGIFY_INC_PATH . 'admin' ) . '/' );
|
31 |
+
define( 'IMAGIFY_ADMIN_UI_PATH' , realpath( IMAGIFY_ADMIN_PATH . 'ui' ) . '/' );
|
32 |
+
define( 'IMAGIFY_COMMON_PATH' , realpath( IMAGIFY_INC_PATH . 'common' ) . '/' );
|
33 |
+
define( 'IMAGIFY_FUNCTIONS_PATH' , realpath( IMAGIFY_INC_PATH . 'functions' ) . '/' );
|
34 |
+
define( 'IMAGIFY_CLASSES_PATH' , realpath( IMAGIFY_INC_PATH . 'classes' ) . '/' );
|
35 |
define( 'IMAGIFY_CLASSES_ABSTRACTS_PATH' , realpath( IMAGIFY_CLASSES_PATH . 'abstracts' ) . '/' );
|
36 |
define( 'IMAGIFY_3RD_PARTY_PATH' , realpath( IMAGIFY_INC_PATH . '3rd-party' ) . '/' );
|
37 |
define( 'IMAGIFY_URL' , plugin_dir_url( IMAGIFY_FILE ) );
|
43 |
define( 'IMAGIFY_ASSETS_IMG_URL' , IMAGIFY_ASSETS_URL . 'images/' );
|
44 |
define( 'IMAGIFY_MAX_BYTES' , 5242880 );
|
45 |
|
46 |
+
add_action( 'plugins_loaded', '_imagify_init' );
|
47 |
+
/**
|
48 |
+
* Tell WP what to do when plugin is loaded.
|
49 |
*
|
50 |
* @since 1.0
|
51 |
*/
|
|
|
52 |
function _imagify_init() {
|
53 |
+
// Load translations.
|
54 |
+
load_plugin_textdomain( 'imagify', false, dirname( plugin_basename( IMAGIFY_FILE ) ) . '/languages/' );
|
55 |
|
56 |
+
// Nothing to do if autosave.
|
57 |
+
if ( defined( 'DOING_AUTOSAVE' ) ) {
|
58 |
+
return;
|
59 |
+
}
|
60 |
|
61 |
+
require( IMAGIFY_INC_PATH . 'compat.php' );
|
62 |
+
require( IMAGIFY_API_PATH . 'imagify.php' );
|
63 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'deprecated.php' );
|
64 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'common.php' );
|
65 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'options.php' );
|
66 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'formatting.php' );
|
67 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'files.php' );
|
68 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'admin.php' );
|
69 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'api.php' );
|
70 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'attachments.php' );
|
71 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'process.php' );
|
72 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'admin-ui.php' );
|
73 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'admin-stats.php' );
|
74 |
+
require( IMAGIFY_FUNCTIONS_PATH . 'i18n.php' );
|
75 |
+
require( IMAGIFY_CLASSES_ABSTRACTS_PATH . 'class-imagify-abstract-db.php' );
|
76 |
+
require( IMAGIFY_CLASSES_ABSTRACTS_PATH . 'class-imagify-abstract-attachment.php' );
|
77 |
+
require( IMAGIFY_CLASSES_PATH . 'class-imagify.php' );
|
78 |
+
require( IMAGIFY_CLASSES_PATH . 'class-imagify-user.php' );
|
79 |
+
require( IMAGIFY_CLASSES_PATH . 'class-imagify-attachment.php' );
|
80 |
+
require( IMAGIFY_COMMON_PATH . 'attachments.php' );
|
81 |
+
require( IMAGIFY_COMMON_PATH . 'admin-bar.php' );
|
82 |
+
require( IMAGIFY_COMMON_PATH . 'cron.php' );
|
83 |
+
require( IMAGIFY_3RD_PARTY_PATH . '3rd-party.php' );
|
84 |
|
85 |
+
if ( is_admin() ) {
|
86 |
+
require( IMAGIFY_ADMIN_PATH . 'upgrader.php' );
|
87 |
+
require( IMAGIFY_ADMIN_PATH . 'heartbeat.php' );
|
88 |
+
require( IMAGIFY_ADMIN_PATH . 'ajax.php' );
|
89 |
+
require( IMAGIFY_ADMIN_PATH . 'options.php' );
|
90 |
+
require( IMAGIFY_ADMIN_PATH . 'menu.php' );
|
91 |
+
require( IMAGIFY_ADMIN_PATH . 'plugins.php' );
|
92 |
+
require( IMAGIFY_ADMIN_PATH . 'upload.php' );
|
93 |
+
require( IMAGIFY_ADMIN_PATH . 'media.php' );
|
94 |
+
require( IMAGIFY_ADMIN_PATH . 'enqueue.php' );
|
95 |
+
require( IMAGIFY_ADMIN_PATH . 'meta-boxes.php' );
|
96 |
+
require( IMAGIFY_ADMIN_UI_PATH . 'options.php' );
|
97 |
+
require( IMAGIFY_ADMIN_UI_PATH . 'bulk.php' );
|
98 |
+
require( IMAGIFY_ADMIN_UI_PATH . 'notices.php' );
|
99 |
+
}
|
100 |
|
101 |
+
/**
|
102 |
+
* Fires when Imagify is correctly loaded.
|
103 |
+
*
|
104 |
+
* @since 1.0
|
105 |
*/
|
106 |
do_action( 'imagify_loaded' );
|
107 |
}
|
inc/3rd-party/3rd-party.php
CHANGED
@@ -1,9 +1,9 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
require( IMAGIFY_3RD_PARTY_PATH . 'enable-media-replace.php' );
|
5 |
require( IMAGIFY_3RD_PARTY_PATH . 'nextgen-gallery/nextgen-gallery.php' );
|
6 |
require( IMAGIFY_3RD_PARTY_PATH . 'wp-retina-2x.php' );
|
7 |
|
8 |
-
// Hosting
|
9 |
-
require( IMAGIFY_3RD_PARTY_PATH . 'hosting/wpengine.php' );
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
require( IMAGIFY_3RD_PARTY_PATH . 'enable-media-replace.php' );
|
5 |
require( IMAGIFY_3RD_PARTY_PATH . 'nextgen-gallery/nextgen-gallery.php' );
|
6 |
require( IMAGIFY_3RD_PARTY_PATH . 'wp-retina-2x.php' );
|
7 |
|
8 |
+
// Hosting.
|
9 |
+
require( IMAGIFY_3RD_PARTY_PATH . 'hosting/wpengine.php' );
|
inc/3rd-party/enable-media-replace.php
CHANGED
@@ -1,33 +1,36 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
if ( function_exists( 'emr_delete_current_files' ) ) :
|
5 |
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
}
|
20 |
-
|
21 |
-
$optimization_level = get_post_meta( $attachment_id, '_imagify_optimization_level', true );
|
22 |
-
|
23 |
-
// Remove old optimization data
|
24 |
-
delete_post_meta( $attachment_id, '_imagify_data' );
|
25 |
-
delete_post_meta( $attachment_id, '_imagify_status' );
|
26 |
-
delete_post_meta( $attachment_id, '_imagify_optimization_level' );
|
27 |
-
|
28 |
-
// Optimize it!!!!!
|
29 |
-
$attachment = new Imagify_Attachment( $attachment_id );
|
30 |
-
$attachment->optimize( $optimization_level );
|
31 |
-
}
|
32 |
|
33 |
-
endif;
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
if ( function_exists( 'emr_delete_current_files' ) ) :
|
5 |
|
6 |
+
add_action( 'enable-media-replace-upload-done', '_imagify_optimize_enable_media_replace' );
|
7 |
+
/**
|
8 |
+
* Re-Optimize an attachment after replace it with Enable Media Replace.
|
9 |
+
*
|
10 |
+
* @since 1.0
|
11 |
+
*
|
12 |
+
* @param string $guid A post guid.
|
13 |
+
*/
|
14 |
+
function _imagify_optimize_enable_media_replace( $guid ) {
|
15 |
+
global $wpdb;
|
16 |
+
$attachment_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE guid='%s';", $guid ) );
|
17 |
+
|
18 |
+
// Stop if the attachment wasn't optimized yet by Imagify.
|
19 |
+
if ( ! get_post_meta( $attachment_id, '_imagify_data', true ) ) {
|
20 |
+
return;
|
21 |
+
}
|
22 |
+
|
23 |
+
$optimization_level = get_post_meta( $attachment_id, '_imagify_optimization_level', true );
|
24 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
25 |
+
$attachment = new $class_name( $attachment_id );
|
26 |
+
|
27 |
+
// Remove old optimization data.
|
28 |
+
delete_post_meta( $attachment_id, '_imagify_data' );
|
29 |
+
delete_post_meta( $attachment_id, '_imagify_status' );
|
30 |
+
delete_post_meta( $attachment_id, '_imagify_optimization_level' );
|
31 |
+
|
32 |
+
// Optimize it!!!!!
|
33 |
+
$attachment->optimize( $optimization_level );
|
34 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
|
36 |
+
endif;
|
inc/3rd-party/hosting/wpengine.php
CHANGED
@@ -1,17 +1,17 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
if ( class_exists( 'WpeCommon' ) ) :
|
5 |
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
function _imagify_wengine_unoptimized_attachment_limit() {
|
14 |
-
|
15 |
-
}
|
16 |
|
17 |
-
endif;
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
if ( class_exists( 'WpeCommon' ) ) :
|
5 |
|
6 |
+
add_filter( 'imagify_unoptimized_attachment_limit', '_imagify_wengine_unoptimized_attachment_limit' );
|
7 |
+
/**
|
8 |
+
* Conflict with WP Engine: it seems that WP Engine limits SQL queries size.
|
9 |
+
*
|
10 |
+
* @since 1.4.7
|
11 |
+
* @author Jonathan Buttigieg
|
12 |
+
*/
|
13 |
+
function _imagify_wengine_unoptimized_attachment_limit() {
|
14 |
+
return 2500;
|
15 |
+
}
|
16 |
|
17 |
+
endif;
|
inc/3rd-party/nextgen-gallery/inc/admin/ajax.php
CHANGED
@@ -1,107 +1,110 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
* Get all unoptimized attachment ids.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
add_action( 'wp_ajax_imagify_ngg_get_unoptimized_attachment_ids', '_do_wp_ajax_imagify_ngg_get_unoptimized_attachment_ids' );
|
11 |
function _do_wp_ajax_imagify_ngg_get_unoptimized_attachment_ids() {
|
|
|
|
|
12 |
check_ajax_referer( 'imagify-bulk-upload', 'imagifybulkuploadnonce' );
|
13 |
|
14 |
if ( ! current_user_can( 'upload_files' ) ) {
|
15 |
wp_send_json_error();
|
16 |
}
|
17 |
-
|
18 |
$user = new Imagify_User();
|
19 |
-
|
20 |
if ( $user->is_over_quota() ) {
|
21 |
wp_send_json_error( array( 'message' => 'over-quota' ) );
|
22 |
}
|
23 |
-
|
24 |
@set_time_limit( 0 );
|
25 |
-
|
26 |
-
$optimization_level = $_GET['optimization_level'];
|
27 |
-
$optimization_level = ( -1
|
28 |
$optimization_level = (int) $optimization_level;
|
29 |
-
|
30 |
/**
|
31 |
-
* Filter the unoptimized attachments limit query
|
32 |
*
|
33 |
* @since 1.4.4
|
34 |
*
|
35 |
-
* @param int The limit (-1 for unlimited)
|
36 |
*/
|
37 |
$unoptimized_attachment_limit = apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
$
|
42 |
-
$
|
43 |
-
$data = array();
|
44 |
-
$images = $wpdb->get_results(
|
45 |
"SELECT picture.pid as id, picture.filename, idata.optimization_level, idata.status, idata.data
|
46 |
FROM $ngg_table as picture
|
47 |
LEFT JOIN $wpdb->ngg_imagify_data as idata
|
48 |
ON picture.pid = idata.pid
|
49 |
WHERE idata.pid IS NULL
|
50 |
-
OR idata.optimization_level !=
|
51 |
OR idata.status = 'error'
|
52 |
-
LIMIT
|
53 |
-
,
|
54 |
-
|
55 |
-
|
56 |
-
|
|
|
57 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
58 |
-
|
59 |
-
foreach( $images as $image ) {
|
60 |
$id = $image['id'];
|
61 |
-
|
62 |
-
/** This filter is documented in inc/functions/process.php */
|
63 |
$file_path = apply_filters( 'imagify_file_path', $storage->get_image_abspath( $id ) );
|
64 |
-
|
65 |
-
if ( file_exists( $file_path ) ) {
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
$attachment_error
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
}
|
100 |
-
|
101 |
-
|
102 |
-
|
|
|
|
|
103 |
wp_send_json_success( $data );
|
104 |
}
|
105 |
-
|
106 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
107 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'wp_ajax_imagify_ngg_get_unoptimized_attachment_ids', '_do_wp_ajax_imagify_ngg_get_unoptimized_attachment_ids' );
|
5 |
/**
|
6 |
* Get all unoptimized attachment ids.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
* @author Jonathan Buttigieg
|
10 |
*/
|
|
|
11 |
function _do_wp_ajax_imagify_ngg_get_unoptimized_attachment_ids() {
|
12 |
+
global $wpdb;
|
13 |
+
|
14 |
check_ajax_referer( 'imagify-bulk-upload', 'imagifybulkuploadnonce' );
|
15 |
|
16 |
if ( ! current_user_can( 'upload_files' ) ) {
|
17 |
wp_send_json_error();
|
18 |
}
|
19 |
+
|
20 |
$user = new Imagify_User();
|
21 |
+
|
22 |
if ( $user->is_over_quota() ) {
|
23 |
wp_send_json_error( array( 'message' => 'over-quota' ) );
|
24 |
}
|
25 |
+
|
26 |
@set_time_limit( 0 );
|
27 |
+
|
28 |
+
$optimization_level = (int) $_GET['optimization_level'];
|
29 |
+
$optimization_level = ( -1 !== $optimization_level ) ? $optimization_level : get_imagify_option( 'optimization_level', 1 );
|
30 |
$optimization_level = (int) $optimization_level;
|
31 |
+
|
32 |
/**
|
33 |
+
* Filter the unoptimized attachments limit query.
|
34 |
*
|
35 |
* @since 1.4.4
|
36 |
*
|
37 |
+
* @param int The limit (-1 for unlimited).
|
38 |
*/
|
39 |
$unoptimized_attachment_limit = apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
|
40 |
+
|
41 |
+
$storage = C_Gallery_Storage::get_instance();
|
42 |
+
$ngg_table = $wpdb->prefix . 'ngg_pictures';
|
43 |
+
$data = array();
|
44 |
+
$images = $wpdb->get_results( $wpdb->prepare( // WPCS: unprepared SQL ok.
|
|
|
|
|
45 |
"SELECT picture.pid as id, picture.filename, idata.optimization_level, idata.status, idata.data
|
46 |
FROM $ngg_table as picture
|
47 |
LEFT JOIN $wpdb->ngg_imagify_data as idata
|
48 |
ON picture.pid = idata.pid
|
49 |
WHERE idata.pid IS NULL
|
50 |
+
OR idata.optimization_level != %d
|
51 |
OR idata.status = 'error'
|
52 |
+
LIMIT %d",
|
53 |
+
$optimization_level,
|
54 |
+
$unoptimized_attachment_limit
|
55 |
+
), ARRAY_A );
|
56 |
+
|
57 |
+
// Save the optimization level in a transient to retrieve it later during the process.
|
58 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
59 |
+
|
60 |
+
foreach ( $images as $image ) {
|
61 |
$id = $image['id'];
|
62 |
+
|
63 |
+
/** This filter is documented in inc/functions/process.php. */
|
64 |
$file_path = apply_filters( 'imagify_file_path', $storage->get_image_abspath( $id ) );
|
65 |
+
|
66 |
+
if ( ! file_exists( $file_path ) ) {
|
67 |
+
continue;
|
68 |
+
}
|
69 |
+
|
70 |
+
$attachment_data = maybe_unserialize( $image['data'] );
|
71 |
+
$attachment_error = '';
|
72 |
+
|
73 |
+
if ( isset( $attachment_data['sizes']['full']['error'] ) ) {
|
74 |
+
$attachment_error = $attachment_data['sizes']['full']['error'];
|
75 |
+
}
|
76 |
+
|
77 |
+
$attachment_error = trim( $attachment_error );
|
78 |
+
$attachment_status = $image['status'];
|
79 |
+
$attachment_optimization_level = $image['optimization_level'];
|
80 |
+
$attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
|
81 |
+
|
82 |
+
// Don't try to re-optimize if the optimization level is still the same.
|
83 |
+
if ( $optimization_level === $attachment_optimization_level && is_string( $attachment_error ) ) {
|
84 |
+
continue;
|
85 |
+
}
|
86 |
+
|
87 |
+
// Don't try to re-optimize if there is no backup file.
|
88 |
+
if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
|
89 |
+
continue;
|
90 |
+
}
|
91 |
+
|
92 |
+
// Don't try to re-optimize images already compressed.
|
93 |
+
if ( 'already_optimized' === $attachment_status && $attachment_optimization_level >= $optimization_level ) {
|
94 |
+
continue;
|
95 |
+
}
|
96 |
+
|
97 |
+
// Don't try to re-optimize images with an empty error message.
|
98 |
+
if ( 'error' === $attachment_status && empty( $attachment_error ) ) {
|
99 |
+
continue;
|
100 |
+
}
|
101 |
+
|
102 |
+
$data[ '_' . $id ] = $storage->get_image_url( $id );
|
103 |
+
} // End foreach().
|
104 |
+
|
105 |
+
if ( $data ) {
|
106 |
wp_send_json_success( $data );
|
107 |
}
|
108 |
+
|
109 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
110 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/admin/bulk.php
CHANGED
@@ -1,20 +1,22 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Update all Imagify stats for NGG Bulk Optimization
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
add_filter( 'imagify_count_attachments' , 'imagify_ngg_count_attachments' );
|
14 |
-
add_filter( 'imagify_count_optimized_attachments' , 'imagify_ngg_count_optimized_attachments' );
|
15 |
-
add_filter( 'imagify_count_error_attachments' , 'imagify_ngg_count_error_attachments' );
|
16 |
-
add_filter( 'imagify_count_unoptimized_attachments' , 'imagify_ngg_count_unoptimized_attachments' );
|
17 |
-
add_filter( 'imagify_percent_optimized_attachments' , 'imagify_ngg_percent_optimized_attachments' );
|
18 |
-
add_filter( 'imagify_count_saving_data' , 'imagify_ngg_count_saving_data' );
|
19 |
}
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'admin_init', '_imagify_ngg_update_bulk_stats' );
|
5 |
/**
|
6 |
+
* Update all Imagify stats for NGG Bulk Optimization.
|
7 |
*
|
8 |
* @since 1.5
|
9 |
* @author Jonathan Buttigieg
|
10 |
*/
|
11 |
+
function _imagify_ngg_update_bulk_stats() {
|
12 |
+
if ( empty( $_GET['page'] ) || 'imagify-ngg-bulk-optimization' !== $_GET['page'] ) { // WPCS: CSRF ok.
|
13 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
}
|
15 |
+
|
16 |
+
add_filter( 'imagify_count_attachments' , 'imagify_ngg_count_attachments' );
|
17 |
+
add_filter( 'imagify_count_optimized_attachments' , 'imagify_ngg_count_optimized_attachments' );
|
18 |
+
add_filter( 'imagify_count_error_attachments' , 'imagify_ngg_count_error_attachments' );
|
19 |
+
add_filter( 'imagify_count_unoptimized_attachments' , 'imagify_ngg_count_unoptimized_attachments' );
|
20 |
+
add_filter( 'imagify_percent_optimized_attachments' , 'imagify_ngg_percent_optimized_attachments' );
|
21 |
+
add_filter( 'imagify_count_saving_data' , 'imagify_ngg_count_saving_data' );
|
22 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/admin/db.php
CHANGED
@@ -1,18 +1,17 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Create the Imagify table needed for NGG compatibility
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
add_action( 'admin_init' , '_imagify_create_ngg_table' );
|
11 |
function _imagify_create_ngg_table() {
|
12 |
global $wpdb;
|
13 |
-
|
14 |
if ( ! get_option( $wpdb->prefix . 'ngg_imagify_data_db_version' ) ) {
|
15 |
-
|
16 |
-
$db->create_table();
|
17 |
}
|
18 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'admin_init' , '_imagify_create_ngg_table' );
|
5 |
/**
|
6 |
+
* Create the Imagify table needed for NGG compatibility.
|
7 |
*
|
8 |
* @since 1.5
|
9 |
* @author Jonathan Buttigieg
|
10 |
*/
|
|
|
11 |
function _imagify_create_ngg_table() {
|
12 |
global $wpdb;
|
13 |
+
|
14 |
if ( ! get_option( $wpdb->prefix . 'ngg_imagify_data_db_version' ) ) {
|
15 |
+
imagify_ngg_db()->create_table();
|
|
|
16 |
}
|
17 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php
CHANGED
@@ -1,34 +1,34 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Add some JS for NGG compatibility
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
add_action( 'admin_print_styles', '_imagify_ngg_admin_print_styles', PHP_INT_MAX );
|
11 |
function _imagify_ngg_admin_print_styles() {
|
12 |
$current_screen = get_current_screen();
|
13 |
-
|
14 |
/**
|
15 |
-
* Scripts loaded in /wp-admin/admin.php?page=nggallery-manage-gallery
|
16 |
*/
|
17 |
if ( isset( $current_screen ) && ( 'nggallery-manage-images' === $current_screen->base || 'nggallery-manage-gallery' === $current_screen->base ) ) {
|
18 |
$upload_data = array(
|
19 |
-
'bulkActionsLabels' => array(
|
20 |
'optimize' => __( 'Optimize', 'imagify' ),
|
21 |
'restore' => __( 'Restore Original', 'imagify' ),
|
22 |
),
|
23 |
);
|
24 |
wp_localize_script( 'imagify-js-upload', 'imagifyUpload', $upload_data );
|
25 |
-
|
26 |
wp_enqueue_script( 'imagify-js-chart' );
|
27 |
wp_enqueue_script( 'imagify-js-upload' );
|
28 |
}
|
29 |
-
|
30 |
/**
|
31 |
-
* Scripts loaded in /wp-admin/admin.php?page=imagify-ngg-bulk-optimization
|
32 |
*/
|
33 |
if ( isset( $current_screen ) && false !== strpos( $current_screen->base, '_page_imagify-ngg-bulk-optimization' ) ) {
|
34 |
wp_enqueue_script( 'heartbeat' );
|
@@ -37,10 +37,10 @@ function _imagify_ngg_admin_print_styles() {
|
|
37 |
$bulk_data['heartbeat_id'] = 'update_ngg_bulk_data';
|
38 |
$bulk_data['ajax_action'] = 'imagify_ngg_get_unoptimized_attachment_ids';
|
39 |
$bulk_data['ajax_context'] = 'NGG';
|
40 |
-
|
41 |
/** This filter is documented in inc/admin/enqueue.php */
|
42 |
-
$bulk_data['buffer_size']
|
43 |
-
|
44 |
wp_localize_script( 'imagify-js-bulk', 'imagifyBulk', $bulk_data );
|
45 |
wp_enqueue_script( 'imagify-js-chart' );
|
46 |
wp_enqueue_script( 'imagify-js-async' );
|
@@ -48,17 +48,17 @@ function _imagify_ngg_admin_print_styles() {
|
|
48 |
}
|
49 |
}
|
50 |
|
|
|
51 |
/**
|
52 |
* Add Intercom on Options page an Bulk Optimization
|
53 |
*
|
54 |
* @since 1.5
|
55 |
* @author Jonathan Buttigieg
|
56 |
*/
|
57 |
-
add_action( 'admin_footer', '_imagify_ngg_admin_print_intercom' );
|
58 |
function _imagify_ngg_admin_print_intercom() {
|
59 |
$current_screen = get_current_screen();
|
60 |
-
|
61 |
if ( isset( $current_screen ) && false !== strpos( $current_screen->base, '_page_imagify-ngg-bulk-optimization' ) ) {
|
62 |
-
_imagify_admin_print_intercom();
|
63 |
}
|
64 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'admin_print_styles', '_imagify_ngg_admin_print_styles', PHP_INT_MAX );
|
5 |
/**
|
6 |
+
* Add some JS for NGG compatibility.
|
7 |
*
|
8 |
* @since 1.5
|
9 |
* @author Jonathan Buttigieg
|
10 |
*/
|
|
|
11 |
function _imagify_ngg_admin_print_styles() {
|
12 |
$current_screen = get_current_screen();
|
13 |
+
|
14 |
/**
|
15 |
+
* Scripts loaded in /wp-admin/admin.php?page=nggallery-manage-gallery.
|
16 |
*/
|
17 |
if ( isset( $current_screen ) && ( 'nggallery-manage-images' === $current_screen->base || 'nggallery-manage-gallery' === $current_screen->base ) ) {
|
18 |
$upload_data = array(
|
19 |
+
'bulkActionsLabels' => array(
|
20 |
'optimize' => __( 'Optimize', 'imagify' ),
|
21 |
'restore' => __( 'Restore Original', 'imagify' ),
|
22 |
),
|
23 |
);
|
24 |
wp_localize_script( 'imagify-js-upload', 'imagifyUpload', $upload_data );
|
25 |
+
|
26 |
wp_enqueue_script( 'imagify-js-chart' );
|
27 |
wp_enqueue_script( 'imagify-js-upload' );
|
28 |
}
|
29 |
+
|
30 |
/**
|
31 |
+
* Scripts loaded in /wp-admin/admin.php?page=imagify-ngg-bulk-optimization.
|
32 |
*/
|
33 |
if ( isset( $current_screen ) && false !== strpos( $current_screen->base, '_page_imagify-ngg-bulk-optimization' ) ) {
|
34 |
wp_enqueue_script( 'heartbeat' );
|
37 |
$bulk_data['heartbeat_id'] = 'update_ngg_bulk_data';
|
38 |
$bulk_data['ajax_action'] = 'imagify_ngg_get_unoptimized_attachment_ids';
|
39 |
$bulk_data['ajax_context'] = 'NGG';
|
40 |
+
|
41 |
/** This filter is documented in inc/admin/enqueue.php */
|
42 |
+
$bulk_data['buffer_size'] = apply_filters( 'imagify_bulk_buffer_size', 4 );
|
43 |
+
|
44 |
wp_localize_script( 'imagify-js-bulk', 'imagifyBulk', $bulk_data );
|
45 |
wp_enqueue_script( 'imagify-js-chart' );
|
46 |
wp_enqueue_script( 'imagify-js-async' );
|
48 |
}
|
49 |
}
|
50 |
|
51 |
+
add_action( 'admin_footer', '_imagify_ngg_admin_print_intercom' );
|
52 |
/**
|
53 |
* Add Intercom on Options page an Bulk Optimization
|
54 |
*
|
55 |
* @since 1.5
|
56 |
* @author Jonathan Buttigieg
|
57 |
*/
|
|
|
58 |
function _imagify_ngg_admin_print_intercom() {
|
59 |
$current_screen = get_current_screen();
|
60 |
+
|
61 |
if ( isset( $current_screen ) && false !== strpos( $current_screen->base, '_page_imagify-ngg-bulk-optimization' ) ) {
|
62 |
+
_imagify_admin_print_intercom();
|
63 |
}
|
64 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/admin/gallery.php
CHANGED
@@ -1,13 +1,16 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
-
|
|
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
|
|
|
|
|
|
9 |
*/
|
10 |
-
add_filter( 'ngg_manage_images_number_of_columns', '_imagify_ngg_manage_images_number_of_columns' );
|
11 |
function _imagify_ngg_manage_images_number_of_columns( $count ) {
|
12 |
$count++;
|
13 |
add_filter( 'ngg_manage_images_column_' . $count . '_header', '_imagify_ngg_manage_media_columns' );
|
@@ -16,11 +19,29 @@ function _imagify_ngg_manage_images_number_of_columns( $count ) {
|
|
16 |
return $count;
|
17 |
}
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
function _imagify_ngg_manage_media_columns() {
|
20 |
return 'Imagify';
|
21 |
}
|
22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
function _imagify_ngg_manage_media_custom_column( $output, $image ) {
|
24 |
$attachment = new Imagify_NGG_Attachment( $image );
|
25 |
-
|
26 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_filter( 'ngg_manage_images_number_of_columns', '_imagify_ngg_manage_images_number_of_columns' );
|
5 |
+
/**
|
6 |
+
* Add "Imagify" column in admin.php?page=nggallery-manage-gallery.
|
7 |
*
|
8 |
* @since 1.5
|
9 |
* @author Jonathan Buttigieg
|
10 |
+
*
|
11 |
+
* @param int $count Number of columns.
|
12 |
+
* @return int Incremented number of columns.
|
13 |
*/
|
|
|
14 |
function _imagify_ngg_manage_images_number_of_columns( $count ) {
|
15 |
$count++;
|
16 |
add_filter( 'ngg_manage_images_column_' . $count . '_header', '_imagify_ngg_manage_media_columns' );
|
19 |
return $count;
|
20 |
}
|
21 |
|
22 |
+
/**
|
23 |
+
* Get the column title.
|
24 |
+
*
|
25 |
+
* @since 1.5
|
26 |
+
* @author Jonathan Buttigieg
|
27 |
+
*
|
28 |
+
* @return string
|
29 |
+
*/
|
30 |
function _imagify_ngg_manage_media_columns() {
|
31 |
return 'Imagify';
|
32 |
}
|
33 |
|
34 |
+
/**
|
35 |
+
* Get the column content.
|
36 |
+
*
|
37 |
+
* @since 1.5
|
38 |
+
* @author Jonathan Buttigieg
|
39 |
+
*
|
40 |
+
* @param string $output The column content.
|
41 |
+
* @param object $image An NGG Image object.
|
42 |
+
* @return string
|
43 |
+
*/
|
44 |
function _imagify_ngg_manage_media_custom_column( $output, $image ) {
|
45 |
$attachment = new Imagify_NGG_Attachment( $image );
|
46 |
+
return get_imagify_media_column_content( $attachment, 'NGG' );
|
47 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/admin/heartbeat.php
CHANGED
@@ -1,41 +1,47 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
global $pagenow;
|
5 |
|
|
|
6 |
/**
|
7 |
* Prepare the data that goes back with the Heartbeat API.
|
8 |
*
|
9 |
* @since 1.5
|
|
|
|
|
|
|
|
|
10 |
*/
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
$saving_data = imagify_count_saving_data();
|
16 |
-
$user = new Imagify_User();
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
32 |
}
|
33 |
|
34 |
/**
|
35 |
-
* Update the Heartbeat API settings
|
36 |
*
|
37 |
* @since 1.5
|
38 |
*/
|
39 |
-
if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) && 'imagify-ngg-bulk-optimization' === $_GET['page'] ) {
|
40 |
-
add_filter( 'heartbeat_settings', '_imagify_heartbeat_settings', PHP_INT_MAX );
|
41 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
global $pagenow;
|
5 |
|
6 |
+
add_filter( 'heartbeat_received', '_imagify_ngg_heartbeat_received', 10, 2 );
|
7 |
/**
|
8 |
* Prepare the data that goes back with the Heartbeat API.
|
9 |
*
|
10 |
* @since 1.5
|
11 |
+
*
|
12 |
+
* @param array $response The Heartbeat response.
|
13 |
+
* @param array $data The $_POST data sent.
|
14 |
+
* @return array
|
15 |
*/
|
16 |
+
function _imagify_ngg_heartbeat_received( $response, $data ) {
|
17 |
+
if ( ! isset( $data['imagify_heartbeat'] ) || 'update_ngg_bulk_data' !== $data['imagify_heartbeat'] ) {
|
18 |
+
return $response;
|
19 |
+
}
|
|
|
|
|
20 |
|
21 |
+
add_filter( 'imagify_count_saving_data', 'imagify_ngg_count_saving_data' );
|
22 |
+
$saving_data = imagify_count_saving_data();
|
23 |
+
$user = new Imagify_User();
|
24 |
+
|
25 |
+
$response['imagify_bulk_data'] = array(
|
26 |
+
'already_optimized_attachments' => $saving_data['count'],
|
27 |
+
'optimized_attachments' => imagify_ngg_count_optimized_attachments(),
|
28 |
+
'unoptimized_attachments' => imagify_ngg_count_unoptimized_attachments(),
|
29 |
+
'errors_attachments' => imagify_ngg_count_error_attachments(),
|
30 |
+
'optimized_attachments_percent' => imagify_ngg_percent_optimized_attachments(),
|
31 |
+
'optimized_percent' => $saving_data['percent'],
|
32 |
+
'original_human' => size_format( $saving_data['original_size'], 1 ),
|
33 |
+
'optimized_human' => size_format( $saving_data['optimized_size'], 1 ),
|
34 |
+
'unconsumed_quota' => $user->get_percent_unconsumed_quota(),
|
35 |
+
);
|
36 |
+
|
37 |
+
return $response;
|
38 |
}
|
39 |
|
40 |
/**
|
41 |
+
* Update the Heartbeat API settings.
|
42 |
*
|
43 |
* @since 1.5
|
44 |
*/
|
45 |
+
if ( 'admin.php' === $pagenow && isset( $_GET['page'] ) && 'imagify-ngg-bulk-optimization' === $_GET['page'] ) { // WPCS: CSRF ok.
|
46 |
+
add_filter( 'heartbeat_settings', '_imagify_heartbeat_settings', PHP_INT_MAX );
|
47 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/admin/menu.php
CHANGED
@@ -1,17 +1,17 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
* Add submenu in menu "Media"
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
add_action( 'admin_menu', '_imagify_ngg_bulk_optimization_menu' );
|
11 |
function _imagify_ngg_bulk_optimization_menu() {
|
12 |
if ( ! defined( 'NGGFOLDER' ) ) {
|
13 |
return;
|
14 |
}
|
15 |
-
|
16 |
-
add_submenu_page( NGGFOLDER, __( 'Bulk Optimization', 'imagify' ), __( 'Bulk Optimization', 'imagify' ),
|
17 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'admin_menu', '_imagify_ngg_bulk_optimization_menu' );
|
5 |
/**
|
6 |
* Add submenu in menu "Media"
|
7 |
*
|
8 |
* @since 1.5
|
9 |
* @author Jonathan Buttigieg
|
10 |
*/
|
|
|
11 |
function _imagify_ngg_bulk_optimization_menu() {
|
12 |
if ( ! defined( 'NGGFOLDER' ) ) {
|
13 |
return;
|
14 |
}
|
15 |
+
|
16 |
+
add_submenu_page( NGGFOLDER, __( 'Bulk Optimization', 'imagify' ), __( 'Bulk Optimization', 'imagify' ), imagify_get_capacity( true ), IMAGIFY_SLUG . '-ngg-bulk-optimization', '_imagify_display_bulk_page' );
|
17 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/classes/class-attachment.php
DELETED
@@ -1,480 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
3 |
-
|
4 |
-
class Imagify_NGG_Attachment extends Imagify_Abstract_Attachment {
|
5 |
-
/**
|
6 |
-
* The image object
|
7 |
-
*
|
8 |
-
* @since 1.5
|
9 |
-
*
|
10 |
-
* @var object
|
11 |
-
* @access public
|
12 |
-
*/
|
13 |
-
public $image;
|
14 |
-
|
15 |
-
/**
|
16 |
-
* The constructor
|
17 |
-
*
|
18 |
-
* @since 1.5
|
19 |
-
* @author Jonathan Buttigieg
|
20 |
-
*
|
21 |
-
* @return void
|
22 |
-
**/
|
23 |
-
function __construct( $id ) {
|
24 |
-
if ( is_object( $id ) ) {
|
25 |
-
$this->image = $id;
|
26 |
-
$this->id = $id->pid;
|
27 |
-
} else {
|
28 |
-
$this->image = nggdb::find_image( (int) $id );
|
29 |
-
$this->id = $this->image->pid;
|
30 |
-
}
|
31 |
-
|
32 |
-
$this->row = $this->get_row();
|
33 |
-
|
34 |
-
// Load nggAdmin classe
|
35 |
-
$ngg_admin_functions_path = WP_PLUGIN_DIR . '/' . NGGFOLDER . '/products/photocrati_nextgen/modules/ngglegacy/admin/functions.php';
|
36 |
-
|
37 |
-
if ( ! class_exists( 'nggAdmin' ) && file_exists( $ngg_admin_functions_path ) ) {
|
38 |
-
require_once( $ngg_admin_functions_path );
|
39 |
-
}
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Get the attachment backup filepath.
|
44 |
-
*
|
45 |
-
* @since 1.5
|
46 |
-
* @author Jonathan Buttigieg
|
47 |
-
*
|
48 |
-
* @access public
|
49 |
-
* @return string|false
|
50 |
-
*/
|
51 |
-
public function get_backup_path() {
|
52 |
-
$backup_path = $this->get_original_path() . '_backup';
|
53 |
-
|
54 |
-
if( file_exists( $backup_path ) ) {
|
55 |
-
return $backup_path;
|
56 |
-
}
|
57 |
-
|
58 |
-
return false;
|
59 |
-
}
|
60 |
-
|
61 |
-
/**
|
62 |
-
* Get the attachment optimization data.
|
63 |
-
*
|
64 |
-
* @since 1.5
|
65 |
-
* @author Jonathan Buttigieg
|
66 |
-
*
|
67 |
-
* @access public
|
68 |
-
* @return array
|
69 |
-
*/
|
70 |
-
public function get_data() {
|
71 |
-
$row = ( (bool) $this->row ) ? $this->row : $this->get_row();
|
72 |
-
return isset( $row['data'] ) ? unserialize( $row['data'] ) : false;
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Get the attachment optimization level.
|
77 |
-
*
|
78 |
-
* @since 1.5
|
79 |
-
* @author Jonathan Buttigieg
|
80 |
-
*
|
81 |
-
* @access public
|
82 |
-
* @return int
|
83 |
-
*/
|
84 |
-
public function get_optimization_level() {
|
85 |
-
$row = ( (bool) $this->row ) ? $this->row : $this->get_row();
|
86 |
-
return isset( $row['optimization_level'] ) ? $row['optimization_level'] : false;
|
87 |
-
}
|
88 |
-
|
89 |
-
/**
|
90 |
-
* Get the attachment SQL data row.
|
91 |
-
*
|
92 |
-
* @since 1.5
|
93 |
-
* @author Jonathan Buttigieg
|
94 |
-
*
|
95 |
-
* @access public
|
96 |
-
* @return array
|
97 |
-
*/
|
98 |
-
public function get_row() {
|
99 |
-
$result = Imagify_NGG_DB()->get( $this->id );
|
100 |
-
return $result;
|
101 |
-
}
|
102 |
-
|
103 |
-
/**
|
104 |
-
* Get the attachment optimization status (success or error).
|
105 |
-
*
|
106 |
-
* @since 1.5
|
107 |
-
* @author Jonathan Buttigieg
|
108 |
-
*
|
109 |
-
* @access public
|
110 |
-
* @return string
|
111 |
-
*/
|
112 |
-
public function get_status() {
|
113 |
-
$row = ( (bool) $this->row ) ? $this->row : $this->get_row();
|
114 |
-
return isset( $row['status'] ) ? $row['status'] : false;
|
115 |
-
}
|
116 |
-
|
117 |
-
/**
|
118 |
-
* Get the original attachment path.
|
119 |
-
*
|
120 |
-
* @since 1.5
|
121 |
-
* @author Jonathan Buttigieg
|
122 |
-
*
|
123 |
-
* @access public
|
124 |
-
* @return string
|
125 |
-
*/
|
126 |
-
public function get_original_path() {
|
127 |
-
return $this->image->imagePath;
|
128 |
-
}
|
129 |
-
|
130 |
-
/**
|
131 |
-
* Get the original attachment URL.
|
132 |
-
*
|
133 |
-
* @since 1.5
|
134 |
-
* @author Jonathan Buttigieg
|
135 |
-
*
|
136 |
-
* @access public
|
137 |
-
* @return string
|
138 |
-
*/
|
139 |
-
public function get_original_url() {
|
140 |
-
return $this->image->imageURL;
|
141 |
-
}
|
142 |
-
|
143 |
-
/**
|
144 |
-
* Update the metadata size of the attachment
|
145 |
-
*
|
146 |
-
* @since 1.5
|
147 |
-
*
|
148 |
-
* @access public
|
149 |
-
* @return void
|
150 |
-
*/
|
151 |
-
public function update_metadata_size() {
|
152 |
-
$size = @getimagesize( $this->get_original_path() );
|
153 |
-
|
154 |
-
if ( isset( $size[0], $size[1] ) ) {
|
155 |
-
$metadata = $this->image->meta_data;
|
156 |
-
$metadata['width'] = $metadata['full']['width'] = $size[0];
|
157 |
-
$metadata['height'] = $metadata['full']['height'] = $size[1];
|
158 |
-
|
159 |
-
nggdb::update_image_meta( $this->id , $metadata );
|
160 |
-
}
|
161 |
-
}
|
162 |
-
|
163 |
-
/**
|
164 |
-
* Fills statistics data with values from $data array
|
165 |
-
*
|
166 |
-
* @since 1.5
|
167 |
-
* @author Jonathan Buttigieg
|
168 |
-
*
|
169 |
-
* @access public
|
170 |
-
* @static
|
171 |
-
* @param array $data The statistics data
|
172 |
-
* @param object $response The API response
|
173 |
-
* @param int $id The attachment ID
|
174 |
-
* @param int $url The attachment URL
|
175 |
-
* @param string $size The attachment size key
|
176 |
-
* @return bool|array False if the original size has an error or an array contains the data for other result
|
177 |
-
*/
|
178 |
-
static public function fill_data( $data, $response, $id, $url, $size = 'full' ) {
|
179 |
-
if ( is_wp_error( $response ) ) {
|
180 |
-
$error = $response->get_error_message();
|
181 |
-
$error_status = 'error';
|
182 |
-
|
183 |
-
$data['sizes'][ $size ] = array(
|
184 |
-
'success' => false,
|
185 |
-
'error' => $error
|
186 |
-
);
|
187 |
-
|
188 |
-
// Update the error status for the original size
|
189 |
-
if ( 'full' === $size ) {
|
190 |
-
if ( false !== strpos( $error, 'This image is already compressed' ) ) {
|
191 |
-
$error_status = 'already_optimized';
|
192 |
-
}
|
193 |
-
|
194 |
-
IMAGIFY_NGG_DB()->update(
|
195 |
-
$id,
|
196 |
-
array(
|
197 |
-
'pid' => $id,
|
198 |
-
'status' => $error_status,
|
199 |
-
'data' => serialize( $data )
|
200 |
-
)
|
201 |
-
);
|
202 |
-
|
203 |
-
return false;
|
204 |
-
}
|
205 |
-
} else {
|
206 |
-
$data['sizes'][ $size ] = array(
|
207 |
-
'success' => true,
|
208 |
-
'file_url' => $url,
|
209 |
-
'original_size' => $response->original_size,
|
210 |
-
'optimized_size' => $response->new_size,
|
211 |
-
'percent' => $response->percent
|
212 |
-
);
|
213 |
-
|
214 |
-
$data['stats']['original_size'] += ( isset( $response->original_size ) ) ? $response->original_size : 0;
|
215 |
-
$data['stats']['optimized_size'] += ( isset( $response->new_size ) ) ? $response->new_size : 0;
|
216 |
-
$data['stats']['percent'] = round( ( ( $data['stats']['original_size'] - $data['stats']['optimized_size'] ) / $data['stats']['original_size'] ) * 100, 2 );
|
217 |
-
}
|
218 |
-
|
219 |
-
return $data;
|
220 |
-
}
|
221 |
-
|
222 |
-
/**
|
223 |
-
* Optimize all sizes with Imagify.
|
224 |
-
*
|
225 |
-
* @since 1.5
|
226 |
-
* @author Jonathan Buttigieg
|
227 |
-
*
|
228 |
-
* @access public
|
229 |
-
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal)
|
230 |
-
* @param array $metadata The attachment meta data (not used here)
|
231 |
-
* @return array $data The optimization data
|
232 |
-
*/
|
233 |
-
public function optimize( $optimization_level = null, $metadata = array() ) {
|
234 |
-
$optimization_level = ( is_null( $optimization_level ) ) ? (int) get_imagify_option( 'optimization_level', 1 ) : (int) $optimization_level;
|
235 |
-
|
236 |
-
$id = $this->id;
|
237 |
-
$data = array(
|
238 |
-
'stats' => array(
|
239 |
-
'original_size' => 0,
|
240 |
-
'optimized_size' => 0,
|
241 |
-
'percent' => 0,
|
242 |
-
)
|
243 |
-
);
|
244 |
-
|
245 |
-
// To avoid issue with "original_size" at 0 in "_imagify_data"
|
246 |
-
if ( 0 === $this->get_stats_data( 'original_size' ) ) {
|
247 |
-
delete_post_meta( $id, '_imagify_data' );
|
248 |
-
delete_post_meta( $id, '_imagify_status' );
|
249 |
-
delete_post_meta( $id, '_imagify_optimization_level' );
|
250 |
-
}
|
251 |
-
|
252 |
-
// Get file path & URL for original image
|
253 |
-
$attachment_path = $this->get_original_path();
|
254 |
-
$attachment_url = $this->get_original_url();
|
255 |
-
$attachment_original_size = $this->get_original_size( false );
|
256 |
-
|
257 |
-
// Check if the full size is already optimized
|
258 |
-
if ( $this->is_optimized() && ( $this->get_optimization_level() == $optimization_level ) ) {
|
259 |
-
return;
|
260 |
-
}
|
261 |
-
|
262 |
-
/**
|
263 |
-
* Fires before optimizing an attachment.
|
264 |
-
*
|
265 |
-
* @since 1.5
|
266 |
-
*
|
267 |
-
* @param int $id The attachment ID
|
268 |
-
*/
|
269 |
-
do_action( 'before_imagify_ngg_optimize_attachment', $id );
|
270 |
-
|
271 |
-
set_transient( 'imagify-ngg-async-in-progress-' . $id, true, 10 * MINUTE_IN_SECONDS );
|
272 |
-
|
273 |
-
// Get the resize values for the original size
|
274 |
-
$resized = false;
|
275 |
-
$do_resize = get_imagify_option( 'resize_larger', false );
|
276 |
-
$resize_width = get_imagify_option( 'resize_larger_w' );
|
277 |
-
$attachment_size = @getimagesize( $attachment_path );
|
278 |
-
|
279 |
-
if ( $do_resize && isset( $attachment_size[0] ) && $resize_width < $attachment_size[0] ) {
|
280 |
-
$resized_attachment_path = $this->resize( $attachment_path, $attachment_size, $resize_width );
|
281 |
-
|
282 |
-
if ( ! is_wp_error( $resized_attachment_path ) ) {
|
283 |
-
if ( get_imagify_option( 'backup', false ) ) {
|
284 |
-
$backup_path = get_imagify_attachment_backup_path( $attachment_path );
|
285 |
-
$backup_path_info = pathinfo( $backup_path );
|
286 |
-
|
287 |
-
wp_mkdir_p( $backup_path_info['dirname'] );
|
288 |
-
|
289 |
-
// TO DO - check and send a error message if the backup can't be created
|
290 |
-
@copy( $attachment_path, $backup_path );
|
291 |
-
imagify_chmod_file( $backup_path );
|
292 |
-
}
|
293 |
-
|
294 |
-
@rename( $resized_attachment_path, $attachment_path );
|
295 |
-
imagify_chmod_file( $attachment_path );
|
296 |
-
|
297 |
-
// If resized temp file still exists, delete it
|
298 |
-
if ( file_exists( $resized_attachment_path ) ) {
|
299 |
-
unlink( $resized_attachment_path );
|
300 |
-
}
|
301 |
-
|
302 |
-
$resized = true;
|
303 |
-
}
|
304 |
-
}
|
305 |
-
|
306 |
-
// Optimize the original size
|
307 |
-
$response = do_imagify( $attachment_path, array(
|
308 |
-
'optimization_level' => $optimization_level,
|
309 |
-
'context' => 'ngg',
|
310 |
-
'resized' => $resized,
|
311 |
-
'original_size' => $attachment_original_size,
|
312 |
-
) );
|
313 |
-
$data = $this->fill_data( $data, $response, $id, $attachment_url );
|
314 |
-
|
315 |
-
// Save the optimization level
|
316 |
-
IMAGIFY_NGG_DB()->update(
|
317 |
-
$id,
|
318 |
-
array(
|
319 |
-
'pid' => $id,
|
320 |
-
'optimization_level' => $optimization_level
|
321 |
-
)
|
322 |
-
);
|
323 |
-
|
324 |
-
if ( (bool) ! $data ) {
|
325 |
-
delete_transient( 'imagify-ngg-async-in-progress-' . $id );
|
326 |
-
return;
|
327 |
-
}
|
328 |
-
|
329 |
-
// If we resized the original with success, we have to update the attachment metadata
|
330 |
-
// If not, WordPress keeps the old attachment size.
|
331 |
-
if ( $do_resize && $resized ) {
|
332 |
-
$this->update_metadata_size();
|
333 |
-
}
|
334 |
-
|
335 |
-
// Optimize thumbnails
|
336 |
-
$data = $this->optimize_thumbnails( $optimization_level, $data );
|
337 |
-
|
338 |
-
// Save the status to success
|
339 |
-
IMAGIFY_NGG_DB()->update(
|
340 |
-
$id,
|
341 |
-
array(
|
342 |
-
'pid' => $id,
|
343 |
-
'status' => 'success',
|
344 |
-
)
|
345 |
-
);
|
346 |
-
|
347 |
-
/**
|
348 |
-
* Fires after optimizing an attachment.
|
349 |
-
*
|
350 |
-
* @since 1.5
|
351 |
-
*
|
352 |
-
* @param int $id The attachment ID
|
353 |
-
* @param array $data The optimization data
|
354 |
-
*/
|
355 |
-
do_action( 'after_imagify_ngg_optimize_attachment', $id, $data );
|
356 |
-
|
357 |
-
delete_transient( 'imagify-ngg-async-in-progress-' . $id );
|
358 |
-
|
359 |
-
return $data;
|
360 |
-
}
|
361 |
-
|
362 |
-
/**
|
363 |
-
* Optimize all thumbnails of an image
|
364 |
-
*
|
365 |
-
* @since 1.5
|
366 |
-
* @author Jonathan Buttigieg
|
367 |
-
*
|
368 |
-
* @access public
|
369 |
-
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal)
|
370 |
-
* @return array $data The optimization data
|
371 |
-
*/
|
372 |
-
public function optimize_thumbnails( $optimization_level = null, $data = array() ) {
|
373 |
-
$id = $this->id;
|
374 |
-
$storage = C_Gallery_Storage::get_instance();
|
375 |
-
$sizes = $storage->get_image_sizes();
|
376 |
-
$data = ( (bool) $data ) ? $data : $this->get_data();
|
377 |
-
|
378 |
-
// Stop if the original image has an error
|
379 |
-
if ( $this->has_error() ) {
|
380 |
-
return $data;
|
381 |
-
}
|
382 |
-
|
383 |
-
$optimization_level = ( is_null( $optimization_level ) ) ? (int) get_imagify_option( 'optimization_level', 1 ) : (int) $optimization_level;
|
384 |
-
|
385 |
-
/**
|
386 |
-
* Fires before optimizing all thumbnails.
|
387 |
-
*
|
388 |
-
* @since 1.5
|
389 |
-
*
|
390 |
-
* @param int $id The image ID
|
391 |
-
*/
|
392 |
-
do_action( 'before_imagify_ngg_optimize_thumbnails', $id );
|
393 |
-
|
394 |
-
if ( (bool) $sizes ) {
|
395 |
-
foreach ( $sizes as $size_key ) {
|
396 |
-
if ( 'full' == $size_key || isset( $data['sizes'][ $size_key ]['success'] ) ) {
|
397 |
-
continue;
|
398 |
-
}
|
399 |
-
|
400 |
-
$thumbnail_path = $storage->get_image_abspath( $this->image, $size_key );
|
401 |
-
$thumbnail_url = $storage->get_image_url( $this->image, $size_key );
|
402 |
-
|
403 |
-
// Optimize the thumbnail size
|
404 |
-
$response = do_imagify( $thumbnail_path, array(
|
405 |
-
'backup' => false,
|
406 |
-
'optimization_level' => $optimization_level,
|
407 |
-
'context' => 'wp'
|
408 |
-
) );
|
409 |
-
$data = $this->fill_data( $data, $response, $id, $thumbnail_url, $size_key );
|
410 |
-
|
411 |
-
/** This filter is documented in /inc/classes/class-attachment.php */
|
412 |
-
$data = apply_filters( 'imagify_fill_ngg_thumbnail_data', $data, $response, $id, $thumbnail_path, $thumbnail_url, $size_key, $optimization_level );
|
413 |
-
}
|
414 |
-
|
415 |
-
IMAGIFY_NGG_DB()->update(
|
416 |
-
$id,
|
417 |
-
array(
|
418 |
-
'pid' => $id,
|
419 |
-
'data' => serialize( $data )
|
420 |
-
)
|
421 |
-
);
|
422 |
-
}
|
423 |
-
|
424 |
-
/**
|
425 |
-
* Fires after optimizing all thumbnails.
|
426 |
-
*
|
427 |
-
* @since 1.5
|
428 |
-
*
|
429 |
-
* @param int $id The image ID
|
430 |
-
* @param array $data The optimization data
|
431 |
-
*/
|
432 |
-
do_action( 'after_imagify_ngg_optimize_thumbnails', $id, $data );
|
433 |
-
|
434 |
-
return $data;
|
435 |
-
}
|
436 |
-
|
437 |
-
/**
|
438 |
-
* Process an attachment restoration from the backup file.
|
439 |
-
*
|
440 |
-
* @since 1.5
|
441 |
-
* @author Jonathan Buttigieg
|
442 |
-
*
|
443 |
-
* @access public
|
444 |
-
* @return void
|
445 |
-
*/
|
446 |
-
public function restore() {
|
447 |
-
// Stop the process if there is no backup file to restore
|
448 |
-
if ( ! $this->has_backup() ) {
|
449 |
-
return;
|
450 |
-
}
|
451 |
-
|
452 |
-
$id = $this->id;
|
453 |
-
$backup_path = $this->get_backup_path();
|
454 |
-
$attachment_path = $this->get_original_path();
|
455 |
-
|
456 |
-
/**
|
457 |
-
* Fires before restoring an attachment.
|
458 |
-
*
|
459 |
-
* @since 1.5
|
460 |
-
*
|
461 |
-
* @param int $id The attachment ID
|
462 |
-
*/
|
463 |
-
do_action( 'before_imagify_ngg_restore_attachment', $id );
|
464 |
-
|
465 |
-
// Create the original image from the backup
|
466 |
-
C_Gallery_Storage::get_instance()->recover_image( $id );
|
467 |
-
|
468 |
-
// Remove old optimization data
|
469 |
-
Imagify_NGG_DB()->delete( $id );
|
470 |
-
|
471 |
-
/**
|
472 |
-
* Fires after restoring an attachment.
|
473 |
-
*
|
474 |
-
* @since 1.5
|
475 |
-
*
|
476 |
-
* @param int $id The attachment ID
|
477 |
-
*/
|
478 |
-
do_action( 'after_imagify_ngg_restore_attachment', $id );
|
479 |
-
}
|
480 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-attachment.php
ADDED
@@ -0,0 +1,515 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Imagify NextGen Gallery attachment class.
|
6 |
+
*
|
7 |
+
* @since 1.5
|
8 |
+
* @author Jonathan Buttigieg
|
9 |
+
*/
|
10 |
+
class Imagify_NGG_Attachment extends Imagify_Attachment {
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Class version.
|
14 |
+
*
|
15 |
+
* @var string
|
16 |
+
*/
|
17 |
+
const VERSION = '1.0.1';
|
18 |
+
|
19 |
+
/**
|
20 |
+
* The image object.
|
21 |
+
*
|
22 |
+
* @since 1.5
|
23 |
+
*
|
24 |
+
* @var object A nggImage object.
|
25 |
+
* @access public
|
26 |
+
*/
|
27 |
+
public $image;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* The attachment SQL data row.
|
31 |
+
*
|
32 |
+
* @since 1.5
|
33 |
+
*
|
34 |
+
* @var array
|
35 |
+
* @access public
|
36 |
+
*/
|
37 |
+
public $row;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* The constructor.
|
41 |
+
*
|
42 |
+
* @since 1.5
|
43 |
+
* @author Jonathan Buttigieg
|
44 |
+
*
|
45 |
+
* @param int|object $id An image attachment ID or a NGG object.
|
46 |
+
* @return void
|
47 |
+
*/
|
48 |
+
public function __construct( $id ) {
|
49 |
+
if ( is_object( $id ) ) {
|
50 |
+
$this->image = $id;
|
51 |
+
$this->id = $id->pid;
|
52 |
+
} else {
|
53 |
+
$this->image = nggdb::find_image( (int) $id );
|
54 |
+
$this->id = $this->image->pid;
|
55 |
+
}
|
56 |
+
|
57 |
+
$this->row = $this->get_row();
|
58 |
+
|
59 |
+
// Load nggAdmin class.
|
60 |
+
$ngg_admin_functions_path = WP_PLUGIN_DIR . '/' . NGGFOLDER . '/products/photocrati_nextgen/modules/ngglegacy/admin/functions.php';
|
61 |
+
|
62 |
+
if ( ! class_exists( 'nggAdmin' ) && file_exists( $ngg_admin_functions_path ) ) {
|
63 |
+
require_once( $ngg_admin_functions_path );
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Get the attachment backup filepath.
|
69 |
+
*
|
70 |
+
* @since 1.5
|
71 |
+
* @author Jonathan Buttigieg
|
72 |
+
*
|
73 |
+
* @access public
|
74 |
+
* @return string|bool The path. False on failure.
|
75 |
+
*/
|
76 |
+
public function get_backup_path() {
|
77 |
+
$backup_path = $this->get_original_path() . '_backup';
|
78 |
+
|
79 |
+
if ( file_exists( $backup_path ) ) {
|
80 |
+
return $backup_path;
|
81 |
+
}
|
82 |
+
|
83 |
+
return false;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Get the attachment optimization data.
|
88 |
+
*
|
89 |
+
* @since 1.5
|
90 |
+
* @author Jonathan Buttigieg
|
91 |
+
*
|
92 |
+
* @access public
|
93 |
+
* @return array|bool
|
94 |
+
*/
|
95 |
+
public function get_data() {
|
96 |
+
$row = $this->row ? $this->row : $this->get_row();
|
97 |
+
return isset( $row['data'] ) ? maybe_unserialize( $row['data'] ) : false;
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Get the attachment optimization level.
|
102 |
+
*
|
103 |
+
* @since 1.5
|
104 |
+
* @author Jonathan Buttigieg
|
105 |
+
*
|
106 |
+
* @access public
|
107 |
+
* @return int|bool
|
108 |
+
*/
|
109 |
+
public function get_optimization_level() {
|
110 |
+
$row = $this->row ? $this->row : $this->get_row();
|
111 |
+
return isset( $row['optimization_level'] ) ? (int) $row['optimization_level'] : false;
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Get the attachment SQL data row.
|
116 |
+
*
|
117 |
+
* @since 1.5
|
118 |
+
* @author Jonathan Buttigieg
|
119 |
+
*
|
120 |
+
* @access public
|
121 |
+
* @return array
|
122 |
+
*/
|
123 |
+
public function get_row() {
|
124 |
+
return imagify_ngg_db()->get( $this->id );
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Get the attachment optimization status (success or error).
|
129 |
+
*
|
130 |
+
* @since 1.5
|
131 |
+
* @author Jonathan Buttigieg
|
132 |
+
*
|
133 |
+
* @access public
|
134 |
+
* @return string|bool
|
135 |
+
*/
|
136 |
+
public function get_status() {
|
137 |
+
$row = $this->row ? $this->row : $this->get_row();
|
138 |
+
return isset( $row['status'] ) ? $row['status'] : false;
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Get the original attachment path.
|
143 |
+
*
|
144 |
+
* @since 1.5
|
145 |
+
* @author Jonathan Buttigieg
|
146 |
+
*
|
147 |
+
* @access public
|
148 |
+
* @return string
|
149 |
+
*/
|
150 |
+
public function get_original_path() {
|
151 |
+
return $this->image->imagePath;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Get the original attachment URL.
|
156 |
+
*
|
157 |
+
* @since 1.5
|
158 |
+
* @author Jonathan Buttigieg
|
159 |
+
*
|
160 |
+
* @access public
|
161 |
+
* @return string
|
162 |
+
*/
|
163 |
+
public function get_original_url() {
|
164 |
+
return $this->image->imageURL;
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Update the metadata size of the attachment.
|
169 |
+
*
|
170 |
+
* @since 1.5
|
171 |
+
*
|
172 |
+
* @access public
|
173 |
+
* @return void
|
174 |
+
*/
|
175 |
+
public function update_metadata_size() {
|
176 |
+
$size = @getimagesize( $this->get_original_path() );
|
177 |
+
|
178 |
+
if ( isset( $size[0], $size[1] ) ) {
|
179 |
+
$metadata = $this->image->meta_data;
|
180 |
+
$metadata['width'] = $size[0];
|
181 |
+
$metadata['height'] = $size[1];
|
182 |
+
$metadata['full']['width'] = $size[0];
|
183 |
+
$metadata['full']['height'] = $size[1];
|
184 |
+
|
185 |
+
nggdb::update_image_meta( $this->id , $metadata );
|
186 |
+
}
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Fills statistics data with values from $data array.
|
191 |
+
*
|
192 |
+
* @since 1.5
|
193 |
+
* @since 1.6.5 Not static anymore.
|
194 |
+
* @author Jonathan Buttigieg
|
195 |
+
* @access public
|
196 |
+
*
|
197 |
+
* @param array $data The statistics data.
|
198 |
+
* @param object $response The API response.
|
199 |
+
* @param int $id The attachment ID.
|
200 |
+
* @param int $url The attachment URL.
|
201 |
+
* @param string $size The attachment size key.
|
202 |
+
* @return bool|array False if the original size has an error or an array contains the data for other result.
|
203 |
+
*/
|
204 |
+
public function fill_data( $data, $response, $id, $url, $size = 'full' ) {
|
205 |
+
$data['sizes'] = ! empty( $data['sizes'] ) && is_array( $data['sizes'] ) ? $data['sizes'] : array();
|
206 |
+
|
207 |
+
if ( is_wp_error( $response ) ) {
|
208 |
+
$error = $response->get_error_message();
|
209 |
+
$error_status = 'error';
|
210 |
+
|
211 |
+
$data['sizes'][ $size ] = array(
|
212 |
+
'success' => false,
|
213 |
+
'error' => $error,
|
214 |
+
);
|
215 |
+
|
216 |
+
// Update the error status for the original size.
|
217 |
+
if ( 'full' === $size ) {
|
218 |
+
if ( false !== strpos( $error, 'This image is already compressed' ) ) {
|
219 |
+
$error_status = 'already_optimized';
|
220 |
+
}
|
221 |
+
|
222 |
+
imagify_ngg_db()->update( $id, array(
|
223 |
+
'pid' => $id,
|
224 |
+
'status' => $error_status,
|
225 |
+
'data' => serialize( $data ),
|
226 |
+
) );
|
227 |
+
|
228 |
+
return false;
|
229 |
+
}
|
230 |
+
} else {
|
231 |
+
$response = (object) array_merge( array(
|
232 |
+
'original_size' => 0,
|
233 |
+
'new_size' => 0,
|
234 |
+
'percent' => 0,
|
235 |
+
), (array) $response );
|
236 |
+
|
237 |
+
$data['sizes'][ $size ] = array(
|
238 |
+
'success' => true,
|
239 |
+
'file_url' => $url,
|
240 |
+
'original_size' => $response->original_size,
|
241 |
+
'optimized_size' => $response->new_size,
|
242 |
+
'percent' => $response->percent,
|
243 |
+
);
|
244 |
+
|
245 |
+
$data['stats']['original_size'] += $response->original_size;
|
246 |
+
$data['stats']['optimized_size'] += $response->new_size;
|
247 |
+
$data['stats']['percent'] = round( ( ( $data['stats']['original_size'] - $data['stats']['optimized_size'] ) / $data['stats']['original_size'] ) * 100, 2 );
|
248 |
+
} // End if().
|
249 |
+
|
250 |
+
return $data;
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Optimize all sizes with Imagify.
|
255 |
+
*
|
256 |
+
* @since 1.5
|
257 |
+
* @author Jonathan Buttigieg
|
258 |
+
*
|
259 |
+
* @access public
|
260 |
+
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal).
|
261 |
+
* @param array $metadata The attachment meta data (not used here).
|
262 |
+
* @return array $data The optimization data.
|
263 |
+
*/
|
264 |
+
public function optimize( $optimization_level = null, $metadata = array() ) {
|
265 |
+
$optimization_level = is_null( $optimization_level ) ? (int) get_imagify_option( 'optimization_level', 1 ) : (int) $optimization_level;
|
266 |
+
|
267 |
+
$data = array(
|
268 |
+
'stats' => array(
|
269 |
+
'original_size' => 0,
|
270 |
+
'optimized_size' => 0,
|
271 |
+
'percent' => 0,
|
272 |
+
),
|
273 |
+
);
|
274 |
+
|
275 |
+
// To avoid issue with "original_size" at 0 in "_imagify_data".
|
276 |
+
if ( 0 === (int) $this->get_stats_data( 'original_size' ) ) {
|
277 |
+
delete_post_meta( $this->id, '_imagify_data' );
|
278 |
+
delete_post_meta( $this->id, '_imagify_status' );
|
279 |
+
delete_post_meta( $this->id, '_imagify_optimization_level' );
|
280 |
+
}
|
281 |
+
|
282 |
+
// Get file path & URL for original image.
|
283 |
+
$attachment_path = $this->get_original_path();
|
284 |
+
$attachment_url = $this->get_original_url();
|
285 |
+
$attachment_original_size = $this->get_original_size( false );
|
286 |
+
|
287 |
+
// Check if the full size is already optimized.
|
288 |
+
if ( $this->is_optimized() && ( $this->get_optimization_level() === $optimization_level ) ) {
|
289 |
+
return;
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Fires before optimizing an attachment.
|
294 |
+
*
|
295 |
+
* @since 1.5
|
296 |
+
*
|
297 |
+
* @param int $id The attachment ID
|
298 |
+
*/
|
299 |
+
do_action( 'before_imagify_ngg_optimize_attachment', $this->id );
|
300 |
+
|
301 |
+
set_transient( 'imagify-ngg-async-in-progress-' . $this->id, true, 10 * MINUTE_IN_SECONDS );
|
302 |
+
|
303 |
+
// Get the resize values for the original size.
|
304 |
+
$resized = false;
|
305 |
+
$do_resize = get_imagify_option( 'resize_larger', false );
|
306 |
+
$resize_width = get_imagify_option( 'resize_larger_w' );
|
307 |
+
$attachment_size = @getimagesize( $attachment_path );
|
308 |
+
|
309 |
+
if ( $do_resize && isset( $attachment_size[0] ) && $resize_width < $attachment_size[0] ) {
|
310 |
+
$resized_attachment_path = $this->resize( $attachment_path, $attachment_size, $resize_width );
|
311 |
+
|
312 |
+
if ( ! is_wp_error( $resized_attachment_path ) ) {
|
313 |
+
$filesystem = imagify_get_filesystem();
|
314 |
+
|
315 |
+
if ( get_imagify_option( 'backup', false ) ) {
|
316 |
+
$backup_path = get_imagify_attachment_backup_path( $attachment_path );
|
317 |
+
$backup_path_info = pathinfo( $backup_path );
|
318 |
+
|
319 |
+
wp_mkdir_p( $backup_path_info['dirname'] );
|
320 |
+
|
321 |
+
// TO DO - check and send a error message if the backup can't be created.
|
322 |
+
$filesystem->copy( $attachment_path, $backup_path, true );
|
323 |
+
imagify_chmod_file( $backup_path );
|
324 |
+
}
|
325 |
+
|
326 |
+
$filesystem->move( $resized_attachment_path, $attachment_path, true );
|
327 |
+
imagify_chmod_file( $attachment_path );
|
328 |
+
|
329 |
+
// If resized temp file still exists, delete it.
|
330 |
+
if ( $filesystem->exists( $resized_attachment_path ) ) {
|
331 |
+
$filesystem->delete( $resized_attachment_path );
|
332 |
+
}
|
333 |
+
|
334 |
+
$resized = true;
|
335 |
+
}
|
336 |
+
}
|
337 |
+
|
338 |
+
// Optimize the original size.
|
339 |
+
$response = do_imagify( $attachment_path, array(
|
340 |
+
'optimization_level' => $optimization_level,
|
341 |
+
'context' => 'NGG',
|
342 |
+
'resized' => $resized,
|
343 |
+
'original_size' => $attachment_original_size,
|
344 |
+
) );
|
345 |
+
$data = $this->fill_data( $data, $response, $this->id, $attachment_url );
|
346 |
+
|
347 |
+
if ( ! $data ) {
|
348 |
+
delete_transient( 'imagify-ngg-async-in-progress-' . $this->id );
|
349 |
+
return;
|
350 |
+
}
|
351 |
+
|
352 |
+
// Save the optimization level.
|
353 |
+
imagify_ngg_db()->update( $this->id, array(
|
354 |
+
'pid' => $this->id,
|
355 |
+
'optimization_level' => $optimization_level,
|
356 |
+
) );
|
357 |
+
|
358 |
+
// If we resized the original with success, we have to update the attachment metadata.
|
359 |
+
// If not, WordPress keeps the old attachment size.
|
360 |
+
if ( $do_resize && $resized ) {
|
361 |
+
$this->update_metadata_size();
|
362 |
+
}
|
363 |
+
|
364 |
+
// Optimize thumbnails.
|
365 |
+
$data = $this->optimize_thumbnails( $optimization_level, $data );
|
366 |
+
|
367 |
+
// Save the status to success.
|
368 |
+
imagify_ngg_db()->update( $this->id, array(
|
369 |
+
'pid' => $this->id,
|
370 |
+
'status' => 'success',
|
371 |
+
) );
|
372 |
+
|
373 |
+
/**
|
374 |
+
* Fires after optimizing an attachment.
|
375 |
+
*
|
376 |
+
* @since 1.5
|
377 |
+
*
|
378 |
+
* @param int $id The attachment ID.
|
379 |
+
* @param array $data The optimization data.
|
380 |
+
*/
|
381 |
+
do_action( 'after_imagify_ngg_optimize_attachment', $this->id, $data );
|
382 |
+
|
383 |
+
delete_transient( 'imagify-ngg-async-in-progress-' . $this->id );
|
384 |
+
|
385 |
+
return $data;
|
386 |
+
}
|
387 |
+
|
388 |
+
/**
|
389 |
+
* Optimize all thumbnails of an image.
|
390 |
+
*
|
391 |
+
* @since 1.5
|
392 |
+
* @author Jonathan Buttigieg
|
393 |
+
*
|
394 |
+
* @access public
|
395 |
+
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal).
|
396 |
+
* @param array $data The optimization data.
|
397 |
+
* @return array $data The optimization data.
|
398 |
+
*/
|
399 |
+
public function optimize_thumbnails( $optimization_level = null, $data = array() ) {
|
400 |
+
$storage = C_Gallery_Storage::get_instance();
|
401 |
+
$sizes = $storage->get_image_sizes();
|
402 |
+
$data = $data ? $data : $this->get_data();
|
403 |
+
|
404 |
+
// Stop if the original image has an error.
|
405 |
+
if ( $this->has_error() ) {
|
406 |
+
return $data;
|
407 |
+
}
|
408 |
+
|
409 |
+
$optimization_level = is_null( $optimization_level ) ? (int) get_imagify_option( 'optimization_level', 1 ) : (int) $optimization_level;
|
410 |
+
|
411 |
+
/**
|
412 |
+
* Fires before optimizing all thumbnails.
|
413 |
+
*
|
414 |
+
* @since 1.5
|
415 |
+
*
|
416 |
+
* @param int $id The image ID.
|
417 |
+
*/
|
418 |
+
do_action( 'before_imagify_ngg_optimize_thumbnails', $this->id );
|
419 |
+
|
420 |
+
if ( $sizes ) {
|
421 |
+
foreach ( $sizes as $size_key ) {
|
422 |
+
if ( 'full' === $size_key || isset( $data['sizes'][ $size_key ]['success'] ) ) {
|
423 |
+
continue;
|
424 |
+
}
|
425 |
+
|
426 |
+
$thumbnail_path = $storage->get_image_abspath( $this->image, $size_key );
|
427 |
+
$thumbnail_url = $storage->get_image_url( $this->image, $size_key );
|
428 |
+
|
429 |
+
// Optimize the thumbnail size.
|
430 |
+
$response = do_imagify( $thumbnail_path, array(
|
431 |
+
'backup' => false,
|
432 |
+
'optimization_level' => $optimization_level,
|
433 |
+
'context' => 'wp',
|
434 |
+
) );
|
435 |
+
$data = $this->fill_data( $data, $response, $this->id, $thumbnail_url, $size_key );
|
436 |
+
|
437 |
+
/**
|
438 |
+
* Filter the optimization data of a specific thumbnail.
|
439 |
+
*
|
440 |
+
* @since 1.5
|
441 |
+
*
|
442 |
+
* @param array $data The statistics data.
|
443 |
+
* @param object $response The API response.
|
444 |
+
* @param int $id The attachment ID.
|
445 |
+
* @param string $thumbnail_path The attachment path.
|
446 |
+
* @param string $thumbnail_url The attachment URL.
|
447 |
+
* @param string $size_key The attachment size key.
|
448 |
+
* @param bool $is_aggressive The optimization level.
|
449 |
+
* @return array $data The new optimization data.
|
450 |
+
*/
|
451 |
+
$data = apply_filters( 'imagify_fill_ngg_thumbnail_data', $data, $response, $this->id, $thumbnail_path, $thumbnail_url, $size_key, $optimization_level );
|
452 |
+
}
|
453 |
+
|
454 |
+
imagify_ngg_db()->update( $this->id, array(
|
455 |
+
'pid' => $this->id,
|
456 |
+
'data' => serialize( $data ),
|
457 |
+
) );
|
458 |
+
} // End if().
|
459 |
+
|
460 |
+
/**
|
461 |
+
* Fires after optimizing all thumbnails.
|
462 |
+
*
|
463 |
+
* @since 1.5
|
464 |
+
*
|
465 |
+
* @param int $id The image ID.
|
466 |
+
* @param array $data The optimization data.
|
467 |
+
*/
|
468 |
+
do_action( 'after_imagify_ngg_optimize_thumbnails', $this->id, $data );
|
469 |
+
|
470 |
+
return $data;
|
471 |
+
}
|
472 |
+
|
473 |
+
/**
|
474 |
+
* Process an attachment restoration from the backup file.
|
475 |
+
*
|
476 |
+
* @since 1.5
|
477 |
+
* @author Jonathan Buttigieg
|
478 |
+
*
|
479 |
+
* @access public
|
480 |
+
* @return void
|
481 |
+
*/
|
482 |
+
public function restore() {
|
483 |
+
// Stop the process if there is no backup file to restore.
|
484 |
+
if ( ! $this->has_backup() ) {
|
485 |
+
return;
|
486 |
+
}
|
487 |
+
|
488 |
+
$backup_path = $this->get_backup_path();
|
489 |
+
$attachment_path = $this->get_original_path();
|
490 |
+
|
491 |
+
/**
|
492 |
+
* Fires before restoring an attachment.
|
493 |
+
*
|
494 |
+
* @since 1.5
|
495 |
+
*
|
496 |
+
* @param int $id The attachment ID.
|
497 |
+
*/
|
498 |
+
do_action( 'before_imagify_ngg_restore_attachment', $this->id );
|
499 |
+
|
500 |
+
// Create the original image from the backup.
|
501 |
+
C_Gallery_Storage::get_instance()->recover_image( $this->id );
|
502 |
+
|
503 |
+
// Remove old optimization data.
|
504 |
+
imagify_ngg_db()->delete( $this->id );
|
505 |
+
|
506 |
+
/**
|
507 |
+
* Fires after restoring an attachment.
|
508 |
+
*
|
509 |
+
* @since 1.5
|
510 |
+
*
|
511 |
+
* @param int $id The attachment ID.
|
512 |
+
*/
|
513 |
+
do_action( 'after_imagify_ngg_restore_attachment', $this->id );
|
514 |
+
}
|
515 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/classes/{class-db.php → class-imagify-ngg-db.php}
RENAMED
@@ -1,67 +1,75 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
* Imagify NextGen Gallery DB class
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
-
*/
|
10 |
class Imagify_NGG_DB extends Imagify_Abstract_DB {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
/**
|
12 |
-
* The single instance of the class
|
13 |
*
|
14 |
* @access protected
|
15 |
* @since 1.5
|
|
|
|
|
16 |
*/
|
17 |
-
protected static $_instance
|
18 |
-
|
19 |
/**
|
20 |
-
* Get things started
|
21 |
*
|
22 |
* @access public
|
23 |
* @since 1.5
|
24 |
-
* @author
|
25 |
*/
|
26 |
-
|
27 |
global $wpdb;
|
28 |
-
|
29 |
$this->table_name = $wpdb->prefix . 'ngg_imagify_data';
|
30 |
-
$this->primary_key = 'pid'; //
|
31 |
$this->version = '1.0';
|
32 |
-
|
33 |
-
// Database declaration
|
34 |
$wpdb->ngg_imagify_data = $this->table_name;
|
35 |
-
|
36 |
-
// Add table to the index of WordPress tables
|
37 |
$wpdb->tables[] = 'ngg_imagify_data';
|
38 |
}
|
39 |
-
|
40 |
/**
|
41 |
-
*
|
42 |
-
*
|
43 |
-
* Ensures only one instance of class is loaded or can be loaded.
|
44 |
*
|
45 |
* @access public
|
46 |
-
* @since 1.5
|
47 |
-
* @author
|
48 |
*
|
49 |
-
* @return Main instance
|
50 |
*/
|
51 |
-
public static function
|
52 |
-
if (
|
53 |
self::$_instance = new self();
|
54 |
}
|
55 |
|
56 |
return self::$_instance;
|
57 |
}
|
58 |
-
|
59 |
/**
|
60 |
-
* Whitelist of columns
|
61 |
*
|
62 |
* @access public
|
63 |
* @since 1.5
|
64 |
-
* @author
|
65 |
*
|
66 |
* @return array
|
67 |
*/
|
@@ -76,11 +84,11 @@ class Imagify_NGG_DB extends Imagify_Abstract_DB {
|
|
76 |
}
|
77 |
|
78 |
/**
|
79 |
-
* Default column values
|
80 |
*
|
81 |
* @access public
|
82 |
* @since 1.5
|
83 |
-
* @author
|
84 |
*
|
85 |
* @return array
|
86 |
*/
|
@@ -92,49 +100,67 @@ class Imagify_NGG_DB extends Imagify_Abstract_DB {
|
|
92 |
'data' => '',
|
93 |
);
|
94 |
}
|
95 |
-
|
96 |
/**
|
97 |
-
* Create the table
|
98 |
*
|
99 |
* @access public
|
100 |
* @since 1.5
|
101 |
* @author Jonathan Buttigieg
|
102 |
-
|
103 |
public function create_table() {
|
104 |
global $wpdb;
|
105 |
-
|
106 |
if ( ! empty( $wpdb->charset ) ) {
|
107 |
$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
|
108 |
}
|
109 |
-
|
110 |
if ( ! empty( $wpdb->collate ) ) {
|
111 |
$charset_collate .= " COLLATE $wpdb->collate";
|
112 |
}
|
113 |
-
|
114 |
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
115 |
-
|
116 |
-
$sql = "CREATE TABLE
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
) $charset_collate;";
|
124 |
-
|
125 |
maybe_create_table( $this->table_name, $sql );
|
126 |
-
|
127 |
update_option( $this->table_name . '_db_version', $this->version );
|
128 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
}
|
130 |
|
131 |
/**
|
132 |
-
* Returns the main instance of
|
133 |
*
|
134 |
-
* @since 1.5
|
135 |
* @author Jonathan Buttigieg
|
|
|
|
|
136 |
*/
|
137 |
-
function
|
138 |
-
return Imagify_NGG_DB::
|
139 |
}
|
140 |
-
$GLOBALS['imagify_ngg_db'] = Imagify_NGG_DB();
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* Imagify NextGen Gallery DB class.
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
+
*/
|
10 |
class Imagify_NGG_DB extends Imagify_Abstract_DB {
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Class version.
|
14 |
+
*
|
15 |
+
* @var string
|
16 |
+
*/
|
17 |
+
const VERSION = '1.0.1';
|
18 |
+
|
19 |
/**
|
20 |
+
* The single instance of the class.
|
21 |
*
|
22 |
* @access protected
|
23 |
* @since 1.5
|
24 |
+
*
|
25 |
+
* @var object
|
26 |
*/
|
27 |
+
protected static $_instance;
|
28 |
+
|
29 |
/**
|
30 |
+
* Get things started.
|
31 |
*
|
32 |
* @access public
|
33 |
* @since 1.5
|
34 |
+
* @author Jonathan Buttigieg
|
35 |
*/
|
36 |
+
protected function __construct() {
|
37 |
global $wpdb;
|
38 |
+
|
39 |
$this->table_name = $wpdb->prefix . 'ngg_imagify_data';
|
40 |
+
$this->primary_key = 'pid'; // Instead of data_id.
|
41 |
$this->version = '1.0';
|
42 |
+
|
43 |
+
// Database declaration.
|
44 |
$wpdb->ngg_imagify_data = $this->table_name;
|
45 |
+
|
46 |
+
// Add table to the index of WordPress tables.
|
47 |
$wpdb->tables[] = 'ngg_imagify_data';
|
48 |
}
|
49 |
+
|
50 |
/**
|
51 |
+
* Get the main Instance.
|
|
|
|
|
52 |
*
|
53 |
* @access public
|
54 |
+
* @since 1.6.5
|
55 |
+
* @author Grégory Viguier
|
56 |
*
|
57 |
+
* @return object Main instance.
|
58 |
*/
|
59 |
+
public static function get_instance() {
|
60 |
+
if ( ! isset( self::$_instance ) ) {
|
61 |
self::$_instance = new self();
|
62 |
}
|
63 |
|
64 |
return self::$_instance;
|
65 |
}
|
66 |
+
|
67 |
/**
|
68 |
+
* Whitelist of columns.
|
69 |
*
|
70 |
* @access public
|
71 |
* @since 1.5
|
72 |
+
* @author Jonathan Buttigieg
|
73 |
*
|
74 |
* @return array
|
75 |
*/
|
84 |
}
|
85 |
|
86 |
/**
|
87 |
+
* Default column values.
|
88 |
*
|
89 |
* @access public
|
90 |
* @since 1.5
|
91 |
+
* @author Jonathan Buttigieg
|
92 |
*
|
93 |
* @return array
|
94 |
*/
|
100 |
'data' => '',
|
101 |
);
|
102 |
}
|
103 |
+
|
104 |
/**
|
105 |
+
* Create the table.
|
106 |
*
|
107 |
* @access public
|
108 |
* @since 1.5
|
109 |
* @author Jonathan Buttigieg
|
110 |
+
*/
|
111 |
public function create_table() {
|
112 |
global $wpdb;
|
113 |
+
|
114 |
if ( ! empty( $wpdb->charset ) ) {
|
115 |
$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
|
116 |
}
|
117 |
+
|
118 |
if ( ! empty( $wpdb->collate ) ) {
|
119 |
$charset_collate .= " COLLATE $wpdb->collate";
|
120 |
}
|
121 |
+
|
122 |
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
|
123 |
+
|
124 |
+
$sql = "CREATE TABLE {$this->table_name} (
|
125 |
+
data_id int(11) NOT NULL AUTO_INCREMENT,
|
126 |
+
pid int(11) NOT NULL,
|
127 |
+
optimization_level varchar(1) NOT NULL,
|
128 |
+
status varchar(30) NOT NULL,
|
129 |
+
data longtext NOT NULL,
|
130 |
+
PRIMARY KEY (data_id)
|
131 |
) $charset_collate;";
|
132 |
+
|
133 |
maybe_create_table( $this->table_name, $sql );
|
134 |
+
|
135 |
update_option( $this->table_name . '_db_version', $this->version );
|
136 |
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Main Instance.
|
140 |
+
* Ensures only one instance of class is loaded or can be loaded.
|
141 |
+
* Well, actually it ensures nothing since it's not a full singleton pattern.
|
142 |
+
*
|
143 |
+
* @access public
|
144 |
+
* @since 1.5
|
145 |
+
* @author Jonathan Buttigieg
|
146 |
+
*
|
147 |
+
* @return object Main instance.
|
148 |
+
*/
|
149 |
+
public static function instance() {
|
150 |
+
$class_name = get_class( $this );
|
151 |
+
_deprecated_function( $class_name . '::' . __FUNCTION__ . '()', '1.6.5', 'imagify_ngg_db()' );
|
152 |
+
return self::get_instance();
|
153 |
+
}
|
154 |
}
|
155 |
|
156 |
/**
|
157 |
+
* Returns the main instance of the Imagify_NGG_DB class.
|
158 |
*
|
159 |
+
* @since 1.6.5
|
160 |
* @author Jonathan Buttigieg
|
161 |
+
*
|
162 |
+
* @return object The Imagify_NGG_DB instance.
|
163 |
*/
|
164 |
+
function imagify_ngg_db() {
|
165 |
+
return Imagify_NGG_DB::get_instance();
|
166 |
}
|
|
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg-storage.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Imagify NextGen Gallery storage class.
|
6 |
+
*
|
7 |
+
* @since 1.5
|
8 |
+
* @author Jonathan Buttigieg
|
9 |
+
*/
|
10 |
+
class Imagify_NGG_Storage extends Mixin {
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Class version.
|
14 |
+
*
|
15 |
+
* @var string
|
16 |
+
*/
|
17 |
+
const VERSION = '1.0.1';
|
18 |
+
|
19 |
+
/**
|
20 |
+
* Delete a gallery AND all the pictures associated to this gallery!
|
21 |
+
*
|
22 |
+
* @since 1.5
|
23 |
+
* @author Jonathan Buttigieg
|
24 |
+
*
|
25 |
+
* @param int|object $gallery A gallery ID or object.
|
26 |
+
* @return bool Whetther tha gallery was been deleted or not.
|
27 |
+
*/
|
28 |
+
public function delete_gallery( $gallery ) {
|
29 |
+
$gallery_id = is_numeric( $gallery ) ? $gallery : $gallery->{$gallery->id_field};
|
30 |
+
$images_id = nggdb::get_ids_from_gallery( $gallery_id );
|
31 |
+
|
32 |
+
foreach ( $images_id as $pid ) {
|
33 |
+
imagify_ngg_db()->delete( $pid );
|
34 |
+
}
|
35 |
+
|
36 |
+
return $this->call_parent( 'delete_gallery', $gallery );
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Generates a specific size for an image.
|
41 |
+
*
|
42 |
+
* @since 1.5
|
43 |
+
* @author Jonathan Buttigieg
|
44 |
+
*
|
45 |
+
* @param int|object $image An image ID or NGG object.
|
46 |
+
* @param string $size An image size.
|
47 |
+
* @param array $params An array of parameters.
|
48 |
+
* @param bool $skip_defaults Whatever NGG does with default settings.
|
49 |
+
* @return bool|object An object on success. False on failure.
|
50 |
+
*/
|
51 |
+
public function generate_image_size( $image, $size, $params = null, $skip_defaults = false ) {
|
52 |
+
// $image could be an object or an (int) image ID.
|
53 |
+
if ( is_numeric( $image ) ) {
|
54 |
+
$image = $this->object->_image_mapper->find( $image );
|
55 |
+
}
|
56 |
+
|
57 |
+
// If a user adds a watermark, rotates or resizes an image, we restore it.
|
58 |
+
// TO DO - waiting for a hook to be able to re-optimize the original size after restoring.
|
59 |
+
if ( isset( $image->pid ) && ( true === $params['watermark'] || ( isset( $params['rotation'] ) || isset( $params['flip'] ) ) || ( ! empty( $params['width'] ) || ! empty( $params['height'] ) ) ) ) {
|
60 |
+
$attachment = new Imagify_NGG_Attachment( $image->pid );
|
61 |
+
|
62 |
+
if ( $attachment->is_optimized() ) {
|
63 |
+
imagify_ngg_db()->delete( $image->pid );
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
return $this->call_parent( 'generate_image_size', $image, $size, $params, $skip_defaults );
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Recover image from backup copy and reprocess it.
|
72 |
+
*
|
73 |
+
* @since 1.5
|
74 |
+
* @author Jonathan Buttigieg
|
75 |
+
*
|
76 |
+
* @param int|object $image An image ID or NGG object.
|
77 |
+
* @return string|bool Result code on success. False on failure.
|
78 |
+
*/
|
79 |
+
public function recover_image( $image ) {
|
80 |
+
// $image could be an object or an (int) image ID.
|
81 |
+
if ( is_numeric( $image ) ) {
|
82 |
+
$image = $this->object->_image_mapper->find( $image );
|
83 |
+
}
|
84 |
+
|
85 |
+
// Remove Imagify data.
|
86 |
+
if ( isset( $image->pid ) ) {
|
87 |
+
imagify_ngg_db()->delete( $image->pid );
|
88 |
+
}
|
89 |
+
|
90 |
+
return $this->call_parent( 'recover_image', $image );
|
91 |
+
}
|
92 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/classes/class-imagify-ngg.php
ADDED
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Imagify NextGen Gallery class.
|
6 |
+
*
|
7 |
+
* @since 1.5
|
8 |
+
* @author Jonathan Buttigieg
|
9 |
+
*/
|
10 |
+
class Imagify_NGG {
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Class version.
|
14 |
+
*
|
15 |
+
* @var string
|
16 |
+
*/
|
17 |
+
const VERSION = '1.0.2';
|
18 |
+
|
19 |
+
/**
|
20 |
+
* The single instance of the class.
|
21 |
+
*
|
22 |
+
* @access protected
|
23 |
+
* @since 1.5
|
24 |
+
*
|
25 |
+
* @var object
|
26 |
+
*/
|
27 |
+
protected static $_instance;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* The constructor.
|
31 |
+
*
|
32 |
+
* @since 1.5
|
33 |
+
* @since 1.6.5 Doesn't launch the hooks anymore.
|
34 |
+
* @author Jonathan Buttigieg
|
35 |
+
*
|
36 |
+
* @return void
|
37 |
+
*/
|
38 |
+
protected function __construct() {}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Launch the hooks.
|
42 |
+
*
|
43 |
+
* @since 1.6.5
|
44 |
+
* @author Grégory Viguier
|
45 |
+
*/
|
46 |
+
public function init() {
|
47 |
+
static $done = false;
|
48 |
+
|
49 |
+
if ( $done ) {
|
50 |
+
return;
|
51 |
+
}
|
52 |
+
$done = true;
|
53 |
+
|
54 |
+
add_action( 'init', array( $this, 'add_mixin' ) );
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Get the main Instance.
|
59 |
+
*
|
60 |
+
* Ensures only one instance of class is loaded or can be loaded.
|
61 |
+
*
|
62 |
+
* @access public
|
63 |
+
* @since 1.6.5
|
64 |
+
* @author Grégory Viguier
|
65 |
+
*
|
66 |
+
* @return object Main instance.
|
67 |
+
*/
|
68 |
+
public static function get_instance() {
|
69 |
+
if ( ! isset( self::$_instance ) ) {
|
70 |
+
self::$_instance = new self();
|
71 |
+
}
|
72 |
+
|
73 |
+
return self::$_instance;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Add custom NGG mixin to override its functions.
|
78 |
+
*
|
79 |
+
* @since 1.5
|
80 |
+
* @author Jonathan Buttigieg
|
81 |
+
*
|
82 |
+
* @return void
|
83 |
+
*/
|
84 |
+
function add_mixin() {
|
85 |
+
include_once( 'class-imagify-ngg-storage.php' );
|
86 |
+
C_Gallery_Storage::get_instance()->get_wrapped_instance()->add_mixin( 'Imagify_NGG_Storage' );
|
87 |
+
}
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Returns the main instance of the Imagify_NGG class.
|
92 |
+
*
|
93 |
+
* @since 1.6.5
|
94 |
+
* @author Grégory Viguier
|
95 |
+
*
|
96 |
+
* @return object The Imagify_NGG instance.
|
97 |
+
*/
|
98 |
+
function imagify_ngg() {
|
99 |
+
return Imagify_NGG::get_instance();
|
100 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/classes/class-ngg-storage.php
DELETED
@@ -1,72 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
3 |
-
|
4 |
-
class Imagify_NGG_Storage extends Mixin {
|
5 |
-
/**
|
6 |
-
* Delete a gallery AND all the pictures associated to this gallery!
|
7 |
-
*
|
8 |
-
* @since 1.5
|
9 |
-
* @author Jonathan Buttigieg
|
10 |
-
*
|
11 |
-
* @return parent
|
12 |
-
*/
|
13 |
-
public function delete_gallery( $gallery ) {
|
14 |
-
$gallery_id = is_numeric( $gallery ) ? $gallery : $gallery->{$gallery->id_field};
|
15 |
-
$images_id = nggdb::get_ids_from_gallery( $gallery_id );
|
16 |
-
|
17 |
-
foreach( $images_id as $pid ) {
|
18 |
-
Imagify_NGG_DB()->delete( $pid );
|
19 |
-
}
|
20 |
-
|
21 |
-
return $this->call_parent( 'delete_gallery', $gallery );
|
22 |
-
}
|
23 |
-
|
24 |
-
/**
|
25 |
-
* Generates a specific size for an image
|
26 |
-
*
|
27 |
-
* @since 1.5
|
28 |
-
* @author Jonathan Buttigieg
|
29 |
-
*
|
30 |
-
* @return parent
|
31 |
-
*/
|
32 |
-
public function generate_image_size( $image, $size, $params = null, $skip_defaults = false ) {
|
33 |
-
// $image could be an object or an (int) image ID
|
34 |
-
if ( is_numeric( $image ) ) {
|
35 |
-
$image = $this->object->_image_mapper->find( $image );
|
36 |
-
}
|
37 |
-
|
38 |
-
// If a user adds a watermark, rotates or resizes an image, we restore it
|
39 |
-
// TO DO - waiting for a hook to be able to re-optimize the original size after restoring
|
40 |
-
if ( isset( $image->pid ) && ( true === $params['watermark'] || ( isset( $params['rotation'] ) || isset( $params['flip'] ) ) || ( ! empty( $params['width'] ) || ! empty( $params['height'] ) ) ) ) {
|
41 |
-
$attachment = new Imagify_NGG_Attachment( $image->pid );
|
42 |
-
|
43 |
-
if ( $attachment->is_optimized() ) {
|
44 |
-
Imagify_NGG_DB()->delete( $image->pid );
|
45 |
-
}
|
46 |
-
}
|
47 |
-
|
48 |
-
return $this->call_parent( 'generate_image_size', $image, $size, $params, $skip_defaults );
|
49 |
-
}
|
50 |
-
|
51 |
-
/**
|
52 |
-
* Recover image from backup copy and reprocess it
|
53 |
-
*
|
54 |
-
* @since 1.5
|
55 |
-
* @author Jonathan Buttigieg
|
56 |
-
*
|
57 |
-
* @return parent
|
58 |
-
**/
|
59 |
-
function recover_image( $image ) {
|
60 |
-
// $image could be an object or an (int) image ID
|
61 |
-
if ( is_numeric( $image ) ) {
|
62 |
-
$image = $this->object->_image_mapper->find( $image );
|
63 |
-
}
|
64 |
-
|
65 |
-
// Remove Imagify data
|
66 |
-
if ( isset( $image->pid ) ) {
|
67 |
-
Imagify_NGG_DB()->delete( $image->pid );
|
68 |
-
}
|
69 |
-
|
70 |
-
return $this->call_parent( 'recover_image', $image );
|
71 |
-
}
|
72 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inc/3rd-party/nextgen-gallery/inc/classes/class-ngg.php
DELETED
@@ -1,32 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
3 |
-
|
4 |
-
class Imagify_NGG {
|
5 |
-
/**
|
6 |
-
* The constructor
|
7 |
-
*
|
8 |
-
* @since 1.5
|
9 |
-
* @author Jonathan Buttigieg
|
10 |
-
*
|
11 |
-
* @return void
|
12 |
-
**/
|
13 |
-
public function __construct() {
|
14 |
-
add_action( 'init', array( $this, 'add_mixin' ) );
|
15 |
-
}
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Add custom NGG mixin to override its functions
|
19 |
-
*
|
20 |
-
* @since 1.5
|
21 |
-
* @author Jonathan Buttigieg
|
22 |
-
*
|
23 |
-
* @return void
|
24 |
-
**/
|
25 |
-
function add_mixin() {
|
26 |
-
include_once( 'class-ngg-storage.php' );
|
27 |
-
$storage = C_Gallery_Storage::get_instance();
|
28 |
-
$storage->get_wrapped_instance()->add_mixin( 'Imagify_NGG_Storage' );
|
29 |
-
}
|
30 |
-
}
|
31 |
-
|
32 |
-
$Imagify_NGG = new Imagify_NGG();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inc/3rd-party/nextgen-gallery/inc/common/attachments.php
CHANGED
@@ -1,73 +1,86 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Auto-optimize when a new attachment is generated
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
|
|
|
|
|
|
9 |
*/
|
10 |
-
|
11 |
-
function _imagify_ngg_optimize_attachment( $galleryID, $image_ids ) {
|
12 |
$api_key = get_imagify_option( 'api_key', false );
|
13 |
|
14 |
-
if ( !
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
|
|
|
|
|
|
22 |
|
23 |
-
|
24 |
-
}
|
25 |
}
|
26 |
}
|
27 |
|
|
|
28 |
/**
|
29 |
* Delete the Imagify data when an image is deleted.
|
30 |
*
|
31 |
* @since 1.5
|
32 |
* @author Jonathan Buttigieg
|
|
|
|
|
33 |
*/
|
34 |
-
add_action( 'ngg_delete_picture', '_imagify_ngg_delete_picture' );
|
35 |
function _imagify_ngg_delete_picture( $image_id ) {
|
36 |
-
|
37 |
}
|
38 |
|
|
|
39 |
/**
|
40 |
* Import Imagify data from a WordPress image to a new NGG image
|
41 |
*
|
42 |
* @since 1.5
|
43 |
* @author Jonathan Buttigieg
|
|
|
|
|
|
|
|
|
44 |
*/
|
45 |
-
add_filter( 'ngg_medialibrary_imported_image', '_imagify_ngg_media_library_imported_image_data', 10, 2 );
|
46 |
function _imagify_ngg_media_library_imported_image_data( $image, $attachment ) {
|
47 |
-
$
|
|
|
|
|
|
|
|
|
|
|
48 |
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
'
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
);
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
'data' => maybe_serialize( $data )
|
67 |
-
)
|
68 |
-
);
|
69 |
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'ngg_after_new_images_added', '_imagify_ngg_optimize_attachment', PHP_INT_MAX, 2 );
|
5 |
/**
|
6 |
+
* Auto-optimize when a new attachment is generated.
|
7 |
*
|
8 |
* @since 1.5
|
9 |
* @author Jonathan Buttigieg
|
10 |
+
*
|
11 |
+
* @param int $gallery_id A Gallery ID.
|
12 |
+
* @param array $image_ids Id's which are sucessfully added.
|
13 |
*/
|
14 |
+
function _imagify_ngg_optimize_attachment( $gallery_id, $image_ids ) {
|
|
|
15 |
$api_key = get_imagify_option( 'api_key', false );
|
16 |
|
17 |
+
if ( ! $api_key || ! get_imagify_option( 'auto_optimize', false ) ) {
|
18 |
+
return;
|
19 |
+
}
|
20 |
+
|
21 |
+
foreach ( $image_ids as $id ) {
|
22 |
+
$body = array();
|
23 |
+
$body['metadata'] = 1;
|
24 |
+
$body['context'] = 'NGG';
|
25 |
+
$body['attachment_id'] = $id;
|
26 |
+
$body['action'] = 'imagify_async_optimize_upload_new_media';
|
27 |
+
$body['_ajax_nonce'] = wp_create_nonce( 'new_media-' . $id );
|
28 |
|
29 |
+
imagify_do_async_job( $body );
|
|
|
30 |
}
|
31 |
}
|
32 |
|
33 |
+
add_action( 'ngg_delete_picture', '_imagify_ngg_delete_picture' );
|
34 |
/**
|
35 |
* Delete the Imagify data when an image is deleted.
|
36 |
*
|
37 |
* @since 1.5
|
38 |
* @author Jonathan Buttigieg
|
39 |
+
*
|
40 |
+
* @param int $image_id An image ID.
|
41 |
*/
|
|
|
42 |
function _imagify_ngg_delete_picture( $image_id ) {
|
43 |
+
imagify_ngg_db()->delete( $image_id );
|
44 |
}
|
45 |
|
46 |
+
add_filter( 'ngg_medialibrary_imported_image', '_imagify_ngg_media_library_imported_image_data', 10, 2 );
|
47 |
/**
|
48 |
* Import Imagify data from a WordPress image to a new NGG image
|
49 |
*
|
50 |
* @since 1.5
|
51 |
* @author Jonathan Buttigieg
|
52 |
+
*
|
53 |
+
* @param object $image A NGG image object.
|
54 |
+
* @param object $attachment An attachment object.
|
55 |
+
* @return object
|
56 |
*/
|
|
|
57 |
function _imagify_ngg_media_library_imported_image_data( $image, $attachment ) {
|
58 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
59 |
+
$attachment = new $class_name( $attachment->ID );
|
60 |
+
|
61 |
+
if ( ! $attachment->is_optimized() ) {
|
62 |
+
return $image;
|
63 |
+
}
|
64 |
|
65 |
+
$full_size = $attachment->get_size_data();
|
66 |
+
$data = array(
|
67 |
+
'stats' => array(
|
68 |
+
'original_size' => $full_size['original_size'],
|
69 |
+
'optimized_size' => $full_size['optimized_size'],
|
70 |
+
'percent' => $full_size['percent'],
|
71 |
+
),
|
72 |
+
'sizes' => array( 'full' => $full_size ),
|
73 |
+
);
|
|
|
74 |
|
75 |
+
imagify_ngg_db()->update( $image->pid, array(
|
76 |
+
'pid' => $image->pid,
|
77 |
+
'optimization_level' => $attachment->get_optimization_level(),
|
78 |
+
'status' => $attachment->get_status(),
|
79 |
+
'data' => maybe_serialize( $data ),
|
80 |
+
) );
|
|
|
|
|
|
|
81 |
|
82 |
+
$image = new Imagify_NGG_Attachment( $image->pid );
|
83 |
+
$image->optimize_thumbnails();
|
84 |
+
|
85 |
+
return $image;
|
86 |
+
}
|
inc/3rd-party/nextgen-gallery/inc/functions/admin-stats.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
* Count number of attachments.
|
6 |
*
|
7 |
* @since 1.5
|
@@ -11,18 +11,19 @@ defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
|
11 |
*/
|
12 |
function imagify_ngg_count_attachments() {
|
13 |
global $wpdb;
|
14 |
-
|
15 |
static $count;
|
16 |
-
|
17 |
-
if (
|
18 |
-
|
19 |
-
$count = $wpdb->get_var( "SELECT COUNT($table_name.pid) FROM $table_name" );
|
20 |
}
|
21 |
-
|
22 |
-
|
|
|
|
|
|
|
23 |
}
|
24 |
|
25 |
-
|
26 |
* Count number of optimized attachments with an error.
|
27 |
*
|
28 |
* @since 1.5
|
@@ -32,15 +33,17 @@ function imagify_ngg_count_attachments() {
|
|
32 |
*/
|
33 |
function imagify_ngg_count_error_attachments() {
|
34 |
static $count;
|
35 |
-
|
36 |
-
if (
|
37 |
-
$count
|
38 |
}
|
39 |
-
|
|
|
|
|
40 |
return $count;
|
41 |
}
|
42 |
|
43 |
-
|
44 |
* Count number of optimized attachments (by Imagify or an other tool before).
|
45 |
*
|
46 |
* @since 1.5
|
@@ -50,15 +53,17 @@ function imagify_ngg_count_error_attachments() {
|
|
50 |
*/
|
51 |
function imagify_ngg_count_optimized_attachments() {
|
52 |
static $count;
|
53 |
-
|
54 |
-
if (
|
55 |
-
$count
|
56 |
}
|
57 |
-
|
|
|
|
|
58 |
return $count;
|
59 |
}
|
60 |
|
61 |
-
|
62 |
* Count number of unoptimized attachments.
|
63 |
*
|
64 |
* @since 1.0
|
@@ -67,16 +72,10 @@ function imagify_ngg_count_optimized_attachments() {
|
|
67 |
* @return int The number of attachments.
|
68 |
*/
|
69 |
function imagify_ngg_count_unoptimized_attachments() {
|
70 |
-
|
71 |
-
|
72 |
-
if ( ! $count ) {
|
73 |
-
$count = imagify_ngg_count_attachments() - imagify_ngg_count_optimized_attachments() - imagify_ngg_count_error_attachments();
|
74 |
-
}
|
75 |
-
|
76 |
-
return (int) $count;
|
77 |
}
|
78 |
|
79 |
-
|
80 |
* Count percent of optimized attachments.
|
81 |
*
|
82 |
* @since 1.0
|
@@ -85,15 +84,13 @@ function imagify_ngg_count_unoptimized_attachments() {
|
|
85 |
* @return int The percent of optimized attachments.
|
86 |
*/
|
87 |
function imagify_ngg_percent_optimized_attachments() {
|
88 |
-
$total_attachments
|
89 |
-
$total_optimized_attachments
|
90 |
|
91 |
-
|
92 |
-
|
93 |
-
return $percent;
|
94 |
}
|
95 |
|
96 |
-
|
97 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
98 |
*
|
99 |
* @since 1.5
|
@@ -103,9 +100,6 @@ function imagify_ngg_percent_optimized_attachments() {
|
|
103 |
*/
|
104 |
function imagify_ngg_count_saving_data() {
|
105 |
global $wpdb;
|
106 |
-
|
107 |
-
$table_name
|
108 |
-
|
109 |
-
|
110 |
-
return $attachments;
|
111 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
/**
|
5 |
* Count number of attachments.
|
6 |
*
|
7 |
* @since 1.5
|
11 |
*/
|
12 |
function imagify_ngg_count_attachments() {
|
13 |
global $wpdb;
|
|
|
14 |
static $count;
|
15 |
+
|
16 |
+
if ( isset( $count ) ) {
|
17 |
+
return $count;
|
|
|
18 |
}
|
19 |
+
|
20 |
+
$table_name = $wpdb->prefix . 'ngg_pictures';
|
21 |
+
$count = (int) $wpdb->get_var( "SELECT COUNT($table_name.pid) FROM $table_name" ); // WPCS: unprepared SQL ok.
|
22 |
+
|
23 |
+
return $count;
|
24 |
}
|
25 |
|
26 |
+
/**
|
27 |
* Count number of optimized attachments with an error.
|
28 |
*
|
29 |
* @since 1.5
|
33 |
*/
|
34 |
function imagify_ngg_count_error_attachments() {
|
35 |
static $count;
|
36 |
+
|
37 |
+
if ( isset( $count ) ) {
|
38 |
+
return $count;
|
39 |
}
|
40 |
+
|
41 |
+
$count = (int) imagify_ngg_db()->get_column_by( 'COUNT(*)', 'status', 'error' );
|
42 |
+
|
43 |
return $count;
|
44 |
}
|
45 |
|
46 |
+
/**
|
47 |
* Count number of optimized attachments (by Imagify or an other tool before).
|
48 |
*
|
49 |
* @since 1.5
|
53 |
*/
|
54 |
function imagify_ngg_count_optimized_attachments() {
|
55 |
static $count;
|
56 |
+
|
57 |
+
if ( isset( $count ) ) {
|
58 |
+
return $count;
|
59 |
}
|
60 |
+
|
61 |
+
$count = (int) imagify_ngg_db()->get_column_by( 'COUNT(*)', 'status', 'success' );
|
62 |
+
|
63 |
return $count;
|
64 |
}
|
65 |
|
66 |
+
/**
|
67 |
* Count number of unoptimized attachments.
|
68 |
*
|
69 |
* @since 1.0
|
72 |
* @return int The number of attachments.
|
73 |
*/
|
74 |
function imagify_ngg_count_unoptimized_attachments() {
|
75 |
+
return imagify_ngg_count_attachments() - imagify_ngg_count_optimized_attachments() - imagify_ngg_count_error_attachments();
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
}
|
77 |
|
78 |
+
/**
|
79 |
* Count percent of optimized attachments.
|
80 |
*
|
81 |
* @since 1.0
|
84 |
* @return int The percent of optimized attachments.
|
85 |
*/
|
86 |
function imagify_ngg_percent_optimized_attachments() {
|
87 |
+
$total_attachments = imagify_ngg_count_attachments();
|
88 |
+
$total_optimized_attachments = imagify_ngg_count_optimized_attachments();
|
89 |
|
90 |
+
return ( 0 !== $total_attachments ) ? round( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) : 0;
|
|
|
|
|
91 |
}
|
92 |
|
93 |
+
/**
|
94 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
95 |
*
|
96 |
* @since 1.5
|
100 |
*/
|
101 |
function imagify_ngg_count_saving_data() {
|
102 |
global $wpdb;
|
103 |
+
|
104 |
+
return $wpdb->get_col( "SELECT $table_name.data FROM {$wpdb->ngg_imagify_data} WHERE status = 'success'" ); // WPCS: unprepared SQL ok.
|
105 |
+
}
|
|
|
|
|
|
inc/3rd-party/nextgen-gallery/nextgen-gallery.php
CHANGED
@@ -1,23 +1,26 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
if ( ! class_exists( 'C_NextGEN_Bootstrap' ) || ! class_exists( 'Mixin' ) || ! get_site_option( 'ngg_options' ) ) {
|
5 |
return;
|
6 |
}
|
7 |
|
8 |
-
define( 'IMAGIFY_NGG_FILE'
|
9 |
-
define( 'IMAGIFY_NGG_PATH'
|
10 |
-
define( 'IMAGIFY_NGG_INC_PATH'
|
11 |
-
define( 'IMAGIFY_NGG_ADMIN_PATH'
|
12 |
-
define( 'IMAGIFY_NGG_COMMON_PATH'
|
13 |
-
define( 'IMAGIFY_NGG_FUNCTIONS_PATH'
|
14 |
-
define( 'IMAGIFY_NGG_CLASSES_PATH'
|
15 |
|
16 |
-
require( IMAGIFY_NGG_CLASSES_PATH
|
17 |
-
require( IMAGIFY_NGG_CLASSES_PATH
|
18 |
-
require( IMAGIFY_NGG_CLASSES_PATH
|
19 |
require( IMAGIFY_NGG_FUNCTIONS_PATH . 'admin-stats.php' );
|
20 |
-
require( IMAGIFY_NGG_COMMON_PATH
|
|
|
|
|
|
|
21 |
|
22 |
if ( is_admin() ) {
|
23 |
require( IMAGIFY_NGG_ADMIN_PATH . 'enqueue.php' );
|
@@ -27,4 +30,4 @@ if ( is_admin() ) {
|
|
27 |
require( IMAGIFY_NGG_ADMIN_PATH . 'gallery.php' );
|
28 |
require( IMAGIFY_NGG_ADMIN_PATH . 'bulk.php' );
|
29 |
require( IMAGIFY_NGG_ADMIN_PATH . 'heartbeat.php' );
|
30 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
if ( ! class_exists( 'C_NextGEN_Bootstrap' ) || ! class_exists( 'Mixin' ) || ! get_site_option( 'ngg_options' ) ) {
|
5 |
return;
|
6 |
}
|
7 |
|
8 |
+
define( 'IMAGIFY_NGG_FILE' , __FILE__ );
|
9 |
+
define( 'IMAGIFY_NGG_PATH' , realpath( plugin_dir_path( IMAGIFY_NGG_FILE ) ) . '/' );
|
10 |
+
define( 'IMAGIFY_NGG_INC_PATH' , realpath( IMAGIFY_NGG_PATH . 'inc/' ) . '/' );
|
11 |
+
define( 'IMAGIFY_NGG_ADMIN_PATH' , realpath( IMAGIFY_NGG_INC_PATH . 'admin' ) . '/' );
|
12 |
+
define( 'IMAGIFY_NGG_COMMON_PATH' , realpath( IMAGIFY_NGG_INC_PATH . 'common' ) . '/' );
|
13 |
+
define( 'IMAGIFY_NGG_FUNCTIONS_PATH' , realpath( IMAGIFY_NGG_INC_PATH . 'functions' ) . '/' );
|
14 |
+
define( 'IMAGIFY_NGG_CLASSES_PATH' , realpath( IMAGIFY_NGG_INC_PATH . 'classes' ) . '/' );
|
15 |
|
16 |
+
require( IMAGIFY_NGG_CLASSES_PATH . 'class-imagify-ngg.php' );
|
17 |
+
require( IMAGIFY_NGG_CLASSES_PATH . 'class-imagify-ngg-db.php' );
|
18 |
+
require( IMAGIFY_NGG_CLASSES_PATH . 'class-imagify-ngg-attachment.php' );
|
19 |
require( IMAGIFY_NGG_FUNCTIONS_PATH . 'admin-stats.php' );
|
20 |
+
require( IMAGIFY_NGG_COMMON_PATH . 'attachments.php' );
|
21 |
+
|
22 |
+
imagify_ngg()->init();
|
23 |
+
imagify_ngg_db();
|
24 |
|
25 |
if ( is_admin() ) {
|
26 |
require( IMAGIFY_NGG_ADMIN_PATH . 'enqueue.php' );
|
30 |
require( IMAGIFY_NGG_ADMIN_PATH . 'gallery.php' );
|
31 |
require( IMAGIFY_NGG_ADMIN_PATH . 'bulk.php' );
|
32 |
require( IMAGIFY_NGG_ADMIN_PATH . 'heartbeat.php' );
|
33 |
+
}
|
inc/3rd-party/wp-retina-2x.php
CHANGED
@@ -1,58 +1,88 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
if ( function_exists( 'wr2x_delete_attachment' ) && function_exists( 'wr2x_generate_images' ) ) :
|
5 |
|
6 |
-
/**
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
*/
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
|
24 |
endif;
|
25 |
|
26 |
if ( function_exists( 'wr2x_get_retina' ) ) :
|
27 |
|
28 |
-
/**
|
29 |
-
* Process to generate the retina version of a thumbnail
|
30 |
-
*
|
31 |
-
* @since 1.0
|
32 |
-
*/
|
33 |
-
add_filter( 'imagify_fill_thumbnail_data', '_imagify_optimize_wr2x', 10, 7 );
|
34 |
-
function _imagify_optimize_wr2x( $data, $response, $id, $path, $url, $size_key, $optimization_level ) {
|
35 |
/**
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
*/
|
42 |
-
$
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
$response = do_imagify( $retina_path, array(
|
48 |
'backup' => false,
|
49 |
'optimization_level' => $optimization_level,
|
50 |
-
'context'
|
51 |
) );
|
52 |
-
$
|
|
|
|
|
|
|
53 |
}
|
54 |
-
|
55 |
-
return $data;
|
56 |
-
}
|
57 |
|
58 |
-
endif;
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
if ( function_exists( 'wr2x_delete_attachment' ) && function_exists( 'wr2x_generate_images' ) ) :
|
5 |
|
6 |
+
/**
|
7 |
+
* Process to restore all retina versions for an attachment.
|
8 |
+
*
|
9 |
+
* @since 1.0
|
10 |
+
*/
|
11 |
+
|
12 |
+
add_action( 'before_imagify_restore_attachment', '_imagify_wr2x_delete_attachment_on_restore' );
|
13 |
+
/**
|
14 |
+
* Remove all retina versions if exists.
|
15 |
+
*
|
16 |
+
* @since 1.0
|
17 |
+
*
|
18 |
+
* @param int $attachment_id An attachment ID.
|
19 |
+
*/
|
20 |
+
function _imagify_wr2x_delete_attachment_on_restore( $attachment_id ) {
|
21 |
+
wr2x_delete_attachment( $attachment_id );
|
22 |
+
}
|
23 |
+
|
24 |
+
add_action( 'after_imagify_restore_attachment', '_imagify_wr2x_generate_images_on_restore' );
|
25 |
+
/**
|
26 |
+
* Regenerate all retina versions.
|
27 |
+
*
|
28 |
+
* @since 1.0
|
29 |
+
*
|
30 |
+
* @param int $attachment_id An attachment ID.
|
31 |
+
*/
|
32 |
+
function _imagify_wr2x_generate_images_on_restore( $attachment_id ) {
|
33 |
+
$metadata = wp_get_attachment_metadata( $attachment_id );
|
34 |
+
wr2x_generate_images( $metadata );
|
35 |
+
}
|
36 |
|
37 |
endif;
|
38 |
|
39 |
if ( function_exists( 'wr2x_get_retina' ) ) :
|
40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
/**
|
42 |
+
* Process to generate the retina version of a thumbnail.
|
43 |
+
*
|
44 |
+
* @since 1.0
|
45 |
+
*/
|
46 |
+
|
47 |
+
add_filter( 'imagify_fill_thumbnail_data', '_imagify_optimize_wr2x', 10, 7 );
|
48 |
+
/**
|
49 |
+
* Filter the optimization data of each thumbnail.
|
50 |
+
*
|
51 |
+
* @since 1.0
|
52 |
+
*
|
53 |
+
* @param array $data The statistics data.
|
54 |
+
* @param object $response The API response.
|
55 |
+
* @param int $id The attachment ID.
|
56 |
+
* @param string $path The attachment path.
|
57 |
+
* @param string $url The attachment URL.
|
58 |
+
* @param string $size_key The attachment size key.
|
59 |
+
* @param bool $optimization_level The optimization level.
|
60 |
+
* @return array $data The new optimization data.
|
61 |
*/
|
62 |
+
function _imagify_optimize_wr2x( $data, $response, $id, $path, $url, $size_key, $optimization_level ) {
|
63 |
+
/**
|
64 |
+
* Allow to optimize the retina version generated by WP Retina x2.
|
65 |
+
*
|
66 |
+
* @since 1.0
|
67 |
+
*
|
68 |
+
* @param bool $do_retina True will force the optimization.
|
69 |
+
*/
|
70 |
+
$do_retina = apply_filters( 'do_imagify_optimize_retina', true );
|
71 |
+
$retina_path = wr2x_get_retina( $path );
|
72 |
+
|
73 |
+
if ( empty( $retina_path )|| ! $do_retina ) {
|
74 |
+
return $data;
|
75 |
+
}
|
76 |
+
|
77 |
$response = do_imagify( $retina_path, array(
|
78 |
'backup' => false,
|
79 |
'optimization_level' => $optimization_level,
|
80 |
+
'context' => 'wp-retina',
|
81 |
) );
|
82 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
83 |
+
$attachment = new $class_name( $id );
|
84 |
+
|
85 |
+
return $attachment->fill_data( $data, $response, $id, $url, $size_key . '@2x' );
|
86 |
}
|
|
|
|
|
|
|
87 |
|
88 |
+
endif;
|
inc/admin/ajax.php
CHANGED
@@ -1,14 +1,18 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
/**
|
5 |
* Process all thumbnails of a specific image with Imagify with the manual method.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
add_action( 'wp_ajax_imagify_manual_upload' , '_do_admin_post_imagify_manual_upload' );
|
11 |
-
add_action( 'admin_post_imagify_manual_upload' , '_do_admin_post_imagify_manual_upload' );
|
12 |
function _do_admin_post_imagify_manual_upload() {
|
13 |
if ( defined( 'DOING_AJAX' ) ) {
|
14 |
check_ajax_referer( 'imagify-manual-upload' );
|
@@ -23,33 +27,33 @@ function _do_admin_post_imagify_manual_upload() {
|
|
23 |
wp_nonce_ays( '' );
|
24 |
}
|
25 |
}
|
26 |
-
|
27 |
-
$context
|
28 |
-
$attachment_id = $_GET['attachment_id'];
|
29 |
-
$class_name = get_imagify_attachment_class_name( $
|
30 |
$attachment = new $class_name( $attachment_id );
|
31 |
-
|
32 |
// Optimize it!!!!!
|
33 |
$attachment->optimize();
|
34 |
-
|
35 |
if ( ! defined( 'DOING_AJAX' ) ) {
|
36 |
wp_safe_redirect( wp_get_referer() );
|
37 |
die();
|
38 |
}
|
39 |
-
|
40 |
-
// Return the optimization statistics
|
41 |
$output = get_imagify_attachment_optimization_text( $attachment, $context );
|
42 |
wp_send_json_success( $output );
|
43 |
}
|
44 |
|
|
|
|
|
45 |
/**
|
46 |
-
* Process a
|
47 |
*
|
48 |
* @since 1.0
|
49 |
* @author Jonathan Buttigieg
|
50 |
*/
|
51 |
-
add_action( 'wp_ajax_imagify_manual_override_upload', '_do_admin_post_imagify_manual_override_upload' );
|
52 |
-
add_action( 'admin_post_imagify_manual_override_upload', '_do_admin_post_imagify_manual_override_upload' );
|
53 |
function _do_admin_post_imagify_manual_override_upload() {
|
54 |
if ( defined( 'DOING_AJAX' ) ) {
|
55 |
check_ajax_referer( 'imagify-manual-override-upload' );
|
@@ -64,12 +68,13 @@ function _do_admin_post_imagify_manual_override_upload() {
|
|
64 |
wp_nonce_ays( '' );
|
65 |
}
|
66 |
}
|
67 |
-
|
68 |
-
$context
|
69 |
-
$
|
70 |
-
$
|
71 |
-
|
72 |
-
|
|
|
73 |
$attachment->restore();
|
74 |
|
75 |
// Optimize it!!!!!
|
@@ -80,19 +85,19 @@ function _do_admin_post_imagify_manual_override_upload() {
|
|
80 |
die();
|
81 |
}
|
82 |
|
83 |
-
// Return the optimization statistics
|
84 |
$output = get_imagify_attachment_optimization_text( $attachment, $context );
|
85 |
wp_send_json_success( $output );
|
86 |
}
|
87 |
|
|
|
|
|
88 |
/**
|
89 |
* Process a restoration to the original attachment.
|
90 |
*
|
91 |
* @since 1.0
|
92 |
* @author Jonathan Buttigieg
|
93 |
*/
|
94 |
-
add_action( 'wp_ajax_imagify_restore_upload', '_do_admin_post_imagify_restore_upload' );
|
95 |
-
add_action( 'admin_post_imagify_restore_upload', '_do_admin_post_imagify_restore_upload' );
|
96 |
function _do_admin_post_imagify_restore_upload() {
|
97 |
if ( defined( 'DOING_AJAX' ) ) {
|
98 |
check_ajax_referer( 'imagify-restore-upload' );
|
@@ -107,263 +112,355 @@ function _do_admin_post_imagify_restore_upload() {
|
|
107 |
wp_nonce_ays( '' );
|
108 |
}
|
109 |
}
|
110 |
-
|
111 |
-
$
|
112 |
-
$
|
113 |
-
|
114 |
-
|
|
|
|
|
115 |
$attachment->restore();
|
116 |
-
|
117 |
if ( ! defined( 'DOING_AJAX' ) ) {
|
118 |
wp_safe_redirect( wp_get_referer() );
|
119 |
die();
|
120 |
}
|
121 |
|
122 |
-
// Return the optimization button
|
123 |
-
$output = '<a id="imagify-upload-' . $attachment->id . '" href="' . get_imagify_admin_url( 'manual-upload', array( 'attachment_id' => $attachment->id ) ) . '" class="button-primary button-imagify-manual-upload" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">' . __( 'Optimize', 'imagify' ) . '</a>';
|
124 |
wp_send_json_success( $output );
|
125 |
}
|
126 |
|
|
|
127 |
/**
|
128 |
-
*
|
129 |
*
|
130 |
* @since 1.0
|
131 |
* @author Jonathan Buttigieg
|
132 |
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
add_action( 'wp_ajax_imagify_get_unoptimized_attachment_ids', '_do_wp_ajax_imagify_get_unoptimized_attachment_ids' );
|
|
|
|
|
|
|
|
|
|
|
|
|
134 |
function _do_wp_ajax_imagify_get_unoptimized_attachment_ids() {
|
|
|
|
|
135 |
check_ajax_referer( 'imagify-bulk-upload', 'imagifybulkuploadnonce' );
|
136 |
|
137 |
if ( ! current_user_can( 'upload_files' ) ) {
|
138 |
wp_send_json_error();
|
139 |
}
|
140 |
-
|
141 |
if ( ! imagify_valid_key() ) {
|
142 |
wp_send_json_error( array( 'message' => 'invalid-api-key' ) );
|
143 |
}
|
144 |
-
|
145 |
$user = new Imagify_User();
|
146 |
-
|
147 |
if ( $user->is_over_quota() ) {
|
148 |
wp_send_json_error( array( 'message' => 'over-quota' ) );
|
149 |
}
|
150 |
-
|
151 |
@set_time_limit( 0 );
|
152 |
-
|
153 |
-
$optimization_level = $_GET['optimization_level'];
|
154 |
-
$optimization_level = ( -1
|
155 |
$optimization_level = (int) $optimization_level;
|
156 |
-
|
157 |
$meta_query = array(
|
158 |
'relation' => 'OR',
|
159 |
array(
|
160 |
'key' => '_imagify_optimization_level',
|
161 |
'value' => $optimization_level,
|
162 |
-
'compare' => '!='
|
163 |
),
|
164 |
array(
|
165 |
'key' => '_imagify_optimization_level',
|
166 |
-
'compare' => 'NOT EXISTS'
|
167 |
),
|
168 |
array(
|
169 |
'key' => '_imagify_status',
|
170 |
'value' => 'error',
|
171 |
-
'compare' => '='
|
172 |
),
|
173 |
);
|
174 |
-
|
175 |
/**
|
176 |
-
* Filter the unoptimized attachments limit query
|
177 |
*
|
178 |
* @since 1.4.4
|
179 |
*
|
180 |
-
* @param int The limit (-1 for unlimited)
|
181 |
*/
|
182 |
$unoptimized_attachment_limit = apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
|
183 |
-
|
184 |
$args = array(
|
185 |
'fields' => 'ids',
|
186 |
'post_type' => 'attachment',
|
187 |
'post_status' => 'any',
|
188 |
'post_mime_type' => get_imagify_mime_type(),
|
189 |
-
'meta_query'
|
190 |
'posts_per_page' => $unoptimized_attachment_limit,
|
191 |
-
'orderby'
|
192 |
-
'order'
|
193 |
'no_found_rows' => true,
|
194 |
'update_post_term_cache' => false,
|
195 |
);
|
196 |
-
|
197 |
-
global $wpdb;
|
198 |
-
|
199 |
$data = array();
|
200 |
$attachments = new WP_Query( $args );
|
201 |
$ids = $attachments->posts;
|
202 |
-
$ids
|
203 |
-
$sql_ids
|
204 |
|
205 |
if ( empty( $sql_ids ) ) {
|
206 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
207 |
}
|
208 |
-
|
209 |
-
// Get attachments filename
|
210 |
-
$attachments_filename = $wpdb->get_results(
|
211 |
"SELECT pm.post_id as id, pm.meta_value as value
|
212 |
FROM $wpdb->postmeta as pm
|
213 |
-
WHERE pm.meta_key= '_wp_attached_file'
|
214 |
-
|
215 |
-
ORDER BY pm.post_id DESC"
|
216 |
-
|
217 |
);
|
218 |
-
|
219 |
-
$attachments_filename = imagify_query_results_combine( $ids, $attachments_filename );
|
220 |
-
|
221 |
-
// Get attachments data
|
222 |
-
$attachments_data = $wpdb->get_results(
|
223 |
"SELECT pm.post_id as id, pm.meta_value as value
|
224 |
FROM $wpdb->postmeta as pm
|
225 |
-
WHERE pm.meta_key= '_imagify_data'
|
226 |
-
|
227 |
-
ORDER BY pm.post_id DESC"
|
228 |
-
|
229 |
);
|
230 |
-
|
231 |
-
$attachments_data = imagify_query_results_combine( $ids, $attachments_data );
|
232 |
$attachments_data = array_map( 'maybe_unserialize', $attachments_data );
|
233 |
-
|
234 |
-
// Get attachments optimization level
|
235 |
-
$attachments_optimization_level = $wpdb->get_results(
|
236 |
"SELECT pm.post_id as id, pm.meta_value as value
|
237 |
FROM $wpdb->postmeta as pm
|
238 |
-
WHERE pm.meta_key= '_imagify_optimization_level'
|
239 |
-
|
240 |
-
ORDER BY pm.post_id DESC"
|
241 |
-
|
242 |
);
|
243 |
-
|
244 |
$attachments_optimization_level = imagify_query_results_combine( $ids, $attachments_optimization_level );
|
245 |
-
|
246 |
-
// Get attachments status
|
247 |
-
$attachments_status = $wpdb->get_results(
|
248 |
"SELECT pm.post_id as id, pm.meta_value as value
|
249 |
FROM $wpdb->postmeta as pm
|
250 |
-
WHERE pm.meta_key= '_imagify_status'
|
251 |
-
|
252 |
-
ORDER BY pm.post_id DESC"
|
253 |
-
|
254 |
);
|
255 |
-
|
256 |
$attachments_status = imagify_query_results_combine( $ids, $attachments_status );
|
257 |
-
|
258 |
-
// Save the optimization level in a transient to retrieve it later during the process
|
259 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
260 |
-
|
261 |
-
foreach( $ids as $id ) {
|
262 |
-
/** This filter is documented in inc/functions/process.php */
|
263 |
$file_path = apply_filters( 'imagify_file_path', get_imagify_attached_file( $attachments_filename[ $id ] ) );
|
264 |
-
|
265 |
-
if ( file_exists( $file_path ) ) {
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
$attachment_error
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
}
|
300 |
-
|
301 |
-
|
302 |
-
|
|
|
|
|
303 |
wp_send_json_success( $data );
|
304 |
}
|
305 |
-
|
306 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
307 |
}
|
308 |
|
309 |
-
/**
|
310 |
-
|
311 |
-
|
312 |
-
* @since 1.0
|
313 |
-
* @author Jonathan Buttigieg
|
314 |
-
*/
|
315 |
-
add_action( 'wp_ajax_imagify_bulk_upload', '_do_wp_ajax_imagify_bulk_upload' );
|
316 |
-
function _do_wp_ajax_imagify_bulk_upload() {
|
317 |
-
check_ajax_referer( 'imagify-bulk-upload', 'imagifybulkuploadnonce' );
|
318 |
-
|
319 |
-
if ( ! isset( $_POST['image'], $_POST['context'] ) || ! current_user_can( 'upload_files' ) ) {
|
320 |
-
wp_send_json_error();
|
321 |
-
}
|
322 |
-
|
323 |
-
$class_name = get_imagify_attachment_class_name( $_POST['context'] );
|
324 |
-
$attachment = new $class_name( $_POST['image'] );
|
325 |
-
$optimization_level = get_transient( 'imagify_bulk_optimization_level' );
|
326 |
-
|
327 |
-
// Restore it if the optimization level is updated
|
328 |
-
if ( $optimization_level !== $attachment->get_optimization_level() ) {
|
329 |
-
$attachment->restore();
|
330 |
-
}
|
331 |
-
|
332 |
-
// Optimize it!!!!!
|
333 |
-
$attachment->optimize( $optimization_level );
|
334 |
-
|
335 |
-
// Return the optimization statistics
|
336 |
-
$fullsize_data = $attachment->get_size_data();
|
337 |
-
$stats_data = $attachment->get_stats_data();
|
338 |
-
$user = new Imagify_User();
|
339 |
-
$data = array();
|
340 |
-
|
341 |
-
if ( ! $attachment->is_optimized() ) {
|
342 |
-
$data['success'] = false;
|
343 |
-
$data['error'] = $fullsize_data['error'];
|
344 |
-
|
345 |
-
wp_send_json_error( $data );
|
346 |
-
}
|
347 |
-
|
348 |
-
$data['success'] = true;
|
349 |
-
$data['original_size'] = $fullsize_data['original_size'];
|
350 |
-
$data['new_size'] = $fullsize_data['optimized_size'];
|
351 |
-
$data['percent'] = $fullsize_data['percent'];
|
352 |
-
$data['overall_saving'] = $stats_data['original_size'] - $stats_data['optimized_size'];
|
353 |
-
$data['original_overall_size'] = $stats_data['original_size'];
|
354 |
-
$data['new_overall_size'] = $stats_data['optimized_size'];
|
355 |
-
$data['thumbnails'] = $attachment->get_optimized_sizes_count();
|
356 |
-
|
357 |
-
wp_send_json_success( $data );
|
358 |
-
}
|
359 |
|
|
|
360 |
/**
|
361 |
* Create a new Imagify account.
|
362 |
*
|
363 |
* @since 1.0
|
364 |
* @author Jonathan Buttigieg
|
365 |
*/
|
366 |
-
add_action( 'wp_ajax_imagify_signup', '_do_wp_ajax_imagify_signup' );
|
367 |
function _do_wp_ajax_imagify_signup() {
|
368 |
check_ajax_referer( 'imagify-signup', 'imagifysignupnonce' );
|
369 |
|
@@ -374,7 +471,7 @@ function _do_wp_ajax_imagify_signup() {
|
|
374 |
$data = array(
|
375 |
'email' => $_GET['email'],
|
376 |
'password' => wp_generate_password( 12, false ),
|
377 |
-
'lang'
|
378 |
);
|
379 |
|
380 |
$response = add_imagify_user( $data );
|
@@ -386,13 +483,13 @@ function _do_wp_ajax_imagify_signup() {
|
|
386 |
wp_send_json_success();
|
387 |
}
|
388 |
|
|
|
389 |
/**
|
390 |
* Process an API key check validity.
|
391 |
*
|
392 |
* @since 1.0
|
393 |
* @author Jonathan Buttigieg
|
394 |
*/
|
395 |
-
add_action( 'wp_ajax_imagify_check_api_key_validity', '_do_wp_ajax_imagify_check_api_key_validity' );
|
396 |
function _do_wp_ajax_imagify_check_api_key_validity() {
|
397 |
check_ajax_referer( 'imagify-check-api-key', 'imagifycheckapikeynonce' );
|
398 |
|
@@ -405,7 +502,7 @@ function _do_wp_ajax_imagify_check_api_key_validity() {
|
|
405 |
if ( is_wp_error( $response ) ) {
|
406 |
wp_send_json_error( $response->get_error_message() );
|
407 |
}
|
408 |
-
|
409 |
$options = get_site_option( IMAGIFY_SETTINGS_SLUG );
|
410 |
$options['api_key'] = sanitize_key( $_GET['api_key'] );
|
411 |
|
@@ -414,81 +511,19 @@ function _do_wp_ajax_imagify_check_api_key_validity() {
|
|
414 |
wp_send_json_success();
|
415 |
}
|
416 |
|
417 |
-
|
418 |
-
* Process a dismissed notice.
|
419 |
-
*
|
420 |
-
* @since 1.0
|
421 |
-
* @author Jonathan Buttigieg
|
422 |
-
*/
|
423 |
-
add_action( 'wp_ajax_imagify_dismiss_notice', '_do_admin_post_imagify_dismiss_notice' );
|
424 |
-
add_action( 'admin_post_imagify_dismiss_notice', '_do_admin_post_imagify_dismiss_notice' );
|
425 |
-
function _do_admin_post_imagify_dismiss_notice() {
|
426 |
-
if ( defined( 'DOING_AJAX' ) ) {
|
427 |
-
check_ajax_referer( 'imagify-dismiss-notice' );
|
428 |
-
} else {
|
429 |
-
check_admin_referer( 'imagify-dismiss-notice' );
|
430 |
-
}
|
431 |
-
|
432 |
-
if ( ! isset( $_GET['notice'] ) || ! current_user_can( 'manage_options' ) ) {
|
433 |
-
if ( defined( 'DOING_AJAX' ) ) {
|
434 |
-
wp_send_json_error();
|
435 |
-
} else {
|
436 |
-
wp_nonce_ays( '' );
|
437 |
-
}
|
438 |
-
}
|
439 |
-
|
440 |
-
$notice = $_GET['notice'];
|
441 |
-
|
442 |
-
imagify_dismiss_notice( $notice );
|
443 |
-
|
444 |
-
/**
|
445 |
-
* Fires when a notice is dismissed.
|
446 |
-
*
|
447 |
-
* @since 1.4.2
|
448 |
-
*
|
449 |
-
* @param int $notice The notice slug
|
450 |
-
*/
|
451 |
-
do_action( 'imagify_dismiss_notice', $notice );
|
452 |
-
|
453 |
-
if ( ! defined( 'DOING_AJAX' ) ) {
|
454 |
-
wp_safe_redirect( wp_get_referer() );
|
455 |
-
die();
|
456 |
-
}
|
457 |
-
|
458 |
-
wp_send_json_success();
|
459 |
-
}
|
460 |
-
|
461 |
-
/**
|
462 |
-
* Disable a plugin which can be in conflict with Imagify
|
463 |
-
*
|
464 |
-
* @since 1.2
|
465 |
-
* @author Jonathan Buttigieg
|
466 |
-
*/
|
467 |
-
add_action( 'admin_post_imagify_deactivate_plugin', '_imagify_deactivate_plugin' );
|
468 |
-
function _imagify_deactivate_plugin() {
|
469 |
-
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'imagifydeactivatepluginnonce' ) ) {
|
470 |
-
wp_nonce_ays( '' );
|
471 |
-
}
|
472 |
-
|
473 |
-
deactivate_plugins( $_GET['plugin'] );
|
474 |
-
|
475 |
-
wp_safe_redirect( wp_get_referer() );
|
476 |
-
die();
|
477 |
-
}
|
478 |
-
|
479 |
/**
|
480 |
* Get admin bar profile output
|
481 |
*
|
482 |
* @since 1.2.3
|
483 |
* @author Jonathan Buttigieg
|
484 |
*/
|
485 |
-
add_action( 'wp_ajax_imagify_get_admin_bar_profile', '_do_wp_ajax_imagify_get_admin_bar_profile' );
|
486 |
function _do_wp_ajax_imagify_get_admin_bar_profile() {
|
487 |
check_ajax_referer( 'imagify-get-admin-bar-profile', 'imagifygetadminbarprofilenonce' );
|
488 |
-
|
489 |
-
$user
|
490 |
$unconsumed_quota = $user->get_percent_unconsumed_quota();
|
491 |
-
$meteo_icon =
|
492 |
$bar_class = 'positive';
|
493 |
$message = '';
|
494 |
|
@@ -502,250 +537,227 @@ function _do_wp_ajax_imagify_get_admin_bar_profile() {
|
|
502 |
}
|
503 |
|
504 |
if ( $unconsumed_quota <= 20 && $unconsumed_quota > 0 ) {
|
505 |
-
$message
|
506 |
-
<
|
507 |
-
|
508 |
-
|
509 |
-
|
510 |
-
|
511 |
-
|
512 |
-
|
513 |
-
|
514 |
-
|
515 |
-
|
516 |
-
<
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
527 |
-
|
|
|
528 |
|
529 |
if ( 1 === $user->plan_id ) {
|
530 |
-
$quota_section .= '
|
531 |
-
<div class="imagify-meteo-icon">
|
532 |
-
' . $meteo_icon . '
|
533 |
-
</div>';
|
534 |
}
|
535 |
|
536 |
-
$quota_section .= '
|
537 |
-
|
538 |
-
|
539 |
-
|
540 |
-
|
541 |
-
</div>';
|
542 |
|
543 |
if ( 1 === $user->plan_id ) {
|
544 |
-
$quota_section .= '
|
545 |
-
<div class="imagify-
|
546 |
-
|
547 |
-
|
548 |
-
|
549 |
-
|
550 |
-
|
551 |
-
|
552 |
-
|
553 |
-
}
|
554 |
-
|
555 |
-
$quota_section .= '
|
556 |
-
|
557 |
-
|
558 |
-
|
559 |
-
|
560 |
-
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
wp_send_json_success( $quota_section );
|
566 |
}
|
567 |
|
|
|
568 |
/**
|
569 |
-
*
|
570 |
*
|
571 |
-
* @since
|
572 |
-
* @author
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
&& check_ajax_referer( 'new_media-' . $_POST['attachment_id'] )
|
578 |
-
) {
|
579 |
-
$class_name = get_imagify_attachment_class_name( $_POST['context'] );
|
580 |
-
$attachment = new $class_name( $_POST['attachment_id'] );
|
581 |
-
|
582 |
-
// Optimize it!!!!!
|
583 |
-
$attachment->optimize( null, $_POST['metadata'] );
|
584 |
-
|
585 |
-
die( 1 );
|
586 |
}
|
587 |
-
}
|
588 |
-
/**
|
589 |
-
* Optimize image on picture editing with async request
|
590 |
-
*
|
591 |
-
* @since 1.4
|
592 |
-
* @author Julio Potier
|
593 |
-
**/
|
594 |
-
add_action( 'wp_ajax_imagify_async_optimize_save_image_editor_file', '_do_admin_post_async_optimize_save_image_editor_file' );
|
595 |
-
function _do_admin_post_async_optimize_save_image_editor_file() {
|
596 |
-
if ( isset( $_POST['do'], $_POST['postid'] )
|
597 |
-
&& check_ajax_referer( 'image_editor-' . $_POST['postid'] )
|
598 |
-
&& get_post_meta( $_POST['postid'], '_imagify_data', true )
|
599 |
-
) {
|
600 |
-
|
601 |
-
$attachment_id = $_POST['postid'];
|
602 |
-
$optimization_level = get_post_meta( $attachment_id, '_imagify_optimization_level', true );
|
603 |
-
$attachment = new Imagify_Attachment( $attachment_id );
|
604 |
-
$metadata = wp_get_attachment_metadata( $attachment_id );
|
605 |
-
|
606 |
-
// Remove old optimization data
|
607 |
-
delete_post_meta( $attachment_id, '_imagify_data' );
|
608 |
-
delete_post_meta( $attachment_id, '_imagify_status' );
|
609 |
-
delete_post_meta( $attachment_id, '_imagify_optimization_level' );
|
610 |
-
|
611 |
-
if ( 'restore' === $_POST['do'] ) {
|
612 |
-
// Restore the backup file
|
613 |
-
$attachment->restore();
|
614 |
-
|
615 |
-
// Get old metadata to regenerate all thumbnails
|
616 |
-
$metadata = array( 'sizes' => array() );
|
617 |
-
$backup_sizes = (array) get_post_meta( $attachment_id, '_wp_attachment_backup_sizes', true );
|
618 |
-
|
619 |
-
foreach ( $backup_sizes as $size_key => $size_data ) {
|
620 |
-
$size_key = str_replace( '-origin', '' , $size_key );
|
621 |
-
$metadata['sizes'][ $size_key ] = $size_data;
|
622 |
-
}
|
623 |
-
}
|
624 |
|
625 |
-
|
626 |
-
$attachment->optimize( $optimization_level, $metadata );
|
627 |
|
628 |
-
|
|
|
629 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
630 |
}
|
631 |
|
|
|
632 |
/**
|
633 |
-
*
|
634 |
-
*
|
635 |
-
* @return JSON WP formatted answer
|
636 |
*
|
637 |
* @since 1.6
|
638 |
* @author Geoffrey Crofte
|
639 |
*/
|
640 |
-
|
641 |
-
|
642 |
-
|
643 |
-
|
644 |
-
$prices = array();
|
645 |
-
$prices_all = get_imagify_all_prices();
|
646 |
|
647 |
-
|
648 |
-
|
649 |
-
$prices['monthlies'] = $prices_all -> Plans;
|
650 |
|
651 |
-
|
652 |
-
|
653 |
-
|
654 |
-
|
655 |
-
|
656 |
-
|
657 |
-
|
|
|
|
|
|
|
658 |
}
|
|
|
|
|
659 |
}
|
660 |
|
|
|
661 |
/**
|
662 |
-
*
|
663 |
-
*
|
664 |
-
* @return JSON WP formatted answer
|
665 |
*
|
666 |
* @since 1.6
|
667 |
* @author Geoffrey Crofte
|
668 |
*/
|
669 |
-
|
670 |
-
|
671 |
-
|
672 |
-
|
673 |
-
$coupon_response = check_imagify_coupon_code( $_POST[ 'coupon' ] );
|
674 |
-
|
675 |
-
wp_send_json_success( $coupon_response );
|
676 |
-
} else {
|
677 |
-
wp_send_json_error( 'check_ajax_referer for coupon code checking failed' );
|
678 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
679 |
}
|
680 |
|
|
|
681 |
/**
|
682 |
-
*
|
683 |
-
*
|
684 |
-
* @return JSON WP formatted answer
|
685 |
*
|
686 |
* @since 1.6
|
687 |
-
* @author
|
688 |
*/
|
689 |
-
|
690 |
-
|
691 |
-
if ( check_ajax_referer( 'imagify_get_pricing_' . get_current_user_id(), 'imagifynonce', false) ) {
|
692 |
|
693 |
-
|
694 |
-
|
695 |
-
update_imagify_option( 'total_size_images_library', array( 'raw' => $raw_total_size_in_library, 'human' => size_format( $raw_total_size_in_library ) ) );
|
696 |
-
update_imagify_option( 'average_size_images_per_month', array( 'raw' => $raw_average_per_month, 'human' => size_format( $raw_average_per_month ) ) );
|
697 |
|
698 |
-
|
699 |
-
|
700 |
-
'average_month_size' => get_imagify_option( 'average_size_images_per_month', null )
|
701 |
-
);
|
702 |
|
703 |
-
|
704 |
-
} else {
|
705 |
-
wp_send_json_error( 'check_ajax_referer for estimated image sizes failed' );
|
706 |
-
}
|
707 |
}
|
708 |
|
|
|
|
|
|
|
709 |
|
|
|
|
|
710 |
/**
|
711 |
-
*
|
712 |
-
*
|
713 |
-
* @return JSON WP formatted answer
|
714 |
*
|
715 |
-
* @since
|
716 |
-
* @author
|
717 |
*/
|
718 |
-
|
719 |
-
|
720 |
-
|
721 |
-
$discount = check_imagify_discount();
|
722 |
-
wp_send_json_success( $discount );
|
723 |
} else {
|
724 |
-
|
725 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
726 |
}
|
727 |
|
|
|
728 |
/**
|
729 |
-
*
|
730 |
*
|
731 |
-
* @since
|
732 |
-
* @author
|
733 |
*/
|
734 |
-
|
735 |
-
|
736 |
-
|
737 |
-
|
738 |
-
}
|
739 |
-
|
740 |
-
if ( ! check_ajax_referer( 'update_estimate_sizes' ) ) {
|
741 |
-
die();
|
742 |
-
}
|
743 |
-
|
744 |
-
$raw_total_size_in_library = imagify_calculate_total_size_images_library();
|
745 |
-
$raw_average_per_month = imagify_calculate_average_size_images_per_month();
|
746 |
|
747 |
-
|
748 |
-
update_imagify_option( 'average_size_images_per_month', array( 'raw' => $raw_average_per_month, 'human' => size_format( $raw_average_per_month ) ) );
|
749 |
|
750 |
-
|
751 |
-
|
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
/** --------------------------------------------------------------------------------------------- */
|
5 |
+
/** MANUAL OPTIMIZATION ========================================================================= */
|
6 |
+
/** --------------------------------------------------------------------------------------------- */
|
7 |
+
|
8 |
+
add_action( 'wp_ajax_imagify_manual_upload', '_do_admin_post_imagify_manual_upload' );
|
9 |
+
add_action( 'admin_post_imagify_manual_upload', '_do_admin_post_imagify_manual_upload' );
|
10 |
/**
|
11 |
* Process all thumbnails of a specific image with Imagify with the manual method.
|
12 |
*
|
13 |
* @since 1.0
|
14 |
* @author Jonathan Buttigieg
|
15 |
*/
|
|
|
|
|
16 |
function _do_admin_post_imagify_manual_upload() {
|
17 |
if ( defined( 'DOING_AJAX' ) ) {
|
18 |
check_ajax_referer( 'imagify-manual-upload' );
|
27 |
wp_nonce_ays( '' );
|
28 |
}
|
29 |
}
|
30 |
+
|
31 |
+
$context = esc_html( $_GET['context'] );
|
32 |
+
$attachment_id = absint( $_GET['attachment_id'] );
|
33 |
+
$class_name = get_imagify_attachment_class_name( $context );
|
34 |
$attachment = new $class_name( $attachment_id );
|
35 |
+
|
36 |
// Optimize it!!!!!
|
37 |
$attachment->optimize();
|
38 |
+
|
39 |
if ( ! defined( 'DOING_AJAX' ) ) {
|
40 |
wp_safe_redirect( wp_get_referer() );
|
41 |
die();
|
42 |
}
|
43 |
+
|
44 |
+
// Return the optimization statistics.
|
45 |
$output = get_imagify_attachment_optimization_text( $attachment, $context );
|
46 |
wp_send_json_success( $output );
|
47 |
}
|
48 |
|
49 |
+
add_action( 'wp_ajax_imagify_manual_override_upload', '_do_admin_post_imagify_manual_override_upload' );
|
50 |
+
add_action( 'admin_post_imagify_manual_override_upload', '_do_admin_post_imagify_manual_override_upload' );
|
51 |
/**
|
52 |
+
* Process all thumbnails of a specific image with Imagify with a different optimization level.
|
53 |
*
|
54 |
* @since 1.0
|
55 |
* @author Jonathan Buttigieg
|
56 |
*/
|
|
|
|
|
57 |
function _do_admin_post_imagify_manual_override_upload() {
|
58 |
if ( defined( 'DOING_AJAX' ) ) {
|
59 |
check_ajax_referer( 'imagify-manual-override-upload' );
|
68 |
wp_nonce_ays( '' );
|
69 |
}
|
70 |
}
|
71 |
+
|
72 |
+
$context = esc_html( $_GET['context'] );
|
73 |
+
$attachment_id = absint( $_GET['attachment_id'] );
|
74 |
+
$class_name = get_imagify_attachment_class_name( $context );
|
75 |
+
$attachment = new $class_name( $attachment_id );
|
76 |
+
|
77 |
+
// Restore the backup file.
|
78 |
$attachment->restore();
|
79 |
|
80 |
// Optimize it!!!!!
|
85 |
die();
|
86 |
}
|
87 |
|
88 |
+
// Return the optimization statistics.
|
89 |
$output = get_imagify_attachment_optimization_text( $attachment, $context );
|
90 |
wp_send_json_success( $output );
|
91 |
}
|
92 |
|
93 |
+
add_action( 'wp_ajax_imagify_restore_upload', '_do_admin_post_imagify_restore_upload' );
|
94 |
+
add_action( 'admin_post_imagify_restore_upload', '_do_admin_post_imagify_restore_upload' );
|
95 |
/**
|
96 |
* Process a restoration to the original attachment.
|
97 |
*
|
98 |
* @since 1.0
|
99 |
* @author Jonathan Buttigieg
|
100 |
*/
|
|
|
|
|
101 |
function _do_admin_post_imagify_restore_upload() {
|
102 |
if ( defined( 'DOING_AJAX' ) ) {
|
103 |
check_ajax_referer( 'imagify-restore-upload' );
|
112 |
wp_nonce_ays( '' );
|
113 |
}
|
114 |
}
|
115 |
+
|
116 |
+
$context = esc_html( $_GET['context'] );
|
117 |
+
$attachment_id = absint( $_GET['attachment_id'] );
|
118 |
+
$class_name = get_imagify_attachment_class_name( $context );
|
119 |
+
$attachment = new $class_name( $attachment_id );
|
120 |
+
|
121 |
+
// Restore the backup file.
|
122 |
$attachment->restore();
|
123 |
+
|
124 |
if ( ! defined( 'DOING_AJAX' ) ) {
|
125 |
wp_safe_redirect( wp_get_referer() );
|
126 |
die();
|
127 |
}
|
128 |
|
129 |
+
// Return the optimization button.
|
130 |
+
$output = '<a id="imagify-upload-' . $attachment->id . '" href="' . esc_url( get_imagify_admin_url( 'manual-upload', array( 'attachment_id' => $attachment->id ) ) ) . '" class="button-primary button-imagify-manual-upload" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">' . __( 'Optimize', 'imagify' ) . '</a>';
|
131 |
wp_send_json_success( $output );
|
132 |
}
|
133 |
|
134 |
+
add_action( 'wp_ajax_imagify_bulk_upload', '_do_wp_ajax_imagify_bulk_upload' );
|
135 |
/**
|
136 |
+
* Process all thumbnails of a specific image with Imagify with the bulk method.
|
137 |
*
|
138 |
* @since 1.0
|
139 |
* @author Jonathan Buttigieg
|
140 |
*/
|
141 |
+
function _do_wp_ajax_imagify_bulk_upload() {
|
142 |
+
check_ajax_referer( 'imagify-bulk-upload', 'imagifybulkuploadnonce' );
|
143 |
+
|
144 |
+
if ( ! isset( $_POST['image'], $_POST['context'] ) || ! current_user_can( 'upload_files' ) ) {
|
145 |
+
wp_send_json_error();
|
146 |
+
}
|
147 |
+
|
148 |
+
$context = esc_html( $_POST['context'] );
|
149 |
+
$attachment_id = absint( $_POST['image'] );
|
150 |
+
$class_name = get_imagify_attachment_class_name( $context );
|
151 |
+
$attachment = new $class_name( $attachment_id );
|
152 |
+
$optimization_level = get_transient( 'imagify_bulk_optimization_level' );
|
153 |
+
|
154 |
+
// Restore it if the optimization level is updated.
|
155 |
+
if ( $optimization_level !== $attachment->get_optimization_level() ) {
|
156 |
+
$attachment->restore();
|
157 |
+
}
|
158 |
+
|
159 |
+
// Optimize it!!!!!
|
160 |
+
$attachment->optimize( $optimization_level );
|
161 |
+
|
162 |
+
// Return the optimization statistics.
|
163 |
+
$fullsize_data = $attachment->get_size_data();
|
164 |
+
$stats_data = $attachment->get_stats_data();
|
165 |
+
$user = new Imagify_User();
|
166 |
+
$data = array();
|
167 |
+
|
168 |
+
if ( ! $attachment->is_optimized() ) {
|
169 |
+
$data['success'] = false;
|
170 |
+
$data['error'] = $fullsize_data['error'];
|
171 |
+
|
172 |
+
wp_send_json_error( $data );
|
173 |
+
}
|
174 |
+
|
175 |
+
$data['success'] = true;
|
176 |
+
$data['original_size'] = $fullsize_data['original_size'];
|
177 |
+
$data['new_size'] = $fullsize_data['optimized_size'];
|
178 |
+
$data['percent'] = $fullsize_data['percent'];
|
179 |
+
$data['overall_saving'] = $stats_data['original_size'] - $stats_data['optimized_size'];
|
180 |
+
$data['original_overall_size'] = $stats_data['original_size'];
|
181 |
+
$data['new_overall_size'] = $stats_data['optimized_size'];
|
182 |
+
$data['thumbnails'] = $attachment->get_optimized_sizes_count();
|
183 |
+
|
184 |
+
wp_send_json_success( $data );
|
185 |
+
}
|
186 |
+
|
187 |
+
/** --------------------------------------------------------------------------------------------- */
|
188 |
+
/** AUTOMATIC OPTIMIZATION ====================================================================== */
|
189 |
+
/** --------------------------------------------------------------------------------------------- */
|
190 |
+
|
191 |
+
add_action( 'wp_ajax_imagify_async_optimize_upload_new_media', '_do_admin_post_async_optimize_upload_new_media' );
|
192 |
+
/**
|
193 |
+
* Optimize image on picture uploading with async request.
|
194 |
+
*
|
195 |
+
* @since 1.5
|
196 |
+
* @author Julio Potier
|
197 |
+
* @see _imagify_optimize_attachment()
|
198 |
+
*/
|
199 |
+
function _do_admin_post_async_optimize_upload_new_media() {
|
200 |
+
if ( ! isset( $_POST['_ajax_nonce'], $_POST['attachment_id'], $_POST['metadata'], $_POST['context'] ) ) { // WPCS: CSRF ok.
|
201 |
+
return;
|
202 |
+
}
|
203 |
+
|
204 |
+
check_ajax_referer( 'new_media-' . $_POST['attachment_id'] );
|
205 |
+
|
206 |
+
$context = esc_html( $_POST['context'] );
|
207 |
+
$attachment_id = absint( $_POST['attachment_id'] );
|
208 |
+
$class_name = get_imagify_attachment_class_name( $context );
|
209 |
+
$attachment = new $class_name( $attachment_id );
|
210 |
+
|
211 |
+
// Optimize it!!!!!
|
212 |
+
$attachment->optimize( null, $_POST['metadata'] );
|
213 |
+
die( 1 );
|
214 |
+
}
|
215 |
+
|
216 |
+
add_action( 'wp_ajax_imagify_async_optimize_save_image_editor_file', '_do_admin_post_async_optimize_save_image_editor_file' );
|
217 |
+
/**
|
218 |
+
* Optimize image on picture editing (resize, crop...) with async request.
|
219 |
+
*
|
220 |
+
* @since 1.4
|
221 |
+
* @author Julio Potier
|
222 |
+
*/
|
223 |
+
function _do_admin_post_async_optimize_save_image_editor_file() {
|
224 |
+
if ( ! isset( $_POST['do'], $_POST['postid'] ) ) { // WPCS: CSRF ok.
|
225 |
+
return;
|
226 |
+
}
|
227 |
+
|
228 |
+
check_ajax_referer( 'image_editor-' . $_POST['postid'] );
|
229 |
+
|
230 |
+
$attachment_id = absint( $_POST['postid'] );
|
231 |
+
|
232 |
+
if ( ! get_post_meta( $attachment_id, '_imagify_data', true ) ) {
|
233 |
+
return;
|
234 |
+
}
|
235 |
+
|
236 |
+
$optimization_level = (int) get_post_meta( $attachment_id, '_imagify_optimization_level', true );
|
237 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
238 |
+
$attachment = new $class_name( $attachment_id );
|
239 |
+
$metadata = wp_get_attachment_metadata( $attachment_id );
|
240 |
+
|
241 |
+
// Remove old optimization data.
|
242 |
+
delete_post_meta( $attachment_id, '_imagify_data' );
|
243 |
+
delete_post_meta( $attachment_id, '_imagify_status' );
|
244 |
+
delete_post_meta( $attachment_id, '_imagify_optimization_level' );
|
245 |
+
|
246 |
+
if ( 'restore' === $_POST['do'] ) {
|
247 |
+
// Restore the backup file.
|
248 |
+
$attachment->restore();
|
249 |
+
|
250 |
+
// Get old metadata to regenerate all thumbnails.
|
251 |
+
$metadata = array( 'sizes' => array() );
|
252 |
+
$backup_sizes = (array) get_post_meta( $attachment_id, '_wp_attachment_backup_sizes', true );
|
253 |
+
|
254 |
+
foreach ( $backup_sizes as $size_key => $size_data ) {
|
255 |
+
$size_key = str_replace( '-origin', '' , $size_key );
|
256 |
+
$metadata['sizes'][ $size_key ] = $size_data;
|
257 |
+
}
|
258 |
+
}
|
259 |
+
|
260 |
+
// Optimize it!!!!!
|
261 |
+
$attachment->optimize( $optimization_level, $metadata );
|
262 |
+
die( 1 );
|
263 |
+
}
|
264 |
+
|
265 |
+
/** --------------------------------------------------------------------------------------------- */
|
266 |
+
/** VARIOUS FOR OPTIMIZATION ==================================================================== */
|
267 |
+
/** --------------------------------------------------------------------------------------------- */
|
268 |
+
|
269 |
add_action( 'wp_ajax_imagify_get_unoptimized_attachment_ids', '_do_wp_ajax_imagify_get_unoptimized_attachment_ids' );
|
270 |
+
/**
|
271 |
+
* Get all unoptimized attachment ids.
|
272 |
+
*
|
273 |
+
* @since 1.0
|
274 |
+
* @author Jonathan Buttigieg
|
275 |
+
*/
|
276 |
function _do_wp_ajax_imagify_get_unoptimized_attachment_ids() {
|
277 |
+
global $wpdb;
|
278 |
+
|
279 |
check_ajax_referer( 'imagify-bulk-upload', 'imagifybulkuploadnonce' );
|
280 |
|
281 |
if ( ! current_user_can( 'upload_files' ) ) {
|
282 |
wp_send_json_error();
|
283 |
}
|
284 |
+
|
285 |
if ( ! imagify_valid_key() ) {
|
286 |
wp_send_json_error( array( 'message' => 'invalid-api-key' ) );
|
287 |
}
|
288 |
+
|
289 |
$user = new Imagify_User();
|
290 |
+
|
291 |
if ( $user->is_over_quota() ) {
|
292 |
wp_send_json_error( array( 'message' => 'over-quota' ) );
|
293 |
}
|
294 |
+
|
295 |
@set_time_limit( 0 );
|
296 |
+
|
297 |
+
$optimization_level = (int) $_GET['optimization_level'];
|
298 |
+
$optimization_level = ( -1 !== $optimization_level ) ? $optimization_level : get_imagify_option( 'optimization_level', 1 );
|
299 |
$optimization_level = (int) $optimization_level;
|
300 |
+
|
301 |
$meta_query = array(
|
302 |
'relation' => 'OR',
|
303 |
array(
|
304 |
'key' => '_imagify_optimization_level',
|
305 |
'value' => $optimization_level,
|
306 |
+
'compare' => '!=',
|
307 |
),
|
308 |
array(
|
309 |
'key' => '_imagify_optimization_level',
|
310 |
+
'compare' => 'NOT EXISTS',
|
311 |
),
|
312 |
array(
|
313 |
'key' => '_imagify_status',
|
314 |
'value' => 'error',
|
315 |
+
'compare' => '=',
|
316 |
),
|
317 |
);
|
318 |
+
|
319 |
/**
|
320 |
+
* Filter the unoptimized attachments limit query.
|
321 |
*
|
322 |
* @since 1.4.4
|
323 |
*
|
324 |
+
* @param int The limit (-1 for unlimited).
|
325 |
*/
|
326 |
$unoptimized_attachment_limit = apply_filters( 'imagify_unoptimized_attachment_limit', 10000 );
|
327 |
+
|
328 |
$args = array(
|
329 |
'fields' => 'ids',
|
330 |
'post_type' => 'attachment',
|
331 |
'post_status' => 'any',
|
332 |
'post_mime_type' => get_imagify_mime_type(),
|
333 |
+
'meta_query' => $meta_query,
|
334 |
'posts_per_page' => $unoptimized_attachment_limit,
|
335 |
+
'orderby' => 'ID',
|
336 |
+
'order' => 'DESC',
|
337 |
'no_found_rows' => true,
|
338 |
'update_post_term_cache' => false,
|
339 |
);
|
340 |
+
|
|
|
|
|
341 |
$data = array();
|
342 |
$attachments = new WP_Query( $args );
|
343 |
$ids = $attachments->posts;
|
344 |
+
$ids = array_filter( (array) $ids );
|
345 |
+
$sql_ids = implode( ',', $ids );
|
346 |
|
347 |
if ( empty( $sql_ids ) ) {
|
348 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
349 |
}
|
350 |
+
|
351 |
+
// Get attachments filename.
|
352 |
+
$attachments_filename = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
353 |
"SELECT pm.post_id as id, pm.meta_value as value
|
354 |
FROM $wpdb->postmeta as pm
|
355 |
+
WHERE pm.meta_key = '_wp_attached_file'
|
356 |
+
AND pm.post_id IN ($sql_ids)
|
357 |
+
ORDER BY pm.post_id DESC",
|
358 |
+
ARRAY_A
|
359 |
);
|
360 |
+
|
361 |
+
$attachments_filename = imagify_query_results_combine( $ids, $attachments_filename );
|
362 |
+
|
363 |
+
// Get attachments data.
|
364 |
+
$attachments_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
365 |
"SELECT pm.post_id as id, pm.meta_value as value
|
366 |
FROM $wpdb->postmeta as pm
|
367 |
+
WHERE pm.meta_key = '_imagify_data'
|
368 |
+
AND pm.post_id IN ($sql_ids)
|
369 |
+
ORDER BY pm.post_id DESC",
|
370 |
+
ARRAY_A
|
371 |
);
|
372 |
+
|
373 |
+
$attachments_data = imagify_query_results_combine( $ids, $attachments_data );
|
374 |
$attachments_data = array_map( 'maybe_unserialize', $attachments_data );
|
375 |
+
|
376 |
+
// Get attachments optimization level.
|
377 |
+
$attachments_optimization_level = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
378 |
"SELECT pm.post_id as id, pm.meta_value as value
|
379 |
FROM $wpdb->postmeta as pm
|
380 |
+
WHERE pm.meta_key = '_imagify_optimization_level'
|
381 |
+
AND pm.post_id IN ($sql_ids)
|
382 |
+
ORDER BY pm.post_id DESC",
|
383 |
+
ARRAY_A
|
384 |
);
|
385 |
+
|
386 |
$attachments_optimization_level = imagify_query_results_combine( $ids, $attachments_optimization_level );
|
387 |
+
|
388 |
+
// Get attachments status.
|
389 |
+
$attachments_status = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
390 |
"SELECT pm.post_id as id, pm.meta_value as value
|
391 |
FROM $wpdb->postmeta as pm
|
392 |
+
WHERE pm.meta_key = '_imagify_status'
|
393 |
+
AND pm.post_id IN ($sql_ids)
|
394 |
+
ORDER BY pm.post_id DESC",
|
395 |
+
ARRAY_A
|
396 |
);
|
397 |
+
|
398 |
$attachments_status = imagify_query_results_combine( $ids, $attachments_status );
|
399 |
+
|
400 |
+
// Save the optimization level in a transient to retrieve it later during the process.
|
401 |
set_transient( 'imagify_bulk_optimization_level', $optimization_level );
|
402 |
+
|
403 |
+
foreach ( $ids as $id ) {
|
404 |
+
/** This filter is documented in inc/functions/process.php. */
|
405 |
$file_path = apply_filters( 'imagify_file_path', get_imagify_attached_file( $attachments_filename[ $id ] ) );
|
406 |
+
|
407 |
+
if ( ! file_exists( $file_path ) ) {
|
408 |
+
continue;
|
409 |
+
}
|
410 |
+
|
411 |
+
$attachment_data = isset( $attachments_data[ $id ] ) ? $attachments_data[ $id ] : false;
|
412 |
+
$attachment_error = '';
|
413 |
+
|
414 |
+
if ( isset( $attachment_data['sizes']['full']['error'] ) ) {
|
415 |
+
$attachment_error = $attachment_data['sizes']['full']['error'];
|
416 |
+
}
|
417 |
+
|
418 |
+
$attachment_error = trim( $attachment_error );
|
419 |
+
$attachment_status = isset( $attachments_status[ $id ] ) ? $attachments_status[ $id ] : false;
|
420 |
+
$attachment_optimization_level = isset( $attachments_optimization_level[ $id ] ) ? $attachments_optimization_level[ $id ] : false;
|
421 |
+
$attachment_backup_path = get_imagify_attachment_backup_path( $file_path );
|
422 |
+
|
423 |
+
// Don't try to re-optimize if the optimization level is still the same.
|
424 |
+
if ( $optimization_level === $attachment_optimization_level && is_string( $attachment_error ) ) {
|
425 |
+
continue;
|
426 |
+
}
|
427 |
+
|
428 |
+
// Don't try to re-optimize if there is no backup file.
|
429 |
+
if ( 'success' === $attachment_status && $optimization_level !== $attachment_optimization_level && ! file_exists( $attachment_backup_path ) ) {
|
430 |
+
continue;
|
431 |
+
}
|
432 |
+
|
433 |
+
// Don't try to re-optimize images already compressed.
|
434 |
+
if ( 'already_optimized' === $attachment_status && $attachment_optimization_level >= $optimization_level ) {
|
435 |
+
continue;
|
436 |
+
}
|
437 |
+
|
438 |
+
// Don't try to re-optimize images with an empty error message.
|
439 |
+
if ( 'error' === $attachment_status && empty( $attachment_error ) ) {
|
440 |
+
continue;
|
441 |
+
}
|
442 |
+
|
443 |
+
$data[ '_' . $id ] = get_imagify_attachment_url( $attachments_filename[ $id ] );
|
444 |
+
} // End foreach().
|
445 |
+
|
446 |
+
if ( $data ) {
|
447 |
wp_send_json_success( $data );
|
448 |
}
|
449 |
+
|
450 |
wp_send_json_error( array( 'message' => 'no-images' ) );
|
451 |
}
|
452 |
|
453 |
+
/** --------------------------------------------------------------------------------------------- */
|
454 |
+
/** IMAGIFY ACCOUNT ============================================================================= */
|
455 |
+
/** --------------------------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
456 |
|
457 |
+
add_action( 'wp_ajax_imagify_signup', '_do_wp_ajax_imagify_signup' );
|
458 |
/**
|
459 |
* Create a new Imagify account.
|
460 |
*
|
461 |
* @since 1.0
|
462 |
* @author Jonathan Buttigieg
|
463 |
*/
|
|
|
464 |
function _do_wp_ajax_imagify_signup() {
|
465 |
check_ajax_referer( 'imagify-signup', 'imagifysignupnonce' );
|
466 |
|
471 |
$data = array(
|
472 |
'email' => $_GET['email'],
|
473 |
'password' => wp_generate_password( 12, false ),
|
474 |
+
'lang' => get_locale(),
|
475 |
);
|
476 |
|
477 |
$response = add_imagify_user( $data );
|
483 |
wp_send_json_success();
|
484 |
}
|
485 |
|
486 |
+
add_action( 'wp_ajax_imagify_check_api_key_validity', '_do_wp_ajax_imagify_check_api_key_validity' );
|
487 |
/**
|
488 |
* Process an API key check validity.
|
489 |
*
|
490 |
* @since 1.0
|
491 |
* @author Jonathan Buttigieg
|
492 |
*/
|
|
|
493 |
function _do_wp_ajax_imagify_check_api_key_validity() {
|
494 |
check_ajax_referer( 'imagify-check-api-key', 'imagifycheckapikeynonce' );
|
495 |
|
502 |
if ( is_wp_error( $response ) ) {
|
503 |
wp_send_json_error( $response->get_error_message() );
|
504 |
}
|
505 |
+
|
506 |
$options = get_site_option( IMAGIFY_SETTINGS_SLUG );
|
507 |
$options['api_key'] = sanitize_key( $_GET['api_key'] );
|
508 |
|
511 |
wp_send_json_success();
|
512 |
}
|
513 |
|
514 |
+
add_action( 'wp_ajax_imagify_get_admin_bar_profile', '_do_wp_ajax_imagify_get_admin_bar_profile' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
515 |
/**
|
516 |
* Get admin bar profile output
|
517 |
*
|
518 |
* @since 1.2.3
|
519 |
* @author Jonathan Buttigieg
|
520 |
*/
|
|
|
521 |
function _do_wp_ajax_imagify_get_admin_bar_profile() {
|
522 |
check_ajax_referer( 'imagify-get-admin-bar-profile', 'imagifygetadminbarprofilenonce' );
|
523 |
+
|
524 |
+
$user = new Imagify_User();
|
525 |
$unconsumed_quota = $user->get_percent_unconsumed_quota();
|
526 |
+
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'sun.svg" width="37" height="38" alt="" />';
|
527 |
$bar_class = 'positive';
|
528 |
$message = '';
|
529 |
|
537 |
}
|
538 |
|
539 |
if ( $unconsumed_quota <= 20 && $unconsumed_quota > 0 ) {
|
540 |
+
$message = '<div class="imagify-error">';
|
541 |
+
$message .= '<p><i class="dashicons dashicons-warning" aria-hidden="true"></i><strong>' . __( 'Oops, It\'s almost over!', 'imagify' ) . '</strong></p>';
|
542 |
+
/* translators: %s is a line break. */
|
543 |
+
$message .= '<p>' . sprintf( __( 'You have almost used all your credit.%sDon\'t forget to upgrade your subscription to continue optimizing your images.', 'imagify' ), '<br/><br/>' ) . '</p>';
|
544 |
+
$message .= '<p class="center txt-center text-center"><a class="btn btn-ghost" href="' . IMAGIFY_APP_MAIN . '/#/subscription" target="_blank">' . __( 'View My Subscription', 'imagify' ) . '</a></p>';
|
545 |
+
$message .= '</div>';
|
546 |
+
}
|
547 |
+
|
548 |
+
if ( 0 === $unconsumed_quota ) {
|
549 |
+
$message = '<div class="imagify-error">';
|
550 |
+
$message .= '<p><i class="dashicons dashicons-warning" aria-hidden="true"></i><strong>' . __( 'Oops, It\'s Over!', 'imagify' ) . '</strong></p>';
|
551 |
+
$message .= '<p>' . sprintf(
|
552 |
+
/* translators: 1 is a data quota, 2 is a date. */
|
553 |
+
__( 'You have consumed all your credit for this month. You will have <strong>%1$s back on %2$s</strong>.', 'imagify' ),
|
554 |
+
size_format( $user->quota * 1048576 ),
|
555 |
+
date_i18n( get_option( 'date_format' ), strtotime( $user->next_date_update ) )
|
556 |
+
) . '</p>';
|
557 |
+
$message .= '<p class="center txt-center text-center"><a class="btn btn-ghost" href="' . IMAGIFY_APP_MAIN . '/#/subscription" target="_blank">' . __( 'Upgrade My Subscription', 'imagify' ) . '</a></p>';
|
558 |
+
$message .= '</div>';
|
559 |
+
}
|
560 |
+
|
561 |
+
// Custom HTML.
|
562 |
+
$quota_section = '<div class="imagify-admin-bar-quota">';
|
563 |
+
$quota_section .= '<div class="imagify-abq-row">';
|
564 |
|
565 |
if ( 1 === $user->plan_id ) {
|
566 |
+
$quota_section .= '<div class="imagify-meteo-icon">' . $meteo_icon . '</div>';
|
|
|
|
|
|
|
567 |
}
|
568 |
|
569 |
+
$quota_section .= '<div class="imagify-account">';
|
570 |
+
$quota_section .= '<p class="imagify-meteo-title">' . __( 'Account status', 'imagify' ) . '</p>';
|
571 |
+
$quota_section .= '<p class="imagify-meteo-subs">' . __( 'Your subscription:', 'imagify' ) . ' <strong class="imagify-user-plan">' . $user->plan_label . '</strong></p>';
|
572 |
+
$quota_section .= '</div>'; // .imagify-account
|
573 |
+
$quota_section .= '</div>'; // .imagify-abq-row
|
|
|
574 |
|
575 |
if ( 1 === $user->plan_id ) {
|
576 |
+
$quota_section .= '<div class="imagify-abq-row">';
|
577 |
+
$quota_section .= '<div class="imagify-space-left">';
|
578 |
+
/* translators: %s is a data quota. */
|
579 |
+
$quota_section .= '<p>' . sprintf( __( 'You have %s space credit left', 'imagify' ), '<span class="imagify-unconsumed-percent">' . $unconsumed_quota . '%</span>' ) . '</p>';
|
580 |
+
$quota_section .= '<div class="imagify-bar-' . $bar_class . '">';
|
581 |
+
$quota_section .= '<div style="width: ' . $unconsumed_quota . '%;" class="imagify-unconsumed-bar imagify-progress"></div>';
|
582 |
+
$quota_section .= '</div>'; // .imagify-bar-{$bar_class}
|
583 |
+
$quota_section .= '</div>'; // .imagify-space-left
|
584 |
+
$quota_section .= '</div>'; // .imagify-abq-row
|
585 |
+
}
|
586 |
+
|
587 |
+
$quota_section .= '<p class="imagify-abq-row">';
|
588 |
+
$quota_section .= '<a class="imagify-account-link" href="' . IMAGIFY_APP_MAIN . '/#/subscription" target="_blank">';
|
589 |
+
$quota_section .= '<span class="dashicons dashicons-admin-users"></span>';
|
590 |
+
$quota_section .= '<span class="button-text">' . __( 'View my subscription', 'imagify' ) . '</span>';
|
591 |
+
$quota_section .= '</a>'; // .imagify-account-link
|
592 |
+
$quota_section .= '</p>'; // .imagify-abq-row
|
593 |
+
$quota_section .= '</div>'; // .imagify-admin-bar-quota
|
594 |
+
$quota_section .= $message;
|
595 |
+
|
|
|
596 |
wp_send_json_success( $quota_section );
|
597 |
}
|
598 |
|
599 |
+
add_action( 'wp_ajax_imagify_get_prices', '_imagify_get_prices_from_api' );
|
600 |
/**
|
601 |
+
* Get pricings from API for Onetime and Plans at the same time.
|
602 |
*
|
603 |
+
* @since 1.6
|
604 |
+
* @author Geoffrey Crofte
|
605 |
+
*/
|
606 |
+
function _imagify_get_prices_from_api() {
|
607 |
+
if ( ! check_ajax_referer( 'imagify_get_pricing_' . get_current_user_id(), 'imagifynonce', false ) ) {
|
608 |
+
wp_send_json_error( 'check_ajax_referer for prices failed' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
609 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
610 |
|
611 |
+
$prices_all = get_imagify_all_prices();
|
|
|
612 |
|
613 |
+
if ( is_wp_error( $prices_all ) ) {
|
614 |
+
wp_send_json_error( 'Prices variable is a WP_Error: ' . $prices_all->get_error_message() );
|
615 |
}
|
616 |
+
|
617 |
+
if ( ! is_object( $prices_all ) ) {
|
618 |
+
wp_send_json_error( 'Prices variable is not an object' );
|
619 |
+
}
|
620 |
+
|
621 |
+
wp_send_json_success( array(
|
622 |
+
'onetimes' => $prices_all->Packs,
|
623 |
+
'monthlies' => $prices_all->Plans,
|
624 |
+
) );
|
625 |
}
|
626 |
|
627 |
+
add_action( 'wp_ajax_imagify_check_coupon', '_imagify_check_coupon_code' );
|
628 |
/**
|
629 |
+
* Check Coupon code on modal popin.
|
|
|
|
|
630 |
*
|
631 |
* @since 1.6
|
632 |
* @author Geoffrey Crofte
|
633 |
*/
|
634 |
+
function _imagify_check_coupon_code() {
|
635 |
+
if ( ! check_ajax_referer( 'imagify_get_pricing_' . get_current_user_id(), 'imagifynonce', false ) ) {
|
636 |
+
wp_send_json_error( 'check_ajax_referer for coupon code checking failed' );
|
637 |
+
}
|
|
|
|
|
638 |
|
639 |
+
wp_send_json_success( check_imagify_coupon_code( $_POST['coupon'] ) );
|
640 |
+
}
|
|
|
641 |
|
642 |
+
add_action( 'wp_ajax_imagify_get_discount', '_imagify_get_discount' );
|
643 |
+
/**
|
644 |
+
* Get current discount promotion to display information on payment modal.
|
645 |
+
*
|
646 |
+
* @since 1.6.3
|
647 |
+
* @author Geoffrey Crofte
|
648 |
+
*/
|
649 |
+
function _imagify_get_discount() {
|
650 |
+
if ( ! check_ajax_referer( 'imagify_get_pricing_' . get_current_user_id(), 'imagifynonce', false ) ) {
|
651 |
+
wp_send_json_error( 'check_ajax_referer for getting discount failed' );
|
652 |
}
|
653 |
+
|
654 |
+
wp_send_json_success( check_imagify_discount() );
|
655 |
}
|
656 |
|
657 |
+
add_action( 'wp_ajax_imagify_get_images_counts', '_imagify_get_estimated_sizes' );
|
658 |
/**
|
659 |
+
* Get estimated sizes from the WordPress library.
|
|
|
|
|
660 |
*
|
661 |
* @since 1.6
|
662 |
* @author Geoffrey Crofte
|
663 |
*/
|
664 |
+
function _imagify_get_estimated_sizes() {
|
665 |
+
if ( ! check_ajax_referer( 'imagify_get_pricing_' . get_current_user_id(), 'imagifynonce', false ) ) {
|
666 |
+
wp_send_json_error( 'check_ajax_referer for estimated image sizes failed' );
|
|
|
|
|
|
|
|
|
|
|
|
|
667 |
}
|
668 |
+
|
669 |
+
$raw_total_size_in_library = imagify_calculate_total_size_images_library();
|
670 |
+
$raw_average_per_month = imagify_calculate_average_size_images_per_month();
|
671 |
+
update_imagify_option( 'total_size_images_library', array( 'raw' => $raw_total_size_in_library, 'human' => size_format( $raw_total_size_in_library ) ) );
|
672 |
+
update_imagify_option( 'average_size_images_per_month', array( 'raw' => $raw_average_per_month, 'human' => size_format( $raw_average_per_month ) ) );
|
673 |
+
|
674 |
+
wp_send_json_success( array(
|
675 |
+
'total_library_size' => get_imagify_option( 'total_size_images_library', null ),
|
676 |
+
'average_month_size' => get_imagify_option( 'average_size_images_per_month', null ),
|
677 |
+
) );
|
678 |
}
|
679 |
|
680 |
+
add_action( 'wp_ajax_imagify_update_estimate_sizes', '_imagify_update_estimate_sizes' );
|
681 |
/**
|
682 |
+
* Estimate sizes and update the options values for them.
|
|
|
|
|
683 |
*
|
684 |
* @since 1.6
|
685 |
+
* @author Remy Perona
|
686 |
*/
|
687 |
+
function _imagify_update_estimate_sizes() {
|
688 |
+
check_ajax_referer( 'update_estimate_sizes' );
|
|
|
689 |
|
690 |
+
$raw_total_size_in_library = imagify_calculate_total_size_images_library();
|
691 |
+
$raw_average_per_month = imagify_calculate_average_size_images_per_month();
|
|
|
|
|
692 |
|
693 |
+
update_imagify_option( 'total_size_images_library', array( 'raw' => $raw_total_size_in_library, 'human' => size_format( $raw_total_size_in_library ) ) );
|
694 |
+
update_imagify_option( 'average_size_images_per_month', array( 'raw' => $raw_average_per_month, 'human' => size_format( $raw_average_per_month ) ) );
|
|
|
|
|
695 |
|
696 |
+
die( 1 );
|
|
|
|
|
|
|
697 |
}
|
698 |
|
699 |
+
/** --------------------------------------------------------------------------------------------- */
|
700 |
+
/** OTHER ======================================================================================= */
|
701 |
+
/** --------------------------------------------------------------------------------------------- */
|
702 |
|
703 |
+
add_action( 'wp_ajax_imagify_dismiss_notice', '_do_admin_post_imagify_dismiss_notice' );
|
704 |
+
add_action( 'admin_post_imagify_dismiss_notice', '_do_admin_post_imagify_dismiss_notice' );
|
705 |
/**
|
706 |
+
* Process a dismissed notice.
|
|
|
|
|
707 |
*
|
708 |
+
* @since 1.0
|
709 |
+
* @author Jonathan Buttigieg
|
710 |
*/
|
711 |
+
function _do_admin_post_imagify_dismiss_notice() {
|
712 |
+
if ( defined( 'DOING_AJAX' ) ) {
|
713 |
+
check_ajax_referer( 'imagify-dismiss-notice' );
|
|
|
|
|
714 |
} else {
|
715 |
+
check_admin_referer( 'imagify-dismiss-notice' );
|
716 |
}
|
717 |
+
|
718 |
+
if ( ! isset( $_GET['notice'] ) || ! current_user_can( 'manage_options' ) ) {
|
719 |
+
if ( defined( 'DOING_AJAX' ) ) {
|
720 |
+
wp_send_json_error();
|
721 |
+
} else {
|
722 |
+
wp_nonce_ays( '' );
|
723 |
+
}
|
724 |
+
}
|
725 |
+
|
726 |
+
$notice = $_GET['notice'];
|
727 |
+
|
728 |
+
imagify_dismiss_notice( $notice );
|
729 |
+
|
730 |
+
/**
|
731 |
+
* Fires when a notice is dismissed.
|
732 |
+
*
|
733 |
+
* @since 1.4.2
|
734 |
+
*
|
735 |
+
* @param int $notice The notice slug
|
736 |
+
*/
|
737 |
+
do_action( 'imagify_dismiss_notice', $notice );
|
738 |
+
|
739 |
+
if ( ! defined( 'DOING_AJAX' ) ) {
|
740 |
+
wp_safe_redirect( wp_get_referer() );
|
741 |
+
die();
|
742 |
+
}
|
743 |
+
|
744 |
+
wp_send_json_success();
|
745 |
}
|
746 |
|
747 |
+
add_action( 'admin_post_imagify_deactivate_plugin', '_imagify_deactivate_plugin' );
|
748 |
/**
|
749 |
+
* Disable a plugin which can be in conflict with Imagify
|
750 |
*
|
751 |
+
* @since 1.2
|
752 |
+
* @author Jonathan Buttigieg
|
753 |
*/
|
754 |
+
function _imagify_deactivate_plugin() {
|
755 |
+
if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'imagifydeactivatepluginnonce' ) ) {
|
756 |
+
wp_nonce_ays( '' );
|
757 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
758 |
|
759 |
+
deactivate_plugins( $_GET['plugin'] );
|
|
|
760 |
|
761 |
+
wp_safe_redirect( wp_get_referer() );
|
762 |
+
die();
|
763 |
+
}
|
inc/admin/enqueue.php
CHANGED
@@ -1,17 +1,17 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
* Add some CSS on the whole administration
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*/
|
9 |
-
add_action( 'admin_print_styles', '_imagify_admin_print_styles' );
|
10 |
function _imagify_admin_print_styles() {
|
11 |
global $pagenow;
|
12 |
$current_screen = get_current_screen();
|
13 |
-
$css_ext =
|
14 |
-
$js_ext =
|
15 |
|
16 |
wp_register_style(
|
17 |
'imagify-css-admin',
|
@@ -36,7 +36,7 @@ function _imagify_admin_print_styles() {
|
|
36 |
|
37 |
wp_register_script(
|
38 |
'imagify-js-async',
|
39 |
-
IMAGIFY_ASSETS_JS_URL . 'imagify.
|
40 |
array( 'imagify-js-bulk' ),
|
41 |
IMAGIFY_VERSION,
|
42 |
true
|
@@ -76,7 +76,7 @@ function _imagify_admin_print_styles() {
|
|
76 |
|
77 |
wp_register_script(
|
78 |
'imagify-js-chart',
|
79 |
-
IMAGIFY_ASSETS_JS_URL . 'chart'
|
80 |
array(),
|
81 |
IMAGIFY_VERSION,
|
82 |
true
|
@@ -106,14 +106,14 @@ function _imagify_admin_print_styles() {
|
|
106 |
);
|
107 |
|
108 |
/*
|
109 |
-
* Styles loaded in the whole admnistration
|
110 |
-
|
111 |
wp_enqueue_style( 'imagify-css-admin' );
|
112 |
wp_enqueue_style( 'imagify-css-sweetalert' );
|
113 |
|
114 |
/*
|
115 |
-
* Scripts loaded in the whole admnistration
|
116 |
-
|
117 |
wp_enqueue_script( 'imagify-js-sweetalert' );
|
118 |
wp_enqueue_script( 'imagify-js-admin' );
|
119 |
|
@@ -122,8 +122,8 @@ function _imagify_admin_print_styles() {
|
|
122 |
wp_enqueue_script( 'imagify-js-admin' );
|
123 |
|
124 |
/*
|
125 |
-
* Scripts loaded in /wp-admin/options-general.php?page=imagify
|
126 |
-
|
127 |
if ( isset( $current_screen ) && ( 'settings_page_imagify' === $current_screen->base || 'settings_page_imagify-network' === $current_screen->base ) ) {
|
128 |
wp_enqueue_script( 'imagify-js-chart' );
|
129 |
wp_enqueue_script( 'imagify-js-event-move' );
|
@@ -136,20 +136,19 @@ function _imagify_admin_print_styles() {
|
|
136 |
}
|
137 |
|
138 |
/**
|
139 |
-
* Scripts loaded in /wp-admin/upload.php and post.php
|
140 |
*/
|
141 |
if ( isset( $current_screen ) && ( 'upload' === $current_screen->base || 'post' === $current_screen->base ) ) {
|
142 |
$upload_data = get_imagify_localize_script_translations( 'upload' );
|
143 |
-
wp_localize_script( 'imagify-js-upload', 'imagifyUpload', $upload_data );
|
144 |
wp_enqueue_script( 'imagify-js-chart' );
|
145 |
wp_enqueue_script( 'imagify-js-upload' );
|
146 |
}
|
147 |
|
148 |
/**
|
149 |
* Scripts loaded in:
|
150 |
-
*
|
151 |
-
*
|
152 |
-
*
|
153 |
*/
|
154 |
if ( isset( $current_screen ) && ( ('post' === $current_screen->base && 'attachment' === $current_screen->post_type ) || 'upload' === $current_screen->base ) ) {
|
155 |
wp_localize_script( 'imagify-js-twentytwenty', 'imagifyTTT', get_imagify_localize_script_translations( 'twentytwenty' ) );
|
@@ -160,23 +159,26 @@ function _imagify_admin_print_styles() {
|
|
160 |
}
|
161 |
|
162 |
/**
|
163 |
-
* Scripts loaded in /wp-admin/upload.php?page=imagify-bulk-optimization
|
164 |
*/
|
165 |
if ( isset( $current_screen ) && 'media_page_imagify-bulk-optimization' === $current_screen->base ) {
|
166 |
wp_enqueue_script( 'heartbeat' );
|
167 |
-
|
168 |
$bulk_data = get_imagify_localize_script_translations( 'bulk' );
|
169 |
$bulk_data['heartbeat_id'] = 'update_bulk_data';
|
170 |
$bulk_data['ajax_action'] = 'imagify_get_unoptimized_attachment_ids';
|
171 |
$bulk_data['ajax_context'] = 'wp';
|
172 |
-
|
|
|
173 |
/**
|
174 |
* Filter the number of parallel queries during the Bulk Optimization
|
175 |
*
|
176 |
* @since 1.5.4
|
177 |
-
|
178 |
-
|
179 |
-
|
|
|
|
|
180 |
wp_localize_script( 'imagify-js-bulk', 'imagifyBulk', $bulk_data );
|
181 |
wp_enqueue_script( 'imagify-js-chart' );
|
182 |
wp_enqueue_script( 'imagify-js-async' );
|
@@ -184,42 +186,46 @@ function _imagify_admin_print_styles() {
|
|
184 |
}
|
185 |
}
|
186 |
|
|
|
|
|
187 |
/**
|
188 |
* Add Intercom on Options page an Bulk Optimization
|
189 |
*
|
190 |
* @since 1.0
|
191 |
*/
|
192 |
-
|
193 |
-
|
194 |
-
|
|
|
|
|
195 |
$user = get_imagify_user();
|
196 |
-
|
197 |
-
if (
|
198 |
return;
|
199 |
}
|
200 |
-
?>
|
201 |
<script>
|
202 |
window.intercomSettings = {
|
203 |
-
app_id:
|
204 |
user_id: <?php echo (int) $user->id; ?>,
|
205 |
};
|
206 |
</script>
|
207 |
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/cd6nxj3z';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
|
208 |
-
<?php
|
209 |
}
|
210 |
|
|
|
211 |
/**
|
212 |
* Remove Yoast SEO bugged script
|
213 |
*
|
214 |
* @since 1.4.1
|
215 |
*/
|
216 |
-
add_action( 'wp_print_scripts', '_imagify_dequeue_yoastseo_script' );
|
217 |
function _imagify_dequeue_yoastseo_script() {
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'admin_print_styles', '_imagify_admin_print_styles' );
|
5 |
/**
|
6 |
* Add some CSS on the whole administration
|
7 |
*
|
8 |
* @since 1.0
|
9 |
*/
|
|
|
10 |
function _imagify_admin_print_styles() {
|
11 |
global $pagenow;
|
12 |
$current_screen = get_current_screen();
|
13 |
+
$css_ext = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.css' : '.min.css';
|
14 |
+
$js_ext = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.js' : '.min.js';
|
15 |
|
16 |
wp_register_style(
|
17 |
'imagify-css-admin',
|
36 |
|
37 |
wp_register_script(
|
38 |
'imagify-js-async',
|
39 |
+
IMAGIFY_ASSETS_JS_URL . 'imagify' . $js_ext,
|
40 |
array( 'imagify-js-bulk' ),
|
41 |
IMAGIFY_VERSION,
|
42 |
true
|
76 |
|
77 |
wp_register_script(
|
78 |
'imagify-js-chart',
|
79 |
+
IMAGIFY_ASSETS_JS_URL . 'chart' . $js_ext,
|
80 |
array(),
|
81 |
IMAGIFY_VERSION,
|
82 |
true
|
106 |
);
|
107 |
|
108 |
/*
|
109 |
+
* Styles loaded in the whole admnistration.
|
110 |
+
*/
|
111 |
wp_enqueue_style( 'imagify-css-admin' );
|
112 |
wp_enqueue_style( 'imagify-css-sweetalert' );
|
113 |
|
114 |
/*
|
115 |
+
* Scripts loaded in the whole admnistration.
|
116 |
+
*/
|
117 |
wp_enqueue_script( 'imagify-js-sweetalert' );
|
118 |
wp_enqueue_script( 'imagify-js-admin' );
|
119 |
|
122 |
wp_enqueue_script( 'imagify-js-admin' );
|
123 |
|
124 |
/*
|
125 |
+
* Scripts loaded in /wp-admin/options-general.php?page=imagify.
|
126 |
+
*/
|
127 |
if ( isset( $current_screen ) && ( 'settings_page_imagify' === $current_screen->base || 'settings_page_imagify-network' === $current_screen->base ) ) {
|
128 |
wp_enqueue_script( 'imagify-js-chart' );
|
129 |
wp_enqueue_script( 'imagify-js-event-move' );
|
136 |
}
|
137 |
|
138 |
/**
|
139 |
+
* Scripts loaded in /wp-admin/upload.php and post.php.
|
140 |
*/
|
141 |
if ( isset( $current_screen ) && ( 'upload' === $current_screen->base || 'post' === $current_screen->base ) ) {
|
142 |
$upload_data = get_imagify_localize_script_translations( 'upload' );
|
143 |
+
wp_localize_script( 'imagify-js-upload', 'imagifyUpload', $upload_data );
|
144 |
wp_enqueue_script( 'imagify-js-chart' );
|
145 |
wp_enqueue_script( 'imagify-js-upload' );
|
146 |
}
|
147 |
|
148 |
/**
|
149 |
* Scripts loaded in:
|
150 |
+
* /wp-admin/post.php (for attachment post type),
|
151 |
+
* /wp-admin/upload.php (for attachments list).
|
|
|
152 |
*/
|
153 |
if ( isset( $current_screen ) && ( ('post' === $current_screen->base && 'attachment' === $current_screen->post_type ) || 'upload' === $current_screen->base ) ) {
|
154 |
wp_localize_script( 'imagify-js-twentytwenty', 'imagifyTTT', get_imagify_localize_script_translations( 'twentytwenty' ) );
|
159 |
}
|
160 |
|
161 |
/**
|
162 |
+
* Scripts loaded in /wp-admin/upload.php?page=imagify-bulk-optimization.
|
163 |
*/
|
164 |
if ( isset( $current_screen ) && 'media_page_imagify-bulk-optimization' === $current_screen->base ) {
|
165 |
wp_enqueue_script( 'heartbeat' );
|
166 |
+
|
167 |
$bulk_data = get_imagify_localize_script_translations( 'bulk' );
|
168 |
$bulk_data['heartbeat_id'] = 'update_bulk_data';
|
169 |
$bulk_data['ajax_action'] = 'imagify_get_unoptimized_attachment_ids';
|
170 |
$bulk_data['ajax_context'] = 'wp';
|
171 |
+
$bulk_data['buffer_size'] = get_imagify_bulk_buffer_size();
|
172 |
+
|
173 |
/**
|
174 |
* Filter the number of parallel queries during the Bulk Optimization
|
175 |
*
|
176 |
* @since 1.5.4
|
177 |
+
*
|
178 |
+
* @param int $buffer_size Number of parallel queries.
|
179 |
+
*/
|
180 |
+
$bulk_data['buffer_size'] = apply_filters( 'imagify_bulk_buffer_size', $bulk_data['buffer_size'] );
|
181 |
+
|
182 |
wp_localize_script( 'imagify-js-bulk', 'imagifyBulk', $bulk_data );
|
183 |
wp_enqueue_script( 'imagify-js-chart' );
|
184 |
wp_enqueue_script( 'imagify-js-async' );
|
186 |
}
|
187 |
}
|
188 |
|
189 |
+
add_action( 'admin_footer-media_page_imagify-bulk-optimization', '_imagify_admin_print_intercom' );
|
190 |
+
add_action( 'admin_footer-settings_page_imagify', '_imagify_admin_print_intercom' );
|
191 |
/**
|
192 |
* Add Intercom on Options page an Bulk Optimization
|
193 |
*
|
194 |
* @since 1.0
|
195 |
*/
|
196 |
+
function _imagify_admin_print_intercom() {
|
197 |
+
if ( ! imagify_valid_key() ) {
|
198 |
+
return;
|
199 |
+
}
|
200 |
+
|
201 |
$user = get_imagify_user();
|
202 |
+
|
203 |
+
if ( empty( $user->is_intercom ) || false === $user->display_support ) {
|
204 |
return;
|
205 |
}
|
206 |
+
?>
|
207 |
<script>
|
208 |
window.intercomSettings = {
|
209 |
+
app_id: 'cd6nxj3z',
|
210 |
user_id: <?php echo (int) $user->id; ?>,
|
211 |
};
|
212 |
</script>
|
213 |
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/cd6nxj3z';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
|
214 |
+
<?php
|
215 |
}
|
216 |
|
217 |
+
add_action( 'wp_print_scripts', '_imagify_dequeue_yoastseo_script' );
|
218 |
/**
|
219 |
* Remove Yoast SEO bugged script
|
220 |
*
|
221 |
* @since 1.4.1
|
222 |
*/
|
|
|
223 |
function _imagify_dequeue_yoastseo_script() {
|
224 |
+
global $pagenow;
|
225 |
+
$current_screen = get_current_screen();
|
226 |
+
|
227 |
+
if ( isset( $current_screen ) && 'post' === $current_screen->base && 'attachment' === $current_screen->post_type ) {
|
228 |
+
wp_dequeue_script( 'yoast-seo' );
|
229 |
+
wp_deregister_script( 'yoast-seo' );
|
230 |
+
}
|
231 |
+
}
|
inc/admin/heartbeat.php
CHANGED
@@ -1,46 +1,54 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
global $pagenow;
|
5 |
|
|
|
6 |
/**
|
7 |
* Prepare the data that goes back with the Heartbeat API.
|
8 |
*
|
9 |
* @since 1.4.5
|
|
|
|
|
|
|
|
|
10 |
*/
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
|
|
31 |
}
|
32 |
|
33 |
|
|
|
|
|
|
|
34 |
/**
|
35 |
-
* Update the Heartbeat API settings
|
36 |
*
|
37 |
* @since 1.4.5
|
|
|
|
|
|
|
38 |
*/
|
39 |
-
|
40 |
-
|
|
|
41 |
}
|
42 |
-
|
43 |
-
function _imagify_heartbeat_settings( $settings ) {
|
44 |
-
$settings['interval'] = 30;
|
45 |
-
return $settings;
|
46 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
global $pagenow;
|
5 |
|
6 |
+
add_filter( 'heartbeat_received', '_imagify_heartbeat_received', 10, 2 );
|
7 |
/**
|
8 |
* Prepare the data that goes back with the Heartbeat API.
|
9 |
*
|
10 |
* @since 1.4.5
|
11 |
+
*
|
12 |
+
* @param array $response The Heartbeat response.
|
13 |
+
* @param array $data The $_POST data sent.
|
14 |
+
* @return array
|
15 |
*/
|
16 |
+
function _imagify_heartbeat_received( $response, $data ) {
|
17 |
+
if ( empty( $data['imagify_heartbeat'] ) || 'update_bulk_data' !== $data['imagify_heartbeat'] ) {
|
18 |
+
return $response;
|
19 |
+
}
|
20 |
+
|
21 |
+
$saving_data = imagify_count_saving_data();
|
22 |
+
$user = new Imagify_User();
|
23 |
+
|
24 |
+
$response['imagify_bulk_data'] = array(
|
25 |
+
'already_optimized_attachments' => $saving_data['count'],
|
26 |
+
'optimized_attachments' => imagify_count_optimized_attachments(),
|
27 |
+
'unoptimized_attachments' => imagify_count_unoptimized_attachments(),
|
28 |
+
'errors_attachments' => imagify_count_error_attachments(),
|
29 |
+
'optimized_attachments_percent' => imagify_percent_optimized_attachments(),
|
30 |
+
'optimized_percent' => $saving_data['percent'],
|
31 |
+
'original_human' => size_format( $saving_data['original_size'], 1 ),
|
32 |
+
'optimized_human' => size_format( $saving_data['optimized_size'], 1 ),
|
33 |
+
'unconsumed_quota' => $user->get_percent_unconsumed_quota(),
|
34 |
+
);
|
35 |
+
|
36 |
+
return $response;
|
37 |
}
|
38 |
|
39 |
|
40 |
+
if ( 'upload.php' === $pagenow && isset( $_GET['page'] ) && 'imagify-bulk-optimization' === $_GET['page'] ) { // WPCS: CSRF ok.
|
41 |
+
add_filter( 'heartbeat_settings', '_imagify_heartbeat_settings', PHP_INT_MAX );
|
42 |
+
}
|
43 |
/**
|
44 |
+
* Update the Heartbeat API settings.
|
45 |
*
|
46 |
* @since 1.4.5
|
47 |
+
*
|
48 |
+
* @param array $settings Heartbeat API settings.
|
49 |
+
* @return array
|
50 |
*/
|
51 |
+
function _imagify_heartbeat_settings( $settings ) {
|
52 |
+
$settings['interval'] = 30;
|
53 |
+
return $settings;
|
54 |
}
|
|
|
|
|
|
|
|
|
|
inc/admin/media.php
CHANGED
@@ -1,20 +1,26 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
|
|
5 |
* Add "Imagify" column in the Media Uploader
|
6 |
*
|
7 |
* @since 1.2
|
8 |
* @author Jonathan Buttigieg
|
|
|
|
|
|
|
|
|
9 |
*/
|
10 |
-
add_filter( 'attachment_fields_to_edit', '_imagify_attachment_fields_to_edit', PHP_INT_MAX, 2 );
|
11 |
function _imagify_attachment_fields_to_edit( $form_fields, $post ) {
|
12 |
global $pagenow;
|
13 |
-
|
|
|
14 |
return $form_fields;
|
15 |
}
|
16 |
-
|
17 |
-
$
|
|
|
18 |
|
19 |
$form_fields['imagify'] = array(
|
20 |
'label' => 'Imagify',
|
@@ -27,40 +33,54 @@ function _imagify_attachment_fields_to_edit( $form_fields, $post ) {
|
|
27 |
return $form_fields;
|
28 |
}
|
29 |
|
|
|
30 |
/**
|
31 |
* Add "Compare Original VS Optimized" link to the media row action
|
32 |
*
|
33 |
* @since 1.4.3
|
34 |
* @author Geoffrey Crofte
|
|
|
|
|
|
|
|
|
35 |
*/
|
36 |
-
add_filter( 'media_row_actions', '_imagify_add_actions_to_media_list_row', PHP_INT_MAX, 2 );
|
37 |
function _imagify_add_actions_to_media_list_row( $actions, $post ) {
|
38 |
-
//
|
39 |
if ( ! wp_attachment_is_image( $post->ID ) ) {
|
40 |
return $actions;
|
41 |
}
|
42 |
|
43 |
-
$
|
|
|
44 |
|
45 |
-
//
|
46 |
if ( ! imagify_valid_key() || ! $attachment->is_optimized() ) {
|
47 |
return $actions;
|
48 |
}
|
49 |
|
50 |
-
//
|
51 |
-
if (
|
52 |
return $actions;
|
53 |
}
|
54 |
|
55 |
$image = wp_get_attachment_image_src( $post->ID, 'full' );
|
56 |
|
57 |
-
//
|
58 |
-
if ( (int) $image[1] < 360 ) {
|
59 |
return $actions;
|
60 |
}
|
61 |
|
62 |
-
//
|
63 |
-
$actions['imagify-compare'] =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
|
65 |
return $actions;
|
66 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_filter( 'attachment_fields_to_edit', '_imagify_attachment_fields_to_edit', PHP_INT_MAX, 2 );
|
5 |
+
/**
|
6 |
* Add "Imagify" column in the Media Uploader
|
7 |
*
|
8 |
* @since 1.2
|
9 |
* @author Jonathan Buttigieg
|
10 |
+
*
|
11 |
+
* @param array $form_fields An array of attachment form fields.
|
12 |
+
* @param object $post The WP_Post attachment object.
|
13 |
+
* @return array
|
14 |
*/
|
|
|
15 |
function _imagify_attachment_fields_to_edit( $form_fields, $post ) {
|
16 |
global $pagenow;
|
17 |
+
|
18 |
+
if ( 'post.php' === $pagenow ) {
|
19 |
return $form_fields;
|
20 |
}
|
21 |
+
|
22 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
23 |
+
$attachment = new $class_name( $post->ID );
|
24 |
|
25 |
$form_fields['imagify'] = array(
|
26 |
'label' => 'Imagify',
|
33 |
return $form_fields;
|
34 |
}
|
35 |
|
36 |
+
add_filter( 'media_row_actions', '_imagify_add_actions_to_media_list_row', PHP_INT_MAX, 2 );
|
37 |
/**
|
38 |
* Add "Compare Original VS Optimized" link to the media row action
|
39 |
*
|
40 |
* @since 1.4.3
|
41 |
* @author Geoffrey Crofte
|
42 |
+
* @param array $actions An array of action links for each attachment.
|
43 |
+
* Default 'Edit', 'Delete Permanently', 'View'.
|
44 |
+
* @param object $post WP_Post object for the current attachment.
|
45 |
+
* @return array
|
46 |
*/
|
|
|
47 |
function _imagify_add_actions_to_media_list_row( $actions, $post ) {
|
48 |
+
// If this attachment is not an image, do nothing.
|
49 |
if ( ! wp_attachment_is_image( $post->ID ) ) {
|
50 |
return $actions;
|
51 |
}
|
52 |
|
53 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
54 |
+
$attachment = new $class_name( $post->ID );
|
55 |
|
56 |
+
// If Imagify license not valid, or image is not optimized, do nothing.
|
57 |
if ( ! imagify_valid_key() || ! $attachment->is_optimized() ) {
|
58 |
return $actions;
|
59 |
}
|
60 |
|
61 |
+
// If was not activated for that image, do nothing.
|
62 |
+
if ( ! $attachment->get_backup_url() ) {
|
63 |
return $actions;
|
64 |
}
|
65 |
|
66 |
$image = wp_get_attachment_image_src( $post->ID, 'full' );
|
67 |
|
68 |
+
// If full image is too small.
|
69 |
+
if ( ! $image || (int) $image[1] < 360 ) {
|
70 |
return $actions;
|
71 |
}
|
72 |
|
73 |
+
// Else, add action link for comparison (JS triggered).
|
74 |
+
$actions['imagify-compare'] = sprintf(
|
75 |
+
'<a href="%1$s#imagify-compare" data-id="%2$d" data-backup-src="%3$s" data-full-src="%4$s" data-full-width="%5$d" data-full-height="%6$d" data-target="#imagify-comparison-%2$d" class="imagify-compare-images imagify-modal-trigger">%7$s</a>',
|
76 |
+
esc_url( get_edit_post_link( $post->ID ) ),
|
77 |
+
$post->ID,
|
78 |
+
esc_url( $attachment->get_backup_url() ),
|
79 |
+
esc_url( $image[0] ),
|
80 |
+
$image[1],
|
81 |
+
$image[2],
|
82 |
+
esc_html__( 'Compare Original VS Optimized', 'imagify' )
|
83 |
+
);
|
84 |
|
85 |
return $actions;
|
86 |
+
}
|
inc/admin/menu.php
CHANGED
@@ -1,25 +1,24 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Add submenu in menu "Settings"
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*/
|
9 |
-
add_action( ( imagify_is_active_for_network() ? 'network_' : '' ) . 'admin_menu', '_imagify_settings_menu' );
|
10 |
function _imagify_settings_menu() {
|
11 |
$page = imagify_is_active_for_network() ? 'settings.php' : 'options-general.php';
|
12 |
-
$cap = imagify_is_active_for_network() ? 'manage_network_options' : 'manage_options';
|
13 |
|
14 |
-
add_submenu_page( $page, 'Imagify', 'Imagify',
|
15 |
}
|
16 |
|
|
|
17 |
/**
|
18 |
-
* Add submenu in menu "Media"
|
19 |
*
|
20 |
* @since 1.0
|
21 |
*/
|
22 |
-
add_action( 'admin_menu', '_imagify_bulk_optimization_menu' );
|
23 |
function _imagify_bulk_optimization_menu() {
|
24 |
-
add_media_page( __( 'Bulk Optimization', 'imagify' ), __( 'Bulk Optimization', 'imagify' ),
|
25 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( ( imagify_is_active_for_network() ? 'network_' : '' ) . 'admin_menu', '_imagify_settings_menu' );
|
5 |
/**
|
6 |
+
* Add submenu in menu "Settings".
|
7 |
*
|
8 |
* @since 1.0
|
9 |
*/
|
|
|
10 |
function _imagify_settings_menu() {
|
11 |
$page = imagify_is_active_for_network() ? 'settings.php' : 'options-general.php';
|
|
|
12 |
|
13 |
+
add_submenu_page( $page, 'Imagify', 'Imagify', imagify_get_capacity(), IMAGIFY_SLUG, '_imagify_display_options_page' );
|
14 |
}
|
15 |
|
16 |
+
add_action( 'admin_menu', '_imagify_bulk_optimization_menu' );
|
17 |
/**
|
18 |
+
* Add submenu in menu "Media".
|
19 |
*
|
20 |
* @since 1.0
|
21 |
*/
|
|
|
22 |
function _imagify_bulk_optimization_menu() {
|
23 |
+
add_media_page( __( 'Bulk Optimization', 'imagify' ), __( 'Bulk Optimization', 'imagify' ), imagify_get_capacity( true ), IMAGIFY_SLUG . '-bulk-optimization', '_imagify_display_bulk_page' );
|
24 |
+
}
|
inc/admin/meta-boxes.php
CHANGED
@@ -1,42 +1,53 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Add a "Optimize It" button or the Imagify optimization data in the attachment submit area
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*/
|
9 |
-
add_action( 'attachment_submitbox_misc_actions', '_imagify_attachment_submitbox_misc_actions', PHP_INT_MAX );
|
10 |
function _imagify_attachment_submitbox_misc_actions() {
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
echo
|
25 |
-
echo
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
echo '</div>';
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
|
|
|
|
41 |
}
|
42 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'attachment_submitbox_misc_actions', '_imagify_attachment_submitbox_misc_actions', PHP_INT_MAX );
|
5 |
/**
|
6 |
+
* Add a "Optimize It" button or the Imagify optimization data in the attachment submit area.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
*/
|
|
|
10 |
function _imagify_attachment_submitbox_misc_actions() {
|
11 |
+
global $post;
|
12 |
+
|
13 |
+
if ( ! current_user_can( imagify_get_capacity( true ) ) ) {
|
14 |
+
return;
|
15 |
+
}
|
16 |
+
|
17 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
18 |
+
$attachment = new $class_name( $post->ID );
|
19 |
+
|
20 |
+
if ( ! imagify_valid_key() && ! $attachment->is_optimized() ) {
|
21 |
+
|
22 |
+
echo '<div class="misc-pub-section misc-pub-imagify"><h4>' . __( 'Imagify', 'imagify' ) . '</h4></div>';
|
23 |
+
echo '<div class="misc-pub-section misc-pub-imagify">';
|
24 |
+
echo __( 'Invalid API key', 'imagify' );
|
25 |
+
echo '<br/>';
|
26 |
+
echo '<a href="' . esc_url( get_imagify_admin_url( 'options-general' ) ) . '">' . __( 'Check your Settings', 'imagify' ) . '</a>';
|
27 |
+
echo '</div>';
|
28 |
+
|
29 |
+
} elseif ( $attachment->is_optimized() || $attachment->has_error() ) {
|
30 |
+
|
31 |
+
echo '<div class="misc-pub-section misc-pub-imagify"><h4>' . __( 'Imagify', 'imagify' ) . '</h4></div>';
|
32 |
+
echo get_imagify_attachment_optimization_text( $attachment );
|
33 |
+
|
34 |
+
} elseif ( false !== get_transient( 'imagify-async-in-progress-' . $post->ID ) ) {
|
35 |
+
|
36 |
+
echo '<div class="misc-pub-section misc-pub-imagify">';
|
37 |
+
echo '<div class="button">';
|
38 |
+
echo '<span class="imagify-spinner"></span>';
|
39 |
+
_e( 'Optimizing...', 'imagify' );
|
40 |
echo '</div>';
|
41 |
+
echo '</div>';
|
42 |
+
|
43 |
+
} else {
|
44 |
+
|
45 |
+
$url = get_imagify_admin_url( 'manual-upload', array( 'attachment_id' => $post->ID ) );
|
46 |
+
printf( '<div class="misc-pub-section misc-pub-imagify"><a class="button-primary" href="%s">%s</a></div>', esc_url( $url ), __( 'Optimize', 'imagify' ) );
|
47 |
+
}
|
48 |
+
|
49 |
+
if ( $attachment->is_optimized() ) {
|
50 |
+
echo '<input id="imagify-full-original" type="hidden" value="' . esc_url( $attachment->get_backup_url() ) . '">';
|
51 |
+
echo '<input id="imagify-full-original-size" type="hidden" value="' . esc_attr( $attachment->get_original_size() ) . '">';
|
52 |
}
|
53 |
+
}
|
inc/admin/options.php
CHANGED
@@ -1,93 +1,113 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
* Fix the capability for our capacity filter hook
|
6 |
-
*
|
7 |
* @author Jonathan
|
8 |
* @since 1.0
|
9 |
*/
|
10 |
-
|
11 |
-
|
12 |
-
$cap = ( imagify_is_active_for_network() ) ? 'manage_network_options' : 'manage_options';
|
13 |
-
return apply_filters( 'imagify_capacity', $cap );
|
14 |
}
|
15 |
|
|
|
16 |
/**
|
17 |
* Tell to WordPress to be confident with our setting, we are clean!
|
18 |
-
*
|
19 |
* @author Jonathan
|
20 |
* @since 1.0
|
21 |
*/
|
22 |
-
add_action( 'admin_init', '_imagify_register_setting' );
|
23 |
function _imagify_register_setting() {
|
24 |
register_setting( 'imagify', 'imagify_settings' );
|
25 |
}
|
26 |
|
|
|
27 |
/**
|
28 |
* Filter specific options before its value is (maybe) serialized and updated.
|
29 |
*
|
30 |
* @author Jonathan
|
31 |
* @since 1.0
|
|
|
|
|
|
|
|
|
32 |
*/
|
33 |
-
add_filter( 'pre_update_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_pre_update_option', 10, 2 );
|
34 |
function _imagify_pre_update_option( $value, $old_value ) {
|
35 |
-
|
36 |
-
|
|
|
|
|
37 |
$value['disallowed-sizes'] = array();
|
38 |
-
|
|
|
39 |
if ( strpos( $size_key , '-hidden' ) ) {
|
40 |
$key = str_replace( '-hidden', '', $size_key );
|
|
|
41 |
if ( ! isset( $value['sizes'][ $key ] ) ) {
|
42 |
$value['disallowed-sizes'][ $key ] = '1';
|
43 |
}
|
44 |
}
|
45 |
}
|
46 |
}
|
47 |
-
|
48 |
-
|
49 |
-
|
|
|
|
|
50 |
$value['resize_larger_w'] = '';
|
51 |
$value['resize_larger'] = 0;
|
52 |
}
|
53 |
-
|
54 |
-
// The max width for the "Resize larger images" option can't be less than the largest thumbnail width
|
55 |
$max_sizes = get_imagify_max_intermediate_image_size();
|
56 |
-
|
|
|
57 |
$value['resize_larger_w'] = $max_sizes['width'];
|
58 |
}
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
|
68 |
-
unset( $value['sizes'] );
|
69 |
return $value;
|
70 |
}
|
71 |
|
|
|
72 |
/**
|
73 |
-
* Used to launch some actions after saving the options
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
74 |
*
|
75 |
* @author Jonathan
|
76 |
* @since 1.0
|
77 |
-
* @since 1.5 Used to redirect user to Bulk Optimizer (if requested)
|
|
|
|
|
|
|
78 |
*/
|
79 |
-
|
80 |
-
add_action( 'update_site_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_after_save_options', 10, 2 );
|
81 |
-
function _imagify_after_save_options( $oldvalue, $value ) {
|
82 |
|
83 |
-
if (
|
84 |
-
|
85 |
-
}
|
86 |
-
|
87 |
-
if ( ! isset( $oldvalue['api_key'] ) || $oldvalue['api_key'] != $value['api_key'] ) {
|
88 |
-
$api = new Imagify();
|
89 |
-
|
90 |
-
if ( is_wp_error( $api->getUser() ) ) {
|
91 |
imagify_renew_notice( 'wrong-api-key' );
|
92 |
delete_site_transient( 'imagify_check_licence_1' );
|
93 |
} else {
|
@@ -96,72 +116,71 @@ function _imagify_after_save_options( $oldvalue, $value ) {
|
|
96 |
}
|
97 |
|
98 |
/**
|
|
|
|
|
99 |
* @author Geoffrey
|
100 |
* @since 1.5
|
101 |
*/
|
102 |
-
if ( isset( $_POST['submit-goto-bulk'] ) ) {
|
103 |
wp_safe_redirect( get_admin_url( get_current_blog_id(), 'upload.php?page=imagify-bulk-optimization' ) );
|
104 |
-
exit;
|
105 |
}
|
106 |
}
|
107 |
|
108 |
-
|
109 |
if ( imagify_is_active_for_network() ) :
|
110 |
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
function _imagify_update_site_option_on_network() {
|
118 |
-
|
119 |
-
|
120 |
-
if ( ! isset( $_POST['option_page'] ) || $_POST['option_page'] !== $option_group ) {
|
121 |
-
return;
|
122 |
-
}
|
123 |
|
124 |
-
|
|
|
|
|
125 |
|
126 |
-
|
127 |
-
wp_die( __( 'Cheatin’ uh?' ), 403 );
|
128 |
-
}
|
129 |
|
130 |
-
|
|
|
|
|
131 |
|
132 |
-
|
133 |
|
134 |
-
|
135 |
-
wp_die( __( '<strong>ERROR</strong>: options page not found.' ) );
|
136 |
-
}
|
137 |
|
138 |
-
|
|
|
|
|
139 |
|
140 |
-
|
141 |
|
142 |
-
|
143 |
-
|
144 |
-
|
|
|
145 |
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
|
|
|
|
150 |
}
|
151 |
-
$value = wp_unslash( $value );
|
152 |
-
}
|
153 |
|
154 |
-
|
|
|
155 |
}
|
156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
}
|
158 |
-
|
159 |
-
/**
|
160 |
-
* Redirect back to the settings page that was submitted
|
161 |
-
*/
|
162 |
-
$goback = add_query_arg( 'settings-updated', 'true', wp_get_referer() );
|
163 |
-
wp_redirect( $goback );
|
164 |
-
exit;
|
165 |
-
}
|
166 |
|
167 |
-
endif;
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_filter( 'option_page_capability_imagify', '_imagify_correct_capability_for_options_page' );
|
5 |
/**
|
6 |
* Fix the capability for our capacity filter hook
|
7 |
+
*
|
8 |
* @author Jonathan
|
9 |
* @since 1.0
|
10 |
*/
|
11 |
+
function _imagify_correct_capability_for_options_page() {
|
12 |
+
return imagify_get_capacity();
|
|
|
|
|
13 |
}
|
14 |
|
15 |
+
add_action( 'admin_init', '_imagify_register_setting' );
|
16 |
/**
|
17 |
* Tell to WordPress to be confident with our setting, we are clean!
|
18 |
+
*
|
19 |
* @author Jonathan
|
20 |
* @since 1.0
|
21 |
*/
|
|
|
22 |
function _imagify_register_setting() {
|
23 |
register_setting( 'imagify', 'imagify_settings' );
|
24 |
}
|
25 |
|
26 |
+
add_filter( 'pre_update_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_pre_update_option', 10, 2 );
|
27 |
/**
|
28 |
* Filter specific options before its value is (maybe) serialized and updated.
|
29 |
*
|
30 |
* @author Jonathan
|
31 |
* @since 1.0
|
32 |
+
*
|
33 |
+
* @param mixed $value The new option value.
|
34 |
+
* @param mixed $old_value The old option value.
|
35 |
+
* @return array The new option value.
|
36 |
*/
|
|
|
37 |
function _imagify_pre_update_option( $value, $old_value ) {
|
38 |
+
$value = is_array( $value ) ? $value : array();
|
39 |
+
|
40 |
+
// Store all sizes even if one of them isn't checked.
|
41 |
+
if ( ! empty( $value['sizes'] ) && is_array( $value['sizes'] ) ) {
|
42 |
$value['disallowed-sizes'] = array();
|
43 |
+
|
44 |
+
foreach ( $value['sizes'] as $size_key => $size_value ) {
|
45 |
if ( strpos( $size_key , '-hidden' ) ) {
|
46 |
$key = str_replace( '-hidden', '', $size_key );
|
47 |
+
|
48 |
if ( ! isset( $value['sizes'][ $key ] ) ) {
|
49 |
$value['disallowed-sizes'][ $key ] = '1';
|
50 |
}
|
51 |
}
|
52 |
}
|
53 |
}
|
54 |
+
|
55 |
+
unset( $value['sizes'] );
|
56 |
+
|
57 |
+
// The max width for the "Resize larger images" option can't be 0.
|
58 |
+
if ( empty( $value['resize_larger_w'] ) ) {
|
59 |
$value['resize_larger_w'] = '';
|
60 |
$value['resize_larger'] = 0;
|
61 |
}
|
62 |
+
|
63 |
+
// The max width for the "Resize larger images" option can't be less than the largest thumbnail width.
|
64 |
$max_sizes = get_imagify_max_intermediate_image_size();
|
65 |
+
|
66 |
+
if ( ! empty( $value['resize_larger_w'] ) && $value['resize_larger_w'] < $max_sizes['width'] ) {
|
67 |
$value['resize_larger_w'] = $max_sizes['width'];
|
68 |
}
|
69 |
|
70 |
+
if ( ! isset( $value['total_size_images_library'] ) && isset( $old_value['total_size_images_library'] ) ) {
|
71 |
+
$value['total_size_images_library'] = $old_value['total_size_images_library'];
|
72 |
+
}
|
73 |
|
74 |
+
if ( ! isset( $value['average_size_images_per_month'] ) && isset( $old_value['average_size_images_per_month'] ) ) {
|
75 |
+
$value['average_size_images_per_month'] = $old_value['average_size_images_per_month'];
|
76 |
+
}
|
77 |
|
|
|
78 |
return $value;
|
79 |
}
|
80 |
|
81 |
+
add_action( 'update_site_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_after_save_network_options', 10, 3 );
|
82 |
/**
|
83 |
+
* Used to launch some actions after saving the network options.
|
84 |
+
*
|
85 |
+
* @author Grégory Viguier
|
86 |
+
* @since 1.6.5
|
87 |
+
*
|
88 |
+
* @param string $option Name of the network option.
|
89 |
+
* @param mixed $value Current value of the network option.
|
90 |
+
* @param mixed $old_value Old value of the network option.
|
91 |
+
*/
|
92 |
+
function _imagify_after_save_network_options( $option, $value, $old_value ) {
|
93 |
+
_imagify_after_save_options( $old_value, $value );
|
94 |
+
}
|
95 |
+
|
96 |
+
add_action( 'update_option_' . IMAGIFY_SETTINGS_SLUG, '_imagify_after_save_options', 10, 2 );
|
97 |
+
/**
|
98 |
+
* Used to launch some actions after saving the options.
|
99 |
*
|
100 |
* @author Jonathan
|
101 |
* @since 1.0
|
102 |
+
* @since 1.5 Used to redirect user to Bulk Optimizer (if requested).
|
103 |
+
*
|
104 |
+
* @param mixed $old_value The old option value.
|
105 |
+
* @param mixed $value The new option value.
|
106 |
*/
|
107 |
+
function _imagify_after_save_options( $old_value, $value ) {
|
|
|
|
|
108 |
|
109 |
+
if ( $old_value && $value && ( ! isset( $old_value['api_key'] ) || $old_value['api_key'] !== $value['api_key'] ) ) {
|
110 |
+
if ( is_wp_error( imagify()->get_user() ) ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
imagify_renew_notice( 'wrong-api-key' );
|
112 |
delete_site_transient( 'imagify_check_licence_1' );
|
113 |
} else {
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
+
* Redirect the user to the bulk optimization.
|
120 |
+
*
|
121 |
* @author Geoffrey
|
122 |
* @since 1.5
|
123 |
*/
|
124 |
+
if ( isset( $_POST['submit-goto-bulk'] ) ) { // WPCS: CSRF ok.
|
125 |
wp_safe_redirect( get_admin_url( get_current_blog_id(), 'upload.php?page=imagify-bulk-optimization' ) );
|
126 |
+
exit;
|
127 |
}
|
128 |
}
|
129 |
|
|
|
130 |
if ( imagify_is_active_for_network() ) :
|
131 |
|
132 |
+
add_action( 'admin_post_update', '_imagify_update_site_option_on_network' );
|
133 |
+
/**
|
134 |
+
* `options.php` do not handle site options. Let's use `admin-post.php` for multisite installations.
|
135 |
+
*
|
136 |
+
* @since 1.0
|
137 |
+
*/
|
138 |
+
function _imagify_update_site_option_on_network() {
|
139 |
+
$option_group = IMAGIFY_SLUG;
|
|
|
|
|
|
|
|
|
140 |
|
141 |
+
if ( ! isset( $_POST['option_page'] ) || $_POST['option_page'] !== $option_group ) { // WPCS: CSRF ok.
|
142 |
+
return;
|
143 |
+
}
|
144 |
|
145 |
+
$capability = apply_filters( "option_page_capability_{$option_group}", 'manage_network_options' );
|
|
|
|
|
146 |
|
147 |
+
if ( ! current_user_can( $capability ) ) {
|
148 |
+
wp_die( __( 'Cheatin’ uh?' ), 403 );
|
149 |
+
}
|
150 |
|
151 |
+
check_admin_referer( $option_group . '-options' );
|
152 |
|
153 |
+
$whitelist_options = apply_filters( 'whitelist_options', array() );
|
|
|
|
|
154 |
|
155 |
+
if ( ! isset( $whitelist_options[ $option_group ] ) ) {
|
156 |
+
wp_die( __( '<strong>ERROR</strong>: options page not found.' ) );
|
157 |
+
}
|
158 |
|
159 |
+
$options = $whitelist_options[ $option_group ];
|
160 |
|
161 |
+
if ( $options ) {
|
162 |
+
foreach ( $options as $option ) {
|
163 |
+
$option = trim( $option );
|
164 |
+
$value = null;
|
165 |
|
166 |
+
if ( isset( $_POST[ $option ] ) ) {
|
167 |
+
$value = $_POST[ $option ];
|
168 |
+
if ( ! is_array( $value ) ) {
|
169 |
+
$value = trim( $value );
|
170 |
+
}
|
171 |
+
$value = wp_unslash( $value );
|
172 |
}
|
|
|
|
|
173 |
|
174 |
+
update_site_option( $option, $value );
|
175 |
+
}
|
176 |
}
|
177 |
|
178 |
+
/**
|
179 |
+
* Redirect back to the settings page that was submitted.
|
180 |
+
*/
|
181 |
+
$goback = add_query_arg( 'settings-updated', 'true', wp_get_referer() );
|
182 |
+
wp_safe_redirect( $goback );
|
183 |
+
exit;
|
184 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
185 |
|
186 |
+
endif;
|
inc/admin/plugins.php
CHANGED
@@ -1,17 +1,18 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
|
|
4 |
/**
|
5 |
-
* Add link to the plugin configuration pages
|
6 |
*
|
7 |
* @since 1.0
|
|
|
|
|
|
|
8 |
*/
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
array_unshift( $actions, sprintf( '<a href="%s">%s</a>', get_imagify_admin_url(), __( 'Settings' ) ) );
|
15 |
-
|
16 |
-
return $actions;
|
17 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_filter( 'plugin_action_links_' . plugin_basename( IMAGIFY_FILE ), '_imagify_plugin_action_links' );
|
5 |
+
add_filter( 'network_admin_plugin_action_links_' . plugin_basename( IMAGIFY_FILE ), '_imagify_plugin_action_links' );
|
6 |
/**
|
7 |
+
* Add link to the plugin configuration pages.
|
8 |
*
|
9 |
* @since 1.0
|
10 |
+
*
|
11 |
+
* @param array $actions An array of action links.
|
12 |
+
* @return array
|
13 |
*/
|
14 |
+
function _imagify_plugin_action_links( $actions ) {
|
15 |
+
array_unshift( $actions, sprintf( '<a href="%s">%s</a>', esc_url( get_imagify_admin_url( 'bulk-optimization' ) ), __( 'Bulk Optimization', 'imagify' ) ) );
|
16 |
+
array_unshift( $actions, sprintf( '<a href="%s">%s</a>', esc_url( get_imagify_admin_url() ), __( 'Settings' ) ) );
|
17 |
+
return $actions;
|
18 |
+
}
|
|
|
|
|
|
|
|
inc/admin/ui/bulk.php
CHANGED
@@ -1,80 +1,94 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
* The main settings page construtor using the required functions from WP
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*/
|
9 |
-
function _imagify_display_bulk_page() {
|
10 |
$user = new Imagify_User();
|
11 |
?>
|
12 |
<div class="wrap imagify-settings imagify-bulk">
|
13 |
<div class="imagify-title">
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
<
|
19 |
-
|
20 |
-
|
21 |
-
<a href="<?php echo IMAGIFY_APP_MAIN; ?>/#/subscription" class="button button-ghost" target="_blank">
|
22 |
-
<span class="dashicons dashicons-admin-users"></span>
|
23 |
-
<span class="button-text"><?php _e( 'View My Subscription', 'imagify' ); ?></span>
|
24 |
-
</a>
|
25 |
-
</div>
|
26 |
-
|
27 |
-
<?php if ( 1 === $user->plan_id ) { ?>
|
28 |
-
<div class="imagify-sep-v"></div>
|
29 |
-
<div class="imagify-credit-left">
|
30 |
-
<?php
|
31 |
-
$unconsumed_quota = $user->get_percent_unconsumed_quota();
|
32 |
-
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'sun.svg" width="37" height="38" alt="" />';
|
33 |
-
$bar_class = 'positive';
|
34 |
-
$is_display_bubble = false;
|
35 |
-
|
36 |
-
if( $unconsumed_quota >= 21 && $unconsumed_quota <= 50 ) {
|
37 |
-
$bar_class = 'neutral';
|
38 |
-
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'cloudy-sun.svg" width="37" height="38" alt="" />';
|
39 |
-
} elseif( $unconsumed_quota <= 20 ) {
|
40 |
-
$bar_class = 'negative';
|
41 |
-
$is_display_bubble = true;
|
42 |
-
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'stormy.svg" width="38" height="36" alt="" />';
|
43 |
-
}
|
44 |
-
?>
|
45 |
-
<span class="imagify-meteo-icon"><?php echo $meteo_icon; ?></span>
|
46 |
-
<div class="imagify-space-left">
|
47 |
-
|
48 |
-
<p><?php printf( __( 'You have %s space credit left' , 'imagify' ), '<span class="imagify-unconsumed-percent">' . $unconsumed_quota . '%</span>' ); ?></p>
|
49 |
-
|
50 |
-
<div class="imagify-bar-<?php echo $bar_class; ?>">
|
51 |
-
<div class="imagify-unconsumed-bar imagify-progress" style="width: <?php echo $unconsumed_quota . '%'; ?>;"></div>
|
52 |
-
</div>
|
53 |
</div>
|
54 |
-
<div class="imagify-
|
55 |
-
<
|
56 |
-
<
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
</div>
|
62 |
-
<div class="
|
63 |
-
|
64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
</div>
|
66 |
</div>
|
67 |
-
|
|
|
|
|
68 |
</div>
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
<img width="225" height="26" alt="Imagify" src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>imagify-logo.png" class="imagify-logo" />
|
74 |
</div>
|
75 |
|
76 |
<?php echo get_imagify_new_to_imagify(); ?>
|
77 |
-
|
78 |
<div class="imagify-sub-title">
|
79 |
<svg class="icon icon-bulk" viewBox="0 0 38 36" width="38" height="36" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m233.09 177.21l-5.52 10.248c-.08.145-.018.272-.023.388-.074.193-.033.4-.033.619v21.615c0 .952.601 1.429 1.552 1.429h33.897c.952 0 1.962-.478 1.962-1.429v-21.615c0-.487-.323-.925-.649-1.24l-5.623-9.976c-.405-.726-1.202-1.179-2.034-1.182l-21.486-.068c-.849 0-1.64.464-2.043 1.211m30.424 32.869c0 .173-.378.018-.551.018h-33.897c-.172 0-.14.155-.14-.018v-21.576l33.961-.281c.066.008.186.09.263.128.054.027.205.049.258.073.002.014.106.027.106.041v21.615m-6.153-32.11l4.91 8.835h-14.992v-9.354l9.306.045c.322.001.619.192.776.474m-11.494-.523v9.358h-16.306l4.773-8.892c.155-.289.456-.484.787-.484l10.746.018m7.06 17.12c0 .39-.316.706-.706.706h-12.706c-.39 0-.706-.316-.706-.706 0-.39.316-.706.706-.706h12.706c.39 0 .706.316.706.706" transform="translate(-227-176)" fill="#7a8996"/></g></svg>
|
80 |
<span class="title-text">
|
@@ -89,30 +103,46 @@ function _imagify_display_bulk_page() {
|
|
89 |
|
90 |
<div class="col-1-3 col-overview">
|
91 |
<h3><?php _e( 'Overview', 'imagify' ); ?></h3>
|
92 |
-
|
93 |
<div class="imagify-chart-container">
|
94 |
<canvas id="imagify-overview-chart" width="180" height="180"></canvas>
|
95 |
<div id="imagify-overview-chart-percent" class="imagify-chart-percent"><?php echo imagify_percent_optimized_attachments(); ?><span>%</span></div>
|
96 |
</div>
|
97 |
<div id="imagify-overview-chart-legend"></div>
|
98 |
|
99 |
-
<p class="imagify-global-optim-phrase imagify-clear"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
</div>
|
101 |
|
102 |
<div class="col-1-3 col-statistics">
|
103 |
<h3><?php _e( 'Statistics', 'imagify' ); ?></h3>
|
104 |
-
|
105 |
<?php
|
106 |
-
$total_saving_data
|
107 |
-
$optimized_percent
|
108 |
-
$optimized_nb
|
109 |
-
$original_nb
|
110 |
?>
|
111 |
-
|
112 |
<div class="imagify-number-you-optimized">
|
113 |
<p>
|
114 |
<span id="imagify-total-optimized-attachments" class="number"><?php echo number_format_i18n( $total_saving_data['count'] ); ?></span>
|
115 |
-
<span class="text"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
</p>
|
117 |
</div>
|
118 |
|
@@ -124,7 +154,7 @@ function _imagify_display_bulk_page() {
|
|
124 |
|
125 |
<p><?php _e( 'Optimized size', 'imagify' ); ?></p>
|
126 |
<div class="imagify-bar-positive base-transparent right-outside-number">
|
127 |
-
|
128 |
<div id="imagify-optimized-bar" class="imagify-progress" style="width: <?php echo $optimized_percent; ?>%"><span class="imagify-barnb"><?php echo size_format( $optimized_nb, 1 ); ?></span></div>
|
129 |
</div>
|
130 |
|
@@ -133,7 +163,15 @@ function _imagify_display_bulk_page() {
|
|
133 |
<div class="imagify-number-you-optimized">
|
134 |
<p>
|
135 |
<span id="imagify-total-optimized-attachments-pct" class="number"><?php echo number_format_i18n( $optimized_percent ); ?>%</span>
|
136 |
-
<span class="text"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
</p>
|
138 |
</div>
|
139 |
</div>
|
@@ -142,15 +180,24 @@ function _imagify_display_bulk_page() {
|
|
142 |
<h3><?php _e( 'Information', 'imagify' ); ?></h3>
|
143 |
<ul class="imagify-list-infos">
|
144 |
<li>
|
145 |
-
|
146 |
-
|
147 |
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
</li>
|
153 |
-
<li><?php esc_html_e( 'You must keep this page open while the bulk
|
154 |
</ul>
|
155 |
</div><!-- .col-1-2 -->
|
156 |
</div><!-- .imagify-columns -->
|
@@ -159,50 +206,59 @@ function _imagify_display_bulk_page() {
|
|
159 |
<div class="imagify-section imagify-section-gray">
|
160 |
<div class="imagify-bulk-submit imagify-columns imagify-count">
|
161 |
<div class="col-1-2">
|
162 |
-
<?php if ( get_imagify_option( 'backup', 0 ) == "1" ) { ?>
|
163 |
|
164 |
-
|
165 |
-
|
|
|
|
|
166 |
$default_set = esc_html__( 'Ultra', 'imagify' );
|
167 |
-
|
168 |
-
|
|
|
169 |
$default_set = esc_html__( 'Aggressive', 'imagify' );
|
170 |
break;
|
171 |
-
case
|
172 |
$default_set = esc_html__( 'Normal', 'imagify' );
|
173 |
-
break;
|
174 |
}
|
175 |
|
|
|
176 |
echo '<em class="imagify-default-settings">(' . sprintf( esc_html__( 'Your default setting: %s', 'imagify' ), ' <strong class="imagify-primary">' . $default_set . '</strong>' ) . ')</em>';
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
195 |
|
196 |
-
<?php
|
197 |
-
}
|
198 |
-
else {
|
199 |
-
?>
|
200 |
-
<p>
|
201 |
-
<strong><?php printf( __( 'Don\'t forget to check %syour settings%s before bulk optimization.', 'imagify' ), '<a href="' . get_imagify_admin_url() . '">', '</a>' ); ?></strong>
|
202 |
-
</p>
|
203 |
-
<?php
|
204 |
-
}
|
205 |
-
?>
|
206 |
</div>
|
207 |
<div class="col-1-2">
|
208 |
<p class="imagify-count-title"><?php esc_html_e( 'Let\'s go!', 'imagify' ); ?></p>
|
@@ -212,18 +268,26 @@ function _imagify_display_bulk_page() {
|
|
212 |
<?php wp_nonce_field( 'imagify-bulk-upload', 'imagifybulkuploadnonce' ); ?>
|
213 |
<button id="imagify-bulk-action" type="button" class="button button-primary">
|
214 |
<span class="dashicons dashicons-admin-generic"></span>
|
215 |
-
<span class="button-text"><?php _e( 'Imagif\'em all', 'imagify'); ?></span>
|
216 |
</button>
|
217 |
</p>
|
218 |
</div>
|
219 |
<div class="imagify-cell imagify-pl0">
|
220 |
-
<p class="imagify-info-block"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
221 |
</div>
|
222 |
</div>
|
223 |
</div>
|
224 |
</div><!-- .imagify-bulk-submit -->
|
225 |
</div>
|
226 |
-
|
227 |
<!-- The Success/Complete bar -->
|
228 |
<div class="imagify-row-complete hidden" aria-hidden="true">
|
229 |
<div class="imagify-all-complete">
|
@@ -237,7 +301,16 @@ function _imagify_display_bulk_page() {
|
|
237 |
</div>
|
238 |
<div class="imagify-ac-report-text">
|
239 |
<p class="imagify-ac-rt-big"><?php _e( 'Well done!', 'imagify' ); ?></p>
|
240 |
-
<p
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
241 |
</div>
|
242 |
</div>
|
243 |
<div class="imagify-ac-share">
|
@@ -248,7 +321,7 @@ function _imagify_display_bulk_page() {
|
|
248 |
<a target="_blank" class="imagify-sn-twitter" href=""><svg viewBox="0 0 23 18" width="23" height="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><title>Twitter</title><path d="m244.15 12.13c-.815.361-1.691.606-2.61.716.939-.563 1.659-1.453 1.998-2.514-.878.521-1.851.898-2.886 1.103-.829-.883-2.01-1.435-3.317-1.435-2.51 0-4.544 2.034-4.544 4.544 0 .356.04.703.118 1.035-3.777-.19-7.125-1.999-9.367-4.748-.391.671-.615 1.452-.615 2.285 0 1.576.802 2.967 2.02 3.782-.745-.024-1.445-.228-2.058-.568-.001.019-.001.038-.001.057 0 2.202 1.566 4.04 3.646 4.456-.381.104-.783.159-1.197.159-.293 0-.577-.028-.855-.081.578 1.805 2.256 3.119 4.245 3.156-1.555 1.219-3.515 1.945-5.644 1.945-.367 0-.728-.021-1.084-.063 2.01 1.289 4.399 2.041 6.966 2.041 8.359 0 12.929-6.925 12.929-12.929 0-.197-.004-.393-.013-.588.888-.64 1.658-1.44 2.268-2.352" transform="translate(-222-10)" fill="#fff"/></g></svg></a>
|
249 |
</li>
|
250 |
<li>
|
251 |
-
<a target="_blank" class="imagify-sn-twitter-facebook" href="<?php echo esc_url('https://www.facebook.com/sharer/sharer.php?u=https://wordpress.org/plugins/imagify' ); ?>"><svg viewBox="0 0 18 18" width="18" height="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><title>Facebook</title><path d="m203.25 10h-16.5c-.415 0-.75.336-.75.75v16.5c0 .414.336.75.75.75h8.812v-6.75h-2.25v-2.813h2.25v-2.25c0-2.325 1.472-3.469 3.546-3.469.993 0 1.847.074 2.096.107v2.43h-1.438c-1.128 0-1.391.536-1.391 1.322v1.859h2.813l-.563 2.813h-2.25l.045 6.75h4.83c.414 0 .75-.336.75-.75v-16.5c0-.414-.336-.75-.75-.75" transform="translate(-186-10)" fill="#fff"/></g></svg></a>
|
252 |
</li>
|
253 |
</ul>
|
254 |
</div>
|
@@ -291,7 +364,7 @@ function _imagify_display_bulk_page() {
|
|
291 |
<!-- No image uploaded yet -->
|
292 |
<tr class="imagify-no-uploaded-yet">
|
293 |
<td colspan="7">
|
294 |
-
<p
|
295 |
</td>
|
296 |
</tr>
|
297 |
</tbody>
|
@@ -299,7 +372,7 @@ function _imagify_display_bulk_page() {
|
|
299 |
</div>
|
300 |
|
301 |
<?php imagify_payment_modal(); ?>
|
302 |
-
|
303 |
</div>
|
304 |
<?php
|
305 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* The main settings page construtor using the required functions from WP.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*/
|
9 |
+
function _imagify_display_bulk_page() {
|
10 |
$user = new Imagify_User();
|
11 |
?>
|
12 |
<div class="wrap imagify-settings imagify-bulk">
|
13 |
<div class="imagify-title">
|
14 |
+
|
15 |
+
<?php if ( ! defined( 'IMAGIFY_HIDDEN_ACCOUNT' ) || false === IMAGIFY_HIDDEN_ACCOUNT ) { ?>
|
16 |
+
|
17 |
+
<div class="imagify-title-right">
|
18 |
+
<div class="imagify-account">
|
19 |
+
<p class="imagify-meteo-title"><?php _e( 'Account status', 'imagify' ); ?></p>
|
20 |
+
<p class="imagify-meteo-subs"><?php _e( 'Your subscription:', 'imagify' ); ?> <strong class="imagify-user-plan"><?php echo $user->plan_label; ?></strong></p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
</div>
|
22 |
+
<div class="imagify-account-link">
|
23 |
+
<a href="<?php echo IMAGIFY_APP_MAIN; ?>/#/subscription" class="button button-ghost" target="_blank">
|
24 |
+
<span class="dashicons dashicons-admin-users"></span>
|
25 |
+
<span class="button-text"><?php _e( 'View My Subscription', 'imagify' ); ?></span>
|
26 |
+
</a>
|
27 |
+
</div>
|
28 |
+
|
29 |
+
<?php if ( 1 === $user->plan_id ) { ?>
|
30 |
+
|
31 |
+
<div class="imagify-sep-v"></div>
|
32 |
+
<div class="imagify-credit-left">
|
33 |
+
<?php
|
34 |
+
$unconsumed_quota = $user->get_percent_unconsumed_quota();
|
35 |
+
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'sun.svg" width="37" height="38" alt="" />';
|
36 |
+
$bar_class = 'positive';
|
37 |
+
$is_display_bubble = false;
|
38 |
+
|
39 |
+
if ( $unconsumed_quota >= 21 && $unconsumed_quota <= 50 ) {
|
40 |
+
$bar_class = 'neutral';
|
41 |
+
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'cloudy-sun.svg" width="37" height="38" alt="" />';
|
42 |
+
} elseif ( $unconsumed_quota <= 20 ) {
|
43 |
+
$bar_class = 'negative';
|
44 |
+
$is_display_bubble = true;
|
45 |
+
$meteo_icon = '<img src="' . IMAGIFY_ASSETS_IMG_URL . 'stormy.svg" width="38" height="36" alt="" />';
|
46 |
+
}
|
47 |
+
?>
|
48 |
+
<span class="imagify-meteo-icon"><?php echo $meteo_icon; ?></span>
|
49 |
+
<div class="imagify-space-left">
|
50 |
+
|
51 |
+
<p>
|
52 |
+
<?php
|
53 |
+
printf(
|
54 |
+
/* translators: %s is a data quota. */
|
55 |
+
__( 'You have %s space credit left' , 'imagify' ),
|
56 |
+
'<span class="imagify-unconsumed-percent">' . $unconsumed_quota . '%</span>'
|
57 |
+
);
|
58 |
+
?>
|
59 |
+
</p>
|
60 |
+
|
61 |
+
<div class="imagify-bar-<?php echo $bar_class; ?>">
|
62 |
+
<div class="imagify-unconsumed-bar imagify-progress" style="width: <?php echo $unconsumed_quota . '%'; ?>;"></div>
|
63 |
+
</div>
|
64 |
</div>
|
65 |
+
<div class="imagify-space-tooltips imagify-tooltips <?php echo ( ! $is_display_bubble ) ? 'hidden' : ''; ?>">
|
66 |
+
<div class="tooltip-content tooltip-table">
|
67 |
+
<div class="cell-icon">
|
68 |
+
<span aria-hidden="true" class="icon icon-round">i</span>
|
69 |
+
</div>
|
70 |
+
<div class="cell-text">
|
71 |
+
<?php _e( 'Upgrade your account to continue optimizing your images', 'imagify' ); ?>
|
72 |
+
</div>
|
73 |
+
<div class="cell-sep"></div>
|
74 |
+
<div class="cell-cta">
|
75 |
+
<a href="<?php echo IMAGIFY_APP_MAIN; ?>/#/subscription" target="_blank"><?php _e( 'More info', 'imagify' ); ?></a>
|
76 |
+
</div>
|
77 |
+
</div>
|
78 |
</div>
|
79 |
</div>
|
80 |
+
|
81 |
+
<?php } // End if(). ?>
|
82 |
+
|
83 |
</div>
|
84 |
+
|
85 |
+
<?php } // End if(). ?>
|
86 |
+
|
|
|
87 |
<img width="225" height="26" alt="Imagify" src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>imagify-logo.png" class="imagify-logo" />
|
88 |
</div>
|
89 |
|
90 |
<?php echo get_imagify_new_to_imagify(); ?>
|
91 |
+
|
92 |
<div class="imagify-sub-title">
|
93 |
<svg class="icon icon-bulk" viewBox="0 0 38 36" width="38" height="36" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m233.09 177.21l-5.52 10.248c-.08.145-.018.272-.023.388-.074.193-.033.4-.033.619v21.615c0 .952.601 1.429 1.552 1.429h33.897c.952 0 1.962-.478 1.962-1.429v-21.615c0-.487-.323-.925-.649-1.24l-5.623-9.976c-.405-.726-1.202-1.179-2.034-1.182l-21.486-.068c-.849 0-1.64.464-2.043 1.211m30.424 32.869c0 .173-.378.018-.551.018h-33.897c-.172 0-.14.155-.14-.018v-21.576l33.961-.281c.066.008.186.09.263.128.054.027.205.049.258.073.002.014.106.027.106.041v21.615m-6.153-32.11l4.91 8.835h-14.992v-9.354l9.306.045c.322.001.619.192.776.474m-11.494-.523v9.358h-16.306l4.773-8.892c.155-.289.456-.484.787-.484l10.746.018m7.06 17.12c0 .39-.316.706-.706.706h-12.706c-.39 0-.706-.316-.706-.706 0-.39.316-.706.706-.706h12.706c.39 0 .706.316.706.706" transform="translate(-227-176)" fill="#7a8996"/></g></svg>
|
94 |
<span class="title-text">
|
103 |
|
104 |
<div class="col-1-3 col-overview">
|
105 |
<h3><?php _e( 'Overview', 'imagify' ); ?></h3>
|
106 |
+
|
107 |
<div class="imagify-chart-container">
|
108 |
<canvas id="imagify-overview-chart" width="180" height="180"></canvas>
|
109 |
<div id="imagify-overview-chart-percent" class="imagify-chart-percent"><?php echo imagify_percent_optimized_attachments(); ?><span>%</span></div>
|
110 |
</div>
|
111 |
<div id="imagify-overview-chart-legend"></div>
|
112 |
|
113 |
+
<p class="imagify-global-optim-phrase imagify-clear">
|
114 |
+
<?php
|
115 |
+
printf(
|
116 |
+
/* translators: %s is a percentage. */
|
117 |
+
esc_html__( 'You optimized %s of your website\'s images', 'imagify' ),
|
118 |
+
'<span class="imagify-total-percent">' . imagify_percent_optimized_attachments() . '%</span>'
|
119 |
+
);
|
120 |
+
?>
|
121 |
+
</p>
|
122 |
</div>
|
123 |
|
124 |
<div class="col-1-3 col-statistics">
|
125 |
<h3><?php _e( 'Statistics', 'imagify' ); ?></h3>
|
126 |
+
|
127 |
<?php
|
128 |
+
$total_saving_data = imagify_count_saving_data();
|
129 |
+
$optimized_percent = $total_saving_data['percent'];
|
130 |
+
$optimized_nb = $total_saving_data['optimized_size'];
|
131 |
+
$original_nb = $total_saving_data['original_size'];
|
132 |
?>
|
133 |
+
|
134 |
<div class="imagify-number-you-optimized">
|
135 |
<p>
|
136 |
<span id="imagify-total-optimized-attachments" class="number"><?php echo number_format_i18n( $total_saving_data['count'] ); ?></span>
|
137 |
+
<span class="text">
|
138 |
+
<?php
|
139 |
+
printf(
|
140 |
+
/* translators: you can use %s to include a line break. */
|
141 |
+
__( 'that\'s the number of images you optimized with Imagify', 'imagify' ),
|
142 |
+
'<br>'
|
143 |
+
);
|
144 |
+
?>
|
145 |
+
</span>
|
146 |
</p>
|
147 |
</div>
|
148 |
|
154 |
|
155 |
<p><?php _e( 'Optimized size', 'imagify' ); ?></p>
|
156 |
<div class="imagify-bar-positive base-transparent right-outside-number">
|
157 |
+
|
158 |
<div id="imagify-optimized-bar" class="imagify-progress" style="width: <?php echo $optimized_percent; ?>%"><span class="imagify-barnb"><?php echo size_format( $optimized_nb, 1 ); ?></span></div>
|
159 |
</div>
|
160 |
|
163 |
<div class="imagify-number-you-optimized">
|
164 |
<p>
|
165 |
<span id="imagify-total-optimized-attachments-pct" class="number"><?php echo number_format_i18n( $optimized_percent ); ?>%</span>
|
166 |
+
<span class="text">
|
167 |
+
<?php
|
168 |
+
printf(
|
169 |
+
/* translators: %s is a line break. */
|
170 |
+
__( 'that\'s the size you saved %sby using Imagify', 'imagify' ),
|
171 |
+
'<br>'
|
172 |
+
);
|
173 |
+
?>
|
174 |
+
</span>
|
175 |
</p>
|
176 |
</div>
|
177 |
</div>
|
180 |
<h3><?php _e( 'Information', 'imagify' ); ?></h3>
|
181 |
<ul class="imagify-list-infos">
|
182 |
<li>
|
183 |
+
<?php
|
184 |
+
esc_html_e( 'Please be aware that optimizing a large number of images can take a while depending on your server and network speed.', 'imagify' );
|
185 |
|
186 |
+
if ( get_transient( IMAGIFY_SLUG . '_large_library' ) ) {
|
187 |
+
printf(
|
188 |
+
/* translators: %s is a formatted number. Don't use %d. */
|
189 |
+
__( 'If you have more than %s images, you will need to launch the bulk optimization several times.' , 'imagify' ),
|
190 |
+
/**
|
191 |
+
* Filter the unoptimized attachments limit.
|
192 |
+
*
|
193 |
+
* @param int Default is 10000.
|
194 |
+
*/
|
195 |
+
number_format_i18n( apply_filters( 'imagify_unoptimized_attachment_limit', 10000 ) )
|
196 |
+
);
|
197 |
+
}
|
198 |
+
?>
|
199 |
</li>
|
200 |
+
<li><?php esc_html_e( 'You must keep this page open while the bulk optimization is processing. If you leave you can come back to continue where it left off.', 'imagify' ); ?></li>
|
201 |
</ul>
|
202 |
</div><!-- .col-1-2 -->
|
203 |
</div><!-- .imagify-columns -->
|
206 |
<div class="imagify-section imagify-section-gray">
|
207 |
<div class="imagify-bulk-submit imagify-columns imagify-count">
|
208 |
<div class="col-1-2">
|
|
|
209 |
|
210 |
+
<?php if ( (int) get_imagify_option( 'backup', 0 ) === 1 ) { ?>
|
211 |
+
|
212 |
+
<p class="imagify-count-title"><?php esc_html_e( 'Select Your Compression Level', 'imagify' ); ?>
|
213 |
+
<?php
|
214 |
$default_set = esc_html__( 'Ultra', 'imagify' );
|
215 |
+
|
216 |
+
switch ( (int) get_imagify_option( 'optimization_level' ) ) {
|
217 |
+
case 1:
|
218 |
$default_set = esc_html__( 'Aggressive', 'imagify' );
|
219 |
break;
|
220 |
+
case 0:
|
221 |
$default_set = esc_html__( 'Normal', 'imagify' );
|
|
|
222 |
}
|
223 |
|
224 |
+
/* translators: %s is an optimization level. */
|
225 |
echo '<em class="imagify-default-settings">(' . sprintf( esc_html__( 'Your default setting: %s', 'imagify' ), ' <strong class="imagify-primary">' . $default_set . '</strong>' ) . ')</em>';
|
226 |
+
?>
|
227 |
+
</p>
|
228 |
+
<p class="imagify-inline-options">
|
229 |
+
<input type="radio" id="imagify-optimization_level_normal" name="optimization_level" value="0" <?php checked( get_imagify_option( 'optimization_level' ), 0 ); ?>>
|
230 |
+
<label for="imagify-optimization_level_normal">
|
231 |
+
<?php esc_html_e( 'Normal', 'imagify' ); ?>
|
232 |
+
</label>
|
233 |
+
|
234 |
+
<input type="radio" id="imagify-optimization_level_aggro" name="optimization_level" value="1" <?php checked( get_imagify_option( 'optimization_level' ), 1 ); ?>>
|
235 |
+
<label for="imagify-optimization_level_aggro">
|
236 |
+
<?php esc_html_e( 'Aggressive', 'imagify' ); ?>
|
237 |
+
</label>
|
238 |
+
|
239 |
+
<input type="radio" id="imagify-optimization_level_ultra" name="optimization_level" value="2" <?php checked( get_imagify_option( 'optimization_level' ), 2 ); ?>>
|
240 |
+
<label for="imagify-optimization_level_ultra">
|
241 |
+
<?php esc_html_e( 'Ultra', 'imagify' ); ?>
|
242 |
+
</label>
|
243 |
+
</p>
|
244 |
+
|
245 |
+
<?php } else { ?>
|
246 |
+
|
247 |
+
<p>
|
248 |
+
<strong>
|
249 |
+
<?php
|
250 |
+
printf(
|
251 |
+
/* translators: 1 is the opening of a link, 2 is the closing of this link. */
|
252 |
+
__( 'Don\'t forget to check %1$syour settings%2$s before bulk optimization.', 'imagify' ),
|
253 |
+
'<a href="' . esc_url( get_imagify_admin_url() ) . '">',
|
254 |
+
'</a>'
|
255 |
+
);
|
256 |
+
?>
|
257 |
+
</strong>
|
258 |
+
</p>
|
259 |
+
|
260 |
+
<?php } // End if(). ?>
|
261 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
262 |
</div>
|
263 |
<div class="col-1-2">
|
264 |
<p class="imagify-count-title"><?php esc_html_e( 'Let\'s go!', 'imagify' ); ?></p>
|
268 |
<?php wp_nonce_field( 'imagify-bulk-upload', 'imagifybulkuploadnonce' ); ?>
|
269 |
<button id="imagify-bulk-action" type="button" class="button button-primary">
|
270 |
<span class="dashicons dashicons-admin-generic"></span>
|
271 |
+
<span class="button-text"><?php _e( 'Imagif\'em all', 'imagify' ); ?></span>
|
272 |
</button>
|
273 |
</p>
|
274 |
</div>
|
275 |
<div class="imagify-cell imagify-pl0">
|
276 |
+
<p class="imagify-info-block">
|
277 |
+
<?php
|
278 |
+
printf(
|
279 |
+
/* translators: %s is a file size. */
|
280 |
+
__( 'All images greater than %s will be optimized when using a paid plan.', 'imagify' ),
|
281 |
+
size_format( get_imagify_max_image_size() )
|
282 |
+
);
|
283 |
+
?>
|
284 |
+
</p>
|
285 |
</div>
|
286 |
</div>
|
287 |
</div>
|
288 |
</div><!-- .imagify-bulk-submit -->
|
289 |
</div>
|
290 |
+
|
291 |
<!-- The Success/Complete bar -->
|
292 |
<div class="imagify-row-complete hidden" aria-hidden="true">
|
293 |
<div class="imagify-all-complete">
|
301 |
</div>
|
302 |
<div class="imagify-ac-report-text">
|
303 |
<p class="imagify-ac-rt-big"><?php _e( 'Well done!', 'imagify' ); ?></p>
|
304 |
+
<p>
|
305 |
+
<?php
|
306 |
+
printf(
|
307 |
+
/* translators: 1 and 2 are data sizes. */
|
308 |
+
__( 'you saved %1$s out of %2$s', 'imagify' ),
|
309 |
+
'<strong class="imagify-ac-rt-total-gain"></strong>',
|
310 |
+
'<strong class="imagify-ac-rt-total-original"></strong>'
|
311 |
+
);
|
312 |
+
?>
|
313 |
+
</p>
|
314 |
</div>
|
315 |
</div>
|
316 |
<div class="imagify-ac-share">
|
321 |
<a target="_blank" class="imagify-sn-twitter" href=""><svg viewBox="0 0 23 18" width="23" height="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><title>Twitter</title><path d="m244.15 12.13c-.815.361-1.691.606-2.61.716.939-.563 1.659-1.453 1.998-2.514-.878.521-1.851.898-2.886 1.103-.829-.883-2.01-1.435-3.317-1.435-2.51 0-4.544 2.034-4.544 4.544 0 .356.04.703.118 1.035-3.777-.19-7.125-1.999-9.367-4.748-.391.671-.615 1.452-.615 2.285 0 1.576.802 2.967 2.02 3.782-.745-.024-1.445-.228-2.058-.568-.001.019-.001.038-.001.057 0 2.202 1.566 4.04 3.646 4.456-.381.104-.783.159-1.197.159-.293 0-.577-.028-.855-.081.578 1.805 2.256 3.119 4.245 3.156-1.555 1.219-3.515 1.945-5.644 1.945-.367 0-.728-.021-1.084-.063 2.01 1.289 4.399 2.041 6.966 2.041 8.359 0 12.929-6.925 12.929-12.929 0-.197-.004-.393-.013-.588.888-.64 1.658-1.44 2.268-2.352" transform="translate(-222-10)" fill="#fff"/></g></svg></a>
|
322 |
</li>
|
323 |
<li>
|
324 |
+
<a target="_blank" class="imagify-sn-twitter-facebook" href="<?php echo esc_url( 'https://www.facebook.com/sharer/sharer.php?u=https://wordpress.org/plugins/imagify' ); ?>"><svg viewBox="0 0 18 18" width="18" height="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><title>Facebook</title><path d="m203.25 10h-16.5c-.415 0-.75.336-.75.75v16.5c0 .414.336.75.75.75h8.812v-6.75h-2.25v-2.813h2.25v-2.25c0-2.325 1.472-3.469 3.546-3.469.993 0 1.847.074 2.096.107v2.43h-1.438c-1.128 0-1.391.536-1.391 1.322v1.859h2.813l-.563 2.813h-2.25l.045 6.75h4.83c.414 0 .75-.336.75-.75v-16.5c0-.414-.336-.75-.75-.75" transform="translate(-186-10)" fill="#fff"/></g></svg></a>
|
325 |
</li>
|
326 |
</ul>
|
327 |
</div>
|
364 |
<!-- No image uploaded yet -->
|
365 |
<tr class="imagify-no-uploaded-yet">
|
366 |
<td colspan="7">
|
367 |
+
<p><a id="imagify-simulate-bulk-action" href="#"><?php _e( 'Start the bulk optimization', 'imagify' ); ?></a></p>
|
368 |
</td>
|
369 |
</tr>
|
370 |
</tbody>
|
372 |
</div>
|
373 |
|
374 |
<?php imagify_payment_modal(); ?>
|
375 |
+
|
376 |
</div>
|
377 |
<?php
|
378 |
+
}
|
inc/admin/ui/notices.php
CHANGED
@@ -1,19 +1,21 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* This warning is displayed when the API key is empty
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @author Jonathan Buttigieg
|
9 |
*/
|
10 |
-
add_action( 'all_admin_notices', '_imagify_warning_empty_api_key_notice' );
|
11 |
function _imagify_warning_empty_api_key_notice() {
|
12 |
$current_screen = get_current_screen();
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
|
|
|
|
17 |
return;
|
18 |
}
|
19 |
?>
|
@@ -23,7 +25,7 @@ function _imagify_warning_empty_api_key_notice() {
|
|
23 |
<span class="baseline">
|
24 |
<?php _e( 'Welcome to Imagify, the best way to easily optimize your images!', 'imagify' ); ?>
|
25 |
</span>
|
26 |
-
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'welcome-steps' ); ?>" class="imagify-notice-dismiss imagify-welcome-remove" title="<?php
|
27 |
</div>
|
28 |
<div class="imagify-settings-section">
|
29 |
<div class="imagify-columns counter">
|
@@ -41,10 +43,20 @@ function _imagify_warning_empty_api_key_notice() {
|
|
41 |
<img src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>key.svg" width="48" height="48" alt="">
|
42 |
<div class="imagify-col-content">
|
43 |
<p class="imagify-col-title"><?php _e( 'Enter your API Key', 'imagify' ); ?></p>
|
44 |
-
<p class="imagify-col-desc"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
<p>
|
46 |
<?php wp_nonce_field( 'imagify-check-api-key', 'imagifycheckapikeynonce', false ); ?>
|
47 |
-
<a id="imagify-save-api-key" href="<?php echo get_imagify_admin_url(); ?>" class="button button-primary"><?php _e( 'I have my API key', 'imagify' ); ?></a
|
|
|
48 |
</div>
|
49 |
</div>
|
50 |
<div class="col-1-3">
|
@@ -52,7 +64,7 @@ function _imagify_warning_empty_api_key_notice() {
|
|
52 |
<div class="imagify-col-content">
|
53 |
<p class="imagify-col-title"><?php _e( 'Configure it', 'imagify' ); ?></p>
|
54 |
<p class="imagify-col-desc"><?php _e( 'It’s almost done! You have just to configure your optimization settings.', 'imagify' ); ?></p>
|
55 |
-
<p><a href="<?php echo get_imagify_admin_url(); ?>" class="button button-primary"><?php _e( 'Go to Settings', 'imagify' ); ?></a></p>
|
56 |
</div>
|
57 |
</div>
|
58 |
</div>
|
@@ -61,20 +73,23 @@ function _imagify_warning_empty_api_key_notice() {
|
|
61 |
<?php
|
62 |
}
|
63 |
|
|
|
64 |
/**
|
65 |
-
* This warning is displayed when the API key is empty
|
66 |
*
|
67 |
* @since 1.0
|
68 |
* @author Jonathan Buttigieg
|
69 |
*/
|
70 |
-
add_action( 'all_admin_notices', '_imagify_warning_wrong_api_key_notice' );
|
71 |
function _imagify_warning_wrong_api_key_notice() {
|
72 |
-
$current_screen
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
|
|
|
|
|
|
78 |
return;
|
79 |
}
|
80 |
?>
|
@@ -86,52 +101,59 @@ function _imagify_warning_wrong_api_key_notice() {
|
|
86 |
<div class="imagify-notice-content">
|
87 |
<p class="imagify-notice-title"><strong><?php _e( 'Your API key isn\'t valid!', 'imagify' ); ?></strong></p>
|
88 |
<p>
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
</div>
|
92 |
-
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'wrong-api-key' ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
93 |
</div>
|
94 |
|
95 |
<?php
|
96 |
}
|
97 |
|
|
|
98 |
/**
|
99 |
* This warning is displayed when some plugins may conflict with Imagify
|
100 |
*
|
101 |
* @since 1.0
|
102 |
* @author Jonathan Buttigieg
|
103 |
*/
|
104 |
-
add_action( 'all_admin_notices', '_imagify_warning_plugins_to_deactivate_notice' );
|
105 |
function _imagify_warning_plugins_to_deactivate_notice() {
|
106 |
$plugins_to_deactivate = array();
|
107 |
-
$cap = ( imagify_is_active_for_network() ) ? 'manage_network_options' : 'manage_options';
|
108 |
|
109 |
-
// Deactivate all plugins who can cause conflicts with Imagify
|
110 |
$plugins = array(
|
111 |
-
'wp-smush' => 'wp-smushit/wp-smush.php', // WP Smush
|
112 |
-
'wp-smush-pro' => 'wp-smush-pro/wp-smush.php', // WP Smush Pro
|
113 |
-
'kraken' => 'kraken-image-optimizer/kraken.php', // Kraken.io
|
114 |
-
'tinypng' => 'tiny-compress-images/tiny-compress-images.php', // TinyPNG
|
115 |
-
'shortpixel' => 'shortpixel-image-optimiser/wp-shortpixel.php', // Shortpixel
|
116 |
-
'ewww' => 'ewww-image-optimizer/ewww-image-optimizer.php', // EWWW Image Optimizer
|
117 |
-
'ewww-cloud' => 'ewww-image-optimizer-cloud/ewww-image-optimizer-cloud.php', // EWWW Image Optimizer Cloud
|
118 |
-
'imagerecycle' => 'imagerecycle-pdf-image-compression/wp-image-recycle.php', // ImageRecycle
|
119 |
);
|
120 |
|
121 |
/**
|
122 |
-
* Filter the recommended plugins to deactivate to prevent conflicts
|
123 |
*
|
124 |
* @since 1.0
|
125 |
*
|
126 |
-
* @param string $plugins List of recommended plugins to deactivate
|
127 |
*/
|
128 |
$plugins = apply_filters( 'imagify_plugins_to_deactivate', $plugins );
|
129 |
$plugins = array_filter( $plugins, 'is_plugin_active' );
|
130 |
|
131 |
-
|
132 |
-
if ( ! (bool) $plugins || ! current_user_can( apply_filters( 'imagify_capacity', $cap ) ) ) {
|
133 |
return;
|
134 |
-
}
|
135 |
?>
|
136 |
<div class="clear"></div>
|
137 |
<div class="imagify-notice error below-h2">
|
@@ -144,8 +166,9 @@ function _imagify_warning_plugins_to_deactivate_notice() {
|
|
144 |
<ul class="imagify-plugins-error">
|
145 |
<?php
|
146 |
foreach ( $plugins as $plugin ) {
|
147 |
-
$plugin_data
|
148 |
-
|
|
|
149 |
}
|
150 |
?>
|
151 |
</ul>
|
@@ -154,21 +177,24 @@ function _imagify_warning_plugins_to_deactivate_notice() {
|
|
154 |
<?php
|
155 |
}
|
156 |
|
|
|
157 |
/**
|
158 |
-
* This notice is displayed when external HTTP requests are blocked via the WP_HTTP_BLOCK_EXTERNAL constant
|
159 |
*
|
160 |
* @since 1.0
|
161 |
* @author Jonathan Buttigieg
|
162 |
*/
|
163 |
-
add_action( 'all_admin_notices', '_imagify_http_block_external_notice' );
|
164 |
function _imagify_http_block_external_notice() {
|
165 |
$current_screen = get_current_screen();
|
166 |
-
$ignored_notices = get_user_meta( $GLOBALS['current_user']->ID, '_imagify_ignore_notices', true );
|
167 |
|
168 |
-
if ( (
|
169 |
return;
|
170 |
}
|
171 |
-
|
|
|
|
|
|
|
|
|
172 |
<div class="clear"></div>
|
173 |
<div class="error imagify-notice below-h2">
|
174 |
<div class="imagify-notice-logo">
|
@@ -176,36 +202,43 @@ function _imagify_http_block_external_notice() {
|
|
176 |
</div>
|
177 |
<div class="imagify-notice-content">
|
178 |
<p class="imagify-notice-title"><strong><?php _e( 'The external HTTP requests are blocked!', 'imagify' ); ?></strong></p>
|
179 |
-
<p><?php _e( 'You defined the <code>WP_HTTP_BLOCK_EXTERNAL</code> constant in the <code>wp-config.php</code> to block all external HTTP requests.', 'imagify' ); ?></p>
|
180 |
<p>
|
181 |
-
|
182 |
-
|
|
|
|
|
|
|
183 |
</p>
|
184 |
<p><textarea readonly="readonly" class="large-text readonly" rows="1">define( 'WP_ACCESSIBLE_HOSTS', '*.imagify.io' );</textarea></p>
|
185 |
</div>
|
186 |
-
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'http-block-external' ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
187 |
-
</div>
|
188 |
<?php
|
189 |
}
|
190 |
|
|
|
191 |
/**
|
192 |
-
* This warning is displayed when the grid view is active on the library
|
193 |
*
|
194 |
* @since 1.0.2
|
195 |
* @author Jonathan Buttigieg
|
196 |
*/
|
197 |
-
add_action( 'all_admin_notices', '_imagify_warning_grid_view_notice' );
|
198 |
function _imagify_warning_grid_view_notice() {
|
199 |
global $wp_version;
|
200 |
-
|
201 |
-
$
|
|
|
|
|
|
|
|
|
|
|
202 |
$media_library_mode = get_user_option( 'media_library_mode', get_current_user_id() );
|
203 |
|
204 |
-
if ( (
|
205 |
return;
|
206 |
}
|
207 |
-
|
208 |
-
// Don't display the notice if the API key isn't valid
|
209 |
if ( ! imagify_valid_key() ) {
|
210 |
return;
|
211 |
}
|
@@ -218,36 +251,38 @@ function _imagify_warning_grid_view_notice() {
|
|
218 |
<div class="imagify-notice-content">
|
219 |
<p class="imagify-notice-title"><strong><?php _e( 'You\'re missing out!', 'imagify' ); ?></strong></p>
|
220 |
<p><?php _e( 'Use the List view to optimize images with Imagify.', 'imagify' ); ?></p>
|
221 |
-
<p><a href="<?php echo admin_url( 'upload.php?mode=list' ); ?>"><?php _e( 'Switch to the List View', 'imagify' ); ?></a></p>
|
222 |
</div>
|
223 |
-
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'grid-view' ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
224 |
-
</div>
|
225 |
<?php
|
226 |
}
|
227 |
|
|
|
228 |
/**
|
229 |
-
* This warning is displayed to warn the user that its quota is consumed for the current month
|
230 |
*
|
231 |
* @since 1.1.1
|
232 |
* @author Jonathan Buttigieg
|
233 |
*/
|
234 |
-
add_action( 'all_admin_notices', '_imagify_warning_over_quota_notice' );
|
235 |
function _imagify_warning_over_quota_notice() {
|
236 |
-
$current_screen
|
237 |
-
|
238 |
-
|
|
|
|
|
239 |
|
240 |
-
if ( (
|
241 |
return;
|
242 |
}
|
243 |
-
|
244 |
$user = new Imagify_User();
|
245 |
-
|
246 |
-
// Don't display the notice if the user doesn't use all his quota or the API key isn't valid
|
247 |
if ( ! $user->is_over_quota() || ! imagify_valid_key() ) {
|
248 |
return;
|
249 |
}
|
250 |
-
|
251 |
?>
|
252 |
<div class="clear"></div>
|
253 |
<div class="error imagify-notice below-h2">
|
@@ -256,36 +291,52 @@ function _imagify_warning_over_quota_notice() {
|
|
256 |
</div>
|
257 |
<div class="imagify-notice-content">
|
258 |
<p class="imagify-notice-title"><strong><?php _e( 'Oops, It\'s Over!', 'imagify' ); ?></strong></p>
|
259 |
-
<p
|
260 |
-
|
261 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
262 |
</div>
|
263 |
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'free-over-quota' ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
264 |
-
</div>
|
265 |
<?php
|
266 |
}
|
267 |
|
|
|
268 |
/**
|
269 |
* Add a message about WP Rocket on the "Bulk Optimization" screen.
|
270 |
*
|
271 |
* @since 2.7
|
272 |
* @author Jonathan Buttigieg
|
273 |
*/
|
274 |
-
add_action( 'admin_notices', '_imagify_rocket_notice' );
|
275 |
function _imagify_rocket_notice() {
|
276 |
-
$current_screen
|
277 |
-
|
278 |
-
|
279 |
-
if ( ( isset( $current_screen ) && 'media_page_imagify-bulk-optimization' !== $current_screen->base ) || in_array( 'wp-rocket', (array) $ignored_notices ) || ! current_user_can( apply_filters( 'imagify_capacity', 'manage_options' ) ) || defined( 'WP_ROCKET_VERSION' ) ) {
|
280 |
return;
|
281 |
}
|
282 |
|
283 |
-
|
|
|
|
|
284 |
|
285 |
-
$
|
|
|
286 |
$wprocket_url = 'http://wp-rocket.me/';
|
287 |
-
|
288 |
-
switch( get_locale() ) {
|
289 |
case 'fr_FR' :
|
290 |
$wprocket_url = 'http://wp-rocket.me/fr/';
|
291 |
break;
|
@@ -299,24 +350,25 @@ function _imagify_rocket_notice() {
|
|
299 |
$wprocket_url = 'http://wp-rocket.me/de/';
|
300 |
break;
|
301 |
}
|
302 |
-
|
303 |
-
$wprocket_url .=
|
304 |
?>
|
305 |
|
306 |
<div class="updated imagify-rkt-notice">
|
307 |
<a href="<?php echo $dismiss_url; ?>" class="imagify-cross"><span class="dashicons dashicons-no"></span></a>
|
308 |
-
|
309 |
<p class="imagify-rkt-logo">
|
310 |
<img src="<?php echo IMAGIFY_ASSETS_IMG_URL ?>logo-wprocket.png" srcset="<?php echo IMAGIFY_ASSETS_IMG_URL ?>logo-wprocket2x.png 2x" alt="WP Rocket" width="118" height="32">
|
311 |
</p>
|
312 |
<p class="imagify-rkt-msg">
|
313 |
<?php
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
|
|
320 |
?>
|
321 |
</p>
|
322 |
<p class="imagify-rkt-coupon">
|
@@ -330,24 +382,27 @@ function _imagify_rocket_notice() {
|
|
330 |
<?php
|
331 |
}
|
332 |
|
|
|
333 |
/**
|
334 |
-
* This notice is displayed to rate the plugin after 100 optimization & 7 days after the first installation
|
335 |
*
|
336 |
* @since 1.4.2
|
337 |
* @author Jonathan Buttigieg
|
338 |
*/
|
339 |
-
add_action( 'all_admin_notices', '_imagify_rating_notice' );
|
340 |
function _imagify_rating_notice() {
|
341 |
-
$
|
342 |
-
|
343 |
-
if (
|
344 |
return;
|
345 |
}
|
346 |
-
|
347 |
-
$current_screen = get_current_screen();
|
348 |
-
$ignored_notices = get_user_meta( $GLOBALS['current_user']->ID, '_imagify_ignore_notices', true );
|
349 |
|
350 |
-
if ( (
|
|
|
|
|
|
|
|
|
|
|
|
|
351 |
return;
|
352 |
}
|
353 |
?>
|
@@ -357,25 +412,46 @@ function _imagify_rating_notice() {
|
|
357 |
<img class="imagify-logo" src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>imagify-logo.png" width="138" height="16" alt="Imagify" />
|
358 |
</div>
|
359 |
<div class="imagify-notice-content">
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
|
|
|
|
|
|
|
|
|
|
364 |
<p class="imagify-rate-us">
|
365 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
366 |
<br>
|
367 |
<a class="stars" href="<?php echo $imagify_rate_url; ?>">☆☆☆☆☆</a>
|
368 |
</p>
|
369 |
</div>
|
370 |
-
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'rating' ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
371 |
</div>
|
372 |
<?php
|
373 |
}
|
374 |
|
375 |
add_action( 'imagify_dismiss_notice', '_imagify_clear_scheduled_rating' );
|
|
|
|
|
|
|
|
|
|
|
376 |
function _imagify_clear_scheduled_rating( $notice ) {
|
377 |
if ( 'rating' === $notice ) {
|
378 |
set_site_transient( 'do_imagify_rating_cron', 'no' );
|
379 |
wp_clear_scheduled_hook( 'imagify_rating_event' );
|
380 |
}
|
381 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'all_admin_notices', '_imagify_warning_empty_api_key_notice' );
|
5 |
/**
|
6 |
+
* This warning is displayed when the API key is empty.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
* @author Jonathan Buttigieg
|
10 |
*/
|
|
|
11 |
function _imagify_warning_empty_api_key_notice() {
|
12 |
$current_screen = get_current_screen();
|
13 |
+
|
14 |
+
if ( ! empty( $current_screen ) && ( 'settings_page_imagify' === $current_screen->base || 'settings_page_imagify-network' === $current_screen->base ) ) {
|
15 |
+
return;
|
16 |
+
}
|
17 |
+
|
18 |
+
if ( imagify_notice_is_dismissed( 'welcome-steps' ) || get_imagify_option( 'api_key', false ) || ! current_user_can( imagify_get_capacity() ) ) {
|
19 |
return;
|
20 |
}
|
21 |
?>
|
25 |
<span class="baseline">
|
26 |
<?php _e( 'Welcome to Imagify, the best way to easily optimize your images!', 'imagify' ); ?>
|
27 |
</span>
|
28 |
+
<a href="<?php echo esc_url( get_imagify_admin_url( 'dismiss-notice', 'welcome-steps' ) ); ?>" class="imagify-notice-dismiss imagify-welcome-remove" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="dashicons dashicons-dismiss"></span><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
29 |
</div>
|
30 |
<div class="imagify-settings-section">
|
31 |
<div class="imagify-columns counter">
|
43 |
<img src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>key.svg" width="48" height="48" alt="">
|
44 |
<div class="imagify-col-content">
|
45 |
<p class="imagify-col-title"><?php _e( 'Enter your API Key', 'imagify' ); ?></p>
|
46 |
+
<p class="imagify-col-desc">
|
47 |
+
<?php
|
48 |
+
printf(
|
49 |
+
/* translators: 1 is a link tag start, 2 is the link tag end. */
|
50 |
+
__( 'Save your API Key you have received by email or you can get it on your %1$sImagify account page%2$s.', 'imagify' ),
|
51 |
+
'<a href="' . IMAGIFY_APP_MAIN . '/#/api">',
|
52 |
+
'</a>'
|
53 |
+
);
|
54 |
+
?>
|
55 |
+
</p>
|
56 |
<p>
|
57 |
<?php wp_nonce_field( 'imagify-check-api-key', 'imagifycheckapikeynonce', false ); ?>
|
58 |
+
<a id="imagify-save-api-key" href="<?php echo esc_url( get_imagify_admin_url() ); ?>" class="button button-primary"><?php _e( 'I have my API key', 'imagify' ); ?></a>
|
59 |
+
</p>
|
60 |
</div>
|
61 |
</div>
|
62 |
<div class="col-1-3">
|
64 |
<div class="imagify-col-content">
|
65 |
<p class="imagify-col-title"><?php _e( 'Configure it', 'imagify' ); ?></p>
|
66 |
<p class="imagify-col-desc"><?php _e( 'It’s almost done! You have just to configure your optimization settings.', 'imagify' ); ?></p>
|
67 |
+
<p><a href="<?php echo esc_url( get_imagify_admin_url() ); ?>" class="button button-primary"><?php _e( 'Go to Settings', 'imagify' ); ?></a></p>
|
68 |
</div>
|
69 |
</div>
|
70 |
</div>
|
73 |
<?php
|
74 |
}
|
75 |
|
76 |
+
add_action( 'all_admin_notices', '_imagify_warning_wrong_api_key_notice' );
|
77 |
/**
|
78 |
+
* This warning is displayed when the API key is empty.
|
79 |
*
|
80 |
* @since 1.0
|
81 |
* @author Jonathan Buttigieg
|
82 |
*/
|
|
|
83 |
function _imagify_warning_wrong_api_key_notice() {
|
84 |
+
$current_screen = get_current_screen();
|
85 |
+
|
86 |
+
if ( empty( $current_screen ) || 'media_page_imagify-bulk-optimization' !== $current_screen->base ) {
|
87 |
+
return;
|
88 |
+
}
|
89 |
+
|
90 |
+
$api_key = get_imagify_option( 'api_key', false );
|
91 |
+
|
92 |
+
if ( imagify_notice_is_dismissed( 'wrong-api-key' ) || empty( $api_key ) || imagify_valid_key() || ! current_user_can( imagify_get_capacity() ) ) {
|
93 |
return;
|
94 |
}
|
95 |
?>
|
101 |
<div class="imagify-notice-content">
|
102 |
<p class="imagify-notice-title"><strong><?php _e( 'Your API key isn\'t valid!', 'imagify' ); ?></strong></p>
|
103 |
<p>
|
104 |
+
<?php wp_nonce_field( 'imagify-signup', 'imagifysignupnonce', false ); ?>
|
105 |
+
<?php
|
106 |
+
printf(
|
107 |
+
/* translators: 1 and 2 are link tag starts, 3 is a link tag end. */
|
108 |
+
__( 'Go to your Imagify account page to get your API Key and specify it on %1$syour settings%3$s or %2$screate an account for free%3$s if you don\'t have one yet.', 'imagify' ),
|
109 |
+
'<a href="' . get_imagify_admin_url() . '">',
|
110 |
+
'<a id="imagify-signup" href="' . IMAGIFY_WEB_MAIN . '">',
|
111 |
+
'</a>'
|
112 |
+
);
|
113 |
+
?>
|
114 |
+
</p>
|
115 |
</div>
|
116 |
+
<a href="<?php echo esc_url( get_imagify_admin_url( 'dismiss-notice', 'wrong-api-key' ) ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
117 |
</div>
|
118 |
|
119 |
<?php
|
120 |
}
|
121 |
|
122 |
+
add_action( 'all_admin_notices', '_imagify_warning_plugins_to_deactivate_notice' );
|
123 |
/**
|
124 |
* This warning is displayed when some plugins may conflict with Imagify
|
125 |
*
|
126 |
* @since 1.0
|
127 |
* @author Jonathan Buttigieg
|
128 |
*/
|
|
|
129 |
function _imagify_warning_plugins_to_deactivate_notice() {
|
130 |
$plugins_to_deactivate = array();
|
|
|
131 |
|
132 |
+
// Deactivate all plugins who can cause conflicts with Imagify.
|
133 |
$plugins = array(
|
134 |
+
'wp-smush' => 'wp-smushit/wp-smush.php', // WP Smush.
|
135 |
+
'wp-smush-pro' => 'wp-smush-pro/wp-smush.php', // WP Smush Pro.
|
136 |
+
'kraken' => 'kraken-image-optimizer/kraken.php', // Kraken.io.
|
137 |
+
'tinypng' => 'tiny-compress-images/tiny-compress-images.php', // TinyPNG.
|
138 |
+
'shortpixel' => 'shortpixel-image-optimiser/wp-shortpixel.php', // Shortpixel.
|
139 |
+
'ewww' => 'ewww-image-optimizer/ewww-image-optimizer.php', // EWWW Image Optimizer.
|
140 |
+
'ewww-cloud' => 'ewww-image-optimizer-cloud/ewww-image-optimizer-cloud.php', // EWWW Image Optimizer Cloud.
|
141 |
+
'imagerecycle' => 'imagerecycle-pdf-image-compression/wp-image-recycle.php', // ImageRecycle.
|
142 |
);
|
143 |
|
144 |
/**
|
145 |
+
* Filter the recommended plugins to deactivate to prevent conflicts.
|
146 |
*
|
147 |
* @since 1.0
|
148 |
*
|
149 |
+
* @param string $plugins List of recommended plugins to deactivate.
|
150 |
*/
|
151 |
$plugins = apply_filters( 'imagify_plugins_to_deactivate', $plugins );
|
152 |
$plugins = array_filter( $plugins, 'is_plugin_active' );
|
153 |
|
154 |
+
if ( ! $plugins || ! current_user_can( imagify_get_capacity() ) ) {
|
|
|
155 |
return;
|
156 |
+
}
|
157 |
?>
|
158 |
<div class="clear"></div>
|
159 |
<div class="imagify-notice error below-h2">
|
166 |
<ul class="imagify-plugins-error">
|
167 |
<?php
|
168 |
foreach ( $plugins as $plugin ) {
|
169 |
+
$plugin_data = get_plugin_data( WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin );
|
170 |
+
$deactivate_url = esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=imagify_deactivate_plugin&plugin=' . rawurlencode( $plugin ) ), 'imagifydeactivatepluginnonce' ) );
|
171 |
+
echo '<li>' . $plugin_data['Name'] . '</span> <a href="' . $deactivate_url . '" class="button button-mini alignright">' . __( 'Deactivate', 'imagify' ) . '</a></li>';
|
172 |
}
|
173 |
?>
|
174 |
</ul>
|
177 |
<?php
|
178 |
}
|
179 |
|
180 |
+
add_action( 'all_admin_notices', '_imagify_http_block_external_notice' );
|
181 |
/**
|
182 |
+
* This notice is displayed when external HTTP requests are blocked via the WP_HTTP_BLOCK_EXTERNAL constant.
|
183 |
*
|
184 |
* @since 1.0
|
185 |
* @author Jonathan Buttigieg
|
186 |
*/
|
|
|
187 |
function _imagify_http_block_external_notice() {
|
188 |
$current_screen = get_current_screen();
|
|
|
189 |
|
190 |
+
if ( empty( $current_screen ) || ( 'settings_page_imagify' === $current_screen->base || 'settings_page_imagify-network' === $current_screen->base ) ) {
|
191 |
return;
|
192 |
}
|
193 |
+
|
194 |
+
if ( imagify_notice_is_dismissed( 'http-block-external' ) || ! current_user_can( imagify_get_capacity( true ) ) || ! is_imagify_blocked() ) {
|
195 |
+
return;
|
196 |
+
}
|
197 |
+
?>
|
198 |
<div class="clear"></div>
|
199 |
<div class="error imagify-notice below-h2">
|
200 |
<div class="imagify-notice-logo">
|
202 |
</div>
|
203 |
<div class="imagify-notice-content">
|
204 |
<p class="imagify-notice-title"><strong><?php _e( 'The external HTTP requests are blocked!', 'imagify' ); ?></strong></p>
|
|
|
205 |
<p>
|
206 |
+
<?php _e( 'You defined the <code>WP_HTTP_BLOCK_EXTERNAL</code> constant in the <code>wp-config.php</code> to block all external HTTP requests.', 'imagify' ); ?>
|
207 |
+
</p>
|
208 |
+
<p>
|
209 |
+
<?php _e( 'To optimize your images, you have to put the following code in your <code>wp-config.php</code> file so that it works correctly.', 'imagify' ); ?><br/>
|
210 |
+
<?php _e( 'Click on the field and press Ctrl-A to select all.', 'imagify' ); ?>
|
211 |
</p>
|
212 |
<p><textarea readonly="readonly" class="large-text readonly" rows="1">define( 'WP_ACCESSIBLE_HOSTS', '*.imagify.io' );</textarea></p>
|
213 |
</div>
|
214 |
+
<a href="<?php echo esc_url( get_imagify_admin_url( 'dismiss-notice', 'http-block-external' ) ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
215 |
+
</div>
|
216 |
<?php
|
217 |
}
|
218 |
|
219 |
+
add_action( 'all_admin_notices', '_imagify_warning_grid_view_notice' );
|
220 |
/**
|
221 |
+
* This warning is displayed when the grid view is active on the library.
|
222 |
*
|
223 |
* @since 1.0.2
|
224 |
* @author Jonathan Buttigieg
|
225 |
*/
|
|
|
226 |
function _imagify_warning_grid_view_notice() {
|
227 |
global $wp_version;
|
228 |
+
|
229 |
+
$current_screen = get_current_screen();
|
230 |
+
|
231 |
+
if ( empty( $current_screen ) || 'upload' !== $current_screen->base ) {
|
232 |
+
return;
|
233 |
+
}
|
234 |
+
|
235 |
$media_library_mode = get_user_option( 'media_library_mode', get_current_user_id() );
|
236 |
|
237 |
+
if ( imagify_notice_is_dismissed( 'grid-view' ) || ! current_user_can( 'upload_files' ) || 'list' === $media_library_mode || version_compare( $wp_version, '4.0' ) < 0 ) {
|
238 |
return;
|
239 |
}
|
240 |
+
|
241 |
+
// Don't display the notice if the API key isn't valid.
|
242 |
if ( ! imagify_valid_key() ) {
|
243 |
return;
|
244 |
}
|
251 |
<div class="imagify-notice-content">
|
252 |
<p class="imagify-notice-title"><strong><?php _e( 'You\'re missing out!', 'imagify' ); ?></strong></p>
|
253 |
<p><?php _e( 'Use the List view to optimize images with Imagify.', 'imagify' ); ?></p>
|
254 |
+
<p><a href="<?php echo esc_url( admin_url( 'upload.php?mode=list' ) ); ?>"><?php _e( 'Switch to the List View', 'imagify' ); ?></a></p>
|
255 |
</div>
|
256 |
+
<a href="<?php echo esc_url( get_imagify_admin_url( 'dismiss-notice', 'grid-view' ) ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
257 |
+
</div>
|
258 |
<?php
|
259 |
}
|
260 |
|
261 |
+
add_action( 'all_admin_notices', '_imagify_warning_over_quota_notice' );
|
262 |
/**
|
263 |
+
* This warning is displayed to warn the user that its quota is consumed for the current month.
|
264 |
*
|
265 |
* @since 1.1.1
|
266 |
* @author Jonathan Buttigieg
|
267 |
*/
|
|
|
268 |
function _imagify_warning_over_quota_notice() {
|
269 |
+
$current_screen = get_current_screen();
|
270 |
+
|
271 |
+
if ( empty( $current_screen ) || ( 'media_page_imagify-bulk-optimization' !== $current_screen->base && 'settings_page_imagify' !== $current_screen->base && 'settings_page_imagify-network' !== $current_screen->base ) ) {
|
272 |
+
return;
|
273 |
+
}
|
274 |
|
275 |
+
if ( imagify_notice_is_dismissed( 'free-over-quota' ) || ! current_user_can( imagify_get_capacity() ) ) {
|
276 |
return;
|
277 |
}
|
278 |
+
|
279 |
$user = new Imagify_User();
|
280 |
+
|
281 |
+
// Don't display the notice if the user doesn't use all his quota or the API key isn't valid.
|
282 |
if ( ! $user->is_over_quota() || ! imagify_valid_key() ) {
|
283 |
return;
|
284 |
}
|
285 |
+
|
286 |
?>
|
287 |
<div class="clear"></div>
|
288 |
<div class="error imagify-notice below-h2">
|
291 |
</div>
|
292 |
<div class="imagify-notice-content">
|
293 |
<p class="imagify-notice-title"><strong><?php _e( 'Oops, It\'s Over!', 'imagify' ); ?></strong></p>
|
294 |
+
<p><?php
|
295 |
+
printf(
|
296 |
+
/* translators: 1 is a "bold" tag start, 2 is a formatted data quota, 3 is a date, 4 is the "bold" tag end. */
|
297 |
+
__( 'You have consumed all your credit for this month. You will have %1$s%2$s back on %3$s%4$s.', 'imagify' ),
|
298 |
+
'<strong>',
|
299 |
+
size_format( $user->quota * 1048576 ),
|
300 |
+
date_i18n( get_option( 'date_format' ), strtotime( $user->next_date_update ) ),
|
301 |
+
'</strong>'
|
302 |
+
);
|
303 |
+
echo '<br/><br/>';
|
304 |
+
printf(
|
305 |
+
/* translators: 1 is a link tag start, 2 is the link tag end. */
|
306 |
+
__( 'To continue to optimize your images, log in to your Imagify account to %1$sbuy a pack or subscribe to a plan%2$s.', 'imagify' ),
|
307 |
+
'<a href="' . IMAGIFY_APP_MAIN . '/#/subscription">',
|
308 |
+
'</a>'
|
309 |
+
);
|
310 |
+
?></p>
|
311 |
</div>
|
312 |
<a href="<?php echo get_imagify_admin_url( 'dismiss-notice', 'free-over-quota' ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
313 |
+
</div>
|
314 |
<?php
|
315 |
}
|
316 |
|
317 |
+
add_action( 'admin_notices', '_imagify_rocket_notice' );
|
318 |
/**
|
319 |
* Add a message about WP Rocket on the "Bulk Optimization" screen.
|
320 |
*
|
321 |
* @since 2.7
|
322 |
* @author Jonathan Buttigieg
|
323 |
*/
|
|
|
324 |
function _imagify_rocket_notice() {
|
325 |
+
$current_screen = get_current_screen();
|
326 |
+
|
327 |
+
if ( empty( $current_screen ) || 'media_page_imagify-bulk-optimization' !== $current_screen->base ) {
|
|
|
328 |
return;
|
329 |
}
|
330 |
|
331 |
+
if ( defined( 'WP_ROCKET_VERSION' ) || imagify_notice_is_dismissed( 'wp-rocket' ) || ! current_user_can( imagify_get_capacity( true ) ) ) {
|
332 |
+
return;
|
333 |
+
}
|
334 |
|
335 |
+
$dismiss_url = get_imagify_admin_url( 'dismiss-notice', 'wp-rocket' );
|
336 |
+
$coupon_code = 'IMAGIFY20';
|
337 |
$wprocket_url = 'http://wp-rocket.me/';
|
338 |
+
|
339 |
+
switch ( get_locale() ) {
|
340 |
case 'fr_FR' :
|
341 |
$wprocket_url = 'http://wp-rocket.me/fr/';
|
342 |
break;
|
350 |
$wprocket_url = 'http://wp-rocket.me/de/';
|
351 |
break;
|
352 |
}
|
353 |
+
|
354 |
+
$wprocket_url .= '?utm_source=imagify-coupon&utm_medium=plugin&utm_campaign=imagify';
|
355 |
?>
|
356 |
|
357 |
<div class="updated imagify-rkt-notice">
|
358 |
<a href="<?php echo $dismiss_url; ?>" class="imagify-cross"><span class="dashicons dashicons-no"></span></a>
|
359 |
+
|
360 |
<p class="imagify-rkt-logo">
|
361 |
<img src="<?php echo IMAGIFY_ASSETS_IMG_URL ?>logo-wprocket.png" srcset="<?php echo IMAGIFY_ASSETS_IMG_URL ?>logo-wprocket2x.png 2x" alt="WP Rocket" width="118" height="32">
|
362 |
</p>
|
363 |
<p class="imagify-rkt-msg">
|
364 |
<?php
|
365 |
+
esc_html_e( 'Discover the best caching plugin to speed up your website.', 'imagify' );
|
366 |
+
echo '<br>';
|
367 |
+
printf(
|
368 |
+
/* translators: 1 is a "bold" tag start, 2 is a pourcentage, 3 is the "bold" tag end, 4 is a coupon code. */
|
369 |
+
esc_html__( '%1$sGet %2$s off%3$s with this coupon code: %4$s', 'imagify' ),
|
370 |
+
'<strong>', '20%', '</strong>', $coupon_code
|
371 |
+
);
|
372 |
?>
|
373 |
</p>
|
374 |
<p class="imagify-rkt-coupon">
|
382 |
<?php
|
383 |
}
|
384 |
|
385 |
+
add_action( 'all_admin_notices', '_imagify_rating_notice' );
|
386 |
/**
|
387 |
+
* This notice is displayed to rate the plugin after 100 optimization & 7 days after the first installation.
|
388 |
*
|
389 |
* @since 1.4.2
|
390 |
* @author Jonathan Buttigieg
|
391 |
*/
|
|
|
392 |
function _imagify_rating_notice() {
|
393 |
+
$current_screen = get_current_screen();
|
394 |
+
|
395 |
+
if ( empty( $current_screen ) || ( 'media_page_imagify-bulk-optimization' !== $current_screen->base && 'upload' !== $current_screen->base && 'media' !== $current_screen->base ) ) {
|
396 |
return;
|
397 |
}
|
|
|
|
|
|
|
398 |
|
399 |
+
if ( imagify_notice_is_dismissed( 'rating' ) || ! current_user_can( imagify_get_capacity( true ) ) ) {
|
400 |
+
return;
|
401 |
+
}
|
402 |
+
|
403 |
+
$user_images_count = (int) get_site_transient( 'imagify_user_images_count' );
|
404 |
+
|
405 |
+
if ( ! $user_images_count || get_site_transient( 'imagify_seen_rating_notice' ) ) {
|
406 |
return;
|
407 |
}
|
408 |
?>
|
412 |
<img class="imagify-logo" src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>imagify-logo.png" width="138" height="16" alt="Imagify" />
|
413 |
</div>
|
414 |
<div class="imagify-notice-content">
|
415 |
+
<p><?php
|
416 |
+
printf(
|
417 |
+
/* translators: 1 is a "bold" tag start, 2 is the "bold" tag end, 3 is a formatted number (don't use %3$d). */
|
418 |
+
__( '%1$sCongratulations%2$s, you have optimized %1$s%3$s images%2$s and improved your website\'s speed by reducing your images size.', 'imagify' ),
|
419 |
+
'<strong>',
|
420 |
+
'</strong>',
|
421 |
+
number_format_i18n( $user_images_count )
|
422 |
+
);
|
423 |
+
?></p>
|
424 |
<p class="imagify-rate-us">
|
425 |
+
<?php
|
426 |
+
$imagify_rate_url = 'https://wordpress.org/support/view/plugin-reviews/imagify?rate=5#postform';
|
427 |
+
|
428 |
+
printf(
|
429 |
+
/* translators: 1 is a "bold" tag start, 2 is the "bold" tag end + a line break tag, 3 is a link tag start, 4 is the link tag end. */
|
430 |
+
__( '%1$sDo you like this plugin?%2$s Please take a few seconds to %3$srate it on WordPress.org%4$s!', 'imagify' ),
|
431 |
+
'<strong>',
|
432 |
+
'</strong><br />',
|
433 |
+
'<a href="' . $imagify_rate_url . '">',
|
434 |
+
'</a>'
|
435 |
+
);
|
436 |
+
?>
|
437 |
<br>
|
438 |
<a class="stars" href="<?php echo $imagify_rate_url; ?>">☆☆☆☆☆</a>
|
439 |
</p>
|
440 |
</div>
|
441 |
+
<a href="<?php echo esc_url( get_imagify_admin_url( 'dismiss-notice', 'rating' ) ); ?>" class="imagify-notice-dismiss notice-dismiss" title="<?php esc_attr_e( 'Dismiss this notice', 'imagify' ); ?>"><span class="screen-reader-text"><?php _e( 'Dismiss this notice', 'imagify' ); ?></span></a>
|
442 |
</div>
|
443 |
<?php
|
444 |
}
|
445 |
|
446 |
add_action( 'imagify_dismiss_notice', '_imagify_clear_scheduled_rating' );
|
447 |
+
/**
|
448 |
+
* Stop the rating cron when the notice is dismissed.
|
449 |
+
*
|
450 |
+
* @param string $notice The notice name.
|
451 |
+
*/
|
452 |
function _imagify_clear_scheduled_rating( $notice ) {
|
453 |
if ( 'rating' === $notice ) {
|
454 |
set_site_transient( 'do_imagify_rating_cron', 'no' );
|
455 |
wp_clear_scheduled_hook( 'imagify_rating_event' );
|
456 |
}
|
457 |
+
}
|
inc/admin/ui/options.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
* The main settings page construtor using the required functions from WP
|
@@ -9,13 +9,14 @@ defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
|
9 |
function _imagify_display_options_page() {
|
10 |
global $_wp_additional_image_sizes, $wp_version;
|
11 |
|
12 |
-
if ( isset( $_POST['submit-goto-bulk'] ) ) {
|
13 |
wp_safe_redirect( get_admin_url( get_current_blog_id(), 'upload.php?page=imagify-bulk-optimization' ) );
|
14 |
}
|
15 |
?>
|
16 |
<div class="wrap imagify-settings">
|
17 |
-
|
18 |
-
if ( ! defined( 'WP_ROCKET_VERSION' ) ) { ?>
|
|
|
19 |
<div class="imagify-col imagify-sidebar">
|
20 |
<div class="imagify-sidebar-section">
|
21 |
<span class="imagify-sidebar-title">
|
@@ -31,9 +32,18 @@ function _imagify_display_options_page() {
|
|
31 |
<p class="imagify-big-text">
|
32 |
<?php
|
33 |
$discount_percent = '20%';
|
34 |
-
$discount_code
|
35 |
-
|
36 |
-
printf(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
?>
|
38 |
</p>
|
39 |
|
@@ -45,18 +55,24 @@ function _imagify_display_options_page() {
|
|
45 |
</ul>
|
46 |
</div>
|
47 |
</div>
|
48 |
-
|
49 |
-
}
|
50 |
-
?>
|
51 |
|
52 |
<div class="imagify-col imagify-main">
|
53 |
-
<?php $heading_tag = version_compare( $
|
54 |
<div class="imagify-title">
|
55 |
<img width="225" height="26" alt="Imagify" src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>imagify-logo.png" class="imagify-logo" /> <small><sup><?php echo IMAGIFY_VERSION; ?></sup></small>
|
56 |
|
57 |
-
<?php $imagify_rate_url =
|
58 |
<p class="imagify-rate-us">
|
59 |
-
<?php printf(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
<br>
|
61 |
<a class="stars" href="<?php echo $imagify_rate_url; ?>"><?php echo str_repeat( '<span class="dashicons dashicons-star-filled"></span>', 5 ); ?></a>
|
62 |
</p>
|
@@ -75,43 +91,51 @@ function _imagify_display_options_page() {
|
|
75 |
|
76 |
<?php echo get_imagify_new_to_imagify(); ?>
|
77 |
|
78 |
-
<?php
|
79 |
-
if ( ! defined( 'IMAGIFY_API_KEY' ) || ! IMAGIFY_API_KEY ) { ?>
|
80 |
-
<div class="imagify-sub-header">
|
81 |
-
<table class="form-table">
|
82 |
-
<tbody>
|
83 |
-
<tr>
|
84 |
-
<th scope="row"><label for="api_key"><?php _e( 'API Key', 'imagify' ); ?></label></th>
|
85 |
-
<td>
|
86 |
-
<input type="text" size="35" value="<?php echo esc_attr( get_imagify_option( 'api_key' ) ); ?>" name="<?php echo IMAGIFY_SETTINGS_SLUG; ?>[api_key]" id="api_key">
|
87 |
-
<?php
|
88 |
-
if ( imagify_valid_key() ) {
|
89 |
-
?>
|
90 |
-
<span id="imagify-check-api-container" class="imagify-valid">
|
91 |
-
<span class="dashicons dashicons-yes"></span> <?php _e( 'Your API key is valid.', 'imagify' ); ?>
|
92 |
-
</span>
|
93 |
-
<?php
|
94 |
-
} elseif ( ! imagify_valid_key() && get_imagify_option( 'api_key', false ) ) { ?>
|
95 |
|
96 |
-
|
97 |
-
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
99 |
|
100 |
-
|
101 |
-
|
|
|
102 |
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
115 |
|
116 |
<div class="imagify-settings-section <?php echo ( ! imagify_valid_key() ) ? 'hidden' : ''; ?>">
|
117 |
|
@@ -145,7 +169,8 @@ function _imagify_display_options_page() {
|
|
145 |
<p class="imagify-visual-comparison-text">
|
146 |
<?php
|
147 |
printf(
|
148 |
-
|
|
|
149 |
'<button type="button" class="button button-primary button-mini-flat imagify-visual-comparison-btn imagify-modal-trigger" data-target="#imagify-visual-comparison">',
|
150 |
'</button>'
|
151 |
);
|
@@ -186,21 +211,23 @@ function _imagify_display_options_page() {
|
|
186 |
|
187 |
<p id="describe-resize-larger" class="imagify-options-line">
|
188 |
<?php
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
)
|
|
|
194 |
?>
|
195 |
</p>
|
196 |
|
197 |
<p class="imagify-checkbox-marged">
|
198 |
<span class="imagify-info">
|
199 |
<span class="dashicons dashicons-info"></span>
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
|
|
204 |
</span>
|
205 |
</p>
|
206 |
</td>
|
@@ -217,49 +244,51 @@ function _imagify_display_options_page() {
|
|
217 |
<a href="https://en.wikipedia.org/wiki/Exchangeable_image_file_format" target="_blank"><?php _e( 'Learn more', 'imagify' ); ?></a>
|
218 |
<br/><br/>
|
219 |
<?php _e( 'If you are a photographer, you may be interested in this option if you are displaying on your pages some info like the model of your camera.', 'imagify' ); ?>
|
220 |
-
|
221 |
</span>
|
222 |
</td>
|
223 |
</tr>
|
224 |
-
<?php
|
225 |
-
if ( ! imagify_is_active_for_network() ) { ?>
|
226 |
|
227 |
-
|
228 |
-
|
229 |
-
<
|
230 |
-
<
|
231 |
-
|
232 |
-
<
|
233 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
234 |
<br>
|
235 |
-
<span class="imagify-important">
|
236 |
-
<?php _e( 'Remember each additional image size will affect your Imagify monthly usage!', 'imagify' ); ?>
|
237 |
-
</span>
|
238 |
-
</p>
|
239 |
|
240 |
-
|
|
|
241 |
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
|
|
|
|
|
|
|
|
248 |
?>
|
249 |
-
|
250 |
-
|
251 |
-
<label for="imagify_sizes_<?php echo $size_key; ?>" onclick=""><?php echo $label; ?></label>
|
252 |
-
<br class="imagify-br">
|
253 |
|
254 |
-
|
255 |
-
}
|
256 |
-
?>
|
257 |
-
</td>
|
258 |
-
</tr>
|
259 |
|
260 |
-
<?php
|
261 |
-
}
|
262 |
-
?>
|
263 |
</tbody>
|
264 |
</table>
|
265 |
|
@@ -288,21 +317,28 @@ function _imagify_display_options_page() {
|
|
288 |
</div>
|
289 |
<div class="submit">
|
290 |
<?php
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
?>
|
303 |
|
304 |
<div class="imagify-bulk-info">
|
305 |
-
<p><?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
306 |
</div>
|
307 |
</div>
|
308 |
</form>
|
@@ -310,7 +346,7 @@ function _imagify_display_options_page() {
|
|
310 |
|
311 |
<div id="imagify-more-info" class="imagify-modal">
|
312 |
<div class="imagify-modal-content">
|
313 |
-
<p class="h2"><?php _e('You can choose three levels of compression', 'imagify'); ?></p>
|
314 |
<div class="imagify-columns">
|
315 |
<div class="col-1-3">
|
316 |
<p class="h3"><?php _e( 'Normal', 'imagify' ); ?></p>
|
@@ -324,7 +360,7 @@ function _imagify_display_options_page() {
|
|
324 |
<em><?php _e( 'Note: the file size reduction will be less, compared to aggressive mode.', 'imagify' ); ?></em>
|
325 |
</p>
|
326 |
</div>
|
327 |
-
|
328 |
<div class="col-1-3">
|
329 |
<p class="h3"><?php _e( 'Aggressive', 'imagify' ); ?></p>
|
330 |
<p>
|
@@ -365,40 +401,53 @@ function _imagify_display_options_page() {
|
|
365 |
|
366 |
<p class="imagify-comparison-title">
|
367 |
<?php
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
|
|
373 |
?>
|
374 |
</p>
|
375 |
|
376 |
<div class="twentytwenty-container"
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
402 |
|
403 |
<div class="imagify-comparison-levels">
|
404 |
<div class="imagify-c-level imagify-level-original go-left">
|
@@ -408,7 +457,7 @@ function _imagify_display_options_page() {
|
|
408 |
</p>
|
409 |
<p class="imagify-c-level-row">
|
410 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
411 |
-
<span class="value"><?php echo size_format(343040); ?></span>
|
412 |
</p>
|
413 |
</div>
|
414 |
<div class="imagify-c-level imagify-level-optimized imagify-level-normal" aria-hidden="true">
|
@@ -418,7 +467,7 @@ function _imagify_display_options_page() {
|
|
418 |
</p>
|
419 |
<p class="imagify-c-level-row">
|
420 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
421 |
-
<span class="value size"><?php echo size_format(301056); ?></span>
|
422 |
</p>
|
423 |
<p class="imagify-c-level-row">
|
424 |
<span class="label"><?php _e( 'Original Saving:', 'imagify' ); ?></span>
|
@@ -438,7 +487,7 @@ function _imagify_display_options_page() {
|
|
438 |
</p>
|
439 |
<p class="imagify-c-level-row">
|
440 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
441 |
-
<span class="value size"><?php echo size_format(108544); ?></span>
|
442 |
</p>
|
443 |
<p class="imagify-c-level-row">
|
444 |
<span class="label"><?php _e( 'Original Saving:', 'imagify' ); ?></span>
|
@@ -459,7 +508,7 @@ function _imagify_display_options_page() {
|
|
459 |
</p>
|
460 |
<p class="imagify-c-level-row">
|
461 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
462 |
-
<span class="value size"><?php echo size_format(46080); ?></span>
|
463 |
</p>
|
464 |
<p class="imagify-c-level-row">
|
465 |
<span class="label"><?php _e( 'Original Saving:', 'imagify' ); ?></span>
|
@@ -485,4 +534,4 @@ function _imagify_display_options_page() {
|
|
485 |
|
486 |
</div>
|
487 |
<?php
|
488 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
* The main settings page construtor using the required functions from WP
|
9 |
function _imagify_display_options_page() {
|
10 |
global $_wp_additional_image_sizes, $wp_version;
|
11 |
|
12 |
+
if ( isset( $_POST['submit-goto-bulk'] ) ) { // WPCS: CSRF ok.
|
13 |
wp_safe_redirect( get_admin_url( get_current_blog_id(), 'upload.php?page=imagify-bulk-optimization' ) );
|
14 |
}
|
15 |
?>
|
16 |
<div class="wrap imagify-settings">
|
17 |
+
|
18 |
+
<?php if ( ! defined( 'WP_ROCKET_VERSION' ) ) { ?>
|
19 |
+
|
20 |
<div class="imagify-col imagify-sidebar">
|
21 |
<div class="imagify-sidebar-section">
|
22 |
<span class="imagify-sidebar-title">
|
32 |
<p class="imagify-big-text">
|
33 |
<?php
|
34 |
$discount_percent = '20%';
|
35 |
+
$discount_code = 'IMAGIFY20';
|
36 |
+
|
37 |
+
printf(
|
38 |
+
/* translators: 1 is the start of a styled wrapper, 2 is a "bold" tag start, 3 is a percentage, 4 is the "bold" tag end, 5 is the styled wrapper end, 6 is a discount code. */
|
39 |
+
__( '%1$sGet %2$s%3$s off%4$s%5$s with this coupon code: %6$s', 'imagify' ),
|
40 |
+
'<span class="imagify-mark-styled"><span>',
|
41 |
+
'<strong>',
|
42 |
+
$discount_percent,
|
43 |
+
'</strong>',
|
44 |
+
'</span></span>',
|
45 |
+
'<span class="imagify-discount-code">' . $discount_code . '</span>'
|
46 |
+
);
|
47 |
?>
|
48 |
</p>
|
49 |
|
55 |
</ul>
|
56 |
</div>
|
57 |
</div>
|
58 |
+
|
59 |
+
<?php } // End if(). ?>
|
|
|
60 |
|
61 |
<div class="imagify-col imagify-main">
|
62 |
+
<?php $heading_tag = version_compare( $wp_version, '4.3' ) >= 0 ? 'h1' : 'h2'; ?>
|
63 |
<div class="imagify-title">
|
64 |
<img width="225" height="26" alt="Imagify" src="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>imagify-logo.png" class="imagify-logo" /> <small><sup><?php echo IMAGIFY_VERSION; ?></sup></small>
|
65 |
|
66 |
+
<?php $imagify_rate_url = 'https://wordpress.org/support/view/plugin-reviews/imagify?rate=5#postform'; ?>
|
67 |
<p class="imagify-rate-us">
|
68 |
+
<?php printf(
|
69 |
+
/* translators: 1 is a "bold" tag start, 2 is the "bold" tag end + a line break tag, 3 is a link tag start, 4 is the link tag end. */
|
70 |
+
__( '%1$sDo you like this plugin?%2$s Please take a few seconds to %3$srate it on WordPress.org%4$s!', 'imagify' ),
|
71 |
+
'<strong>',
|
72 |
+
'</strong><br />',
|
73 |
+
'<a href="' . $imagify_rate_url . '">',
|
74 |
+
'</a>'
|
75 |
+
); ?>
|
76 |
<br>
|
77 |
<a class="stars" href="<?php echo $imagify_rate_url; ?>"><?php echo str_repeat( '<span class="dashicons dashicons-star-filled"></span>', 5 ); ?></a>
|
78 |
</p>
|
91 |
|
92 |
<?php echo get_imagify_new_to_imagify(); ?>
|
93 |
|
94 |
+
<?php if ( ! defined( 'IMAGIFY_API_KEY' ) || ! IMAGIFY_API_KEY ) { ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
|
96 |
+
<div class="imagify-sub-header">
|
97 |
+
<table class="form-table">
|
98 |
+
<tbody>
|
99 |
+
<tr>
|
100 |
+
<th scope="row"><label for="api_key"><?php _e( 'API Key', 'imagify' ); ?></label></th>
|
101 |
+
<td>
|
102 |
+
<input type="text" size="35" value="<?php echo esc_attr( get_imagify_option( 'api_key' ) ); ?>" name="<?php echo IMAGIFY_SETTINGS_SLUG; ?>[api_key]" id="api_key">
|
103 |
+
<?php
|
104 |
+
if ( imagify_valid_key() ) {
|
105 |
+
?>
|
106 |
|
107 |
+
<span id="imagify-check-api-container" class="imagify-valid">
|
108 |
+
<span class="dashicons dashicons-yes"></span> <?php _e( 'Your API key is valid.', 'imagify' ); ?>
|
109 |
+
</span>
|
110 |
|
111 |
+
<?php
|
112 |
+
} elseif ( ! imagify_valid_key() && get_imagify_option( 'api_key', false ) ) { ?>
|
113 |
+
|
114 |
+
<span id="imagify-check-api-container">
|
115 |
+
<span class="dashicons dashicons-no"></span> <?php _e( 'Your API key isn\'t valid!', 'imagify' ); ?>
|
116 |
+
</span>
|
117 |
+
|
118 |
+
<?php
|
119 |
+
}
|
120 |
+
|
121 |
+
if ( ! get_imagify_option( 'api_key', false ) ) {
|
122 |
+
echo '<p class="description desc api_key">';
|
123 |
+
printf(
|
124 |
+
/* translators: 1 is a link tag start, 2 is the link tag end. */
|
125 |
+
__( 'Don\'t have an API Key yet? %1$sCreate one, it\'s FREE%2$s.', 'imagify' ),
|
126 |
+
'<a id="imagify-signup" href="' . IMAGIFY_APP_MAIN . '/#/register">',
|
127 |
+
'</a>'
|
128 |
+
);
|
129 |
+
echo '</p>';
|
130 |
+
}
|
131 |
+
?>
|
132 |
+
</td>
|
133 |
+
</tr>
|
134 |
+
</tbody>
|
135 |
+
</table>
|
136 |
+
</div>
|
137 |
+
|
138 |
+
<?php } // End if(). ?>
|
139 |
|
140 |
<div class="imagify-settings-section <?php echo ( ! imagify_valid_key() ) ? 'hidden' : ''; ?>">
|
141 |
|
169 |
<p class="imagify-visual-comparison-text">
|
170 |
<?php
|
171 |
printf(
|
172 |
+
/* translators: 1 is a button tag start, 2 is the button tag end. */
|
173 |
+
__( 'Need help to choose? %1$sTry the Visual Comparison%2$s', 'imagify' ),
|
174 |
'<button type="button" class="button button-primary button-mini-flat imagify-visual-comparison-btn imagify-modal-trigger" data-target="#imagify-visual-comparison">',
|
175 |
'</button>'
|
176 |
);
|
211 |
|
212 |
<p id="describe-resize-larger" class="imagify-options-line">
|
213 |
<?php
|
214 |
+
$max_sizes = get_imagify_max_intermediate_image_size();
|
215 |
+
printf(
|
216 |
+
/* translators: 1 is a text input for a number of pixels (don't use %d). */
|
217 |
+
__( 'to maximum %s pixels width', 'imagify' ),
|
218 |
+
'<input type="number" min="' . $max_sizes['width'] . '" name="' . IMAGIFY_SETTINGS_SLUG . '[resize_larger_w]" value="' . get_imagify_option( 'resize_larger_w', false ) . '" size="5">'
|
219 |
+
);
|
220 |
?>
|
221 |
</p>
|
222 |
|
223 |
<p class="imagify-checkbox-marged">
|
224 |
<span class="imagify-info">
|
225 |
<span class="dashicons dashicons-info"></span>
|
226 |
+
<?php printf(
|
227 |
+
/* translators: 1 is a number of pixels. */
|
228 |
+
__( 'This option is recommended to reduce larger images. You can save up to 80%% after resizing. The new width should not be less than your largest thumbnail width, which is actually %dpx.', 'imagify' ),
|
229 |
+
$max_sizes['width']
|
230 |
+
); ?>
|
231 |
</span>
|
232 |
</p>
|
233 |
</td>
|
244 |
<a href="https://en.wikipedia.org/wiki/Exchangeable_image_file_format" target="_blank"><?php _e( 'Learn more', 'imagify' ); ?></a>
|
245 |
<br/><br/>
|
246 |
<?php _e( 'If you are a photographer, you may be interested in this option if you are displaying on your pages some info like the model of your camera.', 'imagify' ); ?>
|
247 |
+
|
248 |
</span>
|
249 |
</td>
|
250 |
</tr>
|
|
|
|
|
251 |
|
252 |
+
<?php if ( ! imagify_is_active_for_network() ) { ?>
|
253 |
+
|
254 |
+
<tr>
|
255 |
+
<th scope="row"><?php _e( 'Files optimization', 'imagify' ); ?></th>
|
256 |
+
<td>
|
257 |
+
<p>
|
258 |
+
<?php _e( 'You can choose to compress different image sizes created by WordPress here.', 'imagify' ); ?>
|
259 |
+
<br/>
|
260 |
+
<?php printf(
|
261 |
+
/* translators: 1 is a "bold" tag start, 2 is the "bold" tag end. */
|
262 |
+
__( 'The %1$soriginal size%2$s is %1$sautomatically optimized%2$s by Imagify.', 'imagify' ),
|
263 |
+
'<strong>', '</strong>'
|
264 |
+
); ?>
|
265 |
+
<br>
|
266 |
+
<span class="imagify-important">
|
267 |
+
<?php _e( 'Remember each additional image size will affect your Imagify monthly usage!', 'imagify' ); ?>
|
268 |
+
</span>
|
269 |
+
</p>
|
270 |
+
|
271 |
<br>
|
|
|
|
|
|
|
|
|
272 |
|
273 |
+
<?php
|
274 |
+
$sizes = get_imagify_thumbnail_sizes();
|
275 |
|
276 |
+
foreach ( $sizes as $size_key => $size_data ) {
|
277 |
+
$label = esc_html( stripslashes( $size_data['name'] ) );
|
278 |
+
$label = sprintf( '%s - %d × %d', $label, $size_data['width'], $size_data['height'] );
|
279 |
+
?>
|
280 |
+
<input type="hidden" name="<?php echo IMAGIFY_SETTINGS_SLUG; ?>[sizes][<?php echo $size_key; ?>-hidden]" value="1" />
|
281 |
+
<input type="checkbox" id="imagify_sizes_<?php echo $size_key; ?>" class="mini" name="<?php echo IMAGIFY_SETTINGS_SLUG; ?>[sizes][<?php echo $size_key; ?>]" value="1" <?php echo ( ! array_key_exists( $size_key, get_imagify_option( 'disallowed-sizes', array() ) ) ) ? 'checked="checked"' : '' ?> />
|
282 |
+
<label for="imagify_sizes_<?php echo $size_key; ?>" onclick=""><?php echo $label; ?></label>
|
283 |
+
<br class="imagify-br">
|
284 |
+
<?php
|
285 |
+
}
|
286 |
?>
|
287 |
+
</td>
|
288 |
+
</tr>
|
|
|
|
|
289 |
|
290 |
+
<?php } // End if(). ?>
|
|
|
|
|
|
|
|
|
291 |
|
|
|
|
|
|
|
292 |
</tbody>
|
293 |
</table>
|
294 |
|
317 |
</div>
|
318 |
<div class="submit">
|
319 |
<?php
|
320 |
+
// Classical submit.
|
321 |
+
submit_button();
|
322 |
+
|
323 |
+
// Submit and go to bulk page.
|
324 |
+
submit_button(
|
325 |
+
esc_html__( 'Save & Go to Bulk Optimizer', 'imagify' ),
|
326 |
+
'secondary imagify-button-secondary', // Type/classes.
|
327 |
+
'submit-goto-bulk', // Name (id).
|
328 |
+
true, // Wrap.
|
329 |
+
array() // Other attributes.
|
330 |
+
);
|
331 |
?>
|
332 |
|
333 |
<div class="imagify-bulk-info">
|
334 |
+
<p><?php
|
335 |
+
printf(
|
336 |
+
/* translators: 1 is a link tag start, 2 is the link tag end. */
|
337 |
+
__( 'Once your settings saved, optimize all your images by using the %1$sImagify Bulk Optimization%2$s feature.', 'imagify' ),
|
338 |
+
'<a href="' . esc_url( get_admin_url() ) . 'upload.php?page=' . IMAGIFY_SLUG . '-bulk-optimization">',
|
339 |
+
'</a>'
|
340 |
+
);
|
341 |
+
?></p>
|
342 |
</div>
|
343 |
</div>
|
344 |
</form>
|
346 |
|
347 |
<div id="imagify-more-info" class="imagify-modal">
|
348 |
<div class="imagify-modal-content">
|
349 |
+
<p class="h2"><?php _e( 'You can choose three levels of compression', 'imagify' ); ?></p>
|
350 |
<div class="imagify-columns">
|
351 |
<div class="col-1-3">
|
352 |
<p class="h3"><?php _e( 'Normal', 'imagify' ); ?></p>
|
360 |
<em><?php _e( 'Note: the file size reduction will be less, compared to aggressive mode.', 'imagify' ); ?></em>
|
361 |
</p>
|
362 |
</div>
|
363 |
+
|
364 |
<div class="col-1-3">
|
365 |
<p class="h3"><?php _e( 'Aggressive', 'imagify' ); ?></p>
|
366 |
<p>
|
401 |
|
402 |
<p class="imagify-comparison-title">
|
403 |
<?php
|
404 |
+
printf(
|
405 |
+
/* translators: 1 and 2 are optimization levels: "Original", "Normal", "Aggressive", or "Ultra". */
|
406 |
+
__( 'I want to compare %1$s and %2$s', 'imagify' ),
|
407 |
+
'<span class="twentytwenty-left-buttons"></span>',
|
408 |
+
'<span class="twentytwenty-right-buttons"></span>'
|
409 |
+
);
|
410 |
?>
|
411 |
</p>
|
412 |
|
413 |
<div class="twentytwenty-container"
|
414 |
+
data-loader="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>loader-balls.svg"
|
415 |
+
data-label-original="<?php esc_attr_e( 'Original', 'imagify' ); ?>"
|
416 |
+
data-label-normal="<?php esc_attr_e( 'Normal', 'imagify' ); ?>"
|
417 |
+
data-label-aggressive="<?php esc_attr_e( 'Aggressive', 'imagify' ); ?>"
|
418 |
+
data-label-ultra="<?php esc_attr_e( 'Ultra', 'imagify' ); ?>"
|
419 |
+
|
420 |
+
data-original-label="<?php esc_attr_e( 'Original', 'imagify' ); ?>"
|
421 |
+
data-original-img="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>mushrooms-original.jpg"
|
422 |
+
data-original-dim="1220x350"
|
423 |
+
data-original-alt="<?php
|
424 |
+
/* translators: %s is a formatted file size. */
|
425 |
+
printf( esc_attr__( 'Original photography about %s', 'imagify' ), size_format( 343040 ) );
|
426 |
+
?>"
|
427 |
+
|
428 |
+
data-normal-label="<?php esc_attr_e( 'Normal', 'imagify' ); ?>"
|
429 |
+
data-normal-img="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>mushrooms-normal.jpg"
|
430 |
+
data-normal-dim="1220x350"
|
431 |
+
data-normal-alt="<?php
|
432 |
+
/* translators: %s is a formatted file size. */
|
433 |
+
printf( esc_attr__( 'Optimized photography about %s', 'imagify' ), size_format( 301056 ) );
|
434 |
+
?>"
|
435 |
+
|
436 |
+
data-aggressive-label="<?php esc_attr_e( 'Aggressive', 'imagify' ); ?>"
|
437 |
+
data-aggressive-img="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>mushrooms-aggressive.jpg"
|
438 |
+
data-aggressive-dim="1220x350"
|
439 |
+
data-aggressive-alt="<?php
|
440 |
+
/* translators: %s is a formatted file size. */
|
441 |
+
printf( esc_attr__( 'Optimized photography about %s', 'imagify' ), size_format( 108544 ) );
|
442 |
+
?>"
|
443 |
+
|
444 |
+
data-ultra-label="<?php esc_attr_e( 'Ultra', 'imagify' ); ?>"
|
445 |
+
data-ultra-img="<?php echo IMAGIFY_ASSETS_IMG_URL; ?>mushrooms-ultra.jpg"
|
446 |
+
data-ultra-dim="1220x350"
|
447 |
+
data-ultra-alt="<?php
|
448 |
+
/* translators: %s is a formatted file size. */
|
449 |
+
printf( esc_attr__( 'Optimized photography about %s', 'imagify' ), size_format( 46080 ) );
|
450 |
+
?>"></div>
|
451 |
|
452 |
<div class="imagify-comparison-levels">
|
453 |
<div class="imagify-c-level imagify-level-original go-left">
|
457 |
</p>
|
458 |
<p class="imagify-c-level-row">
|
459 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
460 |
+
<span class="value"><?php echo size_format( 343040 ); ?></span>
|
461 |
</p>
|
462 |
</div>
|
463 |
<div class="imagify-c-level imagify-level-optimized imagify-level-normal" aria-hidden="true">
|
467 |
</p>
|
468 |
<p class="imagify-c-level-row">
|
469 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
470 |
+
<span class="value size"><?php echo size_format( 301056 ); ?></span>
|
471 |
</p>
|
472 |
<p class="imagify-c-level-row">
|
473 |
<span class="label"><?php _e( 'Original Saving:', 'imagify' ); ?></span>
|
487 |
</p>
|
488 |
<p class="imagify-c-level-row">
|
489 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
490 |
+
<span class="value size"><?php echo size_format( 108544 ); ?></span>
|
491 |
</p>
|
492 |
<p class="imagify-c-level-row">
|
493 |
<span class="label"><?php _e( 'Original Saving:', 'imagify' ); ?></span>
|
508 |
</p>
|
509 |
<p class="imagify-c-level-row">
|
510 |
<span class="label"><?php _e( 'File Size:', 'imagify' ); ?></span>
|
511 |
+
<span class="value size"><?php echo size_format( 46080 ); ?></span>
|
512 |
</p>
|
513 |
<p class="imagify-c-level-row">
|
514 |
<span class="label"><?php _e( 'Original Saving:', 'imagify' ); ?></span>
|
534 |
|
535 |
</div>
|
536 |
<?php
|
537 |
+
}
|
inc/admin/upgrader.php
CHANGED
@@ -1,142 +1,145 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
-
|
|
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*/
|
9 |
-
add_action( 'admin_init', '_imagify_upgrader' );
|
10 |
function _imagify_upgrader() {
|
11 |
$current_version = get_imagify_option( 'version' );
|
12 |
|
13 |
-
// You can hook the upgrader to trigger any action when Imagify is upgraded
|
14 |
-
//
|
15 |
if ( ! $current_version ) {
|
16 |
do_action( 'imagify_first_install' );
|
17 |
}
|
18 |
-
//
|
19 |
-
elseif ( IMAGIFY_VERSION
|
20 |
do_action( 'imagify_upgrade', IMAGIFY_VERSION, $current_version );
|
21 |
}
|
22 |
|
23 |
-
// If any upgrade has been done, we flush and update version
|
24 |
if ( did_action( 'imagify_first_install' ) || did_action( 'imagify_upgrade' ) ) {
|
25 |
-
$options = get_site_option( IMAGIFY_SETTINGS_SLUG ); //
|
26 |
$options['version'] = IMAGIFY_VERSION;
|
27 |
|
28 |
update_site_option( IMAGIFY_SETTINGS_SLUG, $options );
|
29 |
}
|
30 |
}
|
31 |
|
|
|
32 |
/**
|
33 |
-
* Keeps this function up to date at each version
|
34 |
*
|
35 |
* @since 1.0
|
36 |
*/
|
37 |
-
|
38 |
-
function _imagify_first_install() {
|
39 |
// Set a transient to know when we will have to display a notice to ask the user to rate the plugin.
|
40 |
set_site_transient( 'imagify_seen_rating_notice', true, DAY_IN_SECONDS * 3 );
|
41 |
-
|
42 |
-
// Create Options
|
43 |
-
add_site_option( IMAGIFY_SETTINGS_SLUG,
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
)
|
55 |
-
);
|
56 |
}
|
57 |
|
|
|
58 |
/**
|
59 |
-
* What to do when Imagify is updated, depending on versions
|
60 |
*
|
61 |
* @since 1.0
|
|
|
|
|
|
|
62 |
*/
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
);
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
91 |
}
|
92 |
}
|
93 |
-
|
94 |
-
// Auto-activate the Admin Bar option
|
95 |
$options = get_site_option( IMAGIFY_SETTINGS_SLUG );
|
96 |
$options['admin_bar_menu'] = 1;
|
97 |
update_site_option( IMAGIFY_SETTINGS_SLUG, $options );
|
98 |
}
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
),
|
117 |
),
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
);
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
|
|
134 |
}
|
135 |
}
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
$wpdb->query( 'DELETE from ' . $wpdb->options . ' WHERE option_name LIKE "_transient_imagify-async-in-progress-%"' );
|
141 |
}
|
142 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' );
|
3 |
|
4 |
+
add_action( 'admin_init', '_imagify_upgrader' );
|
5 |
+
/**
|
6 |
+
* Tell WP what to do when admin is loaded aka upgrader.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
*/
|
|
|
10 |
function _imagify_upgrader() {
|
11 |
$current_version = get_imagify_option( 'version' );
|
12 |
|
13 |
+
// You can hook the upgrader to trigger any action when Imagify is upgraded.
|
14 |
+
// First install.
|
15 |
if ( ! $current_version ) {
|
16 |
do_action( 'imagify_first_install' );
|
17 |
}
|
18 |
+
// Already installed but got updated.
|
19 |
+
elseif ( IMAGIFY_VERSION !== $current_version ) {
|
20 |
do_action( 'imagify_upgrade', IMAGIFY_VERSION, $current_version );
|
21 |
}
|
22 |
|
23 |
+
// If any upgrade has been done, we flush and update version.
|
24 |
if ( did_action( 'imagify_first_install' ) || did_action( 'imagify_upgrade' ) ) {
|
25 |
+
$options = get_site_option( IMAGIFY_SETTINGS_SLUG ); // Do not use get_imagify_option() here.
|
26 |
$options['version'] = IMAGIFY_VERSION;
|
27 |
|
28 |
update_site_option( IMAGIFY_SETTINGS_SLUG, $options );
|
29 |
}
|
30 |
}
|
31 |
|
32 |
+
add_action( 'imagify_first_install', '_imagify_first_install' );
|
33 |
/**
|
34 |
+
* Keeps this function up to date at each version.
|
35 |
*
|
36 |
* @since 1.0
|
37 |
*/
|
38 |
+
function _imagify_first_install() {
|
|
|
39 |
// Set a transient to know when we will have to display a notice to ask the user to rate the plugin.
|
40 |
set_site_transient( 'imagify_seen_rating_notice', true, DAY_IN_SECONDS * 3 );
|
41 |
+
|
42 |
+
// Create Options.
|
43 |
+
add_site_option( IMAGIFY_SETTINGS_SLUG, array(
|
44 |
+
'api_key' => '',
|
45 |
+
'optimization_level' => 1,
|
46 |
+
'auto_optimize' => 1,
|
47 |
+
'backup' => 1,
|
48 |
+
'resize_larger' => '',
|
49 |
+
'resize_larger_w' => '',
|
50 |
+
'exif' => 0,
|
51 |
+
'disallowed-sizes' => array(),
|
52 |
+
'admin_bar_menu' => 1,
|
53 |
+
) );
|
|
|
|
|
54 |
}
|
55 |
|
56 |
+
add_action( 'imagify_upgrade', '_imagify_new_upgrade', 10, 2 );
|
57 |
/**
|
58 |
+
* What to do when Imagify is updated, depending on versions.
|
59 |
*
|
60 |
* @since 1.0
|
61 |
+
*
|
62 |
+
* @param string $imagify_version New Imagify version.
|
63 |
+
* @param string $current_version Old Imagify version.
|
64 |
*/
|
65 |
+
function _imagify_new_upgrade( $imagify_version, $current_version ) {
|
66 |
+
global $wpdb;
|
67 |
+
|
68 |
+
// 1.2
|
69 |
+
if ( version_compare( $current_version, '1.2' ) < 0 ) {
|
70 |
+
// Update all already optimized images status from 'error' to 'already_optimized'.
|
71 |
+
$query = new WP_Query( array(
|
72 |
+
'post_type' => 'attachment',
|
73 |
+
'post_status' => 'inherit',
|
74 |
+
'post_mime_type' => 'image',
|
75 |
+
'meta_key' => '_imagify_status',
|
76 |
+
'meta_value' => 'error',
|
77 |
+
'posts_per_page' => -1,
|
78 |
+
'update_post_term_cache' => false,
|
79 |
+
'no_found_rows' => true,
|
80 |
+
'fields' => 'ids',
|
81 |
+
) );
|
82 |
+
|
83 |
+
if ( $query->posts ) {
|
84 |
+
foreach ( (array) $query->posts as $id ) {
|
85 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
86 |
+
$attachment = new $class_name( $id );
|
87 |
+
$attachment_error = $attachment->get_optimized_error();
|
88 |
+
$attachment_error = trim( $attachment_error );
|
89 |
+
$attachment_status = get_post_meta( $id, '_imagify_status', true );
|
90 |
+
|
91 |
+
if ( false !== strpos( $attachment_error, 'This image is already compressed' ) ) {
|
92 |
+
update_post_meta( $id, '_imagify_status', 'already_optimized' );
|
93 |
+
}
|
94 |
}
|
95 |
}
|
96 |
+
|
97 |
+
// Auto-activate the Admin Bar option.
|
98 |
$options = get_site_option( IMAGIFY_SETTINGS_SLUG );
|
99 |
$options['admin_bar_menu'] = 1;
|
100 |
update_site_option( IMAGIFY_SETTINGS_SLUG, $options );
|
101 |
}
|
102 |
+
|
103 |
+
// 1.3.2
|
104 |
+
if ( version_compare( $current_version, '1.3.2' ) < 0 ) {
|
105 |
+
// Update all already optimized images status from 'error' to 'already_optimized'.
|
106 |
+
$query = new WP_Query( array(
|
107 |
+
'post_type' => 'attachment',
|
108 |
+
'post_status' => 'inherit',
|
109 |
+
'post_mime_type' => 'image',
|
110 |
+
'meta_query' => array(
|
111 |
+
'relation' => 'AND',
|
112 |
+
array(
|
113 |
+
'key' => '_imagify_data',
|
114 |
+
'compare' => 'EXISTS',
|
115 |
+
),
|
116 |
+
array(
|
117 |
+
'key' => '_imagify_optimization_level',
|
118 |
+
'compare' => 'NOT EXISTS',
|
|
|
119 |
),
|
120 |
+
),
|
121 |
+
'posts_per_page' => -1,
|
122 |
+
'update_post_term_cache' => false,
|
123 |
+
'no_found_rows' => true,
|
124 |
+
'fields' => 'ids',
|
125 |
+
) );
|
126 |
+
|
127 |
+
if ( $query->posts ) {
|
128 |
+
foreach ( (array) $query->posts as $id ) {
|
129 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
130 |
+
$attachment = new $class_name( $id );
|
131 |
+
$attachment_stats = $attachment->get_stats_data();
|
132 |
+
|
133 |
+
if ( isset( $attachment_stats['aggressive'] ) ) {
|
134 |
+
update_post_meta( $id, '_imagify_optimization_level', (int) $attachment_stats['aggressive'] );
|
135 |
+
}
|
136 |
+
}
|
137 |
}
|
138 |
}
|
139 |
+
|
140 |
+
// 1.4.5
|
141 |
+
if ( version_compare( $current_version, '1.4.5' ) < 0 ) {
|
142 |
+
// Delete all transients used for async optimization.
|
143 |
$wpdb->query( 'DELETE from ' . $wpdb->options . ' WHERE option_name LIKE "_transient_imagify-async-in-progress-%"' );
|
144 |
}
|
145 |
+
}
|
inc/admin/upload.php
CHANGED
@@ -1,33 +1,49 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
-
|
|
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @author Jonathan Buttigieg
|
|
|
|
|
|
|
9 |
*/
|
10 |
-
add_filter( 'manage_media_columns', '_imagify_manage_media_columns' );
|
11 |
function _imagify_manage_media_columns( $columns ) {
|
12 |
$columns['imagify_optimized_file'] = __( 'Imagify', 'imagify' );
|
13 |
return $columns;
|
14 |
}
|
15 |
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
function _imagify_manage_media_custom_column( $column_name, $attachment_id ) {
|
18 |
-
if ( 'imagify_optimized_file'
|
19 |
-
|
20 |
-
echo get_imagify_media_column_content( $attachment );
|
21 |
}
|
|
|
|
|
|
|
|
|
|
|
22 |
}
|
23 |
|
24 |
-
|
|
|
25 |
* Adds a dropdown that allows filtering on the attachments Imagify status.
|
26 |
*
|
27 |
* @since 1.0
|
28 |
* @author Jonathan Buttigieg
|
29 |
*/
|
30 |
-
add_action( 'restrict_manage_posts', '_imagify_attachments_filter_dropdown' );
|
31 |
function _imagify_attachments_filter_dropdown() {
|
32 |
if ( 'upload.php' !== $GLOBALS['pagenow'] ) {
|
33 |
return;
|
@@ -36,50 +52,48 @@ function _imagify_attachments_filter_dropdown() {
|
|
36 |
$optimized = imagify_count_optimized_attachments();
|
37 |
$unoptimized = imagify_count_unoptimized_attachments();
|
38 |
$errors = imagify_count_error_attachments();
|
39 |
-
$status
|
40 |
-
$options
|
41 |
'optimized' => __( 'Optimized','imagify' ),
|
42 |
'unoptimized' => __( 'Unoptimized','imagify' ),
|
43 |
'errors' => __( 'Errors','imagify' ),
|
44 |
);
|
45 |
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
$output .= '<option value="0" selected="selected">' . __( 'All images','imagify' ) . '</option>';
|
50 |
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
$output .= '</select> ';
|
56 |
-
|
57 |
-
echo $output;
|
58 |
}
|
59 |
|
|
|
60 |
/**
|
61 |
-
* Modify the query based on the imagify-status variable in $_GET
|
62 |
*
|
63 |
* @since 1.0
|
64 |
* @author Jonathan Buttigieg
|
|
|
|
|
|
|
65 |
*/
|
66 |
-
add_filter( 'request', '_imagify_sort_attachments_by_status' );
|
67 |
function _imagify_sort_attachments_by_status( $vars ) {
|
68 |
-
if ( 'upload.php' !== $GLOBALS['pagenow'] || empty( $_GET['imagify-status'] ) ) {
|
69 |
return $vars;
|
70 |
}
|
71 |
-
|
72 |
-
$status = $_GET['imagify-status'];
|
73 |
$meta_key = '_imagify_status';
|
74 |
$meta_compare = '=';
|
75 |
$relation = array();
|
76 |
-
|
77 |
-
switch( $status ) {
|
78 |
case 'unoptimized':
|
79 |
$meta_key = '_imagify_data';
|
80 |
$meta_compare = 'NOT EXISTS';
|
81 |
-
|
82 |
-
|
83 |
case 'optimized':
|
84 |
$status = 'success';
|
85 |
$relation = array(
|
@@ -87,28 +101,24 @@ function _imagify_sort_attachments_by_status( $vars ) {
|
|
87 |
'value' => 'already_optimized',
|
88 |
'compare' => $meta_compare,
|
89 |
);
|
90 |
-
|
91 |
-
|
92 |
case 'errors':
|
93 |
$status = 'error';
|
94 |
-
break;
|
95 |
}
|
96 |
-
|
97 |
-
$vars
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
'
|
103 |
-
|
104 |
-
'key' => $meta_key,
|
105 |
-
'value' => $status,
|
106 |
-
'compare' => $meta_compare,
|
107 |
-
),
|
108 |
-
$relation
|
109 |
),
|
110 |
-
|
111 |
-
|
112 |
-
|
|
|
|
|
|
|
113 |
return $vars;
|
114 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_filter( 'manage_media_columns', '_imagify_manage_media_columns' );
|
5 |
+
/**
|
6 |
+
* Add "Imagify" column in upload.php.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
* @author Jonathan Buttigieg
|
10 |
+
*
|
11 |
+
* @param array $columns An array of columns displayed in the Media list table.
|
12 |
+
* @return array
|
13 |
*/
|
|
|
14 |
function _imagify_manage_media_columns( $columns ) {
|
15 |
$columns['imagify_optimized_file'] = __( 'Imagify', 'imagify' );
|
16 |
return $columns;
|
17 |
}
|
18 |
|
19 |
+
add_action( 'manage_media_custom_column', '_imagify_manage_media_custom_column', 10, 2 );
|
20 |
+
/**
|
21 |
+
* Add content to the "Imagify" columns in upload.php.
|
22 |
+
*
|
23 |
+
* @since 1.0
|
24 |
+
* @author Jonathan Buttigieg
|
25 |
+
*
|
26 |
+
* @param string $column_name Name of the custom column.
|
27 |
+
* @param int $attachment_id Attachment ID.
|
28 |
+
*/
|
29 |
function _imagify_manage_media_custom_column( $column_name, $attachment_id ) {
|
30 |
+
if ( 'imagify_optimized_file' !== $column_name ) {
|
31 |
+
return;
|
|
|
32 |
}
|
33 |
+
|
34 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
35 |
+
$attachment = new $class_name( $attachment_id );
|
36 |
+
|
37 |
+
echo get_imagify_media_column_content( $attachment );
|
38 |
}
|
39 |
|
40 |
+
add_action( 'restrict_manage_posts', '_imagify_attachments_filter_dropdown' );
|
41 |
+
/**
|
42 |
* Adds a dropdown that allows filtering on the attachments Imagify status.
|
43 |
*
|
44 |
* @since 1.0
|
45 |
* @author Jonathan Buttigieg
|
46 |
*/
|
|
|
47 |
function _imagify_attachments_filter_dropdown() {
|
48 |
if ( 'upload.php' !== $GLOBALS['pagenow'] ) {
|
49 |
return;
|
52 |
$optimized = imagify_count_optimized_attachments();
|
53 |
$unoptimized = imagify_count_unoptimized_attachments();
|
54 |
$errors = imagify_count_error_attachments();
|
55 |
+
$status = isset( $_GET['imagify-status'] ) ? $_GET['imagify-status'] : 0; // WPCS: CSRF ok.
|
56 |
+
$options = array(
|
57 |
'optimized' => __( 'Optimized','imagify' ),
|
58 |
'unoptimized' => __( 'Unoptimized','imagify' ),
|
59 |
'errors' => __( 'Errors','imagify' ),
|
60 |
);
|
61 |
|
62 |
+
echo '<label class="screen-reader-text" for="filter-by-optimization-status">' . __( 'Filter by status','imagify' ) . '</label>';
|
63 |
+
echo '<select id="filter-by-optimization-status" name="imagify-status">';
|
64 |
+
echo '<option value="0" selected="selected">' . __( 'All images','imagify' ) . '</option>';
|
|
|
65 |
|
66 |
+
foreach ( $options as $value => $label ) {
|
67 |
+
echo '<option value="' . $value . '" ' . selected( $status, $value, false ) . '>' . $label . ' (' . ${$value} . ')</option>';
|
68 |
+
}
|
69 |
+
echo '</select> ';
|
|
|
|
|
|
|
70 |
}
|
71 |
|
72 |
+
add_filter( 'request', '_imagify_sort_attachments_by_status' );
|
73 |
/**
|
74 |
+
* Modify the query based on the imagify-status variable in $_GET.
|
75 |
*
|
76 |
* @since 1.0
|
77 |
* @author Jonathan Buttigieg
|
78 |
+
*
|
79 |
+
* @param array $vars The array of requested query variables.
|
80 |
+
* @return array
|
81 |
*/
|
|
|
82 |
function _imagify_sort_attachments_by_status( $vars ) {
|
83 |
+
if ( 'upload.php' !== $GLOBALS['pagenow'] || empty( $_GET['imagify-status'] ) ) { // WPCS: CSRF ok.
|
84 |
return $vars;
|
85 |
}
|
86 |
+
|
87 |
+
$status = $_GET['imagify-status']; // WPCS: CSRF ok.
|
88 |
$meta_key = '_imagify_status';
|
89 |
$meta_compare = '=';
|
90 |
$relation = array();
|
91 |
+
|
92 |
+
switch ( $status ) {
|
93 |
case 'unoptimized':
|
94 |
$meta_key = '_imagify_data';
|
95 |
$meta_compare = 'NOT EXISTS';
|
96 |
+
break;
|
|
|
97 |
case 'optimized':
|
98 |
$status = 'success';
|
99 |
$relation = array(
|
101 |
'value' => 'already_optimized',
|
102 |
'compare' => $meta_compare,
|
103 |
);
|
104 |
+
break;
|
|
|
105 |
case 'errors':
|
106 |
$status = 'error';
|
|
|
107 |
}
|
108 |
+
|
109 |
+
$vars = array_merge( $vars, array(
|
110 |
+
'meta_query' => array(
|
111 |
+
'relation' => 'or',
|
112 |
+
array(
|
113 |
+
'key' => $meta_key,
|
114 |
+
'value' => $status,
|
115 |
+
'compare' => $meta_compare,
|
|
|
|
|
|
|
|
|
|
|
116 |
),
|
117 |
+
$relation,
|
118 |
+
),
|
119 |
+
) );
|
120 |
+
|
121 |
+
$vars['post_mime_type'] = get_imagify_mime_type();
|
122 |
+
|
123 |
return $vars;
|
124 |
+
}
|
inc/api/imagify.php
CHANGED
@@ -1,13 +1,14 @@
|
|
1 |
<?php
|
|
|
2 |
|
3 |
/**
|
4 |
* Create a new user on Imagify.
|
5 |
*
|
6 |
* @param array $data All user data.
|
7 |
* @return object
|
8 |
-
|
9 |
function add_imagify_user( $data ) {
|
10 |
-
return
|
11 |
}
|
12 |
|
13 |
/**
|
@@ -15,36 +16,37 @@ function add_imagify_user( $data ) {
|
|
15 |
*
|
16 |
* @param string $data All user data.
|
17 |
* @return object
|
18 |
-
|
19 |
function update_imagify_user( $data ) {
|
20 |
-
return
|
21 |
}
|
22 |
|
23 |
/**
|
24 |
* Get your Imagify account infos.
|
25 |
*
|
26 |
* @return object
|
27 |
-
|
28 |
function get_imagify_user() {
|
29 |
-
return
|
30 |
}
|
31 |
|
32 |
/**
|
33 |
* Get the Imagify API version.
|
34 |
*
|
35 |
* @return object
|
36 |
-
|
37 |
function get_imagify_api_version() {
|
38 |
-
return
|
39 |
}
|
40 |
|
41 |
/**
|
42 |
* Check your Imagify API key status.
|
43 |
*
|
|
|
44 |
* @return bool
|
45 |
-
|
46 |
function get_imagify_status( $data ) {
|
47 |
-
return
|
48 |
}
|
49 |
|
50 |
/**
|
@@ -52,9 +54,9 @@ function get_imagify_status( $data ) {
|
|
52 |
*
|
53 |
* @param array $data All image data.
|
54 |
* @return object
|
55 |
-
|
56 |
function fetch_imagify_image( $data ) {
|
57 |
-
return
|
58 |
}
|
59 |
|
60 |
/**
|
@@ -62,383 +64,91 @@ function fetch_imagify_image( $data ) {
|
|
62 |
*
|
63 |
* @param array $data All image data.
|
64 |
* @return object
|
65 |
-
|
66 |
function upload_imagify_image( $data ) {
|
67 |
-
return
|
68 |
}
|
69 |
|
70 |
/**
|
71 |
-
* Get Imagify Plans Prices
|
72 |
*
|
73 |
-
* @return object
|
74 |
* @since 1.5
|
75 |
* @author Geoffrey Crofte
|
76 |
-
|
|
|
|
|
77 |
function get_imagify_plans_prices() {
|
78 |
-
return
|
79 |
}
|
80 |
|
81 |
/**
|
82 |
-
* Get Imagify Plans Prices
|
83 |
*
|
84 |
-
* @return object
|
85 |
* @since 1.5
|
86 |
* @author Geoffrey Crofte
|
87 |
-
|
|
|
|
|
88 |
function get_imagify_packs_prices() {
|
89 |
-
return
|
90 |
}
|
91 |
|
92 |
/**
|
93 |
-
* Get Imagify All Prices (plan & packs)
|
94 |
*
|
95 |
-
* @return object
|
96 |
* @since 1.5.4
|
97 |
* @author Geoffrey Crofte
|
98 |
-
|
|
|
|
|
99 |
function get_imagify_all_prices() {
|
100 |
-
|
101 |
}
|
102 |
|
103 |
/**
|
104 |
-
* Check if Coupon Code exists
|
105 |
-
*
|
106 |
-
* @param string $coupon the coupon code to check
|
107 |
-
* @return object
|
108 |
*
|
109 |
* @since 1.6
|
110 |
* @author Geoffrey Crofte
|
111 |
-
|
|
|
|
|
|
|
112 |
function check_imagify_coupon_code( $coupon ) {
|
113 |
-
|
114 |
}
|
115 |
|
116 |
/**
|
117 |
-
* Check if Discount/Promotion is available
|
118 |
*
|
119 |
-
* @return object
|
120 |
* @since 1.6.3
|
121 |
* @author Geoffrey Crofte
|
122 |
-
|
|
|
|
|
123 |
function check_imagify_discount() {
|
124 |
-
|
125 |
}
|
126 |
|
127 |
-
|
128 |
-
* Get Maximum image size for free plan
|
129 |
*
|
130 |
-
* @return string
|
131 |
* @since 1.5.6
|
132 |
* @author Remy Perona
|
133 |
-
|
134 |
-
|
135 |
-
if ( false === ( $max_image_size = get_transient( 'imagify_max_image_size' ) ) ) {
|
136 |
-
$max_image_size = Imagify()->getPublicInfo()->max_image_size;
|
137 |
-
set_transient( 'imagify_max_image_size', $max_image_size, 6 * HOUR_IN_SECONDS );
|
138 |
-
}
|
139 |
-
|
140 |
-
return $max_image_size;
|
141 |
-
}
|
142 |
-
|
143 |
-
/**
|
144 |
-
* Imagify.io API for WordPress
|
145 |
*/
|
146 |
-
|
147 |
-
|
148 |
-
* The Imagify API endpoint
|
149 |
-
*/
|
150 |
-
const API_ENDPOINT = 'https://app.imagify.io/api/';
|
151 |
-
|
152 |
-
/**
|
153 |
-
* The Imagify API key
|
154 |
-
*/
|
155 |
-
private $apiKey = '';
|
156 |
-
|
157 |
-
/**
|
158 |
-
* HTTP headers
|
159 |
-
*/
|
160 |
-
private $headers = array();
|
161 |
-
|
162 |
-
/**
|
163 |
-
* @var The single instance of the class
|
164 |
-
*/
|
165 |
-
protected static $_instance = null;
|
166 |
-
|
167 |
-
/**
|
168 |
-
* The constructor
|
169 |
-
*
|
170 |
-
* @return void
|
171 |
-
**/
|
172 |
-
public function __construct()
|
173 |
-
{
|
174 |
-
// check if the WordPress plugin is activated and the API key is stored in the options
|
175 |
-
if ( defined( 'IMAGIFY_VERSION' ) && function_exists( 'get_imagify_option' ) ) {
|
176 |
-
$apiKey = get_imagify_option( 'api_key', false );
|
177 |
-
$this->apiKey = ( $apiKey ) ? $apiKey : $this->apiKey;
|
178 |
-
}
|
179 |
-
|
180 |
-
// check if the API key is defined with the PHP constant (it's ovveride the WordPress plugin option
|
181 |
-
if ( defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) {
|
182 |
-
$this->apiKey = IMAGIFY_API_KEY;
|
183 |
-
}
|
184 |
|
185 |
-
|
186 |
-
|
187 |
-
$this->headers['Authorization'] = 'Authorization: token ' . $this->apiKey;
|
188 |
-
}
|
189 |
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
* Ensures only one instance of class is loaded or can be loaded.
|
194 |
-
*
|
195 |
-
* @static
|
196 |
-
* @return Main instance
|
197 |
-
*/
|
198 |
-
public static function instance() {
|
199 |
-
if ( is_null( self::$_instance ) ) {
|
200 |
-
self::$_instance = new self();
|
201 |
}
|
202 |
-
|
203 |
-
return self::$_instance;
|
204 |
}
|
205 |
|
206 |
-
|
207 |
-
* Create a user on your Imagify account.
|
208 |
-
*
|
209 |
-
* @param array $data All user data. Details here: --
|
210 |
-
* @return object
|
211 |
-
**/
|
212 |
-
public function createUser( $data ) {
|
213 |
-
unset( $this->headers['Authorization'], $this->headers['Accept'], $this->headers['Content-Type'] );
|
214 |
-
|
215 |
-
$data['from_plugin'] = true;
|
216 |
-
$args = array(
|
217 |
-
'method' => 'POST',
|
218 |
-
'post_data' => $data
|
219 |
-
);
|
220 |
-
|
221 |
-
return $this->httpCall( 'users/', $args );
|
222 |
-
}
|
223 |
-
|
224 |
-
/**
|
225 |
-
* Get your Imagify account infos.
|
226 |
-
*
|
227 |
-
* @return object
|
228 |
-
**/
|
229 |
-
public function getUser() {
|
230 |
-
static $user;
|
231 |
-
|
232 |
-
if ( ! isset( $user ) ) {
|
233 |
-
$user = $this->httpCall( 'users/me/', array( 'timeout' => 10 ) );
|
234 |
-
}
|
235 |
-
|
236 |
-
return $user;
|
237 |
-
}
|
238 |
-
|
239 |
-
/**
|
240 |
-
* Check your Imagify API key status.
|
241 |
-
*
|
242 |
-
* @return object
|
243 |
-
**/
|
244 |
-
public function getStatus( $data ) {
|
245 |
-
static $status;
|
246 |
-
|
247 |
-
if ( ! isset( $status ) ) {
|
248 |
-
unset( $this->headers['Accept'], $this->headers['Content-Type'] );
|
249 |
-
$this->headers['Authorization'] = 'Authorization: token ' . $data;
|
250 |
-
|
251 |
-
$status = $this->httpCall( 'status/', array( 'timeout' => 10 ) );
|
252 |
-
}
|
253 |
-
|
254 |
-
return $status;
|
255 |
-
}
|
256 |
-
|
257 |
-
/**
|
258 |
-
* Get the Imagify API version.
|
259 |
-
*
|
260 |
-
* @return object
|
261 |
-
**/
|
262 |
-
public function getApiVersion() {
|
263 |
-
static $api_version;
|
264 |
-
|
265 |
-
if ( ! isset( $api_version ) ) {
|
266 |
-
unset( $this->headers['Accept'], $this->headers['Content-Type'] );
|
267 |
-
|
268 |
-
$api_version = $this->httpCall( 'version/', array( 'timeout' => 5 ) );
|
269 |
-
}
|
270 |
-
|
271 |
-
return $api_version;
|
272 |
-
}
|
273 |
-
|
274 |
-
/**
|
275 |
-
* Update an existing user on your Imagify account.
|
276 |
-
*
|
277 |
-
* @param string $data All user data. Details here: --
|
278 |
-
* @return object
|
279 |
-
**/
|
280 |
-
public function updateUser( $data ) {
|
281 |
-
$args = array(
|
282 |
-
'method' => 'PUT',
|
283 |
-
'post_data' => $data,
|
284 |
-
'timeout' => 10
|
285 |
-
);
|
286 |
-
|
287 |
-
return $this->httpCall( 'users/me/', $args );
|
288 |
-
}
|
289 |
-
|
290 |
-
/**
|
291 |
-
* Optimize an image from its binary content.
|
292 |
-
*
|
293 |
-
* @param string $data All options. Details here: --
|
294 |
-
* @return object
|
295 |
-
**/
|
296 |
-
public function uploadImage( $data ) {
|
297 |
-
if ( isset( $this->headers['Accept'], $this->headers['Content-Type'] ) ) {
|
298 |
-
unset( $this->headers['Accept'], $this->headers['Content-Type'] );
|
299 |
-
}
|
300 |
-
|
301 |
-
$args = array(
|
302 |
-
'method' => 'POST',
|
303 |
-
'post_data' => $data
|
304 |
-
);
|
305 |
-
|
306 |
-
return $this->httpCall( 'upload/', $args );
|
307 |
-
}
|
308 |
-
|
309 |
-
/**
|
310 |
-
* Optimize an image from its URL.
|
311 |
-
*
|
312 |
-
* @param string $data All options. Details here: --
|
313 |
-
* @return object
|
314 |
-
**/
|
315 |
-
public function fetchImage( $data ) {
|
316 |
-
$args = array(
|
317 |
-
'method' => 'POST',
|
318 |
-
'post_data' => json_encode( $data )
|
319 |
-
);
|
320 |
-
return $this->httpCall( 'fetch/', $args );
|
321 |
-
}
|
322 |
-
|
323 |
-
/**
|
324 |
-
* Get prices for plans
|
325 |
-
*
|
326 |
-
* @return object
|
327 |
-
*/
|
328 |
-
public function getPlansPrices() {
|
329 |
-
return $this->httpCall( 'pricing/plan/' );
|
330 |
-
}
|
331 |
-
|
332 |
-
/**
|
333 |
-
* Get prices for packs (one time)
|
334 |
-
*
|
335 |
-
* @return object
|
336 |
-
*/
|
337 |
-
public function getPacksPrices() {
|
338 |
-
return $this->httpCall( 'pricing/pack/' );
|
339 |
-
}
|
340 |
-
|
341 |
-
/**
|
342 |
-
* Get all prices (packs & plans included)
|
343 |
-
*
|
344 |
-
* @return object
|
345 |
-
*/
|
346 |
-
public function getAllPrices() {
|
347 |
-
return $this->httpCall( 'pricing/all/' );
|
348 |
-
}
|
349 |
-
|
350 |
-
/**
|
351 |
-
* Get all prices (packs & plans included)
|
352 |
-
*
|
353 |
-
* @return object
|
354 |
-
*/
|
355 |
-
public function checkCouponCode( $coupon ) {
|
356 |
-
return $this->httpCall( 'coupons/' . $coupon . '/' );
|
357 |
-
}
|
358 |
-
|
359 |
-
/**
|
360 |
-
* Get information about current discount
|
361 |
-
*
|
362 |
-
* @return object
|
363 |
-
*/
|
364 |
-
public function checkDiscount() {
|
365 |
-
return $this->httpCall( 'pricing/discount/' );
|
366 |
-
}
|
367 |
-
|
368 |
-
/*
|
369 |
-
* Get Public Info
|
370 |
-
*
|
371 |
-
* @return object
|
372 |
-
*/
|
373 |
-
public function getPublicInfo() {
|
374 |
-
return $this->httpCall( 'public-info' );
|
375 |
-
}
|
376 |
-
|
377 |
-
/**
|
378 |
-
* Make an HTTP call using curl.
|
379 |
-
*
|
380 |
-
* @param string $url The URL to call
|
381 |
-
* @param array $args The request args
|
382 |
-
* @return object
|
383 |
-
**/
|
384 |
-
private function httpCall( $url, $args = array() ) {
|
385 |
-
$default = array(
|
386 |
-
'method' => 'GET',
|
387 |
-
'post_data' => null,
|
388 |
-
'timeout' => 45
|
389 |
-
);
|
390 |
-
$args = array_merge( $default, $args );
|
391 |
-
|
392 |
-
// Check if php-curl is enabled
|
393 |
-
if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
|
394 |
-
return new WP_Error( 'curl', 'cURL isn\'t installed on the server.' );
|
395 |
-
}
|
396 |
-
|
397 |
-
try {
|
398 |
-
$ch = curl_init();
|
399 |
-
|
400 |
-
if ( 'POST' == $args['method'] ) {
|
401 |
-
curl_setopt( $ch, CURLOPT_POST, true );
|
402 |
-
curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
|
403 |
-
}
|
404 |
-
|
405 |
-
curl_setopt( $ch, CURLOPT_URL, self::API_ENDPOINT . $url );
|
406 |
-
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
|
407 |
-
curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->headers );
|
408 |
-
curl_setopt( $ch, CURLOPT_TIMEOUT, $args['timeout'] );
|
409 |
-
@curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
|
410 |
-
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
|
411 |
-
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
|
412 |
-
|
413 |
-
$response = json_decode( curl_exec( $ch ) );
|
414 |
-
$error = curl_error( $ch );
|
415 |
-
$http_code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
|
416 |
-
|
417 |
-
curl_close( $ch );
|
418 |
-
} catch( Exception $e ) {
|
419 |
-
return new WP_Error( 'curl', 'Unknown error occurred' );
|
420 |
-
}
|
421 |
-
|
422 |
-
if ( 200 != $http_code && isset( $response->code, $response->detail ) ) {
|
423 |
-
return new WP_Error( $http_code, $response->detail );
|
424 |
-
} elseif ( 413 == $http_code ) {
|
425 |
-
return new WP_Error( $http_code, 'Your image is too big to be uploaded on our server.' );
|
426 |
-
} elseif ( 200 != $http_code ) {
|
427 |
-
$http_code = (int) $http_code;
|
428 |
-
$error = '' != $error ? ' - ' . htmlentities( $error ) : '';
|
429 |
-
return new WP_Error( $http_code, "Unknown error occurred ({$http_code}{$error}) " );
|
430 |
-
} else {
|
431 |
-
return $response;
|
432 |
-
}
|
433 |
-
|
434 |
-
return $response;
|
435 |
-
}
|
436 |
-
}
|
437 |
-
|
438 |
-
/**
|
439 |
-
* Returns the main instance of Imagify to prevent the need to use globals.
|
440 |
-
*/
|
441 |
-
function Imagify() {
|
442 |
-
return Imagify::instance();
|
443 |
}
|
444 |
-
$GLOBALS['imagify'] = Imagify();
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
* Create a new user on Imagify.
|
6 |
*
|
7 |
* @param array $data All user data.
|
8 |
* @return object
|
9 |
+
*/
|
10 |
function add_imagify_user( $data ) {
|
11 |
+
return imagify()->create_user( $data );
|
12 |
}
|
13 |
|
14 |
/**
|
16 |
*
|
17 |
* @param string $data All user data.
|
18 |
* @return object
|
19 |
+
*/
|
20 |
function update_imagify_user( $data ) {
|
21 |
+
return imagify()->update_user( $data );
|
22 |
}
|
23 |
|
24 |
/**
|
25 |
* Get your Imagify account infos.
|
26 |
*
|
27 |
* @return object
|
28 |
+
*/
|
29 |
function get_imagify_user() {
|
30 |
+
return imagify()->get_user();
|
31 |
}
|
32 |
|
33 |
/**
|
34 |
* Get the Imagify API version.
|
35 |
*
|
36 |
* @return object
|
37 |
+
*/
|
38 |
function get_imagify_api_version() {
|
39 |
+
return imagify()->get_api_version();
|
40 |
}
|
41 |
|
42 |
/**
|
43 |
* Check your Imagify API key status.
|
44 |
*
|
45 |
+
* @param string $data An API key.
|
46 |
* @return bool
|
47 |
+
*/
|
48 |
function get_imagify_status( $data ) {
|
49 |
+
return imagify()->get_status( $data );
|
50 |
}
|
51 |
|
52 |
/**
|
54 |
*
|
55 |
* @param array $data All image data.
|
56 |
* @return object
|
57 |
+
*/
|
58 |
function fetch_imagify_image( $data ) {
|
59 |
+
return imagify()->fetch_image( $data );
|
60 |
}
|
61 |
|
62 |
/**
|
64 |
*
|
65 |
* @param array $data All image data.
|
66 |
* @return object
|
67 |
+
*/
|
68 |
function upload_imagify_image( $data ) {
|
69 |
+
return imagify()->upload_image( $data );
|
70 |
}
|
71 |
|
72 |
/**
|
73 |
+
* Get Imagify Plans Prices.
|
74 |
*
|
|
|
75 |
* @since 1.5
|
76 |
* @author Geoffrey Crofte
|
77 |
+
*
|
78 |
+
* @return object
|
79 |
+
*/
|
80 |
function get_imagify_plans_prices() {
|
81 |
+
return imagify()->get_plans_prices();
|
82 |
}
|
83 |
|
84 |
/**
|
85 |
+
* Get Imagify Plans Prices.
|
86 |
*
|
|
|
87 |
* @since 1.5
|
88 |
* @author Geoffrey Crofte
|
89 |
+
*
|
90 |
+
* @return object
|
91 |
+
*/
|
92 |
function get_imagify_packs_prices() {
|
93 |
+
return imagify()->get_packs_prices();
|
94 |
}
|
95 |
|
96 |
/**
|
97 |
+
* Get Imagify All Prices (plan & packs).
|
98 |
*
|
|
|
99 |
* @since 1.5.4
|
100 |
* @author Geoffrey Crofte
|
101 |
+
*
|
102 |
+
* @return object
|
103 |
+
*/
|
104 |
function get_imagify_all_prices() {
|
105 |
+
return imagify()->get_all_prices();
|
106 |
}
|
107 |
|
108 |
/**
|
109 |
+
* Check if Coupon Code exists.
|
|
|
|
|
|
|
110 |
*
|
111 |
* @since 1.6
|
112 |
* @author Geoffrey Crofte
|
113 |
+
*
|
114 |
+
* @param string $coupon the coupon code to check.
|
115 |
+
* @return object
|
116 |
+
*/
|
117 |
function check_imagify_coupon_code( $coupon ) {
|
118 |
+
return imagify()->check_coupon_code( $coupon );
|
119 |
}
|
120 |
|
121 |
/**
|
122 |
+
* Check if Discount/Promotion is available.
|
123 |
*
|
|
|
124 |
* @since 1.6.3
|
125 |
* @author Geoffrey Crofte
|
126 |
+
*
|
127 |
+
* @return object
|
128 |
+
*/
|
129 |
function check_imagify_discount() {
|
130 |
+
return imagify()->check_discount();
|
131 |
}
|
132 |
|
133 |
+
/**
|
134 |
+
* Get Maximum image size for free plan.
|
135 |
*
|
|
|
136 |
* @since 1.5.6
|
137 |
* @author Remy Perona
|
138 |
+
*
|
139 |
+
* @return string
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
*/
|
141 |
+
function get_imagify_max_image_size() {
|
142 |
+
$max_image_size = get_transient( 'imagify_max_image_size' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
|
144 |
+
if ( false === $max_image_size ) {
|
145 |
+
$max_image_size = imagify()->get_public_info();
|
|
|
|
|
146 |
|
147 |
+
if ( ! is_wp_error( $max_image_size ) ) {
|
148 |
+
$max_image_size = $max_image_size->max_image_size;
|
149 |
+
set_transient( 'imagify_max_image_size', $max_image_size, 6 * HOUR_IN_SECONDS );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
150 |
}
|
|
|
|
|
151 |
}
|
152 |
|
153 |
+
return $max_image_size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
154 |
}
|
|
inc/classes/abstracts/{abstract-attachment.php → class-imagify-abstract-attachment.php}
RENAMED
@@ -1,48 +1,64 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
-
|
|
|
|
|
|
|
|
|
|
|
4 |
class Imagify_Abstract_Attachment {
|
|
|
5 |
/**
|
6 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
*
|
8 |
* @since 1.0
|
9 |
*
|
10 |
-
* @var
|
11 |
* @access public
|
12 |
*/
|
13 |
public $id;
|
14 |
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
* @since 1.0
|
19 |
*
|
20 |
-
|
21 |
-
|
22 |
-
|
|
|
23 |
|
24 |
/**
|
25 |
* Get the attachment backup filepath.
|
26 |
*
|
27 |
* @since 1.0
|
28 |
-
*
|
29 |
* @access public
|
|
|
30 |
* @return string|false
|
31 |
*/
|
32 |
-
public function get_backup_path() {
|
33 |
-
|
|
|
|
|
34 |
/**
|
35 |
* Get the attachment backup URL.
|
36 |
*
|
37 |
* @since 1.4
|
38 |
-
*
|
39 |
* @access public
|
|
|
40 |
* @return string|false
|
41 |
*/
|
42 |
public function get_backup_url() {
|
43 |
$backup_path = $this->get_backup_path();
|
44 |
$backup_url = str_replace( ABSPATH, site_url( '/' ), $backup_path );
|
45 |
-
|
46 |
return $backup_url;
|
47 |
}
|
48 |
|
@@ -50,75 +66,78 @@ class Imagify_Abstract_Attachment {
|
|
50 |
* Get the attachment optimization data.
|
51 |
*
|
52 |
* @since 1.0
|
53 |
-
*
|
54 |
* @access public
|
|
|
55 |
* @return array
|
56 |
*/
|
57 |
-
public function get_data() {
|
58 |
-
|
|
|
|
|
59 |
/**
|
60 |
* Get the attachment extension.
|
61 |
*
|
62 |
* @since 1.0
|
63 |
-
*
|
64 |
* @access public
|
|
|
65 |
* @return string
|
66 |
*/
|
67 |
public function get_extension() {
|
68 |
$fullsize_path = $this->get_original_path();
|
69 |
return pathinfo( $fullsize_path, PATHINFO_EXTENSION );
|
70 |
}
|
71 |
-
|
72 |
/**
|
73 |
* Get the attachment error if there is one.
|
74 |
*
|
75 |
* @since 1.1.5
|
76 |
-
*
|
77 |
* @access public
|
|
|
78 |
* @return string The message error
|
79 |
*/
|
80 |
public function get_optimized_error() {
|
81 |
$error = $this->get_size_data( 'full', 'error' );
|
82 |
-
|
83 |
if ( is_string( $error ) ) {
|
84 |
return $error;
|
85 |
}
|
86 |
-
|
87 |
return false;
|
88 |
}
|
89 |
-
|
90 |
/**
|
91 |
* Get the attachment optimization level.
|
92 |
*
|
93 |
* @since 1.0
|
94 |
-
*
|
95 |
* @access public
|
|
|
96 |
* @return int
|
97 |
*/
|
98 |
-
public function get_optimization_level() {
|
99 |
-
|
|
|
|
|
100 |
/**
|
101 |
* Get the attachment optimization level label.
|
102 |
*
|
103 |
* @since 1.2
|
104 |
-
*
|
105 |
* @access public
|
|
|
106 |
* @return string
|
107 |
*/
|
108 |
public function get_optimization_level_label() {
|
109 |
$label = '';
|
110 |
$level = $this->get_optimization_level();
|
111 |
-
|
112 |
-
switch( $level ) {
|
113 |
case 2:
|
114 |
$label = __( 'Ultra', 'imagify' );
|
115 |
-
|
116 |
case 1:
|
117 |
$label = __( 'Aggressive', 'imagify' );
|
118 |
-
|
119 |
case 0:
|
120 |
$label = __( 'Normal', 'imagify' );
|
121 |
-
break;
|
122 |
}
|
123 |
|
124 |
return $label;
|
@@ -128,8 +147,8 @@ class Imagify_Abstract_Attachment {
|
|
128 |
* Count number of optimized sizes.
|
129 |
*
|
130 |
* @since 1.0
|
131 |
-
*
|
132 |
* @access public
|
|
|
133 |
* @return int
|
134 |
*/
|
135 |
public function get_optimized_sizes_count() {
|
@@ -137,9 +156,7 @@ class Imagify_Abstract_Attachment {
|
|
137 |
$sizes = (array) $data['sizes'];
|
138 |
$count = 0;
|
139 |
|
140 |
-
|
141 |
-
unset( $sizes['full'] );
|
142 |
-
}
|
143 |
|
144 |
foreach ( $sizes as $size ) {
|
145 |
if ( $size['success'] ) {
|
@@ -147,46 +164,51 @@ class Imagify_Abstract_Attachment {
|
|
147 |
}
|
148 |
}
|
149 |
|
150 |
-
return
|
151 |
}
|
152 |
|
153 |
/**
|
154 |
* Get the attachment optimization status (success or error).
|
155 |
*
|
156 |
* @since 1.0
|
157 |
-
*
|
158 |
* @access public
|
|
|
159 |
* @return string
|
160 |
*/
|
161 |
-
public function get_status() {
|
|
|
|
|
162 |
|
163 |
/**
|
164 |
* Get the original attachment path.
|
165 |
*
|
166 |
* @since 1.0
|
167 |
-
*
|
168 |
* @access public
|
|
|
169 |
* @return string
|
170 |
*/
|
171 |
-
public function get_original_path() {
|
|
|
|
|
172 |
|
173 |
/**
|
174 |
* Get the original attachment size.
|
175 |
*
|
176 |
* @since 1.0
|
177 |
-
*
|
178 |
* @access public
|
179 |
-
*
|
|
|
180 |
* @return string
|
181 |
*/
|
182 |
public function get_original_size( $human_format = true ) {
|
|
|
183 |
$original_size = $this->get_size_data( 'full', 'original_size' );
|
184 |
-
$original_size =
|
185 |
-
|
186 |
if ( true === $human_format ) {
|
187 |
-
$original_size = @size_format( $original_size, 2 );
|
188 |
}
|
189 |
-
|
190 |
return $original_size;
|
191 |
}
|
192 |
|
@@ -194,20 +216,22 @@ class Imagify_Abstract_Attachment {
|
|
194 |
* Get the original attachment URL.
|
195 |
*
|
196 |
* @since 1.0
|
197 |
-
*
|
198 |
* @access public
|
|
|
199 |
* @return string
|
200 |
*/
|
201 |
-
public function get_original_url() {
|
|
|
|
|
202 |
|
203 |
-
|
204 |
* Get the statistics of a specific size.
|
205 |
*
|
206 |
* @since 1.0
|
207 |
-
*
|
208 |
* @access public
|
209 |
-
*
|
210 |
-
* @param string
|
|
|
211 |
* @return array|string
|
212 |
*/
|
213 |
public function get_size_data( $size = 'full', $key = '' ) {
|
@@ -224,14 +248,14 @@ class Imagify_Abstract_Attachment {
|
|
224 |
|
225 |
return $stats;
|
226 |
}
|
227 |
-
|
228 |
/**
|
229 |
* Get the global statistics data or a specific one.
|
230 |
*
|
231 |
* @since 1.0
|
232 |
-
*
|
233 |
* @access public
|
234 |
-
*
|
|
|
235 |
* @return array|string
|
236 |
*/
|
237 |
public function get_stats_data( $key = '' ) {
|
@@ -253,33 +277,33 @@ class Imagify_Abstract_Attachment {
|
|
253 |
* Check if the attachment is already optimized (before Imagify).
|
254 |
*
|
255 |
* @since 1.1.6
|
256 |
-
*
|
257 |
* @access public
|
258 |
-
*
|
|
|
259 |
*/
|
260 |
public function is_already_optimized() {
|
261 |
-
return
|
262 |
}
|
263 |
-
|
264 |
/**
|
265 |
* Check if the attachment is optimized.
|
266 |
*
|
267 |
* @since 1.0
|
268 |
-
*
|
269 |
* @access public
|
270 |
-
*
|
|
|
271 |
*/
|
272 |
public function is_optimized() {
|
273 |
-
return
|
274 |
}
|
275 |
|
276 |
/**
|
277 |
* Check if the attachment exceeding the limit size (> 5mo).
|
278 |
*
|
279 |
* @since 1.0
|
280 |
-
*
|
281 |
* @access public
|
282 |
-
*
|
|
|
283 |
*/
|
284 |
public function is_exceeded() {
|
285 |
$filepath = $this->get_original_path();
|
@@ -289,16 +313,16 @@ class Imagify_Abstract_Attachment {
|
|
289 |
$size = filesize( $filepath );
|
290 |
}
|
291 |
|
292 |
-
return
|
293 |
}
|
294 |
|
295 |
/**
|
296 |
* Check if the attachment has a backup of the original size.
|
297 |
*
|
298 |
* @since 1.0
|
299 |
-
*
|
300 |
* @access public
|
301 |
-
*
|
|
|
302 |
*/
|
303 |
public function has_backup() {
|
304 |
return (bool) $this->get_backup_path();
|
@@ -308,21 +332,21 @@ class Imagify_Abstract_Attachment {
|
|
308 |
* Check if the attachment has an error.
|
309 |
*
|
310 |
* @since 1.0
|
311 |
-
*
|
312 |
* @access public
|
313 |
-
*
|
|
|
314 |
*/
|
315 |
public function has_error() {
|
316 |
$has_error = $this->get_size_data( 'full', 'error' );
|
317 |
-
return
|
318 |
}
|
319 |
-
|
320 |
/**
|
321 |
* Update the metadata size of the attachment
|
322 |
*
|
323 |
* @since 1.2
|
324 |
-
*
|
325 |
* @access public
|
|
|
326 |
* @return void
|
327 |
*/
|
328 |
public function update_metadata_size() {}
|
@@ -331,116 +355,117 @@ class Imagify_Abstract_Attachment {
|
|
331 |
* Delete the backup file.
|
332 |
*
|
333 |
* @since 1.0
|
334 |
-
*
|
335 |
* @access public
|
|
|
336 |
* @return void
|
337 |
*/
|
338 |
public function delete_backup() {
|
339 |
$backup_path = $this->get_backup_path();
|
340 |
|
341 |
if ( ! empty( $backup_path ) ) {
|
342 |
-
|
343 |
}
|
344 |
}
|
345 |
|
346 |
/**
|
347 |
-
* Fills statistics data with values from $data array
|
348 |
*
|
349 |
* @since 1.0
|
350 |
-
*
|
351 |
* @access public
|
352 |
-
*
|
353 |
-
* @param
|
354 |
-
* @param
|
355 |
-
* @param
|
356 |
-
* @param
|
357 |
-
* @param
|
358 |
-
* @return bool|array
|
359 |
*/
|
360 |
-
|
|
|
|
|
361 |
|
362 |
/**
|
363 |
* Optimize all sizes with Imagify.
|
364 |
*
|
365 |
* @since 1.0
|
366 |
-
*
|
367 |
* @access public
|
368 |
-
*
|
369 |
-
* @param
|
370 |
-
* @
|
|
|
371 |
*/
|
372 |
-
public function optimize( $optimization_level = null, $metadata = array() ) {
|
|
|
|
|
373 |
|
374 |
/**
|
375 |
* Process an attachment restoration from the backup file.
|
376 |
*
|
377 |
* @since 1.0
|
378 |
-
*
|
379 |
* @access public
|
|
|
380 |
* @return void
|
381 |
*/
|
382 |
public function restore() {}
|
383 |
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
|
420 |
-
|
421 |
-
|
422 |
-
|
423 |
-
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
return $resized_image_path;
|
445 |
-
}
|
446 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Imagify Attachment base class.
|
6 |
+
*
|
7 |
+
* @since 1.0
|
8 |
+
*/
|
9 |
class Imagify_Abstract_Attachment {
|
10 |
+
|
11 |
/**
|
12 |
+
* Class version.
|
13 |
+
*
|
14 |
+
* @var string
|
15 |
+
*/
|
16 |
+
const VERSION = '1.0.1';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* The attachment ID.
|
20 |
*
|
21 |
* @since 1.0
|
22 |
*
|
23 |
+
* @var int
|
24 |
* @access public
|
25 |
*/
|
26 |
public $id;
|
27 |
|
28 |
+
/**
|
29 |
+
* The constructor.
|
30 |
+
*
|
31 |
* @since 1.0
|
32 |
*
|
33 |
+
* @param int $id The attachment ID.
|
34 |
+
* @return void
|
35 |
+
*/
|
36 |
+
public function __construct( $id = 0 ) {}
|
37 |
|
38 |
/**
|
39 |
* Get the attachment backup filepath.
|
40 |
*
|
41 |
* @since 1.0
|
|
|
42 |
* @access public
|
43 |
+
*
|
44 |
* @return string|false
|
45 |
*/
|
46 |
+
public function get_backup_path() {
|
47 |
+
return '';
|
48 |
+
}
|
49 |
+
|
50 |
/**
|
51 |
* Get the attachment backup URL.
|
52 |
*
|
53 |
* @since 1.4
|
|
|
54 |
* @access public
|
55 |
+
*
|
56 |
* @return string|false
|
57 |
*/
|
58 |
public function get_backup_url() {
|
59 |
$backup_path = $this->get_backup_path();
|
60 |
$backup_url = str_replace( ABSPATH, site_url( '/' ), $backup_path );
|
61 |
+
|
62 |
return $backup_url;
|
63 |
}
|
64 |
|
66 |
* Get the attachment optimization data.
|
67 |
*
|
68 |
* @since 1.0
|
|
|
69 |
* @access public
|
70 |
+
*
|
71 |
* @return array
|
72 |
*/
|
73 |
+
public function get_data() {
|
74 |
+
return array();
|
75 |
+
}
|
76 |
+
|
77 |
/**
|
78 |
* Get the attachment extension.
|
79 |
*
|
80 |
* @since 1.0
|
|
|
81 |
* @access public
|
82 |
+
*
|
83 |
* @return string
|
84 |
*/
|
85 |
public function get_extension() {
|
86 |
$fullsize_path = $this->get_original_path();
|
87 |
return pathinfo( $fullsize_path, PATHINFO_EXTENSION );
|
88 |
}
|
89 |
+
|
90 |
/**
|
91 |
* Get the attachment error if there is one.
|
92 |
*
|
93 |
* @since 1.1.5
|
|
|
94 |
* @access public
|
95 |
+
*
|
96 |
* @return string The message error
|
97 |
*/
|
98 |
public function get_optimized_error() {
|
99 |
$error = $this->get_size_data( 'full', 'error' );
|
100 |
+
|
101 |
if ( is_string( $error ) ) {
|
102 |
return $error;
|
103 |
}
|
104 |
+
|
105 |
return false;
|
106 |
}
|
107 |
+
|
108 |
/**
|
109 |
* Get the attachment optimization level.
|
110 |
*
|
111 |
* @since 1.0
|
|
|
112 |
* @access public
|
113 |
+
*
|
114 |
* @return int
|
115 |
*/
|
116 |
+
public function get_optimization_level() {
|
117 |
+
return -1;
|
118 |
+
}
|
119 |
+
|
120 |
/**
|
121 |
* Get the attachment optimization level label.
|
122 |
*
|
123 |
* @since 1.2
|
|
|
124 |
* @access public
|
125 |
+
*
|
126 |
* @return string
|
127 |
*/
|
128 |
public function get_optimization_level_label() {
|
129 |
$label = '';
|
130 |
$level = $this->get_optimization_level();
|
131 |
+
|
132 |
+
switch ( $level ) {
|
133 |
case 2:
|
134 |
$label = __( 'Ultra', 'imagify' );
|
135 |
+
break;
|
136 |
case 1:
|
137 |
$label = __( 'Aggressive', 'imagify' );
|
138 |
+
break;
|
139 |
case 0:
|
140 |
$label = __( 'Normal', 'imagify' );
|
|
|
141 |
}
|
142 |
|
143 |
return $label;
|
147 |
* Count number of optimized sizes.
|
148 |
*
|
149 |
* @since 1.0
|
|
|
150 |
* @access public
|
151 |
+
*
|
152 |
* @return int
|
153 |
*/
|
154 |
public function get_optimized_sizes_count() {
|
156 |
$sizes = (array) $data['sizes'];
|
157 |
$count = 0;
|
158 |
|
159 |
+
unset( $sizes['full'] );
|
|
|
|
|
160 |
|
161 |
foreach ( $sizes as $size ) {
|
162 |
if ( $size['success'] ) {
|
164 |
}
|
165 |
}
|
166 |
|
167 |
+
return $count;
|
168 |
}
|
169 |
|
170 |
/**
|
171 |
* Get the attachment optimization status (success or error).
|
172 |
*
|
173 |
* @since 1.0
|
|
|
174 |
* @access public
|
175 |
+
*
|
176 |
* @return string
|
177 |
*/
|
178 |
+
public function get_status() {
|
179 |
+
return '';
|
180 |
+
}
|
181 |
|
182 |
/**
|
183 |
* Get the original attachment path.
|
184 |
*
|
185 |
* @since 1.0
|
|
|
186 |
* @access public
|
187 |
+
*
|
188 |
* @return string
|
189 |
*/
|
190 |
+
public function get_original_path() {
|
191 |
+
return '';
|
192 |
+
}
|
193 |
|
194 |
/**
|
195 |
* Get the original attachment size.
|
196 |
*
|
197 |
* @since 1.0
|
|
|
198 |
* @access public
|
199 |
+
*
|
200 |
+
* @param bool $human_format True to display the image human format size (1Mb).
|
201 |
* @return string
|
202 |
*/
|
203 |
public function get_original_size( $human_format = true ) {
|
204 |
+
$filesystem = imagify_get_filesystem();
|
205 |
$original_size = $this->get_size_data( 'full', 'original_size' );
|
206 |
+
$original_size = empty( $original_size ) ? $filesystem->size( $this->get_original_path() ) : (int) $original_size;
|
207 |
+
|
208 |
if ( true === $human_format ) {
|
209 |
+
$original_size = @size_format( $original_size, 2 );
|
210 |
}
|
211 |
+
|
212 |
return $original_size;
|
213 |
}
|
214 |
|
216 |
* Get the original attachment URL.
|
217 |
*
|
218 |
* @since 1.0
|
|
|
219 |
* @access public
|
220 |
+
*
|
221 |
* @return string
|
222 |
*/
|
223 |
+
public function get_original_url() {
|
224 |
+
return '';
|
225 |
+
}
|
226 |
|
227 |
+
/**
|
228 |
* Get the statistics of a specific size.
|
229 |
*
|
230 |
* @since 1.0
|
|
|
231 |
* @access public
|
232 |
+
*
|
233 |
+
* @param string $size The thumbnail slug.
|
234 |
+
* @param string $key The specific data slug.
|
235 |
* @return array|string
|
236 |
*/
|
237 |
public function get_size_data( $size = 'full', $key = '' ) {
|
248 |
|
249 |
return $stats;
|
250 |
}
|
251 |
+
|
252 |
/**
|
253 |
* Get the global statistics data or a specific one.
|
254 |
*
|
255 |
* @since 1.0
|
|
|
256 |
* @access public
|
257 |
+
*
|
258 |
+
* @param string $key The specific data slug.
|
259 |
* @return array|string
|
260 |
*/
|
261 |
public function get_stats_data( $key = '' ) {
|
277 |
* Check if the attachment is already optimized (before Imagify).
|
278 |
*
|
279 |
* @since 1.1.6
|
|
|
280 |
* @access public
|
281 |
+
*
|
282 |
+
* @return bool True if the attachment is optimized.
|
283 |
*/
|
284 |
public function is_already_optimized() {
|
285 |
+
return 'already_optimized' === $this->get_status();
|
286 |
}
|
287 |
+
|
288 |
/**
|
289 |
* Check if the attachment is optimized.
|
290 |
*
|
291 |
* @since 1.0
|
|
|
292 |
* @access public
|
293 |
+
*
|
294 |
+
* @return bool True if the attachment is optimized.
|
295 |
*/
|
296 |
public function is_optimized() {
|
297 |
+
return 'success' === $this->get_status();
|
298 |
}
|
299 |
|
300 |
/**
|
301 |
* Check if the attachment exceeding the limit size (> 5mo).
|
302 |
*
|
303 |
* @since 1.0
|
|
|
304 |
* @access public
|
305 |
+
*
|
306 |
+
* @return bool True if the attachment is skipped.
|
307 |
*/
|
308 |
public function is_exceeded() {
|
309 |
$filepath = $this->get_original_path();
|
313 |
$size = filesize( $filepath );
|
314 |
}
|
315 |
|
316 |
+
return $size > IMAGIFY_MAX_BYTES;
|
317 |
}
|
318 |
|
319 |
/**
|
320 |
* Check if the attachment has a backup of the original size.
|
321 |
*
|
322 |
* @since 1.0
|
|
|
323 |
* @access public
|
324 |
+
*
|
325 |
+
* @return bool True if the attachment has a backup.
|
326 |
*/
|
327 |
public function has_backup() {
|
328 |
return (bool) $this->get_backup_path();
|
332 |
* Check if the attachment has an error.
|
333 |
*
|
334 |
* @since 1.0
|
|
|
335 |
* @access public
|
336 |
+
*
|
337 |
+
* @return bool True if the attachment has an error.
|
338 |
*/
|
339 |
public function has_error() {
|
340 |
$has_error = $this->get_size_data( 'full', 'error' );
|
341 |
+
return is_string( $has_error );
|
342 |
}
|
343 |
+
|
344 |
/**
|
345 |
* Update the metadata size of the attachment
|
346 |
*
|
347 |
* @since 1.2
|
|
|
348 |
* @access public
|
349 |
+
*
|
350 |
* @return void
|
351 |
*/
|
352 |
public function update_metadata_size() {}
|
355 |
* Delete the backup file.
|
356 |
*
|
357 |
* @since 1.0
|
|
|
358 |
* @access public
|
359 |
+
*
|
360 |
* @return void
|
361 |
*/
|
362 |
public function delete_backup() {
|
363 |
$backup_path = $this->get_backup_path();
|
364 |
|
365 |
if ( ! empty( $backup_path ) ) {
|
366 |
+
imagify_get_filesystem()->delete( $backup_path );
|
367 |
}
|
368 |
}
|
369 |
|
370 |
/**
|
371 |
+
* Fills statistics data with values from $data array.
|
372 |
*
|
373 |
* @since 1.0
|
374 |
+
* @since 1.6.5 Not static anymore.
|
375 |
* @access public
|
376 |
+
*
|
377 |
+
* @param array $data The statistics data.
|
378 |
+
* @param object $response The API response.
|
379 |
+
* @param int $id The attachment ID.
|
380 |
+
* @param int $url The attachment URL.
|
381 |
+
* @param string $size The attachment size key.
|
382 |
+
* @return bool|array False if the original size has an error or an array contains the data for other result.
|
383 |
*/
|
384 |
+
public function fill_data( $data, $response, $id, $url, $size = 'full' ) {
|
385 |
+
return array();
|
386 |
+
}
|
387 |
|
388 |
/**
|
389 |
* Optimize all sizes with Imagify.
|
390 |
*
|
391 |
* @since 1.0
|
|
|
392 |
* @access public
|
393 |
+
*
|
394 |
+
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal).
|
395 |
+
* @param array $metadata The attachment meta data.
|
396 |
+
* @return array $optimized_data The optimization data.
|
397 |
*/
|
398 |
+
public function optimize( $optimization_level = null, $metadata = array() ) {
|
399 |
+
return array();
|
400 |
+
}
|
401 |
|
402 |
/**
|
403 |
* Process an attachment restoration from the backup file.
|
404 |
*
|
405 |
* @since 1.0
|
|
|
406 |
* @access public
|
407 |
+
*
|
408 |
* @return void
|
409 |
*/
|
410 |
public function restore() {}
|
411 |
|
412 |
+
/**
|
413 |
+
* Resize an image if bigger than the maximum width defined in the settings.
|
414 |
+
*
|
415 |
+
* @since 1.5.7
|
416 |
+
* @author Remy Perona
|
417 |
+
*
|
418 |
+
* @param string $attachment_path Path to the image.
|
419 |
+
* @param array $attachment_sizes Array of original image dimensions.
|
420 |
+
* @param int $max_width Maximum width defined in the settings.
|
421 |
+
* @return string Path the the resized image or the original image if the resize failed.
|
422 |
+
*/
|
423 |
+
public function resize( $attachment_path, $attachment_sizes, $max_width ) {
|
424 |
+
// Prevent removal of the exif/meta data when resizing (only works with Imagick).
|
425 |
+
add_filter( 'image_strip_meta', '__return_false' );
|
426 |
+
|
427 |
+
$new_sizes = wp_constrain_dimensions( $attachment_sizes[0], $attachment_sizes[1], $max_width );
|
428 |
+
$editor = wp_get_image_editor( $attachment_path );
|
429 |
+
|
430 |
+
if ( is_wp_error( $editor ) ) {
|
431 |
+
return $editor;
|
432 |
+
}
|
433 |
+
|
434 |
+
$image_type = pathinfo( $attachment_path, PATHINFO_EXTENSION );
|
435 |
+
|
436 |
+
// Try to correct for auto-rotation if the info is available.
|
437 |
+
if ( function_exists( 'exif_read_data' ) && ( 'jpg' === $image_type || 'jpeg' === $image_type) ) {
|
438 |
+
$exif = @exif_read_data( $attachment_path );
|
439 |
+
$orientation = is_array( $exif ) && array_key_exists( 'Orientation', $exif ) ? $exif['Orientation'] : 0;
|
440 |
+
|
441 |
+
switch ( $orientation ) {
|
442 |
+
case 3:
|
443 |
+
$editor->rotate( 180 );
|
444 |
+
break;
|
445 |
+
case 6:
|
446 |
+
$editor->rotate( -90 );
|
447 |
+
break;
|
448 |
+
case 8:
|
449 |
+
$editor->rotate( 90 );
|
450 |
+
}
|
451 |
+
}
|
452 |
+
|
453 |
+
$resized = $editor->resize( $new_sizes[0], $new_sizes[1], false );
|
454 |
+
|
455 |
+
if ( is_wp_error( $resized ) ) {
|
456 |
+
return $resized;
|
457 |
+
}
|
458 |
+
|
459 |
+
$resized_image_path = $editor->generate_filename( 'imagifyresized' );
|
460 |
+
$resized_image_saved = $editor->save( $resized_image_path );
|
461 |
+
|
462 |
+
if ( is_wp_error( $resized_image_saved ) ) {
|
463 |
+
return $resized_image_saved;
|
464 |
+
}
|
465 |
+
|
466 |
+
// Remove the filter when we're done to prevent any conflict.
|
467 |
+
remove_filter( 'image_strip_meta', '__return_false' );
|
468 |
+
|
469 |
+
return $resized_image_path;
|
470 |
+
}
|
471 |
+
}
|
|
|
|
|
|
inc/classes/abstracts/{abstract-db.php → class-imagify-abstract-db.php}
RENAMED
@@ -1,51 +1,89 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
* DB base class
|
6 |
*
|
7 |
* @source https://gist.github.com/pippinsplugins/e220a7f0f0f2fbe64608
|
8 |
* @since 1.5
|
9 |
-
*/
|
10 |
abstract class Imagify_Abstract_DB {
|
11 |
|
12 |
/**
|
13 |
-
*
|
14 |
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
* @access public
|
16 |
* @since 1.5
|
17 |
*/
|
18 |
public $table_name;
|
19 |
|
20 |
/**
|
21 |
-
* The version of our database table
|
22 |
*
|
|
|
23 |
* @access public
|
24 |
* @since 1.5
|
25 |
*/
|
26 |
public $version;
|
27 |
|
28 |
/**
|
29 |
-
* The name of the primary column
|
30 |
*
|
|
|
31 |
* @access public
|
32 |
* @since 1.5
|
33 |
*/
|
34 |
public $primary_key;
|
35 |
-
|
36 |
/**
|
37 |
-
* Get things started
|
38 |
*
|
39 |
* @access public
|
40 |
* @since 1.5
|
41 |
*/
|
42 |
-
|
43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
/**
|
45 |
-
* Whitelist of columns
|
46 |
*
|
47 |
* @access public
|
48 |
* @since 1.5
|
|
|
49 |
* @return array
|
50 |
*/
|
51 |
public function get_columns() {
|
@@ -53,10 +91,11 @@ abstract class Imagify_Abstract_DB {
|
|
53 |
}
|
54 |
|
55 |
/**
|
56 |
-
* Default column values
|
57 |
*
|
58 |
* @access public
|
59 |
* @since 1.5
|
|
|
60 |
* @return array
|
61 |
*/
|
62 |
public function get_column_defaults() {
|
@@ -64,164 +103,177 @@ abstract class Imagify_Abstract_DB {
|
|
64 |
}
|
65 |
|
66 |
/**
|
67 |
-
* Retrieve a row by the primary key
|
68 |
*
|
69 |
* @access public
|
70 |
* @since 1.5
|
71 |
-
*
|
|
|
|
|
72 |
*/
|
73 |
public function get( $row_id ) {
|
74 |
global $wpdb;
|
75 |
-
return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ), ARRAY_A );
|
76 |
}
|
77 |
|
78 |
/**
|
79 |
-
* Retrieve a row by a specific column / value
|
80 |
*
|
81 |
* @access public
|
82 |
* @since 1.5
|
83 |
-
*
|
|
|
|
|
|
|
84 |
*/
|
85 |
public function get_by( $column, $row_id ) {
|
86 |
global $wpdb;
|
87 |
$column = esc_sql( $column );
|
88 |
-
return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", $row_id ), ARRAY_A );
|
89 |
}
|
90 |
|
91 |
/**
|
92 |
-
* Retrieve a specific column's value by the primary key
|
93 |
*
|
94 |
* @access public
|
95 |
* @since 1.5
|
96 |
-
*
|
|
|
|
|
|
|
97 |
*/
|
98 |
public function get_column( $column, $row_id ) {
|
99 |
global $wpdb;
|
100 |
$column = esc_sql( $column );
|
101 |
-
return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) );
|
102 |
}
|
103 |
|
104 |
/**
|
105 |
-
* Retrieve a specific column's value by the the specified column / value
|
106 |
*
|
107 |
* @access public
|
108 |
* @since 1.5
|
109 |
-
*
|
|
|
|
|
|
|
|
|
110 |
*/
|
111 |
public function get_column_by( $column, $column_where, $column_value ) {
|
112 |
global $wpdb;
|
113 |
-
$column_where = esc_sql( $column_where );
|
114 |
$column = esc_sql( $column );
|
115 |
-
|
|
|
116 |
}
|
117 |
|
118 |
/**
|
119 |
-
* Insert a new row
|
120 |
*
|
121 |
* @access public
|
122 |
* @since 1.5
|
123 |
-
*
|
|
|
|
|
124 |
*/
|
125 |
public function insert( $data ) {
|
126 |
global $wpdb;
|
127 |
|
128 |
-
// Set default values
|
129 |
$data = wp_parse_args( $data, $this->get_column_defaults() );
|
130 |
|
131 |
-
// Initialise column format array
|
132 |
$column_formats = $this->get_columns();
|
133 |
|
134 |
-
// Force fields to lower case
|
135 |
$data = array_change_key_case( $data );
|
136 |
|
137 |
-
// White list columns
|
138 |
$data = array_intersect_key( $data, $column_formats );
|
139 |
|
140 |
-
// Reorder $column_formats to match the order of columns given in $data
|
141 |
-
$data_keys
|
142 |
$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
|
143 |
-
|
144 |
$wpdb->insert( $this->table_name, $data, $column_formats );
|
145 |
|
146 |
return $wpdb->insert_id;
|
147 |
}
|
148 |
|
149 |
/**
|
150 |
-
* Update a row
|
151 |
*
|
152 |
* @access public
|
153 |
* @since 1.5
|
154 |
-
*
|
|
|
|
|
|
|
|
|
155 |
*/
|
156 |
public function update( $row_id, $data = array(), $where = '' ) {
|
157 |
global $wpdb;
|
158 |
|
159 |
-
// Row ID must be positive integer
|
160 |
$row_id = absint( $row_id );
|
161 |
|
162 |
-
if
|
163 |
return false;
|
164 |
}
|
165 |
|
166 |
-
if( empty( $where ) ) {
|
167 |
$where = $this->primary_key;
|
168 |
}
|
169 |
|
170 |
-
// Initialise column format array
|
171 |
$column_formats = $this->get_columns();
|
172 |
|
173 |
-
// Force fields to lower case
|
174 |
$data = array_change_key_case( $data );
|
175 |
|
176 |
-
// White list columns
|
177 |
$data = array_intersect_key( $data, $column_formats );
|
178 |
|
179 |
-
// Reorder $column_formats to match the order of columns given in $data
|
180 |
-
$data_keys
|
181 |
$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
|
182 |
-
|
183 |
if ( false === (bool) $this->get_column( $this->primary_key, $row_id ) ) {
|
184 |
$this->insert( $data );
|
185 |
return true;
|
186 |
}
|
187 |
-
|
188 |
-
if ( false === $wpdb->update( $this->table_name, $data, array( $where => $row_id ), $column_formats ) ) {
|
189 |
-
return false;
|
190 |
-
}
|
191 |
|
192 |
-
return
|
193 |
}
|
194 |
|
195 |
/**
|
196 |
-
* Delete a row identified by the primary key
|
197 |
*
|
198 |
* @access public
|
199 |
* @since 1.5
|
200 |
-
*
|
|
|
|
|
201 |
*/
|
202 |
public function delete( $row_id = 0 ) {
|
203 |
global $wpdb;
|
204 |
|
205 |
-
// Row ID must be positive integer
|
206 |
$row_id = absint( $row_id );
|
207 |
|
208 |
-
if
|
209 |
return false;
|
210 |
}
|
211 |
|
212 |
-
|
213 |
-
return false;
|
214 |
-
}
|
215 |
-
|
216 |
-
return true;
|
217 |
}
|
218 |
|
219 |
/**
|
220 |
-
* Check if the given table exists
|
221 |
*
|
222 |
* @since 1.5
|
223 |
-
*
|
224 |
-
* @
|
|
|
225 |
*/
|
226 |
public function table_exists( $table ) {
|
227 |
global $wpdb;
|
@@ -230,4 +282,4 @@ abstract class Imagify_Abstract_DB {
|
|
230 |
return $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE '%s'", $table ) ) === $table;
|
231 |
}
|
232 |
|
233 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* Imagify DB base class.
|
6 |
*
|
7 |
* @source https://gist.github.com/pippinsplugins/e220a7f0f0f2fbe64608
|
8 |
* @since 1.5
|
9 |
+
*/
|
10 |
abstract class Imagify_Abstract_DB {
|
11 |
|
12 |
/**
|
13 |
+
* Class version.
|
14 |
*
|
15 |
+
* @var string
|
16 |
+
*/
|
17 |
+
const VERSION = '1.0.1';
|
18 |
+
|
19 |
+
/**
|
20 |
+
* The single instance of the class.
|
21 |
+
*
|
22 |
+
* @access protected
|
23 |
+
* @since 1.5
|
24 |
+
*
|
25 |
+
* @var object
|
26 |
+
*/
|
27 |
+
protected static $_instance;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* The name of our database table.
|
31 |
+
*
|
32 |
+
* @var string
|
33 |
* @access public
|
34 |
* @since 1.5
|
35 |
*/
|
36 |
public $table_name;
|
37 |
|
38 |
/**
|
39 |
+
* The version of our database table.
|
40 |
*
|
41 |
+
* @var string
|
42 |
* @access public
|
43 |
* @since 1.5
|
44 |
*/
|
45 |
public $version;
|
46 |
|
47 |
/**
|
48 |
+
* The name of the primary column.
|
49 |
*
|
50 |
+
* @var string
|
51 |
* @access public
|
52 |
* @since 1.5
|
53 |
*/
|
54 |
public $primary_key;
|
55 |
+
|
56 |
/**
|
57 |
+
* Get things started.
|
58 |
*
|
59 |
* @access public
|
60 |
* @since 1.5
|
61 |
*/
|
62 |
+
protected function __construct() {}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Get the main Instance.
|
66 |
+
*
|
67 |
+
* @access public
|
68 |
+
* @since 1.6.5
|
69 |
+
* @author Grégory Viguier
|
70 |
+
*
|
71 |
+
* @return object Main instance.
|
72 |
+
*/
|
73 |
+
public static function get_instance() {
|
74 |
+
if ( ! isset( self::$_instance ) ) {
|
75 |
+
self::$_instance = new self();
|
76 |
+
}
|
77 |
+
|
78 |
+
return self::$_instance;
|
79 |
+
}
|
80 |
+
|
81 |
/**
|
82 |
+
* Whitelist of columns.
|
83 |
*
|
84 |
* @access public
|
85 |
* @since 1.5
|
86 |
+
*
|
87 |
* @return array
|
88 |
*/
|
89 |
public function get_columns() {
|
91 |
}
|
92 |
|
93 |
/**
|
94 |
+
* Default column values.
|
95 |
*
|
96 |
* @access public
|
97 |
* @since 1.5
|
98 |
+
*
|
99 |
* @return array
|
100 |
*/
|
101 |
public function get_column_defaults() {
|
103 |
}
|
104 |
|
105 |
/**
|
106 |
+
* Retrieve a row by the primary key.
|
107 |
*
|
108 |
* @access public
|
109 |
* @since 1.5
|
110 |
+
*
|
111 |
+
* @param string $row_id A primary key.
|
112 |
+
* @return object
|
113 |
*/
|
114 |
public function get( $row_id ) {
|
115 |
global $wpdb;
|
116 |
+
return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ), ARRAY_A ); // WPCS: unprepared SQL ok.
|
117 |
}
|
118 |
|
119 |
/**
|
120 |
+
* Retrieve a row by a specific column / value.
|
121 |
*
|
122 |
* @access public
|
123 |
* @since 1.5
|
124 |
+
*
|
125 |
+
* @param string $column A column name.
|
126 |
+
* @param string $row_id A value.
|
127 |
+
* @return object
|
128 |
*/
|
129 |
public function get_by( $column, $row_id ) {
|
130 |
global $wpdb;
|
131 |
$column = esc_sql( $column );
|
132 |
+
return $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $this->table_name WHERE $column = %s LIMIT 1;", $row_id ), ARRAY_A ); // WPCS: unprepared SQL ok.
|
133 |
}
|
134 |
|
135 |
/**
|
136 |
+
* Retrieve a specific column's value by the primary key.
|
137 |
*
|
138 |
* @access public
|
139 |
* @since 1.5
|
140 |
+
*
|
141 |
+
* @param string $column A column name.
|
142 |
+
* @param string $row_id A primary key.
|
143 |
+
* @return string
|
144 |
*/
|
145 |
public function get_column( $column, $row_id ) {
|
146 |
global $wpdb;
|
147 |
$column = esc_sql( $column );
|
148 |
+
return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $this->primary_key = %s LIMIT 1;", $row_id ) ); // WPCS: unprepared SQL ok.
|
149 |
}
|
150 |
|
151 |
/**
|
152 |
+
* Retrieve a specific column's value by the the specified column / value.
|
153 |
*
|
154 |
* @access public
|
155 |
* @since 1.5
|
156 |
+
*
|
157 |
+
* @param string $column A column name.
|
158 |
+
* @param string $column_where A column name.
|
159 |
+
* @param string $column_value A value.
|
160 |
+
* @return string
|
161 |
*/
|
162 |
public function get_column_by( $column, $column_where, $column_value ) {
|
163 |
global $wpdb;
|
|
|
164 |
$column = esc_sql( $column );
|
165 |
+
$column_where = esc_sql( $column_where );
|
166 |
+
return $wpdb->get_var( $wpdb->prepare( "SELECT $column FROM $this->table_name WHERE $column_where = %s LIMIT 1;", $column_value ) ); // WPCS: unprepared SQL ok.
|
167 |
}
|
168 |
|
169 |
/**
|
170 |
+
* Insert a new row.
|
171 |
*
|
172 |
* @access public
|
173 |
* @since 1.5
|
174 |
+
*
|
175 |
+
* @param string $data New data.
|
176 |
+
* @return int
|
177 |
*/
|
178 |
public function insert( $data ) {
|
179 |
global $wpdb;
|
180 |
|
181 |
+
// Set default values.
|
182 |
$data = wp_parse_args( $data, $this->get_column_defaults() );
|
183 |
|
184 |
+
// Initialise column format array.
|
185 |
$column_formats = $this->get_columns();
|
186 |
|
187 |
+
// Force fields to lower case.
|
188 |
$data = array_change_key_case( $data );
|
189 |
|
190 |
+
// White list columns.
|
191 |
$data = array_intersect_key( $data, $column_formats );
|
192 |
|
193 |
+
// Reorder $column_formats to match the order of columns given in $data.
|
194 |
+
$data_keys = array_keys( $data );
|
195 |
$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
|
196 |
+
|
197 |
$wpdb->insert( $this->table_name, $data, $column_formats );
|
198 |
|
199 |
return $wpdb->insert_id;
|
200 |
}
|
201 |
|
202 |
/**
|
203 |
+
* Update a row.
|
204 |
*
|
205 |
* @access public
|
206 |
* @since 1.5
|
207 |
+
*
|
208 |
+
* @param string $row_id A primary key.
|
209 |
+
* @param array $data New data.
|
210 |
+
* @param string $where A column name.
|
211 |
+
* @return bool
|
212 |
*/
|
213 |
public function update( $row_id, $data = array(), $where = '' ) {
|
214 |
global $wpdb;
|
215 |
|
216 |
+
// Row ID must be positive integer.
|
217 |
$row_id = absint( $row_id );
|
218 |
|
219 |
+
if ( ! $row_id ) {
|
220 |
return false;
|
221 |
}
|
222 |
|
223 |
+
if ( empty( $where ) ) {
|
224 |
$where = $this->primary_key;
|
225 |
}
|
226 |
|
227 |
+
// Initialise column format array.
|
228 |
$column_formats = $this->get_columns();
|
229 |
|
230 |
+
// Force fields to lower case.
|
231 |
$data = array_change_key_case( $data );
|
232 |
|
233 |
+
// White list columns.
|
234 |
$data = array_intersect_key( $data, $column_formats );
|
235 |
|
236 |
+
// Reorder $column_formats to match the order of columns given in $data.
|
237 |
+
$data_keys = array_keys( $data );
|
238 |
$column_formats = array_merge( array_flip( $data_keys ), $column_formats );
|
239 |
+
|
240 |
if ( false === (bool) $this->get_column( $this->primary_key, $row_id ) ) {
|
241 |
$this->insert( $data );
|
242 |
return true;
|
243 |
}
|
|
|
|
|
|
|
|
|
244 |
|
245 |
+
return (bool) $wpdb->update( $this->table_name, $data, array( $where => $row_id ), $column_formats );
|
246 |
}
|
247 |
|
248 |
/**
|
249 |
+
* Delete a row identified by the primary key.
|
250 |
*
|
251 |
* @access public
|
252 |
* @since 1.5
|
253 |
+
*
|
254 |
+
* @param string $row_id A primary key.
|
255 |
+
* @return bool
|
256 |
*/
|
257 |
public function delete( $row_id = 0 ) {
|
258 |
global $wpdb;
|
259 |
|
260 |
+
// Row ID must be positive integer.
|
261 |
$row_id = absint( $row_id );
|
262 |
|
263 |
+
if ( ! $row_id ) {
|
264 |
return false;
|
265 |
}
|
266 |
|
267 |
+
return (bool) $wpdb->query( $wpdb->prepare( "DELETE FROM $this->table_name WHERE $this->primary_key = %d", $row_id ) ); // WPCS: unprepared SQL ok.
|
|
|
|
|
|
|
|
|
268 |
}
|
269 |
|
270 |
/**
|
271 |
+
* Check if the given table exists.
|
272 |
*
|
273 |
* @since 1.5
|
274 |
+
*
|
275 |
+
* @param string $table The table name.
|
276 |
+
* @return bool True if the table name exists.
|
277 |
*/
|
278 |
public function table_exists( $table ) {
|
279 |
global $wpdb;
|
282 |
return $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE '%s'", $table ) ) === $table;
|
283 |
}
|
284 |
|
285 |
+
}
|
inc/classes/class-attachment.php
DELETED
@@ -1,408 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
3 |
-
|
4 |
-
class Imagify_Attachment extends Imagify_Abstract_Attachment {
|
5 |
-
/**
|
6 |
-
* The constructor
|
7 |
-
*
|
8 |
-
* @since 1.0
|
9 |
-
*
|
10 |
-
* @return void
|
11 |
-
**/
|
12 |
-
function __construct( $id = 0 ) {
|
13 |
-
global $post;
|
14 |
-
|
15 |
-
if ( is_object( $post ) && ! $id ) {
|
16 |
-
$this->id = $post->ID;
|
17 |
-
} else {
|
18 |
-
$this->id = (int) $id;
|
19 |
-
}
|
20 |
-
}
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Get the attachment backup filepath.
|
24 |
-
*
|
25 |
-
* @since 1.0
|
26 |
-
*
|
27 |
-
* @access public
|
28 |
-
* @return string|false
|
29 |
-
*/
|
30 |
-
public function get_backup_path() {
|
31 |
-
$file_path = $this->get_original_path();
|
32 |
-
$backup_path = get_imagify_attachment_backup_path( $file_path );
|
33 |
-
|
34 |
-
if( file_exists( $backup_path ) ) {
|
35 |
-
return $backup_path;
|
36 |
-
}
|
37 |
-
|
38 |
-
return false;
|
39 |
-
}
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Get the attachment optimization data.
|
43 |
-
*
|
44 |
-
* @since 1.0
|
45 |
-
*
|
46 |
-
* @access public
|
47 |
-
* @return array
|
48 |
-
*/
|
49 |
-
public function get_data() {
|
50 |
-
return get_post_meta( $this->id, '_imagify_data', true );
|
51 |
-
}
|
52 |
-
|
53 |
-
/**
|
54 |
-
* Get the attachment optimization level.
|
55 |
-
*
|
56 |
-
* @since 1.0
|
57 |
-
*
|
58 |
-
* @access public
|
59 |
-
* @return int
|
60 |
-
*/
|
61 |
-
public function get_optimization_level() {
|
62 |
-
return get_post_meta( $this->id, '_imagify_optimization_level', true );
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Get the attachment optimization status (success or error).
|
67 |
-
*
|
68 |
-
* @since 1.0
|
69 |
-
*
|
70 |
-
* @access public
|
71 |
-
* @return string
|
72 |
-
*/
|
73 |
-
public function get_status() {
|
74 |
-
return get_post_meta( $this->id, '_imagify_status', true );
|
75 |
-
}
|
76 |
-
|
77 |
-
/**
|
78 |
-
* Get the original attachment path.
|
79 |
-
*
|
80 |
-
* @since 1.0
|
81 |
-
*
|
82 |
-
* @access public
|
83 |
-
* @return string
|
84 |
-
*/
|
85 |
-
public function get_original_path() {
|
86 |
-
return get_attached_file( $this->id );
|
87 |
-
}
|
88 |
-
|
89 |
-
/**
|
90 |
-
* Get the original attachment URL.
|
91 |
-
*
|
92 |
-
* @since 1.0
|
93 |
-
*
|
94 |
-
* @access public
|
95 |
-
* @return string
|
96 |
-
*/
|
97 |
-
public function get_original_url() {
|
98 |
-
return wp_get_attachment_url( $this->id );
|
99 |
-
}
|
100 |
-
|
101 |
-
/**
|
102 |
-
* Update the metadata size of the attachment
|
103 |
-
*
|
104 |
-
* @since 1.2
|
105 |
-
*
|
106 |
-
* @access public
|
107 |
-
* @return void
|
108 |
-
*/
|
109 |
-
public function update_metadata_size() {
|
110 |
-
if ( ! wp_attachment_is_image( $this->id ) ) {
|
111 |
-
return false;
|
112 |
-
}
|
113 |
-
|
114 |
-
$size = @getimagesize( $this->get_original_path() );
|
115 |
-
|
116 |
-
if ( isset( $size[0], $size[1] ) ) {
|
117 |
-
$metadata = wp_get_attachment_metadata( $this->id );
|
118 |
-
$metadata['width'] = $size[0];
|
119 |
-
$metadata['height'] = $size[1];
|
120 |
-
|
121 |
-
wp_update_attachment_metadata( $this->id, $metadata );
|
122 |
-
}
|
123 |
-
}
|
124 |
-
|
125 |
-
/**
|
126 |
-
* Fills statistics data with values from $data array
|
127 |
-
*
|
128 |
-
* @since 1.0
|
129 |
-
*
|
130 |
-
* @access public
|
131 |
-
* @static
|
132 |
-
* @param array $data The statistics data
|
133 |
-
* @param object $response The API response
|
134 |
-
* @param int $id The attachment ID
|
135 |
-
* @param int $url The attachment URL
|
136 |
-
* @param string $size The attachment size key
|
137 |
-
* @return bool|array False if the original size has an error or an array contains the data for other result
|
138 |
-
*/
|
139 |
-
static public function fill_data( $data, $response, $id, $url, $size = 'full' ) {
|
140 |
-
if ( is_wp_error( $response ) ) {
|
141 |
-
$error = $response->get_error_message();
|
142 |
-
$error_status = 'error';
|
143 |
-
|
144 |
-
$data['sizes'][ $size ] = array(
|
145 |
-
'success' => false,
|
146 |
-
'error' => $error
|
147 |
-
);
|
148 |
-
|
149 |
-
// Update the error status for the original size
|
150 |
-
if ( 'full' === $size ) {
|
151 |
-
update_post_meta( $id, '_imagify_data', $data );
|
152 |
-
|
153 |
-
if ( false !== strpos( $error, 'This image is already compressed' ) ) {
|
154 |
-
$error_status = 'already_optimized';
|
155 |
-
}
|
156 |
-
|
157 |
-
update_post_meta( $id, '_imagify_status', $error_status );
|
158 |
-
|
159 |
-
return false;
|
160 |
-
}
|
161 |
-
} else {
|
162 |
-
$data['sizes'][ $size ] = array(
|
163 |
-
'success' => true,
|
164 |
-
'file_url' => $url,
|
165 |
-
'original_size' => $response->original_size,
|
166 |
-
'optimized_size' => $response->new_size,
|
167 |
-
'percent' => $response->percent
|
168 |
-
);
|
169 |
-
|
170 |
-
$data['stats']['original_size'] += ( isset( $response->original_size ) ) ? $response->original_size : 0;
|
171 |
-
$data['stats']['optimized_size'] += ( isset( $response->new_size ) ) ? $response->new_size : 0;
|
172 |
-
}
|
173 |
-
|
174 |
-
return $data;
|
175 |
-
}
|
176 |
-
|
177 |
-
/**
|
178 |
-
* Optimize all sizes with Imagify.
|
179 |
-
*
|
180 |
-
* @since 1.0
|
181 |
-
*
|
182 |
-
* @access public
|
183 |
-
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal)
|
184 |
-
* @param array $metadata The attachment meta data
|
185 |
-
* @return array $optimized_data The optimization data
|
186 |
-
*/
|
187 |
-
public function optimize( $optimization_level = null, $metadata = array() ) {
|
188 |
-
$optimization_level = ( is_null( $optimization_level ) ) ? (int) get_imagify_option( 'optimization_level', 1 ) : (int) $optimization_level;
|
189 |
-
|
190 |
-
$id = $this->id;
|
191 |
-
$metadata = ( (bool) $metadata ) ? $metadata : wp_get_attachment_metadata( $id );
|
192 |
-
$sizes = ( isset( $metadata['sizes'] ) ) ? (array) $metadata['sizes'] : array();
|
193 |
-
$data = array(
|
194 |
-
'stats' => array(
|
195 |
-
'original_size' => 0,
|
196 |
-
'optimized_size' => 0,
|
197 |
-
'percent' => 0,
|
198 |
-
)
|
199 |
-
);
|
200 |
-
|
201 |
-
// To avoid issue with "original_size" at 0 in "_imagify_data"
|
202 |
-
if ( 0 === $this->get_stats_data( 'original_size' ) ) {
|
203 |
-
delete_post_meta( $id, '_imagify_data' );
|
204 |
-
delete_post_meta( $id, '_imagify_status' );
|
205 |
-
delete_post_meta( $id, '_imagify_optimization_level' );
|
206 |
-
}
|
207 |
-
|
208 |
-
// Get file path & URL for original image
|
209 |
-
$attachment_path = $this->get_original_path();
|
210 |
-
$attachment_url = $this->get_original_url();
|
211 |
-
$attachment_original_size = $this->get_original_size( false );
|
212 |
-
|
213 |
-
// Check if the attachment extension is allowed
|
214 |
-
if ( ! $id || ! wp_attachment_is_image( $id ) ) {
|
215 |
-
return;
|
216 |
-
}
|
217 |
-
|
218 |
-
// Check if the full size is already optimized
|
219 |
-
if ( $this->is_optimized() && ( $this->get_optimization_level() == $optimization_level ) ) {
|
220 |
-
return;
|
221 |
-
}
|
222 |
-
|
223 |
-
/**
|
224 |
-
* Fires before optimizing an attachment.
|
225 |
-
*
|
226 |
-
* @since 1.0
|
227 |
-
*
|
228 |
-
* @param int $id The attachment ID
|
229 |
-
*/
|
230 |
-
do_action( 'before_imagify_optimize_attachment', $id );
|
231 |
-
|
232 |
-
set_transient( 'imagify-async-in-progress-' . $id, true, 10 * MINUTE_IN_SECONDS );
|
233 |
-
|
234 |
-
// Get the resize values for the original size
|
235 |
-
$resized = false;
|
236 |
-
$do_resize = get_imagify_option( 'resize_larger', false );
|
237 |
-
$resize_width = get_imagify_option( 'resize_larger_w' );
|
238 |
-
$attachment_size = @getimagesize( $attachment_path );
|
239 |
-
|
240 |
-
if ( $do_resize && isset( $attachment_size[0] ) && $resize_width < $attachment_size[0] ) {
|
241 |
-
$resized_attachment_path = $this->resize( $attachment_path, $attachment_size, $resize_width );
|
242 |
-
|
243 |
-
if ( ! is_wp_error( $resized_attachment_path ) ) {
|
244 |
-
if ( get_imagify_option( 'backup', false ) ) {
|
245 |
-
$backup_path = get_imagify_attachment_backup_path( $attachment_path );
|
246 |
-
$backup_path_info = pathinfo( $backup_path );
|
247 |
-
|
248 |
-
wp_mkdir_p( $backup_path_info['dirname'] );
|
249 |
-
|
250 |
-
// TO DO - check and send a error message if the backup can't be created
|
251 |
-
@copy( $attachment_path, $backup_path );
|
252 |
-
imagify_chmod_file( $backup_path );
|
253 |
-
}
|
254 |
-
|
255 |
-
@rename( $resized_attachment_path, $attachment_path );
|
256 |
-
imagify_chmod_file( $attachment_path );
|
257 |
-
|
258 |
-
// If resized temp file still exists, delete it
|
259 |
-
if ( file_exists( $resized_attachment_path ) ) {
|
260 |
-
unlink( $resized_attachment_path );
|
261 |
-
}
|
262 |
-
|
263 |
-
$resized = true;
|
264 |
-
}
|
265 |
-
}
|
266 |
-
|
267 |
-
// Optimize the original size
|
268 |
-
$response = do_imagify( $attachment_path, array(
|
269 |
-
'optimization_level' => $optimization_level,
|
270 |
-
'context' => 'wp',
|
271 |
-
'resized' => $resized,
|
272 |
-
'original_size' => $attachment_original_size,
|
273 |
-
) );
|
274 |
-
$data = $this->fill_data( $data, $response, $id, $attachment_url );
|
275 |
-
|
276 |
-
// Save the optimization level
|
277 |
-
update_post_meta( $id, '_imagify_optimization_level', $optimization_level );
|
278 |
-
|
279 |
-
if ( (bool) ! $data ) {
|
280 |
-
delete_transient( 'imagify-async-in-progress-' . $id );
|
281 |
-
return;
|
282 |
-
}
|
283 |
-
|
284 |
-
// If we resized the original with success, we have to update the attachment metadata
|
285 |
-
// If not, WordPress keeps the old attachment size.
|
286 |
-
if ( $do_resize && $resized ) {
|
287 |
-
$this->update_metadata_size();
|
288 |
-
}
|
289 |
-
|
290 |
-
// Optimize all thumbnails
|
291 |
-
if ( (bool) $sizes ) {
|
292 |
-
foreach ( $sizes as $size_key => $size_data ) {
|
293 |
-
// Check if this size has to be optimized
|
294 |
-
if ( array_key_exists( $size_key, get_imagify_option( 'disallowed-sizes', array() ) ) && ! imagify_is_active_for_network() ) {
|
295 |
-
$data['sizes'][ $size_key ] = array(
|
296 |
-
'success' => false,
|
297 |
-
'error' => __( 'This size isn\'t authorized to be optimized. Update your Imagify settings if you want to optimize it.', 'imagify' )
|
298 |
-
);
|
299 |
-
continue;
|
300 |
-
}
|
301 |
-
|
302 |
-
$thumbnail_path = trailingslashit( dirname( $attachment_path ) ) . $size_data['file'];
|
303 |
-
$thumbnail_url = trailingslashit( dirname( $attachment_url ) ) . $size_data['file'];
|
304 |
-
|
305 |
-
// Optimize the thumbnail size
|
306 |
-
$response = do_imagify( $thumbnail_path, array(
|
307 |
-
'backup' => false,
|
308 |
-
'optimization_level' => $optimization_level,
|
309 |
-
'context' => 'wp'
|
310 |
-
) );
|
311 |
-
$data = $this->fill_data( $data, $response, $id, $thumbnail_url, $size_key );
|
312 |
-
|
313 |
-
/**
|
314 |
-
* Filter the optimization data of a specific thumbnail
|
315 |
-
*
|
316 |
-
* @since 1.0
|
317 |
-
*
|
318 |
-
* @param array $data The statistics data
|
319 |
-
* @param object $response The API response
|
320 |
-
* @param int $id The attachment ID
|
321 |
-
* @param string $thumbnail_path The attachment path
|
322 |
-
* @param string $thumbnail_url The attachment URL
|
323 |
-
* @param string $size_key The attachment size key
|
324 |
-
* @param bool $is_aggressive The optimization level
|
325 |
-
* @return array $data The new optimization data
|
326 |
-
*/
|
327 |
-
$data = apply_filters( 'imagify_fill_thumbnail_data', $data, $response, $id, $thumbnail_path, $thumbnail_url, $size_key, $optimization_level );
|
328 |
-
}
|
329 |
-
}
|
330 |
-
|
331 |
-
$data['stats']['percent'] = round( ( ( $data['stats']['original_size'] - $data['stats']['optimized_size'] ) / $data['stats']['original_size'] ) * 100, 2 );
|
332 |
-
|
333 |
-
update_post_meta( $id, '_imagify_data', $data );
|
334 |
-
update_post_meta( $id, '_imagify_status', 'success' );
|
335 |
-
|
336 |
-
$optimized_data = $this->get_data();
|
337 |
-
|
338 |
-
/**
|
339 |
-
* Fires after optimizing an attachment.
|
340 |
-
*
|
341 |
-
* @since 1.0
|
342 |
-
*
|
343 |
-
* @param int $id The attachment ID
|
344 |
-
* @param array $optimized_data The optimization data
|
345 |
-
*/
|
346 |
-
do_action( 'after_imagify_optimize_attachment', $id, $optimized_data );
|
347 |
-
|
348 |
-
delete_transient( 'imagify-async-in-progress-' . $id );
|
349 |
-
|
350 |
-
return $optimized_data;
|
351 |
-
}
|
352 |
-
|
353 |
-
/**
|
354 |
-
* Process an attachment restoration from the backup file.
|
355 |
-
*
|
356 |
-
* @since 1.0
|
357 |
-
*
|
358 |
-
* @access public
|
359 |
-
* @return void
|
360 |
-
*/
|
361 |
-
public function restore() {
|
362 |
-
// Stop the process if there is no backup file to restore
|
363 |
-
if ( ! $this->has_backup() ) {
|
364 |
-
return;
|
365 |
-
}
|
366 |
-
|
367 |
-
$id = $this->id;
|
368 |
-
$backup_path = $this->get_backup_path();
|
369 |
-
$attachment_path = $this->get_original_path();
|
370 |
-
|
371 |
-
/**
|
372 |
-
* Fires before restoring an attachment.
|
373 |
-
*
|
374 |
-
* @since 1.0
|
375 |
-
*
|
376 |
-
* @param int $id The attachment ID
|
377 |
-
*/
|
378 |
-
do_action( 'before_imagify_restore_attachment', $id );
|
379 |
-
|
380 |
-
// Create the original image from the backup
|
381 |
-
@copy( $backup_path, $attachment_path );
|
382 |
-
imagify_chmod_file( $attachment_path );
|
383 |
-
|
384 |
-
if ( ! function_exists( 'wp_generate_attachment_metadata' ) ) {
|
385 |
-
require_once( ABSPATH . 'wp-admin/includes/image.php' );
|
386 |
-
}
|
387 |
-
|
388 |
-
remove_filter( 'wp_generate_attachment_metadata', '_imagify_optimize_attachment', PHP_INT_MAX );
|
389 |
-
wp_generate_attachment_metadata( $id, $attachment_path );
|
390 |
-
|
391 |
-
// Remove old optimization data
|
392 |
-
delete_post_meta( $id, '_imagify_data' );
|
393 |
-
delete_post_meta( $id, '_imagify_status' );
|
394 |
-
delete_post_meta( $id, '_imagify_optimization_level' );
|
395 |
-
|
396 |
-
// Restore the original size in the metadata
|
397 |
-
$this->update_metadata_size();
|
398 |
-
|
399 |
-
/**
|
400 |
-
* Fires after restoring an attachment.
|
401 |
-
*
|
402 |
-
* @since 1.0
|
403 |
-
*
|
404 |
-
* @param int $id The attachment ID
|
405 |
-
*/
|
406 |
-
do_action( 'after_imagify_restore_attachment', $id );
|
407 |
-
}
|
408 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inc/classes/class-imagify-attachment.php
ADDED
@@ -0,0 +1,436 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Imagify Attachment class.
|
6 |
+
*
|
7 |
+
* @since 1.0
|
8 |
+
*/
|
9 |
+
class Imagify_Attachment extends Imagify_Abstract_Attachment {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Class version.
|
13 |
+
*
|
14 |
+
* @var string
|
15 |
+
*/
|
16 |
+
const VERSION = '1.0.1';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* The constructor
|
20 |
+
*
|
21 |
+
* @since 1.0
|
22 |
+
*
|
23 |
+
* @param int $id The attachment ID.
|
24 |
+
* @return void
|
25 |
+
*/
|
26 |
+
public function __construct( $id = 0 ) {
|
27 |
+
global $post;
|
28 |
+
|
29 |
+
if ( is_object( $post ) && ! $id ) {
|
30 |
+
$this->id = $post->ID;
|
31 |
+
} else {
|
32 |
+
$this->id = (int) $id;
|
33 |
+
}
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Get the attachment backup filepath.
|
38 |
+
*
|
39 |
+
* @since 1.0
|
40 |
+
* @access public
|
41 |
+
*
|
42 |
+
* @return string|bool
|
43 |
+
*/
|
44 |
+
public function get_backup_path() {
|
45 |
+
$file_path = $this->get_original_path();
|
46 |
+
$backup_path = get_imagify_attachment_backup_path( $file_path );
|
47 |
+
|
48 |
+
if ( file_exists( $backup_path ) ) {
|
49 |
+
return $backup_path;
|
50 |
+
}
|
51 |
+
|
52 |
+
return false;
|
53 |
+
}
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Get the attachment optimization data.
|
57 |
+
*
|
58 |
+
* @since 1.0
|
59 |
+
* @access public
|
60 |
+
*
|
61 |
+
* @return array
|
62 |
+
*/
|
63 |
+
public function get_data() {
|
64 |
+
$data = get_post_meta( $this->id, '_imagify_data', true );
|
65 |
+
return is_array( $data ) ? $data : array();
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Get the attachment optimization level.
|
70 |
+
*
|
71 |
+
* @since 1.0
|
72 |
+
* @access public
|
73 |
+
*
|
74 |
+
* @return int
|
75 |
+
*/
|
76 |
+
public function get_optimization_level() {
|
77 |
+
return (int) get_post_meta( $this->id, '_imagify_optimization_level', true );
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Get the attachment optimization status (success or error).
|
82 |
+
*
|
83 |
+
* @since 1.0
|
84 |
+
* @access public
|
85 |
+
*
|
86 |
+
* @return string
|
87 |
+
*/
|
88 |
+
public function get_status() {
|
89 |
+
$status = get_post_meta( $this->id, '_imagify_status', true );
|
90 |
+
return is_string( $status ) ? $status : '';
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Get the original attachment path.
|
95 |
+
*
|
96 |
+
* @since 1.0
|
97 |
+
* @access public
|
98 |
+
*
|
99 |
+
* @return string
|
100 |
+
*/
|
101 |
+
public function get_original_path() {
|
102 |
+
return get_attached_file( $this->id );
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Get the original attachment URL.
|
107 |
+
*
|
108 |
+
* @since 1.0
|
109 |
+
* @access public
|
110 |
+
*
|
111 |
+
* @return string
|
112 |
+
*/
|
113 |
+
public function get_original_url() {
|
114 |
+
return wp_get_attachment_url( $this->id );
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Update the metadata size of the attachment.
|
119 |
+
*
|
120 |
+
* @since 1.2
|
121 |
+
* @access public
|
122 |
+
*
|
123 |
+
* @return bool
|
124 |
+
*/
|
125 |
+
public function update_metadata_size() {
|
126 |
+
if ( ! wp_attachment_is_image( $this->id ) ) {
|
127 |
+
return false;
|
128 |
+
}
|
129 |
+
|
130 |
+
$size = @getimagesize( $this->get_original_path() );
|
131 |
+
|
132 |
+
if ( ! isset( $size[0], $size[1] ) ) {
|
133 |
+
return false;
|
134 |
+
}
|
135 |
+
|
136 |
+
$metadata = wp_get_attachment_metadata( $this->id );
|
137 |
+
$metadata['width'] = $size[0];
|
138 |
+
$metadata['height'] = $size[1];
|
139 |
+
|
140 |
+
wp_update_attachment_metadata( $this->id, $metadata );
|
141 |
+
return true;
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Fills statistics data with values from $data array.
|
146 |
+
*
|
147 |
+
* @since 1.0
|
148 |
+
* @since 1.6.5 Not static anymore.
|
149 |
+
* @access public
|
150 |
+
*
|
151 |
+
* @param array $data The statistics data.
|
152 |
+
* @param object $response The API response.
|
153 |
+
* @param int $id The attachment ID.
|
154 |
+
* @param int $url The attachment URL.
|
155 |
+
* @param string $size The attachment size key.
|
156 |
+
* @return bool|array False if the original size has an error or an array contains the data for other result.
|
157 |
+
*/
|
158 |
+
public function fill_data( $data, $response, $id, $url, $size = 'full' ) {
|
159 |
+
$data['sizes'] = ! empty( $data['sizes'] ) && is_array( $data['sizes'] ) ? $data['sizes'] : array();
|
160 |
+
|
161 |
+
if ( is_wp_error( $response ) ) {
|
162 |
+
$error = $response->get_error_message();
|
163 |
+
$error_status = 'error';
|
164 |
+
|
165 |
+
$data['sizes'][ $size ] = array(
|
166 |
+
'success' => false,
|
167 |
+
'error' => $error,
|
168 |
+
);
|
169 |
+
|
170 |
+
// Update the error status for the original size.
|
171 |
+
if ( 'full' === $size ) {
|
172 |
+
update_post_meta( $id, '_imagify_data', $data );
|
173 |
+
|
174 |
+
if ( false !== strpos( $error, 'This image is already compressed' ) ) {
|
175 |
+
$error_status = 'already_optimized';
|
176 |
+
}
|
177 |
+
|
178 |
+
update_post_meta( $id, '_imagify_status', $error_status );
|
179 |
+
|
180 |
+
return false;
|
181 |
+
}
|
182 |
+
} else {
|
183 |
+
$response = (object) array_merge( array(
|
184 |
+
'original_size' => 0,
|
185 |
+
'new_size' => 0,
|
186 |
+
'percent' => 0,
|
187 |
+
), (array) $response );
|
188 |
+
|
189 |
+
$data['sizes'][ $size ] = array(
|
190 |
+
'success' => true,
|
191 |
+
'file_url' => $url,
|
192 |
+
'original_size' => $response->original_size,
|
193 |
+
'optimized_size' => $response->new_size,
|
194 |
+
'percent' => $response->percent,
|
195 |
+
);
|
196 |
+
|
197 |
+
$data['stats']['original_size'] += $response->original_size;
|
198 |
+
$data['stats']['optimized_size'] += $response->new_size;
|
199 |
+
} // End if().
|
200 |
+
|
201 |
+
return $data;
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Optimize all sizes with Imagify.
|
206 |
+
*
|
207 |
+
* @since 1.0
|
208 |
+
* @access public
|
209 |
+
*
|
210 |
+
* @param int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal).
|
211 |
+
* @param array $metadata The attachment meta data.
|
212 |
+
* @return array $optimized_data The optimization data.
|
213 |
+
*/
|
214 |
+
public function optimize( $optimization_level = null, $metadata = array() ) {
|
215 |
+
$optimization_level = is_null( $optimization_level ) ? (int) get_imagify_option( 'optimization_level', 1 ) : (int) $optimization_level;
|
216 |
+
|
217 |
+
$metadata = $metadata ? $metadata : wp_get_attachment_metadata( $this->id );
|
218 |
+
$sizes = isset( $metadata['sizes'] ) ? (array) $metadata['sizes'] : array();
|
219 |
+
$data = array(
|
220 |
+
'stats' => array(
|
221 |
+
'original_size' => 0,
|
222 |
+
'optimized_size' => 0,
|
223 |
+
'percent' => 0,
|
224 |
+
),
|
225 |
+
);
|
226 |
+
|
227 |
+
// To avoid issue with "original_size" at 0 in "_imagify_data".
|
228 |
+
if ( 0 === (int) $this->get_stats_data( 'original_size' ) ) {
|
229 |
+
delete_post_meta( $this->id, '_imagify_data' );
|
230 |
+
delete_post_meta( $this->id, '_imagify_status' );
|
231 |
+
delete_post_meta( $this->id, '_imagify_optimization_level' );
|
232 |
+
}
|
233 |
+
|
234 |
+
// Get file path & URL for original image.
|
235 |
+
$attachment_path = $this->get_original_path();
|
236 |
+
$attachment_url = $this->get_original_url();
|
237 |
+
$attachment_original_size = $this->get_original_size( false );
|
238 |
+
|
239 |
+
// Check if the attachment extension is allowed.
|
240 |
+
if ( ! $this->id || ! wp_attachment_is_image( $this->id ) ) {
|
241 |
+
return;
|
242 |
+
}
|
243 |
+
|
244 |
+
// Check if the full size is already optimized.
|
245 |
+
if ( $this->is_optimized() && ( $this->get_optimization_level() === $optimization_level ) ) {
|
246 |
+
return;
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Fires before optimizing an attachment.
|
251 |
+
*
|
252 |
+
* @since 1.0
|
253 |
+
*
|
254 |
+
* @param int $id The attachment ID.
|
255 |
+
*/
|
256 |
+
do_action( 'before_imagify_optimize_attachment', $this->id );
|
257 |
+
|
258 |
+
set_transient( 'imagify-async-in-progress-' . $this->id, true, 10 * MINUTE_IN_SECONDS );
|
259 |
+
|
260 |
+
// Get the resize values for the original size.
|
261 |
+
$resized = false;
|
262 |
+
$do_resize = get_imagify_option( 'resize_larger', false );
|
263 |
+
$resize_width = get_imagify_option( 'resize_larger_w' );
|
264 |
+
$attachment_size = @getimagesize( $attachment_path );
|
265 |
+
|
266 |
+
if ( $do_resize && isset( $attachment_size[0] ) && $resize_width < $attachment_size[0] ) {
|
267 |
+
$resized_attachment_path = $this->resize( $attachment_path, $attachment_size, $resize_width );
|
268 |
+
|
269 |
+
if ( ! is_wp_error( $resized_attachment_path ) ) {
|
270 |
+
$filesystem = imagify_get_filesystem();
|
271 |
+
|
272 |
+
if ( get_imagify_option( 'backup', false ) ) {
|
273 |
+
$backup_path = get_imagify_attachment_backup_path( $attachment_path );
|
274 |
+
$backup_path_info = pathinfo( $backup_path );
|
275 |
+
|
276 |
+
wp_mkdir_p( $backup_path_info['dirname'] );
|
277 |
+
|
278 |
+
// TO DO - check and send a error message if the backup can't be created.
|
279 |
+
$filesystem->copy( $attachment_path, $backup_path, true );
|
280 |
+
imagify_chmod_file( $backup_path );
|
281 |
+
}
|
282 |
+
|
283 |
+
$filesystem->move( $resized_attachment_path, $attachment_path, true );
|
284 |
+
imagify_chmod_file( $attachment_path );
|
285 |
+
|
286 |
+
// If resized temp file still exists, delete it.
|
287 |
+
if ( $filesystem->exists( $resized_attachment_path ) ) {
|
288 |
+
$filesystem->delete( $resized_attachment_path );
|
289 |
+
}
|
290 |
+
|
291 |
+
$resized = true;
|
292 |
+
}
|
293 |
+
}
|
294 |
+
|
295 |
+
// Optimize the original size.
|
296 |
+
$response = do_imagify( $attachment_path, array(
|
297 |
+
'optimization_level' => $optimization_level,
|
298 |
+
'context' => 'wp',
|
299 |
+
'resized' => $resized,
|
300 |
+
'original_size' => $attachment_original_size,
|
301 |
+
) );
|
302 |
+
$data = $this->fill_data( $data, $response, $this->id, $attachment_url );
|
303 |
+
|
304 |
+
if ( ! $data ) {
|
305 |
+
delete_transient( 'imagify-async-in-progress-' . $this->id );
|
306 |
+
return;
|
307 |
+
}
|
308 |
+
|
309 |
+
// Save the optimization level.
|
310 |
+
update_post_meta( $this->id, '_imagify_optimization_level', $optimization_level );
|
311 |
+
|
312 |
+
// If we resized the original with success, we have to update the attachment metadata.
|
313 |
+
// If not, WordPress keeps the old attachment size.
|
314 |
+
if ( $do_resize && $resized ) {
|
315 |
+
$this->update_metadata_size();
|
316 |
+
}
|
317 |
+
|
318 |
+
// Optimize all thumbnails.
|
319 |
+
if ( $sizes ) {
|
320 |
+
foreach ( $sizes as $size_key => $size_data ) {
|
321 |
+
// Check if this size has to be optimized.
|
322 |
+
if ( array_key_exists( $size_key, get_imagify_option( 'disallowed-sizes', array() ) ) && ! imagify_is_active_for_network() ) {
|
323 |
+
$data['sizes'][ $size_key ] = array(
|
324 |
+
'success' => false,
|
325 |
+
'error' => __( 'This size isn\'t authorized to be optimized. Update your Imagify settings if you want to optimize it.', 'imagify' ),
|
326 |
+
);
|
327 |
+
continue;
|
328 |
+
}
|
329 |
+
|
330 |
+
$thumbnail_path = trailingslashit( dirname( $attachment_path ) ) . $size_data['file'];
|
331 |
+
$thumbnail_url = trailingslashit( dirname( $attachment_url ) ) . $size_data['file'];
|
332 |
+
|
333 |
+
// Optimize the thumbnail size.
|
334 |
+
$response = do_imagify( $thumbnail_path, array(
|
335 |
+
'backup' => false,
|
336 |
+
'optimization_level' => $optimization_level,
|
337 |
+
'context' => 'wp',
|
338 |
+
) );
|
339 |
+
$data = $this->fill_data( $data, $response, $this->id, $thumbnail_url, $size_key );
|
340 |
+
|
341 |
+
/**
|
342 |
+
* Filter the optimization data of a specific thumbnail.
|
343 |
+
*
|
344 |
+
* @since 1.0
|
345 |
+
*
|
346 |
+
* @param array $data The statistics data.
|
347 |
+
* @param object $response The API response.
|
348 |
+
* @param int $id The attachment ID.
|
349 |
+
* @param string $thumbnail_path The attachment path.
|
350 |
+
* @param string $thumbnail_url The attachment URL.
|
351 |
+
* @param string $size_key The attachment size key.
|
352 |
+
* @param bool $is_aggressive The optimization level.
|
353 |
+
* @return array $data The new optimization data.
|
354 |
+
*/
|
355 |
+
$data = apply_filters( 'imagify_fill_thumbnail_data', $data, $response, $this->id, $thumbnail_path, $thumbnail_url, $size_key, $optimization_level );
|
356 |
+
} // End foreach().
|
357 |
+
} // End if().
|
358 |
+
|
359 |
+
$data['stats']['percent'] = round( ( ( $data['stats']['original_size'] - $data['stats']['optimized_size'] ) / $data['stats']['original_size'] ) * 100, 2 );
|
360 |
+
|
361 |
+
update_post_meta( $this->id, '_imagify_data', $data );
|
362 |
+
update_post_meta( $this->id, '_imagify_status', 'success' );
|
363 |
+
|
364 |
+
$optimized_data = $this->get_data();
|
365 |
+
|
366 |
+
/**
|
367 |
+
* Fires after optimizing an attachment.
|
368 |
+
*
|
369 |
+
* @since 1.0
|
370 |
+
*
|
371 |
+
* @param int $id The attachment ID.
|
372 |
+
* @param array $optimized_data The optimization data.
|
373 |
+
*/
|
374 |
+
do_action( 'after_imagify_optimize_attachment', $this->id, $optimized_data );
|
375 |
+
|
376 |
+
delete_transient( 'imagify-async-in-progress-' . $this->id );
|
377 |
+
|
378 |
+
return $optimized_data;
|
379 |
+
}
|
380 |
+
|
381 |
+
/**
|
382 |
+
* Process an attachment restoration from the backup file.
|
383 |
+
*
|
384 |
+
* @since 1.0
|
385 |
+
* @access public
|
386 |
+
*
|
387 |
+
* @return void
|
388 |
+
*/
|
389 |
+
public function restore() {
|
390 |
+
// Stop the process if there is no backup file to restore.
|
391 |
+
if ( ! $this->has_backup() ) {
|
392 |
+
return;
|
393 |
+
}
|
394 |
+
|
395 |
+
$backup_path = $this->get_backup_path();
|
396 |
+
$attachment_path = $this->get_original_path();
|
397 |
+
$filesystem = imagify_get_filesystem();
|
398 |
+
|
399 |
+
/**
|
400 |
+
* Fires before restoring an attachment.
|
401 |
+
*
|
402 |
+
* @since 1.0
|
403 |
+
*
|
404 |
+
* @param int $id The attachment ID
|
405 |
+
*/
|
406 |
+
do_action( 'before_imagify_restore_attachment', $this->id );
|
407 |
+
|
408 |
+
// Create the original image from the backup.
|
409 |
+
$filesystem->copy( $backup_path, $attachment_path, true );
|
410 |
+
imagify_chmod_file( $attachment_path );
|
411 |
+
|
412 |
+
if ( ! function_exists( 'wp_generate_attachment_metadata' ) ) {
|
413 |
+
require_once( ABSPATH . 'wp-admin/includes/image.php' );
|
414 |
+
}
|
415 |
+
|
416 |
+
remove_filter( 'wp_generate_attachment_metadata', '_imagify_optimize_attachment', PHP_INT_MAX );
|
417 |
+
wp_generate_attachment_metadata( $this->id, $attachment_path );
|
418 |
+
|
419 |
+
// Remove old optimization data.
|
420 |
+
delete_post_meta( $this->id, '_imagify_data' );
|
421 |
+
delete_post_meta( $this->id, '_imagify_status' );
|
422 |
+
delete_post_meta( $this->id, '_imagify_optimization_level' );
|
423 |
+
|
424 |
+
// Restore the original size in the metadata.
|
425 |
+
$this->update_metadata_size();
|
426 |
+
|
427 |
+
/**
|
428 |
+
* Fires after restoring an attachment.
|
429 |
+
*
|
430 |
+
* @since 1.0
|
431 |
+
*
|
432 |
+
* @param int $id The attachment ID
|
433 |
+
*/
|
434 |
+
do_action( 'after_imagify_restore_attachment', $this->id );
|
435 |
+
}
|
436 |
+
}
|
inc/classes/{class-user.php → class-imagify-user.php}
RENAMED
@@ -1,9 +1,22 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
|
|
|
|
|
|
|
|
4 |
class Imagify_User {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
/**
|
6 |
-
* The Imagify user ID
|
7 |
*
|
8 |
* @since 1.0
|
9 |
*
|
@@ -11,9 +24,9 @@ class Imagify_User {
|
|
11 |
* @access public
|
12 |
*/
|
13 |
public $id;
|
14 |
-
|
15 |
/**
|
16 |
-
* The user email
|
17 |
*
|
18 |
* @since 1.0
|
19 |
*
|
@@ -23,7 +36,7 @@ class Imagify_User {
|
|
23 |
public $email;
|
24 |
|
25 |
/**
|
26 |
-
* The plan ID
|
27 |
*
|
28 |
* @since 1.0
|
29 |
*
|
@@ -31,9 +44,9 @@ class Imagify_User {
|
|
31 |
* @access public
|
32 |
*/
|
33 |
public $plan_id;
|
34 |
-
|
35 |
/**
|
36 |
-
* The plan label
|
37 |
*
|
38 |
* @since 1.2
|
39 |
*
|
@@ -43,7 +56,7 @@ class Imagify_User {
|
|
43 |
public $plan_label;
|
44 |
|
45 |
/**
|
46 |
-
* The total quota
|
47 |
*
|
48 |
* @since 1.0
|
49 |
*
|
@@ -51,9 +64,9 @@ class Imagify_User {
|
|
51 |
* @access public
|
52 |
*/
|
53 |
public $quota;
|
54 |
-
|
55 |
/**
|
56 |
-
* The total extra quota (Imagify Pack)
|
57 |
*
|
58 |
* @since 1.0
|
59 |
*
|
@@ -61,9 +74,9 @@ class Imagify_User {
|
|
61 |
* @access public
|
62 |
*/
|
63 |
public $extra_quota;
|
64 |
-
|
65 |
/**
|
66 |
-
* The extra quota consumed
|
67 |
*
|
68 |
* @since 1.0
|
69 |
*
|
@@ -73,7 +86,7 @@ class Imagify_User {
|
|
73 |
public $extra_quota_consumed;
|
74 |
|
75 |
/**
|
76 |
-
* The current month consumed quota
|
77 |
*
|
78 |
* @since 1.0
|
79 |
*
|
@@ -81,9 +94,9 @@ class Imagify_User {
|
|
81 |
* @access public
|
82 |
*/
|
83 |
public $consumed_current_month_quota;
|
84 |
-
|
85 |
/**
|
86 |
-
* The next month date to credit the account
|
87 |
*
|
88 |
* @since 1.1.1
|
89 |
*
|
@@ -91,9 +104,9 @@ class Imagify_User {
|
|
91 |
* @access public
|
92 |
*/
|
93 |
public $next_date_update;
|
94 |
-
|
95 |
/**
|
96 |
-
* If the account is activate or not
|
97 |
*
|
98 |
* @since 1.0.1
|
99 |
*
|
@@ -101,29 +114,31 @@ class Imagify_User {
|
|
101 |
* @access public
|
102 |
*/
|
103 |
public $is_active;
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
* @since 1.0
|
109 |
*
|
110 |
-
|
111 |
-
|
112 |
public function __construct() {
|
113 |
$user = get_imagify_user();
|
114 |
|
115 |
-
if (
|
116 |
-
|
117 |
-
$this->email = $user->email;
|
118 |
-
$this->plan_id = $user->plan_id;
|
119 |
-
$this->plan_label = ucfirst( $user->plan_label );
|
120 |
-
$this->quota = $user->quota;
|
121 |
-
$this->extra_quota = $user->extra_quota;
|
122 |
-
$this->extra_quota_consumed = $user->extra_quota_consumed;
|
123 |
-
$this->consumed_current_month_quota = $user->consumed_current_month_quota;
|
124 |
-
$this->next_date_update = $user->next_date_update;
|
125 |
-
$this->is_active = $user->is_active;
|
126 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
}
|
128 |
|
129 |
/**
|
@@ -138,19 +153,19 @@ class Imagify_User {
|
|
138 |
$percent = 0;
|
139 |
$quota = $this->quota;
|
140 |
$consumed_quota = $this->consumed_current_month_quota;
|
141 |
-
|
142 |
if ( ( $this->quota + $this->extra_quota ) - ( $this->consumed_current_month_quota + $this->extra_quota_consumed ) <= 0 ) {
|
143 |
return 100;
|
144 |
}
|
145 |
-
|
146 |
-
if( imagify_round_half_five( $this->extra_quota_consumed ) < $this->extra_quota ) {
|
147 |
$quota = $this->extra_quota + $quota;
|
148 |
$consumed_quota = $consumed_quota + $this->extra_quota_consumed;
|
149 |
}
|
150 |
-
|
151 |
$percent = 100 - ( ( $quota - $consumed_quota ) / $quota ) * 100;
|
152 |
-
$percent = min
|
153 |
-
|
154 |
return $percent;
|
155 |
}
|
156 |
|
@@ -166,7 +181,7 @@ class Imagify_User {
|
|
166 |
$percent = 100 - $this->get_percent_consumed_quota();
|
167 |
return $percent;
|
168 |
}
|
169 |
-
|
170 |
/**
|
171 |
* Check if the user has a free account.
|
172 |
*
|
@@ -176,13 +191,13 @@ class Imagify_User {
|
|
176 |
* @return bool
|
177 |
*/
|
178 |
public function is_free() {
|
179 |
-
if ( 1
|
180 |
return true;
|
181 |
}
|
182 |
-
|
183 |
return false;
|
184 |
}
|
185 |
-
|
186 |
/**
|
187 |
* Check if the user has consumed its quota.
|
188 |
*
|
@@ -192,10 +207,10 @@ class Imagify_User {
|
|
192 |
* @return bool
|
193 |
*/
|
194 |
public function is_over_quota() {
|
195 |
-
if ( $this->is_free() && 100
|
196 |
return true;
|
197 |
}
|
198 |
-
|
199 |
return false;
|
200 |
}
|
201 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
/**
|
5 |
+
* Imagify User class.
|
6 |
+
*
|
7 |
+
* @since 1.0
|
8 |
+
*/
|
9 |
class Imagify_User {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Class version.
|
13 |
+
*
|
14 |
+
* @var string
|
15 |
+
*/
|
16 |
+
const VERSION = '1.0.1';
|
17 |
+
|
18 |
/**
|
19 |
+
* The Imagify user ID.
|
20 |
*
|
21 |
* @since 1.0
|
22 |
*
|
24 |
* @access public
|
25 |
*/
|
26 |
public $id;
|
27 |
+
|
28 |
/**
|
29 |
+
* The user email.
|
30 |
*
|
31 |
* @since 1.0
|
32 |
*
|
36 |
public $email;
|
37 |
|
38 |
/**
|
39 |
+
* The plan ID.
|
40 |
*
|
41 |
* @since 1.0
|
42 |
*
|
44 |
* @access public
|
45 |
*/
|
46 |
public $plan_id;
|
47 |
+
|
48 |
/**
|
49 |
+
* The plan label.
|
50 |
*
|
51 |
* @since 1.2
|
52 |
*
|
56 |
public $plan_label;
|
57 |
|
58 |
/**
|
59 |
+
* The total quota.
|
60 |
*
|
61 |
* @since 1.0
|
62 |
*
|
64 |
* @access public
|
65 |
*/
|
66 |
public $quota;
|
67 |
+
|
68 |
/**
|
69 |
+
* The total extra quota (Imagify Pack).
|
70 |
*
|
71 |
* @since 1.0
|
72 |
*
|
74 |
* @access public
|
75 |
*/
|
76 |
public $extra_quota;
|
77 |
+
|
78 |
/**
|
79 |
+
* The extra quota consumed.
|
80 |
*
|
81 |
* @since 1.0
|
82 |
*
|
86 |
public $extra_quota_consumed;
|
87 |
|
88 |
/**
|
89 |
+
* The current month consumed quota.
|
90 |
*
|
91 |
* @since 1.0
|
92 |
*
|
94 |
* @access public
|
95 |
*/
|
96 |
public $consumed_current_month_quota;
|
97 |
+
|
98 |
/**
|
99 |
+
* The next month date to credit the account.
|
100 |
*
|
101 |
* @since 1.1.1
|
102 |
*
|
104 |
* @access public
|
105 |
*/
|
106 |
public $next_date_update;
|
107 |
+
|
108 |
/**
|
109 |
+
* If the account is activate or not.
|
110 |
*
|
111 |
* @since 1.0.1
|
112 |
*
|
114 |
* @access public
|
115 |
*/
|
116 |
public $is_active;
|
117 |
+
|
118 |
+
/**
|
119 |
+
* The constructor.
|
120 |
+
*
|
121 |
* @since 1.0
|
122 |
*
|
123 |
+
* @return void
|
124 |
+
*/
|
125 |
public function __construct() {
|
126 |
$user = get_imagify_user();
|
127 |
|
128 |
+
if ( is_wp_error( $user ) ) {
|
129 |
+
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
}
|
131 |
+
|
132 |
+
$this->id = $user->id;
|
133 |
+
$this->email = $user->email;
|
134 |
+
$this->plan_id = (int) $user->plan_id;
|
135 |
+
$this->plan_label = ucfirst( $user->plan_label );
|
136 |
+
$this->quota = $user->quota;
|
137 |
+
$this->extra_quota = $user->extra_quota;
|
138 |
+
$this->extra_quota_consumed = $user->extra_quota_consumed;
|
139 |
+
$this->consumed_current_month_quota = $user->consumed_current_month_quota;
|
140 |
+
$this->next_date_update = $user->next_date_update;
|
141 |
+
$this->is_active = $user->is_active;
|
142 |
}
|
143 |
|
144 |
/**
|
153 |
$percent = 0;
|
154 |
$quota = $this->quota;
|
155 |
$consumed_quota = $this->consumed_current_month_quota;
|
156 |
+
|
157 |
if ( ( $this->quota + $this->extra_quota ) - ( $this->consumed_current_month_quota + $this->extra_quota_consumed ) <= 0 ) {
|
158 |
return 100;
|
159 |
}
|
160 |
+
|
161 |
+
if ( imagify_round_half_five( $this->extra_quota_consumed ) < $this->extra_quota ) {
|
162 |
$quota = $this->extra_quota + $quota;
|
163 |
$consumed_quota = $consumed_quota + $this->extra_quota_consumed;
|
164 |
}
|
165 |
+
|
166 |
$percent = 100 - ( ( $quota - $consumed_quota ) / $quota ) * 100;
|
167 |
+
$percent = min( round( $percent, 1 ), 100 );
|
168 |
+
|
169 |
return $percent;
|
170 |
}
|
171 |
|
181 |
$percent = 100 - $this->get_percent_consumed_quota();
|
182 |
return $percent;
|
183 |
}
|
184 |
+
|
185 |
/**
|
186 |
* Check if the user has a free account.
|
187 |
*
|
191 |
* @return bool
|
192 |
*/
|
193 |
public function is_free() {
|
194 |
+
if ( 1 === $this->plan_id ) {
|
195 |
return true;
|
196 |
}
|
197 |
+
|
198 |
return false;
|
199 |
}
|
200 |
+
|
201 |
/**
|
202 |
* Check if the user has consumed its quota.
|
203 |
*
|
207 |
* @return bool
|
208 |
*/
|
209 |
public function is_over_quota() {
|
210 |
+
if ( $this->is_free() && 100 === $this->get_percent_consumed_quota() ) {
|
211 |
return true;
|
212 |
}
|
213 |
+
|
214 |
return false;
|
215 |
}
|
216 |
+
}
|
inc/classes/class-imagify.php
ADDED
@@ -0,0 +1,368 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Imagify.io API for WordPress.
|
6 |
+
*/
|
7 |
+
class Imagify extends Imagify_Deprecated {
|
8 |
+
|
9 |
+
/**
|
10 |
+
* Class version.
|
11 |
+
*
|
12 |
+
* @var string
|
13 |
+
*/
|
14 |
+
const VERSION = '1.0.1';
|
15 |
+
/**
|
16 |
+
* The Imagify API endpoint.
|
17 |
+
*
|
18 |
+
* @var string
|
19 |
+
*/
|
20 |
+
const API_ENDPOINT = 'https://app.imagify.io/api/';
|
21 |
+
|
22 |
+
/**
|
23 |
+
* The Imagify API key.
|
24 |
+
*
|
25 |
+
* @var string
|
26 |
+
*/
|
27 |
+
private $api_key = '';
|
28 |
+
|
29 |
+
/**
|
30 |
+
* HTTP headers.
|
31 |
+
*
|
32 |
+
* @var array
|
33 |
+
*/
|
34 |
+
private $headers = array();
|
35 |
+
|
36 |
+
/**
|
37 |
+
* The single instance of the class.
|
38 |
+
*
|
39 |
+
* @access protected
|
40 |
+
*
|
41 |
+
* @var object
|
42 |
+
*/
|
43 |
+
protected static $_instance;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* The constructor.
|
47 |
+
*
|
48 |
+
* @return void
|
49 |
+
*/
|
50 |
+
protected function __construct() {
|
51 |
+
// Check if the WordPress plugin is activated and the API key is stored in the options.
|
52 |
+
if ( defined( 'IMAGIFY_VERSION' ) && function_exists( 'get_imagify_option' ) ) {
|
53 |
+
$api_key = get_imagify_option( 'api_key', false );
|
54 |
+
$this->api_key = $api_key ? $api_key : $this->api_key;
|
55 |
+
}
|
56 |
+
|
57 |
+
// Check if the API key is defined with the PHP constant (it's ovveride the WordPress plugin option.
|
58 |
+
if ( defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) {
|
59 |
+
$this->api_key = IMAGIFY_API_KEY;
|
60 |
+
}
|
61 |
+
|
62 |
+
$this->headers['Accept'] = 'Accept: application/json';
|
63 |
+
$this->headers['Content-Type'] = 'Content-Type: application/json';
|
64 |
+
$this->headers['Authorization'] = 'Authorization: token ' . $this->api_key;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Get the main Instance.
|
69 |
+
*
|
70 |
+
* @access public
|
71 |
+
* @since 1.6.5
|
72 |
+
* @author Grégory Viguier
|
73 |
+
*
|
74 |
+
* @return object Main instance.
|
75 |
+
*/
|
76 |
+
public static function get_instance() {
|
77 |
+
if ( ! isset( self::$_instance ) ) {
|
78 |
+
self::$_instance = new self();
|
79 |
+
}
|
80 |
+
|
81 |
+
return self::$_instance;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Get your Imagify account infos.
|
86 |
+
*
|
87 |
+
* @access public
|
88 |
+
* @since 1.6.5
|
89 |
+
*
|
90 |
+
* @return object
|
91 |
+
*/
|
92 |
+
public function get_user() {
|
93 |
+
static $user;
|
94 |
+
|
95 |
+
if ( ! isset( $user ) ) {
|
96 |
+
$user = $this->http_call( 'users/me/', array(
|
97 |
+
'timeout' => 10,
|
98 |
+
) );
|
99 |
+
}
|
100 |
+
|
101 |
+
return $user;
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Create a user on your Imagify account.
|
106 |
+
*
|
107 |
+
* @access public
|
108 |
+
* @since 1.6.5
|
109 |
+
*
|
110 |
+
* @param array $data All user data. Details here: --.
|
111 |
+
* @return object
|
112 |
+
*/
|
113 |
+
public function create_user( $data ) {
|
114 |
+
unset( $this->headers['Authorization'], $this->headers['Accept'], $this->headers['Content-Type'] );
|
115 |
+
|
116 |
+
$data['from_plugin'] = true;
|
117 |
+
|
118 |
+
return $this->http_call( 'users/', array(
|
119 |
+
'method' => 'POST',
|
120 |
+
'post_data' => $data,
|
121 |
+
) );
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Update an existing user on your Imagify account.
|
126 |
+
*
|
127 |
+
* @access public
|
128 |
+
* @since 1.6.5
|
129 |
+
*
|
130 |
+
* @param string $data All user data. Details here: --.
|
131 |
+
* @return object
|
132 |
+
*/
|
133 |
+
public function update_user( $data ) {
|
134 |
+
return $this->http_call( 'users/me/', array(
|
135 |
+
'method' => 'PUT',
|
136 |
+
'post_data' => $data,
|
137 |
+
'timeout' => 10,
|
138 |
+
) );
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Check your Imagify API key status.
|
143 |
+
*
|
144 |
+
* @access public
|
145 |
+
* @since 1.6.5
|
146 |
+
*
|
147 |
+
* @param string $data The license key.
|
148 |
+
* @return object
|
149 |
+
*/
|
150 |
+
public function get_status( $data ) {
|
151 |
+
static $status = array();
|
152 |
+
|
153 |
+
if ( ! isset( $status[ $data ] ) ) {
|
154 |
+
unset( $this->headers['Accept'], $this->headers['Content-Type'] );
|
155 |
+
$this->headers['Authorization'] = 'Authorization: token ' . $data;
|
156 |
+
|
157 |
+
$status[ $data ] = $this->http_call( 'status/', array(
|
158 |
+
'timeout' => 10,
|
159 |
+
) );
|
160 |
+
}
|
161 |
+
|
162 |
+
return $status[ $data ];
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Get the Imagify API version.
|
167 |
+
*
|
168 |
+
* @access public
|
169 |
+
* @since 1.6.5
|
170 |
+
*
|
171 |
+
* @return object
|
172 |
+
*/
|
173 |
+
public function get_api_version() {
|
174 |
+
static $api_version;
|
175 |
+
|
176 |
+
if ( ! isset( $api_version ) ) {
|
177 |
+
unset( $this->headers['Accept'], $this->headers['Content-Type'] );
|
178 |
+
|
179 |
+
$api_version = $this->http_call( 'version/', array(
|
180 |
+
'timeout' => 5,
|
181 |
+
) );
|
182 |
+
}
|
183 |
+
|
184 |
+
return $api_version;
|
185 |
+
}
|
186 |
+
|
187 |
+
/**
|
188 |
+
* Get Public Info.
|
189 |
+
*
|
190 |
+
* @access public
|
191 |
+
* @since 1.6.5
|
192 |
+
*
|
193 |
+
* @return object
|
194 |
+
*/
|
195 |
+
public function get_public_info() {
|
196 |
+
return $this->http_call( 'public-info' );
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Optimize an image from its binary content.
|
201 |
+
*
|
202 |
+
* @access public
|
203 |
+
* @since 1.6.5
|
204 |
+
*
|
205 |
+
* @param string $data All options. Details here: --.
|
206 |
+
* @return object
|
207 |
+
*/
|
208 |
+
public function upload_image( $data ) {
|
209 |
+
unset( $this->headers['Accept'], $this->headers['Content-Type'] );
|
210 |
+
|
211 |
+
return $this->http_call( 'upload/', array(
|
212 |
+
'method' => 'POST',
|
213 |
+
'post_data' => $data,
|
214 |
+
) );
|
215 |
+
}
|
216 |
+
|
217 |
+
/**
|
218 |
+
* Optimize an image from its URL.
|
219 |
+
*
|
220 |
+
* @access public
|
221 |
+
* @since 1.6.5
|
222 |
+
*
|
223 |
+
* @param string $data All options. Details here: --.
|
224 |
+
* @return object
|
225 |
+
*/
|
226 |
+
public function fetch_image( $data ) {
|
227 |
+
return $this->http_call( 'fetch/', array(
|
228 |
+
'method' => 'POST',
|
229 |
+
'post_data' => wp_json_encode( $data ),
|
230 |
+
) );
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Get prices for plans.
|
235 |
+
*
|
236 |
+
* @access public
|
237 |
+
* @since 1.6.5
|
238 |
+
*
|
239 |
+
* @return object
|
240 |
+
*/
|
241 |
+
public function get_plans_prices() {
|
242 |
+
return $this->http_call( 'pricing/plan/' );
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* Get prices for packs (one time).
|
247 |
+
*
|
248 |
+
* @access public
|
249 |
+
* @since 1.6.5
|
250 |
+
*
|
251 |
+
* @return object
|
252 |
+
*/
|
253 |
+
public function get_packs_prices() {
|
254 |
+
return $this->http_call( 'pricing/pack/' );
|
255 |
+
}
|
256 |
+
|
257 |
+
/**
|
258 |
+
* Get all prices (packs & plans included).
|
259 |
+
*
|
260 |
+
* @access public
|
261 |
+
* @since 1.6.5
|
262 |
+
*
|
263 |
+
* @return object
|
264 |
+
*/
|
265 |
+
public function get_all_prices() {
|
266 |
+
return $this->http_call( 'pricing/all/' );
|
267 |
+
}
|
268 |
+
|
269 |
+
/**
|
270 |
+
* Get all prices (packs & plans included).
|
271 |
+
*
|
272 |
+
* @access public
|
273 |
+
* @since 1.6.5
|
274 |
+
*
|
275 |
+
* @param string $coupon A coupon code.
|
276 |
+
* @return object
|
277 |
+
*/
|
278 |
+
public function check_coupon_code( $coupon ) {
|
279 |
+
return $this->http_call( 'coupons/' . $coupon . '/' );
|
280 |
+
}
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Get information about current discount.
|
284 |
+
*
|
285 |
+
* @access public
|
286 |
+
* @since 1.6.5
|
287 |
+
*
|
288 |
+
* @return object
|
289 |
+
*/
|
290 |
+
public function check_discount() {
|
291 |
+
return $this->http_call( 'pricing/discount/' );
|
292 |
+
}
|
293 |
+
|
294 |
+
/**
|
295 |
+
* Make an HTTP call using curl.
|
296 |
+
*
|
297 |
+
* @access public
|
298 |
+
* @since 1.6.5
|
299 |
+
*
|
300 |
+
* @param string $url The URL to call.
|
301 |
+
* @param array $args The request args.
|
302 |
+
* @return object
|
303 |
+
*/
|
304 |
+
private function http_call( $url, $args = array() ) {
|
305 |
+
$args = array_merge( array(
|
306 |
+
'method' => 'GET',
|
307 |
+
'post_data' => null,
|
308 |
+
'timeout' => 45,
|
309 |
+
), $args );
|
310 |
+
|
311 |
+
// Check if php-curl is enabled.
|
312 |
+
if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) {
|
313 |
+
return new WP_Error( 'curl', 'cURL isn\'t installed on the server.' );
|
314 |
+
}
|
315 |
+
|
316 |
+
try {
|
317 |
+
$ch = curl_init();
|
318 |
+
|
319 |
+
if ( 'POST' === $args['method'] ) {
|
320 |
+
curl_setopt( $ch, CURLOPT_POST, true );
|
321 |
+
curl_setopt( $ch, CURLOPT_POSTFIELDS, $args['post_data'] );
|
322 |
+
}
|
323 |
+
|
324 |
+
curl_setopt( $ch, CURLOPT_URL, self::API_ENDPOINT . $url );
|
325 |
+
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
|
326 |
+
curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->headers );
|
327 |
+
curl_setopt( $ch, CURLOPT_TIMEOUT, $args['timeout'] );
|
328 |
+
@curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
|
329 |
+
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
|
330 |
+
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
|
331 |
+
|
332 |
+
$response = json_decode( curl_exec( $ch ) );
|
333 |
+
$error = curl_error( $ch );
|
334 |
+
$http_code = (int) curl_getinfo( $ch, CURLINFO_HTTP_CODE );
|
335 |
+
|
336 |
+
curl_close( $ch );
|
337 |
+
} catch ( Exception $e ) {
|
338 |
+
return new WP_Error( 'curl', 'Unknown error occurred' );
|
339 |
+
}
|
340 |
+
|
341 |
+
if ( 200 !== $http_code && isset( $response->code, $response->detail ) ) {
|
342 |
+
return new WP_Error( $http_code, $response->detail );
|
343 |
+
}
|
344 |
+
|
345 |
+
if ( 413 === $http_code ) {
|
346 |
+
return new WP_Error( $http_code, 'Your image is too big to be uploaded on our server.' );
|
347 |
+
}
|
348 |
+
|
349 |
+
if ( 200 !== $http_code ) {
|
350 |
+
$error = '' !== $error ? ' - ' . htmlentities( $error ) : '';
|
351 |
+
return new WP_Error( $http_code, "Unknown error occurred ({$http_code}{$error}) " );
|
352 |
+
}
|
353 |
+
|
354 |
+
return $response;
|
355 |
+
}
|
356 |
+
}
|
357 |
+
|
358 |
+
/**
|
359 |
+
* Returns the main instance of the Imagify class.
|
360 |
+
*
|
361 |
+
* @since 1.6.5
|
362 |
+
* @author Grégory Viguier
|
363 |
+
*
|
364 |
+
* @return object The Imagify instance.
|
365 |
+
*/
|
366 |
+
function imagify() {
|
367 |
+
return Imagify::get_instance();
|
368 |
+
}
|
inc/common/admin-bar.php
CHANGED
@@ -1,37 +1,35 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Add Imagify menu in the admin bar
|
6 |
*
|
7 |
* @since 1.0
|
|
|
|
|
8 |
*/
|
9 |
-
add_action( 'admin_bar_menu', '_imagify_admin_bar', PHP_INT_MAX );
|
10 |
function _imagify_admin_bar( $wp_admin_bar ) {
|
11 |
-
|
12 |
-
/** This filter is documented in inc/admin/options.php */
|
13 |
-
$cap = apply_filters( 'imagify_capacity', $cap );
|
14 |
-
|
15 |
-
if ( ! current_user_can( $cap ) || ! get_imagify_option( 'admin_bar_menu', 0 ) ) {
|
16 |
return;
|
17 |
}
|
18 |
|
19 |
-
// Parent
|
20 |
$wp_admin_bar->add_menu( array(
|
21 |
'id' => 'imagify',
|
22 |
'title' => 'Imagify',
|
23 |
'href' => get_imagify_admin_url(),
|
24 |
) );
|
25 |
|
26 |
-
// Settings
|
27 |
$wp_admin_bar->add_menu(array(
|
28 |
'parent' => 'imagify',
|
29 |
'id' => 'imagify-settings',
|
30 |
'title' => __( 'Settings' ),
|
31 |
'href' => get_imagify_admin_url(),
|
32 |
) );
|
33 |
-
|
34 |
-
// Bulk Optimization
|
35 |
if ( ! is_network_admin() ) {
|
36 |
$wp_admin_bar->add_menu(array(
|
37 |
'parent' => 'imagify',
|
@@ -40,20 +38,21 @@ function _imagify_admin_bar( $wp_admin_bar ) {
|
|
40 |
'href' => get_imagify_admin_url( 'bulk-optimization' ),
|
41 |
) );
|
42 |
}
|
43 |
-
|
44 |
-
// Rate it
|
45 |
$wp_admin_bar->add_menu(array(
|
46 |
'parent' => 'imagify',
|
47 |
'id' => 'imagify-rate-it',
|
|
|
48 |
'title' => sprintf( __( 'Rate Imagify on %s', 'imagify' ), 'WordPress.org' ),
|
49 |
'href' => 'https://wordpress.org/support/view/plugin-reviews/imagify?rate=5#postform',
|
50 |
) );
|
51 |
-
|
52 |
-
// Quota & Profile informations
|
53 |
if ( defined( 'IMAGIFY_HIDDEN_ACCOUNT' ) && IMAGIFY_HIDDEN_ACCOUNT ) {
|
54 |
return;
|
55 |
}
|
56 |
-
|
57 |
if ( ( defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) || get_imagify_option( 'api_key', false ) ) {
|
58 |
$wp_admin_bar->add_menu( array(
|
59 |
'parent' => 'imagify',
|
@@ -63,15 +62,17 @@ function _imagify_admin_bar( $wp_admin_bar ) {
|
|
63 |
}
|
64 |
}
|
65 |
|
|
|
66 |
/**
|
67 |
-
* Include Admin Bar Profile informations styles in front
|
68 |
*
|
69 |
* @since 1.2
|
70 |
*/
|
71 |
-
add_action( 'admin_bar_init', '_imagify_admin_bar_styles' );
|
72 |
function _imagify_admin_bar_styles() {
|
73 |
-
if (
|
74 |
-
|
75 |
-
wp_enqueue_style( 'imagify-css-admin-bar', IMAGIFY_ASSETS_CSS_URL . 'admin-bar' . $css_ext, array(), IMAGIFY_VERSION, 'all' );
|
76 |
}
|
|
|
|
|
|
|
77 |
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'admin_bar_menu', '_imagify_admin_bar', PHP_INT_MAX );
|
5 |
/**
|
6 |
+
* Add Imagify menu in the admin bar.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
+
*
|
10 |
+
* @param object $wp_admin_bar WP_Admin_Bar instance, passed by reference.
|
11 |
*/
|
|
|
12 |
function _imagify_admin_bar( $wp_admin_bar ) {
|
13 |
+
if ( ! current_user_can( imagify_get_capacity() ) || ! get_imagify_option( 'admin_bar_menu', 0 ) ) {
|
|
|
|
|
|
|
|
|
14 |
return;
|
15 |
}
|
16 |
|
17 |
+
// Parent.
|
18 |
$wp_admin_bar->add_menu( array(
|
19 |
'id' => 'imagify',
|
20 |
'title' => 'Imagify',
|
21 |
'href' => get_imagify_admin_url(),
|
22 |
) );
|
23 |
|
24 |
+
// Settings.
|
25 |
$wp_admin_bar->add_menu(array(
|
26 |
'parent' => 'imagify',
|
27 |
'id' => 'imagify-settings',
|
28 |
'title' => __( 'Settings' ),
|
29 |
'href' => get_imagify_admin_url(),
|
30 |
) );
|
31 |
+
|
32 |
+
// Bulk Optimization.
|
33 |
if ( ! is_network_admin() ) {
|
34 |
$wp_admin_bar->add_menu(array(
|
35 |
'parent' => 'imagify',
|
38 |
'href' => get_imagify_admin_url( 'bulk-optimization' ),
|
39 |
) );
|
40 |
}
|
41 |
+
|
42 |
+
// Rate it.
|
43 |
$wp_admin_bar->add_menu(array(
|
44 |
'parent' => 'imagify',
|
45 |
'id' => 'imagify-rate-it',
|
46 |
+
/* translators: %s is WordPress.org. */
|
47 |
'title' => sprintf( __( 'Rate Imagify on %s', 'imagify' ), 'WordPress.org' ),
|
48 |
'href' => 'https://wordpress.org/support/view/plugin-reviews/imagify?rate=5#postform',
|
49 |
) );
|
50 |
+
|
51 |
+
// Quota & Profile informations.
|
52 |
if ( defined( 'IMAGIFY_HIDDEN_ACCOUNT' ) && IMAGIFY_HIDDEN_ACCOUNT ) {
|
53 |
return;
|
54 |
}
|
55 |
+
|
56 |
if ( ( defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) || get_imagify_option( 'api_key', false ) ) {
|
57 |
$wp_admin_bar->add_menu( array(
|
58 |
'parent' => 'imagify',
|
62 |
}
|
63 |
}
|
64 |
|
65 |
+
add_action( 'admin_bar_init', '_imagify_admin_bar_styles' );
|
66 |
/**
|
67 |
+
* Include Admin Bar Profile informations styles in front.
|
68 |
*
|
69 |
* @since 1.2
|
70 |
*/
|
|
|
71 |
function _imagify_admin_bar_styles() {
|
72 |
+
if ( is_admin() || ! get_imagify_option( 'admin_bar_menu', 0 ) ) {
|
73 |
+
return;
|
|
|
74 |
}
|
75 |
+
|
76 |
+
$css_ext = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '.css' : '.min.css';
|
77 |
+
wp_enqueue_style( 'imagify-css-admin-bar', IMAGIFY_ASSETS_CSS_URL . 'admin-bar' . $css_ext, array(), IMAGIFY_VERSION, 'all' );
|
78 |
}
|
inc/common/attachments.php
CHANGED
@@ -1,56 +1,67 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Auto-optimize when a new attachment is generated
|
6 |
*
|
7 |
* @since 1.0
|
8 |
-
* @since 1.5 Async job
|
|
|
|
|
|
|
|
|
|
|
9 |
*/
|
10 |
-
add_filter( 'wp_generate_attachment_metadata', '_imagify_optimize_attachment', PHP_INT_MAX, 2 );
|
11 |
function _imagify_optimize_attachment( $metadata, $attachment_id ) {
|
12 |
-
$api_key = get_imagify_option( 'api_key', false );
|
13 |
-
|
14 |
-
if ( ! empty( $api_key ) && get_imagify_option( 'auto_optimize', false ) ) {
|
15 |
-
$context = 'wp';
|
16 |
-
$action = 'imagify_async_optimize_upload_new_media';
|
17 |
-
$_ajax_nonce = wp_create_nonce( 'new_media-' . $attachment_id );
|
18 |
|
19 |
-
|
|
|
20 |
}
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
return $metadata;
|
23 |
}
|
24 |
|
|
|
25 |
/**
|
26 |
* Delete the backup file when an attachement is deleted.
|
27 |
*
|
28 |
* @since 1.0
|
|
|
|
|
29 |
*/
|
30 |
-
add_action( 'delete_attachment', '_imagify_delete_backup_file' );
|
31 |
function _imagify_delete_backup_file( $post_id ) {
|
32 |
-
$
|
|
|
33 |
$attachment->delete_backup();
|
34 |
}
|
35 |
|
|
|
36 |
/**
|
37 |
-
* Optimize
|
38 |
*
|
39 |
* @since 1.3.6
|
40 |
-
* @since 1.4 Async job
|
41 |
*/
|
42 |
-
add_action( 'shutdown', '_imagify_optimize_save_image_editor_file' );
|
43 |
function _imagify_optimize_save_image_editor_file() {
|
44 |
-
if ( isset( $_POST['action'], $_POST['do'], $_POST['postid'] )
|
45 |
-
|
46 |
-
|
47 |
-
&& get_post_meta( $_POST['postid'], '_imagify_data', true )
|
48 |
-
&& 'open' != $_POST['do']
|
49 |
-
) {
|
50 |
|
51 |
-
|
52 |
-
$body['action'] = 'imagify_async_optimize_save_image_editor_file';
|
53 |
|
54 |
-
|
|
|
55 |
}
|
56 |
-
|
|
|
|
|
|
|
|
|
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_filter( 'wp_generate_attachment_metadata', '_imagify_optimize_attachment', PHP_INT_MAX, 2 );
|
5 |
/**
|
6 |
+
* Auto-optimize when a new attachment is generated.
|
7 |
*
|
8 |
* @since 1.0
|
9 |
+
* @since 1.5 Async job.
|
10 |
+
* @see _do_admin_post_async_optimize_upload_new_media()
|
11 |
+
*
|
12 |
+
* @param array $metadata An array of attachment meta data.
|
13 |
+
* @param int $attachment_id Current attachment ID.
|
14 |
+
* @return array
|
15 |
*/
|
|
|
16 |
function _imagify_optimize_attachment( $metadata, $attachment_id ) {
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
|
18 |
+
if ( ! get_imagify_option( 'api_key' ) || ! get_imagify_option( 'auto_optimize' ) ) {
|
19 |
+
return $metadata;
|
20 |
}
|
21 |
|
22 |
+
$context = 'wp';
|
23 |
+
$action = 'imagify_async_optimize_upload_new_media';
|
24 |
+
$_ajax_nonce = wp_create_nonce( 'new_media-' . $attachment_id );
|
25 |
+
|
26 |
+
imagify_do_async_job( compact( 'action', '_ajax_nonce', 'metadata', 'attachment_id', 'context' ) );
|
27 |
+
|
28 |
return $metadata;
|
29 |
}
|
30 |
|
31 |
+
add_action( 'delete_attachment', '_imagify_delete_backup_file' );
|
32 |
/**
|
33 |
* Delete the backup file when an attachement is deleted.
|
34 |
*
|
35 |
* @since 1.0
|
36 |
+
*
|
37 |
+
* @param int $post_id Attachment ID.
|
38 |
*/
|
|
|
39 |
function _imagify_delete_backup_file( $post_id ) {
|
40 |
+
$class_name = get_imagify_attachment_class_name( 'wp' );
|
41 |
+
$attachment = new $class_name( $post_id );
|
42 |
$attachment->delete_backup();
|
43 |
}
|
44 |
|
45 |
+
add_action( 'shutdown', '_imagify_optimize_save_image_editor_file' );
|
46 |
/**
|
47 |
+
* Optimize an attachment after being resized.
|
48 |
*
|
49 |
* @since 1.3.6
|
50 |
+
* @since 1.4 Async job.
|
51 |
*/
|
|
|
52 |
function _imagify_optimize_save_image_editor_file() {
|
53 |
+
if ( ! isset( $_POST['action'], $_POST['do'], $_POST['postid'] ) || 'image-editor' !== $_POST['action'] || 'open' === $_POST['do'] ) { // WPCS: CSRF ok.
|
54 |
+
return;
|
55 |
+
}
|
|
|
|
|
|
|
56 |
|
57 |
+
check_ajax_referer( 'image_editor-' . $_POST['postid'] );
|
|
|
58 |
|
59 |
+
if ( ! get_post_meta( $_POST['postid'], '_imagify_data', true ) ) {
|
60 |
+
return;
|
61 |
}
|
62 |
+
|
63 |
+
$body = $_POST;
|
64 |
+
$body['action'] = 'imagify_async_optimize_save_image_editor_file';
|
65 |
+
|
66 |
+
imagify_do_async_job( $body );
|
67 |
+
}
|
inc/common/cron.php
CHANGED
@@ -1,91 +1,91 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
|
|
4 |
/**
|
5 |
-
* Planning cron
|
6 |
-
* If the task is not programmed, it is automatically triggered
|
7 |
*
|
8 |
* @since 1.4.2
|
9 |
*/
|
10 |
-
add_action( 'init', '_imagify_rating_scheduled' );
|
11 |
function _imagify_rating_scheduled() {
|
12 |
if ( ! wp_next_scheduled( 'imagify_rating_event' ) && ! get_site_transient( 'do_imagify_rating_cron' ) ) {
|
13 |
wp_schedule_event( time(), 'daily', 'imagify_rating_event' );
|
14 |
}
|
15 |
}
|
16 |
|
|
|
17 |
/**
|
18 |
* Saved the user images count to display it later
|
19 |
-
* in a notice message to ask him to rate Imagify on WordPress.org
|
20 |
*
|
21 |
* @since 1.4.2
|
22 |
*/
|
23 |
-
|
24 |
-
|
25 |
-
// Stop the process if the plugin isn't installed since 3 days
|
26 |
if ( get_site_transient( 'imagify_seen_rating_notice' ) ) {
|
27 |
return;
|
28 |
}
|
29 |
|
30 |
-
// Check if the Imagify servers & the API are accessible
|
31 |
if ( ! is_imagify_servers_up() ) {
|
32 |
return;
|
33 |
}
|
34 |
-
|
35 |
$user = get_imagify_user();
|
36 |
-
|
37 |
if ( isset( $user ) && (int) $user->image_count > 100 ) {
|
38 |
set_site_transient( 'imagify_user_images_count', $user->image_count );
|
39 |
}
|
40 |
}
|
41 |
|
|
|
42 |
/**
|
43 |
-
* Adds weekly interval for cron jobs
|
44 |
*
|
45 |
* @since 1.6
|
46 |
* @author Remy Perona
|
47 |
*
|
48 |
-
* @param
|
49 |
-
* @return Array Updated array of intervals
|
50 |
*/
|
51 |
-
add_filter( 'cron_schedules', 'imagify_purge_cron_schedule' );
|
52 |
function imagify_purge_cron_schedule( $schedules ) {
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
|
62 |
return $schedules;
|
63 |
}
|
64 |
|
|
|
65 |
/**
|
66 |
-
* Planning cron task to update weekly the size of the images and the size of images uploaded by month
|
67 |
-
* If the task is not programmed, it is automatically triggered
|
68 |
*
|
69 |
* @since 1.6
|
70 |
* @author Remy Perona
|
71 |
*/
|
72 |
-
add_action( 'init', '_imagify_update_library_size_calculations_scheduled' );
|
73 |
function _imagify_update_library_size_calculations_scheduled() {
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
}
|
78 |
|
|
|
79 |
/**
|
80 |
-
* Cron task to update weekly the size of the images and the size of images uploaded by month
|
81 |
*
|
82 |
* @since 1.6
|
83 |
* @author Remy Perona
|
84 |
*/
|
85 |
-
add_action( 'imagify_update_library_size_calculations_event', '_do_imagify_update_library_size_calculations' );
|
86 |
function _do_imagify_update_library_size_calculations() {
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
add_action( 'init', '_imagify_rating_scheduled' );
|
5 |
/**
|
6 |
+
* Planning cron.
|
7 |
+
* If the task is not programmed, it is automatically triggered.
|
8 |
*
|
9 |
* @since 1.4.2
|
10 |
*/
|
|
|
11 |
function _imagify_rating_scheduled() {
|
12 |
if ( ! wp_next_scheduled( 'imagify_rating_event' ) && ! get_site_transient( 'do_imagify_rating_cron' ) ) {
|
13 |
wp_schedule_event( time(), 'daily', 'imagify_rating_event' );
|
14 |
}
|
15 |
}
|
16 |
|
17 |
+
add_action( 'imagify_rating_event', '_do_imagify_rating_cron' );
|
18 |
/**
|
19 |
* Saved the user images count to display it later
|
20 |
+
* in a notice message to ask him to rate Imagify on WordPress.org.
|
21 |
*
|
22 |
* @since 1.4.2
|
23 |
*/
|
24 |
+
function _do_imagify_rating_cron() {
|
25 |
+
// Stop the process if the plugin isn't installed for 3 days.
|
|
|
26 |
if ( get_site_transient( 'imagify_seen_rating_notice' ) ) {
|
27 |
return;
|
28 |
}
|
29 |
|
30 |
+
// Check if the Imagify servers & the API are accessible.
|
31 |
if ( ! is_imagify_servers_up() ) {
|
32 |
return;
|
33 |
}
|
34 |
+
|
35 |
$user = get_imagify_user();
|
36 |
+
|
37 |
if ( isset( $user ) && (int) $user->image_count > 100 ) {
|
38 |
set_site_transient( 'imagify_user_images_count', $user->image_count );
|
39 |
}
|
40 |
}
|
41 |
|
42 |
+
add_filter( 'cron_schedules', 'imagify_purge_cron_schedule' );
|
43 |
/**
|
44 |
+
* Adds weekly interval for cron jobs.
|
45 |
*
|
46 |
* @since 1.6
|
47 |
* @author Remy Perona
|
48 |
*
|
49 |
+
* @param Array $schedules An array of intervals used by cron jobs.
|
50 |
+
* @return Array Updated array of intervals.
|
51 |
*/
|
|
|
52 |
function imagify_purge_cron_schedule( $schedules ) {
|
53 |
+
if ( array_key_exists( 'weekly', $schedules ) ) {
|
54 |
+
return $schedules;
|
55 |
+
}
|
56 |
|
57 |
+
$schedules['weekly'] = array(
|
58 |
+
'interval' => 604800,
|
59 |
+
'display' => __( 'Once Weekly', 'imagify' ),
|
60 |
+
);
|
61 |
|
62 |
return $schedules;
|
63 |
}
|
64 |
|
65 |
+
add_action( 'init', '_imagify_update_library_size_calculations_scheduled' );
|
66 |
/**
|
67 |
+
* Planning cron task to update weekly the size of the images and the size of images uploaded by month.
|
68 |
+
* If the task is not programmed, it is automatically triggered.
|
69 |
*
|
70 |
* @since 1.6
|
71 |
* @author Remy Perona
|
72 |
*/
|
|
|
73 |
function _imagify_update_library_size_calculations_scheduled() {
|
74 |
+
if ( ! wp_next_scheduled( 'imagify_update_library_size_calculations_event' ) ) {
|
75 |
+
wp_schedule_event( time(), 'weekly', 'imagify_update_library_size_calculations_event' );
|
76 |
+
}
|
77 |
}
|
78 |
|
79 |
+
add_action( 'imagify_update_library_size_calculations_event', '_do_imagify_update_library_size_calculations' );
|
80 |
/**
|
81 |
+
* Cron task to update weekly the size of the images and the size of images uploaded by month.
|
82 |
*
|
83 |
* @since 1.6
|
84 |
* @author Remy Perona
|
85 |
*/
|
|
|
86 |
function _do_imagify_update_library_size_calculations() {
|
87 |
+
imagify_do_async_job( array(
|
88 |
+
'action' => 'imagify_update_estimate_sizes',
|
89 |
+
'_ajax_nonce' => wp_create_nonce( 'update_estimate_sizes' ),
|
90 |
+
) );
|
91 |
+
}
|
inc/compat.php
CHANGED
@@ -1,20 +1,231 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
if ( ! function_exists( 'curl_file_create' ) ) :
|
5 |
+
|
6 |
+
/**
|
7 |
+
* Create a CURLFile object.
|
8 |
+
*
|
9 |
+
* @since 1.0
|
10 |
+
* @since PHP 5.5
|
11 |
+
*
|
12 |
+
* @param string $filename Path to the file which will be uploaded.
|
13 |
+
* @param string $mimetype Mimetype of the file.
|
14 |
+
* @param string $postname Name of the file to be used in the upload data.
|
15 |
+
* @return string The CURLFile object.
|
16 |
+
*/
|
17 |
+
function curl_file_create( $filename, $mimetype = '', $postname = '' ) {
|
18 |
+
return "@$filename;filename="
|
19 |
+
. ( $postname ? $postname : basename( $filename ) )
|
20 |
+
. ( $mimetype ? ";type=$mimetype" : '' );
|
21 |
+
}
|
22 |
+
|
23 |
+
endif;
|
24 |
+
|
25 |
+
if ( ! function_exists( 'wp_json_encode' ) ) :
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Encode a variable into JSON, with some sanity checks.
|
29 |
+
*
|
30 |
+
* @since 1.6.5
|
31 |
+
* @since WP 4.1.0
|
32 |
+
*
|
33 |
+
* @param mixed $data Variable (usually an array or object) to encode as JSON.
|
34 |
+
* @param int $options Optional. Options to be passed to json_encode(). Default 0.
|
35 |
+
* @param int $depth Optional. Maximum depth to walk through $data. Must be greater than 0. Default 512.
|
36 |
+
* @return string|false The JSON encoded string, or false if it cannot be encoded.
|
37 |
+
*/
|
38 |
+
function wp_json_encode( $data, $options = 0, $depth = 512 ) {
|
39 |
+
/*
|
40 |
+
* json_encode() has had extra params added over the years.
|
41 |
+
* $options was added in 5.3, and $depth in 5.5.
|
42 |
+
* We need to make sure we call it with the correct arguments.
|
43 |
+
*/
|
44 |
+
if ( version_compare( PHP_VERSION, '5.5', '>=' ) ) {
|
45 |
+
$args = array( $data, $options, $depth );
|
46 |
+
} elseif ( version_compare( PHP_VERSION, '5.3', '>=' ) ) {
|
47 |
+
$args = array( $data, $options );
|
48 |
+
} else {
|
49 |
+
$args = array( $data );
|
50 |
+
}
|
51 |
+
|
52 |
+
// Prepare the data for JSON serialization.
|
53 |
+
$args[0] = _wp_json_prepare_data( $data );
|
54 |
+
|
55 |
+
$json = @call_user_func_array( 'json_encode', $args );
|
56 |
+
|
57 |
+
// If json_encode() was successful, no need to do more sanity checking.
|
58 |
+
// ... unless we're in an old version of PHP, and json_encode() returned
|
59 |
+
// a string containing 'null'. Then we need to do more sanity checking.
|
60 |
+
if ( false !== $json && ( version_compare( PHP_VERSION, '5.5', '>=' ) || false === strpos( $json, 'null' ) ) ) {
|
61 |
+
return $json;
|
62 |
+
}
|
63 |
+
|
64 |
+
try {
|
65 |
+
$args[0] = _wp_json_sanity_check( $data, $depth );
|
66 |
+
} catch ( Exception $e ) {
|
67 |
+
return false;
|
68 |
+
}
|
69 |
+
|
70 |
+
return call_user_func_array( 'json_encode', $args );
|
71 |
+
}
|
72 |
+
|
73 |
+
endif;
|
74 |
+
|
75 |
+
if ( ! function_exists( '_wp_json_prepare_data' ) ) :
|
76 |
+
|
77 |
+
/**
|
78 |
+
* Prepares response data to be serialized to JSON.
|
79 |
+
*
|
80 |
+
* This supports the JsonSerializable interface for PHP 5.2-5.3 as well.
|
81 |
+
*
|
82 |
+
* @since 1.6.5
|
83 |
+
* @since WP 4.4.0
|
84 |
+
* @access private
|
85 |
+
*
|
86 |
+
* @param mixed $data Native representation.
|
87 |
+
* @return bool|int|float|null|string|array Data ready for `json_encode()`.
|
88 |
+
*/
|
89 |
+
function _wp_json_prepare_data( $data ) {
|
90 |
+
if ( ! defined( 'WP_JSON_SERIALIZE_COMPATIBLE' ) || WP_JSON_SERIALIZE_COMPATIBLE === false ) {
|
91 |
+
return $data;
|
92 |
+
}
|
93 |
+
|
94 |
+
switch ( gettype( $data ) ) {
|
95 |
+
case 'boolean':
|
96 |
+
case 'integer':
|
97 |
+
case 'double':
|
98 |
+
case 'string':
|
99 |
+
case 'NULL':
|
100 |
+
// These values can be passed through.
|
101 |
+
return $data;
|
102 |
+
|
103 |
+
case 'array':
|
104 |
+
// Arrays must be mapped in case they also return objects.
|
105 |
+
return array_map( '_wp_json_prepare_data', $data );
|
106 |
+
|
107 |
+
case 'object':
|
108 |
+
// If this is an incomplete object (__PHP_Incomplete_Class), bail.
|
109 |
+
if ( ! is_object( $data ) ) {
|
110 |
+
return null;
|
111 |
+
}
|
112 |
+
|
113 |
+
if ( $data instanceof JsonSerializable ) {
|
114 |
+
$data = $data->jsonSerialize();
|
115 |
+
} else {
|
116 |
+
$data = get_object_vars( $data );
|
117 |
+
}
|
118 |
+
|
119 |
+
// Now, pass the array (or whatever was returned from jsonSerialize through).
|
120 |
+
return _wp_json_prepare_data( $data );
|
121 |
+
|
122 |
+
default:
|
123 |
+
return null;
|
124 |
+
}
|
125 |
+
}
|
126 |
+
|
127 |
+
endif;
|
128 |
+
|
129 |
+
if ( ! function_exists( '_wp_json_sanity_check' ) ) :
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Perform sanity checks on data that shall be encoded to JSON.
|
133 |
+
*
|
134 |
+
* @since 1.6.5
|
135 |
+
* @since WP 4.1.0
|
136 |
+
* @access private
|
137 |
+
* @throws Exception If the depth limit is reached.
|
138 |
+
*
|
139 |
+
* @see wp_json_encode()
|
140 |
+
*
|
141 |
+
* @param mixed $data Variable (usually an array or object) to encode as JSON.
|
142 |
+
* @param int $depth Maximum depth to walk through $data. Must be greater than 0.
|
143 |
+
* @return mixed The sanitized data that shall be encoded to JSON.
|
144 |
+
*/
|
145 |
+
function _wp_json_sanity_check( $data, $depth ) {
|
146 |
+
if ( $depth < 0 ) {
|
147 |
+
throw new Exception( 'Reached depth limit' );
|
148 |
+
}
|
149 |
+
|
150 |
+
if ( is_array( $data ) ) {
|
151 |
+
$output = array();
|
152 |
+
foreach ( $data as $id => $el ) {
|
153 |
+
// Don't forget to sanitize the ID!
|
154 |
+
if ( is_string( $id ) ) {
|
155 |
+
$clean_id = _wp_json_convert_string( $id );
|
156 |
+
} else {
|
157 |
+
$clean_id = $id;
|
158 |
+
}
|
159 |
+
|
160 |
+
// Check the element type, so that we're only recursing if we really have to.
|
161 |
+
if ( is_array( $el ) || is_object( $el ) ) {
|
162 |
+
$output[ $clean_id ] = _wp_json_sanity_check( $el, $depth - 1 );
|
163 |
+
} elseif ( is_string( $el ) ) {
|
164 |
+
$output[ $clean_id ] = _wp_json_convert_string( $el );
|
165 |
+
} else {
|
166 |
+
$output[ $clean_id ] = $el;
|
167 |
+
}
|
168 |
+
}
|
169 |
+
} elseif ( is_object( $data ) ) {
|
170 |
+
$output = new stdClass;
|
171 |
+
foreach ( $data as $id => $el ) {
|
172 |
+
if ( is_string( $id ) ) {
|
173 |
+
$clean_id = _wp_json_convert_string( $id );
|
174 |
+
} else {
|
175 |
+
$clean_id = $id;
|
176 |
+
}
|
177 |
+
|
178 |
+
if ( is_array( $el ) || is_object( $el ) ) {
|
179 |
+
$output->$clean_id = _wp_json_sanity_check( $el, $depth - 1 );
|
180 |
+
} elseif ( is_string( $el ) ) {
|
181 |
+
$output->$clean_id = _wp_json_convert_string( $el );
|
182 |
+
} else {
|
183 |
+
$output->$clean_id = $el;
|
184 |
+
}
|
185 |
+
}
|
186 |
+
} elseif ( is_string( $data ) ) {
|
187 |
+
return _wp_json_convert_string( $data );
|
188 |
+
} else {
|
189 |
+
return $data;
|
190 |
+
} // End if().
|
191 |
+
|
192 |
+
return $output;
|
193 |
+
}
|
194 |
+
|
195 |
+
endif;
|
196 |
+
|
197 |
+
if ( ! function_exists( '_wp_json_convert_string' ) ) :
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Convert a string to UTF-8, so that it can be safely encoded to JSON.
|
201 |
+
*
|
202 |
+
* @since 1.6.5
|
203 |
+
* @since WP 4.1.0
|
204 |
+
* @access private
|
205 |
+
*
|
206 |
+
* @see _wp_json_sanity_check()
|
207 |
+
*
|
208 |
+
* @staticvar bool $use_mb
|
209 |
+
*
|
210 |
+
* @param string $string The string which is to be converted.
|
211 |
+
* @return string The checked string.
|
212 |
+
*/
|
213 |
+
function _wp_json_convert_string( $string ) {
|
214 |
+
static $use_mb = null;
|
215 |
+
if ( is_null( $use_mb ) ) {
|
216 |
+
$use_mb = function_exists( 'mb_convert_encoding' );
|
217 |
+
}
|
218 |
+
|
219 |
+
if ( $use_mb ) {
|
220 |
+
$encoding = mb_detect_encoding( $string, mb_detect_order(), true );
|
221 |
+
if ( $encoding ) {
|
222 |
+
return mb_convert_encoding( $string, 'UTF-8', $encoding );
|
223 |
+
} else {
|
224 |
+
return mb_convert_encoding( $string, 'UTF-8', 'UTF-8' );
|
225 |
+
}
|
226 |
+
} else {
|
227 |
+
return wp_check_invalid_utf8( $string, true );
|
228 |
+
}
|
229 |
+
}
|
230 |
+
|
231 |
+
endif;
|
inc/functions/admin-stats.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
* Count number of attachments.
|
6 |
*
|
7 |
* @since 1.0
|
@@ -11,39 +11,42 @@ defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
|
11 |
*/
|
12 |
function imagify_count_attachments() {
|
13 |
global $wpdb;
|
|
|
14 |
|
15 |
/**
|
16 |
-
* Filter the number of attachments
|
17 |
-
* 3rd party will be able to override the result
|
18 |
*
|
19 |
* @since 1.5
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
|
|
|
|
25 |
}
|
26 |
|
27 |
-
|
|
|
|
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
);
|
37 |
|
38 |
-
|
39 |
-
|
40 |
-
}
|
41 |
}
|
42 |
|
43 |
-
return
|
44 |
}
|
45 |
|
46 |
-
|
47 |
* Count number of optimized attachments with an error.
|
48 |
*
|
49 |
* @since 1.0
|
@@ -53,39 +56,41 @@ function imagify_count_attachments() {
|
|
53 |
*/
|
54 |
function imagify_count_error_attachments() {
|
55 |
global $wpdb;
|
|
|
56 |
|
57 |
/**
|
58 |
-
* Filter the number of optimized attachments with an error
|
59 |
-
* 3rd party will be able to override the result
|
60 |
*
|
61 |
* @since 1.5
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
|
|
|
|
67 |
}
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
if ( ! $count ) {
|
72 |
-
$count = $wpdb->get_var(
|
73 |
-
"SELECT COUNT($wpdb->posts.ID)
|
74 |
-
FROM $wpdb->posts
|
75 |
-
INNER JOIN $wpdb->postmeta
|
76 |
-
ON $wpdb->posts.ID = $wpdb->postmeta.post_id
|
77 |
-
WHERE ($wpdb->posts.post_mime_type = 'image/jpeg' OR $wpdb->posts.post_mime_type = 'image/png' OR $wpdb->posts.post_mime_type = 'image/gif')
|
78 |
-
AND ( ( $wpdb->postmeta.meta_key = '_imagify_status' AND CAST($wpdb->postmeta.meta_value AS CHAR) = 'error' )
|
79 |
-
)
|
80 |
-
AND $wpdb->posts.post_type = 'attachment'
|
81 |
-
AND $wpdb->posts.post_status = 'inherit'"
|
82 |
-
);
|
83 |
}
|
84 |
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
}
|
87 |
|
88 |
-
|
89 |
* Count number of optimized attachments (by Imagify or an other tool before).
|
90 |
*
|
91 |
* @since 1.0
|
@@ -95,38 +100,41 @@ function imagify_count_error_attachments() {
|
|
95 |
*/
|
96 |
function imagify_count_optimized_attachments() {
|
97 |
global $wpdb;
|
|
|
98 |
|
99 |
/**
|
100 |
-
* Filter the number of optimized attachments
|
101 |
-
* 3rd party will be able to override the result
|
102 |
*
|
103 |
* @since 1.5
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
|
|
|
|
109 |
}
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
if ( ! $count ) {
|
114 |
-
$count = $wpdb->get_var(
|
115 |
-
"SELECT COUNT($wpdb->posts.ID)
|
116 |
-
FROM $wpdb->posts
|
117 |
-
INNER JOIN $wpdb->postmeta
|
118 |
-
ON $wpdb->posts.ID = $wpdb->postmeta.post_id
|
119 |
-
WHERE ($wpdb->posts.post_mime_type = 'image/jpeg' OR $wpdb->posts.post_mime_type = 'image/png' OR $wpdb->posts.post_mime_type = 'image/gif')
|
120 |
-
AND ( ( $wpdb->postmeta.meta_key = '_imagify_status' AND CAST($wpdb->postmeta.meta_value AS CHAR) = 'success' ) OR ( $wpdb->postmeta.meta_key = '_imagify_status' AND CAST($wpdb->postmeta.meta_value AS CHAR) = 'already_optimized' ) )
|
121 |
-
AND $wpdb->posts.post_type = 'attachment'
|
122 |
-
AND $wpdb->posts.post_status = 'inherit'"
|
123 |
-
);
|
124 |
}
|
125 |
|
126 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
127 |
}
|
128 |
|
129 |
-
|
130 |
* Count number of unoptimized attachments.
|
131 |
*
|
132 |
* @since 1.0
|
@@ -136,27 +144,23 @@ function imagify_count_optimized_attachments() {
|
|
136 |
*/
|
137 |
function imagify_count_unoptimized_attachments() {
|
138 |
/**
|
139 |
-
* Filter the number of unoptimized attachments
|
140 |
-
* 3rd party will be able to override the result
|
141 |
*
|
142 |
* @since 1.5
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
static $count;
|
151 |
-
|
152 |
-
if ( ! $count ) {
|
153 |
-
$count = imagify_count_attachments() - imagify_count_optimized_attachments() - imagify_count_error_attachments();
|
154 |
}
|
155 |
|
156 |
-
return (
|
157 |
}
|
158 |
|
159 |
-
|
160 |
* Count percent of optimized attachments.
|
161 |
*
|
162 |
* @since 1.0
|
@@ -166,50 +170,53 @@ function imagify_count_unoptimized_attachments() {
|
|
166 |
*/
|
167 |
function imagify_percent_optimized_attachments() {
|
168 |
/**
|
169 |
-
* Filter the percent of optimized attachments
|
170 |
-
* 3rd party will be able to override the result
|
171 |
*
|
172 |
* @since 1.5
|
173 |
-
|
|
|
|
|
174 |
$percent = apply_filters( 'imagify_percent_optimized_attachments', false );
|
175 |
|
176 |
-
if ( false
|
177 |
-
|
178 |
-
$total_optimized_attachments = imagify_count_optimized_attachments();
|
179 |
-
|
180 |
-
$percent = ( 0 !== $total_attachments ) ? round( ( 100 - ( ( $total_attachments - ( $total_optimized_attachments ) ) / $total_attachments ) * 100 ) ) : 0;
|
181 |
}
|
182 |
|
183 |
-
|
|
|
|
|
|
|
184 |
}
|
185 |
|
186 |
-
|
187 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
188 |
*
|
189 |
* @since 1.0
|
190 |
* @author Jonathan Buttigieg
|
191 |
*
|
192 |
-
* @return
|
|
|
193 |
*/
|
194 |
function imagify_count_saving_data( $key = '' ) {
|
195 |
global $wpdb;
|
196 |
|
197 |
/**
|
198 |
-
* Filter the query to get all optimized attachments
|
199 |
-
* 3rd party will be able to override the result
|
200 |
*
|
201 |
* @since 1.5
|
202 |
-
|
203 |
$attachments = apply_filters( 'imagify_count_saving_data', false );
|
204 |
|
205 |
if ( false === $attachments ) {
|
206 |
-
$attachments = $wpdb->get_col(
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
);
|
214 |
}
|
215 |
|
@@ -217,271 +224,275 @@ function imagify_count_saving_data( $key = '' ) {
|
|
217 |
|
218 |
$original_size = 0;
|
219 |
$optimized_size = 0;
|
220 |
-
$count
|
221 |
|
222 |
foreach ( $attachments as $attachment_data ) {
|
223 |
if ( ! $attachment_data ) {
|
224 |
continue;
|
225 |
}
|
226 |
-
|
227 |
$stats_data = $attachment_data['stats'];
|
228 |
$original_data = $attachment_data['sizes']['full'];
|
229 |
|
230 |
-
//
|
231 |
-
$original_size +=
|
232 |
-
$optimized_size +=
|
233 |
|
234 |
unset( $attachment_data['sizes']['full'] );
|
235 |
|
236 |
-
//
|
237 |
foreach ( $attachment_data['sizes'] as $size_key => $size_data ) {
|
238 |
if ( ! empty( $size_data['success'] ) ) {
|
239 |
-
$original_size +=
|
240 |
-
$optimized_size +=
|
241 |
}
|
242 |
}
|
243 |
}
|
244 |
|
245 |
$data = array(
|
246 |
-
'count'
|
247 |
-
'original_size' =>
|
248 |
-
'optimized_size' =>
|
249 |
-
'percent'
|
250 |
);
|
251 |
|
252 |
if ( ! empty( $key ) ) {
|
253 |
-
return $data[ $key ];
|
254 |
}
|
255 |
|
256 |
return $data;
|
257 |
}
|
258 |
|
259 |
/**
|
260 |
-
* Returns the estimated total size of the images not optimized
|
261 |
*
|
262 |
* We estimate the total size of the images in the library by getting the latest 250 images and their thumbnails
|
263 |
-
* add up their filesizes, and doing some maths to get the total size
|
264 |
-
*
|
265 |
-
* @return (int) the current estimated total size of images not optimized
|
266 |
*
|
267 |
* @since 1.6
|
268 |
* @author Remy Perona
|
|
|
|
|
269 |
*/
|
270 |
function imagify_calculate_total_size_images_library() {
|
271 |
-
|
272 |
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
|
280 |
-
|
281 |
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
|
290 |
-
|
291 |
-
|
292 |
|
293 |
/**
|
294 |
-
* Returns the estimated average size of the images uploaded per month
|
295 |
*
|
296 |
* We estimate the average size of the images uploaded in the library per month by getting the latest 250 images and their thumbnails
|
297 |
-
* for the 3 latest months, add up their filesizes, and doing some maths to get the total average size
|
298 |
-
*
|
299 |
-
* @return (int) the current estimated average size of images uploaded per month
|
300 |
*
|
301 |
* @since 1.6
|
302 |
* @author Remy Perona
|
|
|
|
|
303 |
*/
|
304 |
function imagify_calculate_average_size_images_per_month() {
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
|
309 |
-
|
310 |
-
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
-
|
322 |
-
|
323 |
-
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
|
333 |
-
|
334 |
-
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
-
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
352 |
-
|
353 |
-
|
354 |
-
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
366 |
-
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
}
|
379 |
|
380 |
/**
|
381 |
-
* Returns the estimated total size of images
|
382 |
-
*
|
383 |
-
* @param array $images_id Array of images ID
|
384 |
-
* @param int $partial_total_images The number of images we're doing the calculation with
|
385 |
-
* @param int $total_images The total number of images
|
386 |
-
* @return int The estimated total size of images
|
387 |
*
|
388 |
* @since 1.6
|
389 |
* @author Remy Perona
|
|
|
|
|
|
|
|
|
|
|
390 |
*/
|
391 |
function imagify_calculate_total_image_size( $images_id, $partial_total_images, $total_images ) {
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
$attachments_filename = $wpdb->get_results(
|
399 |
-
"
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
|
|
|
405 |
);
|
406 |
|
407 |
-
|
408 |
-
|
409 |
-
|
410 |
-
$attachments_data = $wpdb->get_results(
|
411 |
-
"
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
|
|
417 |
);
|
418 |
-
|
419 |
-
$attachments_data = imagify_query_results_combine( $images_id, $attachments_data );
|
420 |
$attachments_data = array_map( 'maybe_unserialize', $attachments_data );
|
421 |
|
422 |
-
|
423 |
-
$imagify_data = $wpdb->get_results(
|
424 |
-
"
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
|
|
430 |
);
|
431 |
-
|
432 |
-
$imagify_data = imagify_query_results_combine( $images_id, $imagify_data );
|
433 |
$imagify_data = array_map( 'maybe_unserialize', $imagify_data );
|
434 |
-
|
435 |
-
// Get attachments status
|
436 |
-
$attachments_status = $wpdb->get_results(
|
437 |
-
"
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
|
|
443 |
);
|
444 |
-
|
445 |
$attachments_status = imagify_query_results_combine( $images_id, $attachments_status );
|
446 |
|
447 |
-
|
448 |
-
|
449 |
-
|
450 |
-
|
451 |
-
|
452 |
-
|
453 |
-
|
454 |
-
|
455 |
-
|
456 |
-
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
/**
|
5 |
* Count number of attachments.
|
6 |
*
|
7 |
* @since 1.0
|
11 |
*/
|
12 |
function imagify_count_attachments() {
|
13 |
global $wpdb;
|
14 |
+
static $count;
|
15 |
|
16 |
/**
|
17 |
+
* Filter the number of attachments.
|
18 |
+
* 3rd party will be able to override the result.
|
19 |
*
|
20 |
* @since 1.5
|
21 |
+
*
|
22 |
+
* @param int|bool $pre_count Default is false. Provide an integer.
|
23 |
+
*/
|
24 |
+
$pre_count = apply_filters( 'imagify_count_attachments', false );
|
25 |
+
|
26 |
+
if ( false !== $pre_count ) {
|
27 |
+
return (int) $pre_count;
|
28 |
}
|
29 |
|
30 |
+
if ( isset( $count ) ) {
|
31 |
+
return $count;
|
32 |
+
}
|
33 |
|
34 |
+
$count = (int) $wpdb->get_var( "
|
35 |
+
SELECT COUNT( $wpdb->posts.ID )
|
36 |
+
FROM $wpdb->posts
|
37 |
+
WHERE post_type = 'attachment'
|
38 |
+
AND post_status != 'trash'
|
39 |
+
AND ( $wpdb->posts.post_mime_type = 'image/jpeg' OR $wpdb->posts.post_mime_type = 'image/png' OR $wpdb->posts.post_mime_type = 'image/gif' )"
|
40 |
+
);
|
|
|
41 |
|
42 |
+
if ( $count > apply_filters( 'imagify_unoptimized_attachment_limit', 10000 ) ) {
|
43 |
+
set_transient( 'imagify_large_library', 1 );
|
|
|
44 |
}
|
45 |
|
46 |
+
return $count;
|
47 |
}
|
48 |
|
49 |
+
/**
|
50 |
* Count number of optimized attachments with an error.
|
51 |
*
|
52 |
* @since 1.0
|
56 |
*/
|
57 |
function imagify_count_error_attachments() {
|
58 |
global $wpdb;
|
59 |
+
static $count;
|
60 |
|
61 |
/**
|
62 |
+
* Filter the number of optimized attachments with an error.
|
63 |
+
* 3rd party will be able to override the result.
|
64 |
*
|
65 |
* @since 1.5
|
66 |
+
*
|
67 |
+
* @param int|bool $pre_count Default is false. Provide an integer.
|
68 |
+
*/
|
69 |
+
$pre_count = apply_filters( 'imagify_count_error_attachments', false );
|
70 |
+
|
71 |
+
if ( false !== $pre_count ) {
|
72 |
+
return (int) $pre_count;
|
73 |
}
|
74 |
+
|
75 |
+
if ( isset( $count ) ) {
|
76 |
+
return $count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
77 |
}
|
78 |
|
79 |
+
$count = (int) $wpdb->get_var( "
|
80 |
+
SELECT COUNT( $wpdb->posts.ID )
|
81 |
+
FROM $wpdb->posts
|
82 |
+
INNER JOIN $wpdb->postmeta
|
83 |
+
ON $wpdb->posts.ID = $wpdb->postmeta.post_id
|
84 |
+
WHERE ( $wpdb->posts.post_mime_type = 'image/jpeg' OR $wpdb->posts.post_mime_type = 'image/png' OR $wpdb->posts.post_mime_type = 'image/gif' )
|
85 |
+
AND $wpdb->postmeta.meta_key = '_imagify_status' AND CAST( $wpdb->postmeta.meta_value AS CHAR ) = 'error'
|
86 |
+
AND $wpdb->posts.post_type = 'attachment'
|
87 |
+
AND $wpdb->posts.post_status = 'inherit'"
|
88 |
+
);
|
89 |
+
|
90 |
+
return $count;
|
91 |
}
|
92 |
|
93 |
+
/**
|
94 |
* Count number of optimized attachments (by Imagify or an other tool before).
|
95 |
*
|
96 |
* @since 1.0
|
100 |
*/
|
101 |
function imagify_count_optimized_attachments() {
|
102 |
global $wpdb;
|
103 |
+
static $count;
|
104 |
|
105 |
/**
|
106 |
+
* Filter the number of optimized attachments.
|
107 |
+
* 3rd party will be able to override the result.
|
108 |
*
|
109 |
* @since 1.5
|
110 |
+
*
|
111 |
+
* @param int|bool $pre_count Default is false. Provide an integer.
|
112 |
+
*/
|
113 |
+
$pre_count = apply_filters( 'imagify_count_optimized_attachments', false );
|
114 |
+
|
115 |
+
if ( false !== $pre_count ) {
|
116 |
+
return (int) $pre_count;
|
117 |
}
|
118 |
+
|
119 |
+
if ( isset( $count ) ) {
|
120 |
+
return $count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
}
|
122 |
|
123 |
+
$count = (int) $wpdb->get_var( "
|
124 |
+
SELECT COUNT( $wpdb->posts.ID )
|
125 |
+
FROM $wpdb->posts
|
126 |
+
INNER JOIN $wpdb->postmeta
|
127 |
+
ON $wpdb->posts.ID = $wpdb->postmeta.post_id
|
128 |
+
WHERE ( $wpdb->posts.post_mime_type = 'image/jpeg' OR $wpdb->posts.post_mime_type = 'image/png' OR $wpdb->posts.post_mime_type = 'image/gif' )
|
129 |
+
AND ( ( $wpdb->postmeta.meta_key = '_imagify_status' AND CAST( $wpdb->postmeta.meta_value AS CHAR ) = 'success' ) OR ( $wpdb->postmeta.meta_key = '_imagify_status' AND CAST( $wpdb->postmeta.meta_value AS CHAR ) = 'already_optimized' ) )
|
130 |
+
AND $wpdb->posts.post_type = 'attachment'
|
131 |
+
AND $wpdb->posts.post_status = 'inherit'"
|
132 |
+
);
|
133 |
+
|
134 |
+
return $count;
|
135 |
}
|
136 |
|
137 |
+
/**
|
138 |
* Count number of unoptimized attachments.
|
139 |
*
|
140 |
* @since 1.0
|
144 |
*/
|
145 |
function imagify_count_unoptimized_attachments() {
|
146 |
/**
|
147 |
+
* Filter the number of unoptimized attachments.
|
148 |
+
* 3rd party will be able to override the result.
|
149 |
*
|
150 |
* @since 1.5
|
151 |
+
*
|
152 |
+
* @param int|bool $pre_count Default is false. Provide an integer.
|
153 |
+
*/
|
154 |
+
$pre_count = apply_filters( 'imagify_count_unoptimized_attachments', false );
|
155 |
+
|
156 |
+
if ( false !== $pre_count ) {
|
157 |
+
return (int) $pre_count;
|
|
|
|
|
|
|
|
|
158 |
}
|
159 |
|
160 |
+
return imagify_count_attachments() - imagify_count_optimized_attachments() - imagify_count_error_attachments();
|
161 |
}
|
162 |
|
163 |
+
/**
|
164 |
* Count percent of optimized attachments.
|
165 |
*
|
166 |
* @since 1.0
|
170 |
*/
|
171 |
function imagify_percent_optimized_attachments() {
|
172 |
/**
|
173 |
+
* Filter the percent of optimized attachments.
|
174 |
+
* 3rd party will be able to override the result.
|
175 |
*
|
176 |
* @since 1.5
|
177 |
+
*
|
178 |
+
* @param int|bool $percent Default is false. Provide an integer.
|
179 |
+
*/
|
180 |
$percent = apply_filters( 'imagify_percent_optimized_attachments', false );
|
181 |
|
182 |
+
if ( false !== $percent ) {
|
183 |
+
return (int) $percent;
|
|
|
|
|
|
|
184 |
}
|
185 |
|
186 |
+
$total_attachments = imagify_count_attachments();
|
187 |
+
$total_optimized_attachments = imagify_count_optimized_attachments();
|
188 |
+
|
189 |
+
return ( 0 !== $total_attachments ) ? round( ( 100 - ( ( $total_attachments - $total_optimized_attachments ) / $total_attachments ) * 100 ) ) : 0;
|
190 |
}
|
191 |
|
192 |
+
/**
|
193 |
* Count percent, original & optimized size of all images optimized by Imagify.
|
194 |
*
|
195 |
* @since 1.0
|
196 |
* @author Jonathan Buttigieg
|
197 |
*
|
198 |
+
* @param string $key What data to return. Choices are between 'count', 'original_size', 'optimized_size', and 'percent'. If left empty, the whole array is returned.
|
199 |
+
* @return array|int An array containing the optimization data. A single data if $key is provided.
|
200 |
*/
|
201 |
function imagify_count_saving_data( $key = '' ) {
|
202 |
global $wpdb;
|
203 |
|
204 |
/**
|
205 |
+
* Filter the query to get all optimized attachments.
|
206 |
+
* 3rd party will be able to override the result.
|
207 |
*
|
208 |
* @since 1.5
|
209 |
+
*/
|
210 |
$attachments = apply_filters( 'imagify_count_saving_data', false );
|
211 |
|
212 |
if ( false === $attachments ) {
|
213 |
+
$attachments = $wpdb->get_col( "
|
214 |
+
SELECT pm1.meta_value
|
215 |
+
FROM $wpdb->postmeta as pm1
|
216 |
+
INNER JOIN $wpdb->postmeta as pm2
|
217 |
+
ON pm1.post_id = pm2.post_id
|
218 |
+
WHERE pm1.meta_key = '_imagify_data'
|
219 |
+
AND ( pm2.meta_key = '_imagify_status' AND pm2.meta_value = 'success' )"
|
220 |
);
|
221 |
}
|
222 |
|
224 |
|
225 |
$original_size = 0;
|
226 |
$optimized_size = 0;
|
227 |
+
$count = 0;
|
228 |
|
229 |
foreach ( $attachments as $attachment_data ) {
|
230 |
if ( ! $attachment_data ) {
|
231 |
continue;
|
232 |
}
|
233 |
+
|
234 |
$stats_data = $attachment_data['stats'];
|
235 |
$original_data = $attachment_data['sizes']['full'];
|
236 |
|
237 |
+
// Increment the original sizes.
|
238 |
+
$original_size += $original_data['original_size'];
|
239 |
+
$optimized_size += $original_data['optimized_size'];
|
240 |
|
241 |
unset( $attachment_data['sizes']['full'] );
|
242 |
|
243 |
+
// Increment the thumbnails sizes.
|
244 |
foreach ( $attachment_data['sizes'] as $size_key => $size_data ) {
|
245 |
if ( ! empty( $size_data['success'] ) ) {
|
246 |
+
$original_size += $size_data['original_size'];
|
247 |
+
$optimized_size += $size_data['optimized_size'];
|
248 |
}
|
249 |
}
|
250 |
}
|
251 |
|
252 |
$data = array(
|
253 |
+
'count' => count( $attachments ),
|
254 |
+
'original_size' => $original_size,
|
255 |
+
'optimized_size' => $optimized_size,
|
256 |
+
'percent' => $optimized_size ? ceil( ( ( $original_size - $optimized_size ) / $original_size ) * 100 ) : 0,
|
257 |
);
|
258 |
|
259 |
if ( ! empty( $key ) ) {
|
260 |
+
return isset( $data[ $key ] ) ? $data[ $key ] : 0;
|
261 |
}
|
262 |
|
263 |
return $data;
|
264 |
}
|
265 |
|
266 |
/**
|
267 |
+
* Returns the estimated total size of the images not optimized.
|
268 |
*
|
269 |
* We estimate the total size of the images in the library by getting the latest 250 images and their thumbnails
|
270 |
+
* add up their filesizes, and doing some maths to get the total size.
|
|
|
|
|
271 |
*
|
272 |
* @since 1.6
|
273 |
* @author Remy Perona
|
274 |
+
*
|
275 |
+
* @return int The current estimated total size of images not optimized.
|
276 |
*/
|
277 |
function imagify_calculate_total_size_images_library() {
|
278 |
+
global $wpdb;
|
279 |
|
280 |
+
$images_id = $wpdb->get_results( "
|
281 |
+
SELECT ID FROM $wpdb->posts
|
282 |
+
WHERE ( post_mime_type LIKE 'image/%' )
|
283 |
+
AND post_type = 'attachment' AND ( post_status = 'inherit' )
|
284 |
+
LIMIT 250
|
285 |
+
", ARRAY_A );
|
286 |
|
287 |
+
$images_id = wp_list_pluck( $images_id, 'ID' );
|
288 |
|
289 |
+
if ( ! $images_id ) {
|
290 |
+
return 0;
|
291 |
+
}
|
292 |
|
293 |
+
$partial_total_images = count( $images_id );
|
294 |
+
$total_images = imagify_count_attachments();
|
295 |
+
$total_size_images = imagify_calculate_total_image_size( $images_id, $partial_total_images, $total_images );
|
296 |
|
297 |
+
return $total_size_images;
|
298 |
+
}
|
299 |
|
300 |
/**
|
301 |
+
* Returns the estimated average size of the images uploaded per month.
|
302 |
*
|
303 |
* We estimate the average size of the images uploaded in the library per month by getting the latest 250 images and their thumbnails
|
304 |
+
* for the 3 latest months, add up their filesizes, and doing some maths to get the total average size.
|
|
|
|
|
305 |
*
|
306 |
* @since 1.6
|
307 |
* @author Remy Perona
|
308 |
+
*
|
309 |
+
* @return int The current estimated average size of images uploaded per month.
|
310 |
*/
|
311 |
function imagify_calculate_average_size_images_per_month() {
|
312 |
+
$imagify_mime_types = get_imagify_mime_type();
|
313 |
+
|
314 |
+
$partial_images_uploaded_last_month = new WP_Query( array(
|
315 |
+
'post_type' => 'attachment',
|
316 |
+
'post_status' => 'inherit',
|
317 |
+
'post_mime_type' => $imagify_mime_types,
|
318 |
+
'posts_per_page' => 250,
|
319 |
+
'date_query' => array(
|
320 |
+
array(
|
321 |
+
'before' => 'now',
|
322 |
+
'after' => '1 month ago',
|
323 |
+
),
|
324 |
+
),
|
325 |
+
'fields' => 'ids',
|
326 |
+
) );
|
327 |
+
|
328 |
+
$partial_images_uploaded_two_months_ago = new WP_Query( array(
|
329 |
+
'post_type' => 'attachment',
|
330 |
+
'post_status' => 'inherit',
|
331 |
+
'post_mime_type' => $imagify_mime_types,
|
332 |
+
'posts_per_page' => 250,
|
333 |
+
'date_query' => array(
|
334 |
+
array(
|
335 |
+
'before' => '1 month ago',
|
336 |
+
'after' => '2 months ago',
|
337 |
+
),
|
338 |
+
),
|
339 |
+
'fields' => 'ids',
|
340 |
+
) );
|
341 |
+
|
342 |
+
$partial_images_uploaded_three_months_ago = new WP_Query( array(
|
343 |
+
'post_type' => 'attachment',
|
344 |
+
'post_status' => 'inherit',
|
345 |
+
'post_mime_type' => $imagify_mime_types,
|
346 |
+
'posts_per_page' => 250,
|
347 |
+
'date_query' => array(
|
348 |
+
array(
|
349 |
+
'before' => '2 months ago',
|
350 |
+
'after' => '3 months ago',
|
351 |
+
),
|
352 |
+
),
|
353 |
+
'fields' => 'ids',
|
354 |
+
) );
|
355 |
+
|
356 |
+
$partial_images_uploaded_id = array_merge( $partial_images_uploaded_last_month->posts, $partial_images_uploaded_two_months_ago->posts, $partial_images_uploaded_three_months_ago->posts );
|
357 |
+
|
358 |
+
if ( ! $partial_images_uploaded_id ) {
|
359 |
+
return 0;
|
360 |
+
}
|
361 |
+
|
362 |
+
$images_uploaded_id = new WP_Query( array(
|
363 |
+
'post_type' => 'attachment',
|
364 |
+
'post_status' => 'inherit',
|
365 |
+
'post_mime_type' => $imagify_mime_types,
|
366 |
+
'posts_per_page' => -1,
|
367 |
+
'date_query' => array(
|
368 |
+
array(
|
369 |
+
'before' => 'now',
|
370 |
+
'after' => '3 months ago',
|
371 |
+
),
|
372 |
+
),
|
373 |
+
'fields' => 'ids',
|
374 |
+
) );
|
375 |
+
|
376 |
+
if ( ! $images_uploaded_id->posts ) {
|
377 |
+
return 0;
|
378 |
+
}
|
379 |
+
|
380 |
+
$partial_total_images_uploaded = count( $partial_images_uploaded_id );
|
381 |
+
$total_images_uploaded = $images_uploaded_id->post_count;
|
382 |
+
$average_size_images_per_month = imagify_calculate_total_image_size( $partial_images_uploaded_id, $partial_total_images_uploaded, $total_images_uploaded ) / 3;
|
383 |
+
|
384 |
+
return $average_size_images_per_month;
|
385 |
}
|
386 |
|
387 |
/**
|
388 |
+
* Returns the estimated total size of images.
|
|
|
|
|
|
|
|
|
|
|
389 |
*
|
390 |
* @since 1.6
|
391 |
* @author Remy Perona
|
392 |
+
*
|
393 |
+
* @param array $images_id Array of images ID.
|
394 |
+
* @param int $partial_total_images The number of images we're doing the calculation with.
|
395 |
+
* @param int $total_images The total number of images.
|
396 |
+
* @return int The estimated total size of images.
|
397 |
*/
|
398 |
function imagify_calculate_total_image_size( $images_id, $partial_total_images, $total_images ) {
|
399 |
+
global $wpdb;
|
400 |
+
$partial_size_images = '';
|
401 |
+
$partial_total_intermediate_images = '';
|
402 |
+
$sql_ids = implode( ',', $images_id );
|
403 |
+
|
404 |
+
// Get attachments filename.
|
405 |
+
$attachments_filename = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
406 |
+
"
|
407 |
+
SELECT pm.post_id as id, pm.meta_value as value
|
408 |
+
FROM $wpdb->postmeta as pm
|
409 |
+
WHERE pm.meta_key = '_wp_attached_file'
|
410 |
+
AND pm.post_id IN ($sql_ids)
|
411 |
+
ORDER BY pm.post_id DESC
|
412 |
+
", ARRAY_A
|
413 |
);
|
414 |
|
415 |
+
$attachments_filename = imagify_query_results_combine( $images_id, $attachments_filename );
|
416 |
+
|
417 |
+
// Get attachments data.
|
418 |
+
$attachments_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
419 |
+
"
|
420 |
+
SELECT pm.post_id as id, pm.meta_value as value
|
421 |
+
FROM $wpdb->postmeta as pm
|
422 |
+
WHERE pm.meta_key = '_wp_attachment_metadata'
|
423 |
+
AND pm.post_id IN ($sql_ids)
|
424 |
+
ORDER BY pm.post_id DESC
|
425 |
+
", ARRAY_A
|
426 |
);
|
427 |
+
|
428 |
+
$attachments_data = imagify_query_results_combine( $images_id, $attachments_data );
|
429 |
$attachments_data = array_map( 'maybe_unserialize', $attachments_data );
|
430 |
|
431 |
+
// Get imagify data.
|
432 |
+
$imagify_data = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
433 |
+
"
|
434 |
+
SELECT pm.post_id as id, pm.meta_value as value
|
435 |
+
FROM $wpdb->postmeta as pm
|
436 |
+
WHERE pm.meta_key = '_imagify_data'
|
437 |
+
AND pm.post_id IN ($sql_ids)
|
438 |
+
ORDER BY pm.post_id DESC
|
439 |
+
", ARRAY_A
|
440 |
);
|
441 |
+
|
442 |
+
$imagify_data = imagify_query_results_combine( $images_id, $imagify_data );
|
443 |
$imagify_data = array_map( 'maybe_unserialize', $imagify_data );
|
444 |
+
|
445 |
+
// Get attachments status.
|
446 |
+
$attachments_status = $wpdb->get_results( // WPCS: unprepared SQL ok.
|
447 |
+
"
|
448 |
+
SELECT pm.post_id as id, pm.meta_value as value
|
449 |
+
FROM $wpdb->postmeta as pm
|
450 |
+
WHERE pm.meta_key = '_imagify_status'
|
451 |
+
AND pm.post_id IN ($sql_ids)
|
452 |
+
ORDER BY pm.post_id DESC
|
453 |
+
", ARRAY_A
|
454 |
);
|
455 |
+
|
456 |
$attachments_status = imagify_query_results_combine( $images_id, $attachments_status );
|
457 |
|
458 |
+
foreach ( $images_id as $image_id ) {
|
459 |
+
$attachment_status = isset( $attachments_status[ $image_id ] ) ? $attachments_status[ $image_id ] : false;
|
460 |
+
|
461 |
+
if ( 'success' === $attachments_status ) {
|
462 |
+
$imagify_data = isset( $imagify_data[ $image_id ] ) ? $imagify_data[ $image_id ] : false;
|
463 |
+
$partial_size_images += $imagify_data['stats']['original_size'];
|
464 |
+
$partial_total_intermediate_images += count( $attachment_data['sizes'] );
|
465 |
+
continue;
|
466 |
+
}
|
467 |
+
|
468 |
+
$attachment_metadata = isset( $attachments_data[ $image_id ] ) ? $attachments_data[ $image_id ] : false;
|
469 |
+
$sizes = isset( $attachment_metadata['sizes'] ) ? (array) $attachment_metadata['sizes'] : array();
|
470 |
+
|
471 |
+
/** This filter is documented in inc/functions/process.php. */
|
472 |
+
$full_image = apply_filters( 'imagify_file_path', get_imagify_attached_file( $attachments_filename[ $image_id ] ) );
|
473 |
+
$partial_size_images += filesize( $full_image );
|
474 |
+
|
475 |
+
if ( ! $sizes ) {
|
476 |
+
continue;
|
477 |
+
}
|
478 |
+
|
479 |
+
foreach ( $sizes as $size_key => $size_data ) {
|
480 |
+
if ( array_key_exists( $size_key, get_imagify_option( 'disallowed-sizes', array() ) ) && ! imagify_is_active_for_network() ) {
|
481 |
+
continue;
|
482 |
+
}
|
483 |
+
|
484 |
+
$thumbnail_path = trailingslashit( dirname( $full_image ) ) . $size_data['file'];
|
485 |
+
|
486 |
+
if ( file_exists( $thumbnail_path ) ) {
|
487 |
+
$partial_size_images += filesize( $thumbnail_path );
|
488 |
+
$partial_total_intermediate_images++;
|
489 |
+
}
|
490 |
+
}
|
491 |
+
}
|
492 |
+
|
493 |
+
$intermediate_images_per_image = $partial_total_intermediate_images / $partial_total_images;
|
494 |
+
$average_size_images = $partial_size_images / ( $partial_total_images + $partial_total_intermediate_images );
|
495 |
+
$total_size_images = $average_size_images * ( $total_images + ( $intermediate_images_per_image * $total_images ) );
|
496 |
+
|
497 |
+
return $total_size_images;
|
498 |
+
}
|
inc/functions/admin-ui.php
CHANGED
@@ -1,72 +1,82 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
* Get the optimization data list for a specific attachment.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @author Jonathan Buttigieg
|
9 |
*
|
10 |
-
* @param
|
11 |
-
* @
|
|
|
12 |
*/
|
13 |
function get_imagify_attachment_optimization_text( $attachment, $context = 'wp' ) {
|
14 |
global $pagenow;
|
15 |
|
16 |
-
$
|
17 |
-
$
|
18 |
-
$
|
19 |
-
$
|
20 |
-
$
|
21 |
-
$reoptimize_link = get_imagify_attachment_reoptimize_link( $attachment, $context );
|
22 |
-
$reoptimize_output = ( $reoptimize_link ) ? $reoptimize_link : '';
|
23 |
$reoptimize_output_before = '<div class="imagify-datas-actions-links">';
|
24 |
$reoptimize_output_after = '</div><!-- .imagify-datas-actions-links -->';
|
|
|
25 |
|
26 |
-
|
27 |
-
|
28 |
-
if ( $error = get_imagify_attachment_error_text( $attachment, $context ) ) {
|
29 |
$reoptimize_output = $reoptimize_output_before . $reoptimize_output . $reoptimize_output_after;
|
30 |
-
$error = ( 'post.php' === $pagenow ) ? $output_before . $error . $reoptimize_output . $output_after : $error . $reoptimize_output;
|
31 |
|
32 |
-
return $error;
|
33 |
}
|
34 |
|
|
|
|
|
|
|
|
|
35 |
if ( 'post.php' !== $pagenow ) {
|
36 |
$output .= $output_before . '<span class="data">' . __( 'New Filesize:', 'imagify' ) . '</span> <strong class="big">' . size_format( $data['sizes']['full']['optimized_size'], 2 ) . '</strong>' . $output_after;
|
37 |
}
|
38 |
|
39 |
$chart = '<span class="imagify-chart">
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
|
45 |
-
$output .= $output_before
|
46 |
-
|
|
|
|
|
47 |
|
48 |
-
//
|
49 |
-
if ( 'post.php' !== $pagenow
|
50 |
-
//
|
51 |
$output .= '</ul>';
|
52 |
-
$output .= '<p class="imagify-datas-more-action"
|
|
|
|
|
|
|
|
|
|
|
53 |
$output .= '<ul id="imagify-view-details-' . $attachment_id . '" class="imagify-datas-list imagify-datas-details">';
|
54 |
|
55 |
-
//
|
56 |
$output .= $output_before . '<span class="data">' . __( 'Original Filesize:', 'imagify' ) . '</span> <strong class="original">' . $attachment->get_original_size() . '</strong>' . $output_after;
|
57 |
}
|
58 |
|
59 |
$output .= $output_before . '<span class="data">' . __( 'Level:', 'imagify' ) . '</span> <strong>' . $optimization_level . '</strong>' . $output_after;
|
60 |
|
61 |
-
|
|
|
|
|
62 |
$output .= $output_before . '<span class="data">' . __( 'Thumbnails Optimized:', 'imagify' ) . '</span> <strong>' . $total_optimized_thumbnails . '</strong>' . $output_after;
|
63 |
$output .= $output_before . '<span class="data">' . __( 'Overall Saving:', 'imagify' ) . '</span> <strong>' . $data['stats']['percent'] . '%</strong>' . $output_after;
|
64 |
}
|
65 |
|
66 |
-
//
|
67 |
$output .= ( 'post.php' !== $pagenow ) ? '</ul>' : '';
|
68 |
|
69 |
-
//
|
70 |
$output .= ( 'post.php' !== $pagenow ) ? '' : $output_before;
|
71 |
$output .= $reoptimize_output_before;
|
72 |
$output .= $reoptimize_output;
|
@@ -74,15 +84,17 @@ function get_imagify_attachment_optimization_text( $attachment, $context = 'wp'
|
|
74 |
if ( $attachment->has_backup() ) {
|
75 |
$args = array(
|
76 |
'attachment_id' => $attachment_id,
|
77 |
-
'context'
|
78 |
);
|
79 |
-
$class = ( 'post.php' !== $pagenow
|
80 |
-
$output .= '<a id="imagify-restore-' . $attachment_id . '" href="' . get_imagify_admin_url( 'restore-upload', $args ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Restoring...', 'imagify' ) . '"
|
|
|
|
|
81 |
|
82 |
-
if ( 'upload.php'
|
83 |
$image = wp_get_attachment_image_src( $attachment_id, 'full' );
|
84 |
|
85 |
-
$output .= '<input id="imagify-original-src" type="hidden" value="' . $attachment->get_backup_url() . '">';
|
86 |
$output .= '<input id="imagify-original-size" type="hidden" value="' . $attachment->get_original_size() . '">';
|
87 |
$output .= '<input id="imagify-full-src" type="hidden" value="' . $image[0] . '">';
|
88 |
$output .= '<input id="imagify-full-width" type="hidden" value="' . $image[1] . '">';
|
@@ -96,112 +108,126 @@ function get_imagify_attachment_optimization_text( $attachment, $context = 'wp'
|
|
96 |
return $output;
|
97 |
}
|
98 |
|
99 |
-
|
100 |
* Get the error message for a specific attachment.
|
101 |
*
|
102 |
* @since 1.0
|
103 |
* @author Jonathan Buttigieg
|
104 |
*
|
105 |
-
* @param
|
106 |
-
* @
|
|
|
107 |
*/
|
108 |
function get_imagify_attachment_error_text( $attachment, $context = 'wp' ) {
|
109 |
global $pagenow;
|
110 |
|
111 |
$attachment_id = $attachment->id;
|
112 |
-
$data
|
113 |
-
$output
|
114 |
-
$args
|
115 |
'attachment_id' => $attachment_id,
|
116 |
-
'context'
|
117 |
);
|
118 |
|
119 |
if ( isset( $data['sizes']['full']['success'] ) && ! $data['sizes']['full']['success'] ) {
|
120 |
-
$class = ( 'post.php' !== $pagenow
|
121 |
-
$output .= '<strong>' . $data['sizes']['full']['error'] . '</strong><br
|
|
|
122 |
}
|
123 |
|
124 |
return $output;
|
125 |
}
|
126 |
|
127 |
-
|
128 |
* Get the re-optimize link for a specific attachment.
|
129 |
*
|
130 |
* @since 1.0
|
131 |
* @author Jonathan Buttigieg
|
132 |
*
|
133 |
-
* @param
|
134 |
-
* @
|
|
|
135 |
*/
|
136 |
function get_imagify_attachment_reoptimize_link( $attachment, $context = 'wp' ) {
|
137 |
global $pagenow;
|
138 |
|
139 |
-
|
140 |
-
$level = (int) $attachment->get_optimization_level();
|
141 |
-
$args = array(
|
142 |
-
'attachment_id' => $attachment_id,
|
143 |
-
'context' => $context,
|
144 |
-
);
|
145 |
-
$output = '';
|
146 |
-
|
147 |
-
// Stop the process if the API key isn't valid
|
148 |
if ( ! imagify_valid_key() ) {
|
149 |
-
return
|
150 |
}
|
151 |
|
|
|
|
|
152 |
// Don't display anything if there is no backup or the image has been optimized.
|
153 |
-
if ( ! $attachment->has_backup() && ! $
|
154 |
-
return
|
155 |
}
|
156 |
|
157 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
158 |
|
159 |
-
// Re-optimize to Ultra
|
160 |
if ( 1 === $level || 0 === $level ) {
|
161 |
$args['optimization_level'] = 2;
|
162 |
-
$output .= '<a href="' . get_imagify_admin_url( 'manual-override-upload', $args ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '"
|
|
|
|
|
|
|
163 |
}
|
164 |
|
165 |
-
// Re-optimize to Aggressive
|
166 |
-
if ( ( 2 === $level && ! $
|
167 |
$args['optimization_level'] = 1;
|
168 |
-
$output .= '<a href="' . get_imagify_admin_url( 'manual-override-upload', $args ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '"
|
|
|
|
|
|
|
169 |
}
|
170 |
|
171 |
-
// Re-optimize to Normal
|
172 |
-
if ( ( 2 === $level || 1 === $level ) && ! $
|
173 |
$args['optimization_level'] = 0;
|
174 |
-
$output .= '<a href="' . get_imagify_admin_url( 'manual-override-upload', $args ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '"
|
|
|
|
|
|
|
175 |
}
|
176 |
|
177 |
return $output;
|
178 |
}
|
179 |
|
180 |
-
|
181 |
* Get all data to diplay for a specific attachment.
|
182 |
*
|
183 |
* @since 1.2
|
184 |
* @author Jonathan Buttigieg
|
185 |
*
|
186 |
-
* @param
|
187 |
-
* @
|
|
|
188 |
*/
|
189 |
function get_imagify_media_column_content( $attachment, $context = 'wp' ) {
|
190 |
$attachment_id = $attachment->id;
|
191 |
$attachment_ext = $attachment->get_extension();
|
192 |
-
$output
|
193 |
|
194 |
-
// Check if the attachment extension is allowed
|
195 |
-
if ( 'wp' === $context && ! wp_attachment_is_image( $attachment_id )
|
196 |
-
|
197 |
-
return $
|
198 |
}
|
199 |
|
200 |
-
// Check if the API key is valid
|
201 |
if ( ! imagify_valid_key() && ! $attachment->is_optimized() ) {
|
202 |
$output .= __( 'Invalid API key', 'imagify' );
|
203 |
$output .= '<br/>';
|
204 |
-
$output .= '<a href="' . get_imagify_admin_url( 'options-general' ) . '">' . __( 'Check your Settings', 'imagify' ) . '</a>';
|
205 |
return $output;
|
206 |
}
|
207 |
|
@@ -209,17 +235,16 @@ function get_imagify_media_column_content( $attachment, $context = 'wp' ) {
|
|
209 |
$transient_name = 'imagify-' . $transient_context . 'async-in-progress-' . $attachment_id;
|
210 |
|
211 |
if ( false !== get_transient( $transient_name ) ) {
|
212 |
-
|
213 |
-
return $output;
|
214 |
}
|
215 |
|
216 |
-
// Check if the image was optimized
|
217 |
if ( ! $attachment->is_optimized() && ! $attachment->has_error() ) {
|
218 |
$args = array(
|
219 |
'attachment_id' => $attachment_id,
|
220 |
-
'context'
|
221 |
);
|
222 |
-
$output .= '<a id="imagify-upload-' . $attachment_id . '" href="' . get_imagify_admin_url( 'manual-upload', $args ) . '" class="button-primary button-imagify-manual-upload" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">' . __( 'Optimize', 'imagify' ) . '</a>';
|
223 |
return $output;
|
224 |
}
|
225 |
|
@@ -228,42 +253,55 @@ function get_imagify_media_column_content( $attachment, $context = 'wp' ) {
|
|
228 |
}
|
229 |
|
230 |
/**
|
231 |
-
*
|
232 |
-
*
|
233 |
-
* @return string HTML
|
234 |
*
|
235 |
* @since 1.6
|
236 |
* @author Geoffrey
|
237 |
*
|
238 |
-
* @todo
|
|
|
|
|
239 |
*/
|
240 |
function get_imagify_new_to_imagify() {
|
241 |
-
if (
|
242 |
-
return '
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
243 |
<div class="imagify-section imagify-section-positive">
|
244 |
<div class="imagify-start imagify-mr2">
|
245 |
-
<button id="imagify-get-pricing-modal" data-nonce="' . wp_create_nonce('imagify_get_pricing_' . get_current_user_id() ) . '" data-target="#imagify-pricing-modal" type="button" class="imagify-modal-trigger imagify-button imagify-button-light imagify-button-big">
|
246 |
<i class="dashicons dashicons-dashboard" aria-hidden="true"></i>
|
247 |
<span class="button-text">' . esc_html__( 'What plan do I need?', 'imagify' ) . '</span>
|
248 |
</button>
|
249 |
</div>
|
250 |
<div class="imagify-oh">
|
251 |
<p class="imagify-section-title">' . esc_html__( 'You\'re new to Imagify?', 'imagify' ) . '</p>
|
252 |
-
<p>' . esc_html__( 'Let us help you by analyzing your existing images and
|
253 |
</div>
|
254 |
</div>
|
255 |
-
|
256 |
-
}
|
257 |
}
|
258 |
|
259 |
/**
|
260 |
-
* Return the formatted price present in pricing tables
|
261 |
-
*
|
262 |
-
* @param float $value the price value
|
263 |
-
* @return string the markuped price
|
264 |
*
|
265 |
* @since 1.6
|
266 |
* @author Geoffrey
|
|
|
|
|
|
|
267 |
*/
|
268 |
function get_imagify_price_table_format( $value ) {
|
269 |
$v = explode( '.', (string) $value );
|
@@ -272,29 +310,28 @@ function get_imagify_price_table_format( $value ) {
|
|
272 |
}
|
273 |
|
274 |
/**
|
275 |
-
*
|
276 |
-
* @return string HTML code for payement modal
|
277 |
*
|
278 |
* @since 1.6
|
279 |
-
* @since 1.6.3 Include discount banners
|
280 |
* @author Geoffrey
|
281 |
*
|
282 |
-
* @todo Make first offers dynamic thanks to consumption estimation
|
283 |
*/
|
284 |
function imagify_payment_modal() {
|
285 |
-
?>
|
286 |
<div id="imagify-pricing-modal" class="imagify-modal imagify-payment-modal" aria-hidden="false" role="dialog">
|
287 |
<div class="imagify-modal-content">
|
288 |
<div class="imagify-modal-main">
|
289 |
<div class="imagify-modal-views imagify-pre-checkout-view" id="imagify-pre-checkout-view" aria-hidden="false">
|
290 |
|
291 |
-
|
292 |
$attachments_number = imagify_count_attachments();
|
293 |
$total_size = get_imagify_option( 'total_size_images_library', false );
|
294 |
$per_month = get_imagify_option( 'average_size_images_per_month', false );
|
295 |
-
|
296 |
|
297 |
-
<div class="imagify-modal-section section-gray imagify-estimation-block<?php echo
|
298 |
<p class="imagify-modal-title">
|
299 |
<span class="imagify-numbers-calc"><?php esc_html_e( 'We analysed your images', 'imagify' ); ?></span>
|
300 |
<span class="imagify-numbers-notcalc"><?php esc_html_e( 'We are analysing your images', 'imagify' ); ?></span>
|
@@ -305,18 +342,37 @@ function imagify_payment_modal() {
|
|
305 |
<div class="imagify-modal-cols">
|
306 |
<div class="imagify-col">
|
307 |
<p>
|
308 |
-
<span class="imagify-border-styled"
|
309 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
310 |
</p>
|
311 |
</div>
|
312 |
<div class="imagify-col">
|
313 |
<p class="imagify-iconed">
|
314 |
<i class="dashicons dashicons-images-alt2" aria-hidden="true"></i>
|
315 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
316 |
</p>
|
317 |
<p class="imagify-iconed">
|
318 |
<i class="dashicons dashicons-cloud" aria-hidden="true"></i>
|
319 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
320 |
</p>
|
321 |
</div>
|
322 |
</div>
|
@@ -355,7 +411,15 @@ function imagify_payment_modal() {
|
|
355 |
<span class="imagify-offer-size">1 GB</span>
|
356 |
<span class="imagify-offer-by"><?php esc_html_e( '/month', 'imagify' ); ?></span>
|
357 |
</span>
|
358 |
-
<span class="imagify-approx"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
359 |
</label>
|
360 |
</div>
|
361 |
<div class="imagify-col-price imagify-flex-table">
|
@@ -376,8 +440,15 @@ function imagify_payment_modal() {
|
|
376 |
</span>
|
377 |
</span>
|
378 |
|
379 |
-
<p class="imagify-price-complement"
|
380 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
381 |
|
382 |
</div>
|
383 |
<div class="imagify-col-other-actions">
|
@@ -403,7 +474,15 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
403 |
<span class="imagify-the-offer">
|
404 |
<span class="imagify-offer-size">3 GB</span>
|
405 |
</span>
|
406 |
-
<span class="imagify-approx"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
407 |
</label>
|
408 |
</div>
|
409 |
<div class="imagify-col-price imagify-flex-table">
|
@@ -440,30 +519,19 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
440 |
<div class="imagify-submit-section">
|
441 |
<button type="button" class="button button-secondary imagify-button-secondary" id="imagify-modal-checkout-btn">
|
442 |
<i class="dashicons dashicons-cart" aria-hidden="true"></i>
|
443 |
-
<?php
|
444 |
-
_e( 'Checkout', 'imagify' );
|
445 |
-
/*
|
446 |
-
printf( esc_html__( 'Pay %s', 'imagify' ), '$<span class="imagify-global-amount">0.00</span>');
|
447 |
-
*/
|
448 |
-
?>
|
449 |
</button>
|
450 |
</div>
|
451 |
</div>
|
452 |
|
453 |
-
<p class="imagify-footer-lines"><?php esc_html_e( 'Monthly plans
|
454 |
</div>
|
455 |
</div><!-- .imagify-pre-checkout-view -->
|
456 |
|
457 |
<?php
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
*
|
462 |
-
* SECOND MODAL VIEW
|
463 |
-
*
|
464 |
-
*
|
465 |
-
*/
|
466 |
-
|
467 |
?>
|
468 |
|
469 |
<div class="imagify-modal-views imagify-plans-selection-view" id="imagify-plans-selection-view" aria-hidden="true">
|
@@ -509,7 +577,15 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
509 |
<span class="imagify-offer-size"></span>
|
510 |
<span class="imagify-offer-by"><?php esc_html_e( '/month', 'imagify' ); ?></span>
|
511 |
</span>
|
512 |
-
<span class="imagify-approx"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
513 |
</p>
|
514 |
</div>
|
515 |
<div class="imagify-col-price imagify-flex-table">
|
@@ -523,8 +599,15 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
523 |
|
524 |
<span class="imagify-recommend" aria-hidden="true"><?php esc_html_e( 'we recommend for you', 'imagify' ); ?></span>
|
525 |
|
526 |
-
<p class="imagify-price-complement"
|
527 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
528 |
|
529 |
</div><!-- .imagify-col-price -->
|
530 |
|
@@ -559,7 +642,15 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
559 |
<span class="imagify-the-offer">
|
560 |
<span class="imagify-offer-size"></span>
|
561 |
</span>
|
562 |
-
<span class="imagify-approx"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
563 |
</p>
|
564 |
</div>
|
565 |
<div class="imagify-col-price">
|
@@ -583,15 +674,9 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
583 |
|
584 |
|
585 |
<?php
|
586 |
-
|
587 |
/**
|
588 |
-
|
589 |
-
|
590 |
-
* THIRD MODAL VIEW
|
591 |
-
*
|
592 |
-
*
|
593 |
-
*/
|
594 |
-
|
595 |
?>
|
596 |
|
597 |
<div class="imagify-modal-views imagify-payment-process-view" id="imagify-payment-process-view" aria-hidden="true">
|
@@ -603,15 +688,9 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
603 |
</div><!-- .imagify-modal-views -->
|
604 |
|
605 |
<?php
|
606 |
-
|
607 |
/**
|
608 |
-
|
609 |
-
|
610 |
-
* Succes view
|
611 |
-
*
|
612 |
-
*
|
613 |
-
*/
|
614 |
-
|
615 |
?>
|
616 |
|
617 |
<div class="imagify-modal-views imagify-success-view" id="imagify-success-view" aria-hidden="true">
|
@@ -671,25 +750,38 @@ additionnal Gb', 'imagify' ), '<span class="imagify-price-add-data"></span>' );
|
|
671 |
<div class="imagify-modal-loader"></div>
|
672 |
</div><!-- .imagify-modal-content-->
|
673 |
</div><!-- .imagify-payment-modal -->
|
674 |
-
<?php
|
675 |
}
|
676 |
|
677 |
/**
|
678 |
-
* Print the discount banner used inside Payment Modal
|
679 |
*
|
680 |
-
* @return void
|
681 |
* @author Geoffrey Crofte
|
682 |
* @since 1.6.3
|
|
|
|
|
683 |
*/
|
684 |
function imagify_print_discount_banner() {
|
685 |
-
?>
|
686 |
-
|
687 |
<div class="imagify-modal-promotion" aria-hidden="true">
|
688 |
-
<p class="imagify-promo-title"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
689 |
<p class="imagify-until-date">
|
690 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
691 |
</p>
|
692 |
</div>
|
693 |
-
|
694 |
-
<?php
|
695 |
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
/**
|
5 |
* Get the optimization data list for a specific attachment.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @author Jonathan Buttigieg
|
9 |
*
|
10 |
+
* @param object $attachment The attachment object.
|
11 |
+
* @param string $context A context.
|
12 |
+
* @return string The output to print.
|
13 |
*/
|
14 |
function get_imagify_attachment_optimization_text( $attachment, $context = 'wp' ) {
|
15 |
global $pagenow;
|
16 |
|
17 |
+
$output = ( 'post.php' !== $pagenow ) ? '<ul class="imagify-datas-list">' : '';
|
18 |
+
$output_before = ( 'post.php' !== $pagenow ) ? '<li class="imagify-data-item">' : '<div class="misc-pub-section misc-pub-imagify imagify-data-item">';
|
19 |
+
$output_after = ( 'post.php' !== $pagenow ) ? '</li>' : '</div>';
|
20 |
+
$reoptimize_link = get_imagify_attachment_reoptimize_link( $attachment, $context );
|
21 |
+
$reoptimize_output = $reoptimize_link ? $reoptimize_link : '';
|
|
|
|
|
22 |
$reoptimize_output_before = '<div class="imagify-datas-actions-links">';
|
23 |
$reoptimize_output_after = '</div><!-- .imagify-datas-actions-links -->';
|
24 |
+
$error = get_imagify_attachment_error_text( $attachment, $context );
|
25 |
|
26 |
+
if ( $error ) {
|
|
|
|
|
27 |
$reoptimize_output = $reoptimize_output_before . $reoptimize_output . $reoptimize_output_after;
|
|
|
28 |
|
29 |
+
return 'post.php' === $pagenow ? $output_before . $error . $reoptimize_output . $output_after : $error . $reoptimize_output;
|
30 |
}
|
31 |
|
32 |
+
$attachment_id = $attachment->id;
|
33 |
+
$data = $attachment->get_data();
|
34 |
+
$optimization_level = $attachment->get_optimization_level_label();
|
35 |
+
|
36 |
if ( 'post.php' !== $pagenow ) {
|
37 |
$output .= $output_before . '<span class="data">' . __( 'New Filesize:', 'imagify' ) . '</span> <strong class="big">' . size_format( $data['sizes']['full']['optimized_size'], 2 ) . '</strong>' . $output_after;
|
38 |
}
|
39 |
|
40 |
$chart = '<span class="imagify-chart">
|
41 |
+
<span class="imagify-chart-container">
|
42 |
+
<canvas id="imagify-consumption-chart" width="15" height="15"></canvas>
|
43 |
+
</span>
|
44 |
+
</span>';
|
45 |
|
46 |
+
$output .= $output_before;
|
47 |
+
$output .= '<span class="data">' . __( 'Original Saving:', 'imagify' ) . '</span> ';
|
48 |
+
$output .= '<strong>' . ( 'post.php' !== $pagenow ? $chart : '' ) . '<span class="imagify-chart-value">' . $data['sizes']['full']['percent'] . '</span>%</strong>';
|
49 |
+
$output .= $output_after;
|
50 |
|
51 |
+
// More details section.
|
52 |
+
if ( 'post.php' !== $pagenow ) {
|
53 |
+
// New list.
|
54 |
$output .= '</ul>';
|
55 |
+
$output .= '<p class="imagify-datas-more-action">';
|
56 |
+
$output .= '<a href="#imagify-view-details-' . $attachment_id . '" data-close="' . __( 'Close details', 'imagify' ) . '" data-open="' . __( 'View details', 'imagify' ) . '">';
|
57 |
+
$output .= '<span class="the-text">' . __( 'View details', 'imagify' ) . '</span>';
|
58 |
+
$output .= '<span class="dashicons dashicons-arrow-down-alt2"></span>';
|
59 |
+
$output .= '</a>';
|
60 |
+
$output .= '</p>';
|
61 |
$output .= '<ul id="imagify-view-details-' . $attachment_id . '" class="imagify-datas-list imagify-datas-details">';
|
62 |
|
63 |
+
// Not in metabox.
|
64 |
$output .= $output_before . '<span class="data">' . __( 'Original Filesize:', 'imagify' ) . '</span> <strong class="original">' . $attachment->get_original_size() . '</strong>' . $output_after;
|
65 |
}
|
66 |
|
67 |
$output .= $output_before . '<span class="data">' . __( 'Level:', 'imagify' ) . '</span> <strong>' . $optimization_level . '</strong>' . $output_after;
|
68 |
|
69 |
+
$total_optimized_thumbnails = $attachment->get_optimized_sizes_count();
|
70 |
+
|
71 |
+
if ( $total_optimized_thumbnails ) {
|
72 |
$output .= $output_before . '<span class="data">' . __( 'Thumbnails Optimized:', 'imagify' ) . '</span> <strong>' . $total_optimized_thumbnails . '</strong>' . $output_after;
|
73 |
$output .= $output_before . '<span class="data">' . __( 'Overall Saving:', 'imagify' ) . '</span> <strong>' . $data['stats']['percent'] . '%</strong>' . $output_after;
|
74 |
}
|
75 |
|
76 |
+
// End of list.
|
77 |
$output .= ( 'post.php' !== $pagenow ) ? '</ul>' : '';
|
78 |
|
79 |
+
// Actions section.
|
80 |
$output .= ( 'post.php' !== $pagenow ) ? '' : $output_before;
|
81 |
$output .= $reoptimize_output_before;
|
82 |
$output .= $reoptimize_output;
|
84 |
if ( $attachment->has_backup() ) {
|
85 |
$args = array(
|
86 |
'attachment_id' => $attachment_id,
|
87 |
+
'context' => $context,
|
88 |
);
|
89 |
+
$class = ( 'post.php' !== $pagenow ) ? 'button-imagify-restore' : '';
|
90 |
+
$output .= '<a id="imagify-restore-' . $attachment_id . '" href="' . get_imagify_admin_url( 'restore-upload', $args ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Restoring...', 'imagify' ) . '">';
|
91 |
+
$output .= '<span class="dashicons dashicons-image-rotate"></span>' . __( 'Restore Original', 'imagify' );
|
92 |
+
$output .= '</a>';
|
93 |
|
94 |
+
if ( 'upload.php' !== $pagenow ) {
|
95 |
$image = wp_get_attachment_image_src( $attachment_id, 'full' );
|
96 |
|
97 |
+
$output .= '<input id="imagify-original-src" type="hidden" value="' . esc_url( $attachment->get_backup_url() ) . '">';
|
98 |
$output .= '<input id="imagify-original-size" type="hidden" value="' . $attachment->get_original_size() . '">';
|
99 |
$output .= '<input id="imagify-full-src" type="hidden" value="' . $image[0] . '">';
|
100 |
$output .= '<input id="imagify-full-width" type="hidden" value="' . $image[1] . '">';
|
108 |
return $output;
|
109 |
}
|
110 |
|
111 |
+
/**
|
112 |
* Get the error message for a specific attachment.
|
113 |
*
|
114 |
* @since 1.0
|
115 |
* @author Jonathan Buttigieg
|
116 |
*
|
117 |
+
* @param object $attachment The attachement object.
|
118 |
+
* @param string $context A context.
|
119 |
+
* @return string The output to print.
|
120 |
*/
|
121 |
function get_imagify_attachment_error_text( $attachment, $context = 'wp' ) {
|
122 |
global $pagenow;
|
123 |
|
124 |
$attachment_id = $attachment->id;
|
125 |
+
$data = $attachment->get_data();
|
126 |
+
$output = '';
|
127 |
+
$args = array(
|
128 |
'attachment_id' => $attachment_id,
|
129 |
+
'context' => $context,
|
130 |
);
|
131 |
|
132 |
if ( isset( $data['sizes']['full']['success'] ) && ! $data['sizes']['full']['success'] ) {
|
133 |
+
$class = ( 'post.php' !== $pagenow ) ? 'button-imagify-manual-upload' : '';
|
134 |
+
$output .= '<strong>' . $data['sizes']['full']['error'] . '</strong><br/>';
|
135 |
+
$output .= '<a id="imagify-upload-' . $attachment_id . '" class="button ' . $class . '" href="' . esc_url( get_imagify_admin_url( 'manual-upload', $args ) ) . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">' . __( 'Try again', 'imagify' ) . '</a>';
|
136 |
}
|
137 |
|
138 |
return $output;
|
139 |
}
|
140 |
|
141 |
+
/**
|
142 |
* Get the re-optimize link for a specific attachment.
|
143 |
*
|
144 |
* @since 1.0
|
145 |
* @author Jonathan Buttigieg
|
146 |
*
|
147 |
+
* @param object $attachment The attachement object.
|
148 |
+
* @param string $context A context.
|
149 |
+
* @return string The output to print.
|
150 |
*/
|
151 |
function get_imagify_attachment_reoptimize_link( $attachment, $context = 'wp' ) {
|
152 |
global $pagenow;
|
153 |
|
154 |
+
// Stop the process if the API key isn't valid.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
if ( ! imagify_valid_key() ) {
|
156 |
+
return '';
|
157 |
}
|
158 |
|
159 |
+
$is_already_optimized = $attachment->is_already_optimized();
|
160 |
+
|
161 |
// Don't display anything if there is no backup or the image has been optimized.
|
162 |
+
if ( ! $attachment->has_backup() && ! $is_already_optimized ) {
|
163 |
+
return '';
|
164 |
}
|
165 |
|
166 |
+
$attachment_id = $attachment->id;
|
167 |
+
$level = $attachment->get_optimization_level();
|
168 |
+
$args = array(
|
169 |
+
'attachment_id' => $attachment_id,
|
170 |
+
'context' => $context,
|
171 |
+
);
|
172 |
+
$output = '';
|
173 |
+
$class = ( 'post.php' !== $pagenow ) ? 'button-imagify-manual-override-upload' : '';
|
174 |
|
175 |
+
// Re-optimize to Ultra.
|
176 |
if ( 1 === $level || 0 === $level ) {
|
177 |
$args['optimization_level'] = 2;
|
178 |
+
$output .= '<a href="' . esc_url( get_imagify_admin_url( 'manual-override-upload', $args ) ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">';
|
179 |
+
/* translators: %s is an optimization level. */
|
180 |
+
$output .= '<span class="dashicons dashicons-admin-generic"></span>' . sprintf( __( 'Re-Optimize to %s', 'imagify' ), __( 'Ultra', 'imagify' ) );
|
181 |
+
$output .= '</a>';
|
182 |
}
|
183 |
|
184 |
+
// Re-optimize to Aggressive.
|
185 |
+
if ( ( 2 === $level && ! $is_already_optimized ) || 0 === $level ) {
|
186 |
$args['optimization_level'] = 1;
|
187 |
+
$output .= '<a href="' . esc_url( get_imagify_admin_url( 'manual-override-upload', $args ) ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">';
|
188 |
+
/* translators: %s is an optimization level. */
|
189 |
+
$output .= '<span class="dashicons dashicons-admin-generic"></span>' . sprintf( __( 'Re-Optimize to %s', 'imagify' ), __( 'Aggressive', 'imagify' ) );
|
190 |
+
$output .= '</a>';
|
191 |
}
|
192 |
|
193 |
+
// Re-optimize to Normal.
|
194 |
+
if ( ( 2 === $level || 1 === $level ) && ! $is_already_optimized ) {
|
195 |
$args['optimization_level'] = 0;
|
196 |
+
$output .= '<a href="' . esc_url( get_imagify_admin_url( 'manual-override-upload', $args ) ) . '" class="' . $class . '" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">';
|
197 |
+
/* translators: %s is an optimization level. */
|
198 |
+
$output .= '<span class="dashicons dashicons-admin-generic"></span>' . sprintf( __( 'Re-Optimize to %s', 'imagify' ), __( 'Normal', 'imagify' ) );
|
199 |
+
$output .= '</a>';
|
200 |
}
|
201 |
|
202 |
return $output;
|
203 |
}
|
204 |
|
205 |
+
/**
|
206 |
* Get all data to diplay for a specific attachment.
|
207 |
*
|
208 |
* @since 1.2
|
209 |
* @author Jonathan Buttigieg
|
210 |
*
|
211 |
+
* @param object $attachment The attachement object.
|
212 |
+
* @param string $context A context.
|
213 |
+
* @return string The output to print.
|
214 |
*/
|
215 |
function get_imagify_media_column_content( $attachment, $context = 'wp' ) {
|
216 |
$attachment_id = $attachment->id;
|
217 |
$attachment_ext = $attachment->get_extension();
|
218 |
+
$output = '';
|
219 |
|
220 |
+
// Check if the attachment extension is allowed.
|
221 |
+
if ( 'wp' === $context && ! wp_attachment_is_image( $attachment_id ) ) {
|
222 |
+
/* translators: %s is a file extension. */
|
223 |
+
return sprintf( __( '%s can\'t be optimized', 'imagify' ), strtoupper( $attachment_ext ) );
|
224 |
}
|
225 |
|
226 |
+
// Check if the API key is valid.
|
227 |
if ( ! imagify_valid_key() && ! $attachment->is_optimized() ) {
|
228 |
$output .= __( 'Invalid API key', 'imagify' );
|
229 |
$output .= '<br/>';
|
230 |
+
$output .= '<a href="' . esc_url( get_imagify_admin_url( 'options-general' ) ) . '">' . __( 'Check your Settings', 'imagify' ) . '</a>';
|
231 |
return $output;
|
232 |
}
|
233 |
|
235 |
$transient_name = 'imagify-' . $transient_context . 'async-in-progress-' . $attachment_id;
|
236 |
|
237 |
if ( false !== get_transient( $transient_name ) ) {
|
238 |
+
return '<div class="button"><span class="imagify-spinner"></span>' . __( 'Optimizing...', 'imagify' ) . '</div>';
|
|
|
239 |
}
|
240 |
|
241 |
+
// Check if the image was optimized.
|
242 |
if ( ! $attachment->is_optimized() && ! $attachment->has_error() ) {
|
243 |
$args = array(
|
244 |
'attachment_id' => $attachment_id,
|
245 |
+
'context' => $context,
|
246 |
);
|
247 |
+
$output .= '<a id="imagify-upload-' . $attachment_id . '" href="' . esc_url( get_imagify_admin_url( 'manual-upload', $args ) ) . '" class="button-primary button-imagify-manual-upload" data-waiting-label="' . esc_attr__( 'Optimizing...', 'imagify' ) . '">' . __( 'Optimize', 'imagify' ) . '</a>';
|
248 |
return $output;
|
249 |
}
|
250 |
|
253 |
}
|
254 |
|
255 |
/**
|
256 |
+
* Display the plan chooser section.
|
|
|
|
|
257 |
*
|
258 |
* @since 1.6
|
259 |
* @author Geoffrey
|
260 |
*
|
261 |
+
* @todo Add only for no-payable users?
|
262 |
+
*
|
263 |
+
* @return string HTML.
|
264 |
*/
|
265 |
function get_imagify_new_to_imagify() {
|
266 |
+
if ( ! imagify_valid_key() ) {
|
267 |
+
return '';
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* Filter whether the plan chooser section is displayed.
|
272 |
+
*
|
273 |
+
* @param $show_new bool Default to true: display the section.
|
274 |
+
*/
|
275 |
+
$show_new = apply_filters( 'imagify_show_new_to_imagify', true );
|
276 |
+
|
277 |
+
if ( ! $show_new ) {
|
278 |
+
return '';
|
279 |
+
}
|
280 |
+
|
281 |
+
return '
|
282 |
<div class="imagify-section imagify-section-positive">
|
283 |
<div class="imagify-start imagify-mr2">
|
284 |
+
<button id="imagify-get-pricing-modal" data-nonce="' . wp_create_nonce( 'imagify_get_pricing_' . get_current_user_id() ) . '" data-target="#imagify-pricing-modal" type="button" class="imagify-modal-trigger imagify-button imagify-button-light imagify-button-big">
|
285 |
<i class="dashicons dashicons-dashboard" aria-hidden="true"></i>
|
286 |
<span class="button-text">' . esc_html__( 'What plan do I need?', 'imagify' ) . '</span>
|
287 |
</button>
|
288 |
</div>
|
289 |
<div class="imagify-oh">
|
290 |
<p class="imagify-section-title">' . esc_html__( 'You\'re new to Imagify?', 'imagify' ) . '</p>
|
291 |
+
<p>' . esc_html__( 'Let us help you by analyzing your existing images and determine the best plan for you', 'imagify' ) . '</p>
|
292 |
</div>
|
293 |
</div>
|
294 |
+
';
|
|
|
295 |
}
|
296 |
|
297 |
/**
|
298 |
+
* Return the formatted price present in pricing tables.
|
|
|
|
|
|
|
299 |
*
|
300 |
* @since 1.6
|
301 |
* @author Geoffrey
|
302 |
+
*
|
303 |
+
* @param float $value The price value.
|
304 |
+
* @return string The markuped price.
|
305 |
*/
|
306 |
function get_imagify_price_table_format( $value ) {
|
307 |
$v = explode( '.', (string) $value );
|
310 |
}
|
311 |
|
312 |
/**
|
313 |
+
* Get the payment modal HTML.
|
|
|
314 |
*
|
315 |
* @since 1.6
|
316 |
+
* @since 1.6.3 Include discount banners.
|
317 |
* @author Geoffrey
|
318 |
*
|
319 |
+
* @todo Make first offers dynamic thanks to consumption estimation.
|
320 |
*/
|
321 |
function imagify_payment_modal() {
|
322 |
+
?>
|
323 |
<div id="imagify-pricing-modal" class="imagify-modal imagify-payment-modal" aria-hidden="false" role="dialog">
|
324 |
<div class="imagify-modal-content">
|
325 |
<div class="imagify-modal-main">
|
326 |
<div class="imagify-modal-views imagify-pre-checkout-view" id="imagify-pre-checkout-view" aria-hidden="false">
|
327 |
|
328 |
+
<?php
|
329 |
$attachments_number = imagify_count_attachments();
|
330 |
$total_size = get_imagify_option( 'total_size_images_library', false );
|
331 |
$per_month = get_imagify_option( 'average_size_images_per_month', false );
|
332 |
+
?>
|
333 |
|
334 |
+
<div class="imagify-modal-section section-gray imagify-estimation-block<?php echo false === $total_size ? ' imagify-analyzing' : ''; ?>">
|
335 |
<p class="imagify-modal-title">
|
336 |
<span class="imagify-numbers-calc"><?php esc_html_e( 'We analysed your images', 'imagify' ); ?></span>
|
337 |
<span class="imagify-numbers-notcalc"><?php esc_html_e( 'We are analysing your images', 'imagify' ); ?></span>
|
342 |
<div class="imagify-modal-cols">
|
343 |
<div class="imagify-col">
|
344 |
<p>
|
345 |
+
<span class="imagify-border-styled">
|
346 |
+
<?php
|
347 |
+
printf(
|
348 |
+
/* translators: %s is a formatted number (don't use %d). */
|
349 |
+
_n( 'You have %s image', 'You have %s images', $attachments_number, 'imagify' ),
|
350 |
+
'</span><span class="imagify-big-number">' . number_format_i18n( $attachments_number ) . '</span><span class="imagify-border-styled">'
|
351 |
+
);
|
352 |
+
?>
|
353 |
+
</span>
|
354 |
</p>
|
355 |
</div>
|
356 |
<div class="imagify-col">
|
357 |
<p class="imagify-iconed">
|
358 |
<i class="dashicons dashicons-images-alt2" aria-hidden="true"></i>
|
359 |
+
<?php
|
360 |
+
printf(
|
361 |
+
/* translators: %s is a formatted file size. */
|
362 |
+
esc_html__( 'You currently have %s of images in your library.', 'imagify' ),
|
363 |
+
'<strong class="imagify-dark total-library-size">' . ( isset( $total_size['human'] ) ? $total_size['human'] : $total_size ) . '</strong>'
|
364 |
+
);
|
365 |
+
?>
|
366 |
</p>
|
367 |
<p class="imagify-iconed">
|
368 |
<i class="dashicons dashicons-cloud" aria-hidden="true"></i>
|
369 |
+
<?php
|
370 |
+
printf(
|
371 |
+
/* translators: %s is a formatted file size. */
|
372 |
+
esc_html__( 'You upload around %s of images per month.', 'imagify' ),
|
373 |
+
'<strong class="imagify-dark average-month-size">' . ( isset( $per_month['human'] ) ? $per_month['human'] : $per_month ) . '</strong>'
|
374 |
+
);
|
375 |
+
?>
|
376 |
</p>
|
377 |
</div>
|
378 |
</div>
|
411 |
<span class="imagify-offer-size">1 GB</span>
|
412 |
<span class="imagify-offer-by"><?php esc_html_e( '/month', 'imagify' ); ?></span>
|
413 |
</span>
|
414 |
+
<span class="imagify-approx">
|
415 |
+
<?php
|
416 |
+
printf(
|
417 |
+
/* translators: %s is a formatted number (don't use %d). */
|
418 |
+
esc_html__( 'approx: %s images', 'imagify' ),
|
419 |
+
'<span class="imagify-approx-nb">' . number_format_i18n( 5000 ) . '</span>'
|
420 |
+
);
|
421 |
+
?>
|
422 |
+
</span>
|
423 |
</label>
|
424 |
</div>
|
425 |
<div class="imagify-col-price imagify-flex-table">
|
440 |
</span>
|
441 |
</span>
|
442 |
|
443 |
+
<p class="imagify-price-complement">
|
444 |
+
<?php
|
445 |
+
printf(
|
446 |
+
/* translators: %s is a formatted price. */
|
447 |
+
__( '%s per<br>additionnal Gb', 'imagify' ),
|
448 |
+
'<span class="imagify-price-add-data"></span>'
|
449 |
+
);
|
450 |
+
?>
|
451 |
+
</p>
|
452 |
|
453 |
</div>
|
454 |
<div class="imagify-col-other-actions">
|
474 |
<span class="imagify-the-offer">
|
475 |
<span class="imagify-offer-size">3 GB</span>
|
476 |
</span>
|
477 |
+
<span class="imagify-approx">
|
478 |
+
<?php
|
479 |
+
printf(
|
480 |
+
/* translators: %s is a formatted number (don't use %d). */
|
481 |
+
esc_html__( 'approx: %s images', 'imagify' ),
|
482 |
+
'<span class="imagify-approx-nb">' . number_format_i18n( 54000 ) . '</span>'
|
483 |
+
);
|
484 |
+
?>
|
485 |
+
</span>
|
486 |
</label>
|
487 |
</div>
|
488 |
<div class="imagify-col-price imagify-flex-table">
|
519 |
<div class="imagify-submit-section">
|
520 |
<button type="button" class="button button-secondary imagify-button-secondary" id="imagify-modal-checkout-btn">
|
521 |
<i class="dashicons dashicons-cart" aria-hidden="true"></i>
|
522 |
+
<?php _e( 'Checkout', 'imagify' ); ?>
|
|
|
|
|
|
|
|
|
|
|
523 |
</button>
|
524 |
</div>
|
525 |
</div>
|
526 |
|
527 |
+
<p class="imagify-footer-lines"><?php esc_html_e( 'Monthly plans come with credits which is renewed every months. The billing happens automatically each month or year depending the billing period you choose.', 'imagify' ); ?></p>
|
528 |
</div>
|
529 |
</div><!-- .imagify-pre-checkout-view -->
|
530 |
|
531 |
<?php
|
532 |
+
/**
|
533 |
+
* SECOND MODAL VIEW.
|
534 |
+
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
535 |
?>
|
536 |
|
537 |
<div class="imagify-modal-views imagify-plans-selection-view" id="imagify-plans-selection-view" aria-hidden="true">
|
577 |
<span class="imagify-offer-size"></span>
|
578 |
<span class="imagify-offer-by"><?php esc_html_e( '/month', 'imagify' ); ?></span>
|
579 |
</span>
|
580 |
+
<span class="imagify-approx">
|
581 |
+
<?php
|
582 |
+
printf(
|
583 |
+
/* translators: %s is a formatted number (don't use %d). */
|
584 |
+
__( 'approx: %s images', 'imagify' ),
|
585 |
+
'<span class="imagify-approx-nb"></span>'
|
586 |
+
);
|
587 |
+
?>
|
588 |
+
</span>
|
589 |
</p>
|
590 |
</div>
|
591 |
<div class="imagify-col-price imagify-flex-table">
|
599 |
|
600 |
<span class="imagify-recommend" aria-hidden="true"><?php esc_html_e( 'we recommend for you', 'imagify' ); ?></span>
|
601 |
|
602 |
+
<p class="imagify-price-complement">
|
603 |
+
<?php
|
604 |
+
printf(
|
605 |
+
/* translators: %s is a formatted price. */
|
606 |
+
__( '%s per<br>additionnal Gb', 'imagify' ),
|
607 |
+
'<span class="imagify-price-add-data"></span>'
|
608 |
+
);
|
609 |
+
?>
|
610 |
+
</p>
|
611 |
|
612 |
</div><!-- .imagify-col-price -->
|
613 |
|
642 |
<span class="imagify-the-offer">
|
643 |
<span class="imagify-offer-size"></span>
|
644 |
</span>
|
645 |
+
<span class="imagify-approx">
|
646 |
+
<?php
|
647 |
+
printf(
|
648 |
+
/* translators: %s is a formatted number (don't use %d). */
|
649 |
+
__( 'approx: %s images', 'imagify' ),
|
650 |
+
'<span class="imagify-approx-nb"></span>'
|
651 |
+
);
|
652 |
+
?>
|
653 |
+
</span>
|
654 |
</p>
|
655 |
</div>
|
656 |
<div class="imagify-col-price">
|
674 |
|
675 |
|
676 |
<?php
|
|
|
677 |
/**
|
678 |
+
* THIRD MODAL VIEW.
|
679 |
+
*/
|
|
|
|
|
|
|
|
|
|
|
680 |
?>
|
681 |
|
682 |
<div class="imagify-modal-views imagify-payment-process-view" id="imagify-payment-process-view" aria-hidden="true">
|
688 |
</div><!-- .imagify-modal-views -->
|
689 |
|
690 |
<?php
|
|
|
691 |
/**
|
692 |
+
* SUCCESS VIEW.
|
693 |
+
*/
|
|
|
|
|
|
|
|
|
|
|
694 |
?>
|
695 |
|
696 |
<div class="imagify-modal-views imagify-success-view" id="imagify-success-view" aria-hidden="true">
|
750 |
<div class="imagify-modal-loader"></div>
|
751 |
</div><!-- .imagify-modal-content-->
|
752 |
</div><!-- .imagify-payment-modal -->
|
753 |
+
<?php
|
754 |
}
|
755 |
|
756 |
/**
|
757 |
+
* Print the discount banner used inside Payment Modal.
|
758 |
*
|
|
|
759 |
* @author Geoffrey Crofte
|
760 |
* @since 1.6.3
|
761 |
+
*
|
762 |
+
* @return void
|
763 |
*/
|
764 |
function imagify_print_discount_banner() {
|
765 |
+
?>
|
|
|
766 |
<div class="imagify-modal-promotion" aria-hidden="true">
|
767 |
+
<p class="imagify-promo-title">
|
768 |
+
<?php
|
769 |
+
printf(
|
770 |
+
/* translators: %s is a formatted percentage. */
|
771 |
+
__( '%s OFF on all the subscriptions', 'secupress' ),
|
772 |
+
'<span class="imagify-promotion-number"></span>'
|
773 |
+
);
|
774 |
+
?>
|
775 |
+
</p>
|
776 |
<p class="imagify-until-date">
|
777 |
+
<?php
|
778 |
+
printf(
|
779 |
+
/* translators: %s is a formatted date. */
|
780 |
+
__( 'Special Offer<br><strong>Until %s</strong>', 'secupress' ),
|
781 |
+
'<span class="imagify-promotion-date"></span>'
|
782 |
+
);
|
783 |
+
?>
|
784 |
</p>
|
785 |
</div>
|
786 |
+
<?php
|
|
|
787 |
}
|
inc/functions/admin.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
* Check if Imagify is activated on the network.
|
@@ -9,96 +9,103 @@ defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
|
9 |
* return bool True if Imagify is activated on the network
|
10 |
*/
|
11 |
function imagify_is_active_for_network() {
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
}
|
17 |
|
18 |
-
|
19 |
* Get the URL related to specific admin page or action.
|
20 |
*
|
21 |
* @since 1.0
|
22 |
*
|
23 |
-
* @
|
|
|
|
|
24 |
*/
|
25 |
function get_imagify_admin_url( $action = 'options-general', $arg = array() ) {
|
26 |
$url = '';
|
27 |
-
$id =
|
28 |
-
$context =
|
29 |
|
30 |
-
switch( $action ) {
|
31 |
case 'manual-override-upload':
|
32 |
$level = ( isset( $arg['optimization_level'] ) ) ? $arg['optimization_level'] : 0;
|
33 |
-
|
34 |
-
break;
|
35 |
|
36 |
case 'manual-upload':
|
37 |
-
|
38 |
-
break;
|
39 |
|
40 |
case 'restore-upload' :
|
41 |
-
|
42 |
-
break;
|
43 |
|
44 |
case 'dismiss-notice':
|
45 |
-
|
46 |
-
break;
|
47 |
|
48 |
case 'bulk-optimization':
|
49 |
-
|
50 |
-
break;
|
51 |
|
52 |
-
case 'options-general':
|
53 |
default :
|
54 |
$page = imagify_is_active_for_network() ? network_admin_url( 'settings.php' ) : admin_url( 'options-general.php' );
|
55 |
-
|
56 |
-
break;
|
57 |
}
|
58 |
-
|
59 |
-
return $url;
|
60 |
}
|
61 |
|
62 |
-
|
63 |
* Get maximal width and height from all thumbnails.
|
64 |
*
|
65 |
* @since 1.1
|
66 |
*
|
67 |
-
* @return array An array containing the max
|
68 |
*/
|
69 |
function get_imagify_max_intermediate_image_size() {
|
70 |
global $_wp_additional_image_sizes;
|
71 |
-
|
72 |
$width = 0;
|
73 |
$height = 0;
|
74 |
-
$limit
|
|
|
75 |
$get_intermediate_image_sizes = get_intermediate_image_sizes();
|
76 |
-
|
77 |
-
// Create the full array with sizes and crop info
|
78 |
-
foreach( $get_intermediate_image_sizes as $_size ) {
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
$height = max( $height, $_size_height );
|
97 |
-
}
|
98 |
}
|
99 |
-
|
100 |
-
|
101 |
-
'
|
|
|
102 |
);
|
103 |
}
|
104 |
|
@@ -107,30 +114,38 @@ function get_imagify_max_intermediate_image_size() {
|
|
107 |
*
|
108 |
* @since 1.0
|
109 |
*
|
|
|
|
|
110 |
* @return void
|
111 |
*/
|
112 |
function imagify_renew_notice( $notice, $user_id = 0 ) {
|
113 |
-
|
114 |
-
$user_id = ( 0 === $user_id ) ? $current_user->ID : $user_id;
|
115 |
$notices = get_user_meta( $user_id, '_imagify_ignore_notices', true );
|
|
|
116 |
|
117 |
-
if(
|
118 |
-
|
119 |
-
update_user_meta( $user_id, '_imagify_ignore_notices', $notices );
|
120 |
}
|
|
|
|
|
|
|
|
|
|
|
121 |
}
|
122 |
|
123 |
/**
|
124 |
-
*
|
125 |
*
|
126 |
* @since 1.0
|
127 |
*
|
|
|
|
|
128 |
* @return void
|
129 |
*/
|
130 |
function imagify_dismiss_notice( $notice, $user_id = 0 ) {
|
131 |
-
|
132 |
-
$user_id = ( 0 === $user_id ) ? $current_user->ID : $user_id;
|
133 |
$notices = get_user_meta( $user_id, '_imagify_ignore_notices', true );
|
|
|
134 |
$notices[] = $notice;
|
135 |
$notices = array_filter( $notices );
|
136 |
$notices = array_unique( $notices );
|
@@ -138,28 +153,52 @@ function imagify_dismiss_notice( $notice, $user_id = 0 ) {
|
|
138 |
update_user_meta( $user_id, '_imagify_ignore_notices', $notices );
|
139 |
}
|
140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
141 |
/**
|
142 |
* Combine two arrays with some specific keys.
|
143 |
* We use this function to combine the result of 2 SQL queries.
|
144 |
*
|
145 |
* @since 1.4.5
|
146 |
*
|
147 |
-
* @
|
|
|
|
|
148 |
*/
|
149 |
function imagify_query_results_combine( $keys, $values ) {
|
150 |
-
if ( ! $values ) {
|
151 |
return array();
|
152 |
}
|
153 |
-
|
154 |
$result = array();
|
155 |
$keys = array_flip( $keys );
|
156 |
-
|
157 |
foreach ( $values as $v ) {
|
158 |
if ( isset( $keys[ $v['id'] ] ) ) {
|
159 |
$result[ $v['id'] ] = $v['value'];
|
160 |
}
|
161 |
}
|
162 |
-
|
163 |
return $result;
|
164 |
}
|
165 |
|
@@ -169,22 +208,22 @@ function imagify_query_results_combine( $keys, $values ) {
|
|
169 |
* @since 1.5.10
|
170 |
* @author Jonathan Buttigieg
|
171 |
*
|
172 |
-
* @return int The buffer size
|
173 |
*/
|
174 |
function get_imagify_bulk_buffer_size() {
|
175 |
$sizes = count( get_imagify_thumbnail_sizes() );
|
176 |
-
|
177 |
switch ( true ) {
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
}
|
190 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
* Check if Imagify is activated on the network.
|
9 |
* return bool True if Imagify is activated on the network
|
10 |
*/
|
11 |
function imagify_is_active_for_network() {
|
12 |
+
static $is;
|
13 |
+
|
14 |
+
if ( isset( $is ) ) {
|
15 |
+
return $is;
|
16 |
+
}
|
17 |
+
|
18 |
+
if ( ! is_multisite() ) {
|
19 |
+
$is = false;
|
20 |
+
return $is;
|
21 |
+
}
|
22 |
+
|
23 |
+
if ( ! function_exists( 'is_plugin_active_for_network' ) ) {
|
24 |
+
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
|
25 |
+
}
|
26 |
+
|
27 |
+
$is = is_plugin_active_for_network( plugin_basename( IMAGIFY_FILE ) );
|
28 |
+
|
29 |
+
return $is;
|
30 |
}
|
31 |
|
32 |
+
/**
|
33 |
* Get the URL related to specific admin page or action.
|
34 |
*
|
35 |
* @since 1.0
|
36 |
*
|
37 |
+
* @param string $action An action.
|
38 |
+
* @param array $arg An array of arguments. It can contain an attachment ID and/or a context.
|
39 |
+
* @return string The URL of the specific admin page or action.
|
40 |
*/
|
41 |
function get_imagify_admin_url( $action = 'options-general', $arg = array() ) {
|
42 |
$url = '';
|
43 |
+
$id = isset( $arg['attachment_id'] ) ? $arg['attachment_id'] : 0;
|
44 |
+
$context = isset( $arg['context'] ) ? $arg['context'] : 'wp';
|
45 |
|
46 |
+
switch ( $action ) {
|
47 |
case 'manual-override-upload':
|
48 |
$level = ( isset( $arg['optimization_level'] ) ) ? $arg['optimization_level'] : 0;
|
49 |
+
return wp_nonce_url( admin_url( 'admin-post.php?action=imagify_manual_override_upload&attachment_id=' . $id . '&optimization_level=' . $level . '&context=' . $context ), 'imagify-manual-override-upload' );
|
|
|
50 |
|
51 |
case 'manual-upload':
|
52 |
+
return wp_nonce_url( admin_url( 'admin-post.php?action=imagify_manual_upload&attachment_id=' . $id . '&context=' . $context ), 'imagify-manual-upload' );
|
|
|
53 |
|
54 |
case 'restore-upload' :
|
55 |
+
return wp_nonce_url( admin_url( 'admin-post.php?action=imagify_restore_upload&attachment_id=' . $id . '&context=' . $context ), 'imagify-restore-upload' );
|
|
|
56 |
|
57 |
case 'dismiss-notice':
|
58 |
+
return wp_nonce_url( admin_url( 'admin-post.php?action=imagify_dismiss_notice¬ice=' . $arg ), 'imagify-dismiss-notice' );
|
|
|
59 |
|
60 |
case 'bulk-optimization':
|
61 |
+
return admin_url( 'upload.php?page=' . IMAGIFY_SLUG . '-bulk-optimization' );
|
|
|
62 |
|
|
|
63 |
default :
|
64 |
$page = imagify_is_active_for_network() ? network_admin_url( 'settings.php' ) : admin_url( 'options-general.php' );
|
65 |
+
return $page . '?page=' . IMAGIFY_SLUG;
|
|
|
66 |
}
|
|
|
|
|
67 |
}
|
68 |
|
69 |
+
/**
|
70 |
* Get maximal width and height from all thumbnails.
|
71 |
*
|
72 |
* @since 1.1
|
73 |
*
|
74 |
+
* @return array An array containing the max width and height.
|
75 |
*/
|
76 |
function get_imagify_max_intermediate_image_size() {
|
77 |
global $_wp_additional_image_sizes;
|
78 |
+
|
79 |
$width = 0;
|
80 |
$height = 0;
|
81 |
+
$limit = 9999;
|
82 |
+
$sizes = array( 'thumbnail' => 1, 'medium' => 1, 'large' => 1 );
|
83 |
$get_intermediate_image_sizes = get_intermediate_image_sizes();
|
84 |
+
|
85 |
+
// Create the full array with sizes and crop info.
|
86 |
+
foreach ( $get_intermediate_image_sizes as $_size ) {
|
87 |
+
if ( isset( $sizes[ $_size ] ) ) {
|
88 |
+
$_size_width = get_option( $_size . '_size_w' );
|
89 |
+
$_size_height = get_option( $_size . '_size_h' );
|
90 |
+
} elseif ( isset( $_wp_additional_image_sizes[ $_size ] ) ) {
|
91 |
+
$_size_width = $_wp_additional_image_sizes[ $_size ]['width'];
|
92 |
+
$_size_height = $_wp_additional_image_sizes[ $_size ]['height'];
|
93 |
+
} else {
|
94 |
+
continue;
|
95 |
+
}
|
96 |
+
|
97 |
+
if ( $_size_width < $limit ) {
|
98 |
+
$width = max( $width, $_size_width );
|
99 |
+
}
|
100 |
+
|
101 |
+
if ( $_size_height < $limit ) {
|
102 |
+
$height = max( $height, $_size_height );
|
103 |
+
}
|
|
|
|
|
104 |
}
|
105 |
+
|
106 |
+
return array(
|
107 |
+
'width' => $width,
|
108 |
+
'height' => $height,
|
109 |
);
|
110 |
}
|
111 |
|
114 |
*
|
115 |
* @since 1.0
|
116 |
*
|
117 |
+
* @param string $notice A notice ID.
|
118 |
+
* @param int $user_id A user ID.
|
119 |
* @return void
|
120 |
*/
|
121 |
function imagify_renew_notice( $notice, $user_id = 0 ) {
|
122 |
+
$user_id = $user_id ? (int) $user_id : get_current_user_id();
|
|
|
123 |
$notices = get_user_meta( $user_id, '_imagify_ignore_notices', true );
|
124 |
+
$notices = $notices && is_array( $notices ) ? array_flip( $notices ) : array();
|
125 |
|
126 |
+
if ( ! isset( $notices[ $notice ] ) ) {
|
127 |
+
return;
|
|
|
128 |
}
|
129 |
+
|
130 |
+
unset( $notices[ $notice ] );
|
131 |
+
$notices = array_flip( $notices );
|
132 |
+
$notices = array_values( $notices );
|
133 |
+
update_user_meta( $user_id, '_imagify_ignore_notices', $notices );
|
134 |
}
|
135 |
|
136 |
/**
|
137 |
+
* Dismiss an Imagify notice.
|
138 |
*
|
139 |
* @since 1.0
|
140 |
*
|
141 |
+
* @param string $notice A notice ID.
|
142 |
+
* @param int $user_id A user ID.
|
143 |
* @return void
|
144 |
*/
|
145 |
function imagify_dismiss_notice( $notice, $user_id = 0 ) {
|
146 |
+
$user_id = $user_id ? (int) $user_id : get_current_user_id();
|
|
|
147 |
$notices = get_user_meta( $user_id, '_imagify_ignore_notices', true );
|
148 |
+
$notices = is_array( $notices ) ? $notices : array();
|
149 |
$notices[] = $notice;
|
150 |
$notices = array_filter( $notices );
|
151 |
$notices = array_unique( $notices );
|
153 |
update_user_meta( $user_id, '_imagify_ignore_notices', $notices );
|
154 |
}
|
155 |
|
156 |
+
/**
|
157 |
+
* Tell if an Imagify notice is dismissed.
|
158 |
+
*
|
159 |
+
* @since 1.6.5
|
160 |
+
* @author Grégory Viguier
|
161 |
+
*
|
162 |
+
* @param string $notice A notice ID.
|
163 |
+
* @param int $user_id A user ID.
|
164 |
+
* @return bool
|
165 |
+
*/
|
166 |
+
function imagify_notice_is_dismissed( $notice, $user_id = 0 ) {
|
167 |
+
$user_id = $user_id ? (int) $user_id : get_current_user_id();
|
168 |
+
$notices = get_user_meta( $user_id, '_imagify_ignore_notices', true );
|
169 |
+
|
170 |
+
if ( ! $notices || ! is_array( $notices ) ) {
|
171 |
+
return false;
|
172 |
+
}
|
173 |
+
|
174 |
+
$notices = array_flip( $notices );
|
175 |
+
return isset( $notices[ $notice ] );
|
176 |
+
}
|
177 |
+
|
178 |
/**
|
179 |
* Combine two arrays with some specific keys.
|
180 |
* We use this function to combine the result of 2 SQL queries.
|
181 |
*
|
182 |
* @since 1.4.5
|
183 |
*
|
184 |
+
* @param array $keys An array of keys.
|
185 |
+
* @param array $values An array of arrays like array( 'id' => id, 'value' => value ).
|
186 |
+
* @return array $result The combined arrays.
|
187 |
*/
|
188 |
function imagify_query_results_combine( $keys, $values ) {
|
189 |
+
if ( ! $keys || ! $values ) {
|
190 |
return array();
|
191 |
}
|
192 |
+
|
193 |
$result = array();
|
194 |
$keys = array_flip( $keys );
|
195 |
+
|
196 |
foreach ( $values as $v ) {
|
197 |
if ( isset( $keys[ $v['id'] ] ) ) {
|
198 |
$result[ $v['id'] ] = $v['value'];
|
199 |
}
|
200 |
}
|
201 |
+
|
202 |
return $result;
|
203 |
}
|
204 |
|
208 |
* @since 1.5.10
|
209 |
* @author Jonathan Buttigieg
|
210 |
*
|
211 |
+
* @return int The buffer size.
|
212 |
*/
|
213 |
function get_imagify_bulk_buffer_size() {
|
214 |
$sizes = count( get_imagify_thumbnail_sizes() );
|
215 |
+
|
216 |
switch ( true ) {
|
217 |
+
case ( $sizes >= 10 ) :
|
218 |
+
return 1;
|
219 |
+
|
220 |
+
case ( $sizes >= 8 ) :
|
221 |
+
return 2;
|
222 |
+
|
223 |
+
case ( $sizes >= 6 ) :
|
224 |
+
return 3;
|
225 |
+
|
226 |
+
default:
|
227 |
+
return 4;
|
228 |
}
|
229 |
+
}
|
inc/functions/api.php
CHANGED
@@ -1,28 +1,26 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
* Check if external requests are blocked for Imagify.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*
|
9 |
-
* return bool True if Imagify API can't be called
|
10 |
*/
|
11 |
function is_imagify_blocked() {
|
12 |
if ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL ) {
|
13 |
return false;
|
14 |
}
|
15 |
-
|
16 |
-
if ( defined( 'WP_ACCESSIBLE_HOSTS' ) ) {
|
17 |
-
|
18 |
-
$accessible_hosts = array_map( 'trim', $accessible_hosts );
|
19 |
-
|
20 |
-
if ( in_array( '*.imagify.io', $accessible_hosts ) ) {
|
21 |
-
return false;
|
22 |
-
}
|
23 |
}
|
24 |
-
|
25 |
-
|
|
|
|
|
|
|
26 |
}
|
27 |
|
28 |
/**
|
@@ -33,29 +31,29 @@ function is_imagify_blocked() {
|
|
33 |
* @return bool True if the Imagify API is available.
|
34 |
*/
|
35 |
function is_imagify_servers_up() {
|
36 |
-
static $imagify_api_version
|
37 |
-
|
38 |
-
if (
|
39 |
return $imagify_api_version;
|
40 |
}
|
41 |
-
|
42 |
$transient_name = 'imagify_check_api_version';
|
43 |
$transient_expiration = 3 * MINUTE_IN_SECONDS;
|
44 |
-
|
45 |
if ( get_site_transient( $transient_name ) ) {
|
46 |
$imagify_api_version = true;
|
47 |
-
return
|
48 |
}
|
49 |
-
|
50 |
if ( is_wp_error( get_imagify_api_version() ) ) {
|
51 |
-
$imagify_api_version = false;
|
52 |
set_site_transient( $transient_name, 0, $transient_expiration );
|
53 |
-
|
54 |
-
|
|
|
55 |
}
|
56 |
-
|
57 |
-
$imagify_api_version = true;
|
58 |
set_site_transient( $transient_name, 1, $transient_expiration );
|
59 |
-
|
60 |
-
|
61 |
-
|
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
* Check if external requests are blocked for Imagify.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*
|
9 |
+
* return bool True if Imagify API can't be called.
|
10 |
*/
|
11 |
function is_imagify_blocked() {
|
12 |
if ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL ) {
|
13 |
return false;
|
14 |
}
|
15 |
+
|
16 |
+
if ( ! defined( 'WP_ACCESSIBLE_HOSTS' ) ) {
|
17 |
+
return true;
|
|
|
|
|
|
|
|
|
|
|
18 |
}
|
19 |
+
|
20 |
+
$accessible_hosts = explode( ',', WP_ACCESSIBLE_HOSTS );
|
21 |
+
$accessible_hosts = array_map( 'trim', $accessible_hosts );
|
22 |
+
|
23 |
+
return ! in_array( '*.imagify.io', $accessible_hosts, true );
|
24 |
}
|
25 |
|
26 |
/**
|
31 |
* @return bool True if the Imagify API is available.
|
32 |
*/
|
33 |
function is_imagify_servers_up() {
|
34 |
+
static $imagify_api_version;
|
35 |
+
|
36 |
+
if ( isset( $imagify_api_version ) ) {
|
37 |
return $imagify_api_version;
|
38 |
}
|
39 |
+
|
40 |
$transient_name = 'imagify_check_api_version';
|
41 |
$transient_expiration = 3 * MINUTE_IN_SECONDS;
|
42 |
+
|
43 |
if ( get_site_transient( $transient_name ) ) {
|
44 |
$imagify_api_version = true;
|
45 |
+
return $imagify_api_version;
|
46 |
}
|
47 |
+
|
48 |
if ( is_wp_error( get_imagify_api_version() ) ) {
|
|
|
49 |
set_site_transient( $transient_name, 0, $transient_expiration );
|
50 |
+
|
51 |
+
$imagify_api_version = false;
|
52 |
+
return $imagify_api_version;
|
53 |
}
|
54 |
+
|
|
|
55 |
set_site_transient( $transient_name, 1, $transient_expiration );
|
56 |
+
|
57 |
+
$imagify_api_version = true;
|
58 |
+
return $imagify_api_version;
|
59 |
+
}
|
inc/functions/attachments.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
-
|
5 |
* Get all mime type which could be optimized by Imagify.
|
6 |
*
|
7 |
* @since 1.3
|
@@ -9,91 +9,91 @@ defined( 'ABSPATH' ) or die( 'Cheatin\' uh?' );
|
|
9 |
* @return array $mime_type The mime type.
|
10 |
*/
|
11 |
function get_imagify_mime_type() {
|
12 |
-
|
13 |
-
'image/jpeg',
|
14 |
-
'image/png',
|
15 |
-
'image/gif'
|
16 |
);
|
17 |
-
|
18 |
-
return $mime_type;
|
19 |
}
|
20 |
|
21 |
-
|
22 |
* Get the backup path of a specific attachement.
|
23 |
*
|
24 |
* @since 1.0
|
25 |
*
|
26 |
-
* @param int
|
27 |
-
* @return string
|
28 |
*/
|
29 |
function get_imagify_attachment_backup_path( $file_path ) {
|
30 |
-
$upload_dir
|
31 |
-
$upload_basedir
|
32 |
-
$backup_dir
|
33 |
-
|
34 |
/**
|
35 |
-
* Filter the backup directory path
|
36 |
*
|
37 |
* @since 1.0
|
38 |
*
|
39 |
-
* @param string $backup_dir The backup directory path
|
40 |
*/
|
41 |
-
$backup_dir
|
42 |
-
$backup_dir
|
43 |
-
|
44 |
-
|
45 |
-
return $backup_path;
|
46 |
}
|
47 |
|
48 |
-
|
49 |
* Retrieve file path for an attachment based on filename.
|
50 |
*
|
51 |
* @since 1.4.5
|
52 |
*
|
53 |
-
* @param int
|
54 |
-
* @return string|false
|
55 |
*/
|
56 |
-
function get_imagify_attached_file( $filename ) {
|
57 |
-
$file_path = false;
|
58 |
-
|
59 |
// If the file is relative, prepend upload dir.
|
60 |
-
if ( $filename && 0 !== strpos( $filename, '/' ) && ! preg_match( '|^.:\\\|', $filename )
|
61 |
-
$
|
|
|
|
|
|
|
|
|
62 |
}
|
63 |
-
|
64 |
-
return
|
65 |
}
|
66 |
|
67 |
-
|
68 |
* Retrieve the URL for an attachment based on filename.
|
69 |
*
|
70 |
* @since 1.4.5
|
71 |
*
|
72 |
-
* @param int
|
73 |
-
* @return string|
|
74 |
*/
|
75 |
-
function get_imagify_attachment_url( $filename ) {
|
76 |
-
$
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
$url = trailingslashit( $uploads['baseurl'] . '/' . _wp_get_attachment_relative_path( $filename ) ) . basename( $filename );
|
87 |
-
} else {
|
88 |
-
// It's a newly-uploaded file, therefore $file is relative to the basedir.
|
89 |
-
$url = $uploads['baseurl'] . "/$filename";
|
90 |
-
}
|
91 |
}
|
92 |
-
|
93 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
94 |
}
|
95 |
|
96 |
-
|
97 |
* Get size information for all currently-registered thumbnail sizes.
|
98 |
*
|
99 |
* @since 1.5.10
|
@@ -103,18 +103,21 @@ function get_imagify_attachment_url( $filename ) {
|
|
103 |
*/
|
104 |
function get_imagify_thumbnail_sizes() {
|
105 |
global $_wp_additional_image_sizes, $wp_version;
|
106 |
-
|
107 |
-
$sizes
|
108 |
-
$is_wp44 = version_compare( $wp_version, '4.4-beta3' ) >= 0;
|
109 |
$all_intermediate_image_sizes = get_intermediate_image_sizes();
|
110 |
$intermediate_image_sizes = apply_filters( 'image_size_names_choose', $all_intermediate_image_sizes );
|
111 |
$all_intermediate_image_sizes = array_combine( $all_intermediate_image_sizes, $all_intermediate_image_sizes );
|
112 |
$intermediate_image_sizes = array_merge( $all_intermediate_image_sizes, $intermediate_image_sizes );
|
113 |
-
$wp_image_sizes =
|
114 |
|
115 |
-
|
|
|
|
|
|
|
|
|
116 |
foreach ( $intermediate_image_sizes as $size => $size_name ) {
|
117 |
-
if (
|
118 |
$sizes[ $size ] = array(
|
119 |
'width' => get_option( $size . '_size_w' ),
|
120 |
'height' => get_option( $size . '_size_h' ),
|
@@ -128,6 +131,6 @@ function get_imagify_thumbnail_sizes() {
|
|
128 |
);
|
129 |
}
|
130 |
}
|
131 |
-
|
132 |
return $sizes;
|
133 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
+
/**
|
5 |
* Get all mime type which could be optimized by Imagify.
|
6 |
*
|
7 |
* @since 1.3
|
9 |
* @return array $mime_type The mime type.
|
10 |
*/
|
11 |
function get_imagify_mime_type() {
|
12 |
+
return array(
|
13 |
+
'image/jpeg',
|
14 |
+
'image/png',
|
15 |
+
'image/gif',
|
16 |
);
|
|
|
|
|
17 |
}
|
18 |
|
19 |
+
/**
|
20 |
* Get the backup path of a specific attachement.
|
21 |
*
|
22 |
* @since 1.0
|
23 |
*
|
24 |
+
* @param int $file_path The attachment path.
|
25 |
+
* @return string The backup path.
|
26 |
*/
|
27 |
function get_imagify_attachment_backup_path( $file_path ) {
|
28 |
+
$upload_dir = wp_upload_dir();
|
29 |
+
$upload_basedir = trailingslashit( $upload_dir['basedir'] );
|
30 |
+
$backup_dir = $upload_basedir . 'backup/';
|
31 |
+
|
32 |
/**
|
33 |
+
* Filter the backup directory path.
|
34 |
*
|
35 |
* @since 1.0
|
36 |
*
|
37 |
+
* @param string $backup_dir The backup directory path.
|
38 |
*/
|
39 |
+
$backup_dir = apply_filters( 'imagify_backup_directory', $backup_dir );
|
40 |
+
$backup_dir = trailingslashit( $backup_dir );
|
41 |
+
|
42 |
+
return str_replace( $upload_basedir, $backup_dir, $file_path );
|
|
|
43 |
}
|
44 |
|
45 |
+
/**
|
46 |
* Retrieve file path for an attachment based on filename.
|
47 |
*
|
48 |
* @since 1.4.5
|
49 |
*
|
50 |
+
* @param int $filename The filename.
|
51 |
+
* @return string|false The file path to where the attached file should be, false otherwise.
|
52 |
*/
|
53 |
+
function get_imagify_attached_file( $filename ) {
|
|
|
|
|
54 |
// If the file is relative, prepend upload dir.
|
55 |
+
if ( $filename && 0 !== strpos( $filename, '/' ) && ! preg_match( '|^.:\\\|', $filename ) ) {
|
56 |
+
$uploads = wp_upload_dir();
|
57 |
+
|
58 |
+
if ( false === $uploads['error'] ) {
|
59 |
+
return $uploads['basedir'] . "/$filename";
|
60 |
+
}
|
61 |
}
|
62 |
+
|
63 |
+
return false;
|
64 |
}
|
65 |
|
66 |
+
/**
|
67 |
* Retrieve the URL for an attachment based on filename.
|
68 |
*
|
69 |
* @since 1.4.5
|
70 |
*
|
71 |
+
* @param int $filename The filename.
|
72 |
+
* @return string|bool Attachment URL, otherwise false.
|
73 |
*/
|
74 |
+
function get_imagify_attachment_url( $filename ) {
|
75 |
+
$uploads = wp_upload_dir();
|
76 |
+
|
77 |
+
if ( false !== $uploads['error'] ) {
|
78 |
+
return '';
|
79 |
+
}
|
80 |
+
|
81 |
+
// Check that the upload base exists in the file location.
|
82 |
+
if ( 0 === strpos( $filename, $uploads['basedir'] ) ) {
|
83 |
+
// Replace file location with url location.
|
84 |
+
return str_replace( $uploads['basedir'], $uploads['baseurl'], $filename );
|
|
|
|
|
|
|
|
|
|
|
85 |
}
|
86 |
+
|
87 |
+
if ( false !== strpos( $filename, 'wp-content/uploads' ) ) {
|
88 |
+
// Get the directory name relative to the basedir (back compat for pre-2.7 uploads).
|
89 |
+
return trailingslashit( $uploads['baseurl'] . '/' . _wp_get_attachment_relative_path( $filename ) ) . basename( $filename );
|
90 |
+
}
|
91 |
+
|
92 |
+
// It's a newly-uploaded file, therefore $file is relative to the basedir.
|
93 |
+
return $uploads['baseurl'] . "/$filename";
|
94 |
}
|
95 |
|
96 |
+
/**
|
97 |
* Get size information for all currently-registered thumbnail sizes.
|
98 |
*
|
99 |
* @since 1.5.10
|
103 |
*/
|
104 |
function get_imagify_thumbnail_sizes() {
|
105 |
global $_wp_additional_image_sizes, $wp_version;
|
106 |
+
|
107 |
+
$sizes = array();
|
|
|
108 |
$all_intermediate_image_sizes = get_intermediate_image_sizes();
|
109 |
$intermediate_image_sizes = apply_filters( 'image_size_names_choose', $all_intermediate_image_sizes );
|
110 |
$all_intermediate_image_sizes = array_combine( $all_intermediate_image_sizes, $all_intermediate_image_sizes );
|
111 |
$intermediate_image_sizes = array_merge( $all_intermediate_image_sizes, $intermediate_image_sizes );
|
112 |
+
$wp_image_sizes = array( 'thumbnail' => 1, 'medium' => 1, 'large' => 1 );
|
113 |
|
114 |
+
if ( version_compare( $wp_version, '4.4-beta3' ) >= 0 ) {
|
115 |
+
$wp_image_sizes['medium_large'] = 1;
|
116 |
+
}
|
117 |
+
|
118 |
+
// Create the full array with sizes and crop info.
|
119 |
foreach ( $intermediate_image_sizes as $size => $size_name ) {
|
120 |
+
if ( isset( $wp_image_sizes[ $size ] ) && ! is_int( $size ) ) {
|
121 |
$sizes[ $size ] = array(
|
122 |
'width' => get_option( $size . '_size_w' ),
|
123 |
'height' => get_option( $size . '_size_h' ),
|
131 |
);
|
132 |
}
|
133 |
}
|
134 |
+
|
135 |
return $sizes;
|
136 |
+
}
|
inc/functions/common.php
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Get user capacity to operate Imagify.
|
6 |
+
*
|
7 |
+
* @since 1.6.5
|
8 |
+
* @author Grégory Viguier
|
9 |
+
*
|
10 |
+
* @param bool $force_mono Force capacity for mono-site.
|
11 |
+
* @return string
|
12 |
+
*/
|
13 |
+
function imagify_get_capacity( $force_mono = false ) {
|
14 |
+
if ( $force_mono || ! is_multisite() ) {
|
15 |
+
$capacity = 'manage_options';
|
16 |
+
} else {
|
17 |
+
$capacity = imagify_is_active_for_network() ? 'manage_network_options' : 'manage_options';
|
18 |
+
}
|
19 |
+
|
20 |
+
/**
|
21 |
+
* Filter the user capacity used to operate Imagify.
|
22 |
+
*
|
23 |
+
* @since 1.0
|
24 |
+
* @since 1.6.5 Added $force_mono parameter.
|
25 |
+
*
|
26 |
+
* @param string $capacity The user capacity.
|
27 |
+
* @param bool $force_mono Force capacity for mono-site.
|
28 |
+
*/
|
29 |
+
return apply_filters( 'imagify_capacity', $capacity, $force_mono );
|
30 |
+
}
|
inc/functions/deprecated.php
ADDED
@@ -0,0 +1,185 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Deprecated imagify.io API for WordPress.
|
6 |
+
*
|
7 |
+
* @since 1.6.5
|
8 |
+
*/
|
9 |
+
class Imagify_Deprecated {
|
10 |
+
|
11 |
+
/**
|
12 |
+
* A shorthand to display a message about a deprecated method.
|
13 |
+
*
|
14 |
+
* @since 1.6.5
|
15 |
+
* @author Grégory Viguier
|
16 |
+
*
|
17 |
+
* @param string $method_name The deprecated method.
|
18 |
+
*/
|
19 |
+
protected function deprecated_camelcased_method( $method_name ) {
|
20 |
+
$class_name = get_class( $this );
|
21 |
+
$new_method_name = preg_replace( '/[A-Z]/', '_$0', $method_name );
|
22 |
+
_deprecated_function( $class_name . '::' . $method_name . '()', '1.6.5', $class_name . '::' . $new_method_name . '()' );
|
23 |
+
}
|
24 |
+
|
25 |
+
/**
|
26 |
+
* Main Instance.
|
27 |
+
* Ensures only one instance of class is loaded or can be loaded.
|
28 |
+
* Well, actually it ensures nothing since it's not a full singleton pattern.
|
29 |
+
*
|
30 |
+
* @return object Main instance.
|
31 |
+
*/
|
32 |
+
public static function instance() {
|
33 |
+
$class_name = get_class( $this );
|
34 |
+
_deprecated_function( $class_name . '::' . __FUNCTION__ . '()', '1.6.5', 'imagify()' );
|
35 |
+
return Imagify::get_instance();
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Get your Imagify account infos.
|
40 |
+
*
|
41 |
+
* @return object
|
42 |
+
*/
|
43 |
+
public function getUser() {
|
44 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
45 |
+
return $this->get_user();
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Create a user on your Imagify account.
|
50 |
+
*
|
51 |
+
* @param array $data All user data. Details here: --.
|
52 |
+
* @return object
|
53 |
+
*/
|
54 |
+
public function createUser( $data ) {
|
55 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
56 |
+
return $this->create_user( $data );
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Update an existing user on your Imagify account.
|
61 |
+
*
|
62 |
+
* @param string $data All user data. Details here: --.
|
63 |
+
* @return object
|
64 |
+
*/
|
65 |
+
public function updateUser( $data ) {
|
66 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
67 |
+
return $this->update_user( $data );
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Check your Imagify API key status.
|
72 |
+
*
|
73 |
+
* @param string $data The license key.
|
74 |
+
* @return object
|
75 |
+
*/
|
76 |
+
public function getStatus( $data ) {
|
77 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
78 |
+
return $this->get_status( $data );
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Get the Imagify API version.
|
83 |
+
*
|
84 |
+
* @return object
|
85 |
+
*/
|
86 |
+
public function getApiVersion() {
|
87 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
88 |
+
return $this->get_api_version();
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Get Public Info.
|
93 |
+
*
|
94 |
+
* @return object
|
95 |
+
*/
|
96 |
+
public function getPublicInfo() {
|
97 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
98 |
+
return $this->get_public_info();
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Optimize an image from its binary content.
|
103 |
+
*
|
104 |
+
* @param string $data All options. Details here: --.
|
105 |
+
* @return object
|
106 |
+
*/
|
107 |
+
public function uploadImage( $data ) {
|
108 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
109 |
+
return $this->upload_image( $data );
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Optimize an image from its URL.
|
114 |
+
*
|
115 |
+
* @param string $data All options. Details here: --.
|
116 |
+
* @return object
|
117 |
+
*/
|
118 |
+
public function fetchImage( $data ) {
|
119 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
120 |
+
return $this->fetch_image( $data );
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Get prices for plans.
|
125 |
+
*
|
126 |
+
* @return object
|
127 |
+
*/
|
128 |
+
public function getPlansPrices() {
|
129 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
130 |
+
return $this->get_plans_prices();
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Get prices for packs (one time).
|
135 |
+
*
|
136 |
+
* @return object
|
137 |
+
*/
|
138 |
+
public function getPacksPrices() {
|
139 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
140 |
+
return $this->get_packs_prices();
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Get all prices (packs & plans included).
|
145 |
+
*
|
146 |
+
* @return object
|
147 |
+
*/
|
148 |
+
public function getAllPrices() {
|
149 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
150 |
+
return $this->get_all_prices();
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Get all prices (packs & plans included).
|
155 |
+
*
|
156 |
+
* @param string $coupon A coupon code.
|
157 |
+
* @return object
|
158 |
+
*/
|
159 |
+
public function checkCouponCode( $coupon ) {
|
160 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
161 |
+
return $this->check_coupon_code( $coupon );
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Get information about current discount.
|
166 |
+
*
|
167 |
+
* @return object
|
168 |
+
*/
|
169 |
+
public function checkDiscount() {
|
170 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
171 |
+
return $this->check_discount();
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* Make an HTTP call using curl.
|
176 |
+
*
|
177 |
+
* @param string $url The URL to call.
|
178 |
+
* @param array $args The request args.
|
179 |
+
* @return object
|
180 |
+
*/
|
181 |
+
private function httpCall( $url, $args = array() ) {
|
182 |
+
$this->deprecated_camelcased_method( __FUNCTION__ );
|
183 |
+
return $this->http_call( $url, $args );
|
184 |
+
}
|
185 |
+
}
|
inc/functions/files.php
CHANGED
@@ -1,17 +1,47 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
*
|
6 |
*
|
7 |
-
* @since 1.
|
|
|
8 |
*
|
9 |
-
* @
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
if ( ! defined( 'FS_CHMOD_FILE' ) ) {
|
14 |
define( 'FS_CHMOD_FILE', ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 ) );
|
15 |
}
|
16 |
-
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* Get WP Direct filesystem object. Also define chmod constants if not done yet.
|
6 |
*
|
7 |
+
* @since 1.6.5
|
8 |
+
* @author Grégory Viguier
|
9 |
*
|
10 |
+
* @return object A `$wp_filesystem` object.
|
11 |
+
*/
|
12 |
+
function imagify_get_filesystem() {
|
13 |
+
static $filesystem;
|
14 |
+
|
15 |
+
if ( $filesystem ) {
|
16 |
+
return $filesystem;
|
17 |
+
}
|
18 |
+
|
19 |
+
require_once( ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php' );
|
20 |
+
require_once( ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php' );
|
21 |
+
|
22 |
+
$filesystem = new WP_Filesystem_Direct( new StdClass() );
|
23 |
+
|
24 |
+
// Set the permission constants if not already set.
|
25 |
+
if ( ! defined( 'FS_CHMOD_DIR' ) ) {
|
26 |
+
define( 'FS_CHMOD_DIR', ( fileperms( ABSPATH ) & 0777 | 0755 ) );
|
27 |
+
}
|
28 |
if ( ! defined( 'FS_CHMOD_FILE' ) ) {
|
29 |
define( 'FS_CHMOD_FILE', ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 ) );
|
30 |
}
|
31 |
+
|
32 |
+
return $filesystem;
|
33 |
+
}
|
34 |
+
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Set the default file permissions using FS_CHMOD_FILE from WP.
|
38 |
+
*
|
39 |
+
* @since 1.2
|
40 |
+
* @since 1.6.5 Use WP Filesystem.
|
41 |
+
*
|
42 |
+
* @param string $file The path to file.
|
43 |
+
* @return bool
|
44 |
+
*/
|
45 |
+
function imagify_chmod_file( $file ) {
|
46 |
+
return imagify_get_filesystem()->chmod( $file, FS_CHMOD_FILE );
|
47 |
+
}
|
inc/functions/formatting.php
CHANGED
@@ -1,47 +1,50 @@
|
|
1 |
-
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
* Round UP to nearest half integer
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @source http://stackoverflow.com/a/13526408
|
9 |
*
|
10 |
-
* @param int $number The number to round up
|
11 |
-
* @return
|
12 |
*/
|
13 |
function imagify_round_half_five( $number ) {
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
|
|
|
|
|
|
31 |
}
|
32 |
|
33 |
/**
|
34 |
-
* Get the Imagify attachment class name depending to a context
|
35 |
*
|
36 |
* @since 1.5
|
37 |
* @source Jonathan Buttigieg
|
38 |
*
|
39 |
-
* @param string $context The context to determine the class name
|
40 |
-
* @return string $class_name The Imagify attachment class name
|
41 |
*/
|
42 |
function get_imagify_attachment_class_name( $context = 'wp' ) {
|
43 |
$class_name = 'Imagify_';
|
44 |
$class_name .= 'wp' !== $context ? $context . '_Attachment' : 'Attachment';
|
45 |
-
|
46 |
return $class_name;
|
47 |
-
}
|
1 |
+
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* Round UP to nearest half integer.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
* @source http://stackoverflow.com/a/13526408
|
9 |
*
|
10 |
+
* @param int|float|string $number The number to round up.
|
11 |
+
* @return float The formatted number.
|
12 |
*/
|
13 |
function imagify_round_half_five( $number ) {
|
14 |
+
$number = strval( $number );
|
15 |
+
$number = explode( '.', $number );
|
16 |
+
|
17 |
+
if ( ! isset( $number[1] ) ) {
|
18 |
+
return $number[0];
|
19 |
+
}
|
20 |
+
|
21 |
+
$decimal = floatval( '0.' . substr( $number[1], 0 , 2 ) ); // Cut only 2 numbers.
|
22 |
+
|
23 |
+
if ( $decimal > 0 ) {
|
24 |
+
if ( $decimal <= 0.5 ) {
|
25 |
+
return floatval( $number[0] ) + 0.5;
|
26 |
+
}
|
27 |
+
if ( $decimal <= 0.99 ) {
|
28 |
+
return floatval( $number[0] ) + 1;
|
29 |
+
}
|
30 |
+
return 1;
|
31 |
+
}
|
32 |
+
|
33 |
+
return floatval( $number );
|
34 |
}
|
35 |
|
36 |
/**
|
37 |
+
* Get the Imagify attachment class name depending to a context.
|
38 |
*
|
39 |
* @since 1.5
|
40 |
* @source Jonathan Buttigieg
|
41 |
*
|
42 |
+
* @param string $context The context to determine the class name.
|
43 |
+
* @return string $class_name The Imagify attachment class name.
|
44 |
*/
|
45 |
function get_imagify_attachment_class_name( $context = 'wp' ) {
|
46 |
$class_name = 'Imagify_';
|
47 |
$class_name .= 'wp' !== $context ? $context . '_Attachment' : 'Attachment';
|
48 |
+
|
49 |
return $class_name;
|
50 |
+
}
|
inc/functions/i18n.php
CHANGED
@@ -1,111 +1,134 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
* Get all translations we can use with wp_localize_script()
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
*
|
10 |
-
* @param string
|
11 |
-
* @return array
|
12 |
*/
|
13 |
function get_imagify_localize_script_translations( $context ) {
|
14 |
$translations = array();
|
15 |
|
16 |
-
switch( $context ) {
|
17 |
case 'admin':
|
18 |
$translations = array(
|
19 |
'labels' => array(
|
20 |
-
|
21 |
-
'
|
22 |
-
'
|
23 |
-
'
|
24 |
-
'
|
25 |
-
|
26 |
-
'
|
27 |
-
'
|
28 |
-
|
29 |
-
'
|
30 |
-
|
31 |
-
'
|
32 |
-
'
|
33 |
-
'
|
34 |
-
'
|
35 |
-
'
|
36 |
-
'
|
37 |
-
'
|
38 |
-
|
|
|
|
|
|
|
|
|
39 |
);
|
40 |
-
|
41 |
|
42 |
case 'options':
|
43 |
$translations = array(
|
44 |
-
'noBackupTitle'
|
45 |
-
'noBackupText'
|
46 |
);
|
47 |
-
|
48 |
-
|
49 |
case 'upload':
|
50 |
$translations = array(
|
51 |
-
'bulkActionsLabels' => array(
|
52 |
'optimize' => __( 'Optimize', 'imagify' ),
|
53 |
'restore' => __( 'Restore Original', 'imagify' ),
|
54 |
),
|
55 |
);
|
56 |
-
|
57 |
-
|
58 |
case 'twentytwenty':
|
59 |
$translations = array(
|
60 |
'labels' => array(
|
61 |
-
'original_l'
|
62 |
-
'optimized_l'
|
63 |
-
'compare'
|
64 |
-
'close'
|
65 |
-
'filesize'
|
66 |
-
'saving'
|
67 |
-
'optimize'
|
68 |
-
)
|
69 |
);
|
70 |
-
|
71 |
-
|
72 |
case 'bulk':
|
73 |
-
$user
|
74 |
$translations = array(
|
75 |
'labels' => array(
|
76 |
-
'waitTitle'
|
77 |
-
'waitText'
|
78 |
-
'waitImageUrl'
|
79 |
-
'getUnoptimizedImagesErrorTitle'
|
80 |
-
'getUnoptimizedImagesErrorText'
|
81 |
-
'invalidAPIKeyTitle'
|
82 |
-
'overviewChartLabels'
|
83 |
'optimized' => __( 'Optimized', 'imagify' ),
|
84 |
'unoptimized' => __( 'Unoptimized', 'imagify' ),
|
85 |
'error' => __( 'Error', 'imagify' ),
|
86 |
),
|
87 |
-
'overQuotaTitle'
|
88 |
-
'noAttachmentToOptimizeTitle'
|
89 |
-
'noAttachmentToOptimizeText'
|
90 |
-
|
91 |
-
'
|
92 |
-
|
93 |
-
'
|
94 |
-
'
|
95 |
-
'
|
96 |
-
|
|
|
|
|
97 |
);
|
98 |
-
|
99 |
if ( imagify_valid_key() ) {
|
100 |
if ( is_wp_error( $user ) ) {
|
101 |
-
$translations['overQuotaText'] = sprintf(
|
|
|
|
|
|
|
|
|
|
|
102 |
}
|
103 |
else {
|
104 |
-
$translations['overQuotaText']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
}
|
106 |
}
|
107 |
-
|
108 |
-
}
|
109 |
|
110 |
return $translations;
|
111 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* Get all translations we can use with wp_localize_script().
|
6 |
*
|
7 |
* @since 1.5
|
8 |
* @author Jonathan Buttigieg
|
9 |
*
|
10 |
+
* @param string $context The translation context.
|
11 |
+
* @return array $translations The translations.
|
12 |
*/
|
13 |
function get_imagify_localize_script_translations( $context ) {
|
14 |
$translations = array();
|
15 |
|
16 |
+
switch ( $context ) {
|
17 |
case 'admin':
|
18 |
$translations = array(
|
19 |
'labels' => array(
|
20 |
+
/* translators: Don't use escaped HTML entities here (like ). */
|
21 |
+
'signupTitle' => __( 'Let\'s get you started!', 'imagify' ),
|
22 |
+
'signupText' => __( 'Enter your email to get an API key:', 'imagify' ),
|
23 |
+
'signupConfirmButtonText' => __( 'Sign Up', 'imagify' ),
|
24 |
+
'signupErrorEmptyEmail' => __( 'You need to specify an email!', 'imagify' ),
|
25 |
+
/* translators: Don't use escaped HTML entities here (like ). */
|
26 |
+
'signupSuccessTitle' => __( 'Congratulations!', 'imagify' ),
|
27 |
+
'signupSuccessText' => __( 'Your account has been succesfully created. Please check your mailbox, you are going to receive an email with API key.', 'imagify' ),
|
28 |
+
/* translators: Don't use escaped HTML entities here (like ). */
|
29 |
+
'saveApiKeyTitle' => __( 'Connect to Imagify!', 'imagify' ),
|
30 |
+
'saveApiKeyText' => __( 'Paste your API key below:', 'imagify' ),
|
31 |
+
'saveApiKeyConfirmButtonText' => __( 'Connect me', 'imagify' ),
|
32 |
+
'waitApiKeyCheckText' => __( 'Check in progress...', 'imagify' ),
|
33 |
+
'ApiKeyErrorEmpty' => __( 'You need to specify your api key!', 'imagify' ),
|
34 |
+
'ApiKeyCheckSuccessTitle' => __( 'Congratulations!', 'imagify' ),
|
35 |
+
'ApiKeyCheckSuccessText' => __( 'Your API key is valid. You can now configure the Imagify settings to optimize your images.', 'imagify' ),
|
36 |
+
'ValidApiKeyText' => __( 'Your API key is valid.', 'imagify' ),
|
37 |
+
'swalCancel' => __( 'Cancel' ),
|
38 |
+
'errorPriceAPI' => __( 'Something went wrong with getting our updated offers. Please retry later.', 'imagify' ),
|
39 |
+
'errorCouponAPI' => __( 'Error with checking this coupon.', 'imagify' ),
|
40 |
+
/* translators: 1 is a percentage, 2 is a coupon code. */
|
41 |
+
'successCouponAPI' => sprintf( _x( '%1$s off with %2$s', 'coupon validated', 'imagify' ), '<span class="imagify-coupon-offer"></span>', '<strong class="imagify-coupon-word"></strong>' ),
|
42 |
+
),
|
43 |
);
|
44 |
+
break;
|
45 |
|
46 |
case 'options':
|
47 |
$translations = array(
|
48 |
+
'noBackupTitle' => __( 'Don\'t Need a Parachute?', 'imagify' ),
|
49 |
+
'noBackupText' => __( 'If you keep this option deactivated, you won\'t be able to re-optimize your images to another compression level and restore your original images in case of need.', 'imagify' ),
|
50 |
);
|
51 |
+
break;
|
52 |
+
|
53 |
case 'upload':
|
54 |
$translations = array(
|
55 |
+
'bulkActionsLabels' => array(
|
56 |
'optimize' => __( 'Optimize', 'imagify' ),
|
57 |
'restore' => __( 'Restore Original', 'imagify' ),
|
58 |
),
|
59 |
);
|
60 |
+
break;
|
61 |
+
|
62 |
case 'twentytwenty':
|
63 |
$translations = array(
|
64 |
'labels' => array(
|
65 |
+
'original_l' => __( 'Original Image', 'imagify' ),
|
66 |
+
'optimized_l' => __( 'Optimized Image', 'imagify' ),
|
67 |
+
'compare' => __( 'Compare Original VS Optimized', 'imagify' ),
|
68 |
+
'close' => __( 'Close', 'imagify' ),
|
69 |
+
'filesize' => __( 'File Size:', 'imagify' ),
|
70 |
+
'saving' => __( 'Original Saving:', 'imagify' ),
|
71 |
+
'optimize' => __( 'Optimize', 'imagify' ),
|
72 |
+
),
|
73 |
);
|
74 |
+
break;
|
75 |
+
|
76 |
case 'bulk':
|
77 |
+
$user = get_imagify_user();
|
78 |
$translations = array(
|
79 |
'labels' => array(
|
80 |
+
'waitTitle' => __( 'Please wait...', 'imagify' ),
|
81 |
+
'waitText' => __( 'We are trying to get your unoptimized images, it may take time depending on the number of images.', 'imagify' ),
|
82 |
+
'waitImageUrl' => IMAGIFY_ASSETS_IMG_URL . 'popin-loader.svg',
|
83 |
+
'getUnoptimizedImagesErrorTitle' => __( 'Oops, There is something wrong!', 'imagify' ),
|
84 |
+
'getUnoptimizedImagesErrorText' => __( 'An unknown error occurred when we tried to get all your unoptimized images. Try again and if the issue still persists, please contact us!', 'imagify' ),
|
85 |
+
'invalidAPIKeyTitle' => __( 'Your API key isn\'t valid!', 'imagify' ),
|
86 |
+
'overviewChartLabels' => array(
|
87 |
'optimized' => __( 'Optimized', 'imagify' ),
|
88 |
'unoptimized' => __( 'Unoptimized', 'imagify' ),
|
89 |
'error' => __( 'Error', 'imagify' ),
|
90 |
),
|
91 |
+
'overQuotaTitle' => __( 'Oops, It\'s Over!', 'imagify' ),
|
92 |
+
'noAttachmentToOptimizeTitle' => __( 'Hold on!', 'imagify' ),
|
93 |
+
'noAttachmentToOptimizeText' => __( 'All your images have been optimized by Imagify. Congratulations!', 'imagify' ),
|
94 |
+
/* translators: Plugin URI of the plugin/theme */
|
95 |
+
'pluginURL' => __( 'https://wordpress.org/plugins/imagify/', 'imagify' ),
|
96 |
+
/* translators: 1 and 2 are file sizes. */
|
97 |
+
'textToShare' => __( 'Discover @imagify, the new compression tool to optimize your images for free. I saved %1$s out of %2$s!', 'imagify' ),
|
98 |
+
'totalOptimizedAttachments' => imagify_count_optimized_attachments(),
|
99 |
+
'totalUnoptimizedAttachments' => imagify_count_unoptimized_attachments(),
|
100 |
+
'totalErrorsAttachments' => imagify_count_error_attachments(),
|
101 |
+
'processing' => __( 'Imagify is still processing. Are you sure you want to leave this page?', 'imagify' ),
|
102 |
+
),
|
103 |
);
|
104 |
+
|
105 |
if ( imagify_valid_key() ) {
|
106 |
if ( is_wp_error( $user ) ) {
|
107 |
+
$translations['overQuotaText'] = sprintf(
|
108 |
+
/* translators: 1 is a link tag start, 2 is the link tag end. */
|
109 |
+
__( 'To continue to optimize your images, log in to your Imagify account to %1$sbuy a pack or subscribe to a plan%2$s.', 'imagify' ),
|
110 |
+
'<a href="' . IMAGIFY_APP_MAIN . '/#/subscription">',
|
111 |
+
'</a>'
|
112 |
+
);
|
113 |
}
|
114 |
else {
|
115 |
+
$translations['overQuotaText'] = sprintf(
|
116 |
+
/* translators: 1 is a data quota, 2 is a date. */
|
117 |
+
__( 'You have consumed all your credit for this month. You will have <strong>%1$s back on %2$s</strong>.', 'imagify' ),
|
118 |
+
size_format( $user->quota * 1048576 ),
|
119 |
+
date_i18n( __( 'F j, Y' ), strtotime( $user->next_date_update ) )
|
120 |
+
);
|
121 |
+
$translations['overQuotaText'] .= '<br/><br/>';
|
122 |
+
$translations['overQuotaText'] .= sprintf(
|
123 |
+
/* translators: 1 is a link tag start, 2 is the link tag end. */
|
124 |
+
__( 'To continue to optimize your images, log in to your Imagify account to %1$sbuy a pack or subscribe to a plan%2$s.', 'imagify' ),
|
125 |
+
'<a href="' . IMAGIFY_APP_MAIN . '/#/subscription">',
|
126 |
+
'</a>'
|
127 |
+
);
|
128 |
}
|
129 |
}
|
130 |
+
break;
|
131 |
+
} // End switch().
|
132 |
|
133 |
return $translations;
|
134 |
+
}
|
inc/functions/options.php
CHANGED
@@ -1,43 +1,50 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
-
* A wrapper to easily get imagify option
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*
|
9 |
-
* @param string $option The option name
|
10 |
-
* @param bool $default The default value of option
|
11 |
-
* @return mixed The option value
|
12 |
*/
|
13 |
function get_imagify_option( $option, $default = false ) {
|
|
|
14 |
/**
|
15 |
-
* Pre-filter any Imagify option before read
|
16 |
*
|
17 |
* @since 1.0
|
18 |
*
|
19 |
-
* @param
|
20 |
-
|
21 |
-
|
|
|
22 |
|
23 |
-
if (
|
24 |
return $value;
|
25 |
}
|
26 |
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
32 |
$value = IMAGIFY_API_KEY;
|
33 |
}
|
34 |
-
|
35 |
/**
|
36 |
-
* Filter any Imagify option after read
|
37 |
*
|
38 |
* @since 1.0
|
39 |
*
|
40 |
-
* @param
|
|
|
41 |
*/
|
42 |
return apply_filters( 'get_imagify_option_' . $option, $value, $default );
|
43 |
}
|
@@ -48,48 +55,48 @@ function get_imagify_option( $option, $default = false ) {
|
|
48 |
* @since 1.6
|
49 |
* @author Remy Perona
|
50 |
*
|
51 |
-
* @param string
|
52 |
-
* @param string
|
53 |
* @return void
|
54 |
*/
|
55 |
function update_imagify_option( $key, $value ) {
|
56 |
$options = get_option( IMAGIFY_SETTINGS_SLUG );
|
57 |
$options[ $key ] = $value;
|
58 |
-
|
59 |
update_option( IMAGIFY_SETTINGS_SLUG, $options );
|
60 |
}
|
61 |
|
62 |
/**
|
63 |
-
* Determine if the Imagify API key is valid
|
64 |
*
|
65 |
* @since 1.0
|
66 |
*
|
67 |
-
* @return bool True if the API key is valid
|
68 |
*/
|
69 |
function imagify_valid_key() {
|
70 |
-
static $imagify_valid_key
|
71 |
-
|
72 |
-
if (
|
73 |
return $imagify_valid_key;
|
74 |
}
|
75 |
-
|
76 |
if ( ! get_imagify_option( 'api_key', false ) ) {
|
77 |
$imagify_valid_key = false;
|
78 |
return false;
|
79 |
}
|
80 |
-
|
81 |
if ( get_site_transient( 'imagify_check_licence_1' ) ) {
|
82 |
$imagify_valid_key = true;
|
83 |
return true;
|
84 |
}
|
85 |
-
|
86 |
if ( is_wp_error( get_imagify_user() ) ) {
|
87 |
$imagify_valid_key = false;
|
88 |
return false;
|
89 |
}
|
90 |
-
|
91 |
$imagify_valid_key = true;
|
92 |
set_site_transient( 'imagify_check_licence_1', true, YEAR_IN_SECONDS );
|
93 |
-
|
94 |
return true;
|
95 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
+
* A wrapper to easily get imagify option.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*
|
9 |
+
* @param string $option The option name.
|
10 |
+
* @param bool $default The default value of option.
|
11 |
+
* @return mixed The option value.
|
12 |
*/
|
13 |
function get_imagify_option( $option, $default = false ) {
|
14 |
+
static $basename;
|
15 |
/**
|
16 |
+
* Pre-filter any Imagify option before read.
|
17 |
*
|
18 |
* @since 1.0
|
19 |
*
|
20 |
+
* @param mixed $value Value to return instead of the option value. Default null to skip it.
|
21 |
+
* @param mixed $default The default value. Default false.
|
22 |
+
*/
|
23 |
+
$value = apply_filters( 'pre_get_imagify_option_' . $option, null, $default );
|
24 |
|
25 |
+
if ( isset( $value ) ) {
|
26 |
return $value;
|
27 |
}
|
28 |
|
29 |
+
if ( ! isset( $basename ) ) {
|
30 |
+
$basename = plugin_basename( IMAGIFY_FILE );
|
31 |
+
}
|
32 |
+
|
33 |
+
$plugins = get_site_option( 'active_sitewide_plugins' );
|
34 |
+
$options = isset( $plugins[ $basename ] ) ? get_site_option( IMAGIFY_SETTINGS_SLUG ) : get_option( IMAGIFY_SETTINGS_SLUG );
|
35 |
+
$value = isset( $options[ $option ] ) && $default !== $options[ $option ] ? $options[ $option ] : $default;
|
36 |
+
|
37 |
+
if ( 'api_key' === $option && defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) {
|
38 |
$value = IMAGIFY_API_KEY;
|
39 |
}
|
40 |
+
|
41 |
/**
|
42 |
+
* Filter any Imagify option after read.
|
43 |
*
|
44 |
* @since 1.0
|
45 |
*
|
46 |
+
* @param mixed $value Value of the option.
|
47 |
+
* @param mixed $default The default value. Default false.
|
48 |
*/
|
49 |
return apply_filters( 'get_imagify_option_' . $option, $value, $default );
|
50 |
}
|
55 |
* @since 1.6
|
56 |
* @author Remy Perona
|
57 |
*
|
58 |
+
* @param string $key The option name.
|
59 |
+
* @param string $value The value of the option.
|
60 |
* @return void
|
61 |
*/
|
62 |
function update_imagify_option( $key, $value ) {
|
63 |
$options = get_option( IMAGIFY_SETTINGS_SLUG );
|
64 |
$options[ $key ] = $value;
|
65 |
+
|
66 |
update_option( IMAGIFY_SETTINGS_SLUG, $options );
|
67 |
}
|
68 |
|
69 |
/**
|
70 |
+
* Determine if the Imagify API key is valid.
|
71 |
*
|
72 |
* @since 1.0
|
73 |
*
|
74 |
+
* @return bool True if the API key is valid.
|
75 |
*/
|
76 |
function imagify_valid_key() {
|
77 |
+
static $imagify_valid_key;
|
78 |
+
|
79 |
+
if ( isset( $imagify_valid_key ) ) {
|
80 |
return $imagify_valid_key;
|
81 |
}
|
82 |
+
|
83 |
if ( ! get_imagify_option( 'api_key', false ) ) {
|
84 |
$imagify_valid_key = false;
|
85 |
return false;
|
86 |
}
|
87 |
+
|
88 |
if ( get_site_transient( 'imagify_check_licence_1' ) ) {
|
89 |
$imagify_valid_key = true;
|
90 |
return true;
|
91 |
}
|
92 |
+
|
93 |
if ( is_wp_error( get_imagify_user() ) ) {
|
94 |
$imagify_valid_key = false;
|
95 |
return false;
|
96 |
}
|
97 |
+
|
98 |
$imagify_valid_key = true;
|
99 |
set_site_transient( 'imagify_check_licence_1', true, YEAR_IN_SECONDS );
|
100 |
+
|
101 |
return true;
|
102 |
+
}
|
inc/functions/process.php
CHANGED
@@ -1,74 +1,78 @@
|
|
1 |
<?php
|
2 |
-
defined( 'ABSPATH' )
|
3 |
|
4 |
/**
|
5 |
* Process an image with Imagify.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*
|
9 |
-
* @param
|
10 |
-
* @param
|
11 |
-
*
|
12 |
-
*
|
13 |
-
*
|
|
|
14 |
*/
|
15 |
function do_imagify( $file_path, $args = array() ) {
|
16 |
$errors = new WP_Error();
|
17 |
-
$args = array_merge(
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
$args
|
27 |
-
);
|
28 |
-
|
29 |
/**
|
30 |
-
* Filter the attachment path
|
31 |
*
|
32 |
* @since 1.2
|
33 |
*
|
34 |
-
* @param string $file_path The attachment path
|
35 |
*/
|
36 |
$file_path = apply_filters( 'imagify_file_path', $file_path );
|
37 |
-
|
38 |
-
// Check if the Imagify servers & the API are accessible
|
39 |
if ( ! is_imagify_servers_up() ) {
|
40 |
$errors->add( 'api_server_down', __( 'Sorry, our servers are temporarily unaccessible. Please, try again in a couple of minutes.', 'imagify' ) );
|
41 |
-
return $errors;
|
42 |
}
|
43 |
-
|
44 |
// Check if external HTTP requests are blocked.
|
45 |
if ( is_imagify_blocked() ) {
|
46 |
$errors->add( 'http_block_external', __( 'External HTTP requests are blocked', 'imagify' ) );
|
47 |
return $errors;
|
48 |
}
|
49 |
-
|
50 |
-
// Check that file path isn't empty
|
51 |
if ( empty( $file_path ) ) {
|
52 |
$errors->add( 'empty_path', __( 'File path is empty', 'imagify' ) );
|
53 |
return $errors;
|
54 |
}
|
55 |
|
56 |
-
|
57 |
-
|
|
|
|
|
|
|
58 |
$errors->add( 'file_not_found', sprintf( __( 'Could not find %s', 'imagify' ), $file_path ) );
|
|
|
59 |
}
|
60 |
|
61 |
-
// Check that the file is writable
|
62 |
-
if ( !
|
63 |
-
|
|
|
64 |
return $errors;
|
65 |
}
|
66 |
|
67 |
-
// Get file size
|
68 |
-
$file_size =
|
69 |
|
70 |
-
// Check that file exists
|
71 |
-
if ( 0
|
|
|
72 |
$errors->add( 'image_not_found', sprintf( __( 'Skipped (%s), image not found.', 'imagify' ), size_format( $file_size ) ) );
|
73 |
return $errors;
|
74 |
}
|
@@ -78,42 +82,38 @@ function do_imagify( $file_path, $args = array() ) {
|
|
78 |
*
|
79 |
* @since 1.0
|
80 |
*
|
81 |
-
* @param
|
82 |
-
* @param
|
83 |
*/
|
84 |
do_action( 'before_do_imagify', $file_path, $args['backup'] );
|
85 |
|
86 |
-
// Send image for optimization and fetch the response
|
87 |
-
$response = upload_imagify_image(
|
88 |
-
|
89 |
-
|
90 |
-
'
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
);
|
101 |
-
|
102 |
-
// Check status code
|
103 |
-
if( is_wp_error( $response ) ) {
|
104 |
$errors->add( 'api_error', $response->get_error_message() );
|
105 |
return $errors;
|
106 |
}
|
107 |
|
108 |
-
// Create a backup file
|
109 |
-
if ( 'wp' === $args['context'] && $args['backup'] && ! $args['resized'] ) {
|
110 |
$backup_path = get_imagify_attachment_backup_path( $file_path );
|
111 |
$backup_path_info = pathinfo( $backup_path );
|
112 |
|
113 |
wp_mkdir_p( $backup_path_info['dirname'] );
|
114 |
|
115 |
-
// TO DO - check and send a error message if the backup can't be created
|
116 |
-
|
117 |
imagify_chmod_file( $backup_path );
|
118 |
}
|
119 |
|
@@ -128,12 +128,12 @@ function do_imagify( $file_path, $args = array() ) {
|
|
128 |
return $errors;
|
129 |
}
|
130 |
|
131 |
-
|
132 |
imagify_chmod_file( $file_path );
|
133 |
|
134 |
-
// If temp file still exists, delete it
|
135 |
-
if (
|
136 |
-
|
137 |
}
|
138 |
|
139 |
/**
|
@@ -141,8 +141,8 @@ function do_imagify( $file_path, $args = array() ) {
|
|
141 |
*
|
142 |
* @since 1.0
|
143 |
*
|
144 |
-
* @param
|
145 |
-
* @param
|
146 |
*/
|
147 |
do_action( 'after_do_imagify', $file_path, $args['backup'] );
|
148 |
|
@@ -150,12 +150,12 @@ function do_imagify( $file_path, $args = array() ) {
|
|
150 |
}
|
151 |
|
152 |
/**
|
153 |
-
* Run an async job to optimize images in background
|
154 |
*
|
155 |
-
* @param $body
|
156 |
*
|
157 |
* @since 1.4
|
158 |
-
|
159 |
function imagify_do_async_job( $body ) {
|
160 |
$args = array(
|
161 |
'timeout' => 0.01,
|
@@ -166,4 +166,4 @@ function imagify_do_async_job( $body ) {
|
|
166 |
);
|
167 |
|
168 |
wp_remote_post( admin_url( 'admin-ajax.php' ), $args );
|
169 |
-
}
|
1 |
<?php
|
2 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
3 |
|
4 |
/**
|
5 |
* Process an image with Imagify.
|
6 |
*
|
7 |
* @since 1.0
|
8 |
*
|
9 |
+
* @param string $file_path Absolute path to the image file.
|
10 |
+
* @param array $args An array that can contain:
|
11 |
+
* bool $backup Force a backup of the original file.
|
12 |
+
* int $optimization_level The optimization level (2=ultra, 1=aggressive, 0=normal).
|
13 |
+
* bool $keep_exif To keep exif data or not.
|
14 |
+
* @return obj|array Error message | Optimized image data.
|
15 |
*/
|
16 |
function do_imagify( $file_path, $args = array() ) {
|
17 |
$errors = new WP_Error();
|
18 |
+
$args = array_merge( array(
|
19 |
+
'backup' => get_imagify_option( 'backup', false ),
|
20 |
+
'optimization_level' => get_imagify_option( 'optimization_level', 1 ),
|
21 |
+
'keep_exif' => get_imagify_option( 'exif', false ),
|
22 |
+
'context' => 'wp',
|
23 |
+
'resized' => false,
|
24 |
+
'original_size' => 0,
|
25 |
+
), $args );
|
26 |
+
|
|
|
|
|
|
|
27 |
/**
|
28 |
+
* Filter the attachment path.
|
29 |
*
|
30 |
* @since 1.2
|
31 |
*
|
32 |
+
* @param string $file_path The attachment path.
|
33 |
*/
|
34 |
$file_path = apply_filters( 'imagify_file_path', $file_path );
|
35 |
+
|
36 |
+
// Check if the Imagify servers & the API are accessible.
|
37 |
if ( ! is_imagify_servers_up() ) {
|
38 |
$errors->add( 'api_server_down', __( 'Sorry, our servers are temporarily unaccessible. Please, try again in a couple of minutes.', 'imagify' ) );
|
39 |
+
return $errors;
|
40 |
}
|
41 |
+
|
42 |
// Check if external HTTP requests are blocked.
|
43 |
if ( is_imagify_blocked() ) {
|
44 |
$errors->add( 'http_block_external', __( 'External HTTP requests are blocked', 'imagify' ) );
|
45 |
return $errors;
|
46 |
}
|
47 |
+
|
48 |
+
// Check that file path isn't empty.
|
49 |
if ( empty( $file_path ) ) {
|
50 |
$errors->add( 'empty_path', __( 'File path is empty', 'imagify' ) );
|
51 |
return $errors;
|
52 |
}
|
53 |
|
54 |
+
$filesystem = imagify_get_filesystem();
|
55 |
+
|
56 |
+
// Check that the file exists.
|
57 |
+
if ( ! $filesystem->exists( $file_path ) || ! $filesystem->is_file( $file_path ) ) {
|
58 |
+
/* translators: %s is a file path. */
|
59 |
$errors->add( 'file_not_found', sprintf( __( 'Could not find %s', 'imagify' ), $file_path ) );
|
60 |
+
return $errors;
|
61 |
}
|
62 |
|
63 |
+
// Check that the file is writable.
|
64 |
+
if ( ! wp_is_writable( dirname( $file_path ) ) ) {
|
65 |
+
/* translators: %s is a file path. */
|
66 |
+
$errors->add( 'not_writable', sprintf( __( '%s is not writable', 'imagify' ), dirname( $file_path ) ) );
|
67 |
return $errors;
|
68 |
}
|
69 |
|
70 |
+
// Get file size.
|
71 |
+
$file_size = $filesystem->size( $file_path );
|
72 |
|
73 |
+
// Check that file exists.
|
74 |
+
if ( 0 === $file_size ) {
|
75 |
+
/* translators: %s is a file size. */
|
76 |
$errors->add( 'image_not_found', sprintf( __( 'Skipped (%s), image not found.', 'imagify' ), size_format( $file_size ) ) );
|
77 |
return $errors;
|
78 |
}
|
82 |
*
|
83 |
* @since 1.0
|
84 |
*
|
85 |
+
* @param string $file_path Absolute path to the image file.
|
86 |
+
* @param bool $backup Force a backup of the original file.
|
87 |
*/
|
88 |
do_action( 'before_do_imagify', $file_path, $args['backup'] );
|
89 |
|
90 |
+
// Send image for optimization and fetch the response.
|
91 |
+
$response = upload_imagify_image( array(
|
92 |
+
'image' => curl_file_create( $file_path ),
|
93 |
+
'data' => wp_json_encode( array(
|
94 |
+
'aggressive' => ( 1 === (int) $args['optimization_level'] ),
|
95 |
+
'ultra' => ( 2 === (int) $args['optimization_level'] ),
|
96 |
+
'keep_exif' => $args['keep_exif'],
|
97 |
+
'context' => $args['context'],
|
98 |
+
'original_size' => $args['original_size'],
|
99 |
+
) ),
|
100 |
+
) );
|
101 |
+
|
102 |
+
// Check status code.
|
103 |
+
if ( is_wp_error( $response ) ) {
|
|
|
|
|
|
|
|
|
104 |
$errors->add( 'api_error', $response->get_error_message() );
|
105 |
return $errors;
|
106 |
}
|
107 |
|
108 |
+
// Create a backup file.
|
109 |
+
if ( 'wp' === $args['context'] && $args['backup'] && ! $args['resized'] ) {
|
110 |
$backup_path = get_imagify_attachment_backup_path( $file_path );
|
111 |
$backup_path_info = pathinfo( $backup_path );
|
112 |
|
113 |
wp_mkdir_p( $backup_path_info['dirname'] );
|
114 |
|
115 |
+
// TO DO - check and send a error message if the backup can't be created.
|
116 |
+
$filesystem->copy( $file_path, $backup_path, true );
|
117 |
imagify_chmod_file( $backup_path );
|
118 |
}
|
119 |
|
128 |
return $errors;
|
129 |
}
|
130 |
|
131 |
+
$filesystem->move( $temp_file, $file_path, true );
|
132 |
imagify_chmod_file( $file_path );
|
133 |
|
134 |
+
// If temp file still exists, delete it.
|
135 |
+
if ( $filesystem->exists( $temp_file ) ) {
|
136 |
+
$filesystem->delete( $temp_file );
|
137 |
}
|
138 |
|
139 |
/**
|
141 |
*
|
142 |
* @since 1.0
|
143 |
*
|
144 |
+
* @param string $file_path Absolute path to the image file.
|
145 |
+
* @param bool $backup Force a backup of the original file.
|
146 |
*/
|
147 |
do_action( 'after_do_imagify', $file_path, $args['backup'] );
|
148 |
|
150 |
}
|
151 |
|
152 |
/**
|
153 |
+
* Run an async job to optimize images in background.
|
154 |
*
|
155 |
+
* @param array $body Contains the usual $_POST.
|
156 |
*
|
157 |
* @since 1.4
|
158 |
+
*/
|
159 |
function imagify_do_async_job( $body ) {
|
160 |
$args = array(
|
161 |
'timeout' => 0.01,
|
166 |
);
|
167 |
|
168 |
wp_remote_post( admin_url( 'admin-ajax.php' ), $args );
|
169 |
+
}
|
languages/imagify-de_DE.mo
DELETED
Binary file
|
languages/imagify-de_DE.po
DELETED
@@ -1,1203 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: Imagify\n"
|
4 |
-
"Report-Msgid-Bugs-To: \n"
|
5 |
-
"POT-Creation-Date: 2016-09-23 11:03-0500\n"
|
6 |
-
"PO-Revision-Date: 2016-09-23 11:13-0500\n"
|
7 |
-
"Last-Translator: Rémy Perona <remperona@gmail.com>\n"
|
8 |
-
"Language-Team: \n"
|
9 |
-
"Language: de\n"
|
10 |
-
"MIME-Version: 1.0\n"
|
11 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
12 |
-
"Content-Transfer-Encoding: 8bit\n"
|
13 |
-
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
14 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
15 |
-
"X-Poedit-Basepath: .\n"
|
16 |
-
"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;"
|
17 |
-
"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
|
18 |
-
"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;"
|
19 |
-
"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;"
|
20 |
-
"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n"
|
21 |
-
"X-Generator: Poedit 1.6.4\n"
|
22 |
-
"X-Loco-Target-Locale: de_DE\n"
|
23 |
-
"X-Poedit-SearchPath-0: ..\n"
|
24 |
-
|
25 |
-
#: ../inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:20
|
26 |
-
#: ../inc/admin/ajax.php:123 ../inc/admin/meta-boxes.php:34
|
27 |
-
#: ../inc/functions/admin-ui.php:215 ../inc/functions/i18n.php:49
|
28 |
-
#: ../inc/functions/i18n.php:64
|
29 |
-
msgid "Optimize"
|
30 |
-
msgstr "Optimieren"
|
31 |
-
|
32 |
-
#: ../inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:21
|
33 |
-
#: ../inc/functions/admin-ui.php:80 ../inc/functions/i18n.php:50
|
34 |
-
msgid "Restore Original"
|
35 |
-
msgstr "Original wiederherstellen"
|
36 |
-
|
37 |
-
#: ../inc/3rd-party/nextgen-gallery/inc/admin/menu.php:16
|
38 |
-
#: ../inc/admin/menu.php:24 ../inc/admin/plugins.php:13
|
39 |
-
#: ../inc/admin/ui/bulk.php:81 ../inc/common/admin-bar.php:39
|
40 |
-
msgid "Bulk Optimization"
|
41 |
-
msgstr "Stapelverarbeitung"
|
42 |
-
|
43 |
-
#: ../inc/admin/ajax.php:123 ../inc/admin/meta-boxes.php:29
|
44 |
-
#: ../inc/functions/admin-ui.php:121 ../inc/functions/admin-ui.php:153
|
45 |
-
#: ../inc/functions/admin-ui.php:159 ../inc/functions/admin-ui.php:165
|
46 |
-
#: ../inc/functions/admin-ui.php:205 ../inc/functions/admin-ui.php:215
|
47 |
-
msgid "Optimizing..."
|
48 |
-
msgstr "Wird optimiert …"
|
49 |
-
|
50 |
-
#: ../inc/admin/ajax.php:507
|
51 |
-
msgid "Oops, It's almost over!"
|
52 |
-
msgstr "Hoppla, es wird langsam eng."
|
53 |
-
|
54 |
-
#: ../inc/admin/ajax.php:508
|
55 |
-
#, php-format
|
56 |
-
msgid ""
|
57 |
-
"You have almost used all your credit.%sDon't forget to upgrade your "
|
58 |
-
"subscription to continue optimizing your images."
|
59 |
-
msgstr ""
|
60 |
-
"In Kürze wirst du dein Guthaben verbraucht haben.%sAktualisiere dein Abo, um "
|
61 |
-
"deine Bilder auch in Zukunft zu optimieren."
|
62 |
-
|
63 |
-
#: ../inc/admin/ajax.php:509 ../inc/admin/ui/bulk.php:23
|
64 |
-
msgid "View My Subscription"
|
65 |
-
msgstr "Mein Abo ansehen"
|
66 |
-
|
67 |
-
#: ../inc/admin/ajax.php:517 ../inc/admin/ui/notices.php:258
|
68 |
-
#: ../inc/functions/i18n.php:84
|
69 |
-
msgid "Oops, It's Over!"
|
70 |
-
msgstr "Alles hat ein Ende…"
|
71 |
-
|
72 |
-
#: ../inc/admin/ajax.php:518 ../inc/admin/ui/notices.php:260
|
73 |
-
#: ../inc/functions/i18n.php:101
|
74 |
-
#, php-format
|
75 |
-
msgid ""
|
76 |
-
"You have consumed all your credit for this month. You will have <strong>%s "
|
77 |
-
"back on %s</strong>."
|
78 |
-
msgstr ""
|
79 |
-
"Du hast dein Guthaben für diesen Monat aufgebraucht. <strong>%s</strong> "
|
80 |
-
"werden dir am <strong>%s</strong> wieder zur Verfügung stehen."
|
81 |
-
|
82 |
-
#: ../inc/admin/ajax.php:519
|
83 |
-
msgid "Upgrade My Subscription"
|
84 |
-
msgstr "Mein Abo aktualisieren"
|
85 |
-
|
86 |
-
#: ../inc/admin/ajax.php:538 ../inc/admin/ui/bulk.php:17
|
87 |
-
msgid "Account status"
|
88 |
-
msgstr "Kontostatus"
|
89 |
-
|
90 |
-
#: ../inc/admin/ajax.php:539 ../inc/admin/ui/bulk.php:18
|
91 |
-
msgid "Your subscription:"
|
92 |
-
msgstr "Dein Abo:"
|
93 |
-
|
94 |
-
#: ../inc/admin/ajax.php:547 ../inc/admin/ui/bulk.php:48
|
95 |
-
#, php-format
|
96 |
-
msgid "You have %s space credit left"
|
97 |
-
msgstr "Du hast noch %s Guthaben"
|
98 |
-
|
99 |
-
#: ../inc/admin/ajax.php:559
|
100 |
-
msgid "View my subscription"
|
101 |
-
msgstr "Mein Abo ansehen"
|
102 |
-
|
103 |
-
#: ../inc/admin/media.php:63 ../inc/functions/i18n.php:60
|
104 |
-
msgid "Compare Original VS Optimized"
|
105 |
-
msgstr "Vergleiche Original mit optimiert"
|
106 |
-
|
107 |
-
#: ../inc/admin/meta-boxes.php:17 ../inc/admin/meta-boxes.php:24
|
108 |
-
#: ../inc/admin/upload.php:12
|
109 |
-
msgid "Imagify"
|
110 |
-
msgstr ""
|
111 |
-
|
112 |
-
#: ../inc/admin/meta-boxes.php:19 ../inc/functions/admin-ui.php:195
|
113 |
-
msgid "Invalid API key"
|
114 |
-
msgstr "Ungültiger API-Schlüssel"
|
115 |
-
|
116 |
-
#: ../inc/admin/meta-boxes.php:21 ../inc/functions/admin-ui.php:197
|
117 |
-
msgid "Check your Settings"
|
118 |
-
msgstr "Überprüfe deine Einstellungen"
|
119 |
-
|
120 |
-
#: ../inc/admin/options.php:119
|
121 |
-
msgid "Cheatin’ uh?"
|
122 |
-
msgstr "Ts, ts, ts …"
|
123 |
-
|
124 |
-
#: ../inc/admin/options.php:127
|
125 |
-
msgid "<strong>ERROR</strong>: options page not found."
|
126 |
-
msgstr "<strong>Fehler</strong>: Einstellungsseite nicht gefunden."
|
127 |
-
|
128 |
-
#: ../inc/admin/plugins.php:14 ../inc/admin/ui/options.php:74
|
129 |
-
#: ../inc/common/admin-bar.php:30
|
130 |
-
msgid "Settings"
|
131 |
-
msgstr "Einstellungen"
|
132 |
-
|
133 |
-
#: ../inc/admin/ui/bulk.php:60
|
134 |
-
msgid "Upgrade your account to continue optimizing your images"
|
135 |
-
msgstr "Aktualisiere dein Konto, um deine Bilder weiterhin zu optimieren"
|
136 |
-
|
137 |
-
#: ../inc/admin/ui/bulk.php:64
|
138 |
-
msgid "More info"
|
139 |
-
msgstr "Weitere Informationen"
|
140 |
-
|
141 |
-
#: ../inc/admin/ui/bulk.php:91
|
142 |
-
msgid "Overview"
|
143 |
-
msgstr "Übersicht"
|
144 |
-
|
145 |
-
#: ../inc/admin/ui/bulk.php:99
|
146 |
-
#, php-format
|
147 |
-
msgid "You optimized %s images of your website"
|
148 |
-
msgstr "Du hast %s Bilder deiner Website optimiert"
|
149 |
-
|
150 |
-
#: ../inc/admin/ui/bulk.php:103
|
151 |
-
msgid "Statistics"
|
152 |
-
msgstr "Statistik"
|
153 |
-
|
154 |
-
#: ../inc/admin/ui/bulk.php:115
|
155 |
-
msgid "that's the number of images you optimized with Imagify"
|
156 |
-
msgstr "Bilder mit Imagify optimiert"
|
157 |
-
|
158 |
-
#: ../inc/admin/ui/bulk.php:120
|
159 |
-
msgid "Original size"
|
160 |
-
msgstr "Originalgröße"
|
161 |
-
|
162 |
-
#: ../inc/admin/ui/bulk.php:125
|
163 |
-
msgid "Optimized size"
|
164 |
-
msgstr "Optimierte Größe"
|
165 |
-
|
166 |
-
#: ../inc/admin/ui/bulk.php:136
|
167 |
-
#, php-format
|
168 |
-
msgid "that's the size you saved %sby using Imagify"
|
169 |
-
msgstr "geringere Dateigröße dank Imagify"
|
170 |
-
|
171 |
-
#: ../inc/admin/ui/bulk.php:142
|
172 |
-
msgid "Information"
|
173 |
-
msgstr "Informationen"
|
174 |
-
|
175 |
-
#: ../inc/admin/ui/bulk.php:146
|
176 |
-
msgid ""
|
177 |
-
"Please be aware that optimizing a large number of images can take a while "
|
178 |
-
"depending on your server and network speed."
|
179 |
-
msgstr ""
|
180 |
-
"Bitte beachte: Das Optimieren einer hohen Anzahl Bilder kann eine Weile "
|
181 |
-
"dauern, abhängig von deinem Server und der Netzwerkgeschwindigkeit."
|
182 |
-
|
183 |
-
#: ../inc/admin/ui/bulk.php:149
|
184 |
-
#, php-format
|
185 |
-
msgid ""
|
186 |
-
"If you have more than %s images, you will need to launch the bulk "
|
187 |
-
"optimization several times."
|
188 |
-
msgstr ""
|
189 |
-
|
190 |
-
#: ../inc/admin/ui/bulk.php:153
|
191 |
-
msgid ""
|
192 |
-
"You must keep this page open while the bulk optimizaton is processing. If "
|
193 |
-
"you leave you can come back to continue where it left off."
|
194 |
-
msgstr ""
|
195 |
-
"Du musst diese Seite während der Stapelverarbeitung geöffnet lassen. Falls "
|
196 |
-
"du sie doch schließt, wird die Stapelverarbeitung unterbrochen und später "
|
197 |
-
"fortgesetzt, sobald du diese Seite erneut aufrufst."
|
198 |
-
|
199 |
-
#: ../inc/admin/ui/bulk.php:164
|
200 |
-
msgid "Select Your Compression Level"
|
201 |
-
msgstr "Wähle deinen Komprimierungsstufen"
|
202 |
-
|
203 |
-
#: ../inc/admin/ui/bulk.php:166 ../inc/admin/ui/bulk.php:192
|
204 |
-
#: ../inc/admin/ui/options.php:136 ../inc/admin/ui/options.php:365
|
205 |
-
#: ../inc/admin/ui/options.php:404 ../inc/admin/ui/options.php:421
|
206 |
-
#: ../inc/admin/ui/options.php:481
|
207 |
-
#: ../inc/classes/abstracts/abstract-attachment.php:114
|
208 |
-
#: ../inc/functions/admin-ui.php:153
|
209 |
-
msgid "Ultra"
|
210 |
-
msgstr "Ultra"
|
211 |
-
|
212 |
-
#: ../inc/admin/ui/bulk.php:169 ../inc/admin/ui/bulk.php:187
|
213 |
-
#: ../inc/admin/ui/options.php:131 ../inc/admin/ui/options.php:352
|
214 |
-
#: ../inc/admin/ui/options.php:403 ../inc/admin/ui/options.php:416
|
215 |
-
#: ../inc/admin/ui/options.php:460
|
216 |
-
#: ../inc/classes/abstracts/abstract-attachment.php:117
|
217 |
-
#: ../inc/functions/admin-ui.php:159
|
218 |
-
msgid "Aggressive"
|
219 |
-
msgstr "Aggressiv"
|
220 |
-
|
221 |
-
#: ../inc/admin/ui/bulk.php:172 ../inc/admin/ui/bulk.php:182
|
222 |
-
#: ../inc/admin/ui/options.php:126 ../inc/admin/ui/options.php:339
|
223 |
-
#: ../inc/admin/ui/options.php:402 ../inc/admin/ui/options.php:411
|
224 |
-
#: ../inc/admin/ui/options.php:440
|
225 |
-
#: ../inc/classes/abstracts/abstract-attachment.php:120
|
226 |
-
#: ../inc/functions/admin-ui.php:165
|
227 |
-
msgid "Normal"
|
228 |
-
msgstr "Normal"
|
229 |
-
|
230 |
-
#: ../inc/admin/ui/bulk.php:176
|
231 |
-
#, php-format
|
232 |
-
msgid "Your default setting: %s"
|
233 |
-
msgstr "Deine Standardeinstellung: %s"
|
234 |
-
|
235 |
-
#: ../inc/admin/ui/bulk.php:201
|
236 |
-
#, php-format
|
237 |
-
msgid "Don't forget to check %syour settings%s before bulk optimization."
|
238 |
-
msgstr "Überprüfe deine %sEinstellungen%s vor der Stapelverarbeitung."
|
239 |
-
|
240 |
-
#: ../inc/admin/ui/bulk.php:208
|
241 |
-
msgid "Let's go!"
|
242 |
-
msgstr "Los geht’s!"
|
243 |
-
|
244 |
-
#: ../inc/admin/ui/bulk.php:215
|
245 |
-
msgid "Imagif'em all"
|
246 |
-
msgstr "Alle Bilder optimieren"
|
247 |
-
|
248 |
-
#: ../inc/admin/ui/bulk.php:220
|
249 |
-
#, php-format
|
250 |
-
msgid "All images greater than %s will be optimized when using a paid plan."
|
251 |
-
msgstr ""
|
252 |
-
"Alle Bilder größer als %s werden optimiert, wenn du einen bezahlten Tarif "
|
253 |
-
"nutzt."
|
254 |
-
|
255 |
-
#: ../inc/admin/ui/bulk.php:239
|
256 |
-
msgid "Well done!"
|
257 |
-
msgstr "Klasse!"
|
258 |
-
|
259 |
-
#: ../inc/admin/ui/bulk.php:240
|
260 |
-
#, php-format
|
261 |
-
msgid "you saved %1$s out of %2$s"
|
262 |
-
msgstr "du hast %1$s von %2$s gespart"
|
263 |
-
|
264 |
-
#: ../inc/admin/ui/bulk.php:245
|
265 |
-
msgid "Share your awesome result"
|
266 |
-
msgstr "Teile dein hervorragendes Ergebnis"
|
267 |
-
|
268 |
-
#: ../inc/admin/ui/bulk.php:260
|
269 |
-
msgid "Compression process results"
|
270 |
-
msgstr "Ergebnisse der Komprimierung"
|
271 |
-
|
272 |
-
#: ../inc/admin/ui/bulk.php:263
|
273 |
-
msgid "Filename"
|
274 |
-
msgstr "Dateiname"
|
275 |
-
|
276 |
-
#: ../inc/admin/ui/bulk.php:264
|
277 |
-
msgid "Status"
|
278 |
-
msgstr "Status"
|
279 |
-
|
280 |
-
#: ../inc/admin/ui/bulk.php:265 ../inc/admin/ui/options.php:401
|
281 |
-
#: ../inc/admin/ui/options.php:406 ../inc/admin/ui/options.php:430
|
282 |
-
msgid "Original"
|
283 |
-
msgstr "Original"
|
284 |
-
|
285 |
-
#: ../inc/admin/ui/bulk.php:266 ../inc/admin/upload.php:41
|
286 |
-
#: ../inc/functions/i18n.php:80
|
287 |
-
msgid "Optimized"
|
288 |
-
msgstr "Optimiert"
|
289 |
-
|
290 |
-
#: ../inc/admin/ui/bulk.php:267
|
291 |
-
msgid "Percentage"
|
292 |
-
msgstr "Prozent"
|
293 |
-
|
294 |
-
#: ../inc/admin/ui/bulk.php:268
|
295 |
-
msgid "Thumbnails optimized"
|
296 |
-
msgstr "Vorschaubilder optimiert"
|
297 |
-
|
298 |
-
#: ../inc/admin/ui/bulk.php:269
|
299 |
-
msgid "Overall saving"
|
300 |
-
msgstr "Gesamte Ersparnis"
|
301 |
-
|
302 |
-
#: ../inc/admin/ui/bulk.php:274
|
303 |
-
msgid "file"
|
304 |
-
msgstr "Datei"
|
305 |
-
|
306 |
-
#: ../inc/admin/ui/bulk.php:275
|
307 |
-
msgid "error"
|
308 |
-
msgstr "Fehler"
|
309 |
-
|
310 |
-
#: ../inc/admin/ui/bulk.php:276
|
311 |
-
msgid "Total:"
|
312 |
-
msgstr "Gesamt:"
|
313 |
-
|
314 |
-
#: ../inc/admin/ui/bulk.php:277
|
315 |
-
msgid "Gain:"
|
316 |
-
msgstr "Gewinn:"
|
317 |
-
|
318 |
-
#: ../inc/admin/ui/bulk.php:294
|
319 |
-
#, php-format
|
320 |
-
msgid "%sStart the bulk optimization%s"
|
321 |
-
msgstr "%sStapelverarbeitung starten%s"
|
322 |
-
|
323 |
-
#: ../inc/admin/ui/notices.php:24
|
324 |
-
msgid "Welcome to Imagify, the best way to easily optimize your images!"
|
325 |
-
msgstr "Willkommen bei Imagify, der smarten Bildoptimierung!"
|
326 |
-
|
327 |
-
#: ../inc/admin/ui/notices.php:26 ../inc/admin/ui/notices.php:92
|
328 |
-
#: ../inc/admin/ui/notices.php:186 ../inc/admin/ui/notices.php:223
|
329 |
-
#: ../inc/admin/ui/notices.php:263 ../inc/admin/ui/notices.php:370
|
330 |
-
msgid "Dismiss this notice"
|
331 |
-
msgstr "Diese Meldung verwerfen"
|
332 |
-
|
333 |
-
#: ../inc/admin/ui/notices.php:33
|
334 |
-
msgid "Create an Account"
|
335 |
-
msgstr "Konto anlegen"
|
336 |
-
|
337 |
-
#: ../inc/admin/ui/notices.php:34
|
338 |
-
msgid ""
|
339 |
-
"Don't have an Imagify account yet? Optimize your images by creating an "
|
340 |
-
"account in a few seconds!"
|
341 |
-
msgstr ""
|
342 |
-
"Registriere dein Konto bei Imagify (kostenfrei, dauert nur ein paar "
|
343 |
-
"Sekunden), um anschließend deine Bilder in WordPress zu optimieren."
|
344 |
-
|
345 |
-
#: ../inc/admin/ui/notices.php:37
|
346 |
-
msgid "Sign up, It's FREE!"
|
347 |
-
msgstr "Mein Konto kostenfrei anlegen"
|
348 |
-
|
349 |
-
#: ../inc/admin/ui/notices.php:43
|
350 |
-
msgid "Enter your API Key"
|
351 |
-
msgstr "API-Schlüssel eingeben"
|
352 |
-
|
353 |
-
#: ../inc/admin/ui/notices.php:44
|
354 |
-
#, php-format
|
355 |
-
msgid ""
|
356 |
-
"Save your API Key you have received by email or you can get it on your "
|
357 |
-
"%sImagify account page%s."
|
358 |
-
msgstr ""
|
359 |
-
"Aktiviere Imagify mit deinem persönlichen API-Schlüssel, den du per E-Mail "
|
360 |
-
"erhalten hast. Du kannst ihn auch jederzeit in deinen %sKontoeinstellungen%s "
|
361 |
-
"abrufen."
|
362 |
-
|
363 |
-
#: ../inc/admin/ui/notices.php:47
|
364 |
-
msgid "I have my API key"
|
365 |
-
msgstr "Meinen API-Schlüssel eingeben"
|
366 |
-
|
367 |
-
#: ../inc/admin/ui/notices.php:53
|
368 |
-
msgid "Configure it"
|
369 |
-
msgstr "Einstellungen wählen"
|
370 |
-
|
371 |
-
#: ../inc/admin/ui/notices.php:54
|
372 |
-
msgid ""
|
373 |
-
"It’s almost done! You have just to configure your optimization settings."
|
374 |
-
msgstr ""
|
375 |
-
"Fast fertig! Wähle nun deine Einstellungen für Imagify. Anschließend kannst "
|
376 |
-
"du alle deine Bilder von Imagify automatisch optimieren lassen."
|
377 |
-
|
378 |
-
#: ../inc/admin/ui/notices.php:55
|
379 |
-
msgid "Go to Settings"
|
380 |
-
msgstr "Meine Einstellungen wählen"
|
381 |
-
|
382 |
-
#: ../inc/admin/ui/notices.php:87 ../inc/admin/ui/options.php:97
|
383 |
-
#: ../inc/functions/i18n.php:78
|
384 |
-
msgid "Your API key isn't valid!"
|
385 |
-
msgstr "Dein API-Schlüssel ist ungültig."
|
386 |
-
|
387 |
-
#: ../inc/admin/ui/notices.php:90
|
388 |
-
#, php-format
|
389 |
-
msgid ""
|
390 |
-
"Go to your Imagify account page to get your API Key and specify it on "
|
391 |
-
"%1$syour settings%3$s or %2$screate an account for free%3$s if you don't "
|
392 |
-
"have one yet."
|
393 |
-
msgstr ""
|
394 |
-
"Du findest deinen API-Schlüssel in deinem Imagify-Konto. Sobald du ihn dort "
|
395 |
-
"geholt hast, %1$shinterlege ihn in deinen Einstellungen%3$s. Oder %2$slege "
|
396 |
-
"kostenfrei ein Konto an%3$s, um deinen API-Schlüssel zu erhalten."
|
397 |
-
|
398 |
-
#: ../inc/admin/ui/notices.php:142
|
399 |
-
msgid ""
|
400 |
-
"The following plugins are not compatible with this plugin and may cause "
|
401 |
-
"unexpected results:"
|
402 |
-
msgstr ""
|
403 |
-
"Die folgenden Plugins sind nicht kompatibel mit diesem Plugin und können "
|
404 |
-
"unerwartete Ergebnisse verursachen:"
|
405 |
-
|
406 |
-
#: ../inc/admin/ui/notices.php:148
|
407 |
-
msgid "Deactivate"
|
408 |
-
msgstr "Deaktivieren"
|
409 |
-
|
410 |
-
#: ../inc/admin/ui/notices.php:178
|
411 |
-
msgid "The external HTTP requests are blocked!"
|
412 |
-
msgstr "Externe HTTP-Anfragen werden blockiert."
|
413 |
-
|
414 |
-
#: ../inc/admin/ui/notices.php:179
|
415 |
-
msgid ""
|
416 |
-
"You defined the <code>WP_HTTP_BLOCK_EXTERNAL</code> constant in the <code>wp-"
|
417 |
-
"config.php</code> to block all external HTTP requests."
|
418 |
-
msgstr ""
|
419 |
-
"Alle externen HTTP-Anfragen werden blockiert, weil in der Datei <em>wp-"
|
420 |
-
"config.php</em> die PHP-Konstante <code>WP_HTTP_BLOCK_EXTERNAL</code> "
|
421 |
-
"gesetzt ist.\n"
|
422 |
-
|
423 |
-
#: ../inc/admin/ui/notices.php:181
|
424 |
-
msgid ""
|
425 |
-
"To optimize your images, you have to put the following code in your <code>wp-"
|
426 |
-
"config.php</code> file so that it works correctly."
|
427 |
-
msgstr ""
|
428 |
-
"Um deine Bilder optimieren zu können, füge den folgenden Code zu deiner "
|
429 |
-
"<em>wp-config.php</em> hinzu."
|
430 |
-
|
431 |
-
#: ../inc/admin/ui/notices.php:182
|
432 |
-
msgid "Click on the field and press Ctrl-A to select all."
|
433 |
-
msgstr "Klicke auf das Feld und drücke ctrl+A (cmd+A) für Alles auswählen."
|
434 |
-
|
435 |
-
#: ../inc/admin/ui/notices.php:219
|
436 |
-
msgid "You're missing out!"
|
437 |
-
msgstr "Du verpasst etwas!"
|
438 |
-
|
439 |
-
#: ../inc/admin/ui/notices.php:220
|
440 |
-
msgid "Use the List view to optimize images with Imagify."
|
441 |
-
msgstr "In der Listenansicht kannst du deine Bilder direkt zu optimieren."
|
442 |
-
|
443 |
-
#: ../inc/admin/ui/notices.php:221
|
444 |
-
msgid "Switch to the List View"
|
445 |
-
msgstr "Zur Listenansicht wechseln"
|
446 |
-
|
447 |
-
#: ../inc/admin/ui/notices.php:260 ../inc/functions/i18n.php:98
|
448 |
-
#: ../inc/functions/i18n.php:101
|
449 |
-
#, php-format
|
450 |
-
msgid ""
|
451 |
-
"To continue to optimize your images, log in to your Imagify account to %sbuy "
|
452 |
-
"a pack or subscribe to a plan%s."
|
453 |
-
msgstr ""
|
454 |
-
"Um deine Bilder auch in Zukunft zu optimieren, logge dich bei Imagify.io ein "
|
455 |
-
"und %skaufe ein einmaliges Guthaben oder ein Abo%s."
|
456 |
-
|
457 |
-
#: ../inc/admin/ui/notices.php:314 ../inc/admin/ui/options.php:28
|
458 |
-
msgid "Discover the best caching plugin to speed up your website."
|
459 |
-
msgstr ""
|
460 |
-
"Entdecke das beste Caching-Plugin, um deine Website schneller zu machen."
|
461 |
-
|
462 |
-
#: ../inc/admin/ui/notices.php:317 ../inc/admin/ui/options.php:36
|
463 |
-
#, php-format
|
464 |
-
msgid "%sGet %s off%s with this coupon code:%s"
|
465 |
-
msgstr "%sErhalte %s Rabatt%s mit diesem Gutschein-Code:%s"
|
466 |
-
|
467 |
-
#: ../inc/admin/ui/notices.php:326 ../inc/admin/ui/options.php:41
|
468 |
-
msgid "Get WP Rocket now"
|
469 |
-
msgstr "Hole dir WP Rocket jetzt"
|
470 |
-
|
471 |
-
#: ../inc/admin/ui/notices.php:363
|
472 |
-
#, php-format
|
473 |
-
msgid ""
|
474 |
-
"%1$sCongratulations%2$s, you have optimized %1$s%3$d images%2$s and improved "
|
475 |
-
"your website's speed by reducing your images size."
|
476 |
-
msgstr ""
|
477 |
-
|
478 |
-
#: ../inc/admin/ui/notices.php:365 ../inc/admin/ui/options.php:59
|
479 |
-
#, php-format
|
480 |
-
msgid ""
|
481 |
-
"%sDo you like this plugin?%s Please take a few seconds to %srate it on "
|
482 |
-
"WordPress.org%s!"
|
483 |
-
msgstr ""
|
484 |
-
"%sBist du zufrieden mit diesem Plugin?%s Bitte nimm dir einen Moment Zeit "
|
485 |
-
"für eine %sBewertung auf WordPress.org%s!"
|
486 |
-
|
487 |
-
#: ../inc/admin/ui/options.php:22
|
488 |
-
msgid "Is your website too slow?"
|
489 |
-
msgstr "Ist deine Website zu langsam?"
|
490 |
-
|
491 |
-
#: ../inc/admin/ui/options.php:84
|
492 |
-
msgid "API Key"
|
493 |
-
msgstr "API-Schlüssel"
|
494 |
-
|
495 |
-
#: ../inc/admin/ui/options.php:91 ../inc/functions/i18n.php:33
|
496 |
-
msgid "Your API key is valid."
|
497 |
-
msgstr "Dein API-Schlüssel ist gültig."
|
498 |
-
|
499 |
-
#: ../inc/admin/ui/options.php:104
|
500 |
-
#, php-format
|
501 |
-
msgid "Don't have an API Key yet? %sCreate one, it's FREE%s."
|
502 |
-
msgstr "Noch keinen API-Schlüssel erhalten? %sJetzt kostenfrei Konto anlegen%s"
|
503 |
-
|
504 |
-
#: ../inc/admin/ui/options.php:121
|
505 |
-
msgid "Optimization Level"
|
506 |
-
msgstr "Optimierungsgrad"
|
507 |
-
|
508 |
-
#: ../inc/admin/ui/options.php:141
|
509 |
-
msgid "More info?"
|
510 |
-
msgstr "Was ist das?"
|
511 |
-
|
512 |
-
#: ../inc/admin/ui/options.php:148
|
513 |
-
#, php-format
|
514 |
-
msgid "Need help to choose? %sTry the Visual Comparison%s"
|
515 |
-
msgstr "Nicht sicher? %sVisuellen Vergleich ausprobieren%s"
|
516 |
-
|
517 |
-
#: ../inc/admin/ui/options.php:157 ../inc/admin/ui/options.php:161
|
518 |
-
msgid "Auto-Optimize images on upload"
|
519 |
-
msgstr "Bilder beim Hochladen automatisch optimieren"
|
520 |
-
|
521 |
-
#: ../inc/admin/ui/options.php:165
|
522 |
-
msgid "Automatically optimize every image you upload to WordPress."
|
523 |
-
msgstr ""
|
524 |
-
"Lasse automatisch jedes Bild optimieren, das du in WordPress hochlädst."
|
525 |
-
|
526 |
-
#: ../inc/admin/ui/options.php:170 ../inc/admin/ui/options.php:173
|
527 |
-
msgid "Backup original images"
|
528 |
-
msgstr "Originalbilder sichern"
|
529 |
-
|
530 |
-
#: ../inc/admin/ui/options.php:177
|
531 |
-
msgid ""
|
532 |
-
"Keep your original images in a separate folder before optimization process."
|
533 |
-
msgstr ""
|
534 |
-
"Speichere Sicherungskopien deiner Originalbilder in einem separaten Ordner, "
|
535 |
-
"bevor die Optimierung beginnt."
|
536 |
-
|
537 |
-
#: ../inc/admin/ui/options.php:182 ../inc/admin/ui/options.php:185
|
538 |
-
msgid "Resize larger images"
|
539 |
-
msgstr "Große Bilder verkleinern"
|
540 |
-
|
541 |
-
#: ../inc/admin/ui/options.php:191
|
542 |
-
#, php-format
|
543 |
-
msgid "to maximum %s pixels width"
|
544 |
-
msgstr "auf maximal %s Pixel Breite"
|
545 |
-
|
546 |
-
#: ../inc/admin/ui/options.php:202
|
547 |
-
#, php-format
|
548 |
-
msgid ""
|
549 |
-
"This option is recommended to reduce larger images. You can save up to 80%% "
|
550 |
-
"after resizing. The new width should not be less than your largest thumbnail "
|
551 |
-
"width, which is actually %spx."
|
552 |
-
msgstr ""
|
553 |
-
"Diese Option ist empfehlenswert, um das Speichervolumen für größere Bilder "
|
554 |
-
"zu reduzieren. Du kannst so bis zu 80%% Speicherplatz sparen. Die neue "
|
555 |
-
"Breite sollte nicht geringer als deine größte Vorschaubildbreite sein, die "
|
556 |
-
"übrigens %s Pixel beträgt."
|
557 |
-
|
558 |
-
#: ../inc/admin/ui/options.php:209 ../inc/admin/ui/options.php:212
|
559 |
-
msgid "EXIF Data"
|
560 |
-
msgstr "EXIF-Daten"
|
561 |
-
|
562 |
-
#: ../inc/admin/ui/options.php:216
|
563 |
-
msgid ""
|
564 |
-
"Keep all EXIF data from your images. EXIF are informations stored in your "
|
565 |
-
"pictures like shutter speed, exposure compensation, ISO, etc..."
|
566 |
-
msgstr ""
|
567 |
-
"Behalte alle EXIF-Daten deiner Bilder. In den EXIF-Daten werden "
|
568 |
-
"Informationen wie Verschlusszeit, Belichtungskorrektur, ISO-Wert usw. "
|
569 |
-
"gespeichert."
|
570 |
-
|
571 |
-
#: ../inc/admin/ui/options.php:217
|
572 |
-
msgid "Learn more"
|
573 |
-
msgstr "Weitere Informationen"
|
574 |
-
|
575 |
-
#: ../inc/admin/ui/options.php:219
|
576 |
-
msgid ""
|
577 |
-
"If you are a photographer, you may be interested in this option if you are "
|
578 |
-
"displaying on your pages some info like the model of your camera."
|
579 |
-
msgstr ""
|
580 |
-
"Aktiviere diese Option, wenn du auf deiner Site fototechnische "
|
581 |
-
"Informationen, wie z.B. das Model deiner Kamera, anzeigen möchtest."
|
582 |
-
|
583 |
-
#: ../inc/admin/ui/options.php:228
|
584 |
-
msgid "Files optimization"
|
585 |
-
msgstr "Dateioptimierung"
|
586 |
-
|
587 |
-
#: ../inc/admin/ui/options.php:231
|
588 |
-
msgid ""
|
589 |
-
"You can choose to compress different image sizes created by WordPress here."
|
590 |
-
msgstr ""
|
591 |
-
"Hier kannst du die Komprimierung für die verschiedenen Bildgrößen "
|
592 |
-
"kontrollieren, die dein WordPress generiert."
|
593 |
-
|
594 |
-
#: ../inc/admin/ui/options.php:233
|
595 |
-
#, php-format
|
596 |
-
msgid "The %soriginal size%s is %sautomatically optimized%s by Imagify."
|
597 |
-
msgstr "Die %sOriginalgröße%s wird von Imagify %sautomatisch optimiert%s."
|
598 |
-
|
599 |
-
#: ../inc/admin/ui/options.php:236
|
600 |
-
msgid ""
|
601 |
-
"Remember each additional image size will affect your Imagify monthly usage!"
|
602 |
-
msgstr ""
|
603 |
-
"Bedenke, dass jede ausgewählte Bildgröße dein monatliches Nutzungsvolumen "
|
604 |
-
"bei Imagify beeinflusst."
|
605 |
-
|
606 |
-
#: ../inc/admin/ui/options.php:289
|
607 |
-
msgid "Display options"
|
608 |
-
msgstr "Optionen anzeigen"
|
609 |
-
|
610 |
-
#: ../inc/admin/ui/options.php:294 ../inc/admin/ui/options.php:299
|
611 |
-
msgid "Show Admin Bar menu"
|
612 |
-
msgstr "Toolbar-Menü anzeigen"
|
613 |
-
|
614 |
-
#: ../inc/admin/ui/options.php:300
|
615 |
-
msgid "I want this awesome quick access menu on my admin bar."
|
616 |
-
msgstr "Ich möchte dieses praktische Dropdown-Menü in meiner Toolbar."
|
617 |
-
|
618 |
-
#: ../inc/admin/ui/options.php:319
|
619 |
-
msgid "Save & Go to Bulk Optimizer"
|
620 |
-
msgstr "Speichern und zur Stapelverarbeitung gehen"
|
621 |
-
|
622 |
-
#: ../inc/admin/ui/options.php:328
|
623 |
-
#, php-format
|
624 |
-
msgid ""
|
625 |
-
"Once your settings saved, optimize all your images by using the %sImagify "
|
626 |
-
"Bulk Optimization%s feature."
|
627 |
-
msgstr ""
|
628 |
-
"Sobald du deine Einstellungen gespeichert hast, kannst du mit der "
|
629 |
-
"%sStapelverarbeitung%s alle deine Bilder optimieren."
|
630 |
-
|
631 |
-
#: ../inc/admin/ui/options.php:336
|
632 |
-
msgid "You can choose three levels of compression"
|
633 |
-
msgstr "Du kannst zwischen drei Komprimierungsstufen wählen."
|
634 |
-
|
635 |
-
#: ../inc/admin/ui/options.php:341
|
636 |
-
msgid ""
|
637 |
-
"This mode provides lossless optimization, your images will be optimized "
|
638 |
-
"without any visible change."
|
639 |
-
msgstr ""
|
640 |
-
"Dieser Modus sorgt für verlustfreie Bildoptimierung. Deine Bilder werden "
|
641 |
-
"ohne sichtbare Veränderungen optimiert."
|
642 |
-
|
643 |
-
#: ../inc/admin/ui/options.php:344
|
644 |
-
msgid ""
|
645 |
-
"If you want the perfect quality for your images, we recommend you that mode."
|
646 |
-
msgstr ""
|
647 |
-
"Wähle diese Einstellung, wenn dir die perfekte Qualität deiner Bilder "
|
648 |
-
"wichtig ist."
|
649 |
-
|
650 |
-
#: ../inc/admin/ui/options.php:347
|
651 |
-
msgid ""
|
652 |
-
"Note: the file size reduction will be less, compared to aggressive mode."
|
653 |
-
msgstr ""
|
654 |
-
"Hinweis: Die Verringerung der Dateigröße fällt hier geringer aus, als im "
|
655 |
-
"aggressiven Modus."
|
656 |
-
|
657 |
-
#: ../inc/admin/ui/options.php:354
|
658 |
-
msgid ""
|
659 |
-
"This mode provides perfect optimization of your images without any "
|
660 |
-
"significant quality loss."
|
661 |
-
msgstr ""
|
662 |
-
"Dieser Modus liefert hervorragende Optimierung ohne signifikante "
|
663 |
-
"Qualitätsverluste."
|
664 |
-
|
665 |
-
#: ../inc/admin/ui/options.php:357
|
666 |
-
msgid ""
|
667 |
-
"This will provide a drastic savings on the initial weight, with a small "
|
668 |
-
"reduction in image quality. Most of the time it's not even noticeable."
|
669 |
-
msgstr ""
|
670 |
-
"Die drastische Verringerung der Dateigröße geht mit geringfügigen, meist "
|
671 |
-
"kaum wahrnehmbaren Einbußen in der Qualität einher."
|
672 |
-
|
673 |
-
#: ../inc/admin/ui/options.php:360
|
674 |
-
msgid "If you want the maximum weight reduction, we recommend using this mode."
|
675 |
-
msgstr ""
|
676 |
-
"Wähle diese Einstellung, wenn du auf maximale Größenreduktion Wert legst."
|
677 |
-
|
678 |
-
#: ../inc/admin/ui/options.php:367
|
679 |
-
msgid ""
|
680 |
-
"This mode will apply all available optimizations for maximum image "
|
681 |
-
"compression."
|
682 |
-
msgstr ""
|
683 |
-
"Dieser Modus wendet alle verfügbaren Parameter für maximale Komprimierung an."
|
684 |
-
|
685 |
-
#: ../inc/admin/ui/options.php:370
|
686 |
-
msgid ""
|
687 |
-
"This will provide a huge savings on the initial weight. Sometimes the image "
|
688 |
-
"quality could be degraded a little."
|
689 |
-
msgstr ""
|
690 |
-
"Die Bildgröße wird erheblich verringert. In einigen Fällen kann es jedoch zu "
|
691 |
-
"Verlusten bei der Qualität kommen."
|
692 |
-
|
693 |
-
#: ../inc/admin/ui/options.php:373
|
694 |
-
msgid ""
|
695 |
-
"If you want the maximum weight reduction, and you agree to lose some quality "
|
696 |
-
"on the images we recommend using this mode."
|
697 |
-
msgstr ""
|
698 |
-
"Wähle diese Einstellung, wenn du bereit bist, etwas Qualität zugunsten "
|
699 |
-
"maximaler Reduktion der Dateigröße zu riskieren."
|
700 |
-
|
701 |
-
#: ../inc/admin/ui/options.php:380 ../inc/admin/ui/options.php:502
|
702 |
-
#: ../inc/functions/admin-ui.php:662 ../inc/functions/i18n.php:61
|
703 |
-
msgid "Close"
|
704 |
-
msgstr "Schließen"
|
705 |
-
|
706 |
-
#: ../inc/admin/ui/options.php:392
|
707 |
-
#, php-format
|
708 |
-
msgid "I want to compare%s and%s"
|
709 |
-
msgstr "Ich möchte %s und %s vergleichen."
|
710 |
-
|
711 |
-
#: ../inc/admin/ui/options.php:409
|
712 |
-
#, php-format
|
713 |
-
msgid "Original photography about %s"
|
714 |
-
msgstr "Originalbild ca. %s"
|
715 |
-
|
716 |
-
#: ../inc/admin/ui/options.php:414 ../inc/admin/ui/options.php:419
|
717 |
-
#: ../inc/admin/ui/options.php:424
|
718 |
-
#, php-format
|
719 |
-
msgid "Optimized photography about %s"
|
720 |
-
msgstr "Optimiertes Bild ca. %s"
|
721 |
-
|
722 |
-
#: ../inc/admin/ui/options.php:429 ../inc/admin/ui/options.php:439
|
723 |
-
#: ../inc/admin/ui/options.php:459 ../inc/admin/ui/options.php:480
|
724 |
-
#: ../inc/functions/admin-ui.php:59
|
725 |
-
msgid "Level:"
|
726 |
-
msgstr "Modus:"
|
727 |
-
|
728 |
-
#: ../inc/admin/ui/options.php:433 ../inc/admin/ui/options.php:443
|
729 |
-
#: ../inc/admin/ui/options.php:463 ../inc/admin/ui/options.php:484
|
730 |
-
#: ../inc/functions/i18n.php:62
|
731 |
-
msgid "File Size:"
|
732 |
-
msgstr "Dateigröße:"
|
733 |
-
|
734 |
-
#: ../inc/admin/ui/options.php:447 ../inc/admin/ui/options.php:467
|
735 |
-
#: ../inc/admin/ui/options.php:488 ../inc/functions/admin-ui.php:45
|
736 |
-
#: ../inc/functions/i18n.php:63
|
737 |
-
msgid "Original Saving:"
|
738 |
-
msgstr "Optimiert um:"
|
739 |
-
|
740 |
-
#: ../inc/admin/upload.php:42 ../inc/functions/i18n.php:81
|
741 |
-
msgid "Unoptimized"
|
742 |
-
msgstr "Nicht Optimiert"
|
743 |
-
|
744 |
-
#: ../inc/admin/upload.php:43
|
745 |
-
msgid "Errors"
|
746 |
-
msgstr "Fehler"
|
747 |
-
|
748 |
-
#: ../inc/admin/upload.php:46
|
749 |
-
msgid "Filter by status"
|
750 |
-
msgstr "Filtere nach Status"
|
751 |
-
|
752 |
-
#: ../inc/admin/upload.php:49
|
753 |
-
msgid "All images"
|
754 |
-
msgstr "Alle Bilder"
|
755 |
-
|
756 |
-
#: ../inc/classes/class-attachment.php:297
|
757 |
-
msgid ""
|
758 |
-
"This size isn't authorized to be optimized. Update your Imagify settings if "
|
759 |
-
"you want to optimize it."
|
760 |
-
msgstr ""
|
761 |
-
"Diese Bildgröße ist für die Optimierung nicht zugelassen. Aktualisiere deine "
|
762 |
-
"Imagify-Einstellungen, wenn du sie optimieren möchtest."
|
763 |
-
|
764 |
-
#: ../inc/common/admin-bar.php:48
|
765 |
-
#, php-format
|
766 |
-
msgid "Rate Imagify on %s"
|
767 |
-
msgstr "Bewerte Imagify auf %s"
|
768 |
-
|
769 |
-
#: ../inc/common/admin-bar.php:61
|
770 |
-
msgid "Loading..."
|
771 |
-
msgstr "Laden …"
|
772 |
-
|
773 |
-
#: ../inc/functions/admin-ui.php:36
|
774 |
-
msgid "New Filesize:"
|
775 |
-
msgstr "Neue Dateigröße:"
|
776 |
-
|
777 |
-
#: ../inc/functions/admin-ui.php:52
|
778 |
-
msgid "Close details"
|
779 |
-
msgstr "Details schließen"
|
780 |
-
|
781 |
-
#: ../inc/functions/admin-ui.php:52
|
782 |
-
msgid "View details"
|
783 |
-
msgstr "Details anzeigen"
|
784 |
-
|
785 |
-
#: ../inc/functions/admin-ui.php:56
|
786 |
-
msgid "Original Filesize:"
|
787 |
-
msgstr "Originale Dateigröße:"
|
788 |
-
|
789 |
-
#: ../inc/functions/admin-ui.php:62
|
790 |
-
msgid "Thumbnails Optimized:"
|
791 |
-
msgstr "Optimierte Vorschaubilder:"
|
792 |
-
|
793 |
-
#: ../inc/functions/admin-ui.php:63
|
794 |
-
msgid "Overall Saving:"
|
795 |
-
msgstr "Gesamte Ersparnis:"
|
796 |
-
|
797 |
-
#: ../inc/functions/admin-ui.php:80
|
798 |
-
msgid "Restoring..."
|
799 |
-
msgstr "Wiederherstellen …"
|
800 |
-
|
801 |
-
#: ../inc/functions/admin-ui.php:121
|
802 |
-
msgid "Try again"
|
803 |
-
msgstr "Erneut versuchen"
|
804 |
-
|
805 |
-
#: ../inc/functions/admin-ui.php:153 ../inc/functions/admin-ui.php:159
|
806 |
-
#: ../inc/functions/admin-ui.php:165
|
807 |
-
#, php-format
|
808 |
-
msgid "Re-Optimize to %s"
|
809 |
-
msgstr "Erneut optimieren als %s"
|
810 |
-
|
811 |
-
#: ../inc/functions/admin-ui.php:189
|
812 |
-
#, php-format
|
813 |
-
msgid "%s can't be optimized"
|
814 |
-
msgstr "%s kann nicht optimiert werden."
|
815 |
-
|
816 |
-
#: ../inc/functions/admin-ui.php:240
|
817 |
-
msgid "What plan do I need?"
|
818 |
-
msgstr ""
|
819 |
-
|
820 |
-
#: ../inc/functions/admin-ui.php:244
|
821 |
-
msgid "You're new to Imagify?"
|
822 |
-
msgstr ""
|
823 |
-
|
824 |
-
#: ../inc/functions/admin-ui.php:245
|
825 |
-
msgid ""
|
826 |
-
"Let us help you by analyzing your existing images and determinate the best "
|
827 |
-
"plan for you"
|
828 |
-
msgstr ""
|
829 |
-
|
830 |
-
#: ../inc/functions/admin-ui.php:280
|
831 |
-
msgid "Choose Plan"
|
832 |
-
msgstr ""
|
833 |
-
|
834 |
-
#: ../inc/functions/admin-ui.php:281
|
835 |
-
msgid "Payment Info"
|
836 |
-
msgstr ""
|
837 |
-
|
838 |
-
#: ../inc/functions/admin-ui.php:286
|
839 |
-
msgid "We analysed your images"
|
840 |
-
msgstr ""
|
841 |
-
|
842 |
-
#: ../inc/functions/admin-ui.php:292
|
843 |
-
#, php-format
|
844 |
-
msgid "You have %s images"
|
845 |
-
msgstr ""
|
846 |
-
|
847 |
-
#: ../inc/functions/admin-ui.php:298
|
848 |
-
#, php-format
|
849 |
-
msgid "You actually have %s of images in your library."
|
850 |
-
msgstr ""
|
851 |
-
|
852 |
-
#: ../inc/functions/admin-ui.php:302
|
853 |
-
#, php-format
|
854 |
-
msgid "You upload around %s of images per month."
|
855 |
-
msgstr ""
|
856 |
-
|
857 |
-
#: ../inc/functions/admin-ui.php:309
|
858 |
-
msgid "We recommend you this plan"
|
859 |
-
msgstr ""
|
860 |
-
|
861 |
-
#: ../inc/functions/admin-ui.php:314
|
862 |
-
msgid "Subscribe a monthly plan"
|
863 |
-
msgstr ""
|
864 |
-
|
865 |
-
#: ../inc/functions/admin-ui.php:315
|
866 |
-
msgid "Subscribe a yearly plan"
|
867 |
-
msgstr ""
|
868 |
-
|
869 |
-
#: ../inc/functions/admin-ui.php:319 ../inc/functions/admin-ui.php:455
|
870 |
-
#: ../inc/functions/admin-ui.php:623
|
871 |
-
msgid "Monthly"
|
872 |
-
msgstr ""
|
873 |
-
|
874 |
-
#: ../inc/functions/admin-ui.php:322 ../inc/functions/admin-ui.php:458
|
875 |
-
#: ../inc/functions/admin-ui.php:626
|
876 |
-
msgid "Yearly"
|
877 |
-
msgstr ""
|
878 |
-
|
879 |
-
#: ../inc/functions/admin-ui.php:322 ../inc/functions/admin-ui.php:458
|
880 |
-
#: ../inc/functions/admin-ui.php:626
|
881 |
-
msgid "2 months free"
|
882 |
-
msgstr ""
|
883 |
-
|
884 |
-
#: ../inc/functions/admin-ui.php:333 ../inc/functions/admin-ui.php:352
|
885 |
-
#: ../inc/functions/admin-ui.php:468 ../inc/functions/admin-ui.php:478
|
886 |
-
msgid "/month"
|
887 |
-
msgstr ""
|
888 |
-
|
889 |
-
#: ../inc/functions/admin-ui.php:335 ../inc/functions/admin-ui.php:383
|
890 |
-
#: ../inc/functions/admin-ui.php:470 ../inc/functions/admin-ui.php:521
|
891 |
-
#, php-format
|
892 |
-
msgid "approx: %s images"
|
893 |
-
msgstr ""
|
894 |
-
|
895 |
-
#: ../inc/functions/admin-ui.php:356 ../inc/functions/admin-ui.php:484
|
896 |
-
#, php-format
|
897 |
-
msgid ""
|
898 |
-
"%s per<br>\n"
|
899 |
-
"additionnal Gb"
|
900 |
-
msgstr ""
|
901 |
-
|
902 |
-
#: ../inc/functions/admin-ui.php:361 ../inc/functions/admin-ui.php:396
|
903 |
-
#: ../inc/functions/admin-ui.php:580 ../inc/functions/admin-ui.php:601
|
904 |
-
msgid "Choose another plan"
|
905 |
-
msgstr ""
|
906 |
-
|
907 |
-
#: ../inc/functions/admin-ui.php:371
|
908 |
-
msgid "Optimize the images you already have, buy a one-time plan"
|
909 |
-
msgstr ""
|
910 |
-
|
911 |
-
#: ../inc/functions/admin-ui.php:407
|
912 |
-
msgid "Checkout"
|
913 |
-
msgstr ""
|
914 |
-
|
915 |
-
#: ../inc/functions/admin-ui.php:411
|
916 |
-
msgid ""
|
917 |
-
"Monthly plans comes with credits which is renewed every months. The billing "
|
918 |
-
"happens automatically each month or year depending the billing period you "
|
919 |
-
"choose."
|
920 |
-
msgstr ""
|
921 |
-
|
922 |
-
#: ../inc/functions/admin-ui.php:435
|
923 |
-
msgid "Monthly Plans"
|
924 |
-
msgstr ""
|
925 |
-
|
926 |
-
#: ../inc/functions/admin-ui.php:440
|
927 |
-
msgid "One Time Plans"
|
928 |
-
msgstr ""
|
929 |
-
|
930 |
-
#: ../inc/functions/admin-ui.php:450
|
931 |
-
msgid ""
|
932 |
-
"Monthly plans come with credits which is renewed every months. The billing "
|
933 |
-
"happens automatically each month or year depending the billing period you "
|
934 |
-
"choose."
|
935 |
-
msgstr ""
|
936 |
-
|
937 |
-
#: ../inc/functions/admin-ui.php:482 ../inc/functions/admin-ui.php:529
|
938 |
-
msgid "we recommend for you"
|
939 |
-
msgstr ""
|
940 |
-
|
941 |
-
#: ../inc/functions/admin-ui.php:490 ../inc/functions/admin-ui.php:533
|
942 |
-
msgid "Choose plan"
|
943 |
-
msgstr ""
|
944 |
-
|
945 |
-
#: ../inc/functions/admin-ui.php:498
|
946 |
-
msgid "Need more?"
|
947 |
-
msgstr ""
|
948 |
-
|
949 |
-
#: ../inc/functions/admin-ui.php:499
|
950 |
-
msgid "for special needs"
|
951 |
-
msgstr ""
|
952 |
-
|
953 |
-
#: ../inc/functions/admin-ui.php:503
|
954 |
-
msgid "Contact Us"
|
955 |
-
msgstr ""
|
956 |
-
|
957 |
-
#: ../inc/functions/admin-ui.php:510
|
958 |
-
msgid ""
|
959 |
-
"One time plans are useful if you have a lots of existing images which need "
|
960 |
-
"to be optimized. You can use it for bulk optimizing all your past images. "
|
961 |
-
"You will pay only once."
|
962 |
-
msgstr ""
|
963 |
-
|
964 |
-
#: ../inc/functions/admin-ui.php:563
|
965 |
-
msgid "Your order"
|
966 |
-
msgstr ""
|
967 |
-
|
968 |
-
#: ../inc/functions/admin-ui.php:568
|
969 |
-
#, php-format
|
970 |
-
msgid "%scancel%sYou just removed %s"
|
971 |
-
msgstr ""
|
972 |
-
|
973 |
-
#: ../inc/functions/admin-ui.php:576 ../inc/functions/admin-ui.php:597
|
974 |
-
msgid "Remove this item"
|
975 |
-
msgstr ""
|
976 |
-
|
977 |
-
#: ../inc/functions/admin-ui.php:583
|
978 |
-
#, php-format
|
979 |
-
msgid "%s per month"
|
980 |
-
msgstr ""
|
981 |
-
|
982 |
-
#: ../inc/functions/admin-ui.php:604
|
983 |
-
#, php-format
|
984 |
-
msgid "one time %s"
|
985 |
-
msgstr ""
|
986 |
-
|
987 |
-
#: ../inc/functions/admin-ui.php:617
|
988 |
-
#, php-format
|
989 |
-
msgid ""
|
990 |
-
"Switch to yearly subscription and <br><strong class=\"imagify-dark\">save %s "
|
991 |
-
"per year!</strong>"
|
992 |
-
msgstr ""
|
993 |
-
|
994 |
-
#: ../inc/functions/admin-ui.php:618
|
995 |
-
#, php-format
|
996 |
-
msgid ""
|
997 |
-
"Perfect!<br>You're <strong class=\"imagify-dark\">saving %s per year!</"
|
998 |
-
"strong>"
|
999 |
-
msgstr ""
|
1000 |
-
|
1001 |
-
#: ../inc/functions/admin-ui.php:657
|
1002 |
-
msgid "Thank you for being awesome!"
|
1003 |
-
msgstr ""
|
1004 |
-
|
1005 |
-
#: ../inc/functions/admin-ui.php:668
|
1006 |
-
msgid "What do our user think about Imagify"
|
1007 |
-
msgstr ""
|
1008 |
-
|
1009 |
-
#: ../inc/functions/admin-ui.php:702
|
1010 |
-
msgid "Secure Credit Card Payment"
|
1011 |
-
msgstr ""
|
1012 |
-
|
1013 |
-
#: ../inc/functions/admin-ui.php:703
|
1014 |
-
msgid "This is secure 128-bits SSL encrypted payment"
|
1015 |
-
msgstr ""
|
1016 |
-
|
1017 |
-
#: ../inc/functions/i18n.php:20
|
1018 |
-
msgid "Let's get you started!"
|
1019 |
-
msgstr "Los geht’s!"
|
1020 |
-
|
1021 |
-
#: ../inc/functions/i18n.php:21
|
1022 |
-
msgid "Enter your email to get an API key:"
|
1023 |
-
msgstr "Gib deinen E-Mail-Adresse ein, um einen API-Schlüssel zu erhalten:"
|
1024 |
-
|
1025 |
-
#: ../inc/functions/i18n.php:22
|
1026 |
-
msgid "Sign Up"
|
1027 |
-
msgstr "Konto anlegen"
|
1028 |
-
|
1029 |
-
#: ../inc/functions/i18n.php:23
|
1030 |
-
msgid "You need to specify an email!"
|
1031 |
-
msgstr "Du musst eine E-Mail-Adresse angeben."
|
1032 |
-
|
1033 |
-
#: ../inc/functions/i18n.php:24 ../inc/functions/i18n.php:31
|
1034 |
-
msgid "Congratulations!"
|
1035 |
-
msgstr "Glückwunsch!"
|
1036 |
-
|
1037 |
-
#: ../inc/functions/i18n.php:25
|
1038 |
-
msgid ""
|
1039 |
-
"Your account has been succesfully created. Please check your mailbox, you "
|
1040 |
-
"are going to receive an email with API key."
|
1041 |
-
msgstr ""
|
1042 |
-
"Dein Konto ist jetzt angelegt. Überprüfe dein E-Mail-Postfach, du erhältst "
|
1043 |
-
"eine E-Mail mit deinem API-Schlüssel."
|
1044 |
-
|
1045 |
-
#: ../inc/functions/i18n.php:26
|
1046 |
-
msgid "Connect to Imagify!"
|
1047 |
-
msgstr "Verbindung zu Imagify herstellen"
|
1048 |
-
|
1049 |
-
#: ../inc/functions/i18n.php:27
|
1050 |
-
msgid "Paste your API key below:"
|
1051 |
-
msgstr "Füge deinen API-Schlüssel hier ein:"
|
1052 |
-
|
1053 |
-
#: ../inc/functions/i18n.php:28
|
1054 |
-
msgid "Connect me"
|
1055 |
-
msgstr "Verbinden"
|
1056 |
-
|
1057 |
-
#: ../inc/functions/i18n.php:29
|
1058 |
-
msgid "Check in progress..."
|
1059 |
-
msgstr "API-Schlüssel wird geprüft…"
|
1060 |
-
|
1061 |
-
#: ../inc/functions/i18n.php:30
|
1062 |
-
msgid "You need to specify your api key!"
|
1063 |
-
msgstr "Du musst einen API-Schlüssel angeben!"
|
1064 |
-
|
1065 |
-
#: ../inc/functions/i18n.php:32
|
1066 |
-
msgid ""
|
1067 |
-
"Your API key is valid. You can now configure the Imagify settings to "
|
1068 |
-
"optimize your images."
|
1069 |
-
msgstr ""
|
1070 |
-
"Dein API-Schlüssel ist gültig. Du kannst jetzt deine Einstellungen für die "
|
1071 |
-
"Bildoptimierung mit Imagify wählen."
|
1072 |
-
|
1073 |
-
#: ../inc/functions/i18n.php:34
|
1074 |
-
msgid "Cancel"
|
1075 |
-
msgstr ""
|
1076 |
-
|
1077 |
-
#: ../inc/functions/i18n.php:41
|
1078 |
-
msgid "Don't Need a Parachute?"
|
1079 |
-
msgstr "Du brauchst keinen Fallschirm?"
|
1080 |
-
|
1081 |
-
#: ../inc/functions/i18n.php:42
|
1082 |
-
msgid ""
|
1083 |
-
"If you keep this option deactivated, you won't be able to re-optimize your "
|
1084 |
-
"images to another compression level and restore your original images in case "
|
1085 |
-
"of need."
|
1086 |
-
msgstr ""
|
1087 |
-
"Wenn du diese Option deaktiviert lässt, wirst du deine Bilder nicht erneut "
|
1088 |
-
"mit einem anderen Level komprimieren, oder deren Originale wiederherstellen "
|
1089 |
-
"können."
|
1090 |
-
|
1091 |
-
#: ../inc/functions/i18n.php:58
|
1092 |
-
msgid "Original Image"
|
1093 |
-
msgstr "Originalbild"
|
1094 |
-
|
1095 |
-
#: ../inc/functions/i18n.php:59
|
1096 |
-
msgid "Optimized Image"
|
1097 |
-
msgstr "Optimiertes Bild"
|
1098 |
-
|
1099 |
-
#: ../inc/functions/i18n.php:73
|
1100 |
-
msgid "Please wait..."
|
1101 |
-
msgstr "Einen Moment bitte …"
|
1102 |
-
|
1103 |
-
#: ../inc/functions/i18n.php:74
|
1104 |
-
msgid ""
|
1105 |
-
"We are trying to get your unoptimized images, it may take time depending on "
|
1106 |
-
"the number of images."
|
1107 |
-
msgstr ""
|
1108 |
-
"Nicht optimierte Bilder werden gesammelt, dies kann einen Moment dauern "
|
1109 |
-
"…"
|
1110 |
-
|
1111 |
-
#: ../inc/functions/i18n.php:76
|
1112 |
-
msgid "Oops, There is something wrong!"
|
1113 |
-
msgstr "Hm, etwas ist schief gelaufen."
|
1114 |
-
|
1115 |
-
#: ../inc/functions/i18n.php:77
|
1116 |
-
msgid ""
|
1117 |
-
"An unknow error occurred when we tried to get all your unoptimized images. "
|
1118 |
-
"Try again and if the issue still persist, please contact us!"
|
1119 |
-
msgstr ""
|
1120 |
-
"Ein unbekannter Fehler ist beim Sammeln der nicht optimierten Bilder "
|
1121 |
-
"aufgetreten. Versuche es noch einmal; falls der Fehler sich wiederholt, "
|
1122 |
-
"kontaktiere bitte den Imagify-Support."
|
1123 |
-
|
1124 |
-
#: ../inc/functions/i18n.php:82
|
1125 |
-
msgid "Error"
|
1126 |
-
msgstr "Fehler"
|
1127 |
-
|
1128 |
-
#: ../inc/functions/i18n.php:85
|
1129 |
-
msgid "Hold on!"
|
1130 |
-
msgstr "Moment, bitte!"
|
1131 |
-
|
1132 |
-
#: ../inc/functions/i18n.php:86
|
1133 |
-
msgid "All your images have been optimized by Imagify. Congratulations!"
|
1134 |
-
msgstr "Imagify hat alle deine Bilder optimiert. Glückwunsch!"
|
1135 |
-
|
1136 |
-
#: ../inc/functions/i18n.php:88
|
1137 |
-
#, php-format
|
1138 |
-
msgid ""
|
1139 |
-
"Discover @imagify, the new compression tool to optimize your images for "
|
1140 |
-
"free. I saved %1$s out of %2$s!"
|
1141 |
-
msgstr ""
|
1142 |
-
"Freies #WordPress #Plugin zur Bildoptimierung für bessere #Performance: "
|
1143 |
-
"Bilder mit @imagify komprimiert, %1$s von %2$s gespart!"
|
1144 |
-
|
1145 |
-
#: ../inc/functions/i18n.php:92
|
1146 |
-
msgid "Imagify is still processing. Are you sure you want to leave this page?"
|
1147 |
-
msgstr ""
|
1148 |
-
"Imagify arbeitet noch. Möchtest du diese Seite wirklich verlassen und den "
|
1149 |
-
"Prozess abbrechen?"
|
1150 |
-
|
1151 |
-
#: ../inc/functions/i18n.php:101
|
1152 |
-
msgid "F j, Y"
|
1153 |
-
msgstr "j. F Y"
|
1154 |
-
|
1155 |
-
#: ../inc/functions/process.php:40
|
1156 |
-
msgid ""
|
1157 |
-
"Sorry, our servers are temporarily unaccessible. Please, try again in a "
|
1158 |
-
"couple of minutes."
|
1159 |
-
msgstr ""
|
1160 |
-
"Unsere Server sind leider im Augenblick nicht erreichbar. Bitte versuche es "
|
1161 |
-
"in ein paar Minuten noch einmal."
|
1162 |
-
|
1163 |
-
#: ../inc/functions/process.php:46
|
1164 |
-
msgid "External HTTP requests are blocked"
|
1165 |
-
msgstr "Externe HTTP-Anfragen werden blockiert"
|
1166 |
-
|
1167 |
-
#: ../inc/functions/process.php:52
|
1168 |
-
msgid "File path is empty"
|
1169 |
-
msgstr "Datei-Pfad ist leer"
|
1170 |
-
|
1171 |
-
#: ../inc/functions/process.php:58
|
1172 |
-
#, php-format
|
1173 |
-
msgid "Could not find %s"
|
1174 |
-
msgstr "%s wurde nicht gefunden"
|
1175 |
-
|
1176 |
-
#: ../inc/functions/process.php:63
|
1177 |
-
#, php-format
|
1178 |
-
msgid "%s is not writable"
|
1179 |
-
msgstr "%s ist nicht beschreibbar."
|
1180 |
-
|
1181 |
-
#: ../inc/functions/process.php:72
|
1182 |
-
#, php-format
|
1183 |
-
msgid "Skipped (%s), image not found."
|
1184 |
-
msgstr "Übersprungen (%s), Bild nicht gefunden."
|
1185 |
-
|
1186 |
-
#~ msgid "https://wordpress.org/plugins/imagify"
|
1187 |
-
#~ msgstr "https://de.wordpress.org/plugins/imagify"
|
1188 |
-
|
1189 |
-
#~ msgid ""
|
1190 |
-
#~ "Dramaticaly reduce image file sizes without loosing quality, make your "
|
1191 |
-
#~ "website load faster, boost your SEO and save money on your bandwith using "
|
1192 |
-
#~ "Imagify, the new most advanced image optimization tool."
|
1193 |
-
#~ msgstr ""
|
1194 |
-
#~ "Verlustfreie Bildoptimierung für WordPress. Imagify reduziert dramatisch "
|
1195 |
-
#~ "die Dateigröße deiner Bilder, macht deine Website schneller, verbessert "
|
1196 |
-
#~ "deine SEO und spart Bandbreite."
|
1197 |
-
|
1198 |
-
#~ msgid "Your default setting:"
|
1199 |
-
#~ msgstr "Deine Standard-Einstellung:"
|
1200 |
-
|
1201 |
-
#~ msgid ""
|
1202 |
-
#~ "All images which are over to %s could be optimized using the pro version."
|
1203 |
-
#~ msgstr "Bilder größer als %s können mit der Pro-version optimiert werden."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
languages/imagify-de_DE_formal.mo
DELETED
Binary file
|
languages/imagify-de_DE_formal.po
DELETED
@@ -1,1223 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: Imagify\n"
|
4 |
-
"Report-Msgid-Bugs-To: \n"
|
5 |
-
"POT-Creation-Date: 2016-09-23 11:14-0500\n"
|
6 |
-
"PO-Revision-Date: 2016-09-23 11:16-0500\n"
|
7 |
-
"Last-Translator: Rémy Perona <remperona@gmail.com>\n"
|
8 |
-
"Language-Team: \n"
|
9 |
-
"Language: de\n"
|
10 |
-
"MIME-Version: 1.0\n"
|
11 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
12 |
-
"Content-Transfer-Encoding: 8bit\n"
|
13 |
-
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
14 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
15 |
-
"X-Poedit-Basepath: .\n"
|
16 |
-
"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;"
|
17 |
-
"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;"
|
18 |
-
"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;"
|
19 |
-
"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;"
|
20 |
-
"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n"
|
21 |
-
"X-Generator: Poedit 1.6.4\n"
|
22 |
-
"X-Loco-Target-Locale: de_DE\n"
|
23 |
-
"X-Poedit-SearchPath-0: ..\n"
|
24 |
-
|
25 |
-
#: ../inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:20
|
26 |
-
#: ../inc/admin/ajax.php:123 ../inc/admin/meta-boxes.php:34
|
27 |
-
#: ../inc/functions/admin-ui.php:215 ../inc/functions/i18n.php:49
|
28 |
-
#: ../inc/functions/i18n.php:64
|
29 |
-
msgid "Optimize"
|
30 |
-
msgstr "Optimieren"
|
31 |
-
|
32 |
-
#: ../inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:21
|
33 |
-
#: ../inc/functions/admin-ui.php:80 ../inc/functions/i18n.php:50
|
34 |
-
msgid "Restore Original"
|
35 |
-
msgstr "Original wiederherstellen"
|
36 |
-
|
37 |
-
#: ../inc/3rd-party/nextgen-gallery/inc/admin/menu.php:16
|
38 |
-
#: ../inc/admin/menu.php:24 ../inc/admin/plugins.php:13
|
39 |
-
#: ../inc/admin/ui/bulk.php:81 ../inc/common/admin-bar.php:39
|
40 |
-
msgid "Bulk Optimization"
|
41 |
-
msgstr "Stapelverarbeitung"
|
42 |
-
|
43 |
-
#: ../inc/admin/ajax.php:123 ../inc/admin/meta-boxes.php:29
|
44 |
-
#: ../inc/functions/admin-ui.php:121 ../inc/functions/admin-ui.php:153
|
45 |
-
#: ../inc/functions/admin-ui.php:159 ../inc/functions/admin-ui.php:165
|
46 |
-
#: ../inc/functions/admin-ui.php:205 ../inc/functions/admin-ui.php:215
|
47 |
-
msgid "Optimizing..."
|
48 |
-
msgstr "Wird optimiert …"
|
49 |
-
|
50 |
-
#: ../inc/admin/ajax.php:507
|
51 |
-
msgid "Oops, It's almost over!"
|
52 |
-
msgstr "Hoppla, es wird langsam eng."
|
53 |
-
|
54 |
-
#: ../inc/admin/ajax.php:508
|
55 |
-
#, php-format
|
56 |
-
msgid ""
|
57 |
-
"You have almost used all your credit.%sDon't forget to upgrade your "
|
58 |
-
"subscription to continue optimizing your images."
|
59 |
-
msgstr ""
|
60 |
-
"In Kürze werden Sie Ihr Guthaben verbraucht haben.%sAktualisieren Sie Ihr "
|
61 |
-
"Abo, um Ihre Bilder auch in Zukunft zu optimieren."
|
62 |
-
|
63 |
-
#: ../inc/admin/ajax.php:509 ../inc/admin/ui/bulk.php:23
|
64 |
-
msgid "View My Subscription"
|
65 |
-
msgstr "Mein Abo ansehen"
|
66 |
-
|
67 |
-
#: ../inc/admin/ajax.php:517 ../inc/admin/ui/notices.php:258
|
68 |
-
#: ../inc/functions/i18n.php:84
|
69 |
-
msgid "Oops, It's Over!"
|
70 |
-
msgstr "Alles hat ein Ende…"
|
71 |
-
|
72 |
-
#: ../inc/admin/ajax.php:518 ../inc/admin/ui/notices.php:260
|
73 |
-
#: ../inc/functions/i18n.php:101
|
74 |
-
#, php-format
|
75 |
-
msgid ""
|
76 |
-
"You have consumed all your credit for this month. You will have <strong>%s "
|
77 |
-
"back on %s</strong>."
|
78 |
-
msgstr ""
|
79 |
-
"Sie haben Ihr Guthaben für diesen Monat aufgebraucht. <strong>%s</strong> "
|
80 |
-
"werden Ihnen am <strong>%s</strong> wieder zur Verfügung stehen."
|
81 |
-
|
82 |
-
#: ../inc/admin/ajax.php:519
|
83 |
-
msgid "Upgrade My Subscription"
|
84 |
-
msgstr "Mein Abo aktualisieren"
|
85 |
-
|
86 |
-
#: ../inc/admin/ajax.php:538 ../inc/admin/ui/bulk.php:17
|
87 |
-
msgid "Account status"
|
88 |
-
msgstr "Kontostatus"
|
89 |
-
|
90 |
-
#: ../inc/admin/ajax.php:539 ../inc/admin/ui/bulk.php:18
|
91 |
-
msgid "Your subscription:"
|
92 |
-
msgstr "Ihr Abo:"
|
93 |
-
|
94 |
-
#: ../inc/admin/ajax.php:547 ../inc/admin/ui/bulk.php:48
|
95 |
-
#, php-format
|
96 |
-
msgid "You have %s space credit left"
|
97 |
-
msgstr "Sie haben noch %s Guthaben"
|
98 |
-
|
99 |
-
#: ../inc/admin/ajax.php:559
|
100 |
-
msgid "View my subscription"
|
101 |
-
msgstr "Mein Abo ansehen"
|
102 |
-
|
103 |
-
#: ../inc/admin/media.php:63 ../inc/functions/i18n.php:60
|
104 |
-
msgid "Compare Original VS Optimized"
|
105 |
-
msgstr "Vergleiche Original mit optimiert"
|
106 |
-
|
107 |
-
#: ../inc/admin/meta-boxes.php:17 ../inc/admin/meta-boxes.php:24
|
108 |
-
#: ../inc/admin/upload.php:12
|
109 |
-
#, fuzzy
|
110 |
-
msgid "Imagify"
|
111 |
-
msgstr "Verbindung zu Imagify herstellen"
|
112 |
-
|
113 |
-
#: ../inc/admin/meta-boxes.php:19 ../inc/functions/admin-ui.php:195
|
114 |
-
msgid "Invalid API key"
|
115 |
-
msgstr "Ungültiger API-Schlüssel"
|
116 |
-
|
117 |
-
#: ../inc/admin/meta-boxes.php:21 ../inc/functions/admin-ui.php:197
|
118 |
-
msgid "Check your Settings"
|
119 |
-
msgstr "Überprüfen Sie Ihre Einstellungen"
|
120 |
-
|
121 |
-
#: ../inc/admin/options.php:119
|
122 |
-
msgid "Cheatin’ uh?"
|
123 |
-
msgstr "Ts, ts, ts …"
|
124 |
-
|
125 |
-
#: ../inc/admin/options.php:127
|
126 |
-
msgid "<strong>ERROR</strong>: options page not found."
|
127 |
-
msgstr "<strong>Fehler</strong>: Einstellungsseite nicht gefunden."
|
128 |
-
|
129 |
-
#: ../inc/admin/plugins.php:14 ../inc/admin/ui/options.php:74
|
130 |
-
#: ../inc/common/admin-bar.php:30
|
131 |
-
msgid "Settings"
|
132 |
-
msgstr "Einstellungen"
|
133 |
-
|
134 |
-
#: ../inc/admin/ui/bulk.php:60
|
135 |
-
msgid "Upgrade your account to continue optimizing your images"
|
136 |
-
msgstr "Aktualisiere dein Konto, um deine Bilder weiterhin zu optimieren"
|
137 |
-
|
138 |
-
#: ../inc/admin/ui/bulk.php:64
|
139 |
-
msgid "More info"
|
140 |
-
msgstr "Weitere Informationen"
|
141 |
-
|
142 |
-
#: ../inc/admin/ui/bulk.php:91
|
143 |
-
msgid "Overview"
|
144 |
-
msgstr "Übersicht"
|
145 |
-
|
146 |
-
#: ../inc/admin/ui/bulk.php:99
|
147 |
-
#, php-format
|
148 |
-
msgid "You optimized %s images of your website"
|
149 |
-
msgstr "Sie haben %s Bilder Ihrer Website optimiert"
|
150 |
-
|
151 |
-
#: ../inc/admin/ui/bulk.php:103
|
152 |
-
msgid "Statistics"
|
153 |
-
msgstr "Statistik"
|
154 |
-
|
155 |
-
#: ../inc/admin/ui/bulk.php:115
|
156 |
-
msgid "that's the number of images you optimized with Imagify"
|
157 |
-
msgstr "Bilder mit Imagify optimiert"
|
158 |
-
|
159 |
-
#: ../inc/admin/ui/bulk.php:120
|
160 |
-
msgid "Original size"
|
161 |
-
msgstr "Originalgröße"
|
162 |
-
|
163 |
-
#: ../inc/admin/ui/bulk.php:125
|
164 |
-
msgid "Optimized size"
|
165 |
-
msgstr "Optimierte Größe"
|
166 |
-
|
167 |
-
#: ../inc/admin/ui/bulk.php:136
|
168 |
-
#, php-format
|
169 |
-
msgid "that's the size you saved %sby using Imagify"
|
170 |
-
msgstr "geringere Dateigröße dank Imagify"
|
171 |
-
|
172 |
-
#: ../inc/admin/ui/bulk.php:142
|
173 |
-
msgid "Information"
|
174 |
-
msgstr "Informationen"
|
175 |
-
|
176 |
-
#: ../inc/admin/ui/bulk.php:146
|
177 |
-
msgid ""
|
178 |
-
"Please be aware that optimizing a large number of images can take a while "
|
179 |
-
"depending on your server and network speed."
|
180 |
-
msgstr ""
|
181 |
-
"Bitte beachten: Das Optimieren einer hohen Anzahl Bilder kann eine Weile "
|
182 |
-
"dauern, abhängig von Ihrem Server und der Netzwerkgeschwindigkeit."
|
183 |
-
|
184 |
-
#: ../inc/admin/ui/bulk.php:149
|
185 |
-
#, php-format
|
186 |
-
msgid ""
|
187 |
-
"If you have more than %s images, you will need to launch the bulk "
|
188 |
-
"optimization several times."
|
189 |
-
msgstr ""
|
190 |
-
|
191 |
-
#: ../inc/admin/ui/bulk.php:153
|
192 |
-
msgid ""
|
193 |
-
"You must keep this page open while the bulk optimizaton is processing. If "
|
194 |
-
"you leave you can come back to continue where it left off."
|
195 |
-
msgstr ""
|
196 |
-
"Sie müssen diese Seite während der Stapelverarbeitung geöffnet lassen. Falls "
|
197 |
-
"Sie sie doch schließen, wird die Stapelverarbeitung unterbrochen und später "
|
198 |
-
"fortgesetzt, sobald Sie diese Seite erneut aufrufen."
|
199 |
-
|
200 |
-
#: ../inc/admin/ui/bulk.php:164
|
201 |
-
msgid "Select Your Compression Level"
|
202 |
-
msgstr "Wählen Sie Ihre Komprimierungsstufen"
|
203 |
-
|
204 |
-
#: ../inc/admin/ui/bulk.php:166 ../inc/admin/ui/bulk.php:192
|
205 |
-
#: ../inc/admin/ui/options.php:136 ../inc/admin/ui/options.php:365
|
206 |
-
#: ../inc/admin/ui/options.php:404 ../inc/admin/ui/options.php:421
|
207 |
-
#: ../inc/admin/ui/options.php:481
|
208 |
-
#: ../inc/classes/abstracts/abstract-attachment.php:114
|
209 |
-
#: ../inc/functions/admin-ui.php:153
|
210 |
-
msgid "Ultra"
|
211 |
-
msgstr "Ultra"
|
212 |
-
|
213 |
-
#: ../inc/admin/ui/bulk.php:169 ../inc/admin/ui/bulk.php:187
|
214 |
-
#: ../inc/admin/ui/options.php:131 ../inc/admin/ui/options.php:352
|
215 |
-
#: ../inc/admin/ui/options.php:403 ../inc/admin/ui/options.php:416
|
216 |
-
#: ../inc/admin/ui/options.php:460
|
217 |
-
#: ../inc/classes/abstracts/abstract-attachment.php:117
|
218 |
-
#: ../inc/functions/admin-ui.php:159
|
219 |
-
msgid "Aggressive"
|
220 |
-
msgstr "Aggressiv"
|
221 |
-
|
222 |
-
#: ../inc/admin/ui/bulk.php:172 ../inc/admin/ui/bulk.php:182
|
223 |
-
#: ../inc/admin/ui/options.php:126 ../inc/admin/ui/options.php:339
|
224 |
-
#: ../inc/admin/ui/options.php:402 ../inc/admin/ui/options.php:411
|
225 |
-
#: ../inc/admin/ui/options.php:440
|
226 |
-
#: ../inc/classes/abstracts/abstract-attachment.php:120
|
227 |
-
#: ../inc/functions/admin-ui.php:165
|
228 |
-
msgid "Normal"
|
229 |
-
msgstr "Normal"
|
230 |
-
|
231 |
-
#: ../inc/admin/ui/bulk.php:176
|
232 |
-
#, php-format
|
233 |
-
msgid "Your default setting: %s"
|
234 |
-
msgstr "Ihre Standardeinstellung: %s"
|
235 |
-
|
236 |
-
#: ../inc/admin/ui/bulk.php:201
|
237 |
-
#, php-format
|
238 |
-
msgid "Don't forget to check %syour settings%s before bulk optimization."
|
239 |
-
msgstr "Überprüfen Sie Ihre %sEinstellungen%s vor der Stapelverarbeitung."
|
240 |
-
|
241 |
-
#: ../inc/admin/ui/bulk.php:208
|
242 |
-
msgid "Let's go!"
|
243 |
-
msgstr "Los geht’s!"
|
244 |
-
|
245 |
-
#: ../inc/admin/ui/bulk.php:215
|
246 |
-
msgid "Imagif'em all"
|
247 |
-
msgstr "Alle Bilder optimieren"
|
248 |
-
|
249 |
-
#: ../inc/admin/ui/bulk.php:220
|
250 |
-
#, php-format
|
251 |
-
msgid "All images greater than %s will be optimized when using a paid plan."
|
252 |
-
msgstr ""
|
253 |
-
"Alle Bilder größer als %s werden optimiert, wenn Sie einen bezahlten Tarif "
|
254 |
-
"nutzen."
|
255 |
-
|
256 |
-
#: ../inc/admin/ui/bulk.php:239
|
257 |
-
msgid "Well done!"
|
258 |
-
msgstr "Bravo!"
|
259 |
-
|
260 |
-
#: ../inc/admin/ui/bulk.php:240
|
261 |
-
#, php-format
|
262 |
-
msgid "you saved %1$s out of %2$s"
|
263 |
-
msgstr "Sie haben %1$s von %2$s gespart"
|
264 |
-
|
265 |
-
#: ../inc/admin/ui/bulk.php:245
|
266 |
-
msgid "Share your awesome result"
|
267 |
-
msgstr "Teilen Sie Ihr hervorragendes Ergebnis"
|
268 |
-
|
269 |
-
#: ../inc/admin/ui/bulk.php:260
|
270 |
-
msgid "Compression process results"
|
271 |
-
msgstr "Ergebnisse der Komprimierung"
|
272 |
-
|
273 |
-
#: ../inc/admin/ui/bulk.php:263
|
274 |
-
msgid "Filename"
|
275 |
-
msgstr "Dateiname"
|
276 |
-
|
277 |
-
#: ../inc/admin/ui/bulk.php:264
|
278 |
-
msgid "Status"
|
279 |
-
msgstr "Status"
|
280 |
-
|
281 |
-
#: ../inc/admin/ui/bulk.php:265 ../inc/admin/ui/options.php:401
|
282 |
-
#: ../inc/admin/ui/options.php:406 ../inc/admin/ui/options.php:430
|
283 |
-
msgid "Original"
|
284 |
-
msgstr "Original"
|
285 |
-
|
286 |
-
#: ../inc/admin/ui/bulk.php:266 ../inc/admin/upload.php:41
|
287 |
-
#: ../inc/functions/i18n.php:80
|
288 |
-
msgid "Optimized"
|
289 |
-
msgstr "Optimiert"
|
290 |
-
|
291 |
-
#: ../inc/admin/ui/bulk.php:267
|
292 |
-
msgid "Percentage"
|
293 |
-
msgstr "Prozent"
|
294 |
-
|
295 |
-
#: ../inc/admin/ui/bulk.php:268
|
296 |
-
msgid "Thumbnails optimized"
|
297 |
-
msgstr "Vorschaubilder optimiert"
|
298 |
-
|
299 |
-
#: ../inc/admin/ui/bulk.php:269
|
300 |
-
msgid "Overall saving"
|
301 |
-
msgstr "Gesamte Ersparnis"
|
302 |
-
|
303 |
-
#: ../inc/admin/ui/bulk.php:274
|
304 |
-
msgid "file"
|
305 |
-
msgstr "Datei"
|
306 |
-
|
307 |
-
#: ../inc/admin/ui/bulk.php:275
|
308 |
-
msgid "error"
|
309 |
-
msgstr "Fehler"
|
310 |
-
|
311 |
-
#: ../inc/admin/ui/bulk.php:276
|
312 |
-
msgid "Total:"
|
313 |
-
msgstr "Gesamt:"
|
314 |
-
|
315 |
-
#: ../inc/admin/ui/bulk.php:277
|
316 |
-
msgid "Gain:"
|
317 |
-
msgstr "Gewinn:"
|
318 |
-
|
319 |
-
#: ../inc/admin/ui/bulk.php:294
|
320 |
-
#, php-format
|
321 |
-
msgid "%sStart the bulk optimization%s"
|
322 |
-
msgstr "%sStapelverarbeitung starten%s"
|
323 |
-
|
324 |
-
#: ../inc/admin/ui/notices.php:24
|
325 |
-
msgid "Welcome to Imagify, the best way to easily optimize your images!"
|
326 |
-
msgstr "Willkommen bei Imagify, der smarten Bildoptimierung!"
|
327 |
-
|
328 |
-
#: ../inc/admin/ui/notices.php:26 ../inc/admin/ui/notices.php:92
|
329 |
-
#: ../inc/admin/ui/notices.php:186 ../inc/admin/ui/notices.php:223
|
330 |
-
#: ../inc/admin/ui/notices.php:263 ../inc/admin/ui/notices.php:370
|
331 |
-
msgid "Dismiss this notice"
|
332 |
-
msgstr "Diese Meldung verwerfen"
|
333 |
-
|
334 |
-
#: ../inc/admin/ui/notices.php:33
|
335 |
-
msgid "Create an Account"
|
336 |
-
msgstr "Konto anlegen"
|
337 |
-
|
338 |
-
#: ../inc/admin/ui/notices.php:34
|
339 |
-
msgid ""
|
340 |
-
"Don't have an Imagify account yet? Optimize your images by creating an "
|
341 |
-
"account in a few seconds!"
|
342 |
-
msgstr ""
|
343 |
-
"Registrieren Sie Ihr Konto bei Imagify (kostenfrei, dauert nur ein paar "
|
344 |
-
"Sekunden), um anschließend Ihre Bilder in WordPress zu optimieren."
|
345 |
-
|
346 |
-
#: ../inc/admin/ui/notices.php:37
|
347 |
-
msgid "Sign up, It's FREE!"
|
348 |
-
msgstr "Mein Konto kostenfrei anlegen"
|
349 |
-
|
350 |
-
#: ../inc/admin/ui/notices.php:43
|
351 |
-
msgid "Enter your API Key"
|
352 |
-
msgstr "API-Schlüssel eingeben"
|
353 |
-
|
354 |
-
#: ../inc/admin/ui/notices.php:44
|
355 |
-
#, php-format
|
356 |
-
msgid ""
|
357 |
-
"Save your API Key you have received by email or you can get it on your "
|
358 |
-
"%sImagify account page%s."
|
359 |
-
msgstr ""
|
360 |
-
"Aktivieren Sie Imagify mit Ihrem persönlichen API-Schlüssel, den Sie per E-"
|
361 |
-
"Mail erhalten haben. Sie können ihn auch jederzeit in Ihren "
|
362 |
-
"%sKontoeinstellungen%s abrufen."
|
363 |
-
|
364 |
-
#: ../inc/admin/ui/notices.php:47
|
365 |
-
msgid "I have my API key"
|
366 |
-
msgstr "Meinen API-Schlüssel eingeben"
|
367 |
-
|
368 |
-
#: ../inc/admin/ui/notices.php:53
|
369 |
-
msgid "Configure it"
|
370 |
-
msgstr "Einstellungen wählen"
|
371 |
-
|
372 |
-
#: ../inc/admin/ui/notices.php:54
|
373 |
-
msgid ""
|
374 |
-
"It’s almost done! You have just to configure your optimization settings."
|
375 |
-
msgstr ""
|
376 |
-
"Fast fertig! Wählen Sie nun Ihre Einstellungen für Imagify. Anschließend "
|
377 |
-
"können Sie alle Ihre Bilder von Imagify automatisch optimieren lassen."
|
378 |
-
|
379 |
-
#: ../inc/admin/ui/notices.php:55
|
380 |
-
msgid "Go to Settings"
|
381 |
-
msgstr "Meine Einstellungen wählen"
|
382 |
-
|
383 |
-
#: ../inc/admin/ui/notices.php:87 ../inc/admin/ui/options.php:97
|
384 |
-
#: ../inc/functions/i18n.php:78
|
385 |
-
msgid "Your API key isn't valid!"
|
386 |
-
msgstr "Ihr API-Schlüssel ist ungültig."
|
387 |
-
|
388 |
-
#: ../inc/admin/ui/notices.php:90
|
389 |
-
#, php-format
|
390 |
-
msgid ""
|
391 |
-
"Go to your Imagify account page to get your API Key and specify it on "
|
392 |
-
"%1$syour settings%3$s or %2$screate an account for free%3$s if you don't "
|
393 |
-
"have one yet."
|
394 |
-
msgstr ""
|
395 |
-
"Sie finden Ihren API-Schlüssel in Ihrem Imagify-Konto. Sobald Sie ihn dort "
|
396 |
-
"geholt haben, %1$shinterlegen Sie ihn in Ihren Einstellungen%3$s. Oder "
|
397 |
-
"%2$slegen Sie kostenfrei ein Konto an%3$s, um einen API-Schlüssel zu "
|
398 |
-
"erhalten."
|
399 |
-
|
400 |
-
#: ../inc/admin/ui/notices.php:142
|
401 |
-
msgid ""
|
402 |
-
"The following plugins are not compatible with this plugin and may cause "
|
403 |
-
"unexpected results:"
|
404 |
-
msgstr ""
|
405 |
-
"Die folgenden Plugins sind nicht kompatibel mit diesem Plugin und können "
|
406 |
-
"unerwartete Ergebnisse verursachen:"
|
407 |
-
|
408 |
-
#: ../inc/admin/ui/notices.php:148
|
409 |
-
msgid "Deactivate"
|
410 |
-
msgstr "Deaktivieren"
|
411 |
-
|
412 |
-
#: ../inc/admin/ui/notices.php:178
|
413 |
-
msgid "The external HTTP requests are blocked!"
|
414 |
-
msgstr "Externe HTTP-Anfragen werden blockiert."
|
415 |
-
|
416 |
-
#: ../inc/admin/ui/notices.php:179
|
417 |
-
msgid ""
|
418 |
-
"You defined the <code>WP_HTTP_BLOCK_EXTERNAL</code> constant in the <code>wp-"
|
419 |
-
"config.php</code> to block all external HTTP requests."
|
420 |
-
msgstr ""
|
421 |
-
"Alle externen HTTP-Anfragen werden blockiert, weil in der Datei <em>wp-"
|
422 |
-
"config.php</em> die PHP-Konstante <code>WP_HTTP_BLOCK_EXTERNAL</code> "
|
423 |
-
"gesetzt ist.\n"
|
424 |
-
|
425 |
-
#: ../inc/admin/ui/notices.php:181
|
426 |
-
msgid ""
|
427 |
-
"To optimize your images, you have to put the following code in your <code>wp-"
|
428 |
-
"config.php</code> file so that it works correctly."
|
429 |
-
msgstr ""
|
430 |
-
"Um Ihre Bilder optimieren zu können, fügen Sie den folgenden Code zu Ihrer "
|
431 |
-
"<em>wp-config.php</em> hinzu."
|
432 |
-
|
433 |
-
#: ../inc/admin/ui/notices.php:182
|
434 |
-
msgid "Click on the field and press Ctrl-A to select all."
|
435 |
-
msgstr ""
|
436 |
-
"Klicken Sie auf das Feld und drücken Sie ctrl+A (cmd+A) für Alles auswählen."
|
437 |
-
|
438 |
-
#: ../inc/admin/ui/notices.php:219
|
439 |
-
msgid "You're missing out!"
|
440 |
-
msgstr "Sie verpassen etwas!"
|
441 |
-
|
442 |
-
#: ../inc/admin/ui/notices.php:220
|
443 |
-
msgid "Use the List view to optimize images with Imagify."
|
444 |
-
msgstr "In der Listenansicht können Sie Ihre Bilder direkt zu optimieren."
|
445 |
-
|
446 |
-
#: ../inc/admin/ui/notices.php:221
|
447 |
-
msgid "Switch to the List View"
|
448 |
-
msgstr "Zur Listenansicht wechseln"
|
449 |
-
|
450 |
-
#: ../inc/admin/ui/notices.php:260 ../inc/functions/i18n.php:98
|
451 |
-
#: ../inc/functions/i18n.php:101
|
452 |
-
#, php-format
|
453 |
-
msgid ""
|
454 |
-
"To continue to optimize your images, log in to your Imagify account to %sbuy "
|
455 |
-
"a pack or subscribe to a plan%s."
|
456 |
-
msgstr ""
|
457 |
-
"Um Ihre Bilder auch in Zukunft zu optimieren, loggen Sie sich bei Imagify.io "
|
458 |
-
"ein und %skaufen Sie ein einmaliges Guthaben oder ein Abo%s."
|
459 |
-
|
460 |
-
#: ../inc/admin/ui/notices.php:314 ../inc/admin/ui/options.php:28
|
461 |
-
msgid "Discover the best caching plugin to speed up your website."
|
462 |
-
msgstr ""
|
463 |
-
"Entdecken Sie das beste Caching-Plugin, um Ihre Website schneller zu machen."
|
464 |
-
|
465 |
-
#: ../inc/admin/ui/notices.php:317 ../inc/admin/ui/options.php:36
|
466 |
-
#, php-format
|
467 |
-
msgid "%sGet %s off%s with this coupon code:%s"
|
468 |
-
msgstr "%sErhalten Sie %s Rabatt%s mit diesem Gutschein-Code:%s"
|
469 |
-
|
470 |
-
#: ../inc/admin/ui/notices.php:326 ../inc/admin/ui/options.php:41
|
471 |
-
msgid "Get WP Rocket now"
|
472 |
-
msgstr "Holen Sie sich WP Rocket jetzt"
|
473 |
-
|
474 |
-
#: ../inc/admin/ui/notices.php:363
|
475 |
-
#, php-format
|
476 |
-
msgid ""
|
477 |
-
"%1$sCongratulations%2$s, you have optimized %1$s%3$d images%2$s and improved "
|
478 |
-
"your website's speed by reducing your images size."
|
479 |
-
msgstr ""
|
480 |
-
|
481 |
-
#: ../inc/admin/ui/notices.php:365 ../inc/admin/ui/options.php:59
|
482 |
-
#, php-format
|
483 |
-
msgid ""
|
484 |
-
"%sDo you like this plugin?%s Please take a few seconds to %srate it on "
|
485 |
-
"WordPress.org%s!"
|
486 |
-
msgstr ""
|
487 |
-
"%sSind Sie zufrieden mit diesem Plugin?%s Bitte nehmen Sie sich einen Moment "
|
488 |
-
"Zeit für eine %sBewertung auf WordPress.org%s!"
|
489 |
-
|
490 |
-
#: ../inc/admin/ui/options.php:22
|
491 |
-
msgid "Is your website too slow?"
|
492 |
-
msgstr "Ist Ihre Website zu langsam?"
|
493 |
-
|
494 |
-
#: ../inc/admin/ui/options.php:84
|
495 |
-
msgid "API Key"
|
496 |
-
msgstr "API-Schlüssel"
|
497 |
-
|
498 |
-
#: ../inc/admin/ui/options.php:91 ../inc/functions/i18n.php:33
|
499 |
-
msgid "Your API key is valid."
|
500 |
-
msgstr "Ihr API-Schlüssel ist gültig."
|
501 |
-
|
502 |
-
#: ../inc/admin/ui/options.php:104
|
503 |
-
#, php-format
|
504 |
-
msgid "Don't have an API Key yet? %sCreate one, it's FREE%s."
|
505 |
-
msgstr "Noch keinen API-Schlüssel erhalten? %sJetzt kostenfrei Konto anlegen%s"
|
506 |
-
|
507 |
-
#: ../inc/admin/ui/options.php:121
|
508 |
-
msgid "Optimization Level"
|
509 |
-
msgstr "Optimierungsgrad"
|
510 |
-
|
511 |
-
#: ../inc/admin/ui/options.php:141
|
512 |
-
msgid "More info?"
|
513 |
-
msgstr "Was ist das?"
|
514 |
-
|
515 |
-
#: ../inc/admin/ui/options.php:148
|
516 |
-
#, php-format
|
517 |
-
msgid "Need help to choose? %sTry the Visual Comparison%s"
|
518 |
-
msgstr "Nicht sicher? %sVisuellen Vergleich ausprobieren%s"
|
519 |
-
|
520 |
-
#: ../inc/admin/ui/options.php:157 ../inc/admin/ui/options.php:161
|
521 |
-
msgid "Auto-Optimize images on upload"
|
522 |
-
msgstr "Bilder beim Hochladen automatisch optimieren"
|
523 |
-
|
524 |
-
#: ../inc/admin/ui/options.php:165
|
525 |
-
msgid "Automatically optimize every image you upload to WordPress."
|
526 |
-
msgstr ""
|
527 |
-
"Lassen Sie jedes Bild automatisch optimieren, das Sie in WordPress hochladen."
|
528 |
-
|
529 |
-
#: ../inc/admin/ui/options.php:170 ../inc/admin/ui/options.php:173
|
530 |
-
msgid "Backup original images"
|
531 |
-
msgstr "Originalbilder sichern"
|
532 |
-
|
533 |
-
#: ../inc/admin/ui/options.php:177
|
534 |
-
msgid ""
|
535 |
-
"Keep your original images in a separate folder before optimization process."
|
536 |
-
msgstr ""
|
537 |
-
"Speichern Sie Sicherungskopien Ihrer Originalbilder in einem separaten "
|
538 |
-
"Ordner, bevor die Optimierung beginnt."
|
539 |
-
|
540 |
-
#: ../inc/admin/ui/options.php:182 ../inc/admin/ui/options.php:185
|
541 |
-
msgid "Resize larger images"
|
542 |
-
msgstr "Große Bilder verkleinern"
|
543 |
-
|
544 |
-
#: ../inc/admin/ui/options.php:191
|
545 |
-
#, php-format
|
546 |
-
msgid "to maximum %s pixels width"
|
547 |
-
msgstr "auf maximal %s Pixel Breite"
|
548 |
-
|
549 |
-
#: ../inc/admin/ui/options.php:202
|
550 |
-
#, php-format
|
551 |
-
msgid ""
|
552 |
-
"This option is recommended to reduce larger images. You can save up to 80%% "
|
553 |
-
"after resizing. The new width should not be less than your largest thumbnail "
|
554 |
-
"width, which is actually %spx."
|
555 |
-
msgstr ""
|
556 |
-
"Diese Option ist empfehlenswert, um das Speichervolumen für größere Bilder "
|
557 |
-
"zu reduzieren. Sie könne so bis zu 80%% Speicherplatz sparen. Die neue "
|
558 |
-
"Breite sollte nicht geringer als Ihre größte Vorschaubildbreite sein, die "
|
559 |
-
"übrigens %s Pixel beträgt."
|
560 |
-
|
561 |
-
#: ../inc/admin/ui/options.php:209 ../inc/admin/ui/options.php:212
|
562 |
-
msgid "EXIF Data"
|
563 |
-
msgstr "EXIF-Daten"
|
564 |
-
|
565 |
-
#: ../inc/admin/ui/options.php:216
|
566 |
-
msgid ""
|
567 |
-
"Keep all EXIF data from your images. EXIF are informations stored in your "
|
568 |
-
"pictures like shutter speed, exposure compensation, ISO, etc..."
|
569 |
-
msgstr ""
|
570 |
-
"Behalten Sie alle EXIF-Daten Ihrer Bilder. In den EXIF-Daten werden "
|
571 |
-
"Informationen wie Verschlusszeit, Belichtungskorrektur, ISO-Wert usw. "
|
572 |
-
"gespeichert."
|
573 |
-
|
574 |
-
#: ../inc/admin/ui/options.php:217
|
575 |
-
msgid "Learn more"
|
576 |
-
msgstr "Weitere Informationen"
|
577 |
-
|
578 |
-
#: ../inc/admin/ui/options.php:219
|
579 |
-
msgid ""
|
580 |
-
"If you are a photographer, you may be interested in this option if you are "
|
581 |
-
"displaying on your pages some info like the model of your camera."
|
582 |
-
msgstr ""
|
583 |
-
"Aktiviere diese Option, wenn Sie auf Ihrer Site fototechnische "
|
584 |
-
"Informationen, wie z.B. das Model Ihrer Kamera, anzeigen möchtest."
|
585 |
-
|
586 |
-
#: ../inc/admin/ui/options.php:228
|
587 |
-
msgid "Files optimization"
|
588 |
-
msgstr "Dateioptimierung"
|
589 |
-
|
590 |
-
#: ../inc/admin/ui/options.php:231
|
591 |
-
msgid ""
|
592 |
-
"You can choose to compress different image sizes created by WordPress here."
|
593 |
-
msgstr ""
|
594 |
-
"Hier können Sie die Komprimierung für die verschiedenen Bildgrößen "
|
595 |
-
"kontrollieren, die Ihr WordPress generiert."
|
596 |
-
|
597 |
-
#: ../inc/admin/ui/options.php:233
|
598 |
-
#, php-format
|
599 |
-
msgid "The %soriginal size%s is %sautomatically optimized%s by Imagify."
|
600 |
-
msgstr "Die %sOriginalgröße%s wird von Imagify %sautomatisch optimiert%s."
|
601 |
-
|
602 |
-
#: ../inc/admin/ui/options.php:236
|
603 |
-
msgid ""
|
604 |
-
"Remember each additional image size will affect your Imagify monthly usage!"
|
605 |
-
msgstr ""
|
606 |
-
"Bedenken Sie, dass jede ausgewählte Bildgröße Ihr monatliches "
|
607 |
-
"Nutzungsvolumen bei Imagify beeinflusst."
|
608 |
-
|
609 |
-
#: ../inc/admin/ui/options.php:289
|
610 |
-
msgid "Display options"
|
611 |
-
msgstr "Optionen anzeigen"
|
612 |
-
|
613 |
-
#: ../inc/admin/ui/options.php:294 ../inc/admin/ui/options.php:299
|
614 |
-
msgid "Show Admin Bar menu"
|
615 |
-
msgstr "Toolbar-Menü anzeigen"
|
616 |
-
|
617 |
-
#: ../inc/admin/ui/options.php:300
|
618 |
-
msgid "I want this awesome quick access menu on my admin bar."
|
619 |
-
msgstr "Ich möchte dieses praktische Dropdown-Menü in meiner Toolbar."
|
620 |
-
|
621 |
-
#: ../inc/admin/ui/options.php:319
|
622 |
-
msgid "Save & Go to Bulk Optimizer"
|
623 |
-
msgstr "Speichern und zur Stapelverarbeitung gehen"
|
624 |
-
|
625 |
-
#: ../inc/admin/ui/options.php:328
|
626 |
-
#, php-format
|
627 |
-
msgid ""
|
628 |
-
"Once your settings saved, optimize all your images by using the %sImagify "
|
629 |
-
"Bulk Optimization%s feature."
|
630 |
-
msgstr ""
|
631 |
-
"Sobald Sie Ihre Einstellungen gespeichert haben, können Sie mit der "
|
632 |
-
"%sStapelverarbeitung%s alle Ihre Bilder optimieren."
|
633 |
-
|
634 |
-
#: ../inc/admin/ui/options.php:336
|
635 |
-
msgid "You can choose three levels of compression"
|
636 |
-
msgstr "Sie können zwischen drei Komprimierungsstufen wählen."
|
637 |
-
|
638 |
-
#: ../inc/admin/ui/options.php:341
|
639 |
-
msgid ""
|
640 |
-
"This mode provides lossless optimization, your images will be optimized "
|
641 |
-
"without any visible change."
|
642 |
-
msgstr ""
|
643 |
-
"Dieser Modus sorgt für verlustfreie Bildoptimierung. Ihre Bilder werden ohne "
|
644 |
-
"sichtbare Veränderungen optimiert."
|
645 |
-
|
646 |
-
#: ../inc/admin/ui/options.php:344
|
647 |
-
msgid ""
|
648 |
-
"If you want the perfect quality for your images, we recommend you that mode."
|
649 |
-
msgstr ""
|
650 |
-
"Wählen Sie diese Einstellung, wenn Ihnen die perfekte Qualität Ihrer Bilder "
|
651 |
-
"wichtig ist."
|
652 |
-
|
653 |
-
#: ../inc/admin/ui/options.php:347
|
654 |
-
msgid ""
|
655 |
-
"Note: the file size reduction will be less, compared to aggressive mode."
|
656 |
-
msgstr ""
|
657 |
-
"Hinweis: Die Verringerung der Dateigröße fällt hier geringer aus, als im "
|
658 |
-
"aggressiven Modus."
|
659 |
-
|
660 |
-
#: ../inc/admin/ui/options.php:354
|
661 |
-
msgid ""
|
662 |
-
"This mode provides perfect optimization of your images without any "
|
663 |
-
"significant quality loss."
|
664 |
-
msgstr ""
|
665 |
-
"Dieser Modus liefert hervorragende Optimierung ohne signifikante "
|
666 |
-
"Qualitätsverluste."
|
667 |
-
|
668 |
-
#: ../inc/admin/ui/options.php:357
|
669 |
-
msgid ""
|
670 |
-
"This will provide a drastic savings on the initial weight, with a small "
|
671 |
-
"reduction in image quality. Most of the time it's not even noticeable."
|
672 |
-
msgstr ""
|
673 |
-
"Die drastische Verringerung der Dateigröße geht mit geringfügigen, meist "
|
674 |
-
"kaum wahrnehmbaren Einbußen in der Qualität einher."
|
675 |
-
|
676 |
-
#: ../inc/admin/ui/options.php:360
|
677 |
-
msgid "If you want the maximum weight reduction, we recommend using this mode."
|
678 |
-
msgstr ""
|
679 |
-
"Wählen Sie diese Einstellung, wenn Sie auf maximale Größenreduktion Wert "
|
680 |
-
"legen."
|
681 |
-
|
682 |
-
#: ../inc/admin/ui/options.php:367
|
683 |
-
msgid ""
|
684 |
-
"This mode will apply all available optimizations for maximum image "
|
685 |
-
"compression."
|
686 |
-
msgstr ""
|
687 |
-
"Dieser Modus wendet alle verfügbaren Parameter für maximale Komprimierung an."
|
688 |
-
|
689 |
-
#: ../inc/admin/ui/options.php:370
|
690 |
-
msgid ""
|
691 |
-
"This will provide a huge savings on the initial weight. Sometimes the image "
|
692 |
-
"quality could be degraded a little."
|
693 |
-
msgstr ""
|
694 |
-
"Die Bildgröße wird erheblich verringert. In einigen Fällen kann es jedoch zu "
|
695 |
-
"Verlusten bei der Qualität kommen."
|
696 |
-
|
697 |
-
#: ../inc/admin/ui/options.php:373
|
698 |
-
msgid ""
|
699 |
-
"If you want the maximum weight reduction, and you agree to lose some quality "
|
700 |
-
"on the images we recommend using this mode."
|
701 |
-
msgstr ""
|
702 |
-
"Wählen Sie diese Einstellung, wenn Sie bereit sind, etwas Qualität zugunsten "
|
703 |
-
"maximaler Reduktion der Dateigröße zu riskieren."
|
704 |
-
|
705 |
-
#: ../inc/admin/ui/options.php:380 ../inc/admin/ui/options.php:502
|
706 |
-
#: ../inc/functions/admin-ui.php:662 ../inc/functions/i18n.php:61
|
707 |
-
msgid "Close"
|
708 |
-
msgstr "Schließen"
|
709 |
-
|
710 |
-
#: ../inc/admin/ui/options.php:392
|
711 |
-
#, php-format
|
712 |
-
msgid "I want to compare%s and%s"
|
713 |
-
msgstr "Ich möchte %s und %s vergleichen."
|
714 |
-
|
715 |
-
#: ../inc/admin/ui/options.php:409
|
716 |
-
#, php-format
|
717 |
-
msgid "Original photography about %s"
|
718 |
-
msgstr "Originalbild ca. %s"
|
719 |
-
|
720 |
-
#: ../inc/admin/ui/options.php:414 ../inc/admin/ui/options.php:419
|
721 |
-
#: ../inc/admin/ui/options.php:424
|
722 |
-
#, php-format
|
723 |
-
msgid "Optimized photography about %s"
|
724 |
-
msgstr "Optimiertes Bild ca. %s"
|
725 |
-
|
726 |
-
#: ../inc/admin/ui/options.php:429 ../inc/admin/ui/options.php:439
|
727 |
-
#: ../inc/admin/ui/options.php:459 ../inc/admin/ui/options.php:480
|
728 |
-
#: ../inc/functions/admin-ui.php:59
|
729 |
-
msgid "Level:"
|
730 |
-
msgstr "Modus:"
|
731 |
-
|
732 |
-
#: ../inc/admin/ui/options.php:433 ../inc/admin/ui/options.php:443
|
733 |
-
#: ../inc/admin/ui/options.php:463 ../inc/admin/ui/options.php:484
|
734 |
-
#: ../inc/functions/i18n.php:62
|
735 |
-
msgid "File Size:"
|
736 |
-
msgstr "Dateigröße:"
|
737 |
-
|
738 |
-
#: ../inc/admin/ui/options.php:447 ../inc/admin/ui/options.php:467
|
739 |
-
#: ../inc/admin/ui/options.php:488 ../inc/functions/admin-ui.php:45
|
740 |
-
#: ../inc/functions/i18n.php:63
|
741 |
-
msgid "Original Saving:"
|
742 |
-
msgstr "Optimiert um:"
|
743 |
-
|
744 |
-
#: ../inc/admin/upload.php:42 ../inc/functions/i18n.php:81
|
745 |
-
msgid "Unoptimized"
|
746 |
-
msgstr "Nicht Optimiert"
|
747 |
-
|
748 |
-
#: ../inc/admin/upload.php:43
|
749 |
-
msgid "Errors"
|
750 |
-
msgstr "Fehler"
|
751 |
-
|
752 |
-
#: ../inc/admin/upload.php:46
|
753 |
-
msgid "Filter by status"
|
754 |
-
msgstr "Filtere nach Status"
|
755 |
-
|
756 |
-
#: ../inc/admin/upload.php:49
|
757 |
-
msgid "All images"
|
758 |
-
msgstr "Alle Bilder"
|
759 |
-
|
760 |
-
#: ../inc/classes/class-attachment.php:297
|
761 |
-
msgid ""
|
762 |
-
"This size isn't authorized to be optimized. Update your Imagify settings if "
|
763 |
-
"you want to optimize it."
|
764 |
-
msgstr ""
|
765 |
-
"Diese Bildgröße ist für die Optimierung nicht zugelassen. Aktualisieren Sie "
|
766 |
-
"Ihre Imagify-Einstellungen, wenn Sie sie optimieren möchten."
|
767 |
-
|
768 |
-
#: ../inc/common/admin-bar.php:48
|
769 |
-
#, php-format
|
770 |
-
msgid "Rate Imagify on %s"
|
771 |
-
msgstr "Bewerten Sie Imagify auf %s"
|
772 |
-
|
773 |
-
#: ../inc/common/admin-bar.php:61
|
774 |
-
msgid "Loading..."
|
775 |
-
msgstr "Laden …"
|
776 |
-
|
777 |
-
#: ../inc/functions/admin-ui.php:36
|
778 |
-
msgid "New Filesize:"
|
779 |
-
msgstr "Neue Dateigröße:"
|
780 |
-
|
781 |
-
#: ../inc/functions/admin-ui.php:52
|
782 |
-
msgid "Close details"
|
783 |
-
msgstr "Details schließen"
|
784 |
-
|
785 |
-
#: ../inc/functions/admin-ui.php:52
|
786 |
-
msgid "View details"
|
787 |
-
msgstr "Details anzeigen"
|
788 |
-
|
789 |
-
#: ../inc/functions/admin-ui.php:56
|
790 |
-
msgid "Original Filesize:"
|
791 |
-
msgstr "Originale Dateigröße:"
|
792 |
-
|
793 |
-
#: ../inc/functions/admin-ui.php:62
|
794 |
-
msgid "Thumbnails Optimized:"
|
795 |
-
msgstr "Optimierte Vorschaubilder:"
|
796 |
-
|
797 |
-
#: ../inc/functions/admin-ui.php:63
|
798 |
-
msgid "Overall Saving:"
|
799 |
-
msgstr "Gesamte Ersparnis:"
|
800 |
-
|
801 |
-
#: ../inc/functions/admin-ui.php:80
|
802 |
-
msgid "Restoring..."
|
803 |
-
msgstr "Wiederherstellen …"
|
804 |
-
|
805 |
-
#: ../inc/functions/admin-ui.php:121
|
806 |
-
msgid "Try again"
|
807 |
-
msgstr "Erneut versuchen"
|
808 |
-
|
809 |
-
#: ../inc/functions/admin-ui.php:153 ../inc/functions/admin-ui.php:159
|
810 |
-
#: ../inc/functions/admin-ui.php:165
|
811 |
-
#, php-format
|
812 |
-
msgid "Re-Optimize to %s"
|
813 |
-
msgstr "Erneut optimieren als %s"
|
814 |
-
|
815 |
-
#: ../inc/functions/admin-ui.php:189
|
816 |
-
#, php-format
|
817 |
-
msgid "%s can't be optimized"
|
818 |
-
msgstr "%s kann nicht optimiert werden."
|
819 |
-
|
820 |
-
#: ../inc/functions/admin-ui.php:240
|
821 |
-
msgid "What plan do I need?"
|
822 |
-
msgstr ""
|
823 |
-
|
824 |
-
#: ../inc/functions/admin-ui.php:244
|
825 |
-
msgid "You're new to Imagify?"
|
826 |
-
msgstr ""
|
827 |
-
|
828 |
-
#: ../inc/functions/admin-ui.php:245
|
829 |
-
msgid ""
|
830 |
-
"Let us help you by analyzing your existing images and determinate the best "
|
831 |
-
"plan for you"
|
832 |
-
msgstr ""
|
833 |
-
|
834 |
-
#: ../inc/functions/admin-ui.php:280
|
835 |
-
msgid "Choose Plan"
|
836 |
-
msgstr ""
|
837 |
-
|
838 |
-
#: ../inc/functions/admin-ui.php:281
|
839 |
-
#, fuzzy
|
840 |
-
msgid "Payment Info"
|
841 |
-
msgstr "Weitere Informationen"
|
842 |
-
|
843 |
-
#: ../inc/functions/admin-ui.php:286
|
844 |
-
msgid "We analysed your images"
|
845 |
-
msgstr ""
|
846 |
-
|
847 |
-
#: ../inc/functions/admin-ui.php:292
|
848 |
-
#, fuzzy, php-format
|
849 |
-
msgid "You have %s images"
|
850 |
-
msgstr "Du hast noch %s Guthaben"
|
851 |
-
|
852 |
-
#: ../inc/functions/admin-ui.php:298
|
853 |
-
#, php-format
|
854 |
-
msgid "You actually have %s of images in your library."
|
855 |
-
msgstr ""
|
856 |
-
|
857 |
-
#: ../inc/functions/admin-ui.php:302
|
858 |
-
#, php-format
|
859 |
-
msgid "You upload around %s of images per month."
|
860 |
-
msgstr ""
|
861 |
-
|
862 |
-
#: ../inc/functions/admin-ui.php:309
|
863 |
-
msgid "We recommend you this plan"
|
864 |
-
msgstr ""
|
865 |
-
|
866 |
-
#: ../inc/functions/admin-ui.php:314
|
867 |
-
msgid "Subscribe a monthly plan"
|
868 |
-
msgstr ""
|
869 |
-
|
870 |
-
#: ../inc/functions/admin-ui.php:315
|
871 |
-
msgid "Subscribe a yearly plan"
|
872 |
-
msgstr ""
|
873 |
-
|
874 |
-
#: ../inc/functions/admin-ui.php:319 ../inc/functions/admin-ui.php:455
|
875 |
-
#: ../inc/functions/admin-ui.php:623
|
876 |
-
#, fuzzy
|
877 |
-
msgid "Monthly"
|
878 |
-
msgstr ""
|
879 |
-
"Bedenke, dass jede ausgewählte Bildgröße dein monatliches Nutzungsvolumen "
|
880 |
-
"bei Imagify beeinflusst."
|
881 |
-
|
882 |
-
#: ../inc/functions/admin-ui.php:322 ../inc/functions/admin-ui.php:458
|
883 |
-
#: ../inc/functions/admin-ui.php:626
|
884 |
-
msgid "Yearly"
|
885 |
-
msgstr ""
|
886 |
-
|
887 |
-
#: ../inc/functions/admin-ui.php:322 ../inc/functions/admin-ui.php:458
|
888 |
-
#: ../inc/functions/admin-ui.php:626
|
889 |
-
msgid "2 months free"
|
890 |
-
msgstr ""
|
891 |
-
|
892 |
-
#: ../inc/functions/admin-ui.php:333 ../inc/functions/admin-ui.php:352
|
893 |
-
#: ../inc/functions/admin-ui.php:468 ../inc/functions/admin-ui.php:478
|
894 |
-
#, fuzzy
|
895 |
-
msgid "/month"
|
896 |
-
msgstr ""
|
897 |
-
"Du hast dein Guthaben für diesen Monat aufgebraucht. <strong>%s</strong> "
|
898 |
-
"werden dir am <strong>%s</strong> wieder zur Verfügung stehen."
|
899 |
-
|
900 |
-
#: ../inc/functions/admin-ui.php:335 ../inc/functions/admin-ui.php:383
|
901 |
-
#: ../inc/functions/admin-ui.php:470 ../inc/functions/admin-ui.php:521
|
902 |
-
#, php-format
|
903 |
-
msgid "approx: %s images"
|
904 |
-
msgstr ""
|
905 |
-
|
906 |
-
#: ../inc/functions/admin-ui.php:356 ../inc/functions/admin-ui.php:484
|
907 |
-
#, php-format
|
908 |
-
msgid ""
|
909 |
-
"%s per<br>\n"
|
910 |
-
"additionnal Gb"
|
911 |
-
msgstr ""
|
912 |
-
|
913 |
-
#: ../inc/functions/admin-ui.php:361 ../inc/functions/admin-ui.php:396
|
914 |
-
#: ../inc/functions/admin-ui.php:580 ../inc/functions/admin-ui.php:601
|
915 |
-
msgid "Choose another plan"
|
916 |
-
msgstr ""
|
917 |
-
|
918 |
-
#: ../inc/functions/admin-ui.php:371
|
919 |
-
msgid "Optimize the images you already have, buy a one-time plan"
|
920 |
-
msgstr ""
|
921 |
-
|
922 |
-
#: ../inc/functions/admin-ui.php:407
|
923 |
-
msgid "Checkout"
|
924 |
-
msgstr ""
|
925 |
-
|
926 |
-
#: ../inc/functions/admin-ui.php:411
|
927 |
-
msgid ""
|
928 |
-
"Monthly plans comes with credits which is renewed every months. The billing "
|
929 |
-
"happens automatically each month or year depending the billing period you "
|
930 |
-
"choose."
|
931 |
-
msgstr ""
|
932 |
-
|
933 |
-
#: ../inc/functions/admin-ui.php:435
|
934 |
-
msgid "Monthly Plans"
|
935 |
-
msgstr ""
|
936 |
-
|
937 |
-
#: ../inc/functions/admin-ui.php:440
|
938 |
-
msgid "One Time Plans"
|
939 |
-
msgstr ""
|
940 |
-
|
941 |
-
#: ../inc/functions/admin-ui.php:450
|
942 |
-
msgid ""
|
943 |
-
"Monthly plans come with credits which is renewed every months. The billing "
|
944 |
-
"happens automatically each month or year depending the billing period you "
|
945 |
-
"choose."
|
946 |
-
msgstr ""
|
947 |
-
|
948 |
-
#: ../inc/functions/admin-ui.php:482 ../inc/functions/admin-ui.php:529
|
949 |
-
#, fuzzy
|
950 |
-
msgid "we recommend for you"
|
951 |
-
msgstr ""
|
952 |
-
"Wähle diese Einstellung, wenn dir die perfekte Qualität deiner Bilder "
|
953 |
-
"wichtig ist."
|
954 |
-
|
955 |
-
#: ../inc/functions/admin-ui.php:490 ../inc/functions/admin-ui.php:533
|
956 |
-
msgid "Choose plan"
|
957 |
-
msgstr ""
|
958 |
-
|
959 |
-
#: ../inc/functions/admin-ui.php:498
|
960 |
-
#, fuzzy
|
961 |
-
msgid "Need more?"
|
962 |
-
msgstr "Weitere Informationen"
|
963 |
-
|
964 |
-
#: ../inc/functions/admin-ui.php:499
|
965 |
-
msgid "for special needs"
|
966 |
-
msgstr ""
|
967 |
-
|
968 |
-
#: ../inc/functions/admin-ui.php:503
|
969 |
-
#, fuzzy
|
970 |
-
msgid "Contact Us"
|
971 |
-
msgstr ""
|
972 |
-
"Ein unbekannter Fehler ist beim Sammeln der nicht optimierten Bilder "
|
973 |
-
"aufgetreten. Versuche es noch einmal; falls der Fehler sich wiederholt, "
|
974 |
-
"kontaktiere bitte den Imagify-Support."
|
975 |
-
|
976 |
-
#: ../inc/functions/admin-ui.php:510
|
977 |
-
msgid ""
|
978 |
-
"One time plans are useful if you have a lots of existing images which need "
|
979 |
-
"to be optimized. You can use it for bulk optimizing all your past images. "
|
980 |
-
"You will pay only once."
|
981 |
-
msgstr ""
|
982 |
-
|
983 |
-
#: ../inc/functions/admin-ui.php:563
|
984 |
-
#, fuzzy
|
985 |
-
msgid "Your order"
|
986 |
-
msgstr "Dein Abo:"
|
987 |
-
|
988 |
-
#: ../inc/functions/admin-ui.php:568
|
989 |
-
#, php-format
|
990 |
-
msgid "%scancel%sYou just removed %s"
|
991 |
-
msgstr ""
|
992 |
-
|
993 |
-
#: ../inc/functions/admin-ui.php:576 ../inc/functions/admin-ui.php:597
|
994 |
-
msgid "Remove this item"
|
995 |
-
msgstr ""
|
996 |
-
|
997 |
-
#: ../inc/functions/admin-ui.php:583
|
998 |
-
#, php-format
|
999 |
-
msgid "%s per month"
|
1000 |
-
msgstr ""
|
1001 |
-
|
1002 |
-
#: ../inc/functions/admin-ui.php:604
|
1003 |
-
#, php-format
|
1004 |
-
msgid "one time %s"
|
1005 |
-
msgstr ""
|
1006 |
-
|
1007 |
-
#: ../inc/functions/admin-ui.php:617
|
1008 |
-
#, php-format
|
1009 |
-
msgid ""
|
1010 |
-
"Switch to yearly subscription and <br><strong class=\"imagify-dark\">save %s "
|
1011 |
-
"per year!</strong>"
|
1012 |
-
msgstr ""
|
1013 |
-
|
1014 |
-
#: ../inc/functions/admin-ui.php:618
|
1015 |
-
#, php-format
|
1016 |
-
msgid ""
|
1017 |
-
"Perfect!<br>You're <strong class=\"imagify-dark\">saving %s per year!</"
|
1018 |
-
"strong>"
|
1019 |
-
msgstr ""
|
1020 |
-
|
1021 |
-
#: ../inc/functions/admin-ui.php:657
|
1022 |
-
msgid "Thank you for being awesome!"
|
1023 |
-
msgstr ""
|
1024 |
-
|
1025 |
-
#: ../inc/functions/admin-ui.php:668
|
1026 |
-
msgid "What do our user think about Imagify"
|
1027 |
-
msgstr ""
|
1028 |
-
|
1029 |
-
#: ../inc/functions/admin-ui.php:702
|
1030 |
-
msgid "Secure Credit Card Payment"
|
1031 |
-
msgstr ""
|
1032 |
-
|
1033 |
-
#: ../inc/functions/admin-ui.php:703
|
1034 |
-
msgid "This is secure 128-bits SSL encrypted payment"
|
1035 |
-
msgstr ""
|
1036 |
-
|
1037 |
-
#: ../inc/functions/i18n.php:20
|
1038 |
-
msgid "Let's get you started!"
|
1039 |
-
msgstr "Los geht’s!"
|
1040 |
-
|
1041 |
-
#: ../inc/functions/i18n.php:21
|
1042 |
-
msgid "Enter your email to get an API key:"
|
1043 |
-
msgstr "Geben Sie Ihre E-Mail-Adresse ein, um einen API-Schlüssel zu erhalten:"
|
1044 |
-
|
1045 |
-
#: ../inc/functions/i18n.php:22
|
1046 |
-
msgid "Sign Up"
|
1047 |
-
msgstr "Konto anlegen"
|
1048 |
-
|
1049 |
-
#: ../inc/functions/i18n.php:23
|
1050 |
-
msgid "You need to specify an email!"
|
1051 |
-
msgstr "Sie müssen eine E-Mail-Adresse angeben."
|
1052 |
-
|
1053 |
-
#: ../inc/functions/i18n.php:24 ../inc/functions/i18n.php:31
|
1054 |
-
msgid "Congratulations!"
|
1055 |
-
msgstr "Glückwunsch!"
|
1056 |
-
|
1057 |
-
#: ../inc/functions/i18n.php:25
|
1058 |
-
msgid ""
|
1059 |
-
"Your account has been succesfully created. Please check your mailbox, you "
|
1060 |
-
"are going to receive an email with API key."
|
1061 |
-
msgstr ""
|
1062 |
-
"Ihr Konto ist jetzt angelegt. Überprüfen Sie Ihr E-Mail-Postfach, Sie "
|
1063 |
-
"erhalten eine E-Mail mit Ihrem API-Schlüssel."
|
1064 |
-
|
1065 |
-
#: ../inc/functions/i18n.php:26
|
1066 |
-
msgid "Connect to Imagify!"
|
1067 |
-
msgstr "Verbindung zu Imagify herstellen"
|
1068 |
-
|
1069 |
-
#: ../inc/functions/i18n.php:27
|
1070 |
-
msgid "Paste your API key below:"
|
1071 |
-
msgstr "Fügen Sie Ihren API-Schlüssel hier ein:"
|
1072 |
-
|
1073 |
-
#: ../inc/functions/i18n.php:28
|
1074 |
-
msgid "Connect me"
|
1075 |
-
msgstr "Verbinden"
|
1076 |
-
|
1077 |
-
#: ../inc/functions/i18n.php:29
|
1078 |
-
msgid "Check in progress..."
|
1079 |
-
msgstr "API-Schlüssel wird geprüft…"
|
1080 |
-
|
1081 |
-
#: ../inc/functions/i18n.php:30
|
1082 |
-
msgid "You need to specify your api key!"
|
1083 |
-
msgstr "Sie müssen einen API-Schlüssel angeben!"
|
1084 |
-
|
1085 |
-
#: ../inc/functions/i18n.php:32
|
1086 |
-
msgid ""
|
1087 |
-
"Your API key is valid. You can now configure the Imagify settings to "
|
1088 |
-
"optimize your images."
|
1089 |
-
msgstr ""
|
1090 |
-
"Ihr API-Schlüssel ist gültig. Sie können jetzt Ihre Einstellungen für die "
|
1091 |
-
"Bildoptimierung mit Imagify wählen."
|
1092 |
-
|
1093 |
-
#: ../inc/functions/i18n.php:34
|
1094 |
-
msgid "Cancel"
|
1095 |
-
msgstr ""
|
1096 |
-
|
1097 |
-
#: ../inc/functions/i18n.php:41
|
1098 |
-
msgid "Don't Need a Parachute?"
|
1099 |
-
msgstr "Sie brauchen keinen Fallschirm?"
|
1100 |
-
|
1101 |
-
#: ../inc/functions/i18n.php:42
|
1102 |
-
msgid ""
|
1103 |
-
"If you keep this option deactivated, you won't be able to re-optimize your "
|
1104 |
-
"images to another compression level and restore your original images in case "
|
1105 |
-
"of need."
|
1106 |
-
msgstr ""
|
1107 |
-
"Wenn Sie diese Option deaktiviert lassen, werden Sie Ihre Bilder nicht "
|
1108 |
-
"erneut mit einem anderen Level komprimieren, oder deren Originale "
|
1109 |
-
"wiederherstellen können."
|
1110 |
-
|
1111 |
-
#: ../inc/functions/i18n.php:58
|
1112 |
-
msgid "Original Image"
|
1113 |
-
msgstr "Originalbild"
|
1114 |
-
|
1115 |
-
#: ../inc/functions/i18n.php:59
|
1116 |
-
msgid "Optimized Image"
|
1117 |
-
msgstr "Optimiertes Bild"
|
1118 |
-
|
1119 |
-
#: ../inc/functions/i18n.php:73
|
1120 |
-
msgid "Please wait..."
|
1121 |
-
msgstr "Einen Moment bitte …"
|
1122 |
-
|
1123 |
-
#: ../inc/functions/i18n.php:74
|
1124 |
-
msgid ""
|
1125 |
-
"We are trying to get your unoptimized images, it may take time depending on "
|
1126 |
-
"the number of images."
|
1127 |
-
msgstr ""
|
1128 |
-
"Nicht optimierte Bilder werden gesammelt, dies kann einen Moment dauern "
|
1129 |
-
"…"
|
1130 |
-
|
1131 |
-
#: ../inc/functions/i18n.php:76
|
1132 |
-
msgid "Oops, There is something wrong!"
|
1133 |
-
msgstr "Hm, etwas ist schief gelaufen."
|
1134 |
-
|
1135 |
-
#: ../inc/functions/i18n.php:77
|
1136 |
-
msgid ""
|
1137 |
-
"An unknow error occurred when we tried to get all your unoptimized images. "
|
1138 |
-
"Try again and if the issue still persist, please contact us!"
|
1139 |
-
msgstr ""
|
1140 |
-
"Ein unbekannter Fehler ist beim Sammeln der nicht optimierten Bilder "
|
1141 |
-
"aufgetreten. Versuchen Sie es noch einmal; falls der Fehler sich wiederholt, "
|
1142 |
-
"kontaktieren Sie bitte den Imagify-Support."
|
1143 |
-
|
1144 |
-
#: ../inc/functions/i18n.php:82
|
1145 |
-
msgid "Error"
|
1146 |
-
msgstr "Fehler"
|
1147 |
-
|
1148 |
-
#: ../inc/functions/i18n.php:85
|
1149 |
-
msgid "Hold on!"
|
1150 |
-
msgstr "Moment, bitte!"
|
1151 |
-
|
1152 |
-
#: ../inc/functions/i18n.php:86
|
1153 |
-
msgid "All your images have been optimized by Imagify. Congratulations!"
|
1154 |
-
msgstr "Imagify hat alle Ihre Bilder optimiert. Glückwunsch!"
|
1155 |
-
|
1156 |
-
#: ../inc/functions/i18n.php:88
|
1157 |
-
#, php-format
|
1158 |
-
msgid ""
|
1159 |
-
"Discover @imagify, the new compression tool to optimize your images for "
|
1160 |
-
"free. I saved %1$s out of %2$s!"
|
1161 |
-
msgstr ""
|
1162 |
-
"Freies #WordPress #Plugin zur Bildoptimierung für bessere #Performance: "
|
1163 |
-
"Bilder mit @imagify komprimiert, %1$s von %2$s gespart!"
|
1164 |
-
|
1165 |
-
#: ../inc/functions/i18n.php:92
|
1166 |
-
msgid "Imagify is still processing. Are you sure you want to leave this page?"
|
1167 |
-
msgstr ""
|
1168 |
-
"Imagify arbeitet noch. Möchten Sie diese Seite wirklich verlassen und den "
|
1169 |
-
"Prozess abbrechen?"
|
1170 |
-
|
1171 |
-
#: ../inc/functions/i18n.php:101
|
1172 |
-
msgid "F j, Y"
|
1173 |
-
msgstr "j. F Y"
|
1174 |
-
|
1175 |
-
#: ../inc/functions/process.php:40
|
1176 |
-
msgid ""
|
1177 |
-
"Sorry, our servers are temporarily unaccessible. Please, try again in a "
|
1178 |
-
"couple of minutes."
|
1179 |
-
msgstr ""
|
1180 |
-
"Unsere Server sind leider im Augenblick nicht erreichbar. Bitte versuchen "
|
1181 |
-
"Sie es in ein paar Minuten noch einmal."
|
1182 |
-
|
1183 |
-
#: ../inc/functions/process.php:46
|
1184 |
-
msgid "External HTTP requests are blocked"
|
1185 |
-
msgstr "Externe HTTP-Anfragen werden blockiert"
|
1186 |
-
|
1187 |
-
#: ../inc/functions/process.php:52
|
1188 |
-
msgid "File path is empty"
|
1189 |
-
msgstr "Datei-Pfad ist leer"
|
1190 |
-
|
1191 |
-
#: ../inc/functions/process.php:58
|
1192 |
-
#, php-format
|
1193 |
-
msgid "Could not find %s"
|
1194 |
-
msgstr "%s wurde nicht gefunden"
|
1195 |
-
|
1196 |
-
#: ../inc/functions/process.php:63
|
1197 |
-
#, php-format
|
1198 |
-
msgid "%s is not writable"
|
1199 |
-
msgstr "%s ist nicht beschreibbar."
|
1200 |
-
|
1201 |
-
#: ../inc/functions/process.php:72
|
1202 |
-
#, php-format
|
1203 |
-
msgid "Skipped (%s), image not found."
|
1204 |
-
msgstr "Übersprungen (%s), Bild nicht gefunden."
|
1205 |
-
|
1206 |
-
#~ msgid "https://wordpress.org/plugins/imagify"
|
1207 |
-
#~ msgstr "https://de.wordpress.org/plugins/imagify"
|
1208 |
-
|
1209 |
-
#~ msgid ""
|
1210 |
-
#~ "Dramaticaly reduce image file sizes without loosing quality, make your "
|
1211 |
-
#~ "website load faster, boost your SEO and save money on your bandwith using "
|
1212 |
-
#~ "Imagify, the new most advanced image optimization tool."
|
1213 |
-
#~ msgstr ""
|
1214 |
-
#~ "Verlustfreie Bildoptimierung für WordPress. Imagify reduziert dramatisch "
|
1215 |
-
#~ "die Dateigröße deiner Bilder, macht Ihre Website schneller, verbessert "
|
1216 |
-
#~ "Ihre SEO und spart Bandbreite."
|
1217 |
-
|
1218 |
-
#~ msgid "Your default setting:"
|
1219 |
-
#~ msgstr "Ihre Standard-Einstellung:"
|
1220 |
-
|
1221 |
-
#~ msgid ""
|
1222 |
-
#~ "All images which are over to %s could be optimized using the pro version."
|
1223 |
-
#~ msgstr "Bilder größer als %s können mit der Pro-version optimiert werden."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
languages/imagify-es_ES.mo
DELETED
Binary file
|
languages/imagify-es_ES.po
DELETED
@@ -1,1228 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: Imagify\n"
|
4 |
-
"POT-Creation-Date: 2016-09-23 10:03-0500\n"
|
5 |
-
"PO-Revision-Date: 2016-09-23 11:02-0500\n"
|
6 |
-
"Last-Translator: Rémy Perona <remperona@gmail.com>\n"
|
7 |
-
"Language-Team: \n"
|
8 |
-
"Language: es\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 1.6.4\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"X-Poedit-WPHeader: imagify.php\n"
|
15 |
-
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
|
18 |
-
"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
|
19 |
-
"_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
|
20 |
-
"X-Poedit-SearchPathExcluded-0: *.js\n"
|
21 |
-
"X-Poedit-SearchPath-0: .\n"
|
22 |
-
|
23 |
-
#: inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:20
|
24 |
-
#: inc/admin/ajax.php:123 inc/admin/meta-boxes.php:34
|
25 |
-
#: inc/functions/admin-ui.php:215 inc/functions/i18n.php:49
|
26 |
-
#: inc/functions/i18n.php:64
|
27 |
-
msgid "Optimize"
|
28 |
-
msgstr "Optimizar"
|
29 |
-
|
30 |
-
#: inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:21
|
31 |
-
#: inc/functions/admin-ui.php:80 inc/functions/i18n.php:50
|
32 |
-
msgid "Restore Original"
|
33 |
-
msgstr "Recuperar tamaño original"
|
34 |
-
|
35 |
-
#: inc/3rd-party/nextgen-gallery/inc/admin/menu.php:16 inc/admin/menu.php:24
|
36 |
-
#: inc/admin/plugins.php:13 inc/admin/ui/bulk.php:81
|
37 |
-
#: inc/common/admin-bar.php:39
|
38 |
-
msgid "Bulk Optimization"
|
39 |
-
msgstr "Optimización masiva"
|
40 |
-
|
41 |
-
#: inc/admin/ajax.php:123 inc/admin/meta-boxes.php:29
|
42 |
-
#: inc/functions/admin-ui.php:121 inc/functions/admin-ui.php:153
|
43 |
-
#: inc/functions/admin-ui.php:159 inc/functions/admin-ui.php:165
|
44 |
-
#: inc/functions/admin-ui.php:205 inc/functions/admin-ui.php:215
|
45 |
-
msgid "Optimizing..."
|
46 |
-
msgstr "Optimizando…"
|
47 |
-
|
48 |
-
#: inc/admin/ajax.php:507
|
49 |
-
msgid "Oops, It's almost over!"
|
50 |
-
msgstr "¡Ya casi está!"
|
51 |
-
|
52 |
-
#: inc/admin/ajax.php:508
|
53 |
-
#, php-format
|
54 |
-
msgid ""
|
55 |
-
"You have almost used all your credit.%sDon't forget to upgrade your "
|
56 |
-
"subscription to continue optimizing your images."
|
57 |
-
msgstr ""
|
58 |
-
"Ya has utilizado casi todo tu crédito.%sNo olvides ampliar tu suscripción "
|
59 |
-
"para poder seguir optimizando tus imágenes."
|
60 |
-
|
61 |
-
#: inc/admin/ajax.php:509 inc/admin/ui/bulk.php:23
|
62 |
-
msgid "View My Subscription"
|
63 |
-
msgstr "Ver mi suscripción"
|
64 |
-
|
65 |
-
#: inc/admin/ajax.php:517 inc/admin/ui/notices.php:258
|
66 |
-
#: inc/functions/i18n.php:84
|
67 |
-
msgid "Oops, It's Over!"
|
68 |
-
msgstr "¡Ya está!"
|
69 |
-
|
70 |
-
#: inc/admin/ajax.php:518 inc/admin/ui/notices.php:260
|
71 |
-
#: inc/functions/i18n.php:101
|
72 |
-
#, php-format
|
73 |
-
msgid ""
|
74 |
-
"You have consumed all your credit for this month. You will have <strong>%s "
|
75 |
-
"back on %s</strong>."
|
76 |
-
msgstr ""
|
77 |
-
"Has consumido todo tu crédito para este mes. Volverás a tener <strong>%s el "
|
78 |
-
"%s</strong>."
|
79 |
-
|
80 |
-
#: inc/admin/ajax.php:519
|
81 |
-
msgid "Upgrade My Subscription"
|
82 |
-
msgstr "Actualizar mi suscripción"
|
83 |
-
|
84 |
-
#: inc/admin/ajax.php:538 inc/admin/ui/bulk.php:17
|
85 |
-
msgid "Account status"
|
86 |
-
msgstr "Estado de mi cuenta"
|
87 |
-
|
88 |
-
#: inc/admin/ajax.php:539 inc/admin/ui/bulk.php:18
|
89 |
-
msgid "Your subscription:"
|
90 |
-
msgstr "Tu suscripción:"
|
91 |
-
|
92 |
-
#: inc/admin/ajax.php:547 inc/admin/ui/bulk.php:48
|
93 |
-
#, php-format
|
94 |
-
msgid "You have %s space credit left"
|
95 |
-
msgstr "Te queda un saldo de %s"
|
96 |
-
|
97 |
-
#: inc/admin/ajax.php:559
|
98 |
-
msgid "View my subscription"
|
99 |
-
msgstr "Ver mi suscripción"
|
100 |
-
|
101 |
-
#: inc/admin/media.php:63 inc/functions/i18n.php:60
|
102 |
-
msgid "Compare Original VS Optimized"
|
103 |
-
msgstr "Compara original VS optimizada"
|
104 |
-
|
105 |
-
#: inc/admin/meta-boxes.php:17 inc/admin/meta-boxes.php:24
|
106 |
-
#: inc/admin/upload.php:12
|
107 |
-
msgid "Imagify"
|
108 |
-
msgstr "Imagify"
|
109 |
-
|
110 |
-
#: inc/admin/meta-boxes.php:19 inc/functions/admin-ui.php:195
|
111 |
-
msgid "Invalid API key"
|
112 |
-
msgstr "Clave API no válida"
|
113 |
-
|
114 |
-
#: inc/admin/meta-boxes.php:21 inc/functions/admin-ui.php:197
|
115 |
-
msgid "Check your Settings"
|
116 |
-
msgstr "Comprueba tu configuración"
|
117 |
-
|
118 |
-
#: inc/admin/options.php:119
|
119 |
-
msgid "Cheatin’ uh?"
|
120 |
-
msgstr "Haciendo trampa ¿Uh?"
|
121 |
-
|
122 |
-
#: inc/admin/options.php:127
|
123 |
-
msgid "<strong>ERROR</strong>: options page not found."
|
124 |
-
msgstr "<strong>ERROR</strong>: página de opciones no encontrada."
|
125 |
-
|
126 |
-
#: inc/admin/plugins.php:14 inc/admin/ui/options.php:74
|
127 |
-
#: inc/common/admin-bar.php:30
|
128 |
-
msgid "Settings"
|
129 |
-
msgstr "Configuración"
|
130 |
-
|
131 |
-
#: inc/admin/ui/bulk.php:60
|
132 |
-
msgid "Upgrade your account to continue optimizing your images"
|
133 |
-
msgstr "Actualiza tu cuenta para seguir optimizando tus imágenes"
|
134 |
-
|
135 |
-
#: inc/admin/ui/bulk.php:64
|
136 |
-
msgid "More info"
|
137 |
-
msgstr "Más info"
|
138 |
-
|
139 |
-
#: inc/admin/ui/bulk.php:91
|
140 |
-
msgid "Overview"
|
141 |
-
msgstr "Resumen"
|
142 |
-
|
143 |
-
#: inc/admin/ui/bulk.php:99
|
144 |
-
#, php-format
|
145 |
-
msgid "You optimized %s images of your website"
|
146 |
-
msgstr "Has optimizado el %s de imágenes de tu sitio"
|
147 |
-
|
148 |
-
#: inc/admin/ui/bulk.php:103
|
149 |
-
msgid "Statistics"
|
150 |
-
msgstr "Estadísticas"
|
151 |
-
|
152 |
-
#: inc/admin/ui/bulk.php:115
|
153 |
-
msgid "that's the number of images you optimized with Imagify"
|
154 |
-
msgstr "este es el número de imágenes que has optimizado con Imagify"
|
155 |
-
|
156 |
-
#: inc/admin/ui/bulk.php:120
|
157 |
-
msgid "Original size"
|
158 |
-
msgstr "Tamaño original"
|
159 |
-
|
160 |
-
#: inc/admin/ui/bulk.php:125
|
161 |
-
msgid "Optimized size"
|
162 |
-
msgstr "Tamaño optimizado"
|
163 |
-
|
164 |
-
#: inc/admin/ui/bulk.php:136
|
165 |
-
#, php-format
|
166 |
-
msgid "that's the size you saved %sby using Imagify"
|
167 |
-
msgstr "este es el tamaño que ahorraste %scon Imagify"
|
168 |
-
|
169 |
-
#: inc/admin/ui/bulk.php:142
|
170 |
-
msgid "Information"
|
171 |
-
msgstr "Información"
|
172 |
-
|
173 |
-
#: inc/admin/ui/bulk.php:146
|
174 |
-
msgid ""
|
175 |
-
"Please be aware that optimizing a large number of images can take a while "
|
176 |
-
"depending on your server and network speed."
|
177 |
-
msgstr ""
|
178 |
-
"Por favor ten en cuenta que la optimización de un gran número de imágenes "
|
179 |
-
"puede demorar un poco según tu servidor y la velocidad de tu red."
|
180 |
-
|
181 |
-
#: inc/admin/ui/bulk.php:149
|
182 |
-
#, php-format
|
183 |
-
msgid ""
|
184 |
-
"If you have more than %s images, you will need to launch the bulk "
|
185 |
-
"optimization several times."
|
186 |
-
msgstr ""
|
187 |
-
"Si tienes más de %s imágenes, necesitarás lanzar el proceso de optimización "
|
188 |
-
"masiva varias veces."
|
189 |
-
|
190 |
-
#: inc/admin/ui/bulk.php:153
|
191 |
-
msgid ""
|
192 |
-
"You must keep this page open while the bulk optimizaton is processing. If "
|
193 |
-
"you leave you can come back to continue where it left off."
|
194 |
-
msgstr ""
|
195 |
-
"Tienes que mantener esta página abierta durante la optimización masiva. Si "
|
196 |
-
"la abandonas, siempre puedes volver y retomarla donde la hayas dejado."
|
197 |
-
|
198 |
-
#: inc/admin/ui/bulk.php:164
|
199 |
-
msgid "Select Your Compression Level"
|
200 |
-
msgstr "Selecciona tu nivel de compresión"
|
201 |
-
|
202 |
-
#: inc/admin/ui/bulk.php:166 inc/admin/ui/bulk.php:192
|
203 |
-
#: inc/admin/ui/options.php:136 inc/admin/ui/options.php:365
|
204 |
-
#: inc/admin/ui/options.php:404 inc/admin/ui/options.php:421
|
205 |
-
#: inc/admin/ui/options.php:481
|
206 |
-
#: inc/classes/abstracts/abstract-attachment.php:114
|
207 |
-
#: inc/functions/admin-ui.php:153
|
208 |
-
msgid "Ultra"
|
209 |
-
msgstr "Ultra"
|
210 |
-
|
211 |
-
#: inc/admin/ui/bulk.php:169 inc/admin/ui/bulk.php:187
|
212 |
-
#: inc/admin/ui/options.php:131 inc/admin/ui/options.php:352
|
213 |
-
#: inc/admin/ui/options.php:403 inc/admin/ui/options.php:416
|
214 |
-
#: inc/admin/ui/options.php:460
|
215 |
-
#: inc/classes/abstracts/abstract-attachment.php:117
|
216 |
-
#: inc/functions/admin-ui.php:159
|
217 |
-
msgid "Aggressive"
|
218 |
-
msgstr "Agresivo"
|
219 |
-
|
220 |
-
#: inc/admin/ui/bulk.php:172 inc/admin/ui/bulk.php:182
|
221 |
-
#: inc/admin/ui/options.php:126 inc/admin/ui/options.php:339
|
222 |
-
#: inc/admin/ui/options.php:402 inc/admin/ui/options.php:411
|
223 |
-
#: inc/admin/ui/options.php:440
|
224 |
-
#: inc/classes/abstracts/abstract-attachment.php:120
|
225 |
-
#: inc/functions/admin-ui.php:165
|
226 |
-
msgid "Normal"
|
227 |
-
msgstr "Normal"
|
228 |
-
|
229 |
-
#: inc/admin/ui/bulk.php:176
|
230 |
-
#, php-format
|
231 |
-
msgid "Your default setting: %s"
|
232 |
-
msgstr "Tus ajustes por defecto: %s"
|
233 |
-
|
234 |
-
#: inc/admin/ui/bulk.php:201
|
235 |
-
#, php-format
|
236 |
-
msgid "Don't forget to check %syour settings%s before bulk optimization."
|
237 |
-
msgstr "No olvides revisar %stus ajustes%s antes de la optimización masiva."
|
238 |
-
|
239 |
-
#: inc/admin/ui/bulk.php:208
|
240 |
-
msgid "Let's go!"
|
241 |
-
msgstr "¡Vamos!"
|
242 |
-
|
243 |
-
#: inc/admin/ui/bulk.php:215
|
244 |
-
msgid "Imagif'em all"
|
245 |
-
msgstr "Imagíficalo todo"
|
246 |
-
|
247 |
-
#: inc/admin/ui/bulk.php:220
|
248 |
-
#, php-format
|
249 |
-
msgid "All images greater than %s will be optimized when using a paid plan."
|
250 |
-
msgstr ""
|
251 |
-
"Todas las imágenes superiores a %s se pueden optimizar usando un plan de pago"
|
252 |
-
|
253 |
-
#: inc/admin/ui/bulk.php:239
|
254 |
-
msgid "Well done!"
|
255 |
-
msgstr "¡Bien hecho!"
|
256 |
-
|
257 |
-
#: inc/admin/ui/bulk.php:240
|
258 |
-
#, php-format
|
259 |
-
msgid "you saved %1$s out of %2$s"
|
260 |
-
msgstr "has ahorrado %1$s de %2$s"
|
261 |
-
|
262 |
-
#: inc/admin/ui/bulk.php:245
|
263 |
-
msgid "Share your awesome result"
|
264 |
-
msgstr "Comparte tus impresionantes resultados"
|
265 |
-
|
266 |
-
#: inc/admin/ui/bulk.php:260
|
267 |
-
msgid "Compression process results"
|
268 |
-
msgstr "Resultados del proceso de compresión"
|
269 |
-
|
270 |
-
#: inc/admin/ui/bulk.php:263
|
271 |
-
msgid "Filename"
|
272 |
-
msgstr "Nombre de archivo"
|
273 |
-
|
274 |
-
#: inc/admin/ui/bulk.php:264
|
275 |
-
msgid "Status"
|
276 |
-
msgstr "Estado"
|
277 |
-
|
278 |
-
#: inc/admin/ui/bulk.php:265 inc/admin/ui/options.php:401
|
279 |
-
#: inc/admin/ui/options.php:406 inc/admin/ui/options.php:430
|
280 |
-
msgid "Original"
|
281 |
-
msgstr "Original"
|
282 |
-
|
283 |
-
#: inc/admin/ui/bulk.php:266 inc/admin/upload.php:41 inc/functions/i18n.php:80
|
284 |
-
msgid "Optimized"
|
285 |
-
msgstr "Optimizado"
|
286 |
-
|
287 |
-
#: inc/admin/ui/bulk.php:267
|
288 |
-
msgid "Percentage"
|
289 |
-
msgstr "Porcentaje"
|
290 |
-
|
291 |
-
#: inc/admin/ui/bulk.php:268
|
292 |
-
msgid "Thumbnails optimized"
|
293 |
-
msgstr "Miniaturas optimizadas:"
|
294 |
-
|
295 |
-
#: inc/admin/ui/bulk.php:269
|
296 |
-
msgid "Overall saving"
|
297 |
-
msgstr "Ahorro total"
|
298 |
-
|
299 |
-
#: inc/admin/ui/bulk.php:274
|
300 |
-
msgid "file"
|
301 |
-
msgstr "archivo"
|
302 |
-
|
303 |
-
#: inc/admin/ui/bulk.php:275
|
304 |
-
msgid "error"
|
305 |
-
msgstr "error"
|
306 |
-
|
307 |
-
#: inc/admin/ui/bulk.php:276
|
308 |
-
msgid "Total:"
|
309 |
-
msgstr "Total:"
|
310 |
-
|
311 |
-
#: inc/admin/ui/bulk.php:277
|
312 |
-
msgid "Gain:"
|
313 |
-
msgstr "Ganancia:"
|
314 |
-
|
315 |
-
#: inc/admin/ui/bulk.php:294
|
316 |
-
#, php-format
|
317 |
-
msgid "%sStart the bulk optimization%s"
|
318 |
-
msgstr "%sEmpieza la optimización masiva%s"
|
319 |
-
|
320 |
-
#: inc/admin/ui/notices.php:24
|
321 |
-
msgid "Welcome to Imagify, the best way to easily optimize your images!"
|
322 |
-
msgstr ""
|
323 |
-
"¡Bienvenido a Imagify, la mejor manera de optimizar fácilmente tus imágenes!"
|
324 |
-
|
325 |
-
#: inc/admin/ui/notices.php:26 inc/admin/ui/notices.php:92
|
326 |
-
#: inc/admin/ui/notices.php:186 inc/admin/ui/notices.php:223
|
327 |
-
#: inc/admin/ui/notices.php:263 inc/admin/ui/notices.php:370
|
328 |
-
msgid "Dismiss this notice"
|
329 |
-
msgstr "Descarta este aviso"
|
330 |
-
|
331 |
-
#: inc/admin/ui/notices.php:33
|
332 |
-
msgid "Create an Account"
|
333 |
-
msgstr "Crea una cuenta"
|
334 |
-
|
335 |
-
#: inc/admin/ui/notices.php:34
|
336 |
-
msgid ""
|
337 |
-
"Don't have an Imagify account yet? Optimize your images by creating an "
|
338 |
-
"account in a few seconds!"
|
339 |
-
msgstr ""
|
340 |
-
"¿Todavía no tienes una cuenta Imagify? Optimiza tus imágenes creando una "
|
341 |
-
"cuenta en unos segundos!"
|
342 |
-
|
343 |
-
#: inc/admin/ui/notices.php:37
|
344 |
-
msgid "Sign up, It's FREE!"
|
345 |
-
msgstr "Regístrate, ¡es GRATIS!"
|
346 |
-
|
347 |
-
#: inc/admin/ui/notices.php:43
|
348 |
-
msgid "Enter your API Key"
|
349 |
-
msgstr "Ingresa tu clave API"
|
350 |
-
|
351 |
-
#: inc/admin/ui/notices.php:44
|
352 |
-
#, php-format
|
353 |
-
msgid ""
|
354 |
-
"Save your API Key you have received by email or you can get it on your "
|
355 |
-
"%sImagify account page%s."
|
356 |
-
msgstr ""
|
357 |
-
"Guarda la clave API que has recibido por email, o consigue una en tu "
|
358 |
-
"%spágina de cuenta Imagify%s."
|
359 |
-
|
360 |
-
#: inc/admin/ui/notices.php:47
|
361 |
-
msgid "I have my API key"
|
362 |
-
msgstr "Tengo mi clave API"
|
363 |
-
|
364 |
-
#: inc/admin/ui/notices.php:53
|
365 |
-
msgid "Configure it"
|
366 |
-
msgstr "Configuralo"
|
367 |
-
|
368 |
-
#: inc/admin/ui/notices.php:54
|
369 |
-
msgid ""
|
370 |
-
"It’s almost done! You have just to configure your optimization settings."
|
371 |
-
msgstr ""
|
372 |
-
"¡Casi está listo! Sólo te queda configurar tus ajustes de optimización."
|
373 |
-
|
374 |
-
#: inc/admin/ui/notices.php:55
|
375 |
-
msgid "Go to Settings"
|
376 |
-
msgstr "Ve a la configuración"
|
377 |
-
|
378 |
-
#: inc/admin/ui/notices.php:87 inc/admin/ui/options.php:97
|
379 |
-
#: inc/functions/i18n.php:78
|
380 |
-
msgid "Your API key isn't valid!"
|
381 |
-
msgstr "¡Tu clave API no es válida!"
|
382 |
-
|
383 |
-
#: inc/admin/ui/notices.php:90
|
384 |
-
#, php-format
|
385 |
-
msgid ""
|
386 |
-
"Go to your Imagify account page to get your API Key and specify it on "
|
387 |
-
"%1$syour settings%3$s or %2$screate an account for free%3$s if you don't "
|
388 |
-
"have one yet."
|
389 |
-
msgstr ""
|
390 |
-
"Ve a la página de tu cuenta Imagify para obtener la clave API y especifícala "
|
391 |
-
"en %1$stu configuración%3$s; si todavía no la tienes, %2$screa ahora una "
|
392 |
-
"cuenta gratuita%3$s."
|
393 |
-
|
394 |
-
#: inc/admin/ui/notices.php:142
|
395 |
-
msgid ""
|
396 |
-
"The following plugins are not compatible with this plugin and may cause "
|
397 |
-
"unexpected results:"
|
398 |
-
msgstr ""
|
399 |
-
"Los plugin siguientes no son compatibles con este plugin y pueden causar "
|
400 |
-
"resultados inesperados:"
|
401 |
-
|
402 |
-
#: inc/admin/ui/notices.php:148
|
403 |
-
msgid "Deactivate"
|
404 |
-
msgstr "Desactiva"
|
405 |
-
|
406 |
-
#: inc/admin/ui/notices.php:178
|
407 |
-
msgid "The external HTTP requests are blocked!"
|
408 |
-
msgstr "¡Las solicitudes HTTP externas están bloqueadas!"
|
409 |
-
|
410 |
-
#: inc/admin/ui/notices.php:179
|
411 |
-
msgid ""
|
412 |
-
"You defined the <code>WP_HTTP_BLOCK_EXTERNAL</code> constant in the <code>wp-"
|
413 |
-
"config.php</code> to block all external HTTP requests."
|
414 |
-
msgstr ""
|
415 |
-
"Has definido la constante <code>WP_HTTP_BLOCK_EXTERNAL</code> en <code>wp-"
|
416 |
-
"config.php</code> para bloquear las solicitudes HTTP externas."
|
417 |
-
|
418 |
-
#: inc/admin/ui/notices.php:181
|
419 |
-
msgid ""
|
420 |
-
"To optimize your images, you have to put the following code in your <code>wp-"
|
421 |
-
"config.php</code> file so that it works correctly."
|
422 |
-
msgstr ""
|
423 |
-
"Para optimizar tus imágenes, tienes que poner el siguiente código en tu "
|
424 |
-
"archivo <code>wp-config.php</code> para que funcione correctamente."
|
425 |
-
|
426 |
-
#: inc/admin/ui/notices.php:182
|
427 |
-
msgid "Click on the field and press Ctrl-A to select all."
|
428 |
-
msgstr "Haz clic en el campo y pulse Ctrl-A para seleccionar todo."
|
429 |
-
|
430 |
-
#: inc/admin/ui/notices.php:219
|
431 |
-
msgid "You're missing out!"
|
432 |
-
msgstr "¡Te lo estás perdiendo!"
|
433 |
-
|
434 |
-
#: inc/admin/ui/notices.php:220
|
435 |
-
msgid "Use the List view to optimize images with Imagify."
|
436 |
-
msgstr "Utiliza la vista de lista para optimizar imágenes con Imagify."
|
437 |
-
|
438 |
-
#: inc/admin/ui/notices.php:221
|
439 |
-
msgid "Switch to the List View"
|
440 |
-
msgstr "Cambia a la vista de lista"
|
441 |
-
|
442 |
-
#: inc/admin/ui/notices.php:260 inc/functions/i18n.php:98
|
443 |
-
#: inc/functions/i18n.php:101
|
444 |
-
#, php-format
|
445 |
-
msgid ""
|
446 |
-
"To continue to optimize your images, log in to your Imagify account to %sbuy "
|
447 |
-
"a pack or subscribe to a plan%s."
|
448 |
-
msgstr ""
|
449 |
-
"Para seguir optimizando tus imágenes, inicia sesión en tu cuenta Imagify "
|
450 |
-
"para %scomprar un paquete o subscribir un plan %s."
|
451 |
-
|
452 |
-
#: inc/admin/ui/notices.php:314 inc/admin/ui/options.php:28
|
453 |
-
msgid "Discover the best caching plugin to speed up your website."
|
454 |
-
msgstr "Descubre el mejor plugin de caché para acelerar tu sitio Web."
|
455 |
-
|
456 |
-
#: inc/admin/ui/notices.php:317 inc/admin/ui/options.php:36
|
457 |
-
#, php-format
|
458 |
-
msgid "%sGet %s off%s with this coupon code:%s"
|
459 |
-
msgstr "Descuento del %s%s%s con este código de coupon:%s"
|
460 |
-
|
461 |
-
#: inc/admin/ui/notices.php:326 inc/admin/ui/options.php:41
|
462 |
-
msgid "Get WP Rocket now"
|
463 |
-
msgstr "Obten WP Rocket, ¡ya!"
|
464 |
-
|
465 |
-
#: inc/admin/ui/notices.php:363
|
466 |
-
#, php-format
|
467 |
-
msgid ""
|
468 |
-
"%1$sCongratulations%2$s, you have optimized %1$s%3$d images%2$s and improved "
|
469 |
-
"your website's speed by reducing your images size."
|
470 |
-
msgstr ""
|
471 |
-
"%1$s¡En hora buena!%2$s Has optimizado %1$s%3$d imágenes%2$s y ahora tu "
|
472 |
-
"sitio web es más rápido."
|
473 |
-
|
474 |
-
#: inc/admin/ui/notices.php:365 inc/admin/ui/options.php:59
|
475 |
-
#, php-format
|
476 |
-
msgid ""
|
477 |
-
"%sDo you like this plugin?%s Please take a few seconds to %srate it on "
|
478 |
-
"WordPress.org%s!"
|
479 |
-
msgstr ""
|
480 |
-
"%sTe gusta este plugin?%s Por favor tomate unos segundos para %svalorarlo en "
|
481 |
-
"WordPress.org%s!"
|
482 |
-
|
483 |
-
#: inc/admin/ui/options.php:22
|
484 |
-
msgid "Is your website too slow?"
|
485 |
-
msgstr "¿Tu sitio web es muy lento?"
|
486 |
-
|
487 |
-
#: inc/admin/ui/options.php:84
|
488 |
-
msgid "API Key"
|
489 |
-
msgstr "Clave API"
|
490 |
-
|
491 |
-
#: inc/admin/ui/options.php:91 inc/functions/i18n.php:33
|
492 |
-
msgid "Your API key is valid."
|
493 |
-
msgstr "Tu clave API es válida."
|
494 |
-
|
495 |
-
#: inc/admin/ui/options.php:104
|
496 |
-
#, php-format
|
497 |
-
msgid "Don't have an API Key yet? %sCreate one, it's FREE%s."
|
498 |
-
msgstr "¿Todavía no tienes una clave API? %sCréate una, es GRATIS%s."
|
499 |
-
|
500 |
-
#: inc/admin/ui/options.php:121
|
501 |
-
msgid "Optimization Level"
|
502 |
-
msgstr "Nivel de optimización"
|
503 |
-
|
504 |
-
#: inc/admin/ui/options.php:141
|
505 |
-
msgid "More info?"
|
506 |
-
msgstr "Más Info?"
|
507 |
-
|
508 |
-
#: inc/admin/ui/options.php:148
|
509 |
-
#, php-format
|
510 |
-
msgid "Need help to choose? %sTry the Visual Comparison%s"
|
511 |
-
msgstr "¿Necesita ayuda para elegir? %sPrueba la comparación visual%s"
|
512 |
-
|
513 |
-
#: inc/admin/ui/options.php:157 inc/admin/ui/options.php:161
|
514 |
-
msgid "Auto-Optimize images on upload"
|
515 |
-
msgstr "Optimización automática de imágenes en carga"
|
516 |
-
|
517 |
-
#: inc/admin/ui/options.php:165
|
518 |
-
msgid "Automatically optimize every image you upload to WordPress."
|
519 |
-
msgstr "Optimiza automáticamente cada imagen que subas a Wordpress."
|
520 |
-
|
521 |
-
#: inc/admin/ui/options.php:170 inc/admin/ui/options.php:173
|
522 |
-
msgid "Backup original images"
|
523 |
-
msgstr "Backup de las imágenes originales"
|
524 |
-
|
525 |
-
#: inc/admin/ui/options.php:177
|
526 |
-
msgid ""
|
527 |
-
"Keep your original images in a separate folder before optimization process."
|
528 |
-
msgstr ""
|
529 |
-
"Mantén tus imágenes originales en una carpeta separada antes del proceso de "
|
530 |
-
"optimización."
|
531 |
-
|
532 |
-
#: inc/admin/ui/options.php:182 inc/admin/ui/options.php:185
|
533 |
-
msgid "Resize larger images"
|
534 |
-
msgstr "Reduce las imágenes más grandes"
|
535 |
-
|
536 |
-
#: inc/admin/ui/options.php:191
|
537 |
-
#, php-format
|
538 |
-
msgid "to maximum %s pixels width"
|
539 |
-
msgstr "a una anchura máxima de %s pixel"
|
540 |
-
|
541 |
-
#: inc/admin/ui/options.php:202
|
542 |
-
#, php-format
|
543 |
-
msgid ""
|
544 |
-
"This option is recommended to reduce larger images. You can save up to 80%% "
|
545 |
-
"after resizing. The new width should not be less than your largest thumbnail "
|
546 |
-
"width, which is actually %spx."
|
547 |
-
msgstr ""
|
548 |
-
"Esta opción está recomendada para reducir las imágenes más grandes. Puedes "
|
549 |
-
"ahorrar hasta el 80%% después de la reducción de tamaño. El nuevo ancho no "
|
550 |
-
"debería ser menor que el ancho de tu miniatura más grande, que actualmente "
|
551 |
-
"es de %spx."
|
552 |
-
|
553 |
-
#: inc/admin/ui/options.php:209 inc/admin/ui/options.php:212
|
554 |
-
msgid "EXIF Data"
|
555 |
-
msgstr "Datos EXIF"
|
556 |
-
|
557 |
-
#: inc/admin/ui/options.php:216
|
558 |
-
msgid ""
|
559 |
-
"Keep all EXIF data from your images. EXIF are informations stored in your "
|
560 |
-
"pictures like shutter speed, exposure compensation, ISO, etc..."
|
561 |
-
msgstr ""
|
562 |
-
"Mantén todos los datos EXIF de tus imágenes. El EXIF es la información "
|
563 |
-
"almacenada en tus imágenes, por ejemplo la velocidad de obturación, "
|
564 |
-
"compensación de exposición, ISO, etc…."
|
565 |
-
|
566 |
-
#: inc/admin/ui/options.php:217
|
567 |
-
msgid "Learn more"
|
568 |
-
msgstr "Descubre más"
|
569 |
-
|
570 |
-
#: inc/admin/ui/options.php:219
|
571 |
-
msgid ""
|
572 |
-
"If you are a photographer, you may be interested in this option if you are "
|
573 |
-
"displaying on your pages some info like the model of your camera."
|
574 |
-
msgstr ""
|
575 |
-
"Si eres un fotógrafo, puedes estar interesado en esta opción si quieres "
|
576 |
-
"enseñar en tus páginas alguna info, por ejemplo el modelo de tu cámara."
|
577 |
-
|
578 |
-
#: inc/admin/ui/options.php:228
|
579 |
-
msgid "Files optimization"
|
580 |
-
msgstr "Optimización de archivos"
|
581 |
-
|
582 |
-
#: inc/admin/ui/options.php:231
|
583 |
-
msgid ""
|
584 |
-
"You can choose to compress different image sizes created by WordPress here."
|
585 |
-
msgstr ""
|
586 |
-
"Aquí puedes elegir de comprimir los diferentes tamaños de imagen creados por "
|
587 |
-
"WordPress."
|
588 |
-
|
589 |
-
#: inc/admin/ui/options.php:233
|
590 |
-
#, php-format
|
591 |
-
msgid "The %soriginal size%s is %sautomatically optimized%s by Imagify."
|
592 |
-
msgstr "El %stamaño original%s es %soptimizado automáticamente%s por Imagify."
|
593 |
-
|
594 |
-
#: inc/admin/ui/options.php:236
|
595 |
-
msgid ""
|
596 |
-
"Remember each additional image size will affect your Imagify monthly usage!"
|
597 |
-
msgstr ""
|
598 |
-
"Recuerda que cada tamaño adicional de imagen afectará tu consumo mensual de "
|
599 |
-
"Imagify!"
|
600 |
-
|
601 |
-
#: inc/admin/ui/options.php:289
|
602 |
-
msgid "Display options"
|
603 |
-
msgstr "Mostrar las opciones"
|
604 |
-
|
605 |
-
#: inc/admin/ui/options.php:294 inc/admin/ui/options.php:299
|
606 |
-
msgid "Show Admin Bar menu"
|
607 |
-
msgstr "Mostrar la barra de administrador"
|
608 |
-
|
609 |
-
#: inc/admin/ui/options.php:300
|
610 |
-
msgid "I want this awesome quick access menu on my admin bar."
|
611 |
-
msgstr ""
|
612 |
-
"Quiero este fantástico menú de acceso rápido en mi barra de administrador."
|
613 |
-
|
614 |
-
#: inc/admin/ui/options.php:319
|
615 |
-
msgid "Save & Go to Bulk Optimizer"
|
616 |
-
msgstr "Guarda & Ve a la optimización masiva"
|
617 |
-
|
618 |
-
#: inc/admin/ui/options.php:328
|
619 |
-
#, php-format
|
620 |
-
msgid ""
|
621 |
-
"Once your settings saved, optimize all your images by using the %sImagify "
|
622 |
-
"Bulk Optimization%s feature."
|
623 |
-
msgstr ""
|
624 |
-
"Una vez guardada la configuración, optimiza tus imágenes usando la función "
|
625 |
-
"de %soptimización masiva de Imagify%s."
|
626 |
-
|
627 |
-
#: inc/admin/ui/options.php:336
|
628 |
-
msgid "You can choose three levels of compression"
|
629 |
-
msgstr "Puedes elegir entre tres niveles de compresión"
|
630 |
-
|
631 |
-
#: inc/admin/ui/options.php:341
|
632 |
-
msgid ""
|
633 |
-
"This mode provides lossless optimization, your images will be optimized "
|
634 |
-
"without any visible change."
|
635 |
-
msgstr ""
|
636 |
-
"Este modo proporciona una optimización sin pérdidas: tus imágenes serán "
|
637 |
-
"optimizadas sin ningún cambio perceptible."
|
638 |
-
|
639 |
-
#: inc/admin/ui/options.php:344
|
640 |
-
msgid ""
|
641 |
-
"If you want the perfect quality for your images, we recommend you that mode."
|
642 |
-
msgstr ""
|
643 |
-
"Si deseas calidad perfecta para tus imágenes, te recomendamos este modo."
|
644 |
-
|
645 |
-
#: inc/admin/ui/options.php:347
|
646 |
-
msgid ""
|
647 |
-
"Note: the file size reduction will be less, compared to aggressive mode."
|
648 |
-
msgstr ""
|
649 |
-
"Nota: la reducción de tamaño del archivo será inferior, si comparado con el "
|
650 |
-
"modo agresivo."
|
651 |
-
|
652 |
-
#: inc/admin/ui/options.php:354
|
653 |
-
msgid ""
|
654 |
-
"This mode provides perfect optimization of your images without any "
|
655 |
-
"significant quality loss."
|
656 |
-
msgstr ""
|
657 |
-
"Este modo proporciona la perfecta optimización de tus imágenes sin pérdida "
|
658 |
-
"significativa de calidad."
|
659 |
-
|
660 |
-
#: inc/admin/ui/options.php:357
|
661 |
-
msgid ""
|
662 |
-
"This will provide a drastic savings on the initial weight, with a small "
|
663 |
-
"reduction in image quality. Most of the time it's not even noticeable."
|
664 |
-
msgstr ""
|
665 |
-
"Esto proporcionará un ahorro drástico en el peso inicial, y una pequeña "
|
666 |
-
"reducción de la calidad de imagen. La mayoría de las veces no será ni "
|
667 |
-
"perceptible."
|
668 |
-
|
669 |
-
#: inc/admin/ui/options.php:360
|
670 |
-
msgid "If you want the maximum weight reduction, we recommend using this mode."
|
671 |
-
msgstr "Te recomendamos usar este modo si deseas la máxima reducción de peso."
|
672 |
-
|
673 |
-
#: inc/admin/ui/options.php:367
|
674 |
-
msgid ""
|
675 |
-
"This mode will apply all available optimizations for maximum image "
|
676 |
-
"compression."
|
677 |
-
msgstr ""
|
678 |
-
"Este modo aplicará todas las optimizaciones disponibles, para una máxima "
|
679 |
-
"compresión de imagen."
|
680 |
-
|
681 |
-
#: inc/admin/ui/options.php:370
|
682 |
-
msgid ""
|
683 |
-
"This will provide a huge savings on the initial weight. Sometimes the image "
|
684 |
-
"quality could be degraded a little."
|
685 |
-
msgstr ""
|
686 |
-
"Esto proporcionará un gran ahorro en el peso inicial. A veces la calidad de "
|
687 |
-
"la imagen podría disminuir un poco."
|
688 |
-
|
689 |
-
#: inc/admin/ui/options.php:373
|
690 |
-
msgid ""
|
691 |
-
"If you want the maximum weight reduction, and you agree to lose some quality "
|
692 |
-
"on the images we recommend using this mode."
|
693 |
-
msgstr ""
|
694 |
-
"Te recomendamos usar este modo si deseas la máxima reducción de peso y "
|
695 |
-
"aceptas perder algo de calidad en las imágenes."
|
696 |
-
|
697 |
-
#: inc/admin/ui/options.php:380 inc/admin/ui/options.php:502
|
698 |
-
#: inc/functions/admin-ui.php:662 inc/functions/i18n.php:61
|
699 |
-
msgid "Close"
|
700 |
-
msgstr "Cierra"
|
701 |
-
|
702 |
-
#: inc/admin/ui/options.php:392
|
703 |
-
#, php-format
|
704 |
-
msgid "I want to compare%s and%s"
|
705 |
-
msgstr "Quiero comparar %s y %s"
|
706 |
-
|
707 |
-
#: inc/admin/ui/options.php:409
|
708 |
-
#, php-format
|
709 |
-
msgid "Original photography about %s"
|
710 |
-
msgstr "Fotografía original de %s"
|
711 |
-
|
712 |
-
#: inc/admin/ui/options.php:414 inc/admin/ui/options.php:419
|
713 |
-
#: inc/admin/ui/options.php:424
|
714 |
-
#, php-format
|
715 |
-
msgid "Optimized photography about %s"
|
716 |
-
msgstr "Fotografía optimizada de %s"
|
717 |
-
|
718 |
-
#: inc/admin/ui/options.php:429 inc/admin/ui/options.php:439
|
719 |
-
#: inc/admin/ui/options.php:459 inc/admin/ui/options.php:480
|
720 |
-
#: inc/functions/admin-ui.php:59
|
721 |
-
msgid "Level:"
|
722 |
-
msgstr "Nivel:"
|
723 |
-
|
724 |
-
#: inc/admin/ui/options.php:433 inc/admin/ui/options.php:443
|
725 |
-
#: inc/admin/ui/options.php:463 inc/admin/ui/options.php:484
|
726 |
-
#: inc/functions/i18n.php:62
|
727 |
-
msgid "File Size:"
|
728 |
-
msgstr "Tamaño del archivo:"
|
729 |
-
|
730 |
-
#: inc/admin/ui/options.php:447 inc/admin/ui/options.php:467
|
731 |
-
#: inc/admin/ui/options.php:488 inc/functions/admin-ui.php:45
|
732 |
-
#: inc/functions/i18n.php:63
|
733 |
-
msgid "Original Saving:"
|
734 |
-
msgstr "Ahorro inicial:"
|
735 |
-
|
736 |
-
#: inc/admin/upload.php:42 inc/functions/i18n.php:81
|
737 |
-
msgid "Unoptimized"
|
738 |
-
msgstr "No optimizado"
|
739 |
-
|
740 |
-
#: inc/admin/upload.php:43
|
741 |
-
msgid "Errors"
|
742 |
-
msgstr "Errores"
|
743 |
-
|
744 |
-
#: inc/admin/upload.php:46
|
745 |
-
msgid "Filter by status"
|
746 |
-
msgstr "Filtrar por estado"
|
747 |
-
|
748 |
-
#: inc/admin/upload.php:49
|
749 |
-
msgid "All images"
|
750 |
-
msgstr "Todas las imágenes"
|
751 |
-
|
752 |
-
#: inc/classes/class-attachment.php:297
|
753 |
-
msgid ""
|
754 |
-
"This size isn't authorized to be optimized. Update your Imagify settings if "
|
755 |
-
"you want to optimize it."
|
756 |
-
msgstr ""
|
757 |
-
"No tienes autorización para optimizar a este tamaño. Actualiza tu "
|
758 |
-
"configuración de Imagify si quieres optimizarlo."
|
759 |
-
|
760 |
-
#: inc/common/admin-bar.php:48
|
761 |
-
#, php-format
|
762 |
-
msgid "Rate Imagify on %s"
|
763 |
-
msgstr "Valora Imagify en %s"
|
764 |
-
|
765 |
-
#: inc/common/admin-bar.php:61
|
766 |
-
msgid "Loading..."
|
767 |
-
msgstr "Cargando…"
|
768 |
-
|
769 |
-
#: inc/functions/admin-ui.php:36
|
770 |
-
msgid "New Filesize:"
|
771 |
-
msgstr "Nuevo tamaño del archivo:"
|
772 |
-
|
773 |
-
#: inc/functions/admin-ui.php:52
|
774 |
-
msgid "Close details"
|
775 |
-
msgstr "Cerrar detalles"
|
776 |
-
|
777 |
-
#: inc/functions/admin-ui.php:52
|
778 |
-
msgid "View details"
|
779 |
-
msgstr "Ver detalles"
|
780 |
-
|
781 |
-
#: inc/functions/admin-ui.php:56
|
782 |
-
msgid "Original Filesize:"
|
783 |
-
msgstr "Tamaño inicial:"
|
784 |
-
|
785 |
-
#: inc/functions/admin-ui.php:62
|
786 |
-
msgid "Thumbnails Optimized:"
|
787 |
-
msgstr "Miniaturas optimizadas:"
|
788 |
-
|
789 |
-
#: inc/functions/admin-ui.php:63
|
790 |
-
msgid "Overall Saving:"
|
791 |
-
msgstr "Ahorro total:"
|
792 |
-
|
793 |
-
#: inc/functions/admin-ui.php:80
|
794 |
-
msgid "Restoring..."
|
795 |
-
msgstr "Recuperando…"
|
796 |
-
|
797 |
-
#: inc/functions/admin-ui.php:121
|
798 |
-
msgid "Try again"
|
799 |
-
msgstr "Intenta de nuevo"
|
800 |
-
|
801 |
-
#: inc/functions/admin-ui.php:153 inc/functions/admin-ui.php:159
|
802 |
-
#: inc/functions/admin-ui.php:165
|
803 |
-
#, php-format
|
804 |
-
msgid "Re-Optimize to %s"
|
805 |
-
msgstr "Re-optimiza a %s"
|
806 |
-
|
807 |
-
#: inc/functions/admin-ui.php:189
|
808 |
-
#, php-format
|
809 |
-
msgid "%s can't be optimized"
|
810 |
-
msgstr "%s no puede ser optimizado"
|
811 |
-
|
812 |
-
#: inc/functions/admin-ui.php:240
|
813 |
-
msgid "What plan do I need?"
|
814 |
-
msgstr ""
|
815 |
-
|
816 |
-
#: inc/functions/admin-ui.php:244
|
817 |
-
msgid "You're new to Imagify?"
|
818 |
-
msgstr ""
|
819 |
-
|
820 |
-
#: inc/functions/admin-ui.php:245
|
821 |
-
msgid ""
|
822 |
-
"Let us help you by analyzing your existing images and determinate the best "
|
823 |
-
"plan for you"
|
824 |
-
msgstr ""
|
825 |
-
|
826 |
-
#: inc/functions/admin-ui.php:280
|
827 |
-
msgid "Choose Plan"
|
828 |
-
msgstr ""
|
829 |
-
|
830 |
-
#: inc/functions/admin-ui.php:281
|
831 |
-
msgid "Payment Info"
|
832 |
-
msgstr ""
|
833 |
-
|
834 |
-
#: inc/functions/admin-ui.php:286
|
835 |
-
msgid "We analysed your images"
|
836 |
-
msgstr ""
|
837 |
-
|
838 |
-
#: inc/functions/admin-ui.php:292
|
839 |
-
#, php-format
|
840 |
-
msgid "You have %s images"
|
841 |
-
msgstr ""
|
842 |
-
|
843 |
-
#: inc/functions/admin-ui.php:298
|
844 |
-
#, php-format
|
845 |
-
msgid "You actually have %s of images in your library."
|
846 |
-
msgstr ""
|
847 |
-
|
848 |
-
#: inc/functions/admin-ui.php:302
|
849 |
-
#, php-format
|
850 |
-
msgid "You upload around %s of images per month."
|
851 |
-
msgstr ""
|
852 |
-
|
853 |
-
#: inc/functions/admin-ui.php:309
|
854 |
-
msgid "We recommend you this plan"
|
855 |
-
msgstr ""
|
856 |
-
|
857 |
-
#: inc/functions/admin-ui.php:314
|
858 |
-
msgid "Subscribe a monthly plan"
|
859 |
-
msgstr ""
|
860 |
-
|
861 |
-
#: inc/functions/admin-ui.php:315
|
862 |
-
msgid "Subscribe a yearly plan"
|
863 |
-
msgstr ""
|
864 |
-
|
865 |
-
#: inc/functions/admin-ui.php:319 inc/functions/admin-ui.php:455
|
866 |
-
#: inc/functions/admin-ui.php:623
|
867 |
-
msgid "Monthly"
|
868 |
-
msgstr ""
|
869 |
-
|
870 |
-
#: inc/functions/admin-ui.php:322 inc/functions/admin-ui.php:458
|
871 |
-
#: inc/functions/admin-ui.php:626
|
872 |
-
msgid "Yearly"
|
873 |
-
msgstr ""
|
874 |
-
|
875 |
-
#: inc/functions/admin-ui.php:322 inc/functions/admin-ui.php:458
|
876 |
-
#: inc/functions/admin-ui.php:626
|
877 |
-
msgid "2 months free"
|
878 |
-
msgstr ""
|
879 |
-
|
880 |
-
#: inc/functions/admin-ui.php:333 inc/functions/admin-ui.php:352
|
881 |
-
#: inc/functions/admin-ui.php:468 inc/functions/admin-ui.php:478
|
882 |
-
msgid "/month"
|
883 |
-
msgstr ""
|
884 |
-
|
885 |
-
#: inc/functions/admin-ui.php:335 inc/functions/admin-ui.php:383
|
886 |
-
#: inc/functions/admin-ui.php:470 inc/functions/admin-ui.php:521
|
887 |
-
#, php-format
|
888 |
-
msgid "approx: %s images"
|
889 |
-
msgstr ""
|
890 |
-
|
891 |
-
#: inc/functions/admin-ui.php:356 inc/functions/admin-ui.php:484
|
892 |
-
#, php-format
|
893 |
-
msgid ""
|
894 |
-
"%s per<br>\n"
|
895 |
-
"additionnal Gb"
|
896 |
-
msgstr ""
|
897 |
-
|
898 |
-
#: inc/functions/admin-ui.php:361 inc/functions/admin-ui.php:396
|
899 |
-
#: inc/functions/admin-ui.php:580 inc/functions/admin-ui.php:601
|
900 |
-
msgid "Choose another plan"
|
901 |
-
msgstr ""
|
902 |
-
|
903 |
-
#: inc/functions/admin-ui.php:371
|
904 |
-
msgid "Optimize the images you already have, buy a one-time plan"
|
905 |
-
msgstr ""
|
906 |
-
|
907 |
-
#: inc/functions/admin-ui.php:407
|
908 |
-
msgid "Checkout"
|
909 |
-
msgstr ""
|
910 |
-
|
911 |
-
#: inc/functions/admin-ui.php:411
|
912 |
-
msgid ""
|
913 |
-
"Monthly plans comes with credits which is renewed every months. The billing "
|
914 |
-
"happens automatically each month or year depending the billing period you "
|
915 |
-
"choose."
|
916 |
-
msgstr ""
|
917 |
-
|
918 |
-
#: inc/functions/admin-ui.php:435
|
919 |
-
msgid "Monthly Plans"
|
920 |
-
msgstr ""
|
921 |
-
|
922 |
-
#: inc/functions/admin-ui.php:440
|
923 |
-
msgid "One Time Plans"
|
924 |
-
msgstr ""
|
925 |
-
|
926 |
-
#: inc/functions/admin-ui.php:450
|
927 |
-
msgid ""
|
928 |
-
"Monthly plans come with credits which is renewed every months. The billing "
|
929 |
-
"happens automatically each month or year depending the billing period you "
|
930 |
-
"choose."
|
931 |
-
msgstr ""
|
932 |
-
|
933 |
-
#: inc/functions/admin-ui.php:482 inc/functions/admin-ui.php:529
|
934 |
-
msgid "we recommend for you"
|
935 |
-
msgstr ""
|
936 |
-
|
937 |
-
#: inc/functions/admin-ui.php:490 inc/functions/admin-ui.php:533
|
938 |
-
msgid "Choose plan"
|
939 |
-
msgstr ""
|
940 |
-
|
941 |
-
#: inc/functions/admin-ui.php:498
|
942 |
-
msgid "Need more?"
|
943 |
-
msgstr ""
|
944 |
-
|
945 |
-
#: inc/functions/admin-ui.php:499
|
946 |
-
msgid "for special needs"
|
947 |
-
msgstr ""
|
948 |
-
|
949 |
-
#: inc/functions/admin-ui.php:503
|
950 |
-
msgid "Contact Us"
|
951 |
-
msgstr ""
|
952 |
-
|
953 |
-
#: inc/functions/admin-ui.php:510
|
954 |
-
msgid ""
|
955 |
-
"One time plans are useful if you have a lots of existing images which need "
|
956 |
-
"to be optimized. You can use it for bulk optimizing all your past images. "
|
957 |
-
"You will pay only once."
|
958 |
-
msgstr ""
|
959 |
-
|
960 |
-
#: inc/functions/admin-ui.php:563
|
961 |
-
msgid "Your order"
|
962 |
-
msgstr ""
|
963 |
-
|
964 |
-
#: inc/functions/admin-ui.php:568
|
965 |
-
#, php-format
|
966 |
-
msgid "%scancel%sYou just removed %s"
|
967 |
-
msgstr ""
|
968 |
-
|
969 |
-
#: inc/functions/admin-ui.php:576 inc/functions/admin-ui.php:597
|
970 |
-
msgid "Remove this item"
|
971 |
-
msgstr ""
|
972 |
-
|
973 |
-
#: inc/functions/admin-ui.php:583
|
974 |
-
#, php-format
|
975 |
-
msgid "%s per month"
|
976 |
-
msgstr ""
|
977 |
-
|
978 |
-
#: inc/functions/admin-ui.php:604
|
979 |
-
#, php-format
|
980 |
-
msgid "one time %s"
|
981 |
-
msgstr ""
|
982 |
-
|
983 |
-
#: inc/functions/admin-ui.php:617
|
984 |
-
#, php-format
|
985 |
-
msgid ""
|
986 |
-
"Switch to yearly subscription and <br><strong class=\"imagify-dark\">save %s "
|
987 |
-
"per year!</strong>"
|
988 |
-
msgstr ""
|
989 |
-
|
990 |
-
#: inc/functions/admin-ui.php:618
|
991 |
-
#, php-format
|
992 |
-
msgid ""
|
993 |
-
"Perfect!<br>You're <strong class=\"imagify-dark\">saving %s per year!</"
|
994 |
-
"strong>"
|
995 |
-
msgstr ""
|
996 |
-
|
997 |
-
#: inc/functions/admin-ui.php:657
|
998 |
-
msgid "Thank you for being awesome!"
|
999 |
-
msgstr ""
|
1000 |
-
|
1001 |
-
#: inc/functions/admin-ui.php:668
|
1002 |
-
msgid "What do our user think about Imagify"
|
1003 |
-
msgstr ""
|
1004 |
-
|
1005 |
-
#: inc/functions/admin-ui.php:702
|
1006 |
-
msgid "Secure Credit Card Payment"
|
1007 |
-
msgstr ""
|
1008 |
-
|
1009 |
-
#: inc/functions/admin-ui.php:703
|
1010 |
-
msgid "This is secure 128-bits SSL encrypted payment"
|
1011 |
-
msgstr ""
|
1012 |
-
|
1013 |
-
#: inc/functions/i18n.php:20
|
1014 |
-
msgid "Let's get you started!"
|
1015 |
-
msgstr "¡Vamos a comenzar!"
|
1016 |
-
|
1017 |
-
#: inc/functions/i18n.php:21
|
1018 |
-
msgid "Enter your email to get an API key:"
|
1019 |
-
msgstr "Ingresa tu email para obtener un clave API:"
|
1020 |
-
|
1021 |
-
#: inc/functions/i18n.php:22
|
1022 |
-
msgid "Sign Up"
|
1023 |
-
msgstr "Registrate"
|
1024 |
-
|
1025 |
-
#: inc/functions/i18n.php:23
|
1026 |
-
msgid "You need to specify an email!"
|
1027 |
-
msgstr "¡Es necesario especificar una dirección email!"
|
1028 |
-
|
1029 |
-
#: inc/functions/i18n.php:24 inc/functions/i18n.php:31
|
1030 |
-
msgid "Congratulations!"
|
1031 |
-
msgstr "¡Enhorabuena!"
|
1032 |
-
|
1033 |
-
#: inc/functions/i18n.php:25
|
1034 |
-
msgid ""
|
1035 |
-
"Your account has been succesfully created. Please check your mailbox, you "
|
1036 |
-
"are going to receive an email with API key."
|
1037 |
-
msgstr ""
|
1038 |
-
"Tu cuenta ha sido creada con éxito. Por favor, revisa tu buzón de correo, "
|
1039 |
-
"recibirás un email con la clave API."
|
1040 |
-
|
1041 |
-
#: inc/functions/i18n.php:26
|
1042 |
-
msgid "Connect to Imagify!"
|
1043 |
-
msgstr "¡Conéctate a Imagify!"
|
1044 |
-
|
1045 |
-
#: inc/functions/i18n.php:27
|
1046 |
-
msgid "Paste your API key below:"
|
1047 |
-
msgstr "Pega aquí abajo tu clave API:"
|
1048 |
-
|
1049 |
-
#: inc/functions/i18n.php:28
|
1050 |
-
msgid "Connect me"
|
1051 |
-
msgstr "Conéctame"
|
1052 |
-
|
1053 |
-
#: inc/functions/i18n.php:29
|
1054 |
-
msgid "Check in progress..."
|
1055 |
-
msgstr "Control en curso…"
|
1056 |
-
|
1057 |
-
#: inc/functions/i18n.php:30
|
1058 |
-
msgid "You need to specify your api key!"
|
1059 |
-
msgstr "¡Es necesario especificar una clave api!"
|
1060 |
-
|
1061 |
-
#: inc/functions/i18n.php:32
|
1062 |
-
msgid ""
|
1063 |
-
"Your API key is valid. You can now configure the Imagify settings to "
|
1064 |
-
"optimize your images."
|
1065 |
-
msgstr ""
|
1066 |
-
"Tu clave API es válida. Ahora puedes configurar los parámetros de Imagify "
|
1067 |
-
"para optimizar tus imágenes."
|
1068 |
-
|
1069 |
-
#: inc/functions/i18n.php:34
|
1070 |
-
msgid "Cancel"
|
1071 |
-
msgstr ""
|
1072 |
-
|
1073 |
-
#: inc/functions/i18n.php:41
|
1074 |
-
msgid "Don't Need a Parachute?"
|
1075 |
-
msgstr "¿No necesitas un paracaídas?"
|
1076 |
-
|
1077 |
-
#: inc/functions/i18n.php:42
|
1078 |
-
msgid ""
|
1079 |
-
"If you keep this option deactivated, you won't be able to re-optimize your "
|
1080 |
-
"images to another compression level and restore your original images in case "
|
1081 |
-
"of need."
|
1082 |
-
msgstr ""
|
1083 |
-
"Si mantienes esta opción desactivada, no podrás re-optimizar tus imágenes a "
|
1084 |
-
"otro nivel de compresión ni restablecer la imagen original en caso de "
|
1085 |
-
"necesidad."
|
1086 |
-
|
1087 |
-
#: inc/functions/i18n.php:58
|
1088 |
-
msgid "Original Image"
|
1089 |
-
msgstr "Imagen original"
|
1090 |
-
|
1091 |
-
#: inc/functions/i18n.php:59
|
1092 |
-
msgid "Optimized Image"
|
1093 |
-
msgstr "Imagen optimizada"
|
1094 |
-
|
1095 |
-
#: inc/functions/i18n.php:73
|
1096 |
-
msgid "Please wait..."
|
1097 |
-
msgstr "Espera, por favor…"
|
1098 |
-
|
1099 |
-
#: inc/functions/i18n.php:74
|
1100 |
-
msgid ""
|
1101 |
-
"We are trying to get your unoptimized images, it may take time depending on "
|
1102 |
-
"the number of images."
|
1103 |
-
msgstr ""
|
1104 |
-
"Estamos tratando de obtener tus imágenes no optimizadas: esto puede tomar "
|
1105 |
-
"tiempo, dependiendo del número de imágenes."
|
1106 |
-
|
1107 |
-
#: inc/functions/i18n.php:76
|
1108 |
-
msgid "Oops, There is something wrong!"
|
1109 |
-
msgstr "Ups, algo no ha ido bien!"
|
1110 |
-
|
1111 |
-
#: inc/functions/i18n.php:77
|
1112 |
-
msgid ""
|
1113 |
-
"An unknow error occurred when we tried to get all your unoptimized images. "
|
1114 |
-
"Try again and if the issue still persist, please contact us!"
|
1115 |
-
msgstr ""
|
1116 |
-
"Un error inesperado ha ocurrido mientras tratábamos de obtener todas tus "
|
1117 |
-
"imágenes no optimizadas. Inténtalo otra vez y, si el problema persiste, "
|
1118 |
-
"contáctanos por favor!"
|
1119 |
-
|
1120 |
-
#: inc/functions/i18n.php:82
|
1121 |
-
msgid "Error"
|
1122 |
-
msgstr "Error"
|
1123 |
-
|
1124 |
-
#: inc/functions/i18n.php:85
|
1125 |
-
msgid "Hold on!"
|
1126 |
-
msgstr "¡Espera!"
|
1127 |
-
|
1128 |
-
#: inc/functions/i18n.php:86
|
1129 |
-
msgid "All your images have been optimized by Imagify. Congratulations!"
|
1130 |
-
msgstr "Todas tus imágenes han sido optimizadas por Imagify. ¡Enhorabuena!"
|
1131 |
-
|
1132 |
-
#: inc/functions/i18n.php:88
|
1133 |
-
#, php-format
|
1134 |
-
msgid ""
|
1135 |
-
"Discover @imagify, the new compression tool to optimize your images for "
|
1136 |
-
"free. I saved %1$s out of %2$s!"
|
1137 |
-
msgstr ""
|
1138 |
-
"Descubre @imagify, la nueva herramienta de compresión para optimizar tus "
|
1139 |
-
"imágenes gratuitamente. Me ha ahorrado %1$s de %2$s!"
|
1140 |
-
|
1141 |
-
#: inc/functions/i18n.php:92
|
1142 |
-
msgid "Imagify is still processing. Are you sure you want to leave this page?"
|
1143 |
-
msgstr "Imagify sigue procesando. Estás seguro que quieres dejar la página?"
|
1144 |
-
|
1145 |
-
#: inc/functions/i18n.php:101
|
1146 |
-
msgid "F j, Y"
|
1147 |
-
msgstr "F j, Y"
|
1148 |
-
|
1149 |
-
#: inc/functions/process.php:40
|
1150 |
-
msgid ""
|
1151 |
-
"Sorry, our servers are temporarily unaccessible. Please, try again in a "
|
1152 |
-
"couple of minutes."
|
1153 |
-
msgstr ""
|
1154 |
-
"Lo sentimos, nuestros servidores están temporalmente inaccesibles. Por "
|
1155 |
-
"favor, inténtalo de nuevo en un par de minutos."
|
1156 |
-
|
1157 |
-
#: inc/functions/process.php:46
|
1158 |
-
msgid "External HTTP requests are blocked"
|
1159 |
-
msgstr "Las peticiones HTTP externas están bloqueadas"
|
1160 |
-
|
1161 |
-
#: inc/functions/process.php:52
|
1162 |
-
msgid "File path is empty"
|
1163 |
-
msgstr "La ruta del archivo está vacía"
|
1164 |
-
|
1165 |
-
#: inc/functions/process.php:58
|
1166 |
-
#, php-format
|
1167 |
-
msgid "Could not find %s"
|
1168 |
-
msgstr "No se pudo encontrar %s"
|
1169 |
-
|
1170 |
-
#: inc/functions/process.php:63
|
1171 |
-
#, php-format
|
1172 |
-
msgid "%s is not writable"
|
1173 |
-
msgstr "%s no tiene permisos de escritura"
|
1174 |
-
|
1175 |
-
#: inc/functions/process.php:72
|
1176 |
-
#, php-format
|
1177 |
-
msgid "Skipped (%s), image not found."
|
1178 |
-
msgstr "Omitido (%s), imagen no encontrada."
|
1179 |
-
|
1180 |
-
#~ msgid "Your default setting:"
|
1181 |
-
#~ msgstr "Tu configuración por defecto:"
|
1182 |
-
|
1183 |
-
#~ msgid ""
|
1184 |
-
#~ "All images which are over to %s could be optimized using the pro version."
|
1185 |
-
#~ msgstr ""
|
1186 |
-
#~ "Todas las imágenes de tamaño superior a %s pueden optimizarse utilizando "
|
1187 |
-
#~ "la versión pro."
|
1188 |
-
|
1189 |
-
#~ msgid ""
|
1190 |
-
#~ "%1$sCongratulations%2$s, you have optimized %1$s%3$d images%2$s and "
|
1191 |
-
#~ "improved your website's by reducing your images size."
|
1192 |
-
#~ msgstr ""
|
1193 |
-
#~ "%1$s¡En hora buena!%2$s Has optimizado %1$s%3$d imágenes%2$s y ahora tu "
|
1194 |
-
#~ "sitio web es más rápido."
|
1195 |
-
|
1196 |
-
#~ msgid ""
|
1197 |
-
#~ "%1$sCongratulations%2$s, you have optimized %1$s%3$d images%2$s and speed "
|
1198 |
-
#~ "up your website by reducing your images size."
|
1199 |
-
#~ msgstr ""
|
1200 |
-
#~ "%1$s¡En hora buena!%2$s Has optimizado %1$s%3$d imágenes%2$s y ahora tu "
|
1201 |
-
#~ "sitio web es más rápido."
|
1202 |
-
|
1203 |
-
#~ msgid ""
|
1204 |
-
#~ "Sorry, our servers are temporally unaccessible. Please, try again in a "
|
1205 |
-
#~ "couple of minutes"
|
1206 |
-
#~ msgstr ""
|
1207 |
-
#~ "Lo sentimos, nuestros servidores están temporalmente inaccesibles. Por "
|
1208 |
-
#~ "favor, inténtalo de nuevo en un par de minutos"
|
1209 |
-
|
1210 |
-
#~ msgid "Rate Imagify on WordPress.org"
|
1211 |
-
#~ msgstr "Valora Imagify en WordPress.org"
|
1212 |
-
|
1213 |
-
#~ msgid "Discover our other products"
|
1214 |
-
#~ msgstr "Descubre nuestros otros productos"
|
1215 |
-
|
1216 |
-
#~ msgid "Is your WordPress website too slow?"
|
1217 |
-
#~ msgstr "¿Tu sitio WordPress es demasiado lento?"
|
1218 |
-
|
1219 |
-
#~ msgid "Checking in process..."
|
1220 |
-
#~ msgstr "Control en curso…"
|
1221 |
-
|
1222 |
-
#~ msgid ""
|
1223 |
-
#~ "If you are a photographer, you may be interested in by this option if you "
|
1224 |
-
#~ "are displaying some infos like your the model of your camera on your "
|
1225 |
-
#~ "pages."
|
1226 |
-
#~ msgstr ""
|
1227 |
-
#~ "Si eres un fotógrafo, puedes estar interesado en esta opción si quieres "
|
1228 |
-
#~ "enseñar en tus páginas alguna info, por ejemplo el modelo de tu cámara."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
languages/imagify-fr_FR.mo
DELETED
Binary file
|
languages/imagify-fr_FR.po
DELETED
@@ -1,1574 +0,0 @@
|
|
1 |
-
msgid ""
|
2 |
-
msgstr ""
|
3 |
-
"Project-Id-Version: Imagify\n"
|
4 |
-
"POT-Creation-Date: 2017-04-05 12:25+0200\n"
|
5 |
-
"PO-Revision-Date: 2017-04-05 12:25+0200\n"
|
6 |
-
"Last-Translator: Rémy Perona <remperona@gmail.com>\n"
|
7 |
-
"Language-Team: \n"
|
8 |
-
"Language: fr_FR\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"X-Generator: Poedit 2.0\n"
|
13 |
-
"X-Poedit-Basepath: ..\n"
|
14 |
-
"X-Poedit-WPHeader: imagify.php\n"
|
15 |
-
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
16 |
-
"X-Poedit-SourceCharset: UTF-8\n"
|
17 |
-
"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
|
18 |
-
"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
|
19 |
-
"_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
|
20 |
-
"X-Poedit-SearchPath-0: .\n"
|
21 |
-
"X-Poedit-SearchPathExcluded-0: *.js\n"
|
22 |
-
|
23 |
-
#: inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:20 inc/admin/ajax.php:123
|
24 |
-
#: inc/admin/meta-boxes.php:34 inc/functions/admin-ui.php:215
|
25 |
-
#: inc/functions/i18n.php:52 inc/functions/i18n.php:67
|
26 |
-
msgid "Optimize"
|
27 |
-
msgstr "Optimiser"
|
28 |
-
|
29 |
-
#: inc/3rd-party/nextgen-gallery/inc/admin/enqueue.php:21
|
30 |
-
#: inc/functions/admin-ui.php:80 inc/functions/i18n.php:53
|
31 |
-
msgid "Restore Original"
|
32 |
-
msgstr "Restaurer l’original"
|
33 |
-
|
34 |
-
#: inc/3rd-party/nextgen-gallery/inc/admin/menu.php:16 inc/admin/menu.php:24
|
35 |
-
#: inc/admin/plugins.php:13 inc/admin/ui/bulk.php:81 inc/common/admin-bar.php:39
|
36 |
-
msgid "Bulk Optimization"
|
37 |
-
msgstr "Optimisation en masse"
|
38 |
-
|
39 |
-
#: inc/admin/ajax.php:123 inc/admin/meta-boxes.php:29
|
40 |
-
#: inc/functions/admin-ui.php:121 inc/functions/admin-ui.php:153
|
41 |
-
#: inc/functions/admin-ui.php:159 inc/functions/admin-ui.php:165
|
42 |
-
#: inc/functions/admin-ui.php:205 inc/functions/admin-ui.php:215
|
43 |
-
msgid "Optimizing..."
|
44 |
-
msgstr "En cours d’optimisation…"
|
45 |
-
|
46 |
-
#: inc/admin/ajax.php:507
|
47 |
-
msgid "Oops, It's almost over!"
|
48 |
-
msgstr "Oups, c’est bientôt fini !"
|
49 |
-
|
50 |
-
#: inc/admin/ajax.php:508
|
51 |
-
#, php-format
|
52 |
-
msgid ""
|
53 |
-
"You have almost used all your credit.%sDon't forget to upgrade your "
|
54 |
-
"subscription to continue optimizing your images."
|
55 |
-
msgstr ""
|
56 |
-
"Vous avez bientôt utilisé tout votre crédit.%sN’oubliez pas de mettre à niveau "
|
57 |
-
"votre abonnement pour continuer à optimiser vos images."
|
58 |
-
|
59 |
-
#: inc/admin/ajax.php:509 inc/admin/ui/bulk.php:23
|
60 |
-
msgid "View My Subscription"
|
61 |
-
msgstr "Voir mon abonnement"
|
62 |
-
|
63 |
-
#: inc/admin/ajax.php:517 inc/admin/ui/notices.php:258 inc/functions/i18n.php:87
|
64 |
-
msgid "Oops, It's Over!"
|
65 |
-
msgstr "Oups, c’est fini !"
|
66 |
-
|
67 |
-
#: inc/admin/ajax.php:518 inc/admin/ui/notices.php:260 inc/functions/i18n.php:104
|
68 |
-
#, php-format
|
69 |
-
msgid ""
|
70 |
-
"You have consumed all your credit for this month. You will have <strong>%s "
|
71 |
-
"back on %s</strong>."
|
72 |
-
msgstr ""
|
73 |
-
"Vous avez consommé tout votre crédit pour ce mois. Vous aurez à nouveau "
|
74 |
-
"<strong>%s le %s</strong>."
|
75 |
-
|
76 |
-
#: inc/admin/ajax.php:519
|
77 |
-
msgid "Upgrade My Subscription"
|
78 |
-
msgstr "Mettre à niveau mon abonnement"
|
79 |
-
|
80 |
-
#: inc/admin/ajax.php:538 inc/admin/ui/bulk.php:17
|
81 |
-
msgid "Account status"
|
82 |
-
msgstr "Type de compte"
|
83 |
-
|
84 |
-
#: inc/admin/ajax.php:539 inc/admin/ui/bulk.php:18
|
85 |
-
msgid "Your subscription:"
|
86 |
-
msgstr "Votre abonnement :"
|
87 |
-
|
88 |
-
#: inc/admin/ajax.php:547 inc/admin/ui/bulk.php:48
|
89 |
-
#, php-format
|
90 |
-
msgid "You have %s space credit left"
|
91 |
-
msgstr "Il vous reste %s de crédit"
|
92 |
-
|
93 |
-
#: inc/admin/ajax.php:559
|
94 |
-
msgid "View my subscription"
|
95 |
-
msgstr "Voir mon abonnement"
|
96 |
-
|
97 |
-
#: inc/admin/media.php:63 inc/functions/i18n.php:63
|
98 |
-
msgid "Compare Original VS Optimized"
|
99 |
-
msgstr "Comparer Originale VS Optimisée"
|
100 |
-
|
101 |
-
#. Plugin Name of the plugin/theme
|
102 |
-
#: inc/admin/meta-boxes.php:17 inc/admin/meta-boxes.php:24
|
103 |
-
#: inc/admin/upload.php:12
|
104 |
-
msgid "Imagify"
|
105 |
-
msgstr "Imagify"
|
106 |
-
|
107 |
-
#: inc/admin/meta-boxes.php:19 inc/functions/admin-ui.php:195
|
108 |
-
msgid "Invalid API key"
|
109 |
-
msgstr "Clé API invalide"
|
110 |
-
|
111 |
-
#: inc/admin/meta-boxes.php:21 inc/functions/admin-ui.php:197
|
112 |
-
msgid "Check your Settings"
|
113 |
-
msgstr "Vérifiez vos réglages"
|
114 |
-
|
115 |
-
#: inc/admin/options.php:127
|
116 |
-
msgid "Cheatin’ uh?"
|
117 |
-
msgstr "Cheatin’ uh?"
|
118 |
-
|
119 |
-
#: inc/admin/options.php:135
|
120 |
-
msgid "<strong>ERROR</strong>: options page not found."
|
121 |
-
msgstr "<strong>Erreur</strong> : page d’options introuvable."
|
122 |
-
|
123 |
-
#: inc/admin/plugins.php:14 inc/admin/ui/options.php:74
|
124 |
-
#: inc/common/admin-bar.php:30
|
125 |
-
msgid "Settings"
|
126 |
-
msgstr "Réglages"
|
127 |
-
|
128 |
-
#: inc/admin/ui/bulk.php:60
|
129 |
-
msgid "Upgrade your account to continue optimizing your images"
|
130 |
-
msgstr "Mettez à niveau votre compte pour continuer à optimiser vos images"
|
131 |
-
|
132 |
-
#: inc/admin/ui/bulk.php:64
|
133 |
-
msgid "More info"
|
134 |
-
msgstr "Plus d’infos"
|
135 |
-
|
136 |
-
#: inc/admin/ui/bulk.php:91
|
137 |
-
msgid "Overview"
|
138 |
-
msgstr "Vue d'ensemble"
|
139 |
-
|
140 |
-
#: inc/admin/ui/bulk.php:99
|
141 |
-
#, php-format
|
142 |
-
msgid "You optimized %s images of your website"
|
143 |
-
msgstr "Vous avez optimisé %s des images de votre site"
|
144 |
-
|
145 |
-
#: inc/admin/ui/bulk.php:103
|
146 |
-
msgid "Statistics"
|
147 |
-
msgstr "Statistiques"
|
148 |
-
|
149 |
-
#: inc/admin/ui/bulk.php:115
|
150 |
-
msgid "that's the number of images you optimized with Imagify"
|
151 |
-
msgstr "c’est le nombre d’images que %svous avez optimisé avec Imagify"
|
152 |
-
|
153 |
-
#: inc/admin/ui/bulk.php:120
|
154 |
-
msgid "Original size"
|
155 |
-
msgstr "Poids de l’original"
|
156 |
-
|
157 |
-
#: inc/admin/ui/bulk.php:125
|
158 |
-
msgid "Optimized size"
|
159 |
-
msgstr "Poids optimisé"
|
160 |
-
|
161 |
-
#: inc/admin/ui/bulk.php:136
|
162 |
-
#, php-format
|
163 |
-
msgid "that's the size you saved %sby using Imagify"
|
164 |
-
msgstr "c’est le poids que vous avez économisé %sen utilisant Imagify"
|
165 |
-
|
166 |
-
#: inc/admin/ui/bulk.php:142
|
167 |
-
msgid "Information"
|
168 |
-
msgstr "Informations"
|
169 |
-
|
170 |
-
#: inc/admin/ui/bulk.php:146
|
171 |
-
msgid ""
|
172 |
-
"Please be aware that optimizing a large number of images can take a while "
|
173 |
-
"depending on your server and network speed."
|
174 |
-
msgstr ""
|
175 |
-
"Prenez conscience que l’optimisation d’un grand nombre d’images peut prendre "
|
176 |
-
"du temps en fonction de la rapidité de votre serveur et de votre connexion."
|
177 |
-
|
178 |
-
#: inc/admin/ui/bulk.php:149
|
179 |
-
#, php-format
|
180 |
-
msgid ""
|
181 |
-
"If you have more than %s images, you will need to launch the bulk optimization "
|
182 |
-
"several times."
|
183 |
-
msgstr ""
|
184 |
-
"Si vous avez plus de %s images, vous devrez lancer l’optimisation en masse "
|
185 |
-
"plusieurs fois."
|
186 |
-
|
187 |
-
#: inc/admin/ui/bulk.php:153
|
188 |
-
msgid ""
|
189 |
-
"You must keep this page open while the bulk optimizaton is processing. If you "
|
190 |
-
"leave you can come back to continue where it left off."
|
191 |
-
msgstr ""
|
192 |
-
"Vous devez garder cette page ouverte pendant que l’optimisation en masse est "
|
193 |
-
"en cours. Si vous la quittez, vous pouvez revenir pour continuer là où vous en "
|
194 |
-
"étiez."
|
195 |
-
|
196 |
-
#: inc/admin/ui/bulk.php:164
|
197 |
-
msgid "Select Your Compression Level"
|
198 |
-
msgstr "Sélectionnez votre niveau de compression"
|
199 |
-
|
200 |
-
#: inc/admin/ui/bulk.php:166 inc/admin/ui/bulk.php:192
|
201 |
-
#: inc/admin/ui/options.php:136 inc/admin/ui/options.php:342
|
202 |
-
#: inc/admin/ui/options.php:381 inc/admin/ui/options.php:398
|
203 |
-
#: inc/admin/ui/options.php:458 inc/classes/abstracts/abstract-attachment.php:114
|
204 |
-
#: inc/functions/admin-ui.php:153
|
205 |
-
msgid "Ultra"
|
206 |
-
msgstr "Ultra"
|
207 |
-
|
208 |
-
#: inc/admin/ui/bulk.php:169 inc/admin/ui/bulk.php:187
|
209 |
-
#: inc/admin/ui/options.php:131 inc/admin/ui/options.php:329
|
210 |
-
#: inc/admin/ui/options.php:380 inc/admin/ui/options.php:393
|
211 |
-
#: inc/admin/ui/options.php:437 inc/classes/abstracts/abstract-attachment.php:117
|
212 |
-
#: inc/functions/admin-ui.php:159
|
213 |
-
msgid "Aggressive"
|
214 |
-
msgstr "Agressif"
|
215 |
-
|
216 |
-
#: inc/admin/ui/bulk.php:172 inc/admin/ui/bulk.php:182
|
217 |
-
#: inc/admin/ui/options.php:126 inc/admin/ui/options.php:316
|
218 |
-
#: inc/admin/ui/options.php:379 inc/admin/ui/options.php:388
|
219 |
-
#: inc/admin/ui/options.php:417 inc/classes/abstracts/abstract-attachment.php:120
|
220 |
-
#: inc/functions/admin-ui.php:165
|
221 |
-
msgid "Normal"
|
222 |
-
msgstr "Normal"
|
223 |
-
|
224 |
-
#: inc/admin/ui/bulk.php:176
|
225 |
-
#, php-format
|
226 |
-
msgid "Your default setting: %s"
|
227 |
-
msgstr "Votre réglage par défaut : %s"
|
228 |
-
|
229 |
-
#: inc/admin/ui/bulk.php:201
|
230 |
-
#, php-format
|
231 |
-
msgid "Don't forget to check %syour settings%s before bulk optimization."
|
232 |
-
msgstr ""
|
233 |
-
"N’oubliez pas de vérifier %svos réglages%s avant l’optimisation en masse."
|
234 |
-
|
235 |
-
#: inc/admin/ui/bulk.php:208
|
236 |
-
msgid "Let's go!"
|
237 |
-
msgstr "C’est parti !"
|
238 |
-
|
239 |
-
#: inc/admin/ui/bulk.php:215
|
240 |
-
msgid "Imagif'em all"
|
241 |
-
msgstr "Imagif'em all"
|
242 |
-
|
243 |
-
#: inc/admin/ui/bulk.php:220
|
244 |
-
#, php-format
|
245 |
-
msgid "All images greater than %s will be optimized when using a paid plan."
|
246 |
-
msgstr ""
|
247 |
-
"Toutes les images de plus de %s seront optimisées lors de l'utilisation d'un "
|
248 |
-
"plan payant."
|
249 |
-
|
250 |
-
#: inc/admin/ui/bulk.php:239
|
251 |
-
msgid "Well done!"
|
252 |
-
msgstr "Bien joué !"
|
253 |
-
|
254 |
-
#: inc/admin/ui/bulk.php:240
|
255 |
-
#, php-format
|
256 |
-
msgid "you saved %1$s out of %2$s"
|
257 |
-
msgstr "vous avez économisé %1$s sur %2$s"
|
258 |
-
|
259 |
-
#: inc/admin/ui/bulk.php:245
|
260 |
-
msgid "Share your awesome result"
|
261 |
-
msgstr "Partagez votre résultat"
|
262 |
-
|
263 |
-
#: inc/admin/ui/bulk.php:260
|
264 |
-
msgid "Compression process results"
|
265 |
-
msgstr "Résultats du processus de compression"
|
266 |
-
|
267 |
-
#: inc/admin/ui/bulk.php:263
|
268 |
-
msgid "Filename"
|
269 |
-
msgstr "Nom du fichier"
|
270 |
-
|
271 |
-
#: inc/admin/ui/bulk.php:264
|
272 |
-
msgid "Status"
|
273 |
-
msgstr "Statut"
|
274 |
-
|
275 |
-
#: inc/admin/ui/bulk.php:265 inc/admin/ui/options.php:378
|
276 |
-
#: inc/admin/ui/options.php:383 inc/admin/ui/options.php:407
|
277 |
-
msgid "Original"
|
278 |
-
msgstr "Original"
|
279 |
-
|
280 |
-
#: inc/admin/ui/bulk.php:266 inc/admin/upload.php:41 inc/functions/i18n.php:83
|
281 |
-
msgid "Optimized"
|
282 |
-
msgstr "Optimisées"
|
283 |
-
|
284 |
-
#: inc/admin/ui/bulk.php:267
|
285 |
-
msgid "Percentage"
|
286 |
-
msgstr "Pourcentage"
|
287 |
-
|
288 |
-
#: inc/admin/ui/bulk.php:268
|
289 |
-
msgid "Thumbnails optimized"
|
290 |
-
msgstr "Miniatures optimisées"
|
291 |
-
|
292 |
-
#: inc/admin/ui/bulk.php:269
|
293 |
-
msgid "Overall saving"
|
294 |
-
msgstr "Gain total"
|
295 |
-
|
296 |
-
#: inc/admin/ui/bulk.php:274
|
297 |
-
msgid "file"
|
298 |
-
msgstr "fichier"
|
299 |
-
|
300 |
-
#: inc/admin/ui/bulk.php:275
|
301 |
-
msgid "error"
|
302 |
-
msgstr "erreur"
|
303 |
-
|
304 |
-
#: inc/admin/ui/bulk.php:276
|
305 |
-
msgid "Total:"
|
306 |
-
msgstr "Total :"
|
307 |
-
|
308 |
-
#: inc/admin/ui/bulk.php:277
|
309 |
-
msgid "Gain:"
|
310 |
-
msgstr "Gain :"
|
311 |
-
|
312 |
-
#: inc/admin/ui/bulk.php:294
|
313 |
-
#, php-format
|
314 |
-
msgid "%sStart the bulk optimization%s"
|
315 |
-
msgstr "%sDémarrer l’optimisation en masse%s"
|
316 |
-
|
317 |
-
#: inc/admin/ui/notices.php:24
|
318 |
-
msgid "Welcome to Imagify, the best way to easily optimize your images!"
|
319 |
-
msgstr ""
|
320 |
-
"Bienvenue sur Imagify, la meilleure façon d'optimiser facilement vos "
|
321 |
-
"images !"
|
322 |
-
|
323 |
-
#: inc/admin/ui/notices.php:26 inc/admin/ui/notices.php:92
|
324 |
-
#: inc/admin/ui/notices.php:186 inc/admin/ui/notices.php:223
|
325 |
-
#: inc/admin/ui/notices.php:263 inc/admin/ui/notices.php:370
|
326 |
-
msgid "Dismiss this notice"
|
327 |
-
msgstr "Fermer ce message"
|
328 |
-
|
329 |
-
#: inc/admin/ui/notices.php:33
|
330 |
-
msgid "Create an Account"
|
331 |
-
msgstr "Créer un compte"
|
332 |
-
|
333 |
-
#: inc/admin/ui/notices.php:34
|
334 |
-
msgid ""
|
335 |
-
"Don't have an Imagify account yet? Optimize your images by creating an account "
|
336 |
-
"in a few seconds!"
|
337 |
-
msgstr ""
|
338 |
-
"Vous n’avez pas encore de compte Imagify ? Optimiser vos images en créant "
|
339 |
-
"un compte en quelques secondes !"
|
340 |
-
|
341 |
-
#: inc/admin/ui/notices.php:37
|
342 |
-
msgid "Sign up, It's FREE!"
|
343 |
-
msgstr "Inscrivez-vous, c’est GRATUIT !"
|
344 |
-
|
345 |
-
#: inc/admin/ui/notices.php:43
|
346 |
-
msgid "Enter your API Key"
|
347 |
-
msgstr "Entrer la clé API"
|
348 |
-
|
349 |
-
#: inc/admin/ui/notices.php:44
|
350 |
-
#, php-format
|
351 |
-
msgid ""
|
352 |
-
"Save your API Key you have received by email or you can get it on your "
|
353 |
-
"%sImagify account page%s."
|
354 |
-
msgstr ""
|
355 |
-
"Enregistrez la clé API que vous avez reçu par email ou que vous pouvez "
|
356 |
-
"récupérer sur votre %spage de compte Imagify%s."
|
357 |
-
|
358 |
-
#: inc/admin/ui/notices.php:47
|
359 |
-
msgid "I have my API key"
|
360 |
-
msgstr "J’ai récupéré ma clé API"
|
361 |
-
|
362 |
-
#: inc/admin/ui/notices.php:53
|
363 |
-
msgid "Configure it"
|
364 |
-
msgstr "Configurer le"
|
365 |
-
|
366 |
-
#: inc/admin/ui/notices.php:54
|
367 |
-
msgid "It’s almost done! You have just to configure your optimization settings."
|
368 |
-
msgstr ""
|
369 |
-
"C’est bientôt terminé ! Vous avez juste à configurer vos paramètres "
|
370 |
-
"d'optimisation."
|
371 |
-
|
372 |
-
#: inc/admin/ui/notices.php:55
|
373 |
-
msgid "Go to Settings"
|
374 |
-
msgstr "Aller aux réglages"
|
375 |
-
|
376 |
-
#: inc/admin/ui/notices.php:87 inc/admin/ui/options.php:97
|
377 |
-
#: inc/functions/i18n.php:81
|
378 |
-
msgid "Your API key isn't valid!"
|
379 |
-
msgstr "Votre clé API n’est pas valide !"
|
380 |
-
|
381 |
-
#: inc/admin/ui/notices.php:90
|
382 |
-
#, php-format
|
383 |
-
msgid ""
|
384 |
-
"Go to your Imagify account page to get your API Key and specify it on %1$syour "
|
385 |
-
"settings%3$s or %2$screate an account for free%3$s if you don't have one yet."
|
386 |
-
msgstr ""
|
387 |
-
"Allez sur votre page de compte Imagify pour récupérer votre clé API et la "
|
388 |
-
"renseigner dans %1$svos réglages%3$s ou %2$scréez un compte gratuitement%3$s "
|
389 |
-
"si vous n’en avez pas encore un."
|
390 |
-
|
391 |
-
#: inc/admin/ui/notices.php:142
|
392 |
-
msgid ""
|
393 |
-
"The following plugins are not compatible with this plugin and may cause "
|
394 |
-
"unexpected results:"
|
395 |
-
msgstr ""
|
396 |
-
"Les extensions suivantes ne sont pas compatibles avec ce plugin et peuvent "
|
397 |
-
"générer des résultats inattendus :"
|
398 |
-
|
399 |
-
#: inc/admin/ui/notices.php:148
|
400 |
-
msgid "Deactivate"
|
401 |
-
msgstr "Désactiver"
|
402 |
-
|
403 |
-
#: inc/admin/ui/notices.php:178
|
404 |
-
msgid "The external HTTP requests are blocked!"
|
405 |
-
msgstr "Les requêtes HTTP externes sont bloquées !"
|
406 |
-
|
407 |
-
#: inc/admin/ui/notices.php:179
|
408 |
-
msgid ""
|
409 |
-
"You defined the <code>WP_HTTP_BLOCK_EXTERNAL</code> constant in the <code>wp-"
|
410 |
-
"config.php</code> to block all external HTTP requests."
|
411 |
-
msgstr ""
|
412 |
-
"Vous avez défini la constante <code>WP_HTTP_BLOCK_EXTERNAL</code> dans le "
|
413 |
-
"fichier <code>wp-config.php</code> pour bloquer toutes les requêtes HTTP "
|
414 |
-
"externes."
|
415 |
-
|
416 |
-
#: inc/admin/ui/notices.php:181
|
417 |
-
msgid ""
|
418 |
-
"To optimize your images, you have to put the following code in your <code>wp-"
|
419 |
-
"config.php</code> file so that it works correctly."
|
420 |
-
msgstr ""
|
421 |
-
"Pour optimiser vos images, vous devez insérer le code suivant dans le fichier "
|
422 |
-
"<code>wp-config.php</code> afin que cela fonctionne correctement."
|
423 |
-
|
424 |
-
#: inc/admin/ui/notices.php:182
|
425 |
-
msgid "Click on the field and press Ctrl-A to select all."
|
426 |
-
msgstr "Cliquez sur le champ et appuyez sur Ctrl-A pour tout sélectionner."
|
427 |
-
|
428 |
-
#: inc/admin/ui/notices.php:219
|
429 |
-
msgid "You're missing out!"
|
430 |
-
msgstr "Vous passez à côté de quelque chose !"
|
431 |
-
|
432 |
-
#: inc/admin/ui/notices.php:220
|
433 |
-
msgid "Use the List view to optimize images with Imagify."
|
434 |
-
msgstr "Utilisez la vue liste pour optimiser vos images avec Imagify."
|
435 |
-
|
436 |
-
#: inc/admin/ui/notices.php:221
|
437 |
-
msgid "Switch to the List View"
|
438 |
-
msgstr "Basculer en vue liste"
|
439 |
-
|
440 |
-
#: inc/admin/ui/notices.php:260 inc/functions/i18n.php:101
|
441 |
-
#: inc/functions/i18n.php:104
|
442 |
-
#, php-format
|
443 |
-
msgid ""
|
444 |
-
"To continue to optimize your images, log in to your Imagify account to %sbuy a "
|
445 |
-
"pack or subscribe to a plan%s."
|
446 |
-
msgstr ""
|
447 |
-
"Pour continuer à optimiser vos images, connectez-vous à votre compte Imagify "
|
448 |
-
"pour %sacheter un pack ou souscrire à un plan%s."
|
449 |
-
|
450 |
-
#: inc/admin/ui/notices.php:314 inc/admin/ui/options.php:28
|
451 |
-
msgid "Discover the best caching plugin to speed up your website."
|
452 |
-
msgstr "Découvrez le meilleur plugin de cache pour accélérer votre site."
|
453 |
-
|
454 |
-
#: inc/admin/ui/notices.php:317 inc/admin/ui/options.php:36
|
455 |
-
#, php-format
|
456 |
-
msgid "%sGet %s off%s with this coupon code:%s"
|
457 |
-
msgstr "Obtenez %s%s%s de réduction avec le code promo :%s"
|
458 |
-
|
459 |
-
#: inc/admin/ui/notices.php:326 inc/admin/ui/options.php:41
|
460 |
-
msgid "Get WP Rocket now"
|
461 |
-
msgstr "Je veux WP Rocket !"
|
462 |
-
|
463 |
-
#: inc/admin/ui/notices.php:363
|
464 |
-
#, php-format
|
465 |
-
msgid ""
|
466 |
-
"%1$sCongratulations%2$s, you have optimized %1$s%3$d images%2$s and improved "
|
467 |
-
"your website's speed by reducing your images size."
|
468 |
-
msgstr ""
|
469 |
-
"%1$sFélicitations%2$s ! Vous avez optimisé %1$s%3$d images%2$s et amélioré le "
|
470 |
-
"temps de chargement de votre site en réduisant le poids de vos images."
|
471 |
-
|
472 |
-
#: inc/admin/ui/notices.php:365 inc/admin/ui/options.php:59
|
473 |
-
#, php-format
|
474 |
-
msgid ""
|
475 |
-
"%sDo you like this plugin?%s Please take a few seconds to %srate it on "
|
476 |
-
"WordPress.org%s!"
|
477 |
-
msgstr ""
|
478 |
-
"%sVous aimez ce plugin ?%s Prenez quelques s
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|