Converter for Media – Optimize images | Convert WebP & AVIF - Version 1.1.1

Version Description

(2020-02-13) = * [Changed] Unknown error handling when converting images * [Added] Ability to skip converting existing images when Regenerate All * [Added] Button for simple checking of server configuration

Download this release

Release Info

Developer mateuszgbiorczyk
Plugin Icon 128x128 Converter for Media – Optimize images | Convert WebP & AVIF
Version 1.1.1
Comparing to
See all releases

Code changes from version 1.1.0 to 1.1.1

app/Media/Delete.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  namespace WebpConverter\Media;
 
4
  use WebpConverter\Convert as Convert;
5
 
6
  class Delete
1
  <?php
2
 
3
  namespace WebpConverter\Media;
4
+
5
  use WebpConverter\Convert as Convert;
6
 
7
  class Delete
app/Media/Upload.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  namespace WebpConverter\Media;
 
4
  use WebpConverter\Convert as Convert;
5
 
6
  class Upload
1
  <?php
2
 
3
  namespace WebpConverter\Media;
4
+
5
  use WebpConverter\Convert as Convert;
6
 
7
  class Upload
app/Regenerate/Endpoints.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  namespace WebpConverter\Regenerate;
 
4
  use WebpConverter\Convert as Convert;
5
 
6
  class Endpoints
@@ -60,6 +61,9 @@
60
 
61
  public function getPaths($request)
62
  {
 
 
 
63
  $api = new Paths();
64
  $data = $api->getPaths();
65
  if ($data !== false) return new \WP_REST_Response($data, 200);
1
  <?php
2
 
3
  namespace WebpConverter\Regenerate;
4
+
5
  use WebpConverter\Convert as Convert;
6
 
7
  class Endpoints
61
 
62
  public function getPaths($request)
63
  {
64
+ $params = $request->get_params();
65
+ if (isset($params['skip']) && $params['skip']) new Skip();
66
+
67
  $api = new Paths();
68
  $data = $api->getPaths();
69
  if ($data !== false) return new \WP_REST_Response($data, 200);
app/Regenerate/Regenerate.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
 
3
  namespace WebpConverter\Regenerate;
 
4
  use WebpConverter\Convert as Convert;
5
 
6
  class Regenerate
1
  <?php
2
 
3
  namespace WebpConverter\Regenerate;
4
+
5
  use WebpConverter\Convert as Convert;
6
 
7
  class Regenerate
app/Regenerate/Skip.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WebpConverter\Regenerate;
4
+
5
+ use WebpConverter\Convert\Directory as Directory;
6
+
7
+ class Skip
8
+ {
9
+ public function __construct()
10
+ {
11
+ add_filter('webpc_attachment_paths', [$this, 'skipExistsImages']);
12
+ }
13
+
14
+ /* ---
15
+ Functions
16
+ --- */
17
+
18
+ public function skipExistsImages($paths)
19
+ {
20
+ $directory = new Directory();
21
+
22
+ foreach ($paths as $key => $path) {
23
+ $output = $directory->getPath($path, false);
24
+ if (file_exists($output)) unset($paths[$key]);
25
+ }
26
+ return $paths;
27
+ }
28
+ }
public/build/js/scripts.js CHANGED
@@ -1 +1 @@
1
- !function(e){var t={};function r(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,s){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(r.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(s,n,function(t){return e[t]}.bind(null,n));return s},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=0)}([function(e,t,r){r(1),e.exports=r(2)},function(e,t,r){"use strict";function s(e,t){for(var r=0;r<t.length;r++){var s=t[r];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}r.r(t);var n=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.setVars()&&this.setEvents()}var t,r,n;return t=e,(r=[{key:"setVars",value:function(){if(this.notice=document.querySelector(".notice[data-notice=webp-converter]"),this.notice)return this.settings={isHidden:!1,ajaxUrl:this.notice.getAttribute("data-url")},!0}},{key:"setEvents",value:function(){window.addEventListener("load",this.getButtons.bind(this))}},{key:"getButtons",value:function(){this.buttonClose=this.notice.querySelector(".notice-dismiss"),this.buttonPermanently=this.notice.querySelector("[data-permanently]"),this.setButtonsEvents()}},{key:"setButtonsEvents",value:function(){var e=this;this.buttonClose.addEventListener("click",(function(){e.hideNotice(!1)})),this.buttonPermanently.addEventListener("click",(function(t){t.preventDefault(),e.hideNotice(!0)}))}},{key:"hideNotice",value:function(e){this.settings.isHidden||(this.settings.isHidden=!0,jQuery.ajax(this.settings.ajaxUrl,{type:"POST",data:{is_permanently:e?1:0}}),this.buttonClose.click())}}])&&s(t.prototype,r),n&&s(t,n),e}();function i(e,t){for(var r=0;r<t.length;r++){var s=t[r];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}var a=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.setVars()&&this.setEvents()}var t,r,s;return t=e,(r=[{key:"setVars",value:function(){if(this.section=document.querySelector(".webpLoader"),this.section)return this.wrapper=this.section.querySelector(".webpLoader__status"),this.progress=this.wrapper.querySelector(".webpLoader__barProgress"),this.progressSize=this.section.querySelector(".webpLoader__sizeProgress"),this.errors=this.section.querySelector(".webpLoader__errors"),this.errorsInner=this.errors.querySelector(".webpLoader__errorsContentList"),this.errorsMessage=this.errors.querySelector(".webpLoader__errorsContentMessage"),this.success=this.section.querySelector(".webpLoader__success"),this.button=this.section.querySelector(".webpLoader__button"),this.data={count:0,max:0,items:[],size:{before:0,after:0},errors:[]},this.settings={isDisabled:!1,ajax:{urlPaths:this.section.getAttribute("data-api-paths"),urlRegenerate:this.section.getAttribute("data-api-regenerate")},units:["kB","MB","GB"]},this.atts={progress:"data-percent"},this.classes={progressError:"webpLoader__barProgress--error",buttonDisabled:"webpLoader__button--disabled"},!0}},{key:"setEvents",value:function(){this.button.addEventListener("click",this.initRegenerate.bind(this))}},{key:"initRegenerate",value:function(e){e.preventDefault(),this.settings.isDisabled||(this.settings.isDisabled=!0,this.button.classList.add(this.classes.buttonDisabled),this.wrapper.removeAttribute("hidden"),this.getImagesList())}},{key:"getImagesList",value:function(){var e=this;jQuery.ajax(this.settings.ajax.urlPaths,{type:"POST",date:{}}).done((function(t){e.data.items=t.data,e.data.max=t.data.length,e.regenerateNextImages()})).fail((function(){e.progress.classList.add(e.classes.progressError),e.errorsMessage.removeAttribute("hidden"),e.errors.removeAttribute("hidden")}))}},{key:"regenerateNextImages",value:function(){if(0===this.data.max&&this.updateProgress(),!(this.data.count>=this.data.max)){var e=this.data.items[this.data.count];this.data.count++,this.sendRequest(e)}}},{key:"sendRequest",value:function(e){var t=this;jQuery.ajax(this.settings.ajax.urlRegenerate,{type:"POST",data:{paths:e}}).done((function(e){t.updateErrors(e),t.updateSize(e),t.updateProgress(),t.regenerateNextImages()})).fail((function(){t.progress.classList.add(t.classes.progressError),t.errorsMessage.removeAttribute("hidden"),t.errors.removeAttribute("hidden")}))}},{key:"updateErrors",value:function(e){0!==e.errors.length&&(this.data.errors=this.data.errors.concat(e.errors),this.errorsInner.innerHTML=this.data.errors.join("<br>"),this.errors.removeAttribute("hidden"))}},{key:"updateSize",value:function(e){var t=this.data.size;t.before+=e.size.before,t.after+=e.size.after;var r=t.before-t.after;if(r<0&&(r=0),0!==r){var s=Math.round(100*(1-t.after/t.before));s<0&&(s=0);var n=-1;do{n++,r/=1024}while(r>1024);var i=r.toFixed(2),a=this.settings.units[n],o="".concat(i," ").concat(a," (").concat(s,"%)");this.progressSize.innerHTML=o}}},{key:"updateProgress",value:function(){var e=this.data.max>0?Math.floor(this.data.count/this.data.max*100):100;e>100&&(e=100),100===e&&this.success.removeAttribute("hidden"),this.progress.setAttribute(this.atts.progress,e)}}])&&i(t.prototype,r),s&&i(t,s),e}();new function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),new n,new a}},function(e,t){}]);
1
+ !function(e){var t={};function r(s){if(t[s])return t[s].exports;var i=t[s]={i:s,l:!1,exports:{}};return e[s].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=e,r.c=t,r.d=function(e,t,s){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(r.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(s,i,function(t){return e[t]}.bind(null,i));return s},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/",r(r.s=0)}([function(e,t,r){r(1),e.exports=r(2)},function(e,t,r){"use strict";function s(e,t){for(var r=0;r<t.length;r++){var s=t[r];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}r.r(t);var i=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.setVars()&&this.setEvents()}var t,r,i;return t=e,(r=[{key:"setVars",value:function(){if(this.notice=document.querySelector(".notice[data-notice=webp-converter]"),this.notice)return this.settings={isHidden:!1,ajaxUrl:this.notice.getAttribute("data-url")},!0}},{key:"setEvents",value:function(){window.addEventListener("load",this.getButtons.bind(this))}},{key:"getButtons",value:function(){this.buttonClose=this.notice.querySelector(".notice-dismiss"),this.buttonPermanently=this.notice.querySelector("[data-permanently]"),this.setButtonsEvents()}},{key:"setButtonsEvents",value:function(){var e=this;this.buttonClose.addEventListener("click",(function(){e.hideNotice(!1)})),this.buttonPermanently.addEventListener("click",(function(t){t.preventDefault(),e.hideNotice(!0)}))}},{key:"hideNotice",value:function(e){this.settings.isHidden||(this.settings.isHidden=!0,jQuery.ajax(this.settings.ajaxUrl,{type:"POST",data:{is_permanently:e?1:0}}),this.buttonClose.click())}}])&&s(t.prototype,r),i&&s(t,i),e}();function n(e,t){for(var r=0;r<t.length;r++){var s=t[r];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}var a=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.setVars()&&this.setEvents()}var t,r,s;return t=e,(r=[{key:"setVars",value:function(){if(this.section=document.querySelector(".webpLoader"),this.section)return this.wrapper=this.section.querySelector(".webpLoader__status"),this.progress=this.wrapper.querySelector(".webpLoader__barProgress"),this.progressSize=this.section.querySelector(".webpLoader__sizeProgress"),this.errors=this.section.querySelector(".webpLoader__errors"),this.errorsInner=this.errors.querySelector(".webpLoader__errorsContentList"),this.errorsMessage=this.errors.querySelector(".webpLoader__errorsContentMessage"),this.success=this.section.querySelector(".webpLoader__success"),this.skipOption=this.section.querySelector('input[name="regenerate_skip"]'),this.button=this.section.querySelector(".webpLoader__button"),this.data={count:0,max:0,items:[],size:{before:0,after:0},errors:[]},this.settings={isDisabled:!1,ajax:{urlPaths:this.section.getAttribute("data-api-paths"),urlRegenerate:this.section.getAttribute("data-api-regenerate"),errorMessage:this.section.getAttribute("data-api-error-message")},units:["kB","MB","GB"]},this.atts={progress:"data-percent"},this.classes={progressError:"webpLoader__barProgress--error",buttonDisabled:"webpLoader__button--disabled"},!0}},{key:"setEvents",value:function(){this.button.addEventListener("click",this.initRegenerate.bind(this))}},{key:"initRegenerate",value:function(e){e.preventDefault(),this.settings.isDisabled||(this.settings.isDisabled=!0,this.skipOption.setAttribute("disabled",!0),this.button.classList.add(this.classes.buttonDisabled),this.wrapper.removeAttribute("hidden"),this.getImagesList())}},{key:"getImagesList",value:function(){var e=this;jQuery.ajax(this.settings.ajax.urlPaths,{type:"POST",data:{skip:this.skipOption.checked?1:0}}).done((function(t){e.data.items=t.data,e.data.max=t.data.length,e.regenerateNextImages()})).fail((function(){e.progress.classList.add(e.classes.progressError),e.errorsMessage.removeAttribute("hidden"),e.errors.removeAttribute("hidden")}))}},{key:"regenerateNextImages",value:function(){if(0===this.data.max&&this.updateProgress(),!(this.data.count>=this.data.max)){var e=this.data.items[this.data.count];this.data.count++,this.sendRequest(e)}}},{key:"sendRequest",value:function(e){var t=this;jQuery.ajax(this.settings.ajax.urlRegenerate,{type:"POST",data:{paths:e}}).done((function(e){t.updateErrors(e.errors),t.updateSize(e),t.updateProgress(),t.regenerateNextImages()})).fail((function(){var r=JSON.stringify(e),s=t.settings.ajax.errorMessage.replace("%s","<code>".concat(r,"</code>"));t.updateErrors([s]),t.regenerateNextImages()}))}},{key:"updateErrors",value:function(e){0!==e.length&&(this.data.errors=this.data.errors.concat(e),this.errorsInner.innerHTML=this.data.errors.join("<br>"),this.errors.removeAttribute("hidden"))}},{key:"updateSize",value:function(e){var t=this.data.size;t.before+=e.size.before,t.after+=e.size.after;var r=t.before-t.after;if(r<0&&(r=0),0!==r){var s=Math.round(100*(1-t.after/t.before));s<0&&(s=0);var i=-1;do{i++,r/=1024}while(r>1024);var n=r.toFixed(2),a=this.settings.units[i],o="".concat(n," ").concat(a," (").concat(s,"%)");this.progressSize.innerHTML=o}}},{key:"updateProgress",value:function(){var e=this.data.max>0?Math.floor(this.data.count/this.data.max*100):100;e>100&&(e=100),100===e&&this.success.removeAttribute("hidden"),this.progress.setAttribute(this.atts.progress,e)}}])&&n(t.prototype,r),s&&n(t,s),e}();new function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),new i,new a}},function(e,t){}]);
readme.txt CHANGED
@@ -273,6 +273,11 @@ This is all very important to us and allows us to do even better things for you!
273
 
274
  == Changelog ==
275
 
 
 
 
 
 
276
  = 1.1.0 (2020-02-10) =
277
  * `[Fixed]` Support for WordPress installation in subdirectory
278
  * `[Fixed]` Error detecting WebP support by Imagick
273
 
274
  == Changelog ==
275
 
276
+ = 1.1.1 (2020-02-13) =
277
+ * `[Changed]` Unknown error handling when converting images
278
+ * `[Added]` Ability to skip converting existing images when `Regenerate All`
279
+ * `[Added]` Button for simple checking of server configuration
280
+
281
  = 1.1.0 (2020-02-10) =
282
  * `[Fixed]` Support for WordPress installation in subdirectory
283
  * `[Fixed]` Error detecting WebP support by Imagick
resources/_dev/js/classes/Regenerate.js CHANGED
@@ -19,6 +19,7 @@ export default class Regenerate
19
  this.errorsInner = this.errors.querySelector('.webpLoader__errorsContentList');
20
  this.errorsMessage = this.errors.querySelector('.webpLoader__errorsContentMessage');
21
  this.success = this.section.querySelector('.webpLoader__success');
 
22
  this.button = this.section.querySelector('.webpLoader__button');
23
  this.data = {
24
  count: 0,
@@ -35,6 +36,7 @@ export default class Regenerate
35
  ajax: {
36
  urlPaths: this.section.getAttribute('data-api-paths'),
37
  urlRegenerate: this.section.getAttribute('data-api-regenerate'),
 
38
  },
39
  units: ['kB', 'MB', 'GB'],
40
  };
@@ -62,6 +64,7 @@ export default class Regenerate
62
  e.preventDefault();
63
  if (this.settings.isDisabled) return;
64
  this.settings.isDisabled = true;
 
65
  this.button.classList.add(this.classes.buttonDisabled);
66
 
67
  this.wrapper.removeAttribute('hidden');
@@ -72,7 +75,9 @@ export default class Regenerate
72
  {
73
  jQuery.ajax(this.settings.ajax.urlPaths, {
74
  type: 'POST',
75
- date: {},
 
 
76
  }).done((response) => {
77
  this.data.items = response.data;
78
  this.data.max = response.data.length;
@@ -105,25 +110,26 @@ export default class Regenerate
105
  paths: items,
106
  },
107
  }).done((response) => {
108
- this.updateErrors(response);
109
  this.updateSize(response);
110
  this.updateProgress();
111
  this.regenerateNextImages();
112
  }).fail(() => {
113
- this.progress.classList.add(this.classes.progressError);
114
- this.errorsMessage.removeAttribute('hidden');
115
- this.errors.removeAttribute('hidden');
 
116
  });
117
  }
118
 
119
  /* ---
120
  Status
121
  --- */
122
- updateErrors(response)
123
  {
124
- if (response.errors.length === 0) return;
125
 
126
- this.data.errors = this.data.errors.concat(response.errors);
127
  this.errorsInner.innerHTML = this.data.errors.join('<br>');
128
  this.errors.removeAttribute('hidden');
129
  }
19
  this.errorsInner = this.errors.querySelector('.webpLoader__errorsContentList');
20
  this.errorsMessage = this.errors.querySelector('.webpLoader__errorsContentMessage');
21
  this.success = this.section.querySelector('.webpLoader__success');
22
+ this.skipOption = this.section.querySelector('input[name="regenerate_skip"]');
23
  this.button = this.section.querySelector('.webpLoader__button');
24
  this.data = {
25
  count: 0,
36
  ajax: {
37
  urlPaths: this.section.getAttribute('data-api-paths'),
38
  urlRegenerate: this.section.getAttribute('data-api-regenerate'),
39
+ errorMessage: this.section.getAttribute('data-api-error-message'),
40
  },
41
  units: ['kB', 'MB', 'GB'],
42
  };
64
  e.preventDefault();
65
  if (this.settings.isDisabled) return;
66
  this.settings.isDisabled = true;
67
+ this.skipOption.setAttribute('disabled', true);
68
  this.button.classList.add(this.classes.buttonDisabled);
69
 
70
  this.wrapper.removeAttribute('hidden');
75
  {
76
  jQuery.ajax(this.settings.ajax.urlPaths, {
77
  type: 'POST',
78
+ data: {
79
+ skip: this.skipOption.checked ? 1 : 0,
80
+ },
81
  }).done((response) => {
82
  this.data.items = response.data;
83
  this.data.max = response.data.length;
110
  paths: items,
111
  },
112
  }).done((response) => {
113
+ this.updateErrors(response.errors);
114
  this.updateSize(response);
115
  this.updateProgress();
116
  this.regenerateNextImages();
117
  }).fail(() => {
118
+ const json = JSON.stringify(items);
119
+ const message = this.settings.ajax.errorMessage.replace('%s', `<code>${json}</code>`);
120
+ this.updateErrors([message]);
121
+ this.regenerateNextImages();
122
  });
123
  }
124
 
125
  /* ---
126
  Status
127
  --- */
128
+ updateErrors(errors)
129
  {
130
+ if (errors.length === 0) return;
131
 
132
+ this.data.errors = this.data.errors.concat(errors);
133
  this.errorsInner.innerHTML = this.data.errors.join('<br>');
134
  this.errors.removeAttribute('hidden');
135
  }
resources/components/widgets/options.php CHANGED
@@ -16,10 +16,12 @@
16
  <div class="webpPage__widgetRow">
17
  <p>
18
  <?= sprintf(
19
- __('If you have a problem %scheck our FAQ%s first. If you did not find help there, please %scheck support forum%s for any similar problem or contact us.', 'webp-converter'),
20
  '<a href="https://wordpress.org/plugins/webp-converter-for-media/#faq" target="_blank">',
21
  '</a>',
22
  '<a href="https://wordpress.org/support/plugin/webp-converter-for-media/" target="_blank">',
 
 
23
  '</a>'
24
  ); ?>
25
  </p>
16
  <div class="webpPage__widgetRow">
17
  <p>
18
  <?= sprintf(
19
+ __('If you have a problem %scheck our FAQ%s first. If you did not find help there, please %scheck support forum%s for any similar problem or contact us. Before you contact us %scheck the configuration%s of your server.', 'webp-converter'),
20
  '<a href="https://wordpress.org/plugins/webp-converter-for-media/#faq" target="_blank">',
21
  '</a>',
22
  '<a href="https://wordpress.org/support/plugin/webp-converter-for-media/" target="_blank">',
23
+ '</a>',
24
+ '<a href="' . sprintf('%s&action=server', menu_page_url('webpc_admin_page', false)) . '">',
25
  '</a>'
26
  ); ?>
27
  </p>
resources/components/widgets/regenerate.php CHANGED
@@ -7,11 +7,16 @@
7
  <?= __('Regenerate images', 'webp-converter'); ?>
8
  </h3>
9
  <div class="webpLoader webpContent"
10
- data-api-paths="<?= $apiPaths; ?>" data-api-regenerate="<?= $apiRegenerate; ?>">
 
 
11
  <div class="webpPage__widgetRow">
12
  <p>
13
  <?= __('Convert all existing images with just one click! This tool uses the WordPress REST API by downloading addresses of all images and converting all files gradually. This is a process that may take a few or more than ten minutes depending on the number of files. During this process, please do not close your browser window.', 'webp-converter'); ?>
14
  </p>
 
 
 
15
  <div class="webpLoader__status" hidden>
16
  <div class="webpLoader__bar">
17
  <div class="webpLoader__barProgress" data-percent="0">
@@ -39,6 +44,20 @@
39
  </div>
40
  </div>
41
  <div class="webpPage__widgetRow">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  <button type="button" target="_blank"
43
  class="webpLoader__button webpButton webpButton--green"
44
  <?= (apply_filters('webpc_server_errors', [])) ? 'disabled' : ''; ?>>
7
  <?= __('Regenerate images', 'webp-converter'); ?>
8
  </h3>
9
  <div class="webpLoader webpContent"
10
+ data-api-paths="<?= $apiPaths; ?>"
11
+ data-api-regenerate="<?= $apiRegenerate; ?>"
12
+ data-api-error-message="<?= __('An unknown error occurred while converting the images: %s', 'webp-converter'); ?>">
13
  <div class="webpPage__widgetRow">
14
  <p>
15
  <?= __('Convert all existing images with just one click! This tool uses the WordPress REST API by downloading addresses of all images and converting all files gradually. This is a process that may take a few or more than ten minutes depending on the number of files. During this process, please do not close your browser window.', 'webp-converter'); ?>
16
  </p>
17
+ <p>
18
+ <?= __('This operation should be performed only once after installing the plugin. New images will be converted automatically.', 'webp-converter'); ?>
19
+ </p>
20
  <div class="webpLoader__status" hidden>
21
  <div class="webpLoader__bar">
22
  <div class="webpLoader__barProgress" data-percent="0">
44
  </div>
45
  </div>
46
  <div class="webpPage__widgetRow">
47
+ <table class="webpPage__widgetTable">
48
+ <tr>
49
+ <td>
50
+ <input type="checkbox" name="regenerate_skip" value="1"
51
+ id="webpc-regenerate-skip" class="webpPage__checkbox">
52
+ <label for="webpc-regenerate-skip"></label>
53
+ </td>
54
+ <td>
55
+ <label for="webpc-regenerate-skip" class="webpPage__checkboxLabel">
56
+ <?= __('Skip converted images', 'webp-converter'); ?>
57
+ </label>
58
+ </td>
59
+ </tr>
60
+ </table>
61
  <button type="button" target="_blank"
62
  class="webpLoader__button webpButton webpButton--green"
63
  <?= (apply_filters('webpc_server_errors', [])) ? 'disabled' : ''; ?>>
resources/components/widgets/server.php CHANGED
@@ -8,6 +8,12 @@
8
  </h3>
9
  <div class="webpContent">
10
  <div class="webpPage__widgetRow">
 
 
 
 
 
 
11
  <a href="<?= $pageUrl; ?>" class="webpLoader__button webpButton webpButton--blue">
12
  <?= __('Back to settings', 'webp-converter'); ?>
13
  </a>
8
  </h3>
9
  <div class="webpContent">
10
  <div class="webpPage__widgetRow">
11
+ <p>
12
+ <?= sprintf(__('Please compare your configuration with the configuration that is given in the technical requirements in %sthe plugin FAQ%s. If your server does not meet the technical requirements, please contact your server Administrator.', 'webp-converter'),
13
+ '<a href="https://wordpress.org/plugins/webp-converter-for-media/#faq" target="_blank">',
14
+ '</a>'
15
+ ); ?>
16
+ </p>
17
  <a href="<?= $pageUrl; ?>" class="webpLoader__button webpButton webpButton--blue">
18
  <?= __('Back to settings', 'webp-converter'); ?>
19
  </a>
resources/components/widgets/support.php CHANGED
@@ -1,6 +1,3 @@
1
- <?php
2
- $infoUrl = menu_page_url('webpc_admin_page', false) . '&action=server';
3
- ?>
4
  <div class="webpPage__widget">
5
  <h3 class="webpPage__widgetTitle webpPage__widgetTitle--second">
6
  <?= __('We are waiting for your message', 'webp-converter'); ?>
@@ -11,16 +8,17 @@
11
  </p>
12
  <p>
13
  <?= sprintf(
14
- __('Please %scheck our FAQ%s before adding a thread with technical problem. If you do not find help there, %scheck support forum%s for similar problems. Please remember to attach %sserver configuration%s in your message, e.g. as a screenshot.', 'webp-converter'),
15
  '<a href="https://wordpress.org/plugins/webp-converter-for-media/#faq" target="_blank">',
16
  '</a>',
17
  '<a href="https://wordpress.org/support/plugin/webp-converter-for-media/" target="_blank">',
18
- '</a>',
19
- '<a href="' . $infoUrl . '">',
20
  '</a>'
21
  ); ?>
22
  </p>
23
  <p>
 
 
 
24
  <a href="https://wordpress.org/support/plugin/webp-converter-for-media/" target="_blank" class="webpButton webpButton--blue">
25
  <?= __('Get help', 'webp-converter'); ?>
26
  </a>
 
 
 
1
  <div class="webpPage__widget">
2
  <h3 class="webpPage__widgetTitle webpPage__widgetTitle--second">
3
  <?= __('We are waiting for your message', 'webp-converter'); ?>
8
  </p>
9
  <p>
10
  <?= sprintf(
11
+ __('Please %scheck our FAQ%s before adding a thread with technical problem. If you do not find help there, %scheck support forum%s for similar problems. Before you contact us check the configuration of your server and attach it in your message, e.g. as a screenshot.', 'webp-converter'),
12
  '<a href="https://wordpress.org/plugins/webp-converter-for-media/#faq" target="_blank">',
13
  '</a>',
14
  '<a href="https://wordpress.org/support/plugin/webp-converter-for-media/" target="_blank">',
 
 
15
  '</a>'
16
  ); ?>
17
  </p>
18
  <p>
19
+ <a href="<?= sprintf('%s&action=server', menu_page_url('webpc_admin_page', false)); ?>" class="webpButton webpButton--blue">
20
+ <?= __('Server configuration', 'webp-converter'); ?>
21
+ </a>
22
  <a href="https://wordpress.org/support/plugin/webp-converter-for-media/" target="_blank" class="webpButton webpButton--blue">
23
  <?= __('Get help', 'webp-converter'); ?>
24
  </a>
webp-converter-for-media.php CHANGED
@@ -3,13 +3,13 @@
3
  /*
4
  Plugin Name: WebP Converter for Media
5
  Description: Speed up your website by serving WebP images instead of standard formats JPEG, PNG and GIF.
6
- Version: 1.1.0
7
  Author: Mateusz Gbiorczyk
8
  Author URI: https://gbiorczyk.pl/
9
  Text Domain: webp-converter
10
  */
11
 
12
- define('WEBPC_VERSION', '1.1.0');
13
  define('WEBPC_FILE', __FILE__);
14
  define('WEBPC_NAME', plugin_basename(__FILE__));
15
  define('WEBPC_PATH', plugin_dir_path(__FILE__));
3
  /*
4
  Plugin Name: WebP Converter for Media
5
  Description: Speed up your website by serving WebP images instead of standard formats JPEG, PNG and GIF.
6
+ Version: 1.1.1
7
  Author: Mateusz Gbiorczyk
8
  Author URI: https://gbiorczyk.pl/
9
  Text Domain: webp-converter
10
  */
11
 
12
+ define('WEBPC_VERSION', '1.1.1');
13
  define('WEBPC_FILE', __FILE__);
14
  define('WEBPC_NAME', plugin_basename(__FILE__));
15
  define('WEBPC_PATH', plugin_dir_path(__FILE__));