LiteSpeed Cache - Version 5.0

Version Description

  • Jul 25 2022 =
  • VPI Added Viewport Images feature to LiteSpeed Options metabox on Post Edit page.
  • CDN Added Auto CDN Setup feature for simple QUIC.cloud CDN setup. (Kevin)
  • Page Optimize Automatically cache remote CSS/JS files when fetching for optimization (Lauren)
  • Cache Added LiteSpeed Options for page-level cache control on Post Edit page. (denisgomesfranco)
  • Cloud Auto Alias feature.
  • Debug Added Debug String Excludes option. (Hanna)
  • UCSS Added Purge this page - UCSS option to Admin Bar dropdown menu. (Ankit)
  • Guest Added litespeed_guest_off=1 URL query string parameter to bypass Guest Mode. (cbdfactum)
  • Page Optimize Fixed an issue where CSS anchors could be wrongly converted to a full path when minifying. (Tynan)
  • Page Optimize Bypass CCSS/UCSS generation when a self-crawled CSS resource returns a 404 code. (Abe)
  • Object Allow LSCWP_OBJECT_CACHE predefined to turn off Object Cache. (knutsp)
  • Data Fixed an issue where empty version tags in the database repeatedly toggled the upgrade banner and reset settings to default.
  • Purge Fixed an issue where the site's index page could be purged upon deletion of an unviewable post. (Kevin)
  • Toolbox Added View site before optimization button under Debug tab. (Ryan D)
  • Admin Switch to using the DONOTCACHEPAGE constant to indicated WP-Admin pages are not cacheable.
  • Admin Moved no-cache header to very beginning to avoid caching unexpected exits.
  • Cloud Added message queue service for VPI. (Abe)
  • Cloud Bypassed 503 error nodes from node redetection process. (Abe)
  • Cloud Fixed a failure to detect out_of_quota. (Lauren)
  • Cloud Added ability to display dismissable banners generated by QUIC.cloud.
  • Crawler Added realtime load detection before crawl.
  • Crawler Adjusted crawler behavior for Divi pages to allow for Divi's CCSS generation process. (miketemby)
  • API PHP constant LITESPEED_CRAWLER_DISABLE_BLOCKLIST and filter litespeed_crawler_disable_blocklist to disable blocklist. (Tobolo)
  • CDN Automatically add a trailing slash to CDN URL and Original URLs if user didn't provide one. (Lucas)
  • Cache When a URL redirects to a URL with a query string, consider these as different for caching purposes. (Shivam)
  • Media Added ability to disable lazyload from the LiteSpeed Options metabox on Post Edit page.
  • Media Added new default values to WebP Attribute to Replace setting for WPBakery and Slider Revolution. (JibsouX)
  • Image Optimize Dropped redundant Page Speed user agent when serving WebP images. (serpentdriver)
  • GUI Fixed an issue where manually dismissable admin messages were instead being treated as one-time messages. (Tynan Beatty)
  • GUI Fixed an issue where subsequent admin alerts would overwrite existing alerts in the queue. (Kevin/Tynan)
  • GUI Updated time offset in log. (Ruikai #PR444 #PR445)
  • GUI Added litespeed_media_ignore_remote_missing_sizes API description.
  • CCSS Fixed an issue where CCSS was unexpectedly bypassed if CSS Combine was OFF and UCSS Inline was ON. (Ruikai)
  • Debug Added resposne headers to debug log. (Kevin)
Download this release

Release Info

Developer LiteSpeedTech
Plugin Icon 128x128 LiteSpeed Cache
Version 5.0
Comparing to
See all releases

Code changes from version 4.6 to 5.0

Files changed (61) hide show
  1. assets/css/litespeed.css +81 -0
  2. assets/js/litespeed-cache-admin.js +3 -3
  3. data/const.default.ini +11 -0
  4. data/const.network_default.ini +3 -0
  5. lang/litespeed-cache.pot +1030 -544
  6. lib/css-min/urirewriter.cls.php +2 -2
  7. lib/object-cache.php +4 -1
  8. litespeed-cache.php +2 -2
  9. readme.txt +38 -2
  10. src/activation.cls.php +4 -5
  11. src/admin-display.cls.php +58 -7
  12. src/admin-settings.cls.php +4 -1
  13. src/admin.cls.php +5 -2
  14. src/avatar.cls.php +6 -6
  15. src/base.cls.php +16 -1
  16. src/cdn-setup.cls.php +389 -0
  17. src/cloud.cls.php +296 -54
  18. src/conf.cls.php +3 -0
  19. src/control.cls.php +12 -5
  20. src/core.cls.php +1 -1
  21. src/crawler.cls.php +62 -35
  22. src/css.cls.php +33 -41
  23. src/data.cls.php +4 -0
  24. src/debug2.cls.php +16 -1
  25. src/error.cls.php +8 -0
  26. src/esi.cls.php +8 -2
  27. src/gui.cls.php +28 -1
  28. src/htaccess.cls.php +1 -2
  29. src/lang.cls.php +36 -0
  30. src/media.cls.php +22 -10
  31. src/metabox.cls.php +159 -0
  32. src/optimize.cls.php +2 -2
  33. src/optimizer.cls.php +37 -11
  34. src/placeholder.cls.php +1 -1
  35. src/purge.cls.php +32 -1
  36. src/rest.cls.php +45 -0
  37. src/root.cls.php +31 -6
  38. src/router.cls.php +8 -2
  39. src/task.cls.php +2 -0
  40. src/utility.cls.php +44 -5
  41. src/vary.cls.php +5 -0
  42. src/vpi.cls.php +329 -0
  43. thirdparty/divi-theme-builder.cls.php +4 -0
  44. thirdparty/entry.inc.php +1 -0
  45. thirdparty/litespeed-check.cls.php +151 -0
  46. tpl/banner/new_version.php +2 -4
  47. tpl/cache/settings-purge.tpl.php +1 -1
  48. tpl/cdn/auto_setup.tpl.php +260 -0
  49. tpl/cdn/entry.tpl.php +1 -0
  50. tpl/crawler/blacklist.tpl.php +6 -1
  51. tpl/crawler/settings-general.tpl.php +0 -3
  52. tpl/crawler/summary.tpl.php +1 -1
  53. tpl/dash/dashboard.tpl.php +34 -1
  54. tpl/general/settings.tpl.php +14 -4
  55. tpl/inc/metabox.php +28 -0
  56. tpl/page_optm/entry.tpl.php +1 -0
  57. tpl/page_optm/settings_css.tpl.php +3 -2
  58. tpl/page_optm/settings_media.tpl.php +9 -1
  59. tpl/page_optm/settings_vpi.tpl.php +95 -0
  60. tpl/toolbox/beta_test.tpl.php +1 -0
  61. tpl/toolbox/settings-debug.tpl.php +26 -0
assets/css/litespeed.css CHANGED
@@ -32,6 +32,87 @@
32
  }
33
 
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  /* =======================================
36
  UTILITIES - structure
37
  ======================================= */
32
  }
33
 
34
 
35
+ /* =======================================
36
+ UTILITIES - toggle UI
37
+ ======================================= */
38
+
39
+ input[type="checkbox"].litespeed-tiny-toggle {
40
+ -webkit-appearance: none;
41
+ -moz-appearance: none;
42
+ appearance: none;
43
+
44
+ -webkit-tap-highlight-color: transparent;
45
+
46
+ width: auto;
47
+ height: auto;
48
+ vertical-align: middle;
49
+ position: relative;
50
+ border: 0;
51
+ outline: 0;
52
+ cursor: pointer;
53
+ margin: 0 4px;
54
+ background: none;
55
+ box-shadow: none;
56
+ }
57
+ input[type="checkbox"].litespeed-tiny-toggle:focus {
58
+ box-shadow: none;
59
+ }
60
+ input[type="checkbox"].litespeed-tiny-toggle:after {
61
+ content: '';
62
+ font-size: 8px;
63
+ font-weight: 400;
64
+ line-height: 18px;
65
+ text-indent: -14px;
66
+ color: #ffffff;
67
+ width: 36px;
68
+ height: 18px;
69
+ display: inline-block;
70
+ background-color: #a7aaad;
71
+ border-radius: 72px;
72
+ box-shadow: 0 0 12px rgb(0 0 0 / 15%) inset;
73
+ }
74
+ input[type="checkbox"].litespeed-tiny-toggle:before {
75
+ content: '';
76
+ width: 14px;
77
+ height: 14px;
78
+ display: block;
79
+ position: absolute;
80
+ top: 2px;
81
+ left: 2px;
82
+ margin: 0;
83
+ border-radius: 50%;
84
+ background-color: #ffffff;
85
+ }
86
+
87
+ input[type="checkbox"].litespeed-tiny-toggle:checked:before {
88
+ left: 20px;
89
+ margin: 0;
90
+ background-color: #ffffff;
91
+ }
92
+
93
+ input[type="checkbox"].litespeed-tiny-toggle,
94
+ input[type="checkbox"].litespeed-tiny-toggle:before,
95
+ input[type="checkbox"].litespeed-tiny-toggle:after,
96
+ input[type="checkbox"].litespeed-tiny-toggle:checked:before,
97
+ input[type="checkbox"].litespeed-tiny-toggle:checked:after {
98
+ transition: ease .15s;
99
+ }
100
+ input[type="checkbox"].litespeed-tiny-toggle:checked:after {
101
+ /*content: 'ON';*/
102
+ background-color: #2271b1;
103
+ }
104
+
105
+ .block-editor__container input[type="checkbox"].litespeed-tiny-toggle {
106
+ border: 0 !important;
107
+ }
108
+ .block-editor__container input[type="checkbox"].litespeed-tiny-toggle:before {
109
+ top: 5px;
110
+ left: 7px;
111
+ }
112
+ .block-editor__container input[type="checkbox"].litespeed-tiny-toggle:checked:before {
113
+ left: 23px;
114
+ }
115
+
116
  /* =======================================
117
  UTILITIES - structure
118
  ======================================= */
assets/js/litespeed-cache-admin.js CHANGED
@@ -177,9 +177,9 @@ var _litespeed_dots ;
177
  * Freeze or melt a specific crawler
178
  * @since 4.3
179
  */
180
- if ( $( '.litespeed-toggle' ).length > 0 ) {
181
- $( '.litespeed-toggle' ).on( 'click', function( e ) {
182
- var crawler_id = $( this ).attr( "data-litespeed_crawler_id" );
183
  var crawler_id = Number( crawler_id.split('-').pop() );
184
  var that = this;
185
  $.ajax( {
177
  * Freeze or melt a specific crawler
178
  * @since 4.3
179
  */
180
+ if ( $( '[data-crawler-list] [data-litespeed_toggle_id]' ).length > 0 ) {
181
+ $( '[data-crawler-list] [data-litespeed_toggle_id]' ).on( 'click', function( e ) {
182
+ var crawler_id = $( this ).attr( "data-litespeed_toggle_id" );
183
  var crawler_id = Number( crawler_id.split('-').pop() );
184
  var that = this;
185
  $.ajax( {
data/const.default.ini CHANGED
@@ -277,6 +277,9 @@ debug-inc = ''
277
  ; O_DEBUG_EXC
278
  debug-exc = ''
279
 
 
 
 
280
 
281
  ;; -------------------------------------------------- ;;
282
  ;; -------------- DB Optm ----------------- ;;
@@ -525,6 +528,12 @@ media-lazy_uri_exc = ''
525
  ; O_MEDIA_LQIP_EXC
526
  media-lqip_exc = ''
527
 
 
 
 
 
 
 
528
 
529
 
530
 
@@ -551,9 +560,11 @@ img_optm-webp_replace = false
551
  img_optm-webp_attr = 'img.src
552
  div.data-thumb
553
  img.data-src
 
554
  div.data-large_image
555
  img.retina_logo_url
556
  div.data-parallax-image
 
557
  video.poster'
558
 
559
  img_optm-webp_replace_srcset = false
277
  ; O_DEBUG_EXC
278
  debug-exc = ''
279
 
280
+ ; O_DEBUG_EXC_STRINGS
281
+ debug-exc_strings = ''
282
+
283
 
284
  ;; -------------------------------------------------- ;;
285
  ;; -------------- DB Optm ----------------- ;;
528
  ; O_MEDIA_LQIP_EXC
529
  media-lqip_exc = ''
530
 
531
+ ; O_MEDIA_VPI
532
+ media-vpi = false
533
+
534
+ ; O_MEDIA_VPI_CRON
535
+ media-vpi_cron = true
536
+
537
 
538
 
539
 
560
  img_optm-webp_attr = 'img.src
561
  div.data-thumb
562
  img.data-src
563
+ img.data-lazyload
564
  div.data-large_image
565
  img.retina_logo_url
566
  div.data-parallax-image
567
+ div.data-vc-parallax-image
568
  video.poster'
569
 
570
  img_optm-webp_replace_srcset = false
data/const.network_default.ini CHANGED
@@ -135,6 +135,9 @@ debug-inc = ''
135
  ; O_DEBUG_EXC
136
  debug-exc = ''
137
 
 
 
 
138
 
139
  ;; -------------------------------------------------- ;;
140
  ;; -------------- Image Optm ----------------- ;;
135
  ; O_DEBUG_EXC
136
  debug-exc = ''
137
 
138
+ ; O_DEBUG_EXC_STRINGS
139
+ debug-exc_strings = ''
140
+
141
 
142
  ;; -------------------------------------------------- ;;
143
  ;; -------------- Image Optm ----------------- ;;
lang/litespeed-cache.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the LiteSpeed Cache package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: LiteSpeed Cache 4.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/litespeed-cache\n"
7
- "POT-Creation-Date: 2022-02-18 20:40:34+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -36,172 +36,172 @@ msgstr ""
36
  msgid "Upgraded successfully."
37
  msgstr ""
38
 
39
- #: src/admin-display.cls.php:115 tpl/dash/entry.tpl.php:6
40
  msgid "Dashboard"
41
  msgstr ""
42
 
43
- #: src/admin-display.cls.php:117
44
  msgid "General"
45
  msgstr ""
46
 
47
- #: src/admin-display.cls.php:119 tpl/cache/entry.tpl.php:6
48
  #: tpl/cache/entry_network.tpl.php:6
49
  msgid "Cache"
50
  msgstr ""
51
 
52
- #: src/admin-display.cls.php:121 tpl/cdn/settings.tpl.php:194
53
  msgid "CDN"
54
  msgstr ""
55
 
56
- #: src/admin-display.cls.php:123 src/gui.cls.php:612
57
- #: tpl/dash/dashboard.tpl.php:55 tpl/dash/network_dash.tpl.php:27
58
  msgid "Image Optimization"
59
  msgstr ""
60
 
61
- #: src/admin-display.cls.php:125 tpl/dash/dashboard.tpl.php:56
62
  msgid "Page Optimization"
63
  msgstr ""
64
 
65
- #: src/admin-display.cls.php:127
66
  msgid "Database"
67
  msgstr ""
68
 
69
- #: src/admin-display.cls.php:129 src/lang.cls.php:210
70
  msgid "Crawler"
71
  msgstr ""
72
 
73
- #: src/admin-display.cls.php:131
74
  msgid "Toolbox"
75
  msgstr ""
76
 
77
- #: src/admin-display.cls.php:205
78
  msgid "Cookie Name"
79
  msgstr ""
80
 
81
- #: src/admin-display.cls.php:206 tpl/crawler/settings-simulation.tpl.php:51
82
  msgid "Cookie Values"
83
  msgstr ""
84
 
85
- #: src/admin-display.cls.php:208
86
  msgid "Remove cookie simulation"
87
  msgstr ""
88
 
89
- #: src/admin-display.cls.php:209
90
  msgid "Add new cookie to simulate"
91
  msgstr ""
92
 
93
- #: src/admin-display.cls.php:228
94
  msgid "CDN URL to be used. For example, %s"
95
  msgstr ""
96
 
97
- #: src/admin-display.cls.php:230
98
  msgid "Remove CDN URL"
99
  msgstr ""
100
 
101
- #: src/admin-display.cls.php:231
102
  msgid "Add new CDN URL"
103
  msgstr ""
104
 
105
- #: src/admin-display.cls.php:232 src/admin-display.cls.php:837
106
- #: src/admin-display.cls.php:866 src/admin-display.cls.php:917
107
  #: tpl/cache/settings-cache.tpl.php:19
108
  #: tpl/cache/settings_inc.cache_mobile.tpl.php:71 tpl/cdn/settings.tpl.php:49
109
- #: tpl/page_optm/settings_css.tpl.php:174
110
  #: tpl/page_optm/settings_media.tpl.php:159
111
- #: tpl/page_optm/settings_media.tpl.php:229
112
- #: tpl/toolbox/settings-debug.tpl.php:34
113
  msgid "ON"
114
  msgstr ""
115
 
116
- #: src/admin-display.cls.php:233 src/admin-display.cls.php:838
117
- #: src/admin-display.cls.php:865 src/admin-display.cls.php:917
118
  #: tpl/cache/settings-cache.tpl.php:19
119
  #: tpl/cache/settings_inc.object.tpl.php:210 tpl/cdn/settings.tpl.php:54
120
- #: tpl/page_optm/settings_css.tpl.php:72 tpl/page_optm/settings_js.tpl.php:63
121
  #: tpl/page_optm/settings_media.tpl.php:162
122
- #: tpl/toolbox/settings-debug.tpl.php:34
123
  msgid "OFF"
124
  msgstr ""
125
 
126
- #: src/admin-display.cls.php:281 src/gui.cls.php:603
127
  msgid "Settings"
128
  msgstr ""
129
 
130
- #: src/admin-display.cls.php:460
131
  msgid "Dismiss"
132
  msgstr ""
133
 
134
- #: src/admin-display.cls.php:706 src/admin-display.cls.php:711
135
  msgid "Save Changes"
136
  msgstr ""
137
 
138
- #: src/admin-display.cls.php:929
139
  msgid "This setting is overwritten by the PHP constant %s"
140
  msgstr ""
141
 
142
- #: src/admin-display.cls.php:932
143
  msgid "This setting is overwritten by the primary site setting"
144
  msgstr ""
145
 
146
- #: src/admin-display.cls.php:935
147
  msgid "This setting is overwritten by the Network setting"
148
  msgstr ""
149
 
150
- #: src/admin-display.cls.php:939
151
  msgid "currently set to %s"
152
  msgstr ""
153
 
154
- #: src/admin-display.cls.php:949 tpl/cache/settings_inc.object.tpl.php:103
155
  #: tpl/crawler/settings-general.tpl.php:60
156
  #: tpl/crawler/settings-general.tpl.php:74
157
  #: tpl/crawler/settings-general.tpl.php:89 tpl/esi_widget_edit.php:70
158
  msgid "seconds"
159
  msgstr ""
160
 
161
- #: src/admin-display.cls.php:980 src/admin-display.cls.php:985
162
  #: tpl/cdn/settings.tpl.php:99
163
  msgid "Default value"
164
  msgstr ""
165
 
166
- #: src/admin-display.cls.php:1009
167
  msgid "Invalid rewrite rule"
168
  msgstr ""
169
 
170
- #: src/admin-display.cls.php:1026
171
  msgid "Path must end with %s"
172
  msgstr ""
173
 
174
- #: src/admin-display.cls.php:1044
175
  msgid "Minimum value"
176
  msgstr ""
177
 
178
- #: src/admin-display.cls.php:1047
179
  msgid "Maximum value"
180
  msgstr ""
181
 
182
- #: src/admin-display.cls.php:1059
183
  msgid "Zero, or"
184
  msgstr ""
185
 
186
- #: src/admin-display.cls.php:1066
187
  msgid "Larger than"
188
  msgstr ""
189
 
190
- #: src/admin-display.cls.php:1069
191
  msgid "Smaller than"
192
  msgstr ""
193
 
194
- #: src/admin-display.cls.php:1072
195
  msgid "Value range"
196
  msgstr ""
197
 
198
- #: src/admin-display.cls.php:1097
199
  msgid "Invalid IP"
200
  msgstr ""
201
 
202
- #: src/admin-display.cls.php:1117 tpl/cache/settings-esi.tpl.php:95
203
- #: tpl/page_optm/settings_css.tpl.php:176
204
  #: tpl/page_optm/settings_html.tpl.php:85
 
205
  #: tpl/page_optm/settings_media_exc.tpl.php:26
206
  #: tpl/page_optm/settings_tuning.tpl.php:35
207
  #: tpl/page_optm/settings_tuning.tpl.php:56
@@ -212,47 +212,47 @@ msgstr ""
212
  msgid "API"
213
  msgstr ""
214
 
215
- #: src/admin-display.cls.php:1118
216
  msgid "Server variable(s) %s available to override this setting."
217
  msgstr ""
218
 
219
- #: src/admin-display.cls.php:1130
220
  msgid "The URLs will be compared to the REQUEST_URI server variable."
221
  msgstr ""
222
 
223
- #: src/admin-display.cls.php:1131
224
  msgid "For example, for %s, %s can be used here."
225
  msgstr ""
226
 
227
- #: src/admin-display.cls.php:1133
228
  msgid "To match the beginning, add %s to the beginning of the item."
229
  msgstr ""
230
 
231
- #: src/admin-display.cls.php:1134
232
  msgid "To do an exact match, add %s to the end of the URL."
233
  msgstr ""
234
 
235
- #: src/admin-display.cls.php:1135 src/doc.cls.php:74
236
  msgid "One per line."
237
  msgstr ""
238
 
239
- #: src/admin-display.cls.php:1149
240
  msgid "%s groups"
241
  msgstr ""
242
 
243
- #: src/admin-display.cls.php:1152
244
  msgid "%s images"
245
  msgstr ""
246
 
247
- #: src/admin-display.cls.php:1162
248
  msgid "%s group"
249
  msgstr ""
250
 
251
- #: src/admin-display.cls.php:1165
252
  msgid "%s image"
253
  msgstr ""
254
 
255
- #: src/admin-settings.cls.php:242 src/admin-settings.cls.php:276
256
  msgid "Options saved."
257
  msgstr ""
258
 
@@ -280,84 +280,136 @@ msgstr ""
280
  msgid "Communicated with Cloudflare successfully."
281
  msgstr ""
282
 
283
- #: src/cloud.cls.php:359 src/cloud.cls.php:372 src/cloud.cls.php:407
284
- #: src/cloud.cls.php:432 src/cloud.cls.php:551 src/cloud.cls.php:907
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  msgid "Cloud Error"
286
  msgstr ""
287
 
288
- #: src/cloud.cls.php:407
289
  msgid "No available Cloud Node."
290
  msgstr ""
291
 
292
- #: src/cloud.cls.php:432
293
  msgid "No available Cloud Node after checked server load."
294
  msgstr ""
295
 
296
- #: src/cloud.cls.php:551
297
  msgid "Please try after %1$s for service %2$s."
298
  msgstr ""
299
 
300
- #: src/cloud.cls.php:634 src/cloud.cls.php:650
301
  msgid "Failed to request via WordPress"
302
  msgstr ""
303
 
304
- #: src/cloud.cls.php:665
305
  msgid "Redetected node"
306
  msgstr ""
307
 
308
- #: src/cloud.cls.php:673
309
  msgid ""
310
  "We are working hard to improve your online service experience. The service "
311
  "will be unavailable while we work. We apologize for any inconvenience."
312
  msgstr ""
313
 
314
- #: src/cloud.cls.php:686 src/cloud.cls.php:694 src/cloud.cls.php:943
315
- msgid "Message from QUIC.cloud server"
316
- msgstr ""
317
-
318
- #: src/cloud.cls.php:702
319
  msgid "Good news from QUIC.cloud server"
320
  msgstr ""
321
 
322
- #: src/cloud.cls.php:711
323
  msgid "%1$s plugin version %2$s required for this action."
324
  msgstr ""
325
 
326
- #: src/cloud.cls.php:754 src/cloud.cls.php:932
327
  msgid "Failed to communicate with QUIC.cloud server"
328
  msgstr ""
329
 
330
- #: src/cloud.cls.php:762
331
  msgid ""
332
  "Site not recognized. Domain Key has been automatically removed. Please "
333
  "request a new one."
334
  msgstr ""
335
 
336
- #: src/cloud.cls.php:763 src/error.cls.php:48
337
  msgid "Click here to set."
338
  msgstr ""
339
 
340
- #: src/cloud.cls.php:951
 
 
 
 
 
 
 
 
 
 
 
 
341
  msgid ""
342
  "Applied for Domain Key successfully. Please wait for result. Domain Key will "
343
  "be automatically sent to your WordPress."
344
  msgstr ""
345
 
346
- #: src/cloud.cls.php:1002
347
  msgid ""
348
  "Congratulations, your Domain Key has been approved! The setting has been "
349
  "updated accordingly."
350
  msgstr ""
351
 
352
- #: src/cloud.cls.php:1073
353
  msgid "Domain Key hash mismatch"
354
  msgstr ""
355
 
356
- #: src/cloud.cls.php:1184
357
  msgid "Sync credit allowance with Cloud Server successfully."
358
  msgstr ""
359
 
360
- #: src/conf.cls.php:704
361
  msgid "Changed setting successfully."
362
  msgstr ""
363
 
@@ -381,35 +433,27 @@ msgstr ""
381
  msgid "Sitemap created successfully: %d items"
382
  msgstr ""
383
 
384
- #: src/crawler.cls.php:99
385
  msgid "Crawler disabled list is cleared! All crawlers are set to active! "
386
  msgstr ""
387
 
388
- #: src/crawler.cls.php:826
389
  msgid "Guest"
390
  msgstr ""
391
 
392
- #: src/crawler.cls.php:978
393
  msgid "Manually added to blocklist"
394
  msgstr ""
395
 
396
- #: src/crawler.cls.php:981
397
  msgid "Previously existed in blocklist"
398
  msgstr ""
399
 
400
- #: src/css.cls.php:60 src/root.cls.php:176
401
  msgid "Queue cleared successfully."
402
  msgstr ""
403
 
404
- #: src/css.cls.php:532
405
- msgid "%1$s %2$s files left in queue"
406
- msgstr ""
407
-
408
- #: src/css.cls.php:533
409
- msgid "Cancel"
410
- msgstr ""
411
-
412
- #: src/data.cls.php:219
413
  msgid ""
414
  "The database has been upgrading in the background since %s. This message "
415
  "will disappear once upgrade is complete."
@@ -423,7 +467,7 @@ msgid ""
423
  "errors."
424
  msgstr ""
425
 
426
- #: src/data.upgrade.func.php:101 src/lang.cls.php:115
427
  msgid "JS Combine"
428
  msgstr ""
429
 
@@ -500,7 +544,7 @@ msgid "Please see %s for more details."
500
  msgstr ""
501
 
502
  #: src/doc.cls.php:53 src/doc.cls.php:105 tpl/cdn/manage.tpl.php:66
503
- #: tpl/dash/dashboard.tpl.php:49 tpl/img_optm/summary.tpl.php:62
504
  #: tpl/img_optm/summary.tpl.php:102 tpl/inc/check_cache_disabled.php:42
505
  msgid "Learn More"
506
  msgstr ""
@@ -577,93 +621,104 @@ msgid "There is proceeding queue not pulled yet. Queue info: %s."
577
  msgstr ""
578
 
579
  #: src/error.cls.php:84
580
- msgid "The site is not registered on QUIC.cloud."
581
  msgstr ""
582
 
583
  #: src/error.cls.php:88
 
 
 
 
584
  msgid ""
585
  "The domain key is not correct. Please try to sync your domain key again."
586
  msgstr ""
587
 
588
- #: src/error.cls.php:92
589
  msgid "The current server is under heavy load."
590
  msgstr ""
591
 
592
- #: src/error.cls.php:96
593
  msgid "Online node needs to be redetected."
594
  msgstr ""
595
 
596
- #: src/error.cls.php:100
597
  msgid "Credits are not enough to proceed the current request."
598
  msgstr ""
599
 
600
- #: src/error.cls.php:104 src/error.cls.php:128
601
  msgid "%s file not writable."
602
  msgstr ""
603
 
604
- #: src/error.cls.php:112
605
  msgid "Could not find %1$s in %2$s."
606
  msgstr ""
607
 
608
- #: src/error.cls.php:116
609
  msgid "Invalid login cookie. Please check the %s file."
610
  msgstr ""
611
 
612
- #: src/error.cls.php:120
613
  msgid "Failed to back up %s file, aborted changes."
614
  msgstr ""
615
 
616
- #: src/error.cls.php:124
617
  msgid "%s file not readable."
618
  msgstr ""
619
 
620
- #: src/error.cls.php:132
621
  msgid "Failed to get %s file contents."
622
  msgstr ""
623
 
624
- #: src/error.cls.php:136
625
  msgid "Failed to create table %s! SQL: %s."
626
  msgstr ""
627
 
628
- #: src/error.cls.php:140
629
  msgid "Crawler disabled by the server admin."
630
  msgstr ""
631
 
632
- #: src/error.cls.php:145
633
  msgid "Previous request too recent. Please try again later."
634
  msgstr ""
635
 
636
- #: src/error.cls.php:149
637
  msgid "Previous request too recent. Please try again after %s."
638
  msgstr ""
639
 
640
- #: src/error.cls.php:153
641
  msgid "Your application is waiting for approval."
642
  msgstr ""
643
 
644
- #: src/error.cls.php:157
645
  msgid "The callback validation to your domain failed due to hash mismatch."
646
  msgstr ""
647
 
648
- #: src/error.cls.php:161
649
  msgid ""
650
  "The callback validation to your domain failed. Please make sure there is no "
651
  "firewall blocking our servers."
652
  msgstr ""
653
 
654
- #: src/error.cls.php:165
655
  msgid ""
656
  "The callback validation to your domain failed. Please make sure there is no "
657
  "firewall blocking our servers. Response code: "
658
  msgstr ""
659
 
660
- #: src/error.cls.php:169
661
  msgid ""
662
  "Your domain has been forbidden from using our services due to a previous "
663
  "policy violation."
664
  msgstr ""
665
 
666
- #: src/error.cls.php:173
 
 
 
 
 
 
 
667
  msgid "Unknown error"
668
  msgstr ""
669
 
@@ -703,41 +758,49 @@ msgstr ""
703
  msgid "Private Cache Hits"
704
  msgstr ""
705
 
706
- #: src/gui.cls.php:403
 
 
 
 
 
 
 
 
707
  msgid "Purge this page"
708
  msgstr ""
709
 
710
- #: src/gui.cls.php:411
711
  msgid "Mark this page as "
712
  msgstr ""
713
 
714
- #: src/gui.cls.php:423
715
  msgid "Forced cacheable"
716
  msgstr ""
717
 
718
- #: src/gui.cls.php:434
719
  msgid "Non cacheable"
720
  msgstr ""
721
 
722
- #: src/gui.cls.php:445
723
  msgid "Private cache"
724
  msgstr ""
725
 
726
- #: src/gui.cls.php:456
727
  msgid "No optimization"
728
  msgstr ""
729
 
730
- #: src/gui.cls.php:464
731
  msgid "More settings"
732
  msgstr ""
733
 
734
- #: src/gui.cls.php:471 src/gui.cls.php:479 src/gui.cls.php:487
735
- #: src/gui.cls.php:496 src/gui.cls.php:506 src/gui.cls.php:516
736
- #: src/gui.cls.php:526 src/gui.cls.php:535 src/gui.cls.php:545
737
- #: src/gui.cls.php:555 src/gui.cls.php:621 src/gui.cls.php:629
738
- #: src/gui.cls.php:637 src/gui.cls.php:646 src/gui.cls.php:656
739
- #: src/gui.cls.php:666 src/gui.cls.php:676 src/gui.cls.php:686
740
- #: src/gui.cls.php:695 src/gui.cls.php:705 src/gui.cls.php:715
741
  #: tpl/page_optm/settings_media.tpl.php:125 tpl/toolbox/purge.tpl.php:37
742
  #: tpl/toolbox/purge.tpl.php:43 tpl/toolbox/purge.tpl.php:52
743
  #: tpl/toolbox/purge.tpl.php:61 tpl/toolbox/purge.tpl.php:70
@@ -747,77 +810,77 @@ msgstr ""
747
  msgid "Purge All"
748
  msgstr ""
749
 
750
- #: src/gui.cls.php:479 src/gui.cls.php:579 src/gui.cls.php:629
751
  msgid "LSCache"
752
  msgstr ""
753
 
754
- #: src/gui.cls.php:487 src/gui.cls.php:637 tpl/toolbox/purge.tpl.php:43
755
  msgid "CSS/JS Cache"
756
  msgstr ""
757
 
758
- #: src/gui.cls.php:496 src/gui.cls.php:656 src/lang.cls.php:82
759
- #: tpl/dash/dashboard.tpl.php:396 tpl/toolbox/purge.tpl.php:52
760
  msgid "Object Cache"
761
  msgstr ""
762
 
763
- #: src/gui.cls.php:506 src/gui.cls.php:666 tpl/toolbox/purge.tpl.php:61
764
  msgid "Opcode Cache"
765
  msgstr ""
766
 
767
- #: src/gui.cls.php:535 src/gui.cls.php:695 tpl/toolbox/purge.tpl.php:88
768
  msgid "Localized Resources"
769
  msgstr ""
770
 
771
- #: src/gui.cls.php:545 src/gui.cls.php:705
772
  #: tpl/page_optm/settings_media.tpl.php:125 tpl/toolbox/purge.tpl.php:97
773
  msgid "LQIP Cache"
774
  msgstr ""
775
 
776
- #: src/gui.cls.php:555 src/gui.cls.php:715 src/lang.cls.php:144
777
  #: tpl/toolbox/purge.tpl.php:106
778
  msgid "Gravatar Cache"
779
  msgstr ""
780
 
781
- #: src/gui.cls.php:579
782
  msgid "LiteSpeed Cache Purge All"
783
  msgstr ""
784
 
785
- #: src/gui.cls.php:595 tpl/cdn/entry.tpl.php:7 tpl/cdn/settings.tpl.php:194
786
  #: tpl/db_optm/entry.tpl.php:6
787
  msgid "Manage"
788
  msgstr ""
789
 
790
- #: src/gui.cls.php:646 tpl/cdn/manage.tpl.php:17
791
  msgid "Cloudflare"
792
  msgstr ""
793
 
794
- #: src/gui.cls.php:734 tpl/img_optm/summary.tpl.php:175
795
  msgid "Remove all previous unfinished image optimization requests."
796
  msgstr ""
797
 
798
- #: src/gui.cls.php:735 tpl/img_optm/summary.tpl.php:177
799
  msgid "Clean Up Unfinished Data"
800
  msgstr ""
801
 
802
- #: src/gui.cls.php:753
803
  msgid "Install %s"
804
  msgstr ""
805
 
806
- #: src/gui.cls.php:754
807
  msgid "Install Now"
808
  msgstr ""
809
 
810
- #: src/gui.cls.php:773
811
  msgid ""
812
  "<a href=\"%1$s\" %2$s>View version %3$s details</a> or <a href=\"%4$s\" %5$s "
813
  "target=\"_blank\">update now</a>."
814
  msgstr ""
815
 
816
- #: src/gui.cls.php:776
817
  msgid "View %1$s version %2$s details"
818
  msgstr ""
819
 
820
- #: src/gui.cls.php:781
821
  msgid "Update %s now"
822
  msgstr ""
823
 
@@ -825,7 +888,7 @@ msgstr ""
825
  msgid "Mobile Agent Rules"
826
  msgstr ""
827
 
828
- #: src/htaccess.cls.php:787
829
  msgid ""
830
  "<p>Please add/replace the following codes into the beginning of %1$s:</p> "
831
  "%2$s"
@@ -947,11 +1010,11 @@ msgstr ""
947
  msgid "Images not requested"
948
  msgstr ""
949
 
950
- #: src/lang.cls.php:24 tpl/dash/dashboard.tpl.php:337
951
  msgid "Images requested"
952
  msgstr ""
953
 
954
- #: src/lang.cls.php:25 tpl/dash/dashboard.tpl.php:347
955
  msgid "Images notified to pull"
956
  msgstr ""
957
 
@@ -987,768 +1050,816 @@ msgstr ""
987
  msgid "Images with wrong meta"
988
  msgstr ""
989
 
990
- #: src/lang.cls.php:53
991
- msgid "Server IP"
 
 
992
  msgstr ""
993
 
994
  #: src/lang.cls.php:54
995
- msgid "Domain Key"
 
996
  msgstr ""
997
 
998
  #: src/lang.cls.php:55
 
 
 
 
 
 
 
 
 
 
 
 
999
  msgid "Guest Mode User Agents"
1000
  msgstr ""
1001
 
1002
- #: src/lang.cls.php:56
1003
  msgid "Guest Mode IPs"
1004
  msgstr ""
1005
 
1006
- #: src/lang.cls.php:58
1007
  msgid "Enable Cache"
1008
  msgstr ""
1009
 
1010
- #: src/lang.cls.php:59 tpl/dash/dashboard.tpl.php:397
1011
  msgid "Browser Cache"
1012
  msgstr ""
1013
 
1014
- #: src/lang.cls.php:60
1015
  msgid "Default Public Cache TTL"
1016
  msgstr ""
1017
 
1018
- #: src/lang.cls.php:61
1019
  msgid "Default Private Cache TTL"
1020
  msgstr ""
1021
 
1022
- #: src/lang.cls.php:62
1023
  msgid "Default Front Page TTL"
1024
  msgstr ""
1025
 
1026
- #: src/lang.cls.php:63
1027
  msgid "Default Feed TTL"
1028
  msgstr ""
1029
 
1030
- #: src/lang.cls.php:64
1031
  msgid "Default REST TTL"
1032
  msgstr ""
1033
 
1034
- #: src/lang.cls.php:65
1035
  msgid "Default HTTP Status Code Page TTL"
1036
  msgstr ""
1037
 
1038
- #: src/lang.cls.php:66
1039
  msgid "Browser Cache TTL"
1040
  msgstr ""
1041
 
1042
- #: src/lang.cls.php:67
1043
  msgid "Automatically Upgrade"
1044
  msgstr ""
1045
 
1046
- #: src/lang.cls.php:68
1047
  msgid "Guest Mode"
1048
  msgstr ""
1049
 
1050
- #: src/lang.cls.php:69
1051
  msgid "Guest Optimization"
1052
  msgstr ""
1053
 
1054
- #: src/lang.cls.php:70
1055
  msgid "Notifications"
1056
  msgstr ""
1057
 
1058
- #: src/lang.cls.php:71
1059
  msgid "Cache Logged-in Users"
1060
  msgstr ""
1061
 
1062
- #: src/lang.cls.php:72
1063
  msgid "Cache Commenters"
1064
  msgstr ""
1065
 
1066
- #: src/lang.cls.php:73
1067
  msgid "Cache REST API"
1068
  msgstr ""
1069
 
1070
- #: src/lang.cls.php:74
1071
  msgid "Cache Login Page"
1072
  msgstr ""
1073
 
1074
- #: src/lang.cls.php:75
1075
  msgid "Cache favicon.ico"
1076
  msgstr ""
1077
 
1078
- #: src/lang.cls.php:76
1079
  msgid "Cache PHP Resources"
1080
  msgstr ""
1081
 
1082
- #: src/lang.cls.php:77 tpl/cache/settings_inc.cache_mobile.tpl.php:71
1083
  msgid "Cache Mobile"
1084
  msgstr ""
1085
 
1086
- #: src/lang.cls.php:78 tpl/cache/settings_inc.cache_mobile.tpl.php:71
1087
  msgid "List of Mobile User Agents"
1088
  msgstr ""
1089
 
1090
- #: src/lang.cls.php:79
1091
  msgid "Private Cached URIs"
1092
  msgstr ""
1093
 
1094
- #: src/lang.cls.php:80
1095
  msgid "Drop Query String"
1096
  msgstr ""
1097
 
1098
- #: src/lang.cls.php:83
1099
  msgid "Method"
1100
  msgstr ""
1101
 
1102
- #: src/lang.cls.php:84
1103
  msgid "Host"
1104
  msgstr ""
1105
 
1106
- #: src/lang.cls.php:85
1107
  msgid "Port"
1108
  msgstr ""
1109
 
1110
- #: src/lang.cls.php:86
1111
  msgid "Default Object Lifetime"
1112
  msgstr ""
1113
 
1114
- #: src/lang.cls.php:87
1115
  msgid "Username"
1116
  msgstr ""
1117
 
1118
- #: src/lang.cls.php:88
1119
  msgid "Password"
1120
  msgstr ""
1121
 
1122
- #: src/lang.cls.php:89
1123
  msgid "Redis Database ID"
1124
  msgstr ""
1125
 
1126
- #: src/lang.cls.php:90
1127
  msgid "Global Groups"
1128
  msgstr ""
1129
 
1130
- #: src/lang.cls.php:91
1131
  msgid "Do Not Cache Groups"
1132
  msgstr ""
1133
 
1134
- #: src/lang.cls.php:92
1135
  msgid "Persistent Connection"
1136
  msgstr ""
1137
 
1138
- #: src/lang.cls.php:93
1139
  msgid "Cache WP-Admin"
1140
  msgstr ""
1141
 
1142
- #: src/lang.cls.php:94
1143
  msgid "Store Transients"
1144
  msgstr ""
1145
 
1146
- #: src/lang.cls.php:96
1147
  msgid "Purge All On Upgrade"
1148
  msgstr ""
1149
 
1150
- #: src/lang.cls.php:97
1151
  msgid "Serve Stale"
1152
  msgstr ""
1153
 
1154
- #: src/lang.cls.php:98 tpl/cache/settings-purge.tpl.php:130
1155
  msgid "Scheduled Purge URLs"
1156
  msgstr ""
1157
 
1158
- #: src/lang.cls.php:99 tpl/cache/settings-purge.tpl.php:105
1159
  msgid "Scheduled Purge Time"
1160
  msgstr ""
1161
 
1162
- #: src/lang.cls.php:100
1163
  msgid "Force Cache URIs"
1164
  msgstr ""
1165
 
1166
- #: src/lang.cls.php:101
1167
  msgid "Force Public Cache URIs"
1168
  msgstr ""
1169
 
1170
- #: src/lang.cls.php:102
1171
  msgid "Do Not Cache URIs"
1172
  msgstr ""
1173
 
1174
- #: src/lang.cls.php:103
1175
  msgid "Do Not Cache Query Strings"
1176
  msgstr ""
1177
 
1178
- #: src/lang.cls.php:104
1179
  msgid "Do Not Cache Categories"
1180
  msgstr ""
1181
 
1182
- #: src/lang.cls.php:105
1183
  msgid "Do Not Cache Tags"
1184
  msgstr ""
1185
 
1186
- #: src/lang.cls.php:106
1187
  msgid "Do Not Cache Roles"
1188
  msgstr ""
1189
 
1190
- #: src/lang.cls.php:107
1191
  msgid "CSS Minify"
1192
  msgstr ""
1193
 
1194
- #: src/lang.cls.php:108
1195
  msgid "CSS Combine"
1196
  msgstr ""
1197
 
1198
- #: src/lang.cls.php:109
1199
  msgid "CSS Combine External and Inline"
1200
  msgstr ""
1201
 
1202
- #: src/lang.cls.php:110
1203
  msgid "Generate UCSS"
1204
  msgstr ""
1205
 
1206
- #: src/lang.cls.php:111
1207
  msgid "UCSS Inline"
1208
  msgstr ""
1209
 
1210
- #: src/lang.cls.php:112
1211
  msgid "UCSS Allowlist"
1212
  msgstr ""
1213
 
1214
- #: src/lang.cls.php:113
1215
  msgid "UCSS URI Excludes"
1216
  msgstr ""
1217
 
1218
- #: src/lang.cls.php:114
1219
  msgid "JS Minify"
1220
  msgstr ""
1221
 
1222
- #: src/lang.cls.php:116
1223
  msgid "JS Combine External and Inline"
1224
  msgstr ""
1225
 
1226
- #: src/lang.cls.php:117
1227
  msgid "HTML Minify"
1228
  msgstr ""
1229
 
1230
- #: src/lang.cls.php:118
1231
  msgid "HTML Lazy Load Selectors"
1232
  msgstr ""
1233
 
1234
- #: src/lang.cls.php:119 tpl/page_optm/settings_tuning.tpl.php:148
1235
  msgid "Load CSS Asynchronously"
1236
  msgstr ""
1237
 
1238
- #: src/lang.cls.php:120
1239
  msgid "CCSS Per URL"
1240
  msgstr ""
1241
 
1242
- #: src/lang.cls.php:121
1243
  msgid "Inline CSS Async Lib"
1244
  msgstr ""
1245
 
1246
- #: src/lang.cls.php:122
1247
  msgid "Font Display Optimization"
1248
  msgstr ""
1249
 
1250
- #: src/lang.cls.php:123
1251
  msgid "Load JS Deferred"
1252
  msgstr ""
1253
 
1254
- #: src/lang.cls.php:124
1255
  msgid "Localize Resources"
1256
  msgstr ""
1257
 
1258
- #: src/lang.cls.php:125
1259
  msgid "Localization Files"
1260
  msgstr ""
1261
 
1262
- #: src/lang.cls.php:126
1263
  msgid "DNS Prefetch"
1264
  msgstr ""
1265
 
1266
- #: src/lang.cls.php:127
1267
  msgid "DNS Prefetch Control"
1268
  msgstr ""
1269
 
1270
- #: src/lang.cls.php:128
1271
  msgid "CSS Excludes"
1272
  msgstr ""
1273
 
1274
- #: src/lang.cls.php:129
1275
  msgid "JS Excludes"
1276
  msgstr ""
1277
 
1278
- #: src/lang.cls.php:130
1279
  msgid "Remove Query Strings"
1280
  msgstr ""
1281
 
1282
- #: src/lang.cls.php:131
1283
  msgid "Load Google Fonts Asynchronously"
1284
  msgstr ""
1285
 
1286
- #: src/lang.cls.php:132
1287
  msgid "Remove Google Fonts"
1288
  msgstr ""
1289
 
1290
- #: src/lang.cls.php:133
1291
  msgid "Critical CSS Rules"
1292
  msgstr ""
1293
 
1294
- #: src/lang.cls.php:134
1295
  msgid "Separate CCSS Cache Post Types"
1296
  msgstr ""
1297
 
1298
- #: src/lang.cls.php:135
1299
  msgid "Separate CCSS Cache URIs"
1300
  msgstr ""
1301
 
1302
- #: src/lang.cls.php:136
1303
  msgid "JS Deferred Excludes"
1304
  msgstr ""
1305
 
1306
- #: src/lang.cls.php:137
1307
  msgid "Guest Mode JS Excludes"
1308
  msgstr ""
1309
 
1310
- #: src/lang.cls.php:138
1311
  msgid "Remove WordPress Emoji"
1312
  msgstr ""
1313
 
1314
- #: src/lang.cls.php:139
1315
  msgid "Remove Noscript Tags"
1316
  msgstr ""
1317
 
1318
- #: src/lang.cls.php:140
1319
  msgid "URI Excludes"
1320
  msgstr ""
1321
 
1322
- #: src/lang.cls.php:141
1323
  msgid "Optimize for Guests Only"
1324
  msgstr ""
1325
 
1326
- #: src/lang.cls.php:142
1327
  msgid "Role Excludes"
1328
  msgstr ""
1329
 
1330
- #: src/lang.cls.php:145
1331
  msgid "Gravatar Cache Cron"
1332
  msgstr ""
1333
 
1334
- #: src/lang.cls.php:146
1335
  msgid "Gravatar Cache TTL"
1336
  msgstr ""
1337
 
1338
- #: src/lang.cls.php:148
1339
  msgid "Lazy Load Images"
1340
  msgstr ""
1341
 
1342
- #: src/lang.cls.php:149
1343
  msgid "Lazy Load Image Excludes"
1344
  msgstr ""
1345
 
1346
- #: src/lang.cls.php:150
1347
  msgid "Lazy Load Image Class Name Excludes"
1348
  msgstr ""
1349
 
1350
- #: src/lang.cls.php:151
1351
  msgid "Lazy Load Image Parent Class Name Excludes"
1352
  msgstr ""
1353
 
1354
- #: src/lang.cls.php:152
1355
  msgid "Lazy Load Iframe Class Name Excludes"
1356
  msgstr ""
1357
 
1358
- #: src/lang.cls.php:153
1359
  msgid "Lazy Load Iframe Parent Class Name Excludes"
1360
  msgstr ""
1361
 
1362
- #: src/lang.cls.php:154
1363
  msgid "Lazy Load URI Excludes"
1364
  msgstr ""
1365
 
1366
- #: src/lang.cls.php:155
1367
  msgid "LQIP Excludes"
1368
  msgstr ""
1369
 
1370
- #: src/lang.cls.php:156
1371
  msgid "Basic Image Placeholder"
1372
  msgstr ""
1373
 
1374
- #: src/lang.cls.php:157
1375
  msgid "Responsive Placeholder"
1376
  msgstr ""
1377
 
1378
- #: src/lang.cls.php:158
1379
  msgid "Responsive Placeholder Color"
1380
  msgstr ""
1381
 
1382
- #: src/lang.cls.php:159
1383
  msgid "Responsive Placeholder SVG"
1384
  msgstr ""
1385
 
1386
- #: src/lang.cls.php:160
1387
  msgid "LQIP Cloud Generator"
1388
  msgstr ""
1389
 
1390
- #: src/lang.cls.php:161
1391
  msgid "LQIP Quality"
1392
  msgstr ""
1393
 
1394
- #: src/lang.cls.php:162
1395
  msgid "LQIP Minimum Dimensions"
1396
  msgstr ""
1397
 
1398
- #: src/lang.cls.php:164
1399
  msgid "Generate LQIP In Background"
1400
  msgstr ""
1401
 
1402
- #: src/lang.cls.php:165
1403
  msgid "Lazy Load Iframes"
1404
  msgstr ""
1405
 
1406
- #: src/lang.cls.php:166
1407
  msgid "Add Missing Sizes"
1408
  msgstr ""
1409
 
1410
- #: src/lang.cls.php:167
 
 
 
 
 
 
 
 
 
1411
  msgid "Auto Request Cron"
1412
  msgstr ""
1413
 
1414
- #: src/lang.cls.php:168
1415
  msgid "Auto Pull Cron"
1416
  msgstr ""
1417
 
1418
- #: src/lang.cls.php:169
1419
  msgid "Optimize Original Images"
1420
  msgstr ""
1421
 
1422
- #: src/lang.cls.php:170
1423
  msgid "Remove Original Backups"
1424
  msgstr ""
1425
 
1426
- #: src/lang.cls.php:171
1427
  msgid "Create WebP Versions"
1428
  msgstr ""
1429
 
1430
- #: src/lang.cls.php:172
1431
  msgid "Optimize Losslessly"
1432
  msgstr ""
1433
 
1434
- #: src/lang.cls.php:173
1435
  msgid "Preserve EXIF/XMP data"
1436
  msgstr ""
1437
 
1438
- #: src/lang.cls.php:174
1439
  msgid "WebP Attribute To Replace"
1440
  msgstr ""
1441
 
1442
- #: src/lang.cls.php:175
1443
  msgid "WebP For Extra srcset"
1444
  msgstr ""
1445
 
1446
- #: src/lang.cls.php:176
1447
  msgid "WordPress Image Quality Control"
1448
  msgstr ""
1449
 
1450
- #: src/lang.cls.php:177 tpl/esi_widget_edit.php:36
1451
  msgid "Enable ESI"
1452
  msgstr ""
1453
 
1454
- #: src/lang.cls.php:178
1455
  msgid "Cache Admin Bar"
1456
  msgstr ""
1457
 
1458
- #: src/lang.cls.php:179
1459
  msgid "Cache Comment Form"
1460
  msgstr ""
1461
 
1462
- #: src/lang.cls.php:180
1463
  msgid "ESI Nonces"
1464
  msgstr ""
1465
 
1466
- #: src/lang.cls.php:181 tpl/page_optm/settings_css.tpl.php:110
1467
- #: tpl/page_optm/settings_css.tpl.php:220
1468
  msgid "Vary Group"
1469
  msgstr ""
1470
 
1471
- #: src/lang.cls.php:182
1472
  msgid "Purge All Hooks"
1473
  msgstr ""
1474
 
1475
- #: src/lang.cls.php:183
1476
  msgid "Improve HTTP/HTTPS Compatibility"
1477
  msgstr ""
1478
 
1479
- #: src/lang.cls.php:184
1480
  msgid "Instant Click"
1481
  msgstr ""
1482
 
1483
- #: src/lang.cls.php:185
1484
  msgid "Do Not Cache Cookies"
1485
  msgstr ""
1486
 
1487
- #: src/lang.cls.php:186
1488
  msgid "Do Not Cache User Agents"
1489
  msgstr ""
1490
 
1491
- #: src/lang.cls.php:187
1492
  msgid "Login Cookie"
1493
  msgstr ""
1494
 
1495
- #: src/lang.cls.php:188
1496
  msgid "Image WebP Replacement"
1497
  msgstr ""
1498
 
1499
- #: src/lang.cls.php:190
1500
  msgid "Frontend Heartbeat Control"
1501
  msgstr ""
1502
 
1503
- #: src/lang.cls.php:191
1504
  msgid "Frontend Heartbeat TTL"
1505
  msgstr ""
1506
 
1507
- #: src/lang.cls.php:192
1508
  msgid "Backend Heartbeat Control"
1509
  msgstr ""
1510
 
1511
- #: src/lang.cls.php:193
1512
  msgid "Backend Heartbeat TTL"
1513
  msgstr ""
1514
 
1515
- #: src/lang.cls.php:194
1516
  msgid "Editor Heartbeat"
1517
  msgstr ""
1518
 
1519
- #: src/lang.cls.php:195
1520
  msgid "Editor Heartbeat TTL"
1521
  msgstr ""
1522
 
1523
- #: src/lang.cls.php:197
1524
  msgid "QUIC.cloud CDN"
1525
  msgstr ""
1526
 
1527
- #: src/lang.cls.php:198
1528
  msgid "Use CDN Mapping"
1529
  msgstr ""
1530
 
1531
- #: src/lang.cls.php:199
1532
  msgid "CDN URL"
1533
  msgstr ""
1534
 
1535
- #: src/lang.cls.php:200
1536
  msgid "Include Images"
1537
  msgstr ""
1538
 
1539
- #: src/lang.cls.php:201
1540
  msgid "Include CSS"
1541
  msgstr ""
1542
 
1543
- #: src/lang.cls.php:202
1544
  msgid "Include JS"
1545
  msgstr ""
1546
 
1547
- #: src/lang.cls.php:203 tpl/cdn/settings.tpl.php:102
1548
  msgid "Include File Types"
1549
  msgstr ""
1550
 
1551
- #: src/lang.cls.php:204
1552
  msgid "HTML Attribute To Replace"
1553
  msgstr ""
1554
 
1555
- #: src/lang.cls.php:205
1556
  msgid "Original URLs"
1557
  msgstr ""
1558
 
1559
- #: src/lang.cls.php:206
1560
  msgid "Included Directories"
1561
  msgstr ""
1562
 
1563
- #: src/lang.cls.php:207
1564
  msgid "Exclude Path"
1565
  msgstr ""
1566
 
1567
- #: src/lang.cls.php:208
1568
  msgid "Cloudflare API"
1569
  msgstr ""
1570
 
1571
- #: src/lang.cls.php:211
1572
  msgid "Delay"
1573
  msgstr ""
1574
 
1575
- #: src/lang.cls.php:212
1576
  msgid "Run Duration"
1577
  msgstr ""
1578
 
1579
- #: src/lang.cls.php:213
1580
  msgid "Interval Between Runs"
1581
  msgstr ""
1582
 
1583
- #: src/lang.cls.php:214
1584
  msgid "Crawl Interval"
1585
  msgstr ""
1586
 
1587
- #: src/lang.cls.php:215
1588
  msgid "Threads"
1589
  msgstr ""
1590
 
1591
- #: src/lang.cls.php:216
1592
  msgid "Timeout"
1593
  msgstr ""
1594
 
1595
- #: src/lang.cls.php:217
1596
  msgid "Server Load Limit"
1597
  msgstr ""
1598
 
1599
- #: src/lang.cls.php:218
1600
  msgid "Role Simulation"
1601
  msgstr ""
1602
 
1603
- #: src/lang.cls.php:219
1604
  msgid "Cookie Simulation"
1605
  msgstr ""
1606
 
1607
- #: src/lang.cls.php:220
1608
  msgid "Custom Sitemap"
1609
  msgstr ""
1610
 
1611
- #: src/lang.cls.php:221
1612
  msgid "Drop Domain from Sitemap"
1613
  msgstr ""
1614
 
1615
- #: src/lang.cls.php:222
1616
  msgid "Sitemap Timeout"
1617
  msgstr ""
1618
 
1619
- #: src/lang.cls.php:224 tpl/inc/disabled_all.php:5
1620
  msgid "Disable All Features"
1621
  msgstr ""
1622
 
1623
- #: src/lang.cls.php:225 tpl/toolbox/log_viewer.tpl.php:7
1624
  msgid "Debug Log"
1625
  msgstr ""
1626
 
1627
- #: src/lang.cls.php:226
1628
  msgid "Admin IPs"
1629
  msgstr ""
1630
 
1631
- #: src/lang.cls.php:227
1632
  msgid "Debug Level"
1633
  msgstr ""
1634
 
1635
- #: src/lang.cls.php:228
1636
  msgid "Log File Size Limit"
1637
  msgstr ""
1638
 
1639
- #: src/lang.cls.php:229
1640
  msgid "Log Cookies"
1641
  msgstr ""
1642
 
1643
- #: src/lang.cls.php:230
1644
  msgid "Collapse Query Strings"
1645
  msgstr ""
1646
 
1647
- #: src/lang.cls.php:231
1648
  msgid "Debug URI Includes"
1649
  msgstr ""
1650
 
1651
- #: src/lang.cls.php:232
1652
  msgid "Debug URI Excludes"
1653
  msgstr ""
1654
 
1655
- #: src/lang.cls.php:234
 
 
 
 
1656
  msgid "Revisions Max Number"
1657
  msgstr ""
1658
 
1659
- #: src/lang.cls.php:235
1660
  msgid "Revisions Max Age"
1661
  msgstr ""
1662
 
1663
- #: src/media.cls.php:192
1664
  msgid "LiteSpeed Optimization"
1665
  msgstr ""
1666
 
1667
- #: src/media.cls.php:242 src/media.cls.php:267 src/media.cls.php:296
1668
- #: src/media.cls.php:320
1669
  msgid "(optm)"
1670
  msgstr ""
1671
 
1672
- #: src/media.cls.php:243
1673
  msgid "Currently using optimized version of file."
1674
  msgstr ""
1675
 
1676
- #: src/media.cls.php:243 src/media.cls.php:297
1677
  msgid "Click to switch to original (unoptimized) version."
1678
  msgstr ""
1679
 
1680
- #: src/media.cls.php:247 src/media.cls.php:301
1681
  msgid "(non-optm)"
1682
  msgstr ""
1683
 
1684
- #: src/media.cls.php:248
1685
  msgid "Currently using original (unoptimized) version of file."
1686
  msgstr ""
1687
 
1688
- #: src/media.cls.php:248 src/media.cls.php:302
1689
  msgid "Click to switch to optimized version."
1690
  msgstr ""
1691
 
1692
- #: src/media.cls.php:252
1693
  msgid "Original file reduced by %1$s (%2$s)"
1694
  msgstr ""
1695
 
1696
- #: src/media.cls.php:258
1697
  msgid "Orig saved %s"
1698
  msgstr ""
1699
 
1700
- #: src/media.cls.php:266 src/media.cls.php:319
1701
  msgid "Using optimized version of file. "
1702
  msgstr ""
1703
 
1704
- #: src/media.cls.php:266
1705
  msgid "No backup of original file exists."
1706
  msgstr ""
1707
 
1708
- #: src/media.cls.php:275
1709
  msgid "Congratulation! Your file was already optimized"
1710
  msgstr ""
1711
 
1712
- #: src/media.cls.php:278
1713
  msgid "Orig %s"
1714
  msgstr ""
1715
 
1716
- #: src/media.cls.php:278
1717
  msgid "(no savings)"
1718
  msgstr ""
1719
 
1720
- #: src/media.cls.php:281
1721
  msgid "Orig"
1722
  msgstr ""
1723
 
1724
- #: src/media.cls.php:297
1725
  msgid "Currently using optimized version of WebP file."
1726
  msgstr ""
1727
 
1728
- #: src/media.cls.php:302
1729
  msgid "Currently using original (unoptimized) version of WebP file."
1730
  msgstr ""
1731
 
1732
- #: src/media.cls.php:306
1733
  msgid "WebP file reduced by %1$s (%2$s)"
1734
  msgstr ""
1735
 
1736
- #: src/media.cls.php:311
1737
  msgid "WebP saved %s"
1738
  msgstr ""
1739
 
1740
- #: src/media.cls.php:319
1741
  msgid "No backup of unoptimized WebP file exists."
1742
  msgstr ""
1743
 
1744
- #: src/media.cls.php:325
1745
  msgid "WebP"
1746
  msgstr ""
1747
 
1748
- #: src/media.cls.php:335
1749
  msgid "Restore from backup"
1750
  msgstr ""
1751
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1752
  #: src/placeholder.cls.php:80 tpl/dash/network_dash.tpl.php:30
1753
  msgid "LQIP"
1754
  msgstr ""
@@ -1757,98 +1868,104 @@ msgstr ""
1757
  msgid "LQIP image preview for size %s"
1758
  msgstr ""
1759
 
1760
- #: src/purge.cls.php:192
1761
  msgid "Purged all caches successfully."
1762
  msgstr ""
1763
 
1764
- #: src/purge.cls.php:211
1765
  msgid "Notified LiteSpeed Web Server to purge all LSCache entries."
1766
  msgstr ""
1767
 
1768
- #: src/purge.cls.php:230
1769
  msgid "Cleaned all Critical CSS files."
1770
  msgstr ""
1771
 
1772
- #: src/purge.cls.php:249
1773
  msgid "Cleaned all Unique CSS files."
1774
  msgstr ""
1775
 
1776
- #: src/purge.cls.php:283
1777
  msgid "Cleaned all LQIP files."
1778
  msgstr ""
1779
 
1780
- #: src/purge.cls.php:300
1781
  msgid "Cleaned all Gravatar files."
1782
  msgstr ""
1783
 
1784
- #: src/purge.cls.php:317
1785
  msgid "Cleaned all localized resource entries."
1786
  msgstr ""
1787
 
1788
- #: src/purge.cls.php:351
1789
  msgid "Notified LiteSpeed Web Server to purge CSS/JS entries."
1790
  msgstr ""
1791
 
1792
- #: src/purge.cls.php:367
1793
  msgid "Opcode cache is not enabled."
1794
  msgstr ""
1795
 
1796
- #: src/purge.cls.php:379
1797
  msgid "Reset the entire opcode cache successfully."
1798
  msgstr ""
1799
 
1800
- #: src/purge.cls.php:407
1801
  msgid "Object cache is not enabled."
1802
  msgstr ""
1803
 
1804
- #: src/purge.cls.php:420
1805
  msgid "Purge all object caches successfully."
1806
  msgstr ""
1807
 
1808
- #: src/purge.cls.php:613
1809
  msgid "Notified LiteSpeed Web Server to purge the front page."
1810
  msgstr ""
1811
 
1812
- #: src/purge.cls.php:626
1813
  msgid "Notified LiteSpeed Web Server to purge all pages."
1814
  msgstr ""
1815
 
1816
- #: src/purge.cls.php:645
1817
  msgid "Notified LiteSpeed Web Server to purge error pages."
1818
  msgstr ""
1819
 
1820
- #: src/purge.cls.php:672
1821
  msgid "Purge category %s"
1822
  msgstr ""
1823
 
1824
- #: src/purge.cls.php:699
1825
  msgid "Purge tag %s"
1826
  msgstr ""
1827
 
1828
- #: src/purge.cls.php:730
1829
  msgid "Purge url %s"
1830
  msgstr ""
1831
 
1832
- #: src/task.cls.php:120
1833
  msgid "Every Minute"
1834
  msgstr ""
1835
 
1836
- #: src/task.cls.php:139
1837
  msgid "LiteSpeed Crawler Cron"
1838
  msgstr ""
1839
 
1840
- #: src/utility.cls.php:249
1841
  msgid "right now"
1842
  msgstr ""
1843
 
1844
- #: src/utility.cls.php:249
1845
  msgid "just now"
1846
  msgstr ""
1847
 
1848
- #: src/utility.cls.php:252
1849
  msgid " %s ago"
1850
  msgstr ""
1851
 
 
 
 
 
 
 
1852
  #: thirdparty/woocommerce.content.tpl.php:16
1853
  msgid "WooCommerce Settings"
1854
  msgstr ""
@@ -1973,31 +2090,31 @@ msgstr ""
1973
  msgid "Dismiss this notice"
1974
  msgstr ""
1975
 
1976
- #. #-#-#-#-# litespeed-cache.pot (LiteSpeed Cache 4.5) #-#-#-#-#
1977
  #. Plugin Name of the plugin/theme
1978
- #: tpl/banner/new_version.php:59 tpl/banner/new_version_dev.tpl.php:12
1979
  #: tpl/cache/more_settings_tip.tpl.php:15 tpl/inc/admin_footer.php:8
1980
  msgid "LiteSpeed Cache"
1981
  msgstr ""
1982
 
1983
- #: tpl/banner/new_version.php:59
1984
  msgid "New Version Available!"
1985
  msgstr ""
1986
 
1987
- #: tpl/banner/new_version.php:63
1988
  msgid "New release %s is available now."
1989
  msgstr ""
1990
 
1991
- #: tpl/banner/new_version.php:71 tpl/banner/new_version_dev.tpl.php:24
1992
- #: tpl/toolbox/beta_test.tpl.php:60
1993
  msgid "Upgrade"
1994
  msgstr ""
1995
 
1996
- #: tpl/banner/new_version.php:81
1997
  msgid "Turn On Auto Upgrade"
1998
  msgstr ""
1999
 
2000
- #: tpl/banner/new_version.php:87
2001
  msgid "Maybe Later"
2002
  msgstr ""
2003
 
@@ -2013,26 +2130,26 @@ msgstr ""
2013
  msgid "Thank You for Using the LiteSpeed Cache Plugin!"
2014
  msgstr ""
2015
 
2016
- #: tpl/banner/score.php:28 tpl/dash/dashboard.tpl.php:178
2017
  msgid "Page Load Time"
2018
  msgstr ""
2019
 
2020
  #: tpl/banner/score.php:34 tpl/banner/score.php:74
2021
- #: tpl/dash/dashboard.tpl.php:191 tpl/dash/dashboard.tpl.php:259
2022
  msgid "Before"
2023
  msgstr ""
2024
 
2025
  #: tpl/banner/score.php:45 tpl/banner/score.php:84
2026
- #: tpl/dash/dashboard.tpl.php:200 tpl/dash/dashboard.tpl.php:267
2027
  msgid "After"
2028
  msgstr ""
2029
 
2030
  #: tpl/banner/score.php:55 tpl/banner/score.php:94
2031
- #: tpl/dash/dashboard.tpl.php:208 tpl/dash/dashboard.tpl.php:275
2032
  msgid "Improved by"
2033
  msgstr ""
2034
 
2035
- #: tpl/banner/score.php:68 tpl/dash/dashboard.tpl.php:235
2036
  msgid "PageSpeed Score"
2037
  msgstr ""
2038
 
@@ -2098,7 +2215,7 @@ msgid "Browser"
2098
  msgstr ""
2099
 
2100
  #: tpl/cache/entry.tpl.php:18 tpl/cache/entry_network.tpl.php:11
2101
- #: tpl/toolbox/settings-debug.tpl.php:70
2102
  msgid "Advanced"
2103
  msgstr ""
2104
 
@@ -2112,7 +2229,8 @@ msgstr ""
2112
 
2113
  #: tpl/cache/more_settings_tip.tpl.php:12
2114
  #: tpl/cache/settings-excludes.tpl.php:61
2115
- #: tpl/cache/settings-excludes.tpl.php:94 tpl/cdn/settings.tpl.php:78
 
2116
  #: tpl/crawler/settings-general.tpl.php:39
2117
  #: tpl/crawler/settings-general.tpl.php:140
2118
  #: tpl/crawler/settings-general.tpl.php:145
@@ -2194,7 +2312,7 @@ msgstr ""
2194
  msgid "Please visit the <a %s>Information</a> page on how to test the cache."
2195
  msgstr ""
2196
 
2197
- #: tpl/cache/settings-cache.tpl.php:27 tpl/page_optm/entry.tpl.php:30
2198
  msgid "NOTICE"
2199
  msgstr ""
2200
 
@@ -2295,7 +2413,7 @@ msgstr ""
2295
  #: tpl/cache/settings-esi.tpl.php:35 tpl/cdn/manage.tpl.php:21
2296
  #: tpl/crawler/summary.tpl.php:48 tpl/inc/check_cache_disabled.php:31
2297
  #: tpl/inc/check_if_network_disable_all.php:18
2298
- #: tpl/page_optm/settings_css.tpl.php:59 tpl/page_optm/settings_css.tpl.php:165
2299
  #: tpl/page_optm/settings_localization.tpl.php:11
2300
  msgid "WARNING"
2301
  msgstr ""
@@ -2806,11 +2924,312 @@ msgid ""
2806
  "the WordPress core is upgraded."
2807
  msgstr ""
2808
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2809
  #: tpl/cdn/entry.tpl.php:6 tpl/cdn/settings.tpl.php:21
2810
  msgid "CDN Settings"
2811
  msgstr ""
2812
 
2813
- #: tpl/cdn/entry.tpl.php:14
 
 
 
 
2814
  msgid "LiteSpeed Cache CDN"
2815
  msgstr ""
2816
 
@@ -3043,15 +3462,23 @@ msgstr ""
3043
  msgid "Remove from Blocklist"
3044
  msgstr ""
3045
 
3046
- #: tpl/crawler/blacklist.tpl.php:55
 
 
 
 
 
 
 
 
3047
  msgid "Not blocklisted"
3048
  msgstr ""
3049
 
3050
- #: tpl/crawler/blacklist.tpl.php:56 tpl/crawler/map.tpl.php:69
3051
  msgid "Blocklisted due to not cacheable"
3052
  msgstr ""
3053
 
3054
- #: tpl/crawler/blacklist.tpl.php:57 tpl/crawler/map.tpl.php:70
3055
  #: tpl/crawler/summary.tpl.php:160 tpl/crawler/summary.tpl.php:184
3056
  msgid "Blocklisted"
3057
  msgstr ""
@@ -3102,7 +3529,7 @@ msgstr ""
3102
  msgid "Sitemap Total"
3103
  msgstr ""
3104
 
3105
- #: tpl/crawler/map.tpl.php:44 tpl/dash/dashboard.tpl.php:529
3106
  msgid "Crawler Status"
3107
  msgstr ""
3108
 
@@ -3275,15 +3702,15 @@ msgstr ""
3275
  msgid "Run time for previous crawler"
3276
  msgstr ""
3277
 
3278
- #: tpl/crawler/summary.tpl.php:85 tpl/dash/dashboard.tpl.php:542
3279
  msgid "Current crawler started at"
3280
  msgstr ""
3281
 
3282
- #: tpl/crawler/summary.tpl.php:92 tpl/dash/dashboard.tpl.php:549
3283
  msgid "Last interval"
3284
  msgstr ""
3285
 
3286
- #: tpl/crawler/summary.tpl.php:99 tpl/dash/dashboard.tpl.php:556
3287
  msgid "Ended reason"
3288
  msgstr ""
3289
 
@@ -3375,164 +3802,171 @@ msgstr ""
3375
  msgid "No crawler meta file generated yet"
3376
  msgstr ""
3377
 
3378
- #: tpl/dash/dashboard.tpl.php:42
3379
  msgid "QUIC.cloud Service Usage Statistics"
3380
  msgstr ""
3381
 
3382
- #: tpl/dash/dashboard.tpl.php:45
3383
  msgid "Sync data from Cloud"
3384
  msgstr ""
3385
 
3386
- #: tpl/dash/dashboard.tpl.php:57 tpl/dash/network_dash.tpl.php:29
3387
  msgid "CDN Bandwidth"
3388
  msgstr ""
3389
 
3390
- #: tpl/dash/dashboard.tpl.php:58 tpl/dash/dashboard.tpl.php:497
3391
  msgid "Low Quality Image Placeholder"
3392
  msgstr ""
3393
 
3394
- #: tpl/dash/dashboard.tpl.php:115 tpl/dash/network_dash.tpl.php:78
3395
  msgid "Fast Queue Usage"
3396
  msgstr ""
3397
 
3398
- #: tpl/dash/dashboard.tpl.php:115 tpl/dash/network_dash.tpl.php:78
3399
  msgid "Usage"
3400
  msgstr ""
3401
 
3402
- #: tpl/dash/dashboard.tpl.php:128 tpl/dash/network_dash.tpl.php:90
3403
  msgid "PAYG Balance"
3404
  msgstr ""
3405
 
3406
- #: tpl/dash/dashboard.tpl.php:129 tpl/dash/network_dash.tpl.php:91
3407
  msgid "This Month Usage"
3408
  msgstr ""
3409
 
3410
- #: tpl/dash/dashboard.tpl.php:131 tpl/dash/network_dash.tpl.php:93
3411
  msgid "Pay as You Go Usage Statistics"
3412
  msgstr ""
3413
 
3414
- #: tpl/dash/dashboard.tpl.php:150 tpl/dash/network_dash.tpl.php:100
3415
  msgid "Total Usage"
3416
  msgstr ""
3417
 
3418
- #: tpl/dash/dashboard.tpl.php:151 tpl/dash/network_dash.tpl.php:101
3419
  msgid "Total images optimized in this month"
3420
  msgstr ""
3421
 
3422
- #: tpl/dash/dashboard.tpl.php:160
3423
  msgid "Remaining Daily Quota"
3424
  msgstr ""
3425
 
3426
- #: tpl/dash/dashboard.tpl.php:169
3427
  msgid "Go to QUIC.cloud dashboard"
3428
  msgstr ""
3429
 
3430
- #: tpl/dash/dashboard.tpl.php:181
3431
  msgid "Refresh page load time"
3432
  msgstr ""
3433
 
3434
- #: tpl/dash/dashboard.tpl.php:222 tpl/dash/dashboard.tpl.php:291
3435
- #: tpl/dash/dashboard.tpl.php:456 tpl/dash/dashboard.tpl.php:489
3436
- #: tpl/dash/dashboard.tpl.php:521
3437
  msgid "Last requested"
3438
  msgstr ""
3439
 
3440
- #: tpl/dash/dashboard.tpl.php:227
3441
  msgid "Current closest Cloud server is %s.&#10;Click to redetect."
3442
  msgstr ""
3443
 
3444
- #: tpl/dash/dashboard.tpl.php:227 tpl/img_optm/summary.tpl.php:57
3445
- #: tpl/page_optm/settings_css.tpl.php:91 tpl/page_optm/settings_css.tpl.php:201
3446
  #: tpl/page_optm/settings_media.tpl.php:176
 
3447
  msgid ""
3448
  "Are you sure you want to redetect the closest cloud server for this service?"
3449
  msgstr ""
3450
 
3451
- #: tpl/dash/dashboard.tpl.php:238
3452
  msgid "Refresh page score"
3453
  msgstr ""
3454
 
3455
- #: tpl/dash/dashboard.tpl.php:299 tpl/img_optm/entry.tpl.php:6
3456
  msgid "Image Optimization Summary"
3457
  msgstr ""
3458
 
3459
- #: tpl/dash/dashboard.tpl.php:300 tpl/dash/dashboard.tpl.php:389
3460
- #: tpl/dash/dashboard.tpl.php:432 tpl/dash/dashboard.tpl.php:465
3461
- #: tpl/dash/dashboard.tpl.php:498 tpl/dash/dashboard.tpl.php:530
 
3462
  msgid "More"
3463
  msgstr ""
3464
 
3465
- #: tpl/dash/dashboard.tpl.php:310
3466
  msgid "Image Groups Prepared"
3467
  msgstr ""
3468
 
3469
- #: tpl/dash/dashboard.tpl.php:325
3470
  msgid "Images Requested"
3471
  msgstr ""
3472
 
3473
- #: tpl/dash/dashboard.tpl.php:357 tpl/img_optm/summary.tpl.php:342
3474
  msgid "Last Request"
3475
  msgstr ""
3476
 
3477
- #: tpl/dash/dashboard.tpl.php:360
3478
  msgid "Last Pull"
3479
  msgstr ""
3480
 
3481
- #: tpl/dash/dashboard.tpl.php:388
3482
  msgid "Cache Status"
3483
  msgstr ""
3484
 
3485
- #: tpl/dash/dashboard.tpl.php:394
3486
  msgid "Public Cache"
3487
  msgstr ""
3488
 
3489
- #: tpl/dash/dashboard.tpl.php:395
3490
  msgid "Private Cache"
3491
  msgstr ""
3492
 
3493
- #: tpl/dash/dashboard.tpl.php:417
3494
  msgid "Cache Stats"
3495
  msgstr ""
3496
 
3497
- #: tpl/dash/dashboard.tpl.php:431 tpl/toolbox/purge.tpl.php:70
3498
  msgid "Critical CSS"
3499
  msgstr ""
3500
 
3501
- #: tpl/dash/dashboard.tpl.php:437 tpl/dash/dashboard.tpl.php:470
3502
- #: tpl/dash/dashboard.tpl.php:503 tpl/page_optm/settings_css.tpl.php:82
3503
- #: tpl/page_optm/settings_css.tpl.php:192
3504
  #: tpl/page_optm/settings_media.tpl.php:170
 
3505
  msgid "Last generated"
3506
  msgstr ""
3507
 
3508
- #: tpl/dash/dashboard.tpl.php:440 tpl/dash/dashboard.tpl.php:473
3509
- #: tpl/dash/dashboard.tpl.php:506
3510
  msgid "Time to execute previous request"
3511
  msgstr ""
3512
 
3513
- #: tpl/dash/dashboard.tpl.php:445 tpl/dash/dashboard.tpl.php:478
3514
- #: tpl/dash/dashboard.tpl.php:511
3515
  msgid "Requests in queue"
3516
  msgstr ""
3517
 
3518
- #: tpl/dash/dashboard.tpl.php:448 tpl/dash/dashboard.tpl.php:481
3519
- #: tpl/dash/dashboard.tpl.php:513
3520
  msgid "Force cron"
3521
  msgstr ""
3522
 
3523
- #: tpl/dash/dashboard.tpl.php:464 tpl/toolbox/purge.tpl.php:79
3524
  msgid "Unique CSS"
3525
  msgstr ""
3526
 
3527
- #: tpl/dash/dashboard.tpl.php:534
 
 
 
 
3528
  msgid "Crawler(s)"
3529
  msgstr ""
3530
 
3531
- #: tpl/dash/dashboard.tpl.php:537
3532
  msgid "Currently active crawler"
3533
  msgstr ""
3534
 
3535
- #: tpl/dash/dashboard.tpl.php:563
3536
  msgid "<b>Last crawled:</b> %d item(s)"
3537
  msgstr ""
3538
 
@@ -3722,7 +4156,7 @@ msgstr ""
3722
  msgid "A TTL of 0 indicates do not cache."
3723
  msgstr ""
3724
 
3725
- #: tpl/general/entry.tpl.php:7 tpl/page_optm/entry.tpl.php:12
3726
  msgid "Tuning"
3727
  msgstr ""
3728
 
@@ -3775,15 +4209,12 @@ msgstr ""
3775
  msgid "Visit My Dashboard on QUIC.cloud"
3776
  msgstr ""
3777
 
3778
- #: tpl/general/settings.tpl.php:75 tpl/general/settings.tpl.php:77
3779
- #: tpl/general/settings.tpl.php:106
3780
- msgid "Link to QUIC.cloud"
3781
- msgstr ""
3782
-
3783
  #: tpl/general/settings.tpl.php:82 tpl/general/settings.tpl.php:93
3784
- #: tpl/general/settings.tpl.php:105 tpl/general/settings.tpl.php:172
3785
- #: tpl/general/settings.tpl.php:178 tpl/general/settings.tpl.php:184
3786
- #: tpl/general/settings.tpl.php:190 tpl/general/settings.tpl.php:207
 
 
3787
  msgid "Notice"
3788
  msgstr ""
3789
 
@@ -3841,72 +4272,81 @@ msgstr ""
3841
  msgid "A Domain Key is required for QUIC.cloud online services."
3842
  msgstr ""
3843
 
3844
- #: tpl/general/settings.tpl.php:115
 
 
 
 
 
 
 
 
3845
  msgid "Current Cloud Nodes in Service"
3846
  msgstr ""
3847
 
3848
- #: tpl/general/settings.tpl.php:116
3849
  msgid "Click to clear all nodes for further redetection."
3850
  msgstr ""
3851
 
3852
- #: tpl/general/settings.tpl.php:116
3853
  msgid "Are you sure you want to clear all cloud nodes?"
3854
  msgstr ""
3855
 
3856
- #: tpl/general/settings.tpl.php:128
3857
  msgid "No cloud services currently in use"
3858
  msgstr ""
3859
 
3860
- #: tpl/general/settings.tpl.php:150
3861
  msgid "This option enables maximum optimization for Guest Mode visitors."
3862
  msgstr ""
3863
 
3864
- #: tpl/general/settings.tpl.php:151
3865
  msgid "Please read all warnings before enabling this option."
3866
  msgstr ""
3867
 
3868
- #: tpl/general/settings.tpl.php:165
3869
  msgid "Your %1s quota on %2s will still be in use."
3870
  msgstr ""
3871
 
3872
- #: tpl/general/settings.tpl.php:172
3873
- msgid "This option only works when turning %s on."
 
3874
  msgstr ""
3875
 
3876
- #: tpl/general/settings.tpl.php:178 tpl/general/settings.tpl.php:190
3877
  msgid "You need to turn %s on to get maximum result."
3878
  msgstr ""
3879
 
3880
- #: tpl/general/settings.tpl.php:184
3881
  msgid ""
3882
  "You need to turn %s on and finish all WebP generation to get maximum result."
3883
  msgstr ""
3884
 
3885
- #: tpl/general/settings.tpl.php:205
3886
  msgid ""
3887
  "Enter this site's IP address to allow cloud services directly call IP "
3888
  "instead of domain name. This eliminates the overhead of DNS and CDN lookups."
3889
  msgstr ""
3890
 
3891
- #: tpl/general/settings.tpl.php:206
3892
  msgid "Your server IP"
3893
  msgstr ""
3894
 
3895
- #: tpl/general/settings.tpl.php:206
3896
  msgid "Check my public IP from"
3897
  msgstr ""
3898
 
3899
- #: tpl/general/settings.tpl.php:207
3900
  msgid ""
3901
  "the auto-detected IP may not be accurate if you have an additional outgoing "
3902
  "IP set, or you have multiple IPs configured on your server."
3903
  msgstr ""
3904
 
3905
- #: tpl/general/settings.tpl.php:208
3906
  msgid "Please make sure this IP is the correct one for visiting your site."
3907
  msgstr ""
3908
 
3909
- #: tpl/general/settings.tpl.php:223
3910
  msgid ""
3911
  "Turn this option ON to show latest news automatically, including hotfixes, "
3912
  "new releases, available beta versions, and promotions."
@@ -4040,9 +4480,10 @@ msgstr ""
4040
  msgid "The image compression quality setting of WordPress out of 100."
4041
  msgstr ""
4042
 
4043
- #: tpl/img_optm/summary.tpl.php:57 tpl/page_optm/settings_css.tpl.php:91
4044
- #: tpl/page_optm/settings_css.tpl.php:201
4045
  #: tpl/page_optm/settings_media.tpl.php:176
 
4046
  msgid "Current closest Cloud server is %s.&#10; Click to redetect."
4047
  msgstr ""
4048
 
@@ -4386,7 +4827,7 @@ msgid ""
4386
  "dismissed. (<a %3$s>Learn More</a>)"
4387
  msgstr ""
4388
 
4389
- #: tpl/page_optm/entry.tpl.php:6 tpl/page_optm/settings_css.tpl.php:16
4390
  msgid "CSS Settings"
4391
  msgstr ""
4392
 
@@ -4402,151 +4843,156 @@ msgstr ""
4402
  msgid "Media Settings"
4403
  msgstr ""
4404
 
4405
- #: tpl/page_optm/entry.tpl.php:10 tpl/page_optm/settings_media_exc.tpl.php:7
 
 
 
 
4406
  msgid "Media Excludes"
4407
  msgstr ""
4408
 
4409
- #: tpl/page_optm/entry.tpl.php:11
4410
  msgid "Localization"
4411
  msgstr ""
4412
 
4413
- #: tpl/page_optm/entry.tpl.php:19
4414
  msgid "LiteSpeed Cache Page Optimization"
4415
  msgstr ""
4416
 
4417
- #: tpl/page_optm/entry.tpl.php:31
4418
  msgid ""
4419
  "Please test thoroughly when enabling any option in this list. After changing "
4420
  "Minify/Combine settings, please do a Purge All action."
4421
  msgstr ""
4422
 
4423
- #: tpl/page_optm/settings_css.tpl.php:30
4424
  msgid "Minify CSS files and inline CSS code."
4425
  msgstr ""
4426
 
4427
- #: tpl/page_optm/settings_css.tpl.php:43
4428
  msgid "Combine CSS files and inline CSS code."
4429
  msgstr ""
4430
 
4431
- #: tpl/page_optm/settings_css.tpl.php:44 tpl/page_optm/settings_js.tpl.php:35
4432
  msgid "How to Fix Problems Caused by CSS/JS Optimization."
4433
  msgstr ""
4434
 
4435
- #: tpl/page_optm/settings_css.tpl.php:64
4436
  msgid "Use QUIC.cloud online service to generate unique CSS."
4437
  msgstr ""
4438
 
4439
- #: tpl/page_optm/settings_css.tpl.php:65
4440
  msgid "This will drop the unused CSS on each page from the combined file."
4441
  msgstr ""
4442
 
4443
- #: tpl/page_optm/settings_css.tpl.php:67
4444
  msgid ""
4445
  "Automatic generation of unique CSS is in the background via a cron-based "
4446
  "queue."
4447
  msgstr ""
4448
 
4449
- #: tpl/page_optm/settings_css.tpl.php:68
4450
  msgid "Filter %s available for UCSS per page type generation."
4451
  msgstr ""
4452
 
4453
- #: tpl/page_optm/settings_css.tpl.php:72
4454
  msgid "This option is bypassed because %1$s option is %2$s."
4455
  msgstr ""
4456
 
4457
- #: tpl/page_optm/settings_css.tpl.php:85 tpl/page_optm/settings_css.tpl.php:195
4458
  msgid "Last requested cost"
4459
  msgstr ""
4460
 
4461
- #: tpl/page_optm/settings_css.tpl.php:97 tpl/page_optm/settings_css.tpl.php:207
 
4462
  msgid "URL list in %s queue waiting for cron"
4463
  msgstr ""
4464
 
4465
- #: tpl/page_optm/settings_css.tpl.php:118
4466
- #: tpl/page_optm/settings_css.tpl.php:228
4467
  msgid "Run %s Queue Manually"
4468
  msgstr ""
4469
 
4470
- #: tpl/page_optm/settings_css.tpl.php:134
4471
  msgid ""
4472
  "Inline UCSS to reduce the extra CSS file loading. This option will not be "
4473
  "automatically turned on for %1$s pages. To use it on %1$s pages, please set "
4474
  "it to ON."
4475
  msgstr ""
4476
 
4477
- #: tpl/page_optm/settings_css.tpl.php:136
4478
  msgid "This option will automatically bypass %s option."
4479
  msgstr ""
4480
 
4481
- #: tpl/page_optm/settings_css.tpl.php:150
4482
  msgid ""
4483
  "Include external CSS and inline CSS in combined file when %1$s is also "
4484
  "enabled. This option helps maintain the priorities of CSS, which should "
4485
  "minimize potential errors caused by CSS Combine."
4486
  msgstr ""
4487
 
4488
- #: tpl/page_optm/settings_css.tpl.php:169
4489
  msgid "Optimize CSS delivery."
4490
  msgstr ""
4491
 
4492
- #: tpl/page_optm/settings_css.tpl.php:170
4493
  #: tpl/page_optm/settings_html.tpl.php:129 tpl/page_optm/settings_js.tpl.php:67
4494
  msgid ""
4495
  "This can improve your speed score in services like Pingdom, GTmetrix and "
4496
  "PageSpeed."
4497
  msgstr ""
4498
 
4499
- #: tpl/page_optm/settings_css.tpl.php:171
4500
  msgid ""
4501
  "Use QUIC.cloud online service to generate critical CSS and load remaining "
4502
  "CSS asynchronously."
4503
  msgstr ""
4504
 
4505
- #: tpl/page_optm/settings_css.tpl.php:173
4506
  msgid ""
4507
  "Automatic generation of critical CSS is in the background via a cron-based "
4508
  "queue."
4509
  msgstr ""
4510
 
4511
- #: tpl/page_optm/settings_css.tpl.php:174
4512
  msgid ""
4513
  "When this option is turned %s, it will also load Google Fonts asynchronously."
4514
  msgstr ""
4515
 
4516
- #: tpl/page_optm/settings_css.tpl.php:177
4517
  msgid "Elements with attribute %s in HTML code will be excluded."
4518
  msgstr ""
4519
 
4520
- #: tpl/page_optm/settings_css.tpl.php:182
4521
  msgid "This option is bypassed due to %s option."
4522
  msgstr ""
4523
 
4524
- #: tpl/page_optm/settings_css.tpl.php:243
4525
  msgid ""
4526
  "Disable this option to generate CCSS per Post Type instead of per page. This "
4527
  "can save significant CCSS quota, however it may result in incorrect CSS "
4528
  "styling if your site uses a page builder."
4529
  msgstr ""
4530
 
4531
- #: tpl/page_optm/settings_css.tpl.php:256
4532
  msgid "This will inline the asynchronous CSS library to avoid render blocking."
4533
  msgstr ""
4534
 
4535
- #: tpl/page_optm/settings_css.tpl.php:267
4536
  msgid "Default"
4537
  msgstr ""
4538
 
4539
- #: tpl/page_optm/settings_css.tpl.php:269
4540
  msgid ""
4541
  "Set this to append %1$s to all %2$s rules before caching CSS to specify how "
4542
  "fonts should be displayed while being downloaded."
4543
  msgstr ""
4544
 
4545
- #: tpl/page_optm/settings_css.tpl.php:270
4546
  msgid "%s is recommended."
4547
  msgstr ""
4548
 
4549
- #: tpl/page_optm/settings_css.tpl.php:270
4550
  msgid "Swap"
4551
  msgstr ""
4552
 
@@ -4696,27 +5142,34 @@ msgstr ""
4696
  msgid "Localize external resources."
4697
  msgstr ""
4698
 
4699
- #: tpl/page_optm/settings_localization.tpl.php:116
 
 
 
 
 
4700
  msgid "Resources listed here will be copied and replaced with local URLs."
4701
  msgstr ""
4702
 
4703
- #: tpl/page_optm/settings_localization.tpl.php:117
4704
  msgid "HTTPS sources only."
4705
  msgstr ""
4706
 
4707
- #: tpl/page_optm/settings_localization.tpl.php:121
4708
  msgid ""
4709
  "Comments are supported. Start a line with a %s to turn it into a comment "
4710
  "line."
4711
  msgstr ""
4712
 
4713
- #: tpl/page_optm/settings_localization.tpl.php:123
4714
- msgid "Non-`.js` file extensions will be ignored."
 
4715
  msgstr ""
4716
 
4717
- #: tpl/page_optm/settings_localization.tpl.php:124
4718
- #: tpl/toolbox/beta_test.tpl.php:28
4719
- msgid "Example"
 
4720
  msgstr ""
4721
 
4722
  #: tpl/page_optm/settings_media.tpl.php:27
@@ -4849,8 +5302,8 @@ msgid ""
4849
  "and improve CLS (a Core Web Vitals metric)."
4850
  msgstr ""
4851
 
4852
- #: tpl/page_optm/settings_media.tpl.php:229
4853
- msgid "Note: this option only works when %1$s is %2$s."
4854
  msgstr ""
4855
 
4856
  #: tpl/page_optm/settings_media_exc.tpl.php:21
@@ -4986,54 +5439,75 @@ msgstr ""
4986
  msgid "Selected roles will be excluded from all optimizations."
4987
  msgstr ""
4988
 
4989
- #: tpl/toolbox/beta_test.tpl.php:23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4990
  msgid "Try GitHub Version"
4991
  msgstr ""
4992
 
4993
- #: tpl/toolbox/beta_test.tpl.php:27
4994
  msgid ""
4995
  "Use this section to switch plugin versions. To beta test a GitHub commit, "
4996
  "enter the commit URL in the field below."
4997
  msgstr ""
4998
 
4999
- #: tpl/toolbox/beta_test.tpl.php:32
5000
  msgid "Use latest GitHub Dev commit"
5001
  msgstr ""
5002
 
5003
- #: tpl/toolbox/beta_test.tpl.php:34
5004
  msgid "Use latest GitHub Master commit"
5005
  msgstr ""
5006
 
5007
- #: tpl/toolbox/beta_test.tpl.php:36 tpl/toolbox/beta_test.tpl.php:52
5008
  msgid "Use latest WordPress release version"
5009
  msgstr ""
5010
 
5011
- #: tpl/toolbox/beta_test.tpl.php:36
5012
  msgid "OR"
5013
  msgstr ""
5014
 
5015
- #: tpl/toolbox/beta_test.tpl.php:47
5016
  msgid ""
5017
  "Downgrade not recommended. May cause fatal error due to refactored code."
5018
  msgstr ""
5019
 
5020
- #: tpl/toolbox/beta_test.tpl.php:51
5021
  msgid ""
5022
  "Press the %s button to use the most recent GitHub commit. Master is for "
5023
  "release candidate & Dev is for experimental testing."
5024
  msgstr ""
5025
 
5026
- #: tpl/toolbox/beta_test.tpl.php:51
5027
  msgid "Use latest GitHub Dev/Master commit"
5028
  msgstr ""
5029
 
5030
- #: tpl/toolbox/beta_test.tpl.php:52
5031
  msgid ""
5032
  "Press the %s button to stop beta testing and go back to the current release "
5033
  "from the WordPress Plugin Directory."
5034
  msgstr ""
5035
 
5036
- #: tpl/toolbox/beta_test.tpl.php:57
5037
  msgid ""
5038
  "In order to avoid an upgrade error, you must be using %1$s or later before "
5039
  "you can upgrade to %2$s versions."
@@ -5087,7 +5561,7 @@ msgstr ""
5087
  msgid "Report"
5088
  msgstr ""
5089
 
5090
- #: tpl/toolbox/entry.tpl.php:23 tpl/toolbox/settings-debug.tpl.php:10
5091
  msgid "Debug Settings"
5092
  msgstr ""
5093
 
@@ -5268,7 +5742,7 @@ msgstr ""
5268
  #: tpl/toolbox/purge.tpl.php:116
5269
  msgid ""
5270
  "Purge the cache entries created by this plugin except for Critical CSS & "
5271
- "LQIP caches"
5272
  msgstr ""
5273
 
5274
  #: tpl/toolbox/purge.tpl.php:125
@@ -5406,10 +5880,6 @@ msgstr ""
5406
  msgid "Generated links may be managed under <a %s>Settings</a>."
5407
  msgstr ""
5408
 
5409
- #: tpl/toolbox/report.tpl.php:81
5410
- msgid "Notes"
5411
- msgstr ""
5412
-
5413
  #: tpl/toolbox/report.tpl.php:85
5414
  msgid "Optional"
5415
  msgstr ""
@@ -5429,80 +5899,96 @@ msgid ""
5429
  "the WordPress support forum."
5430
  msgstr ""
5431
 
5432
- #: tpl/toolbox/settings-debug.tpl.php:23
 
 
 
 
 
 
 
 
 
 
 
 
5433
  msgid ""
5434
  "This will disable LSCache and all optimization features for debug purpose."
5435
  msgstr ""
5436
 
5437
- #: tpl/toolbox/settings-debug.tpl.php:34
5438
  msgid "Admin IP Only"
5439
  msgstr ""
5440
 
5441
- #: tpl/toolbox/settings-debug.tpl.php:36
5442
  msgid "Outputs to WordPress debug log."
5443
  msgstr ""
5444
 
5445
- #: tpl/toolbox/settings-debug.tpl.php:37
5446
  msgid ""
5447
  "To prevent filling up the disk, this setting should be OFF when everything "
5448
  "is working."
5449
  msgstr ""
5450
 
5451
- #: tpl/toolbox/settings-debug.tpl.php:38
5452
  msgid ""
5453
  "The Admin IP option will only output log messages on requests from admin IPs."
5454
  msgstr ""
5455
 
5456
- #: tpl/toolbox/settings-debug.tpl.php:39
5457
  msgid "The logs will be output to %s."
5458
  msgstr ""
5459
 
5460
- #: tpl/toolbox/settings-debug.tpl.php:52
5461
  msgid ""
5462
  "Allows listed IPs (one per line) to perform certain actions from their "
5463
  "browsers."
5464
  msgstr ""
5465
 
5466
- #: tpl/toolbox/settings-debug.tpl.php:53
5467
  msgid "Your IP"
5468
  msgstr ""
5469
 
5470
- #: tpl/toolbox/settings-debug.tpl.php:58
5471
  msgid "More information about the available commands can be found here."
5472
  msgstr ""
5473
 
5474
- #: tpl/toolbox/settings-debug.tpl.php:70
5475
  msgid "Basic"
5476
  msgstr ""
5477
 
5478
- #: tpl/toolbox/settings-debug.tpl.php:72
5479
  msgid "Advanced level will log more details."
5480
  msgstr ""
5481
 
5482
- #: tpl/toolbox/settings-debug.tpl.php:83
5483
  msgid "MB"
5484
  msgstr ""
5485
 
5486
- #: tpl/toolbox/settings-debug.tpl.php:85
5487
  msgid "Specify the maximum size of the log file."
5488
  msgstr ""
5489
 
5490
- #: tpl/toolbox/settings-debug.tpl.php:100
5491
  msgid "Log requested cookie values."
5492
  msgstr ""
5493
 
5494
- #: tpl/toolbox/settings-debug.tpl.php:113
5495
  msgid "Shorten query strings in the debug log to improve readability."
5496
  msgstr ""
5497
 
5498
- #: tpl/toolbox/settings-debug.tpl.php:126
5499
  msgid "Only log listed pages."
5500
  msgstr ""
5501
 
5502
- #: tpl/toolbox/settings-debug.tpl.php:140
5503
  msgid "Prevent any debug log of listed pages."
5504
  msgstr ""
5505
 
 
 
 
 
5506
  #. Plugin URI of the plugin/theme
5507
  msgid ""
5508
  "https://www.litespeedtech.com/products/cache-plugins/wordpress-acceleration"
2
  # This file is distributed under the same license as the LiteSpeed Cache package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: LiteSpeed Cache 5.0\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/litespeed-cache\n"
7
+ "POT-Creation-Date: 2022-07-19 15:06:33+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
36
  msgid "Upgraded successfully."
37
  msgstr ""
38
 
39
+ #: src/admin-display.cls.php:119 tpl/dash/entry.tpl.php:6
40
  msgid "Dashboard"
41
  msgstr ""
42
 
43
+ #: src/admin-display.cls.php:121
44
  msgid "General"
45
  msgstr ""
46
 
47
+ #: src/admin-display.cls.php:123 tpl/cache/entry.tpl.php:6
48
  #: tpl/cache/entry_network.tpl.php:6
49
  msgid "Cache"
50
  msgstr ""
51
 
52
+ #: src/admin-display.cls.php:125 tpl/cdn/settings.tpl.php:194
53
  msgid "CDN"
54
  msgstr ""
55
 
56
+ #: src/admin-display.cls.php:127 src/gui.cls.php:639
57
+ #: tpl/dash/dashboard.tpl.php:57 tpl/dash/network_dash.tpl.php:27
58
  msgid "Image Optimization"
59
  msgstr ""
60
 
61
+ #: src/admin-display.cls.php:129 tpl/dash/dashboard.tpl.php:58
62
  msgid "Page Optimization"
63
  msgstr ""
64
 
65
+ #: src/admin-display.cls.php:131
66
  msgid "Database"
67
  msgstr ""
68
 
69
+ #: src/admin-display.cls.php:133 src/lang.cls.php:245
70
  msgid "Crawler"
71
  msgstr ""
72
 
73
+ #: src/admin-display.cls.php:135
74
  msgid "Toolbox"
75
  msgstr ""
76
 
77
+ #: src/admin-display.cls.php:209
78
  msgid "Cookie Name"
79
  msgstr ""
80
 
81
+ #: src/admin-display.cls.php:210 tpl/crawler/settings-simulation.tpl.php:51
82
  msgid "Cookie Values"
83
  msgstr ""
84
 
85
+ #: src/admin-display.cls.php:212
86
  msgid "Remove cookie simulation"
87
  msgstr ""
88
 
89
+ #: src/admin-display.cls.php:213
90
  msgid "Add new cookie to simulate"
91
  msgstr ""
92
 
93
+ #: src/admin-display.cls.php:232
94
  msgid "CDN URL to be used. For example, %s"
95
  msgstr ""
96
 
97
+ #: src/admin-display.cls.php:234
98
  msgid "Remove CDN URL"
99
  msgstr ""
100
 
101
+ #: src/admin-display.cls.php:235
102
  msgid "Add new CDN URL"
103
  msgstr ""
104
 
105
+ #: src/admin-display.cls.php:236 src/admin-display.cls.php:888
106
+ #: src/admin-display.cls.php:917 src/admin-display.cls.php:968
107
  #: tpl/cache/settings-cache.tpl.php:19
108
  #: tpl/cache/settings_inc.cache_mobile.tpl.php:71 tpl/cdn/settings.tpl.php:49
109
+ #: tpl/page_optm/settings_css.tpl.php:175
110
  #: tpl/page_optm/settings_media.tpl.php:159
111
+ #: tpl/toolbox/settings-debug.tpl.php:46
 
112
  msgid "ON"
113
  msgstr ""
114
 
115
+ #: src/admin-display.cls.php:237 src/admin-display.cls.php:889
116
+ #: src/admin-display.cls.php:916 src/admin-display.cls.php:968
117
  #: tpl/cache/settings-cache.tpl.php:19
118
  #: tpl/cache/settings_inc.object.tpl.php:210 tpl/cdn/settings.tpl.php:54
119
+ #: tpl/page_optm/settings_css.tpl.php:73 tpl/page_optm/settings_js.tpl.php:63
120
  #: tpl/page_optm/settings_media.tpl.php:162
121
+ #: tpl/toolbox/settings-debug.tpl.php:46
122
  msgid "OFF"
123
  msgstr ""
124
 
125
+ #: src/admin-display.cls.php:285 src/gui.cls.php:630
126
  msgid "Settings"
127
  msgstr ""
128
 
129
+ #: src/admin-display.cls.php:501
130
  msgid "Dismiss"
131
  msgstr ""
132
 
133
+ #: src/admin-display.cls.php:757 src/admin-display.cls.php:762
134
  msgid "Save Changes"
135
  msgstr ""
136
 
137
+ #: src/admin-display.cls.php:980
138
  msgid "This setting is overwritten by the PHP constant %s"
139
  msgstr ""
140
 
141
+ #: src/admin-display.cls.php:983
142
  msgid "This setting is overwritten by the primary site setting"
143
  msgstr ""
144
 
145
+ #: src/admin-display.cls.php:986
146
  msgid "This setting is overwritten by the Network setting"
147
  msgstr ""
148
 
149
+ #: src/admin-display.cls.php:990
150
  msgid "currently set to %s"
151
  msgstr ""
152
 
153
+ #: src/admin-display.cls.php:1000 tpl/cache/settings_inc.object.tpl.php:103
154
  #: tpl/crawler/settings-general.tpl.php:60
155
  #: tpl/crawler/settings-general.tpl.php:74
156
  #: tpl/crawler/settings-general.tpl.php:89 tpl/esi_widget_edit.php:70
157
  msgid "seconds"
158
  msgstr ""
159
 
160
+ #: src/admin-display.cls.php:1031 src/admin-display.cls.php:1036
161
  #: tpl/cdn/settings.tpl.php:99
162
  msgid "Default value"
163
  msgstr ""
164
 
165
+ #: src/admin-display.cls.php:1060
166
  msgid "Invalid rewrite rule"
167
  msgstr ""
168
 
169
+ #: src/admin-display.cls.php:1077
170
  msgid "Path must end with %s"
171
  msgstr ""
172
 
173
+ #: src/admin-display.cls.php:1095
174
  msgid "Minimum value"
175
  msgstr ""
176
 
177
+ #: src/admin-display.cls.php:1098
178
  msgid "Maximum value"
179
  msgstr ""
180
 
181
+ #: src/admin-display.cls.php:1110
182
  msgid "Zero, or"
183
  msgstr ""
184
 
185
+ #: src/admin-display.cls.php:1117
186
  msgid "Larger than"
187
  msgstr ""
188
 
189
+ #: src/admin-display.cls.php:1120
190
  msgid "Smaller than"
191
  msgstr ""
192
 
193
+ #: src/admin-display.cls.php:1123
194
  msgid "Value range"
195
  msgstr ""
196
 
197
+ #: src/admin-display.cls.php:1148
198
  msgid "Invalid IP"
199
  msgstr ""
200
 
201
+ #: src/admin-display.cls.php:1168 tpl/cache/settings-esi.tpl.php:95
202
+ #: tpl/page_optm/settings_css.tpl.php:177
203
  #: tpl/page_optm/settings_html.tpl.php:85
204
+ #: tpl/page_optm/settings_media.tpl.php:235
205
  #: tpl/page_optm/settings_media_exc.tpl.php:26
206
  #: tpl/page_optm/settings_tuning.tpl.php:35
207
  #: tpl/page_optm/settings_tuning.tpl.php:56
212
  msgid "API"
213
  msgstr ""
214
 
215
+ #: src/admin-display.cls.php:1169
216
  msgid "Server variable(s) %s available to override this setting."
217
  msgstr ""
218
 
219
+ #: src/admin-display.cls.php:1181
220
  msgid "The URLs will be compared to the REQUEST_URI server variable."
221
  msgstr ""
222
 
223
+ #: src/admin-display.cls.php:1182
224
  msgid "For example, for %s, %s can be used here."
225
  msgstr ""
226
 
227
+ #: src/admin-display.cls.php:1184
228
  msgid "To match the beginning, add %s to the beginning of the item."
229
  msgstr ""
230
 
231
+ #: src/admin-display.cls.php:1185
232
  msgid "To do an exact match, add %s to the end of the URL."
233
  msgstr ""
234
 
235
+ #: src/admin-display.cls.php:1186 src/doc.cls.php:74
236
  msgid "One per line."
237
  msgstr ""
238
 
239
+ #: src/admin-display.cls.php:1200
240
  msgid "%s groups"
241
  msgstr ""
242
 
243
+ #: src/admin-display.cls.php:1203
244
  msgid "%s images"
245
  msgstr ""
246
 
247
+ #: src/admin-display.cls.php:1213
248
  msgid "%s group"
249
  msgstr ""
250
 
251
+ #: src/admin-display.cls.php:1216
252
  msgid "%s image"
253
  msgstr ""
254
 
255
+ #: src/admin-settings.cls.php:245 src/admin-settings.cls.php:279
256
  msgid "Options saved."
257
  msgstr ""
258
 
280
  msgid "Communicated with Cloudflare successfully."
281
  msgstr ""
282
 
283
+ #: src/cdn-setup.cls.php:58
284
+ msgid "Received invalid message from the cloud server. Please submit a ticket."
285
+ msgstr ""
286
+
287
+ #: src/cdn-setup.cls.php:63
288
+ msgid "There was an error during CDN setup: "
289
+ msgstr ""
290
+
291
+ #: src/cdn-setup.cls.php:112
292
+ msgid ""
293
+ "Congratulations, QUIC.cloud successfully set this domain up for the CDN. "
294
+ "Please update your nameservers to:"
295
+ msgstr ""
296
+
297
+ #: src/cdn-setup.cls.php:132
298
+ msgid "CDN Setup is running."
299
+ msgstr ""
300
+
301
+ #: src/cdn-setup.cls.php:164
302
+ msgid "Notice: CDN Setup only reset locally."
303
+ msgstr ""
304
+
305
+ #: src/cdn-setup.cls.php:167
306
+ msgid "Cannot delete, site is not linked."
307
+ msgstr ""
308
+
309
+ #: src/cdn-setup.cls.php:200
310
+ msgid ""
311
+ "CDN Setup Token and DNS zone deleted. Note: if my.quic.cloud account "
312
+ "deletion is desired, that the account still exists and must be deleted "
313
+ "separately."
314
+ msgstr ""
315
+
316
+ #: src/cdn-setup.cls.php:202
317
+ msgid ""
318
+ "CDN Setup Token reset. Note: if my.quic.cloud account deletion is desired, "
319
+ "that the account still exists and must be deleted separately."
320
+ msgstr ""
321
+
322
+ #: src/cdn-setup.cls.php:321 src/cloud.cls.php:766 src/cloud.cls.php:774
323
+ #: src/cloud.cls.php:1158
324
+ msgid "Message from QUIC.cloud server"
325
+ msgstr ""
326
+
327
+ #: src/cloud.cls.php:372 src/cloud.cls.php:385 src/cloud.cls.php:430
328
+ #: src/cloud.cls.php:455 src/cloud.cls.php:593 src/cloud.cls.php:1127
329
  msgid "Cloud Error"
330
  msgstr ""
331
 
332
+ #: src/cloud.cls.php:430
333
  msgid "No available Cloud Node."
334
  msgstr ""
335
 
336
+ #: src/cloud.cls.php:455
337
  msgid "No available Cloud Node after checked server load."
338
  msgstr ""
339
 
340
+ #: src/cloud.cls.php:593
341
  msgid "Please try after %1$s for service %2$s."
342
  msgstr ""
343
 
344
+ #: src/cloud.cls.php:680 src/cloud.cls.php:701
345
  msgid "Failed to request via WordPress"
346
  msgstr ""
347
 
348
+ #: src/cloud.cls.php:721
349
  msgid "Redetected node"
350
  msgstr ""
351
 
352
+ #: src/cloud.cls.php:729
353
  msgid ""
354
  "We are working hard to improve your online service experience. The service "
355
  "will be unavailable while we work. We apologize for any inconvenience."
356
  msgstr ""
357
 
358
+ #: src/cloud.cls.php:782
 
 
 
 
359
  msgid "Good news from QUIC.cloud server"
360
  msgstr ""
361
 
362
+ #: src/cloud.cls.php:791
363
  msgid "%1$s plugin version %2$s required for this action."
364
  msgstr ""
365
 
366
+ #: src/cloud.cls.php:844 src/cloud.cls.php:1147
367
  msgid "Failed to communicate with QUIC.cloud server"
368
  msgstr ""
369
 
370
+ #: src/cloud.cls.php:886
371
  msgid ""
372
  "Site not recognized. Domain Key has been automatically removed. Please "
373
  "request a new one."
374
  msgstr ""
375
 
376
+ #: src/cloud.cls.php:887 src/error.cls.php:48
377
  msgid "Click here to set."
378
  msgstr ""
379
 
380
+ #: src/cloud.cls.php:952
381
+ msgid "Cannot request REST API, no token saved."
382
+ msgstr ""
383
+
384
+ #: src/cloud.cls.php:978
385
+ msgid "Cloud REST Error"
386
+ msgstr ""
387
+
388
+ #: src/cloud.cls.php:994
389
+ msgid "Cloud REST API returned error: "
390
+ msgstr ""
391
+
392
+ #: src/cloud.cls.php:1166
393
  msgid ""
394
  "Applied for Domain Key successfully. Please wait for result. Domain Key will "
395
  "be automatically sent to your WordPress."
396
  msgstr ""
397
 
398
+ #: src/cloud.cls.php:1220
399
  msgid ""
400
  "Congratulations, your Domain Key has been approved! The setting has been "
401
  "updated accordingly."
402
  msgstr ""
403
 
404
+ #: src/cloud.cls.php:1304
405
  msgid "Domain Key hash mismatch"
406
  msgstr ""
407
 
408
+ #: src/cloud.cls.php:1426
409
  msgid "Sync credit allowance with Cloud Server successfully."
410
  msgstr ""
411
 
412
+ #: src/conf.cls.php:707
413
  msgid "Changed setting successfully."
414
  msgstr ""
415
 
433
  msgid "Sitemap created successfully: %d items"
434
  msgstr ""
435
 
436
+ #: src/crawler.cls.php:108
437
  msgid "Crawler disabled list is cleared! All crawlers are set to active! "
438
  msgstr ""
439
 
440
+ #: src/crawler.cls.php:854
441
  msgid "Guest"
442
  msgstr ""
443
 
444
+ #: src/crawler.cls.php:1005
445
  msgid "Manually added to blocklist"
446
  msgstr ""
447
 
448
+ #: src/crawler.cls.php:1008
449
  msgid "Previously existed in blocklist"
450
  msgstr ""
451
 
452
+ #: src/css.cls.php:62 src/root.cls.php:185
453
  msgid "Queue cleared successfully."
454
  msgstr ""
455
 
456
+ #: src/data.cls.php:221
 
 
 
 
 
 
 
 
457
  msgid ""
458
  "The database has been upgrading in the background since %s. This message "
459
  "will disappear once upgrade is complete."
467
  "errors."
468
  msgstr ""
469
 
470
+ #: src/data.upgrade.func.php:101 src/lang.cls.php:147
471
  msgid "JS Combine"
472
  msgstr ""
473
 
544
  msgstr ""
545
 
546
  #: src/doc.cls.php:53 src/doc.cls.php:105 tpl/cdn/manage.tpl.php:66
547
+ #: tpl/dash/dashboard.tpl.php:51 tpl/img_optm/summary.tpl.php:62
548
  #: tpl/img_optm/summary.tpl.php:102 tpl/inc/check_cache_disabled.php:42
549
  msgid "Learn More"
550
  msgstr ""
621
  msgstr ""
622
 
623
  #: src/error.cls.php:84
624
+ msgid "The site is not a valid alias on QUIC.cloud."
625
  msgstr ""
626
 
627
  #: src/error.cls.php:88
628
+ msgid "The site is not registered on QUIC.cloud."
629
+ msgstr ""
630
+
631
+ #: src/error.cls.php:92
632
  msgid ""
633
  "The domain key is not correct. Please try to sync your domain key again."
634
  msgstr ""
635
 
636
+ #: src/error.cls.php:96
637
  msgid "The current server is under heavy load."
638
  msgstr ""
639
 
640
+ #: src/error.cls.php:100
641
  msgid "Online node needs to be redetected."
642
  msgstr ""
643
 
644
+ #: src/error.cls.php:104
645
  msgid "Credits are not enough to proceed the current request."
646
  msgstr ""
647
 
648
+ #: src/error.cls.php:108 src/error.cls.php:132
649
  msgid "%s file not writable."
650
  msgstr ""
651
 
652
+ #: src/error.cls.php:116
653
  msgid "Could not find %1$s in %2$s."
654
  msgstr ""
655
 
656
+ #: src/error.cls.php:120
657
  msgid "Invalid login cookie. Please check the %s file."
658
  msgstr ""
659
 
660
+ #: src/error.cls.php:124
661
  msgid "Failed to back up %s file, aborted changes."
662
  msgstr ""
663
 
664
+ #: src/error.cls.php:128
665
  msgid "%s file not readable."
666
  msgstr ""
667
 
668
+ #: src/error.cls.php:136
669
  msgid "Failed to get %s file contents."
670
  msgstr ""
671
 
672
+ #: src/error.cls.php:140
673
  msgid "Failed to create table %s! SQL: %s."
674
  msgstr ""
675
 
676
+ #: src/error.cls.php:144
677
  msgid "Crawler disabled by the server admin."
678
  msgstr ""
679
 
680
+ #: src/error.cls.php:149
681
  msgid "Previous request too recent. Please try again later."
682
  msgstr ""
683
 
684
+ #: src/error.cls.php:153
685
  msgid "Previous request too recent. Please try again after %s."
686
  msgstr ""
687
 
688
+ #: src/error.cls.php:157
689
  msgid "Your application is waiting for approval."
690
  msgstr ""
691
 
692
+ #: src/error.cls.php:161
693
  msgid "The callback validation to your domain failed due to hash mismatch."
694
  msgstr ""
695
 
696
+ #: src/error.cls.php:165
697
  msgid ""
698
  "The callback validation to your domain failed. Please make sure there is no "
699
  "firewall blocking our servers."
700
  msgstr ""
701
 
702
+ #: src/error.cls.php:169
703
  msgid ""
704
  "The callback validation to your domain failed. Please make sure there is no "
705
  "firewall blocking our servers. Response code: "
706
  msgstr ""
707
 
708
+ #: src/error.cls.php:173
709
  msgid ""
710
  "Your domain has been forbidden from using our services due to a previous "
711
  "policy violation."
712
  msgstr ""
713
 
714
+ #: src/error.cls.php:177
715
+ msgid ""
716
+ "You cannot remove this DNS zone, because it is still in use. Please update "
717
+ "the domain's nameservers, then try to delete this zone again, otherwise your "
718
+ "site will become inaccessible."
719
+ msgstr ""
720
+
721
+ #: src/error.cls.php:181
722
  msgid "Unknown error"
723
  msgstr ""
724
 
758
  msgid "Private Cache Hits"
759
  msgstr ""
760
 
761
+ #: src/gui.cls.php:104
762
+ msgid "%1$s %2$s files left in queue"
763
+ msgstr ""
764
+
765
+ #: src/gui.cls.php:105
766
+ msgid "Cancel"
767
+ msgstr ""
768
+
769
+ #: src/gui.cls.php:414 src/gui.cls.php:429
770
  msgid "Purge this page"
771
  msgstr ""
772
 
773
+ #: src/gui.cls.php:438
774
  msgid "Mark this page as "
775
  msgstr ""
776
 
777
+ #: src/gui.cls.php:450
778
  msgid "Forced cacheable"
779
  msgstr ""
780
 
781
+ #: src/gui.cls.php:461
782
  msgid "Non cacheable"
783
  msgstr ""
784
 
785
+ #: src/gui.cls.php:472
786
  msgid "Private cache"
787
  msgstr ""
788
 
789
+ #: src/gui.cls.php:483
790
  msgid "No optimization"
791
  msgstr ""
792
 
793
+ #: src/gui.cls.php:491
794
  msgid "More settings"
795
  msgstr ""
796
 
797
+ #: src/gui.cls.php:498 src/gui.cls.php:506 src/gui.cls.php:514
798
+ #: src/gui.cls.php:523 src/gui.cls.php:533 src/gui.cls.php:543
799
+ #: src/gui.cls.php:553 src/gui.cls.php:562 src/gui.cls.php:572
800
+ #: src/gui.cls.php:582 src/gui.cls.php:648 src/gui.cls.php:656
801
+ #: src/gui.cls.php:664 src/gui.cls.php:673 src/gui.cls.php:683
802
+ #: src/gui.cls.php:693 src/gui.cls.php:703 src/gui.cls.php:713
803
+ #: src/gui.cls.php:722 src/gui.cls.php:732 src/gui.cls.php:742
804
  #: tpl/page_optm/settings_media.tpl.php:125 tpl/toolbox/purge.tpl.php:37
805
  #: tpl/toolbox/purge.tpl.php:43 tpl/toolbox/purge.tpl.php:52
806
  #: tpl/toolbox/purge.tpl.php:61 tpl/toolbox/purge.tpl.php:70
810
  msgid "Purge All"
811
  msgstr ""
812
 
813
+ #: src/gui.cls.php:506 src/gui.cls.php:606 src/gui.cls.php:656
814
  msgid "LSCache"
815
  msgstr ""
816
 
817
+ #: src/gui.cls.php:514 src/gui.cls.php:664 tpl/toolbox/purge.tpl.php:43
818
  msgid "CSS/JS Cache"
819
  msgstr ""
820
 
821
+ #: src/gui.cls.php:523 src/gui.cls.php:683 src/lang.cls.php:114
822
+ #: tpl/dash/dashboard.tpl.php:397 tpl/toolbox/purge.tpl.php:52
823
  msgid "Object Cache"
824
  msgstr ""
825
 
826
+ #: src/gui.cls.php:533 src/gui.cls.php:693 tpl/toolbox/purge.tpl.php:61
827
  msgid "Opcode Cache"
828
  msgstr ""
829
 
830
+ #: src/gui.cls.php:562 src/gui.cls.php:722 tpl/toolbox/purge.tpl.php:88
831
  msgid "Localized Resources"
832
  msgstr ""
833
 
834
+ #: src/gui.cls.php:572 src/gui.cls.php:732
835
  #: tpl/page_optm/settings_media.tpl.php:125 tpl/toolbox/purge.tpl.php:97
836
  msgid "LQIP Cache"
837
  msgstr ""
838
 
839
+ #: src/gui.cls.php:582 src/gui.cls.php:742 src/lang.cls.php:176
840
  #: tpl/toolbox/purge.tpl.php:106
841
  msgid "Gravatar Cache"
842
  msgstr ""
843
 
844
+ #: src/gui.cls.php:606
845
  msgid "LiteSpeed Cache Purge All"
846
  msgstr ""
847
 
848
+ #: src/gui.cls.php:622 tpl/cdn/entry.tpl.php:8 tpl/cdn/settings.tpl.php:194
849
  #: tpl/db_optm/entry.tpl.php:6
850
  msgid "Manage"
851
  msgstr ""
852
 
853
+ #: src/gui.cls.php:673 tpl/cdn/manage.tpl.php:17
854
  msgid "Cloudflare"
855
  msgstr ""
856
 
857
+ #: src/gui.cls.php:761 tpl/img_optm/summary.tpl.php:175
858
  msgid "Remove all previous unfinished image optimization requests."
859
  msgstr ""
860
 
861
+ #: src/gui.cls.php:762 tpl/img_optm/summary.tpl.php:177
862
  msgid "Clean Up Unfinished Data"
863
  msgstr ""
864
 
865
+ #: src/gui.cls.php:780
866
  msgid "Install %s"
867
  msgstr ""
868
 
869
+ #: src/gui.cls.php:781
870
  msgid "Install Now"
871
  msgstr ""
872
 
873
+ #: src/gui.cls.php:800
874
  msgid ""
875
  "<a href=\"%1$s\" %2$s>View version %3$s details</a> or <a href=\"%4$s\" %5$s "
876
  "target=\"_blank\">update now</a>."
877
  msgstr ""
878
 
879
+ #: src/gui.cls.php:803
880
  msgid "View %1$s version %2$s details"
881
  msgstr ""
882
 
883
+ #: src/gui.cls.php:808
884
  msgid "Update %s now"
885
  msgstr ""
886
 
888
  msgid "Mobile Agent Rules"
889
  msgstr ""
890
 
891
+ #: src/htaccess.cls.php:786
892
  msgid ""
893
  "<p>Please add/replace the following codes into the beginning of %1$s:</p> "
894
  "%2$s"
1010
  msgid "Images not requested"
1011
  msgstr ""
1012
 
1013
+ #: src/lang.cls.php:24 tpl/dash/dashboard.tpl.php:338
1014
  msgid "Images requested"
1015
  msgstr ""
1016
 
1017
+ #: src/lang.cls.php:25 tpl/dash/dashboard.tpl.php:348
1018
  msgid "Images notified to pull"
1019
  msgstr ""
1020
 
1050
  msgid "Images with wrong meta"
1051
  msgstr ""
1052
 
1053
+ #: src/lang.cls.php:51
1054
+ msgid ""
1055
+ "Unable to automatically add %1$s as a Domain Alias for main %2$s domain, due "
1056
+ "to potential CDN conflict."
1057
  msgstr ""
1058
 
1059
  #: src/lang.cls.php:54
1060
+ msgid ""
1061
+ "Unable to automatically add %1$s as a Domain Alias for main %2$s domain."
1062
  msgstr ""
1063
 
1064
  #: src/lang.cls.php:55
1065
+ msgid "Alias is in use by another QUIC.cloud account."
1066
+ msgstr ""
1067
+
1068
+ #: src/lang.cls.php:85
1069
+ msgid "Server IP"
1070
+ msgstr ""
1071
+
1072
+ #: src/lang.cls.php:86
1073
+ msgid "Domain Key"
1074
+ msgstr ""
1075
+
1076
+ #: src/lang.cls.php:87
1077
  msgid "Guest Mode User Agents"
1078
  msgstr ""
1079
 
1080
+ #: src/lang.cls.php:88
1081
  msgid "Guest Mode IPs"
1082
  msgstr ""
1083
 
1084
+ #: src/lang.cls.php:90
1085
  msgid "Enable Cache"
1086
  msgstr ""
1087
 
1088
+ #: src/lang.cls.php:91 tpl/dash/dashboard.tpl.php:398
1089
  msgid "Browser Cache"
1090
  msgstr ""
1091
 
1092
+ #: src/lang.cls.php:92
1093
  msgid "Default Public Cache TTL"
1094
  msgstr ""
1095
 
1096
+ #: src/lang.cls.php:93
1097
  msgid "Default Private Cache TTL"
1098
  msgstr ""
1099
 
1100
+ #: src/lang.cls.php:94
1101
  msgid "Default Front Page TTL"
1102
  msgstr ""
1103
 
1104
+ #: src/lang.cls.php:95
1105
  msgid "Default Feed TTL"
1106
  msgstr ""
1107
 
1108
+ #: src/lang.cls.php:96
1109
  msgid "Default REST TTL"
1110
  msgstr ""
1111
 
1112
+ #: src/lang.cls.php:97
1113
  msgid "Default HTTP Status Code Page TTL"
1114
  msgstr ""
1115
 
1116
+ #: src/lang.cls.php:98
1117
  msgid "Browser Cache TTL"
1118
  msgstr ""
1119
 
1120
+ #: src/lang.cls.php:99
1121
  msgid "Automatically Upgrade"
1122
  msgstr ""
1123
 
1124
+ #: src/lang.cls.php:100
1125
  msgid "Guest Mode"
1126
  msgstr ""
1127
 
1128
+ #: src/lang.cls.php:101
1129
  msgid "Guest Optimization"
1130
  msgstr ""
1131
 
1132
+ #: src/lang.cls.php:102
1133
  msgid "Notifications"
1134
  msgstr ""
1135
 
1136
+ #: src/lang.cls.php:103
1137
  msgid "Cache Logged-in Users"
1138
  msgstr ""
1139
 
1140
+ #: src/lang.cls.php:104
1141
  msgid "Cache Commenters"
1142
  msgstr ""
1143
 
1144
+ #: src/lang.cls.php:105
1145
  msgid "Cache REST API"
1146
  msgstr ""
1147
 
1148
+ #: src/lang.cls.php:106
1149
  msgid "Cache Login Page"
1150
  msgstr ""
1151
 
1152
+ #: src/lang.cls.php:107
1153
  msgid "Cache favicon.ico"
1154
  msgstr ""
1155
 
1156
+ #: src/lang.cls.php:108
1157
  msgid "Cache PHP Resources"
1158
  msgstr ""
1159
 
1160
+ #: src/lang.cls.php:109 tpl/cache/settings_inc.cache_mobile.tpl.php:71
1161
  msgid "Cache Mobile"
1162
  msgstr ""
1163
 
1164
+ #: src/lang.cls.php:110 tpl/cache/settings_inc.cache_mobile.tpl.php:71
1165
  msgid "List of Mobile User Agents"
1166
  msgstr ""
1167
 
1168
+ #: src/lang.cls.php:111
1169
  msgid "Private Cached URIs"
1170
  msgstr ""
1171
 
1172
+ #: src/lang.cls.php:112
1173
  msgid "Drop Query String"
1174
  msgstr ""
1175
 
1176
+ #: src/lang.cls.php:115
1177
  msgid "Method"
1178
  msgstr ""
1179
 
1180
+ #: src/lang.cls.php:116
1181
  msgid "Host"
1182
  msgstr ""
1183
 
1184
+ #: src/lang.cls.php:117
1185
  msgid "Port"
1186
  msgstr ""
1187
 
1188
+ #: src/lang.cls.php:118
1189
  msgid "Default Object Lifetime"
1190
  msgstr ""
1191
 
1192
+ #: src/lang.cls.php:119
1193
  msgid "Username"
1194
  msgstr ""
1195
 
1196
+ #: src/lang.cls.php:120
1197
  msgid "Password"
1198
  msgstr ""
1199
 
1200
+ #: src/lang.cls.php:121
1201
  msgid "Redis Database ID"
1202
  msgstr ""
1203
 
1204
+ #: src/lang.cls.php:122
1205
  msgid "Global Groups"
1206
  msgstr ""
1207
 
1208
+ #: src/lang.cls.php:123
1209
  msgid "Do Not Cache Groups"
1210
  msgstr ""
1211
 
1212
+ #: src/lang.cls.php:124
1213
  msgid "Persistent Connection"
1214
  msgstr ""
1215
 
1216
+ #: src/lang.cls.php:125
1217
  msgid "Cache WP-Admin"
1218
  msgstr ""
1219
 
1220
+ #: src/lang.cls.php:126
1221
  msgid "Store Transients"
1222
  msgstr ""
1223
 
1224
+ #: src/lang.cls.php:128
1225
  msgid "Purge All On Upgrade"
1226
  msgstr ""
1227
 
1228
+ #: src/lang.cls.php:129
1229
  msgid "Serve Stale"
1230
  msgstr ""
1231
 
1232
+ #: src/lang.cls.php:130 tpl/cache/settings-purge.tpl.php:130
1233
  msgid "Scheduled Purge URLs"
1234
  msgstr ""
1235
 
1236
+ #: src/lang.cls.php:131 tpl/cache/settings-purge.tpl.php:105
1237
  msgid "Scheduled Purge Time"
1238
  msgstr ""
1239
 
1240
+ #: src/lang.cls.php:132
1241
  msgid "Force Cache URIs"
1242
  msgstr ""
1243
 
1244
+ #: src/lang.cls.php:133
1245
  msgid "Force Public Cache URIs"
1246
  msgstr ""
1247
 
1248
+ #: src/lang.cls.php:134
1249
  msgid "Do Not Cache URIs"
1250
  msgstr ""
1251
 
1252
+ #: src/lang.cls.php:135
1253
  msgid "Do Not Cache Query Strings"
1254
  msgstr ""
1255
 
1256
+ #: src/lang.cls.php:136
1257
  msgid "Do Not Cache Categories"
1258
  msgstr ""
1259
 
1260
+ #: src/lang.cls.php:137
1261
  msgid "Do Not Cache Tags"
1262
  msgstr ""
1263
 
1264
+ #: src/lang.cls.php:138
1265
  msgid "Do Not Cache Roles"
1266
  msgstr ""
1267
 
1268
+ #: src/lang.cls.php:139
1269
  msgid "CSS Minify"
1270
  msgstr ""
1271
 
1272
+ #: src/lang.cls.php:140
1273
  msgid "CSS Combine"
1274
  msgstr ""
1275
 
1276
+ #: src/lang.cls.php:141
1277
  msgid "CSS Combine External and Inline"
1278
  msgstr ""
1279
 
1280
+ #: src/lang.cls.php:142
1281
  msgid "Generate UCSS"
1282
  msgstr ""
1283
 
1284
+ #: src/lang.cls.php:143
1285
  msgid "UCSS Inline"
1286
  msgstr ""
1287
 
1288
+ #: src/lang.cls.php:144
1289
  msgid "UCSS Allowlist"
1290
  msgstr ""
1291
 
1292
+ #: src/lang.cls.php:145
1293
  msgid "UCSS URI Excludes"
1294
  msgstr ""
1295
 
1296
+ #: src/lang.cls.php:146
1297
  msgid "JS Minify"
1298
  msgstr ""
1299
 
1300
+ #: src/lang.cls.php:148
1301
  msgid "JS Combine External and Inline"
1302
  msgstr ""
1303
 
1304
+ #: src/lang.cls.php:149
1305
  msgid "HTML Minify"
1306
  msgstr ""
1307
 
1308
+ #: src/lang.cls.php:150
1309
  msgid "HTML Lazy Load Selectors"
1310
  msgstr ""
1311
 
1312
+ #: src/lang.cls.php:151 tpl/page_optm/settings_tuning.tpl.php:148
1313
  msgid "Load CSS Asynchronously"
1314
  msgstr ""
1315
 
1316
+ #: src/lang.cls.php:152
1317
  msgid "CCSS Per URL"
1318
  msgstr ""
1319
 
1320
+ #: src/lang.cls.php:153
1321
  msgid "Inline CSS Async Lib"
1322
  msgstr ""
1323
 
1324
+ #: src/lang.cls.php:154
1325
  msgid "Font Display Optimization"
1326
  msgstr ""
1327
 
1328
+ #: src/lang.cls.php:155
1329
  msgid "Load JS Deferred"
1330
  msgstr ""
1331
 
1332
+ #: src/lang.cls.php:156
1333
  msgid "Localize Resources"
1334
  msgstr ""
1335
 
1336
+ #: src/lang.cls.php:157
1337
  msgid "Localization Files"
1338
  msgstr ""
1339
 
1340
+ #: src/lang.cls.php:158
1341
  msgid "DNS Prefetch"
1342
  msgstr ""
1343
 
1344
+ #: src/lang.cls.php:159
1345
  msgid "DNS Prefetch Control"
1346
  msgstr ""
1347
 
1348
+ #: src/lang.cls.php:160
1349
  msgid "CSS Excludes"
1350
  msgstr ""
1351
 
1352
+ #: src/lang.cls.php:161
1353
  msgid "JS Excludes"
1354
  msgstr ""
1355
 
1356
+ #: src/lang.cls.php:162
1357
  msgid "Remove Query Strings"
1358
  msgstr ""
1359
 
1360
+ #: src/lang.cls.php:163
1361
  msgid "Load Google Fonts Asynchronously"
1362
  msgstr ""
1363
 
1364
+ #: src/lang.cls.php:164
1365
  msgid "Remove Google Fonts"
1366
  msgstr ""
1367
 
1368
+ #: src/lang.cls.php:165
1369
  msgid "Critical CSS Rules"
1370
  msgstr ""
1371
 
1372
+ #: src/lang.cls.php:166
1373
  msgid "Separate CCSS Cache Post Types"
1374
  msgstr ""
1375
 
1376
+ #: src/lang.cls.php:167
1377
  msgid "Separate CCSS Cache URIs"
1378
  msgstr ""
1379
 
1380
+ #: src/lang.cls.php:168
1381
  msgid "JS Deferred Excludes"
1382
  msgstr ""
1383
 
1384
+ #: src/lang.cls.php:169
1385
  msgid "Guest Mode JS Excludes"
1386
  msgstr ""
1387
 
1388
+ #: src/lang.cls.php:170
1389
  msgid "Remove WordPress Emoji"
1390
  msgstr ""
1391
 
1392
+ #: src/lang.cls.php:171
1393
  msgid "Remove Noscript Tags"
1394
  msgstr ""
1395
 
1396
+ #: src/lang.cls.php:172
1397
  msgid "URI Excludes"
1398
  msgstr ""
1399
 
1400
+ #: src/lang.cls.php:173
1401
  msgid "Optimize for Guests Only"
1402
  msgstr ""
1403
 
1404
+ #: src/lang.cls.php:174
1405
  msgid "Role Excludes"
1406
  msgstr ""
1407
 
1408
+ #: src/lang.cls.php:177
1409
  msgid "Gravatar Cache Cron"
1410
  msgstr ""
1411
 
1412
+ #: src/lang.cls.php:178
1413
  msgid "Gravatar Cache TTL"
1414
  msgstr ""
1415
 
1416
+ #: src/lang.cls.php:180
1417
  msgid "Lazy Load Images"
1418
  msgstr ""
1419
 
1420
+ #: src/lang.cls.php:181
1421
  msgid "Lazy Load Image Excludes"
1422
  msgstr ""
1423
 
1424
+ #: src/lang.cls.php:182
1425
  msgid "Lazy Load Image Class Name Excludes"
1426
  msgstr ""
1427
 
1428
+ #: src/lang.cls.php:183
1429
  msgid "Lazy Load Image Parent Class Name Excludes"
1430
  msgstr ""
1431
 
1432
+ #: src/lang.cls.php:184
1433
  msgid "Lazy Load Iframe Class Name Excludes"
1434
  msgstr ""
1435
 
1436
+ #: src/lang.cls.php:185
1437
  msgid "Lazy Load Iframe Parent Class Name Excludes"
1438
  msgstr ""
1439
 
1440
+ #: src/lang.cls.php:186
1441
  msgid "Lazy Load URI Excludes"
1442
  msgstr ""
1443
 
1444
+ #: src/lang.cls.php:187
1445
  msgid "LQIP Excludes"
1446
  msgstr ""
1447
 
1448
+ #: src/lang.cls.php:188
1449
  msgid "Basic Image Placeholder"
1450
  msgstr ""
1451
 
1452
+ #: src/lang.cls.php:189
1453
  msgid "Responsive Placeholder"
1454
  msgstr ""
1455
 
1456
+ #: src/lang.cls.php:190
1457
  msgid "Responsive Placeholder Color"
1458
  msgstr ""
1459
 
1460
+ #: src/lang.cls.php:191
1461
  msgid "Responsive Placeholder SVG"
1462
  msgstr ""
1463
 
1464
+ #: src/lang.cls.php:192
1465
  msgid "LQIP Cloud Generator"
1466
  msgstr ""
1467
 
1468
+ #: src/lang.cls.php:193
1469
  msgid "LQIP Quality"
1470
  msgstr ""
1471
 
1472
+ #: src/lang.cls.php:194
1473
  msgid "LQIP Minimum Dimensions"
1474
  msgstr ""
1475
 
1476
+ #: src/lang.cls.php:196
1477
  msgid "Generate LQIP In Background"
1478
  msgstr ""
1479
 
1480
+ #: src/lang.cls.php:197
1481
  msgid "Lazy Load Iframes"
1482
  msgstr ""
1483
 
1484
+ #: src/lang.cls.php:198
1485
  msgid "Add Missing Sizes"
1486
  msgstr ""
1487
 
1488
+ #: src/lang.cls.php:199 src/metabox.cls.php:31 src/metabox.cls.php:32
1489
+ #: tpl/page_optm/settings_vpi.tpl.php:12
1490
+ msgid "Viewport Images"
1491
+ msgstr ""
1492
+
1493
+ #: src/lang.cls.php:200
1494
+ msgid "Viewport Images Cron"
1495
+ msgstr ""
1496
+
1497
+ #: src/lang.cls.php:202
1498
  msgid "Auto Request Cron"
1499
  msgstr ""
1500
 
1501
+ #: src/lang.cls.php:203
1502
  msgid "Auto Pull Cron"
1503
  msgstr ""
1504
 
1505
+ #: src/lang.cls.php:204
1506
  msgid "Optimize Original Images"
1507
  msgstr ""
1508
 
1509
+ #: src/lang.cls.php:205
1510
  msgid "Remove Original Backups"
1511
  msgstr ""
1512
 
1513
+ #: src/lang.cls.php:206
1514
  msgid "Create WebP Versions"
1515
  msgstr ""
1516
 
1517
+ #: src/lang.cls.php:207
1518
  msgid "Optimize Losslessly"
1519
  msgstr ""
1520
 
1521
+ #: src/lang.cls.php:208
1522
  msgid "Preserve EXIF/XMP data"
1523
  msgstr ""
1524
 
1525
+ #: src/lang.cls.php:209
1526
  msgid "WebP Attribute To Replace"
1527
  msgstr ""
1528
 
1529
+ #: src/lang.cls.php:210
1530
  msgid "WebP For Extra srcset"
1531
  msgstr ""
1532
 
1533
+ #: src/lang.cls.php:211
1534
  msgid "WordPress Image Quality Control"
1535
  msgstr ""
1536
 
1537
+ #: src/lang.cls.php:212 tpl/esi_widget_edit.php:36
1538
  msgid "Enable ESI"
1539
  msgstr ""
1540
 
1541
+ #: src/lang.cls.php:213
1542
  msgid "Cache Admin Bar"
1543
  msgstr ""
1544
 
1545
+ #: src/lang.cls.php:214
1546
  msgid "Cache Comment Form"
1547
  msgstr ""
1548
 
1549
+ #: src/lang.cls.php:215
1550
  msgid "ESI Nonces"
1551
  msgstr ""
1552
 
1553
+ #: src/lang.cls.php:216 tpl/page_optm/settings_css.tpl.php:111
1554
+ #: tpl/page_optm/settings_css.tpl.php:221 tpl/page_optm/settings_vpi.tpl.php:67
1555
  msgid "Vary Group"
1556
  msgstr ""
1557
 
1558
+ #: src/lang.cls.php:217
1559
  msgid "Purge All Hooks"
1560
  msgstr ""
1561
 
1562
+ #: src/lang.cls.php:218
1563
  msgid "Improve HTTP/HTTPS Compatibility"
1564
  msgstr ""
1565
 
1566
+ #: src/lang.cls.php:219
1567
  msgid "Instant Click"
1568
  msgstr ""
1569
 
1570
+ #: src/lang.cls.php:220
1571
  msgid "Do Not Cache Cookies"
1572
  msgstr ""
1573
 
1574
+ #: src/lang.cls.php:221
1575
  msgid "Do Not Cache User Agents"
1576
  msgstr ""
1577
 
1578
+ #: src/lang.cls.php:222
1579
  msgid "Login Cookie"
1580
  msgstr ""
1581
 
1582
+ #: src/lang.cls.php:223
1583
  msgid "Image WebP Replacement"
1584
  msgstr ""
1585
 
1586
+ #: src/lang.cls.php:225
1587
  msgid "Frontend Heartbeat Control"
1588
  msgstr ""
1589
 
1590
+ #: src/lang.cls.php:226
1591
  msgid "Frontend Heartbeat TTL"
1592
  msgstr ""
1593
 
1594
+ #: src/lang.cls.php:227
1595
  msgid "Backend Heartbeat Control"
1596
  msgstr ""
1597
 
1598
+ #: src/lang.cls.php:228
1599
  msgid "Backend Heartbeat TTL"
1600
  msgstr ""
1601
 
1602
+ #: src/lang.cls.php:229
1603
  msgid "Editor Heartbeat"
1604
  msgstr ""
1605
 
1606
+ #: src/lang.cls.php:230
1607
  msgid "Editor Heartbeat TTL"
1608
  msgstr ""
1609
 
1610
+ #: src/lang.cls.php:232
1611
  msgid "QUIC.cloud CDN"
1612
  msgstr ""
1613
 
1614
+ #: src/lang.cls.php:233
1615
  msgid "Use CDN Mapping"
1616
  msgstr ""
1617
 
1618
+ #: src/lang.cls.php:234
1619
  msgid "CDN URL"
1620
  msgstr ""
1621
 
1622
+ #: src/lang.cls.php:235
1623
  msgid "Include Images"
1624
  msgstr ""
1625
 
1626
+ #: src/lang.cls.php:236
1627
  msgid "Include CSS"
1628
  msgstr ""
1629
 
1630
+ #: src/lang.cls.php:237
1631
  msgid "Include JS"
1632
  msgstr ""
1633
 
1634
+ #: src/lang.cls.php:238 tpl/cdn/settings.tpl.php:102
1635
  msgid "Include File Types"
1636
  msgstr ""
1637
 
1638
+ #: src/lang.cls.php:239
1639
  msgid "HTML Attribute To Replace"
1640
  msgstr ""
1641
 
1642
+ #: src/lang.cls.php:240
1643
  msgid "Original URLs"
1644
  msgstr ""
1645
 
1646
+ #: src/lang.cls.php:241
1647
  msgid "Included Directories"
1648
  msgstr ""
1649
 
1650
+ #: src/lang.cls.php:242
1651
  msgid "Exclude Path"
1652
  msgstr ""
1653
 
1654
+ #: src/lang.cls.php:243
1655
  msgid "Cloudflare API"
1656
  msgstr ""
1657
 
1658
+ #: src/lang.cls.php:246
1659
  msgid "Delay"
1660
  msgstr ""
1661
 
1662
+ #: src/lang.cls.php:247
1663
  msgid "Run Duration"
1664
  msgstr ""
1665
 
1666
+ #: src/lang.cls.php:248
1667
  msgid "Interval Between Runs"
1668
  msgstr ""
1669
 
1670
+ #: src/lang.cls.php:249
1671
  msgid "Crawl Interval"
1672
  msgstr ""
1673
 
1674
+ #: src/lang.cls.php:250
1675
  msgid "Threads"
1676
  msgstr ""
1677
 
1678
+ #: src/lang.cls.php:251
1679
  msgid "Timeout"
1680
  msgstr ""
1681
 
1682
+ #: src/lang.cls.php:252
1683
  msgid "Server Load Limit"
1684
  msgstr ""
1685
 
1686
+ #: src/lang.cls.php:253
1687
  msgid "Role Simulation"
1688
  msgstr ""
1689
 
1690
+ #: src/lang.cls.php:254
1691
  msgid "Cookie Simulation"
1692
  msgstr ""
1693
 
1694
+ #: src/lang.cls.php:255
1695
  msgid "Custom Sitemap"
1696
  msgstr ""
1697
 
1698
+ #: src/lang.cls.php:256
1699
  msgid "Drop Domain from Sitemap"
1700
  msgstr ""
1701
 
1702
+ #: src/lang.cls.php:257
1703
  msgid "Sitemap Timeout"
1704
  msgstr ""
1705
 
1706
+ #: src/lang.cls.php:259 tpl/inc/disabled_all.php:5
1707
  msgid "Disable All Features"
1708
  msgstr ""
1709
 
1710
+ #: src/lang.cls.php:260 tpl/toolbox/log_viewer.tpl.php:7
1711
  msgid "Debug Log"
1712
  msgstr ""
1713
 
1714
+ #: src/lang.cls.php:261
1715
  msgid "Admin IPs"
1716
  msgstr ""
1717
 
1718
+ #: src/lang.cls.php:262
1719
  msgid "Debug Level"
1720
  msgstr ""
1721
 
1722
+ #: src/lang.cls.php:263
1723
  msgid "Log File Size Limit"
1724
  msgstr ""
1725
 
1726
+ #: src/lang.cls.php:264
1727
  msgid "Log Cookies"
1728
  msgstr ""
1729
 
1730
+ #: src/lang.cls.php:265
1731
  msgid "Collapse Query Strings"
1732
  msgstr ""
1733
 
1734
+ #: src/lang.cls.php:266
1735
  msgid "Debug URI Includes"
1736
  msgstr ""
1737
 
1738
+ #: src/lang.cls.php:267
1739
  msgid "Debug URI Excludes"
1740
  msgstr ""
1741
 
1742
+ #: src/lang.cls.php:268
1743
+ msgid "Debug String Excludes"
1744
+ msgstr ""
1745
+
1746
+ #: src/lang.cls.php:270
1747
  msgid "Revisions Max Number"
1748
  msgstr ""
1749
 
1750
+ #: src/lang.cls.php:271
1751
  msgid "Revisions Max Age"
1752
  msgstr ""
1753
 
1754
+ #: src/media.cls.php:199
1755
  msgid "LiteSpeed Optimization"
1756
  msgstr ""
1757
 
1758
+ #: src/media.cls.php:249 src/media.cls.php:274 src/media.cls.php:303
1759
+ #: src/media.cls.php:327
1760
  msgid "(optm)"
1761
  msgstr ""
1762
 
1763
+ #: src/media.cls.php:250
1764
  msgid "Currently using optimized version of file."
1765
  msgstr ""
1766
 
1767
+ #: src/media.cls.php:250 src/media.cls.php:304
1768
  msgid "Click to switch to original (unoptimized) version."
1769
  msgstr ""
1770
 
1771
+ #: src/media.cls.php:254 src/media.cls.php:308
1772
  msgid "(non-optm)"
1773
  msgstr ""
1774
 
1775
+ #: src/media.cls.php:255
1776
  msgid "Currently using original (unoptimized) version of file."
1777
  msgstr ""
1778
 
1779
+ #: src/media.cls.php:255 src/media.cls.php:309
1780
  msgid "Click to switch to optimized version."
1781
  msgstr ""
1782
 
1783
+ #: src/media.cls.php:259
1784
  msgid "Original file reduced by %1$s (%2$s)"
1785
  msgstr ""
1786
 
1787
+ #: src/media.cls.php:265
1788
  msgid "Orig saved %s"
1789
  msgstr ""
1790
 
1791
+ #: src/media.cls.php:273 src/media.cls.php:326
1792
  msgid "Using optimized version of file. "
1793
  msgstr ""
1794
 
1795
+ #: src/media.cls.php:273
1796
  msgid "No backup of original file exists."
1797
  msgstr ""
1798
 
1799
+ #: src/media.cls.php:282
1800
  msgid "Congratulation! Your file was already optimized"
1801
  msgstr ""
1802
 
1803
+ #: src/media.cls.php:285
1804
  msgid "Orig %s"
1805
  msgstr ""
1806
 
1807
+ #: src/media.cls.php:285
1808
  msgid "(no savings)"
1809
  msgstr ""
1810
 
1811
+ #: src/media.cls.php:288
1812
  msgid "Orig"
1813
  msgstr ""
1814
 
1815
+ #: src/media.cls.php:304
1816
  msgid "Currently using optimized version of WebP file."
1817
  msgstr ""
1818
 
1819
+ #: src/media.cls.php:309
1820
  msgid "Currently using original (unoptimized) version of WebP file."
1821
  msgstr ""
1822
 
1823
+ #: src/media.cls.php:313
1824
  msgid "WebP file reduced by %1$s (%2$s)"
1825
  msgstr ""
1826
 
1827
+ #: src/media.cls.php:318
1828
  msgid "WebP saved %s"
1829
  msgstr ""
1830
 
1831
+ #: src/media.cls.php:326
1832
  msgid "No backup of unoptimized WebP file exists."
1833
  msgstr ""
1834
 
1835
+ #: src/media.cls.php:332
1836
  msgid "WebP"
1837
  msgstr ""
1838
 
1839
+ #: src/media.cls.php:342
1840
  msgid "Restore from backup"
1841
  msgstr ""
1842
 
1843
+ #: src/metabox.cls.php:28
1844
+ msgid "Disable Cache"
1845
+ msgstr ""
1846
+
1847
+ #: src/metabox.cls.php:29
1848
+ msgid "Disable Image Lazyload"
1849
+ msgstr ""
1850
+
1851
+ #: src/metabox.cls.php:30
1852
+ msgid "Disable VPI"
1853
+ msgstr ""
1854
+
1855
+ #: src/metabox.cls.php:32
1856
+ msgid "Mobile"
1857
+ msgstr ""
1858
+
1859
+ #: src/metabox.cls.php:53
1860
+ msgid "LiteSpeed Options"
1861
+ msgstr ""
1862
+
1863
  #: src/placeholder.cls.php:80 tpl/dash/network_dash.tpl.php:30
1864
  msgid "LQIP"
1865
  msgstr ""
1868
  msgid "LQIP image preview for size %s"
1869
  msgstr ""
1870
 
1871
+ #: src/purge.cls.php:197
1872
  msgid "Purged all caches successfully."
1873
  msgstr ""
1874
 
1875
+ #: src/purge.cls.php:216
1876
  msgid "Notified LiteSpeed Web Server to purge all LSCache entries."
1877
  msgstr ""
1878
 
1879
+ #: src/purge.cls.php:235
1880
  msgid "Cleaned all Critical CSS files."
1881
  msgstr ""
1882
 
1883
+ #: src/purge.cls.php:254
1884
  msgid "Cleaned all Unique CSS files."
1885
  msgstr ""
1886
 
1887
+ #: src/purge.cls.php:288
1888
  msgid "Cleaned all LQIP files."
1889
  msgstr ""
1890
 
1891
+ #: src/purge.cls.php:305
1892
  msgid "Cleaned all Gravatar files."
1893
  msgstr ""
1894
 
1895
+ #: src/purge.cls.php:322
1896
  msgid "Cleaned all localized resource entries."
1897
  msgstr ""
1898
 
1899
+ #: src/purge.cls.php:356
1900
  msgid "Notified LiteSpeed Web Server to purge CSS/JS entries."
1901
  msgstr ""
1902
 
1903
+ #: src/purge.cls.php:372
1904
  msgid "Opcode cache is not enabled."
1905
  msgstr ""
1906
 
1907
+ #: src/purge.cls.php:384
1908
  msgid "Reset the entire opcode cache successfully."
1909
  msgstr ""
1910
 
1911
+ #: src/purge.cls.php:412
1912
  msgid "Object cache is not enabled."
1913
  msgstr ""
1914
 
1915
+ #: src/purge.cls.php:425
1916
  msgid "Purge all object caches successfully."
1917
  msgstr ""
1918
 
1919
+ #: src/purge.cls.php:638
1920
  msgid "Notified LiteSpeed Web Server to purge the front page."
1921
  msgstr ""
1922
 
1923
+ #: src/purge.cls.php:651
1924
  msgid "Notified LiteSpeed Web Server to purge all pages."
1925
  msgstr ""
1926
 
1927
+ #: src/purge.cls.php:670
1928
  msgid "Notified LiteSpeed Web Server to purge error pages."
1929
  msgstr ""
1930
 
1931
+ #: src/purge.cls.php:697
1932
  msgid "Purge category %s"
1933
  msgstr ""
1934
 
1935
+ #: src/purge.cls.php:724
1936
  msgid "Purge tag %s"
1937
  msgstr ""
1938
 
1939
+ #: src/purge.cls.php:755
1940
  msgid "Purge url %s"
1941
  msgstr ""
1942
 
1943
+ #: src/task.cls.php:122
1944
  msgid "Every Minute"
1945
  msgstr ""
1946
 
1947
+ #: src/task.cls.php:141
1948
  msgid "LiteSpeed Crawler Cron"
1949
  msgstr ""
1950
 
1951
+ #: src/utility.cls.php:236
1952
  msgid "right now"
1953
  msgstr ""
1954
 
1955
+ #: src/utility.cls.php:236
1956
  msgid "just now"
1957
  msgstr ""
1958
 
1959
+ #: src/utility.cls.php:239
1960
  msgid " %s ago"
1961
  msgstr ""
1962
 
1963
+ #: thirdparty/litespeed-check.cls.php:111
1964
+ msgid ""
1965
+ "Please consider disabling the following detected plugins, as they may "
1966
+ "conflict with LiteSpeed Cache:"
1967
+ msgstr ""
1968
+
1969
  #: thirdparty/woocommerce.content.tpl.php:16
1970
  msgid "WooCommerce Settings"
1971
  msgstr ""
2090
  msgid "Dismiss this notice"
2091
  msgstr ""
2092
 
2093
+ #. #-#-#-#-# litespeed-cache.pot (LiteSpeed Cache 5.0) #-#-#-#-#
2094
  #. Plugin Name of the plugin/theme
2095
+ #: tpl/banner/new_version.php:57 tpl/banner/new_version_dev.tpl.php:12
2096
  #: tpl/cache/more_settings_tip.tpl.php:15 tpl/inc/admin_footer.php:8
2097
  msgid "LiteSpeed Cache"
2098
  msgstr ""
2099
 
2100
+ #: tpl/banner/new_version.php:57
2101
  msgid "New Version Available!"
2102
  msgstr ""
2103
 
2104
+ #: tpl/banner/new_version.php:61
2105
  msgid "New release %s is available now."
2106
  msgstr ""
2107
 
2108
+ #: tpl/banner/new_version.php:69 tpl/banner/new_version_dev.tpl.php:24
2109
+ #: tpl/toolbox/beta_test.tpl.php:62
2110
  msgid "Upgrade"
2111
  msgstr ""
2112
 
2113
+ #: tpl/banner/new_version.php:79
2114
  msgid "Turn On Auto Upgrade"
2115
  msgstr ""
2116
 
2117
+ #: tpl/banner/new_version.php:85
2118
  msgid "Maybe Later"
2119
  msgstr ""
2120
 
2130
  msgid "Thank You for Using the LiteSpeed Cache Plugin!"
2131
  msgstr ""
2132
 
2133
+ #: tpl/banner/score.php:28 tpl/dash/dashboard.tpl.php:179
2134
  msgid "Page Load Time"
2135
  msgstr ""
2136
 
2137
  #: tpl/banner/score.php:34 tpl/banner/score.php:74
2138
+ #: tpl/dash/dashboard.tpl.php:192 tpl/dash/dashboard.tpl.php:260
2139
  msgid "Before"
2140
  msgstr ""
2141
 
2142
  #: tpl/banner/score.php:45 tpl/banner/score.php:84
2143
+ #: tpl/dash/dashboard.tpl.php:201 tpl/dash/dashboard.tpl.php:268
2144
  msgid "After"
2145
  msgstr ""
2146
 
2147
  #: tpl/banner/score.php:55 tpl/banner/score.php:94
2148
+ #: tpl/dash/dashboard.tpl.php:209 tpl/dash/dashboard.tpl.php:276
2149
  msgid "Improved by"
2150
  msgstr ""
2151
 
2152
+ #: tpl/banner/score.php:68 tpl/dash/dashboard.tpl.php:236
2153
  msgid "PageSpeed Score"
2154
  msgstr ""
2155
 
2215
  msgstr ""
2216
 
2217
  #: tpl/cache/entry.tpl.php:18 tpl/cache/entry_network.tpl.php:11
2218
+ #: tpl/toolbox/settings-debug.tpl.php:82
2219
  msgid "Advanced"
2220
  msgstr ""
2221
 
2229
 
2230
  #: tpl/cache/more_settings_tip.tpl.php:12
2231
  #: tpl/cache/settings-excludes.tpl.php:61
2232
+ #: tpl/cache/settings-excludes.tpl.php:94 tpl/cdn/auto_setup.tpl.php:235
2233
+ #: tpl/cdn/auto_setup.tpl.php:246 tpl/cdn/settings.tpl.php:78
2234
  #: tpl/crawler/settings-general.tpl.php:39
2235
  #: tpl/crawler/settings-general.tpl.php:140
2236
  #: tpl/crawler/settings-general.tpl.php:145
2312
  msgid "Please visit the <a %s>Information</a> page on how to test the cache."
2313
  msgstr ""
2314
 
2315
+ #: tpl/cache/settings-cache.tpl.php:27 tpl/page_optm/entry.tpl.php:31
2316
  msgid "NOTICE"
2317
  msgstr ""
2318
 
2413
  #: tpl/cache/settings-esi.tpl.php:35 tpl/cdn/manage.tpl.php:21
2414
  #: tpl/crawler/summary.tpl.php:48 tpl/inc/check_cache_disabled.php:31
2415
  #: tpl/inc/check_if_network_disable_all.php:18
2416
+ #: tpl/page_optm/settings_css.tpl.php:60 tpl/page_optm/settings_css.tpl.php:166
2417
  #: tpl/page_optm/settings_localization.tpl.php:11
2418
  msgid "WARNING"
2419
  msgstr ""
2924
  "the WordPress core is upgraded."
2925
  msgstr ""
2926
 
2927
+ #: tpl/cdn/auto_setup.tpl.php:34
2928
+ msgid "Not running"
2929
+ msgstr ""
2930
+
2931
+ #: tpl/cdn/auto_setup.tpl.php:35
2932
+ msgid "Run CDN Setup"
2933
+ msgstr ""
2934
+
2935
+ #: tpl/cdn/auto_setup.tpl.php:42
2936
+ msgid "Done"
2937
+ msgstr ""
2938
+
2939
+ #: tpl/cdn/auto_setup.tpl.php:44
2940
+ msgid "Completed at %s"
2941
+ msgstr ""
2942
+
2943
+ #: tpl/cdn/auto_setup.tpl.php:50
2944
+ msgid "Paused"
2945
+ msgstr ""
2946
+
2947
+ #: tpl/cdn/auto_setup.tpl.php:54
2948
+ msgid "Verifying, waiting for nameservers to be updated."
2949
+ msgstr ""
2950
+
2951
+ #: tpl/cdn/auto_setup.tpl.php:54
2952
+ msgid "Click the refresh button below to refresh status."
2953
+ msgstr ""
2954
+
2955
+ #: tpl/cdn/auto_setup.tpl.php:56
2956
+ msgid "Last Verification Result"
2957
+ msgstr ""
2958
+
2959
+ #: tpl/cdn/auto_setup.tpl.php:59
2960
+ msgid "In Progress"
2961
+ msgstr ""
2962
+
2963
+ #: tpl/cdn/auto_setup.tpl.php:60
2964
+ msgid "You will receive an email upon status update."
2965
+ msgstr ""
2966
+
2967
+ #: tpl/cdn/auto_setup.tpl.php:60
2968
+ msgid "This process may take several minutes."
2969
+ msgstr ""
2970
+
2971
+ #: tpl/cdn/auto_setup.tpl.php:62
2972
+ msgid "Refresh CDN Setup Status"
2973
+ msgstr ""
2974
+
2975
+ #: tpl/cdn/auto_setup.tpl.php:68
2976
+ msgid "Auto QUIC.cloud CDN Setup"
2977
+ msgstr ""
2978
+
2979
+ #: tpl/cdn/auto_setup.tpl.php:71
2980
+ msgid ""
2981
+ "This is a three step process for configuring your site to use QUIC.cloud CDN "
2982
+ "with QUIC.cloud DNS. This setup will perform the following actions"
2983
+ msgstr ""
2984
+
2985
+ #: tpl/cdn/auto_setup.tpl.php:74
2986
+ msgid "Set up a QUIC.cloud account."
2987
+ msgstr ""
2988
+
2989
+ #: tpl/cdn/auto_setup.tpl.php:75
2990
+ msgid ""
2991
+ "Prepare the site for QUIC.cloud CDN, detect the DNS, and create a DNS Zone."
2992
+ msgstr ""
2993
+
2994
+ #: tpl/cdn/auto_setup.tpl.php:76
2995
+ msgid "Provide the nameservers necessary to enable the CDN."
2996
+ msgstr ""
2997
+
2998
+ #: tpl/cdn/auto_setup.tpl.php:78
2999
+ msgid ""
3000
+ "After successful DNS detection, QUIC.cloud will attempt to generate an SSL "
3001
+ "certificate and enable the CDN."
3002
+ msgstr ""
3003
+
3004
+ #: tpl/cdn/auto_setup.tpl.php:79
3005
+ msgid "This last stage could take 15 to 20 minutes."
3006
+ msgstr ""
3007
+
3008
+ #: tpl/cdn/auto_setup.tpl.php:80
3009
+ msgid ""
3010
+ "Your site will be available, but browsers may issue a \"not secure\" warning "
3011
+ "during this time."
3012
+ msgstr ""
3013
+
3014
+ #: tpl/cdn/auto_setup.tpl.php:85
3015
+ msgid ""
3016
+ "After you set your nameservers, QUIC.cloud will detect the change and "
3017
+ "automatically enable the CDN."
3018
+ msgstr ""
3019
+
3020
+ #: tpl/cdn/auto_setup.tpl.php:89 tpl/toolbox/report.tpl.php:81
3021
+ msgid "Notes"
3022
+ msgstr ""
3023
+
3024
+ #: tpl/cdn/auto_setup.tpl.php:93
3025
+ msgid "QUIC.cloud CDN/DNS does not support DNSSEC."
3026
+ msgstr ""
3027
+
3028
+ #: tpl/cdn/auto_setup.tpl.php:94
3029
+ msgid ""
3030
+ "If you have this enabled for your domain, you must disable DNSSEC to "
3031
+ "continue."
3032
+ msgstr ""
3033
+
3034
+ #: tpl/cdn/auto_setup.tpl.php:97
3035
+ msgid ""
3036
+ "This setup process will create a DNS zone on QUIC.cloud if one does not "
3037
+ "currently exist."
3038
+ msgstr ""
3039
+
3040
+ #: tpl/cdn/auto_setup.tpl.php:98
3041
+ msgid ""
3042
+ "If you prefer to use the CNAME setup, please <a %s>set up the CDN manually "
3043
+ "at QUIC.cloud</a>."
3044
+ msgstr ""
3045
+
3046
+ #: tpl/cdn/auto_setup.tpl.php:102
3047
+ msgid "QUIC.cloud will detect most normal DNS entries."
3048
+ msgstr ""
3049
+
3050
+ #: tpl/cdn/auto_setup.tpl.php:103
3051
+ msgid ""
3052
+ "If you have custom DNS records, it is possible that they are not detected."
3053
+ msgstr ""
3054
+
3055
+ #: tpl/cdn/auto_setup.tpl.php:104
3056
+ msgid ""
3057
+ "Visit your QUIC.cloud dashboard after the DNS Zone is set up to confirm your "
3058
+ "DNS zone."
3059
+ msgstr ""
3060
+
3061
+ #: tpl/cdn/auto_setup.tpl.php:109
3062
+ msgid "Set up QUIC.cloud Account"
3063
+ msgstr ""
3064
+
3065
+ #: tpl/cdn/auto_setup.tpl.php:114
3066
+ msgid "Account is linked!"
3067
+ msgstr ""
3068
+
3069
+ #: tpl/cdn/auto_setup.tpl.php:117
3070
+ msgid "Manage CDN"
3071
+ msgstr ""
3072
+
3073
+ #: tpl/cdn/auto_setup.tpl.php:121
3074
+ msgid "Manage DNS Zone"
3075
+ msgstr ""
3076
+
3077
+ #: tpl/cdn/auto_setup.tpl.php:127
3078
+ msgid "Ready to run CDN setup."
3079
+ msgstr ""
3080
+
3081
+ #: tpl/cdn/auto_setup.tpl.php:129
3082
+ msgid "Domain key and QUIC.cloud link detected."
3083
+ msgstr ""
3084
+
3085
+ #: tpl/cdn/auto_setup.tpl.php:130
3086
+ msgid "Begin QUIC.cloud CDN Setup"
3087
+ msgstr ""
3088
+
3089
+ #: tpl/cdn/auto_setup.tpl.php:132 tpl/general/settings.tpl.php:75
3090
+ #: tpl/general/settings.tpl.php:77 tpl/general/settings.tpl.php:106
3091
+ msgid "Link to QUIC.cloud"
3092
+ msgstr ""
3093
+
3094
+ #: tpl/cdn/auto_setup.tpl.php:136
3095
+ msgid "CDN Setup Status"
3096
+ msgstr ""
3097
+
3098
+ #: tpl/cdn/auto_setup.tpl.php:150
3099
+ msgid "QUIC.cloud Detected Records Summary"
3100
+ msgstr ""
3101
+
3102
+ #: tpl/cdn/auto_setup.tpl.php:156
3103
+ msgid "Record Type"
3104
+ msgstr ""
3105
+
3106
+ #: tpl/cdn/auto_setup.tpl.php:159
3107
+ msgid "Count"
3108
+ msgstr ""
3109
+
3110
+ #: tpl/cdn/auto_setup.tpl.php:171
3111
+ msgid "Record names found"
3112
+ msgstr ""
3113
+
3114
+ #: tpl/cdn/auto_setup.tpl.php:174
3115
+ msgid "Is something missing?"
3116
+ msgstr ""
3117
+
3118
+ #: tpl/cdn/auto_setup.tpl.php:176
3119
+ msgid "Review DNS records"
3120
+ msgstr ""
3121
+
3122
+ #: tpl/cdn/auto_setup.tpl.php:181
3123
+ msgid ""
3124
+ "Note: For 15 to 20 minutes after setup completes, browsers may issue a \"not "
3125
+ "secure\" warning for your site while QUIC.cloud generates your SSL "
3126
+ "certificate."
3127
+ msgstr ""
3128
+
3129
+ #: tpl/cdn/auto_setup.tpl.php:193
3130
+ msgid "Nameservers"
3131
+ msgstr ""
3132
+
3133
+ #: tpl/cdn/auto_setup.tpl.php:198
3134
+ msgid "Please update your domain registrar to use these custom nameservers:"
3135
+ msgstr ""
3136
+
3137
+ #: tpl/cdn/auto_setup.tpl.php:208
3138
+ msgid "QUIC.cloud will attempt to verify the DNS update."
3139
+ msgstr ""
3140
+
3141
+ #: tpl/cdn/auto_setup.tpl.php:209
3142
+ msgid ""
3143
+ "If it does not verify within 24 hours, the CDN setup will mark the "
3144
+ "verification as failed."
3145
+ msgstr ""
3146
+
3147
+ #: tpl/cdn/auto_setup.tpl.php:210
3148
+ msgid ""
3149
+ "At that stage, you may re-start the verification process by pressing the Run "
3150
+ "CDN Setup button."
3151
+ msgstr ""
3152
+
3153
+ #: tpl/cdn/auto_setup.tpl.php:214
3154
+ msgid ""
3155
+ "This section will automatically populate once nameservers are configured for "
3156
+ "the site."
3157
+ msgstr ""
3158
+
3159
+ #: tpl/cdn/auto_setup.tpl.php:223
3160
+ msgid "Action"
3161
+ msgstr ""
3162
+
3163
+ #: tpl/cdn/auto_setup.tpl.php:226
3164
+ msgid "The following actions are available:"
3165
+ msgstr ""
3166
+
3167
+ #: tpl/cdn/auto_setup.tpl.php:228 tpl/cdn/auto_setup.tpl.php:253
3168
+ msgid "Reset CDN Setup"
3169
+ msgstr ""
3170
+
3171
+ #: tpl/cdn/auto_setup.tpl.php:229
3172
+ msgid ""
3173
+ "Resets all LiteSpeed Cache plugin settings related to CDN setup back to the "
3174
+ "initial state and disables the CDN."
3175
+ msgstr ""
3176
+
3177
+ #: tpl/cdn/auto_setup.tpl.php:230
3178
+ msgid "QUIC.cloud DNS settings are not changed."
3179
+ msgstr ""
3180
+
3181
+ #: tpl/cdn/auto_setup.tpl.php:231
3182
+ msgid "This allows you to try Auto CDN setup again."
3183
+ msgstr ""
3184
+
3185
+ #: tpl/cdn/auto_setup.tpl.php:236
3186
+ msgid "This action will not update anything on the QUIC.cloud servers."
3187
+ msgstr ""
3188
+
3189
+ #: tpl/cdn/auto_setup.tpl.php:241 tpl/cdn/auto_setup.tpl.php:256
3190
+ msgid "Delete QUIC.cloud data"
3191
+ msgstr ""
3192
+
3193
+ #: tpl/cdn/auto_setup.tpl.php:242
3194
+ msgid ""
3195
+ "Resets all LiteSpeed Cache plugin settings related to CDN setup back to the "
3196
+ "initial state and deletes the DNS Zone, if one exists for the domain."
3197
+ msgstr ""
3198
+
3199
+ #: tpl/cdn/auto_setup.tpl.php:243
3200
+ msgid ""
3201
+ "This allows you to try Auto CDN setup again, or abandon the setup entirely."
3202
+ msgstr ""
3203
+
3204
+ #: tpl/cdn/auto_setup.tpl.php:247
3205
+ msgid ""
3206
+ "This action is not available if there is no domain key, the domain is not "
3207
+ "linked, or the DNS Zone is in active use."
3208
+ msgstr ""
3209
+
3210
+ #: tpl/cdn/auto_setup.tpl.php:248
3211
+ msgid ""
3212
+ "If you have not yet done so, please replace the QUIC.cloud nameservers at "
3213
+ "your domain registrar before proceeding. "
3214
+ msgstr ""
3215
+
3216
+ #: tpl/cdn/auto_setup.tpl.php:252
3217
+ msgid "Are you sure you want to reset CDN Setup?"
3218
+ msgstr ""
3219
+
3220
+ #: tpl/cdn/auto_setup.tpl.php:255
3221
+ msgid "Are you sure you want to delete QUIC.cloud data?"
3222
+ msgstr ""
3223
+
3224
  #: tpl/cdn/entry.tpl.php:6 tpl/cdn/settings.tpl.php:21
3225
  msgid "CDN Settings"
3226
  msgstr ""
3227
 
3228
+ #: tpl/cdn/entry.tpl.php:7
3229
+ msgid "QUIC.cloud CDN Setup"
3230
+ msgstr ""
3231
+
3232
+ #: tpl/cdn/entry.tpl.php:15
3233
  msgid "LiteSpeed Cache CDN"
3234
  msgstr ""
3235
 
3462
  msgid "Remove from Blocklist"
3463
  msgstr ""
3464
 
3465
+ #: tpl/crawler/blacklist.tpl.php:54
3466
+ msgid "PHP Constant %s available to disable blocklist."
3467
+ msgstr ""
3468
+
3469
+ #: tpl/crawler/blacklist.tpl.php:57
3470
+ msgid "Filter %s available to disable blocklist."
3471
+ msgstr ""
3472
+
3473
+ #: tpl/crawler/blacklist.tpl.php:60
3474
  msgid "Not blocklisted"
3475
  msgstr ""
3476
 
3477
+ #: tpl/crawler/blacklist.tpl.php:61 tpl/crawler/map.tpl.php:69
3478
  msgid "Blocklisted due to not cacheable"
3479
  msgstr ""
3480
 
3481
+ #: tpl/crawler/blacklist.tpl.php:62 tpl/crawler/map.tpl.php:70
3482
  #: tpl/crawler/summary.tpl.php:160 tpl/crawler/summary.tpl.php:184
3483
  msgid "Blocklisted"
3484
  msgstr ""
3529
  msgid "Sitemap Total"
3530
  msgstr ""
3531
 
3532
+ #: tpl/crawler/map.tpl.php:44 tpl/dash/dashboard.tpl.php:562
3533
  msgid "Crawler Status"
3534
  msgstr ""
3535
 
3702
  msgid "Run time for previous crawler"
3703
  msgstr ""
3704
 
3705
+ #: tpl/crawler/summary.tpl.php:85 tpl/dash/dashboard.tpl.php:575
3706
  msgid "Current crawler started at"
3707
  msgstr ""
3708
 
3709
+ #: tpl/crawler/summary.tpl.php:92 tpl/dash/dashboard.tpl.php:582
3710
  msgid "Last interval"
3711
  msgstr ""
3712
 
3713
+ #: tpl/crawler/summary.tpl.php:99 tpl/dash/dashboard.tpl.php:589
3714
  msgid "Ended reason"
3715
  msgstr ""
3716
 
3802
  msgid "No crawler meta file generated yet"
3803
  msgstr ""
3804
 
3805
+ #: tpl/dash/dashboard.tpl.php:44
3806
  msgid "QUIC.cloud Service Usage Statistics"
3807
  msgstr ""
3808
 
3809
+ #: tpl/dash/dashboard.tpl.php:47
3810
  msgid "Sync data from Cloud"
3811
  msgstr ""
3812
 
3813
+ #: tpl/dash/dashboard.tpl.php:59 tpl/dash/network_dash.tpl.php:29
3814
  msgid "CDN Bandwidth"
3815
  msgstr ""
3816
 
3817
+ #: tpl/dash/dashboard.tpl.php:60 tpl/dash/dashboard.tpl.php:498
3818
  msgid "Low Quality Image Placeholder"
3819
  msgstr ""
3820
 
3821
+ #: tpl/dash/dashboard.tpl.php:117 tpl/dash/network_dash.tpl.php:78
3822
  msgid "Fast Queue Usage"
3823
  msgstr ""
3824
 
3825
+ #: tpl/dash/dashboard.tpl.php:117 tpl/dash/network_dash.tpl.php:78
3826
  msgid "Usage"
3827
  msgstr ""
3828
 
3829
+ #: tpl/dash/dashboard.tpl.php:130 tpl/dash/network_dash.tpl.php:90
3830
  msgid "PAYG Balance"
3831
  msgstr ""
3832
 
3833
+ #: tpl/dash/dashboard.tpl.php:131 tpl/dash/network_dash.tpl.php:91
3834
  msgid "This Month Usage"
3835
  msgstr ""
3836
 
3837
+ #: tpl/dash/dashboard.tpl.php:133 tpl/dash/network_dash.tpl.php:93
3838
  msgid "Pay as You Go Usage Statistics"
3839
  msgstr ""
3840
 
3841
+ #: tpl/dash/dashboard.tpl.php:151 tpl/dash/network_dash.tpl.php:100
3842
  msgid "Total Usage"
3843
  msgstr ""
3844
 
3845
+ #: tpl/dash/dashboard.tpl.php:152 tpl/dash/network_dash.tpl.php:101
3846
  msgid "Total images optimized in this month"
3847
  msgstr ""
3848
 
3849
+ #: tpl/dash/dashboard.tpl.php:161
3850
  msgid "Remaining Daily Quota"
3851
  msgstr ""
3852
 
3853
+ #: tpl/dash/dashboard.tpl.php:170
3854
  msgid "Go to QUIC.cloud dashboard"
3855
  msgstr ""
3856
 
3857
+ #: tpl/dash/dashboard.tpl.php:182
3858
  msgid "Refresh page load time"
3859
  msgstr ""
3860
 
3861
+ #: tpl/dash/dashboard.tpl.php:223 tpl/dash/dashboard.tpl.php:292
3862
+ #: tpl/dash/dashboard.tpl.php:457 tpl/dash/dashboard.tpl.php:490
3863
+ #: tpl/dash/dashboard.tpl.php:522 tpl/dash/dashboard.tpl.php:554
3864
  msgid "Last requested"
3865
  msgstr ""
3866
 
3867
+ #: tpl/dash/dashboard.tpl.php:228
3868
  msgid "Current closest Cloud server is %s.&#10;Click to redetect."
3869
  msgstr ""
3870
 
3871
+ #: tpl/dash/dashboard.tpl.php:228 tpl/img_optm/summary.tpl.php:57
3872
+ #: tpl/page_optm/settings_css.tpl.php:92 tpl/page_optm/settings_css.tpl.php:202
3873
  #: tpl/page_optm/settings_media.tpl.php:176
3874
+ #: tpl/page_optm/settings_vpi.tpl.php:48
3875
  msgid ""
3876
  "Are you sure you want to redetect the closest cloud server for this service?"
3877
  msgstr ""
3878
 
3879
+ #: tpl/dash/dashboard.tpl.php:239
3880
  msgid "Refresh page score"
3881
  msgstr ""
3882
 
3883
+ #: tpl/dash/dashboard.tpl.php:300 tpl/img_optm/entry.tpl.php:6
3884
  msgid "Image Optimization Summary"
3885
  msgstr ""
3886
 
3887
+ #: tpl/dash/dashboard.tpl.php:301 tpl/dash/dashboard.tpl.php:390
3888
+ #: tpl/dash/dashboard.tpl.php:433 tpl/dash/dashboard.tpl.php:466
3889
+ #: tpl/dash/dashboard.tpl.php:499 tpl/dash/dashboard.tpl.php:531
3890
+ #: tpl/dash/dashboard.tpl.php:563
3891
  msgid "More"
3892
  msgstr ""
3893
 
3894
+ #: tpl/dash/dashboard.tpl.php:311
3895
  msgid "Image Groups Prepared"
3896
  msgstr ""
3897
 
3898
+ #: tpl/dash/dashboard.tpl.php:326
3899
  msgid "Images Requested"
3900
  msgstr ""
3901
 
3902
+ #: tpl/dash/dashboard.tpl.php:358 tpl/img_optm/summary.tpl.php:342
3903
  msgid "Last Request"
3904
  msgstr ""
3905
 
3906
+ #: tpl/dash/dashboard.tpl.php:361
3907
  msgid "Last Pull"
3908
  msgstr ""
3909
 
3910
+ #: tpl/dash/dashboard.tpl.php:389
3911
  msgid "Cache Status"
3912
  msgstr ""
3913
 
3914
+ #: tpl/dash/dashboard.tpl.php:395
3915
  msgid "Public Cache"
3916
  msgstr ""
3917
 
3918
+ #: tpl/dash/dashboard.tpl.php:396
3919
  msgid "Private Cache"
3920
  msgstr ""
3921
 
3922
+ #: tpl/dash/dashboard.tpl.php:418
3923
  msgid "Cache Stats"
3924
  msgstr ""
3925
 
3926
+ #: tpl/dash/dashboard.tpl.php:432 tpl/toolbox/purge.tpl.php:70
3927
  msgid "Critical CSS"
3928
  msgstr ""
3929
 
3930
+ #: tpl/dash/dashboard.tpl.php:438 tpl/dash/dashboard.tpl.php:471
3931
+ #: tpl/dash/dashboard.tpl.php:504 tpl/dash/dashboard.tpl.php:536
3932
+ #: tpl/page_optm/settings_css.tpl.php:83 tpl/page_optm/settings_css.tpl.php:193
3933
  #: tpl/page_optm/settings_media.tpl.php:170
3934
+ #: tpl/page_optm/settings_vpi.tpl.php:42
3935
  msgid "Last generated"
3936
  msgstr ""
3937
 
3938
+ #: tpl/dash/dashboard.tpl.php:441 tpl/dash/dashboard.tpl.php:474
3939
+ #: tpl/dash/dashboard.tpl.php:507 tpl/dash/dashboard.tpl.php:539
3940
  msgid "Time to execute previous request"
3941
  msgstr ""
3942
 
3943
+ #: tpl/dash/dashboard.tpl.php:446 tpl/dash/dashboard.tpl.php:479
3944
+ #: tpl/dash/dashboard.tpl.php:512 tpl/dash/dashboard.tpl.php:544
3945
  msgid "Requests in queue"
3946
  msgstr ""
3947
 
3948
+ #: tpl/dash/dashboard.tpl.php:449 tpl/dash/dashboard.tpl.php:482
3949
+ #: tpl/dash/dashboard.tpl.php:514 tpl/dash/dashboard.tpl.php:546
3950
  msgid "Force cron"
3951
  msgstr ""
3952
 
3953
+ #: tpl/dash/dashboard.tpl.php:465 tpl/toolbox/purge.tpl.php:79
3954
  msgid "Unique CSS"
3955
  msgstr ""
3956
 
3957
+ #: tpl/dash/dashboard.tpl.php:530
3958
+ msgid "Viewport Image"
3959
+ msgstr ""
3960
+
3961
+ #: tpl/dash/dashboard.tpl.php:567
3962
  msgid "Crawler(s)"
3963
  msgstr ""
3964
 
3965
+ #: tpl/dash/dashboard.tpl.php:570
3966
  msgid "Currently active crawler"
3967
  msgstr ""
3968
 
3969
+ #: tpl/dash/dashboard.tpl.php:596
3970
  msgid "<b>Last crawled:</b> %d item(s)"
3971
  msgstr ""
3972
 
4156
  msgid "A TTL of 0 indicates do not cache."
4157
  msgstr ""
4158
 
4159
+ #: tpl/general/entry.tpl.php:7 tpl/page_optm/entry.tpl.php:13
4160
  msgid "Tuning"
4161
  msgstr ""
4162
 
4209
  msgid "Visit My Dashboard on QUIC.cloud"
4210
  msgstr ""
4211
 
 
 
 
 
 
4212
  #: tpl/general/settings.tpl.php:82 tpl/general/settings.tpl.php:93
4213
+ #: tpl/general/settings.tpl.php:105 tpl/general/settings.tpl.php:182
4214
+ #: tpl/general/settings.tpl.php:188 tpl/general/settings.tpl.php:194
4215
+ #: tpl/general/settings.tpl.php:200 tpl/general/settings.tpl.php:217
4216
+ #: tpl/page_optm/settings_media.tpl.php:231
4217
+ #: tpl/page_optm/settings_vpi.tpl.php:32
4218
  msgid "Notice"
4219
  msgstr ""
4220
 
4272
  msgid "A Domain Key is required for QUIC.cloud online services."
4273
  msgstr ""
4274
 
4275
+ #: tpl/general/settings.tpl.php:116
4276
+ msgid "Main domain"
4277
+ msgstr ""
4278
+
4279
+ #: tpl/general/settings.tpl.php:119
4280
+ msgid "Main domain not generated yet"
4281
+ msgstr ""
4282
+
4283
+ #: tpl/general/settings.tpl.php:126
4284
  msgid "Current Cloud Nodes in Service"
4285
  msgstr ""
4286
 
4287
+ #: tpl/general/settings.tpl.php:127
4288
  msgid "Click to clear all nodes for further redetection."
4289
  msgstr ""
4290
 
4291
+ #: tpl/general/settings.tpl.php:127
4292
  msgid "Are you sure you want to clear all cloud nodes?"
4293
  msgstr ""
4294
 
4295
+ #: tpl/general/settings.tpl.php:139
4296
  msgid "No cloud services currently in use"
4297
  msgstr ""
4298
 
4299
+ #: tpl/general/settings.tpl.php:160
4300
  msgid "This option enables maximum optimization for Guest Mode visitors."
4301
  msgstr ""
4302
 
4303
+ #: tpl/general/settings.tpl.php:161
4304
  msgid "Please read all warnings before enabling this option."
4305
  msgstr ""
4306
 
4307
+ #: tpl/general/settings.tpl.php:175
4308
  msgid "Your %1s quota on %2s will still be in use."
4309
  msgstr ""
4310
 
4311
+ #: tpl/general/settings.tpl.php:182 tpl/page_optm/settings_media.tpl.php:231
4312
+ #: tpl/page_optm/settings_vpi.tpl.php:32
4313
+ msgid "%s must be turned ON for this setting to work."
4314
  msgstr ""
4315
 
4316
+ #: tpl/general/settings.tpl.php:188 tpl/general/settings.tpl.php:200
4317
  msgid "You need to turn %s on to get maximum result."
4318
  msgstr ""
4319
 
4320
+ #: tpl/general/settings.tpl.php:194
4321
  msgid ""
4322
  "You need to turn %s on and finish all WebP generation to get maximum result."
4323
  msgstr ""
4324
 
4325
+ #: tpl/general/settings.tpl.php:215
4326
  msgid ""
4327
  "Enter this site's IP address to allow cloud services directly call IP "
4328
  "instead of domain name. This eliminates the overhead of DNS and CDN lookups."
4329
  msgstr ""
4330
 
4331
+ #: tpl/general/settings.tpl.php:216
4332
  msgid "Your server IP"
4333
  msgstr ""
4334
 
4335
+ #: tpl/general/settings.tpl.php:216
4336
  msgid "Check my public IP from"
4337
  msgstr ""
4338
 
4339
+ #: tpl/general/settings.tpl.php:217
4340
  msgid ""
4341
  "the auto-detected IP may not be accurate if you have an additional outgoing "
4342
  "IP set, or you have multiple IPs configured on your server."
4343
  msgstr ""
4344
 
4345
+ #: tpl/general/settings.tpl.php:218
4346
  msgid "Please make sure this IP is the correct one for visiting your site."
4347
  msgstr ""
4348
 
4349
+ #: tpl/general/settings.tpl.php:233
4350
  msgid ""
4351
  "Turn this option ON to show latest news automatically, including hotfixes, "
4352
  "new releases, available beta versions, and promotions."
4480
  msgid "The image compression quality setting of WordPress out of 100."
4481
  msgstr ""
4482
 
4483
+ #: tpl/img_optm/summary.tpl.php:57 tpl/page_optm/settings_css.tpl.php:92
4484
+ #: tpl/page_optm/settings_css.tpl.php:202
4485
  #: tpl/page_optm/settings_media.tpl.php:176
4486
+ #: tpl/page_optm/settings_vpi.tpl.php:48
4487
  msgid "Current closest Cloud server is %s.&#10; Click to redetect."
4488
  msgstr ""
4489
 
4827
  "dismissed. (<a %3$s>Learn More</a>)"
4828
  msgstr ""
4829
 
4830
+ #: tpl/page_optm/entry.tpl.php:6 tpl/page_optm/settings_css.tpl.php:17
4831
  msgid "CSS Settings"
4832
  msgstr ""
4833
 
4843
  msgid "Media Settings"
4844
  msgstr ""
4845
 
4846
+ #: tpl/page_optm/entry.tpl.php:10
4847
+ msgid "VPI"
4848
+ msgstr ""
4849
+
4850
+ #: tpl/page_optm/entry.tpl.php:11 tpl/page_optm/settings_media_exc.tpl.php:7
4851
  msgid "Media Excludes"
4852
  msgstr ""
4853
 
4854
+ #: tpl/page_optm/entry.tpl.php:12
4855
  msgid "Localization"
4856
  msgstr ""
4857
 
4858
+ #: tpl/page_optm/entry.tpl.php:20
4859
  msgid "LiteSpeed Cache Page Optimization"
4860
  msgstr ""
4861
 
4862
+ #: tpl/page_optm/entry.tpl.php:32
4863
  msgid ""
4864
  "Please test thoroughly when enabling any option in this list. After changing "
4865
  "Minify/Combine settings, please do a Purge All action."
4866
  msgstr ""
4867
 
4868
+ #: tpl/page_optm/settings_css.tpl.php:31
4869
  msgid "Minify CSS files and inline CSS code."
4870
  msgstr ""
4871
 
4872
+ #: tpl/page_optm/settings_css.tpl.php:44
4873
  msgid "Combine CSS files and inline CSS code."
4874
  msgstr ""
4875
 
4876
+ #: tpl/page_optm/settings_css.tpl.php:45 tpl/page_optm/settings_js.tpl.php:35
4877
  msgid "How to Fix Problems Caused by CSS/JS Optimization."
4878
  msgstr ""
4879
 
4880
+ #: tpl/page_optm/settings_css.tpl.php:65
4881
  msgid "Use QUIC.cloud online service to generate unique CSS."
4882
  msgstr ""
4883
 
4884
+ #: tpl/page_optm/settings_css.tpl.php:66
4885
  msgid "This will drop the unused CSS on each page from the combined file."
4886
  msgstr ""
4887
 
4888
+ #: tpl/page_optm/settings_css.tpl.php:68
4889
  msgid ""
4890
  "Automatic generation of unique CSS is in the background via a cron-based "
4891
  "queue."
4892
  msgstr ""
4893
 
4894
+ #: tpl/page_optm/settings_css.tpl.php:69
4895
  msgid "Filter %s available for UCSS per page type generation."
4896
  msgstr ""
4897
 
4898
+ #: tpl/page_optm/settings_css.tpl.php:73
4899
  msgid "This option is bypassed because %1$s option is %2$s."
4900
  msgstr ""
4901
 
4902
+ #: tpl/page_optm/settings_css.tpl.php:86 tpl/page_optm/settings_css.tpl.php:196
4903
  msgid "Last requested cost"
4904
  msgstr ""
4905
 
4906
+ #: tpl/page_optm/settings_css.tpl.php:98 tpl/page_optm/settings_css.tpl.php:208
4907
+ #: tpl/page_optm/settings_vpi.tpl.php:54
4908
  msgid "URL list in %s queue waiting for cron"
4909
  msgstr ""
4910
 
4911
+ #: tpl/page_optm/settings_css.tpl.php:119
4912
+ #: tpl/page_optm/settings_css.tpl.php:229 tpl/page_optm/settings_vpi.tpl.php:74
4913
  msgid "Run %s Queue Manually"
4914
  msgstr ""
4915
 
4916
+ #: tpl/page_optm/settings_css.tpl.php:135
4917
  msgid ""
4918
  "Inline UCSS to reduce the extra CSS file loading. This option will not be "
4919
  "automatically turned on for %1$s pages. To use it on %1$s pages, please set "
4920
  "it to ON."
4921
  msgstr ""
4922
 
4923
+ #: tpl/page_optm/settings_css.tpl.php:137
4924
  msgid "This option will automatically bypass %s option."
4925
  msgstr ""
4926
 
4927
+ #: tpl/page_optm/settings_css.tpl.php:151
4928
  msgid ""
4929
  "Include external CSS and inline CSS in combined file when %1$s is also "
4930
  "enabled. This option helps maintain the priorities of CSS, which should "
4931
  "minimize potential errors caused by CSS Combine."
4932
  msgstr ""
4933
 
4934
+ #: tpl/page_optm/settings_css.tpl.php:170
4935
  msgid "Optimize CSS delivery."
4936
  msgstr ""
4937
 
4938
+ #: tpl/page_optm/settings_css.tpl.php:171
4939
  #: tpl/page_optm/settings_html.tpl.php:129 tpl/page_optm/settings_js.tpl.php:67
4940
  msgid ""
4941
  "This can improve your speed score in services like Pingdom, GTmetrix and "
4942
  "PageSpeed."
4943
  msgstr ""
4944
 
4945
+ #: tpl/page_optm/settings_css.tpl.php:172
4946
  msgid ""
4947
  "Use QUIC.cloud online service to generate critical CSS and load remaining "
4948
  "CSS asynchronously."
4949
  msgstr ""
4950
 
4951
+ #: tpl/page_optm/settings_css.tpl.php:174
4952
  msgid ""
4953
  "Automatic generation of critical CSS is in the background via a cron-based "
4954
  "queue."
4955
  msgstr ""
4956
 
4957
+ #: tpl/page_optm/settings_css.tpl.php:175
4958
  msgid ""
4959
  "When this option is turned %s, it will also load Google Fonts asynchronously."
4960
  msgstr ""
4961
 
4962
+ #: tpl/page_optm/settings_css.tpl.php:178
4963
  msgid "Elements with attribute %s in HTML code will be excluded."
4964
  msgstr ""
4965
 
4966
+ #: tpl/page_optm/settings_css.tpl.php:183
4967
  msgid "This option is bypassed due to %s option."
4968
  msgstr ""
4969
 
4970
+ #: tpl/page_optm/settings_css.tpl.php:244
4971
  msgid ""
4972
  "Disable this option to generate CCSS per Post Type instead of per page. This "
4973
  "can save significant CCSS quota, however it may result in incorrect CSS "
4974
  "styling if your site uses a page builder."
4975
  msgstr ""
4976
 
4977
+ #: tpl/page_optm/settings_css.tpl.php:257
4978
  msgid "This will inline the asynchronous CSS library to avoid render blocking."
4979
  msgstr ""
4980
 
4981
+ #: tpl/page_optm/settings_css.tpl.php:268
4982
  msgid "Default"
4983
  msgstr ""
4984
 
4985
+ #: tpl/page_optm/settings_css.tpl.php:270
4986
  msgid ""
4987
  "Set this to append %1$s to all %2$s rules before caching CSS to specify how "
4988
  "fonts should be displayed while being downloaded."
4989
  msgstr ""
4990
 
4991
+ #: tpl/page_optm/settings_css.tpl.php:271
4992
  msgid "%s is recommended."
4993
  msgstr ""
4994
 
4995
+ #: tpl/page_optm/settings_css.tpl.php:271
4996
  msgid "Swap"
4997
  msgstr ""
4998
 
5142
  msgid "Localize external resources."
5143
  msgstr ""
5144
 
5145
+ #: tpl/page_optm/settings_localization.tpl.php:98
5146
+ msgid ""
5147
+ "Please thoroughly test all items in %s to ensure they function as expected."
5148
+ msgstr ""
5149
+
5150
+ #: tpl/page_optm/settings_localization.tpl.php:120
5151
  msgid "Resources listed here will be copied and replaced with local URLs."
5152
  msgstr ""
5153
 
5154
+ #: tpl/page_optm/settings_localization.tpl.php:121
5155
  msgid "HTTPS sources only."
5156
  msgstr ""
5157
 
5158
+ #: tpl/page_optm/settings_localization.tpl.php:125
5159
  msgid ""
5160
  "Comments are supported. Start a line with a %s to turn it into a comment "
5161
  "line."
5162
  msgstr ""
5163
 
5164
+ #: tpl/page_optm/settings_localization.tpl.php:127
5165
+ #: tpl/toolbox/beta_test.tpl.php:30
5166
+ msgid "Example"
5167
  msgstr ""
5168
 
5169
+ #: tpl/page_optm/settings_localization.tpl.php:131
5170
+ msgid ""
5171
+ "Please thoroughly test each JS file you add to ensure it functions as "
5172
+ "expected."
5173
  msgstr ""
5174
 
5175
  #: tpl/page_optm/settings_media.tpl.php:27
5302
  "and improve CLS (a Core Web Vitals metric)."
5303
  msgstr ""
5304
 
5305
+ #: tpl/page_optm/settings_media.tpl.php:236
5306
+ msgid "Use %1$s to bypass remote image dimension check when %2$s is ON."
5307
  msgstr ""
5308
 
5309
  #: tpl/page_optm/settings_media_exc.tpl.php:21
5439
  msgid "Selected roles will be excluded from all optimizations."
5440
  msgstr ""
5441
 
5442
+ #: tpl/page_optm/settings_vpi.tpl.php:26
5443
+ msgid ""
5444
+ "When you use Lazy Load, it will delay the loading of all images on a page."
5445
+ msgstr ""
5446
+
5447
+ #: tpl/page_optm/settings_vpi.tpl.php:27
5448
+ msgid ""
5449
+ "The Viewport Images service detects which images appear above the fold, and "
5450
+ "excludes them from lazy load."
5451
+ msgstr ""
5452
+
5453
+ #: tpl/page_optm/settings_vpi.tpl.php:28
5454
+ msgid ""
5455
+ "This enables the page's initial screenful of imagery to be fully displayed "
5456
+ "without delay."
5457
+ msgstr ""
5458
+
5459
+ #: tpl/page_optm/settings_vpi.tpl.php:90
5460
+ msgid "Enable Viewport Images auto generation cron."
5461
+ msgstr ""
5462
+
5463
+ #: tpl/toolbox/beta_test.tpl.php:25
5464
  msgid "Try GitHub Version"
5465
  msgstr ""
5466
 
5467
+ #: tpl/toolbox/beta_test.tpl.php:29
5468
  msgid ""
5469
  "Use this section to switch plugin versions. To beta test a GitHub commit, "
5470
  "enter the commit URL in the field below."
5471
  msgstr ""
5472
 
5473
+ #: tpl/toolbox/beta_test.tpl.php:34
5474
  msgid "Use latest GitHub Dev commit"
5475
  msgstr ""
5476
 
5477
+ #: tpl/toolbox/beta_test.tpl.php:36
5478
  msgid "Use latest GitHub Master commit"
5479
  msgstr ""
5480
 
5481
+ #: tpl/toolbox/beta_test.tpl.php:38 tpl/toolbox/beta_test.tpl.php:54
5482
  msgid "Use latest WordPress release version"
5483
  msgstr ""
5484
 
5485
+ #: tpl/toolbox/beta_test.tpl.php:38
5486
  msgid "OR"
5487
  msgstr ""
5488
 
5489
+ #: tpl/toolbox/beta_test.tpl.php:49
5490
  msgid ""
5491
  "Downgrade not recommended. May cause fatal error due to refactored code."
5492
  msgstr ""
5493
 
5494
+ #: tpl/toolbox/beta_test.tpl.php:53
5495
  msgid ""
5496
  "Press the %s button to use the most recent GitHub commit. Master is for "
5497
  "release candidate & Dev is for experimental testing."
5498
  msgstr ""
5499
 
5500
+ #: tpl/toolbox/beta_test.tpl.php:53
5501
  msgid "Use latest GitHub Dev/Master commit"
5502
  msgstr ""
5503
 
5504
+ #: tpl/toolbox/beta_test.tpl.php:54
5505
  msgid ""
5506
  "Press the %s button to stop beta testing and go back to the current release "
5507
  "from the WordPress Plugin Directory."
5508
  msgstr ""
5509
 
5510
+ #: tpl/toolbox/beta_test.tpl.php:59
5511
  msgid ""
5512
  "In order to avoid an upgrade error, you must be using %1$s or later before "
5513
  "you can upgrade to %2$s versions."
5561
  msgid "Report"
5562
  msgstr ""
5563
 
5564
+ #: tpl/toolbox/entry.tpl.php:23 tpl/toolbox/settings-debug.tpl.php:22
5565
  msgid "Debug Settings"
5566
  msgstr ""
5567
 
5742
  #: tpl/toolbox/purge.tpl.php:116
5743
  msgid ""
5744
  "Purge the cache entries created by this plugin except for Critical CSS & "
5745
+ "Unique CSS & LQIP caches"
5746
  msgstr ""
5747
 
5748
  #: tpl/toolbox/purge.tpl.php:125
5880
  msgid "Generated links may be managed under <a %s>Settings</a>."
5881
  msgstr ""
5882
 
 
 
 
 
5883
  #: tpl/toolbox/report.tpl.php:85
5884
  msgid "Optional"
5885
  msgstr ""
5899
  "the WordPress support forum."
5900
  msgstr ""
5901
 
5902
+ #: tpl/toolbox/settings-debug.tpl.php:9
5903
+ msgid "Debug Helpers"
5904
+ msgstr ""
5905
+
5906
+ #: tpl/toolbox/settings-debug.tpl.php:13
5907
+ msgid "View Site Before Optimization"
5908
+ msgstr ""
5909
+
5910
+ #: tpl/toolbox/settings-debug.tpl.php:17
5911
+ msgid "View Site Before Cache"
5912
+ msgstr ""
5913
+
5914
+ #: tpl/toolbox/settings-debug.tpl.php:35
5915
  msgid ""
5916
  "This will disable LSCache and all optimization features for debug purpose."
5917
  msgstr ""
5918
 
5919
+ #: tpl/toolbox/settings-debug.tpl.php:46
5920
  msgid "Admin IP Only"
5921
  msgstr ""
5922
 
5923
+ #: tpl/toolbox/settings-debug.tpl.php:48
5924
  msgid "Outputs to WordPress debug log."
5925
  msgstr ""
5926
 
5927
+ #: tpl/toolbox/settings-debug.tpl.php:49
5928
  msgid ""
5929
  "To prevent filling up the disk, this setting should be OFF when everything "
5930
  "is working."
5931
  msgstr ""
5932
 
5933
+ #: tpl/toolbox/settings-debug.tpl.php:50
5934
  msgid ""
5935
  "The Admin IP option will only output log messages on requests from admin IPs."
5936
  msgstr ""
5937
 
5938
+ #: tpl/toolbox/settings-debug.tpl.php:51
5939
  msgid "The logs will be output to %s."
5940
  msgstr ""
5941
 
5942
+ #: tpl/toolbox/settings-debug.tpl.php:64
5943
  msgid ""
5944
  "Allows listed IPs (one per line) to perform certain actions from their "
5945
  "browsers."
5946
  msgstr ""
5947
 
5948
+ #: tpl/toolbox/settings-debug.tpl.php:65
5949
  msgid "Your IP"
5950
  msgstr ""
5951
 
5952
+ #: tpl/toolbox/settings-debug.tpl.php:70
5953
  msgid "More information about the available commands can be found here."
5954
  msgstr ""
5955
 
5956
+ #: tpl/toolbox/settings-debug.tpl.php:82
5957
  msgid "Basic"
5958
  msgstr ""
5959
 
5960
+ #: tpl/toolbox/settings-debug.tpl.php:84
5961
  msgid "Advanced level will log more details."
5962
  msgstr ""
5963
 
5964
+ #: tpl/toolbox/settings-debug.tpl.php:95
5965
  msgid "MB"
5966
  msgstr ""
5967
 
5968
+ #: tpl/toolbox/settings-debug.tpl.php:97
5969
  msgid "Specify the maximum size of the log file."
5970
  msgstr ""
5971
 
5972
+ #: tpl/toolbox/settings-debug.tpl.php:112
5973
  msgid "Log requested cookie values."
5974
  msgstr ""
5975
 
5976
+ #: tpl/toolbox/settings-debug.tpl.php:125
5977
  msgid "Shorten query strings in the debug log to improve readability."
5978
  msgstr ""
5979
 
5980
+ #: tpl/toolbox/settings-debug.tpl.php:138
5981
  msgid "Only log listed pages."
5982
  msgstr ""
5983
 
5984
+ #: tpl/toolbox/settings-debug.tpl.php:152
5985
  msgid "Prevent any debug log of listed pages."
5986
  msgstr ""
5987
 
5988
+ #: tpl/toolbox/settings-debug.tpl.php:166
5989
+ msgid "Prevent writing log entries that include listed strings."
5990
+ msgstr ""
5991
+
5992
  #. Plugin URI of the plugin/theme
5993
  msgid ""
5994
  "https://www.litespeedtech.com/products/cache-plugins/wordpress-acceleration"
lib/css-min/urirewriter.cls.php CHANGED
@@ -291,8 +291,8 @@ class UriRewriter
291
  return $m[0];
292
  }
293
 
294
- // if not root/scheme relative and not starts with scheme
295
- if (!preg_match('~^(/|[a-z]+\:)~', $uri)) {
296
  // URI is file-relative: rewrite depending on options
297
  if (self::$_prependPath === null) {
298
  $uri = self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks);
291
  return $m[0];
292
  }
293
 
294
+ // if not anchor id, not root/scheme relative, and not starts with scheme
295
+ if (!preg_match('~^(#|/|[a-z]+\:)~', $uri)) {
296
  // URI is file-relative: rewrite depending on options
297
  if (self::$_prependPath === null) {
298
  $uri = self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks);
lib/object-cache.php CHANGED
@@ -36,8 +36,11 @@ if ( ! $lscwp_dir || ! file_exists( $data_file ) || ( ! file_exists( $lib_file )
36
  }
37
  }
38
  else {
 
 
 
39
  // Init object cache & LSCWP
40
- if ( file_exists( $lib_file ) ) {
41
  require_once $lib_file;
42
  }
43
  }
36
  }
37
  }
38
  else {
39
+ if ( ! LSCWP_OBJECT_CACHE ) { // Disable cache
40
+ wp_using_ext_object_cache(false);
41
+ }
42
  // Init object cache & LSCWP
43
+ else if ( file_exists( $lib_file ) ) {
44
  require_once $lib_file;
45
  }
46
  }
litespeed-cache.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: LiteSpeed Cache
4
  * Plugin URI: https://www.litespeedtech.com/products/cache-plugins/wordpress-acceleration
5
  * Description: High-performance page caching and site optimization from LiteSpeed
6
- * Version: 4.6
7
  * Author: LiteSpeed Technologies
8
  * Author URI: https://www.litespeedtech.com
9
  * License: GPLv3
@@ -33,7 +33,7 @@ if ( defined( 'LSCWP_V' ) ) {
33
  return;
34
  }
35
 
36
- ! defined( 'LSCWP_V' ) && define( 'LSCWP_V', '4.6' );
37
 
38
  ! defined( 'LSCWP_CONTENT_DIR' ) && define( 'LSCWP_CONTENT_DIR', WP_CONTENT_DIR ) ;
39
  ! defined( 'LSCWP_DIR' ) && define( 'LSCWP_DIR', __DIR__ . '/' ) ;// Full absolute path '/var/www/html/***/wp-content/plugins/litespeed-cache/' or MU
3
  * Plugin Name: LiteSpeed Cache
4
  * Plugin URI: https://www.litespeedtech.com/products/cache-plugins/wordpress-acceleration
5
  * Description: High-performance page caching and site optimization from LiteSpeed
6
+ * Version: 5.0
7
  * Author: LiteSpeed Technologies
8
  * Author URI: https://www.litespeedtech.com
9
  * License: GPLv3
33
  return;
34
  }
35
 
36
+ ! defined( 'LSCWP_V' ) && define( 'LSCWP_V', '5.0' );
37
 
38
  ! defined( 'LSCWP_CONTENT_DIR' ) && define( 'LSCWP_CONTENT_DIR', WP_CONTENT_DIR ) ;
39
  ! defined( 'LSCWP_DIR' ) && define( 'LSCWP_DIR', __DIR__ . '/' ) ;// Full absolute path '/var/www/html/***/wp-content/plugins/litespeed-cache/' or MU
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: LiteSpeedTech
3
  Tags: caching, optimize, performance, pagespeed, core web vitals, seo, speed, image optimize, compress, object cache, redis, memcached, database cleaner
4
  Requires at least: 4.0
5
- Tested up to: 5.9.2
6
- Stable tag: 4.6
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl.html
9
 
@@ -250,6 +250,42 @@ The vast majority of plugins and themes are compatible with LiteSpeed Cache. The
250
 
251
  == Changelog ==
252
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
  = 4.6 - Mar 29 2022 =
254
  * **Page Optimize** Improved compatibility for JS Delay.
255
  * 🐞**Page Optimize** Fixed an issue for network subsites that occurred when only CSS/JS Minify are enabled.
2
  Contributors: LiteSpeedTech
3
  Tags: caching, optimize, performance, pagespeed, core web vitals, seo, speed, image optimize, compress, object cache, redis, memcached, database cleaner
4
  Requires at least: 4.0
5
+ Tested up to: 6.0.1
6
+ Stable tag: 5.0
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl.html
9
 
250
 
251
  == Changelog ==
252
 
253
+ = 5.0 - Jul 25 2022 =
254
+ * 🌱**VPI** Added Viewport Images feature to LiteSpeed Options metabox on Post Edit page.
255
+ * 🌱**CDN** Added Auto CDN Setup feature for simple QUIC.cloud CDN setup. (Kevin)
256
+ * 🌱**Page Optimize** Automatically cache remote CSS/JS files when fetching for optimization (Lauren)
257
+ * 🌱**Cache** Added LiteSpeed Options for page-level cache control on Post Edit page. (denisgomesfranco)
258
+ * 🌱**Cloud** Auto Alias feature.
259
+ * 🌱**Debug** Added `Debug String Excludes` option. (Hanna)
260
+ * 🌱**UCSS** Added `Purge this page - UCSS` option to Admin Bar dropdown menu. (Ankit)
261
+ * 🌱**Guest** Added `litespeed_guest_off=1` URL query string parameter to bypass Guest Mode. (cbdfactum)
262
+ * 🐞**Page Optimize** Fixed an issue where CSS anchors could be wrongly converted to a full path when minifying. (Tynan)
263
+ * **Page Optimize** Bypass CCSS/UCSS generation when a self-crawled CSS resource returns a 404 code. (Abe)
264
+ * **Object** Allow `LSCWP_OBJECT_CACHE` predefined to turn off Object Cache. (knutsp)
265
+ * **Data** Fixed an issue where empty version tags in the database repeatedly toggled the upgrade banner and reset settings to default.
266
+ * **Purge** Fixed an issue where the site's index page could be purged upon deletion of an unviewable post. (Kevin)
267
+ * **Toolbox** Added `View site before optimization` button under `Debug` tab. (Ryan D)
268
+ * **Admin** Switch to using the `DONOTCACHEPAGE` constant to indicated WP-Admin pages are not cacheable.
269
+ * **Admin** Moved no-cache header to very beginning to avoid caching unexpected exits.
270
+ * **Cloud** Added message queue service for VPI. (Abe)
271
+ * **Cloud** Bypassed 503 error nodes from node redetection process. (Abe)
272
+ * **Cloud** Fixed a failure to detect `out_of_quota`. (Lauren)
273
+ * **Cloud** Added ability to display dismissable banners generated by QUIC.cloud.
274
+ * 🕸️**Crawler** Added realtime load detection before crawl.
275
+ * 🕸️**Crawler** Adjusted crawler behavior for Divi pages to allow for Divi's CCSS generation process. (miketemby)
276
+ * 🕸️**API** PHP constant `LITESPEED_CRAWLER_DISABLE_BLOCKLIST` and filter `litespeed_crawler_disable_blocklist` to disable blocklist. (Tobolo)
277
+ * **CDN** Automatically add a trailing slash to `CDN URL` and `Original URLs` if user didn't provide one. (Lucas)
278
+ * **Cache** When a URL redirects to a URL with a query string, consider these as different for caching purposes. (Shivam)
279
+ * **Media** Added ability to disable lazyload from the LiteSpeed Options metabox on Post Edit page.
280
+ * **Media** Added new default values to `WebP Attribute to Replace` setting for WPBakery and Slider Revolution. (JibsouX)
281
+ * **Image Optimize** Dropped redundant `Page Speed` user agent when serving WebP images. (serpentdriver)
282
+ * **GUI** Fixed an issue where manually dismissable admin messages were instead being treated as one-time messages. (Tynan Beatty)
283
+ * **GUI** Fixed an issue where subsequent admin alerts would overwrite existing alerts in the queue. (Kevin/Tynan)
284
+ * **GUI** Updated time offset in log. (Ruikai #PR444 #PR445)
285
+ * **GUI** Added `litespeed_media_ignore_remote_missing_sizes` API description.
286
+ * **CCSS** Fixed an issue where CCSS was unexpectedly bypassed if `CSS Combine` was OFF and `UCSS Inline` was ON. (Ruikai)
287
+ * **Debug** Added resposne headers to debug log. (Kevin)
288
+
289
  = 4.6 - Mar 29 2022 =
290
  * **Page Optimize** Improved compatibility for JS Delay.
291
  * 🐞**Page Optimize** Fixed an issue for network subsites that occurred when only CSS/JS Minify are enabled.
src/activation.cls.php CHANGED
@@ -614,16 +614,15 @@ class Activation extends Base {
614
  break;
615
 
616
  case self::TYPE_DISMISS_RECOMMENDED:
617
- $summary = Cloud::get_summary();
618
- $summary[ 'news.new' ] = 0;
619
- Cloud::save_summary( $summary );
620
  break;
621
 
622
  case self::TYPE_INSTALL_ZIP:
 
623
  $summary = Cloud::get_summary();
624
  if ( ! empty( $summary[ 'news.zip' ] ) ) {
625
- $summary[ 'news.new' ] = 0;
626
- Cloud::save_summary( $summary );
627
 
628
  $this->cls( 'Debug2' )->beta_test( $summary[ 'zip' ] );
629
  }
614
  break;
615
 
616
  case self::TYPE_DISMISS_RECOMMENDED:
617
+ Cloud::reload_summary();
618
+ Cloud::save_summary( array( 'news.new' => 0 ) );
 
619
  break;
620
 
621
  case self::TYPE_INSTALL_ZIP:
622
+ Cloud::reload_summary();
623
  $summary = Cloud::get_summary();
624
  if ( ! empty( $summary[ 'news.zip' ] ) ) {
625
+ Cloud::save_summary( array( 'news.new' => 0 ) );
 
626
 
627
  $this->cls( 'Debug2' )->beta_test( $summary[ 'zip' ] );
628
  }
src/admin-display.cls.php CHANGED
@@ -13,6 +13,8 @@ namespace LiteSpeed;
13
  defined( 'WPINC' ) || exit;
14
 
15
  class Admin_Display extends Base {
 
 
16
  const NOTICE_BLUE = 'notice notice-info';
17
  const NOTICE_GREEN = 'notice notice-success';
18
  const NOTICE_RED = 'notice notice-error';
@@ -86,6 +88,8 @@ class Admin_Display extends Base {
86
  else {
87
  add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );
88
  }
 
 
89
  }
90
 
91
  /**
@@ -313,6 +317,10 @@ class Admin_Display extends Base {
313
  else {
314
  $cls .= ' is-dismissible';
315
  }
 
 
 
 
316
  return '<div class="' . $cls . '"><p>'. $str . '</p></div>';
317
  }
318
 
@@ -342,9 +350,13 @@ class Admin_Display extends Base {
342
  * @since 1.6
343
  * @access public
344
  */
345
- public static function succeed( $msg, $echo = false, $irremovable = false ) {
346
  self::add_notice( self::NOTICE_GREEN, $msg, $echo, $irremovable );
347
  }
 
 
 
 
348
 
349
  /**
350
  * Display error notice
@@ -356,6 +368,35 @@ class Admin_Display extends Base {
356
  self::add_notice( self::NOTICE_RED, $msg, $echo, $irremovable );
357
  }
358
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
359
  /**
360
  * Adds a notice to display on the admin page
361
  *
@@ -390,7 +431,7 @@ class Admin_Display extends Base {
390
 
391
  $msg_name = $irremovable ? self::DB_MSG_PIN : self::DB_MSG;
392
 
393
- $messages = self::get_option( $msg_name );
394
  if ( ! is_array( $messages ) ) {
395
  $messages = array();
396
  }
@@ -462,9 +503,9 @@ class Admin_Display extends Base {
462
  echo $msg;
463
  }
464
  }
465
- if ( $messages != -1 ) {
466
- self::update_option( self::DB_MSG_PIN, -1 );
467
- }
468
 
469
  if( empty( $_GET[ 'page' ] ) || strpos( $_GET[ 'page' ], 'litespeed' ) !== 0 ) {
470
  global $pagenow;
@@ -506,7 +547,7 @@ class Admin_Display extends Base {
506
  return;
507
  }
508
 
509
- $messages = self::get_option( self::DB_MSG_PIN );
510
  if ( ! is_array( $messages ) || empty( $messages[ $_GET[ 'msgid' ] ] ) ) {
511
  return;
512
  }
@@ -560,6 +601,16 @@ class Admin_Display extends Base {
560
  require_once LSCWP_DIR . 'tpl/cdn/entry.tpl.php';
561
  }
562
 
 
 
 
 
 
 
 
 
 
 
563
  /**
564
  * Outputs the LiteSpeed Cache settings page.
565
  *
@@ -838,7 +889,7 @@ class Admin_Display extends Base {
838
  $title_off = __( 'OFF', 'litespeed-cache' );
839
  }
840
  $cls = $checked ? 'primary' : 'default litespeed-toggleoff';
841
- echo "<div class='litespeed-toggle litespeed-toggle-btn litespeed-toggle-btn-$cls' data-litespeed-toggle-on='primary' data-litespeed-toggle-off='default' data-litespeed_crawler_id='$id' >
842
  <input name='$id' type='hidden' value='$checked' />
843
  <div class='litespeed-toggle-group'>
844
  <label class='litespeed-toggle-btn litespeed-toggle-btn-primary litespeed-toggle-on'>$title_on</label>
13
  defined( 'WPINC' ) || exit;
14
 
15
  class Admin_Display extends Base {
16
+ const LOG_TAG = '👮‍♀️';
17
+
18
  const NOTICE_BLUE = 'notice notice-info';
19
  const NOTICE_GREEN = 'notice notice-success';
20
  const NOTICE_RED = 'notice notice-error';
88
  else {
89
  add_action( 'admin_menu', array( $this, 'register_admin_menu' ) );
90
  }
91
+
92
+ $this->cls( 'Metabox' )->register_settings();
93
  }
94
 
95
  /**
317
  else {
318
  $cls .= ' is-dismissible';
319
  }
320
+
321
+ // possible translation
322
+ $str = Lang::maybe_translate( $str );
323
+
324
  return '<div class="' . $cls . '"><p>'. $str . '</p></div>';
325
  }
326
 
350
  * @since 1.6
351
  * @access public
352
  */
353
+ public static function success( $msg, $echo = false, $irremovable = false ) {
354
  self::add_notice( self::NOTICE_GREEN, $msg, $echo, $irremovable );
355
  }
356
+ /** @deprecated 4.7 */
357
+ public static function succeed( $msg, $echo = false, $irremovable = false ) {
358
+ self::success( $msg, $echo, $irremovable );
359
+ }
360
 
361
  /**
362
  * Display error notice
368
  self::add_notice( self::NOTICE_RED, $msg, $echo, $irremovable );
369
  }
370
 
371
+ /**
372
+ * Add irremovable msg
373
+ * @since 4.7
374
+ */
375
+ public static function add_unique_notice( $color_mode, $msgs, $irremovable = false ) {
376
+ if ( ! is_array( $msgs ) ) $msgs = array( $msgs );
377
+
378
+ $color_map = array(
379
+ 'info' => self::NOTICE_BLUE,
380
+ 'note' => self::NOTICE_YELLOW,
381
+ 'success' => self::NOTICE_GREEN,
382
+ 'error' => self::NOTICE_RED,
383
+ );
384
+ if ( empty( $color_map[ $color_mode ] ) ) {
385
+ self::debug( 'Wrong admin display color mode!' );
386
+ return;
387
+ }
388
+ $color = $color_map[ $color_mode ];
389
+
390
+ // Go through to make sure unique
391
+ $filtered_msgs = array();
392
+ foreach ( $msgs as $k => $str ) {
393
+ if( is_numeric( $k ) ) $k = md5( $str ); // Use key to make it overwriteable to previous same msg
394
+ $filtered_msgs[ $k ] = $str;
395
+ }
396
+
397
+ self::add_notice( $color, $filtered_msgs, false, $irremovable );
398
+ }
399
+
400
  /**
401
  * Adds a notice to display on the admin page
402
  *
431
 
432
  $msg_name = $irremovable ? self::DB_MSG_PIN : self::DB_MSG;
433
 
434
+ $messages = self::get_option( $msg_name, array() );
435
  if ( ! is_array( $messages ) ) {
436
  $messages = array();
437
  }
503
  echo $msg;
504
  }
505
  }
506
+ // if ( $messages != -1 ) {
507
+ // self::update_option( self::DB_MSG_PIN, -1 );
508
+ // }
509
 
510
  if( empty( $_GET[ 'page' ] ) || strpos( $_GET[ 'page' ], 'litespeed' ) !== 0 ) {
511
  global $pagenow;
547
  return;
548
  }
549
 
550
+ $messages = self::get_option( self::DB_MSG_PIN, array() );
551
  if ( ! is_array( $messages ) || empty( $messages[ $_GET[ 'msgid' ] ] ) ) {
552
  return;
553
  }
601
  require_once LSCWP_DIR . 'tpl/cdn/entry.tpl.php';
602
  }
603
 
604
+ /**
605
+ * Displays the CDN page.
606
+ *
607
+ * @since 3.0
608
+ * @access public
609
+ */
610
+ public function show_menu_auto_cdn_setup() {
611
+ require_once LSCWP_DIR . 'tpl/auto_cdn_setup/entry.tpl.php';
612
+ }
613
+
614
  /**
615
  * Outputs the LiteSpeed Cache settings page.
616
  *
889
  $title_off = __( 'OFF', 'litespeed-cache' );
890
  }
891
  $cls = $checked ? 'primary' : 'default litespeed-toggleoff';
892
+ echo "<div class='litespeed-toggle litespeed-toggle-btn litespeed-toggle-btn-$cls' data-litespeed-toggle-on='primary' data-litespeed-toggle-off='default' data-litespeed_toggle_id='$id' >
893
  <input name='$id' type='hidden' value='$checked' />
894
  <div class='litespeed-toggle-group'>
895
  <label class='litespeed-toggle-btn litespeed-toggle-btn-primary litespeed-toggle-on'>$title_on</label>
src/admin-settings.cls.php CHANGED
@@ -107,7 +107,10 @@ class Admin_Settings extends Base {
107
  if ( $child == self::CDN_MAPPING_FILETYPE ) {
108
  $v = Utility::sanitize_lines( $v );
109
  }
110
- elseif ( in_array( $child, array(
 
 
 
111
  self::CDN_MAPPING_INC_IMG,
112
  self::CDN_MAPPING_INC_CSS,
113
  self::CDN_MAPPING_INC_JS,
107
  if ( $child == self::CDN_MAPPING_FILETYPE ) {
108
  $v = Utility::sanitize_lines( $v );
109
  }
110
+ if ( $child == self::CDN_MAPPING_URL ) {
111
+ $v = trailingslashit( $v );
112
+ }
113
+ if ( in_array( $child, array(
114
  self::CDN_MAPPING_INC_IMG,
115
  self::CDN_MAPPING_INC_CSS,
116
  self::CDN_MAPPING_INC_JS,
src/admin.cls.php CHANGED
@@ -13,6 +13,8 @@ namespace LiteSpeed;
13
  defined( 'WPINC' ) || exit;
14
 
15
  class Admin extends Root {
 
 
16
  const PAGE_EDIT_HTACCESS = 'litespeed-edit-htaccess';
17
 
18
  /**
@@ -27,6 +29,9 @@ class Admin extends Root {
27
  define( 'LSCWP_MU_PLUGIN', true );
28
  }
29
 
 
 
 
30
  // Additional litespeed assets on admin display
31
  // Also register menu
32
  $this->cls( 'Admin_Display' );
@@ -63,8 +68,6 @@ class Admin extends Root {
63
  * @access public
64
  */
65
  public function admin_init() {
66
- Control::set_nocache( 'Admin page' );
67
-
68
  // Hook attachment upload
69
  if ( $this->conf( Base::O_IMG_OPTM_AUTO ) ) {
70
  add_filter( 'wp_update_attachment_metadata', array( $this, 'wp_update_attachment_metadata' ), 9999, 2 );
13
  defined( 'WPINC' ) || exit;
14
 
15
  class Admin extends Root {
16
+ const LOG_TAG = '👮';
17
+
18
  const PAGE_EDIT_HTACCESS = 'litespeed-edit-htaccess';
19
 
20
  /**
29
  define( 'LSCWP_MU_PLUGIN', true );
30
  }
31
 
32
+ self::debug( 'No cache due to Admin page' );
33
+ defined( 'DONOTCACHEPAGE' ) || define( 'DONOTCACHEPAGE', true );
34
+
35
  // Additional litespeed assets on admin display
36
  // Also register menu
37
  $this->cls( 'Admin_Display' );
68
  * @access public
69
  */
70
  public function admin_init() {
 
 
71
  // Hook attachment upload
72
  if ( $this->conf( Base::O_IMG_OPTM_AUTO ) ) {
73
  add_filter( 'wp_update_attachment_metadata', array( $this, 'wp_update_attachment_metadata' ), 9999, 2 );
src/avatar.cls.php CHANGED
@@ -226,8 +226,7 @@ class Avatar extends Base {
226
  $file = $this->_realpath( $url );
227
 
228
  // Update request status
229
- $this->_summary[ 'curr_request' ] = time();
230
- self::save_summary();
231
 
232
  // Generate
233
  $this->_maybe_mk_cache_folder( 'avatar' );
@@ -245,10 +244,11 @@ class Avatar extends Base {
245
  }
246
 
247
  // Save summary data
248
- $this->_summary[ 'last_spent' ] = time() - $this->_summary[ 'curr_request' ];
249
- $this->_summary[ 'last_request' ] = $this->_summary[ 'curr_request' ];
250
- $this->_summary[ 'curr_request' ] = 0;
251
- self::save_summary();
 
252
 
253
  // Update DB
254
  $md5 = md5( $url );
226
  $file = $this->_realpath( $url );
227
 
228
  // Update request status
229
+ self::save_summary( array( 'curr_request' => time() ) );
 
230
 
231
  // Generate
232
  $this->_maybe_mk_cache_folder( 'avatar' );
244
  }
245
 
246
  // Save summary data
247
+ self::save_summary( array(
248
+ 'last_spent' => time() - $this->_summary[ 'curr_request' ],
249
+ 'last_request' => $this->_summary[ 'curr_request' ],
250
+ 'curr_request' => 0,
251
+ ) );
252
 
253
  // Update DB
254
  $md5 = md5( $url );
src/base.cls.php CHANGED
@@ -109,6 +109,7 @@ class Base extends Root {
109
  const O_DEBUG_COLLAPS_QS = 'debug-collaps_qs';
110
  const O_DEBUG_INC = 'debug-inc';
111
  const O_DEBUG_EXC = 'debug-exc';
 
112
 
113
  ## -------------------------------------------------- ##
114
  ## -------------- DB Optm ----------------- ##
@@ -202,6 +203,8 @@ class Base extends Root {
202
  const O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC = 'media-iframe_lazy_parent_cls_exc';
203
  const O_MEDIA_LAZY_URI_EXC = 'media-lazy_uri_exc';
204
  const O_MEDIA_LQIP_EXC = 'media-lqip_exc';
 
 
205
 
206
  ## -------------------------------------------------- ##
207
  ## -------------- Image Optm ----------------- ##
@@ -260,6 +263,8 @@ class Base extends Root {
260
  const O_CDN_CLOUDFLARE_ZONE = 'cdn-cloudflare_zone';
261
  const O_CDN_MAPPING = 'cdn-mapping';
262
  const O_CDN_ATTR = 'cdn-attr';
 
 
263
 
264
  const NETWORK_O_USE_PRIMARY = 'use_primary_settings';
265
 
@@ -310,6 +315,8 @@ class Base extends Root {
310
  self::O_CDN_CLOUDFLARE_ZONE,
311
  self::O_CDN_MAPPING,
312
  self::O_CDN_ATTR,
 
 
313
  );
314
 
315
  protected static $_default_options = array(
@@ -394,6 +401,7 @@ class Base extends Root {
394
  self::O_DEBUG_COLLAPS_QS => false,
395
  self::O_DEBUG_INC => array(),
396
  self::O_DEBUG_EXC => array(),
 
397
 
398
  // DB Optm
399
  self::O_DB_OPTM_REVISIONS_MAX => 0,
@@ -477,6 +485,8 @@ class Base extends Root {
477
  self::O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC => array(),
478
  self::O_MEDIA_LAZY_URI_EXC => array(),
479
  self::O_MEDIA_LQIP_EXC => array(),
 
 
480
 
481
  // Image Optm
482
  self::O_IMG_OPTM_AUTO => false,
@@ -528,6 +538,9 @@ class Base extends Root {
528
  self::O_CDN_MAPPING => array(),
529
  self::O_CDN_ATTR => array(),
530
 
 
 
 
531
  );
532
 
533
  protected static $_default_site_options = array(
@@ -573,6 +586,7 @@ class Base extends Root {
573
  self::O_DEBUG_COLLAPS_QS => false,
574
  self::O_DEBUG_INC => array(),
575
  self::O_DEBUG_EXC => array(),
 
576
 
577
  self::O_IMG_OPTM_WEBP_REPLACE => false,
578
 
@@ -814,7 +828,7 @@ class Base extends Root {
814
  self::O_OPTM_CCSS_SEP_URI => 'uri',
815
  // self::O_OPTM_JS_DEFER_EXC => 'uri',
816
  self::O_OPTM_DNS_PREFETCH => 'domain',
817
- self::O_CDN_ORI => 'noprotocol', // `Original URLs`
818
  // self::O_OPTM_LOCALIZE_DOMAINS => 'noprotocol', // `Localize Resources`
819
  // self:: => '',
820
  // self:: => '',
@@ -872,6 +886,7 @@ class Base extends Root {
872
  self::O_CDN_CLOUDFLARE_KEY,
873
  self::O_OBJECT_PSWD,
874
  self::O_API_KEY,
 
875
  );
876
 
877
  return in_array( $id, $check_ids );
109
  const O_DEBUG_COLLAPS_QS = 'debug-collaps_qs';
110
  const O_DEBUG_INC = 'debug-inc';
111
  const O_DEBUG_EXC = 'debug-exc';
112
+ const O_DEBUG_EXC_STRINGS = 'debug-exc_strings';
113
 
114
  ## -------------------------------------------------- ##
115
  ## -------------- DB Optm ----------------- ##
203
  const O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC = 'media-iframe_lazy_parent_cls_exc';
204
  const O_MEDIA_LAZY_URI_EXC = 'media-lazy_uri_exc';
205
  const O_MEDIA_LQIP_EXC = 'media-lqip_exc';
206
+ const O_MEDIA_VPI = 'media-vpi';
207
+ const O_MEDIA_VPI_CRON = 'media-vpi_cron';
208
 
209
  ## -------------------------------------------------- ##
210
  ## -------------- Image Optm ----------------- ##
263
  const O_CDN_CLOUDFLARE_ZONE = 'cdn-cloudflare_zone';
264
  const O_CDN_MAPPING = 'cdn-mapping';
265
  const O_CDN_ATTR = 'cdn-attr';
266
+ const O_QC_TOKEN = 'qc-token';
267
+ const O_QC_NAMESERVERS = 'qc-nameservers';
268
 
269
  const NETWORK_O_USE_PRIMARY = 'use_primary_settings';
270
 
315
  self::O_CDN_CLOUDFLARE_ZONE,
316
  self::O_CDN_MAPPING,
317
  self::O_CDN_ATTR,
318
+ self::O_QC_TOKEN,
319
+ self::O_QC_NAMESERVERS,
320
  );
321
 
322
  protected static $_default_options = array(
401
  self::O_DEBUG_COLLAPS_QS => false,
402
  self::O_DEBUG_INC => array(),
403
  self::O_DEBUG_EXC => array(),
404
+ self::O_DEBUG_EXC_STRINGS => array(),
405
 
406
  // DB Optm
407
  self::O_DB_OPTM_REVISIONS_MAX => 0,
485
  self::O_MEDIA_IFRAME_LAZY_PARENT_CLS_EXC => array(),
486
  self::O_MEDIA_LAZY_URI_EXC => array(),
487
  self::O_MEDIA_LQIP_EXC => array(),
488
+ self::O_MEDIA_VPI => false,
489
+ self::O_MEDIA_VPI_CRON => false,
490
 
491
  // Image Optm
492
  self::O_IMG_OPTM_AUTO => false,
538
  self::O_CDN_MAPPING => array(),
539
  self::O_CDN_ATTR => array(),
540
 
541
+ self::O_QC_TOKEN => '',
542
+ self::O_QC_NAMESERVERS => '',
543
+
544
  );
545
 
546
  protected static $_default_site_options = array(
586
  self::O_DEBUG_COLLAPS_QS => false,
587
  self::O_DEBUG_INC => array(),
588
  self::O_DEBUG_EXC => array(),
589
+ self::O_DEBUG_EXC_STRINGS => array(),
590
 
591
  self::O_IMG_OPTM_WEBP_REPLACE => false,
592
 
828
  self::O_OPTM_CCSS_SEP_URI => 'uri',
829
  // self::O_OPTM_JS_DEFER_EXC => 'uri',
830
  self::O_OPTM_DNS_PREFETCH => 'domain',
831
+ self::O_CDN_ORI => 'noprotocol,trailingslash', // `Original URLs`
832
  // self::O_OPTM_LOCALIZE_DOMAINS => 'noprotocol', // `Localize Resources`
833
  // self:: => '',
834
  // self:: => '',
886
  self::O_CDN_CLOUDFLARE_KEY,
887
  self::O_OBJECT_PSWD,
888
  self::O_API_KEY,
889
+ self::O_QC_TOKEN,
890
  );
891
 
892
  return in_array( $id, $check_ids );
src/cdn-setup.cls.php ADDED
@@ -0,0 +1,389 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * CDN Setup service cls
4
+ *
5
+ * @since 3.0
6
+ */
7
+ namespace LiteSpeed;
8
+ defined( 'WPINC' ) || exit;
9
+
10
+ class Cdn_Setup extends Base {
11
+ const LOG_TAG = '👷';
12
+
13
+ const TYPE_LINK = 'link';
14
+ const TYPE_NOLINK = 'nolink';
15
+ const TYPE_RUN = 'setup';
16
+ const TYPE_STATUS = 'status';
17
+ const TYPE_RESET = 'reset';
18
+ const TYPE_DELETE = 'delete';
19
+
20
+ private $_setup_token;
21
+ protected $_summary;
22
+
23
+ /**
24
+ * Init
25
+ *
26
+ * @since 3.0
27
+ */
28
+ public function __construct() {
29
+ $this->_setup_token = $this->conf( self::O_QC_TOKEN );
30
+ $this->_summary = self::get_summary();
31
+ }
32
+
33
+ /**
34
+ * Update is_linked status if is a redirected back from QC
35
+ *
36
+ * @since 3.0
37
+ */
38
+ public function maybe_extract_token() {
39
+ $params = $this->cls( 'Cloud' )->parse_qc_redir( [ 'token' ] );
40
+
41
+ if ( isset( $params[ 'token' ] ) ) {
42
+ $this->_setup_token = $params[ 'token' ];
43
+ $this->cls( 'Conf' )->update_confs( array( self::O_QC_TOKEN => $this->_setup_token ) );
44
+ unset( $_GET[ 'token' ] );
45
+ }
46
+
47
+ }
48
+
49
+ /**
50
+ * Callback for updating Auto CDN Setup status after run
51
+ *
52
+ * @since 4.7
53
+ * @access public
54
+ */
55
+ public function update_cdn_status() {
56
+
57
+ if ( !isset( $_POST[ 'success' ] ) || !isset( $_POST[ 'result' ] ) ) {
58
+ self::save_summary( array( 'cdn_setup_err' => __( 'Received invalid message from the cloud server. Please submit a ticket.', 'litespeed-cache' ) ) );
59
+ return self::err( 'lack_of_param' );
60
+ }
61
+ if (!$_POST[ 'success' ]) {
62
+ self::save_summary( array( 'cdn_setup_err' => $_POST[ 'result' ][ '_msg' ] ) );
63
+ Admin_Display::error( __( 'There was an error during CDN setup: ', 'litespeed-cache' ) . $_POST[ 'result' ][ '_msg' ] );
64
+ } else {
65
+ $this->_process_cdn_status($_POST[ 'result' ]);
66
+ }
67
+
68
+ return self::ok();
69
+ }
70
+
71
+ /**
72
+ * Request an update on Auto CDN Setup status
73
+ *
74
+ * @since 4.7
75
+ * @access private
76
+ */
77
+ private function _qc_refresh() {
78
+
79
+ $json = $this->cls('Cloud')->req_rest_api('/user/cdn/status');
80
+
81
+ if (!$json) {
82
+ return;
83
+ } else if (is_string($json)) {
84
+ self::save_summary( array( 'cdn_setup_err' => $json ) );
85
+ return;
86
+ }
87
+
88
+ $result = array();
89
+ if (isset($json['info']['messages'])) {
90
+ $result['_msg'] = implode('<br>', $json['info']['messages']);
91
+ }
92
+ $this->_process_cdn_status($result);
93
+ }
94
+
95
+ /**
96
+ * Process the returned Auto CDN Setup status
97
+ *
98
+ * @since 4.7
99
+ * @access private
100
+ */
101
+ private function _process_cdn_status($result) {
102
+
103
+ if ( isset($result[ 'nameservers' ] ) ) {
104
+ if (isset($this->_summary['cdn_setup_err'])) {
105
+ unset($this->_summary['cdn_setup_err']);
106
+ }
107
+ if (isset($result[ 'summary' ])) {
108
+ $this->_summary[ 'cdn_dns_summary' ] = $result[ 'summary' ];
109
+ }
110
+ $this->cls( 'Cloud' )->set_linked();
111
+ $this->cls( 'Conf' )->update_confs( array( self::O_QC_NAMESERVERS => $result[ 'nameservers' ], self::O_CDN_QUIC => true ) );
112
+ Admin_Display::succeed( '🎊 ' . __( 'Congratulations, QUIC.cloud successfully set this domain up for the CDN. Please update your nameservers to:', 'litespeed-cache' ) . $result[ 'nameservers' ] );
113
+ } else if ( isset($result[ 'done' ] ) ) {
114
+ if ( isset( $this->_summary[ 'cdn_setup_err' ] ) ) {
115
+ unset( $this->_summary[ 'cdn_setup_err' ] );
116
+ }
117
+ if ( isset( $this->_summary[ 'cdn_verify_msg' ] ) ) {
118
+ unset( $this->_summary[ 'cdn_verify_msg' ] );
119
+ }
120
+ $this->_summary[ 'cdn_setup_done_ts' ] = time();
121
+
122
+ $this->_setup_token = '';
123
+ $this->cls( 'Conf' )->update_confs( array( self::O_QC_TOKEN => '', self::O_QC_NAMESERVERS => '' ) );
124
+ } else if ( isset($result[ '_msg' ] ) ) {
125
+ $notice = $result[ '_msg' ];
126
+ if ( $this->conf( Base::O_QC_NAMESERVERS )) {
127
+ $this->_summary[ 'cdn_verify_msg' ] = $result[ '_msg' ];
128
+ $notice = array('cdn_verify_msg' => $result[ '_msg' ]);
129
+ }
130
+ Admin_Display::succeed( $notice );
131
+ } else {
132
+ Admin_Display::succeed( __( 'CDN Setup is running.', 'litespeed-cache' ) );
133
+ }
134
+ self::save_summary();
135
+ }
136
+
137
+ /**
138
+ * Process the returned Auto CDN Setup status
139
+ *
140
+ * @since 4.7
141
+ * @access private
142
+ */
143
+ private function _qc_reset($delete) {
144
+ $data = array(
145
+ 'site_url' => home_url(),
146
+ );
147
+
148
+ if ($delete) {
149
+ $data['delete'] = 1;
150
+ }
151
+
152
+ if (!empty($this->_setup_token)) {
153
+ $data['rest'] = function_exists( 'rest_get_url_prefix' ) ? rest_get_url_prefix() : apply_filters( 'rest_url_prefix', 'wp-json' );
154
+
155
+ $json = $this->cls('Cloud')->req_rest_api('/user/cdn/reset', $data);
156
+
157
+ if (!$json) {
158
+ return;
159
+ } else if (is_string($json)) {
160
+ self::save_summary( array( 'cdn_setup_err' => $json ) );
161
+ return;
162
+ }
163
+ } else if ( ! isset( $this->_summary[ 'cdn_setup_done_ts' ] ) || ! $this->_summary[ 'cdn_setup_done_ts' ] ) {
164
+ Admin_Display::info( __( 'Notice: CDN Setup only reset locally.', 'litespeed-cache'));
165
+ } else if ( ! Cloud::get_summary( 'is_linked' ) ) {
166
+
167
+ Admin_Display::error( __( 'Cannot delete, site is not linked.', 'litespeed-cache' ) );
168
+ return;
169
+
170
+ } else {
171
+
172
+ $json = Cloud::post( Cloud::SVC_D_DEL_CDN_DNS, $data);
173
+
174
+ if (!is_array($json)) {
175
+ return;
176
+ }
177
+ }
178
+
179
+ if ( isset( $this->_summary[ 'cdn_setup_ts' ] ) ) {
180
+ unset( $this->_summary[ 'cdn_setup_ts' ] );
181
+ }
182
+ if ( isset( $this->_summary[ 'cdn_setup_done_ts' ] ) ) {
183
+ unset( $this->_summary[ 'cdn_setup_done_ts' ] );
184
+ }
185
+ if ( isset( $this->_summary[ 'cdn_setup_err' ] ) ) {
186
+ unset( $this->_summary[ 'cdn_setup_err' ] );
187
+ }
188
+ if ( isset( $this->_summary[ 'cdn_verify_msg' ] ) ) {
189
+ unset( $this->_summary[ 'cdn_verify_msg' ] );
190
+ }
191
+ if ( isset( $this->_summary[ 'cdn_dns_summary' ] ) ) {
192
+ unset( $this->_summary[ 'cdn_dns_summary' ] );
193
+ }
194
+ self::save_summary();
195
+
196
+ $this->_setup_token = '';
197
+ $this->cls( 'Conf' )->update_confs( array( self::O_QC_TOKEN => '', self::O_QC_NAMESERVERS => '', self::O_CDN_QUIC => false ) );
198
+ $msg = '';
199
+ if ($delete) {
200
+ $msg = __( 'CDN Setup Token and DNS zone deleted. Note: if my.quic.cloud account deletion is desired, that the account still exists and must be deleted separately.', 'litespeed-cache' );
201
+ } else {
202
+ $msg = __( 'CDN Setup Token reset. Note: if my.quic.cloud account deletion is desired, that the account still exists and must be deleted separately.', 'litespeed-cache' );
203
+ }
204
+ Admin_Display::succeed( $msg );
205
+ return self::ok();
206
+ }
207
+
208
+ /**
209
+ * If setup token already exists or not
210
+ *
211
+ * @since 4.7
212
+ */
213
+ public function has_cdn_setup_token() {
214
+ return !empty( $this->_setup_token );
215
+ }
216
+
217
+ /**
218
+ * Get QC user setup token
219
+ *
220
+ * This method initiates a link to a QUIC.cloud account.
221
+ *
222
+ * @since 4.7
223
+ */
224
+ private function _qc_link() {
225
+ if ( $this->has_cdn_setup_token() ) {
226
+ return;
227
+ }
228
+
229
+ $data = array(
230
+ 'site_url' => home_url(),
231
+ 'ref' => get_admin_url( null, 'admin.php?page=litespeed-cdn' ),
232
+ );
233
+
234
+ if ($this->_api_key) {
235
+ $data['domain_hash'] = md5( substr( $this->_api_key, 0, 8 ) );
236
+ }
237
+
238
+ wp_redirect( Cloud::CLOUD_SERVER_DASH . '/u/wptoken?data=' . Utility::arr2str( $data ) );
239
+ exit;
240
+ }
241
+
242
+ /**
243
+ * Get QC user setup token
244
+ *
245
+ * This method is used when the installation is already linked to an account.
246
+ *
247
+ * @since 4.7
248
+ */
249
+ private function _qc_nolink() {
250
+ if ( $this->has_cdn_setup_token() ) {
251
+ return;
252
+ }
253
+
254
+ $data = array(
255
+ 'site_url' => home_url(),
256
+ );
257
+
258
+ $json = Cloud::post( Cloud::SVC_D_SETUP_TOKEN, $data);
259
+
260
+ if (isset($json[ 'token' ])) {
261
+ self::save_summary( array( 'cdn_setup_ts' => time() ) );
262
+ $this->_setup_token = $json[ 'token' ];
263
+ $this->cls( 'Conf' )->update_confs( array( self::O_QC_TOKEN => $this->_setup_token ) );
264
+ }
265
+ }
266
+
267
+ /**
268
+ * Initiate or continue a QC CDN Setup.
269
+ *
270
+ * @since 4.7
271
+ */
272
+ private function _qc_run() {
273
+
274
+ $data = array(
275
+ 'site_url' => home_url(),
276
+ 'rest' => function_exists( 'rest_get_url_prefix' ) ? rest_get_url_prefix() : apply_filters( 'rest_url_prefix', 'wp-json' ),
277
+ 'server_ip' => $this->conf( self::O_SERVER_IP ),
278
+ );
279
+
280
+ if ( $this->_api_key ) {
281
+ $data['domain_hash'] = md5( substr( $this->_api_key, 0, 8 ) );
282
+ }
283
+
284
+ $__cloud = $this->cls( 'Cloud' );
285
+ $json = $__cloud->req_rest_api('/user/cdn/', $data);
286
+
287
+ if (!$json) {
288
+ return;
289
+ } else if (is_string($json)) {
290
+ self::save_summary( array( 'cdn_setup_err' => $json ) );
291
+ return;
292
+ }
293
+
294
+ $this->_summary[ 'cdn_setup_ts' ] = time();
295
+
296
+ $msg = '';
297
+ if (isset($json['info']['messages'])) {
298
+ $msg = implode('<br>', $json['info']['messages']);
299
+ }
300
+
301
+ $json = $json['result'];
302
+
303
+ if ( isset( $this->_summary[ 'cdn_setup_err' ] ) ) {
304
+ unset( $this->_summary[ 'cdn_setup_err' ] );
305
+ }
306
+
307
+ if ( isset( $this->_summary[ 'cdn_verify_msg' ] ) ) {
308
+ unset( $this->_summary[ 'cdn_verify_msg' ] );
309
+ }
310
+ self::save_summary();
311
+
312
+ // Save token option
313
+ if ( ! empty( $json[ 'token' ] ) ) {
314
+ $__cloud->set_keygen_token( $json[ 'token' ] );
315
+ }
316
+
317
+ // This is a ok msg
318
+ if ( ! empty( $msg ) ) {
319
+ self::debug( '_msg: ' . $msg );
320
+
321
+ $msg = __( 'Message from QUIC.cloud server', 'litespeed-cache' ) . ': ' . $msg;
322
+ Admin_Display::info( $msg );
323
+ return;
324
+ }
325
+
326
+ self::debug( '✅ Successfully start CDN setup.' );
327
+ }
328
+
329
+ /**
330
+ * Return succeeded response
331
+ *
332
+ * @since 3.0
333
+ */
334
+ public static function ok( $data = array() ) {
335
+ $data[ '_res' ] = 'ok';
336
+ return $data;
337
+ }
338
+
339
+ /**
340
+ * Return error
341
+ *
342
+ * @since 3.0
343
+ */
344
+ public static function err( $code ) {
345
+ return array( '_res' => 'err', '_msg' => $code );
346
+ }
347
+
348
+ /**
349
+ * Handle all request actions from main cls
350
+ *
351
+ * @since 3.0
352
+ * @access public
353
+ */
354
+ public function handler() {
355
+ $type = Router::verify_type();
356
+
357
+ switch ( $type ) {
358
+
359
+ case self::TYPE_LINK:
360
+ $this->_qc_link();
361
+ break;
362
+
363
+ case self::TYPE_NOLINK:
364
+ $this->_qc_nolink();
365
+ break;
366
+
367
+ case self::TYPE_RUN:
368
+ $this->_qc_run();
369
+ break;
370
+
371
+ case self::TYPE_STATUS:
372
+ $this->_qc_refresh();
373
+ break;
374
+
375
+ case self::TYPE_RESET:
376
+ $this->_qc_reset(false);
377
+ break;
378
+
379
+ case self::TYPE_DELETE:
380
+ $this->_qc_reset(true);
381
+ break;
382
+
383
+ default:
384
+ break;
385
+ }
386
+
387
+ Admin::redirect();
388
+ }
389
+ }
src/cloud.cls.php CHANGED
@@ -17,10 +17,14 @@ class Cloud extends Base {
17
  const SVC_D_NODES = 'd/nodes';
18
  const SVC_D_SYNC_CONF = 'd/sync_conf';
19
  const SVC_D_USAGE = 'd/usage';
 
 
20
  const SVC_PAGE_OPTM = 'page_optm';
21
  const SVC_CCSS = 'ccss';
22
  const SVC_UCSS = 'ucss';
 
23
  const SVC_LQIP = 'lqip';
 
24
  const SVC_IMG_OPTM = 'img_optm';
25
  const SVC_HEALTH = 'health';
26
  const SVC_CDN = 'cdn';
@@ -50,6 +54,8 @@ class Cloud extends Base {
50
  self::API_REPORT,
51
  // self::API_VER,
52
  // self::API_BETA_TEST,
 
 
53
  );
54
 
55
  private static $WP_SVC_SET = array(
@@ -66,9 +72,14 @@ class Cloud extends Base {
66
  self::API_BETA_TEST,
67
  );
68
 
 
 
 
 
69
  public static $SERVICES_LOAD_CHECK = array(
70
  self::SVC_CCSS,
71
  self::SVC_UCSS,
 
72
  self::SVC_LQIP,
73
  self::SVC_HEALTH,
74
  );
@@ -78,9 +89,11 @@ class Cloud extends Base {
78
  self::SVC_PAGE_OPTM,
79
  self::SVC_CCSS,
80
  self::SVC_UCSS,
 
81
  self::SVC_LQIP,
82
  self::SVC_CDN,
83
  self::SVC_HEALTH,
 
84
  );
85
 
86
  const TYPE_CLEAR_PROMO = 'clear_promo';
@@ -91,6 +104,7 @@ class Cloud extends Base {
91
  const TYPE_SYNC_USAGE = 'sync_usage';
92
 
93
  private $_api_key;
 
94
  protected $_summary;
95
 
96
  /**
@@ -100,6 +114,7 @@ class Cloud extends Base {
100
  */
101
  public function __construct() {
102
  $this->_api_key = $this->conf( self::O_API_KEY );
 
103
  $this->_summary = self::get_summary();
104
  }
105
 
@@ -115,11 +130,10 @@ class Cloud extends Base {
115
 
116
  $last_check = empty( $this->_summary[ 'last_request.' . self::API_VER ] ) ? 0 : $this->_summary[ 'last_request.' . self::API_VER ] ;
117
 
118
- if ( time() - $last_check > 600 ) {
119
  $auto_v = self::version_check( 'dev' );
120
  if ( ! empty( $auto_v[ 'dev' ] ) ) {
121
- $this->_summary[ 'version.dev' ] = $auto_v[ 'dev' ];
122
- self::save_summary( $this->_summary );
123
  }
124
  }
125
 
@@ -181,12 +195,11 @@ class Cloud extends Base {
181
  * @since 2.9.9.1
182
  */
183
  private function _update_news() {
184
- if ( ! empty( $this->_summary[ 'news.utime' ] ) && time() - $this->_summary[ 'news.utime' ] < 86400 * 3 ) {
185
  return;
186
  }
187
 
188
- $this->_summary[ 'news.utime' ] = time();
189
- self::save_summary();
190
 
191
  $data = self::get( self::API_NEWS );
192
  if ( empty( $data[ 'id' ] ) ) {
@@ -240,7 +253,7 @@ class Cloud extends Base {
240
  $this->sync_usage();
241
  }
242
 
243
- if ( in_array( $service, array( self::SVC_CCSS, self::SVC_UCSS ) ) ) { // @since 4.2
244
  $service = self::SVC_PAGE_OPTM;
245
  }
246
 
@@ -362,7 +375,7 @@ class Cloud extends Base {
362
  }
363
 
364
  // Send request to Quic Online Service
365
- $json = $this->_post( self::SVC_D_NODES, array( 'svc' => $service ) );
366
 
367
  // Check if get list correctly
368
  if ( empty( $json[ 'list' ] ) || ! is_array( $json[ 'list' ] ) ) {
@@ -376,12 +389,22 @@ class Cloud extends Base {
376
  return false;
377
  }
378
 
 
379
  // Ping closest cloud
380
  $speed_list = array();
381
  foreach ( $json[ 'list' ] as $v ) {
 
 
 
 
382
  $speed_list[ $v ] = Utility::ping( $v );
383
  }
384
 
 
 
 
 
 
385
  $min = min( $speed_list );
386
 
387
  if ( $min == 99999 ) {
@@ -454,6 +477,14 @@ class Cloud extends Base {
454
  return $this->_summary[ 'server.' . $service ];
455
  }
456
 
 
 
 
 
 
 
 
 
457
  /**
458
  * Get data from QUIC cloud server
459
  *
@@ -491,6 +522,7 @@ class Cloud extends Base {
491
  $param = array(
492
  'site_url' => home_url(),
493
  'domain_key' => $this->_api_key,
 
494
  'ver' => Core::VER,
495
  );
496
 
@@ -502,8 +534,7 @@ class Cloud extends Base {
502
 
503
  self::debug( 'getting from : ' . $url );
504
 
505
- $this->_summary[ 'curr_request.' . $service_tag ] = time();
506
- self::save_summary();
507
 
508
  $response = wp_remote_get( $url, array( 'timeout' => 15, 'sslverify' => true ) );
509
 
@@ -517,7 +548,13 @@ class Cloud extends Base {
517
  * @access private
518
  */
519
  private function _maybe_cloud( $service_tag ) {
520
- if ( ! wp_http_validate_url( home_url() ) ) {
 
 
 
 
 
 
521
  return false;
522
  }
523
 
@@ -526,6 +563,11 @@ class Cloud extends Base {
526
  return true;
527
  }
528
 
 
 
 
 
 
529
  $expiration_req = self::EXPIRATION_REQ;
530
  // Limit frequent unfinished request to 5min
531
  $timestamp_tag = 'curr_request.';
@@ -600,19 +642,23 @@ class Cloud extends Base {
600
  return;
601
  }
602
 
603
- $url = $server . '/' . $service;
604
 
605
  self::debug( 'posting to : ' . $url );
606
 
 
 
 
 
607
  $param = array(
608
  'site_url' => home_url(),
609
  'domain_key' => $this->_api_key,
 
610
  'ver' => Core::VER,
611
  'data' => $data,
612
  );
613
 
614
- $this->_summary[ 'curr_request.' . $service_tag ] = time();
615
- self::save_summary();
616
 
617
  $response = wp_remote_post( $url, array( 'body' => $param, 'timeout' => $time_out ?: 15, 'sslverify' => true ) );
618
 
@@ -634,6 +680,11 @@ class Cloud extends Base {
634
  $msg = __( 'Failed to request via WordPress', 'litespeed-cache' ) . ': ' . $error_message . " [server] $server [service] $service";
635
  Admin_Display::error( $msg );
636
 
 
 
 
 
 
637
  // Force redetect node
638
  self::debug( 'Node error, redetecting node [svc] ' . $service );
639
  $this->detect_cloud( $service, true );
@@ -650,6 +701,11 @@ class Cloud extends Base {
650
  $msg = __( 'Failed to request via WordPress', 'litespeed-cache' ) . ': ' . $response[ 'body' ] . " [server] $server [service] $service";
651
  Admin_Display::error( $msg );
652
 
 
 
 
 
 
653
  // Force redetect node
654
  self::debug( 'Node error, redetecting node [svc] ' . $service );
655
  $this->detect_cloud( $service, true );
@@ -681,6 +737,30 @@ class Cloud extends Base {
681
  return;
682
  }
683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
684
  if ( ! empty( $json[ '_info' ] ) ) {
685
  self::debug( '_info: ' . $json[ '_info' ] );
686
  $msg = __( 'Message from QUIC.cloud server', 'litespeed-cache' ) . ': ' . $json[ '_info' ];
@@ -715,18 +795,18 @@ class Cloud extends Base {
715
 
716
  $msg2 .= $this->_parse_link( $json );
717
  Admin_Display::error( $msg . $msg2 );
718
- return;
719
  }
720
 
721
  // Parse _carry_on info
722
  if ( ! empty( $json[ '_carry_on' ] ) ) {
723
  self::debug( 'Carry_on usage', $json[ '_carry_on' ] );
724
  // Store generic info
725
- foreach ( array( 'usage', 'promo' ) as $v ) {
726
  if ( ! empty( $json[ '_carry_on' ][ $v ] ) ) {
727
  switch ( $v ) {
728
  case 'usage':
729
- $usage_svc_tag = in_array( $service, array( self::SVC_CCSS, self::SVC_UCSS ) ) ? self::SVC_PAGE_OPTM : $service;
730
  $this->_summary[ 'usage.' . $usage_svc_tag ] = $json[ '_carry_on' ][ $v ];
731
  break;
732
 
@@ -737,6 +817,15 @@ class Cloud extends Base {
737
  $this->_summary[ $v ][] = $json[ '_carry_on' ][ $v ];
738
  break;
739
 
 
 
 
 
 
 
 
 
 
740
  default:
741
  break;
742
  }
@@ -747,25 +836,34 @@ class Cloud extends Base {
747
  }
748
 
749
  // Parse general error msg
750
- if ( empty( $json[ '_res' ] ) || $json[ '_res' ] !== 'ok' ) {
751
  $json_msg = ! empty( $json[ '_msg' ] ) ? $json[ '_msg' ] : 'unknown';
752
- self::debug( '❌ _err: ' . $json_msg );
753
 
754
- $msg = __( 'Failed to communicate with QUIC.cloud server', 'litespeed-cache' ) . ': ' . Error::msg( $json_msg ) . " [server] $server [service] $service";
 
755
  $msg .= $this->_parse_link( $json );
756
  Admin_Display::error( $msg );
757
 
 
 
 
 
 
 
 
 
 
 
 
 
 
758
  // Site not on QC, delete invalid domain key
759
  if ( $json_msg == 'site_not_registered' || $json_msg == 'err_key' ) {
760
- $this->cls( 'Conf' )->update_confs( array( self::O_API_KEY => '' ) );
761
-
762
- $msg = __( 'Site not recognized. Domain Key has been automatically removed. Please request a new one.', 'litespeed-cache' );
763
- $msg .= Doc::learn_more( admin_url( 'admin.php?page=litespeed-general' ), __( 'Click here to set.', 'litespeed-cache' ), true, false, true );
764
- $msg .= Doc::learn_more( 'https://docs.litespeedtech.com/lscache/lscwp/general/#domain-key', false, false, false, true );
765
- Admin_Display::error( $msg, false, true );
766
  }
767
 
768
- return;
769
  }
770
 
771
  unset( $json[ '_res' ] );
@@ -773,18 +871,130 @@ class Cloud extends Base {
773
  unset( $json[ '_msg' ] );
774
  }
775
 
776
- $this->_summary[ 'last_request.' . $service_tag ] = $this->_summary[ 'curr_request.' . $service_tag ];
777
- $this->_summary[ 'curr_request.' . $service_tag ] = 0;
 
 
 
 
 
 
 
 
778
  self::save_summary();
779
 
780
- if ( $json ) {
781
- self::debug2( 'response ok', $json );
 
 
 
 
 
 
 
 
 
 
 
 
782
  }
783
- else {
784
- self::debug2( 'response ok' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
785
  }
786
 
787
- // Only successful request return Array
788
  return $json;
789
  }
790
 
@@ -884,6 +1094,16 @@ class Cloud extends Base {
884
  return empty( $this->_summary[ 'token_ts' ] ) || time() - $this->_summary[ 'token_ts' ] > self::EXPIRATION_TOKEN;
885
  }
886
 
 
 
 
 
 
 
 
 
 
 
887
  /**
888
  * Send request for domain key, get json [ 'token' => 'asdfasdf' ]
889
  *
@@ -912,12 +1132,7 @@ class Cloud extends Base {
912
 
913
  // Save token option
914
  if ( ! empty( $json[ 'token' ] ) ) {
915
- $this->_summary[ 'token' ] = $json[ 'token' ];
916
- $this->_summary[ 'token_ts' ] = time();
917
- if ( ! empty( $this->_summary[ 'apikey_ts' ] ) ) {
918
- unset( $this->_summary[ 'apikey_ts' ] );
919
- }
920
- self::save_summary();
921
  }
922
 
923
  // Parse general error msg
@@ -994,6 +1209,9 @@ class Cloud extends Base {
994
 
995
  $this->_summary[ 'is_linked' ] = $_POST[ 'is_linked' ] ? 1 : 0;
996
  $this->_summary[ 'apikey_ts' ] = time();
 
 
 
997
  // Clear token
998
  unset( $this->_summary[ 'token' ] );
999
  self::save_summary();
@@ -1055,30 +1273,56 @@ class Cloud extends Base {
1055
  exit;
1056
  }
1057
 
 
 
 
 
 
1058
  /**
1059
  * Update is_linked status if is a redirected back from QC
1060
  *
1061
  * @since 3.0
 
1062
  */
1063
- public function update_is_linked_status() {
1064
- if ( empty( $_GET[ 'qc_res' ] ) || empty( $_GET[ 'domain_hash' ] ) ) {
1065
- return;
 
 
 
 
1066
  }
1067
 
1068
- if ( ! $this->_api_key ) {
1069
- return;
1070
  }
 
1071
 
1072
- if ( md5( substr( $this->_api_key, 2, 8 ) ) !== $_GET[ 'domain_hash' ] ) {
1073
- Admin_Display::error( __( 'Domain Key hash mismatch', 'litespeed-cache' ), true );
1074
- return;
 
 
 
 
 
 
1075
  }
1076
 
1077
- $this->_summary[ 'is_linked' ] = 1;
1078
- self::save_summary();
 
 
 
 
 
 
 
 
1079
 
1080
  // Drop QS
1081
- echo "<script>window.history.pushState( 'remove_gen_link', document.title, window.location.href.replace( '&qc_res=" . sanitize_key( $_GET[ 'qc_res' ] ) . "&domain_hash=" . sanitize_key( $_GET[ 'domain_hash' ] ) . "', '' ) );</script>";
 
1082
  }
1083
 
1084
  /**
@@ -1122,9 +1366,7 @@ class Cloud extends Base {
1122
 
1123
  $json = json_decode( $response[ 'body' ], true );
1124
 
1125
- $this->_summary[ 'ips_ts' ] = time();
1126
- $this->_summary[ 'ips' ] = $json;
1127
- self::save_summary();
1128
  }
1129
 
1130
  /**
17
  const SVC_D_NODES = 'd/nodes';
18
  const SVC_D_SYNC_CONF = 'd/sync_conf';
19
  const SVC_D_USAGE = 'd/usage';
20
+ const SVC_D_SETUP_TOKEN = 'd/get_token';
21
+ const SVC_D_DEL_CDN_DNS = 'd/del_cdn_dns';
22
  const SVC_PAGE_OPTM = 'page_optm';
23
  const SVC_CCSS = 'ccss';
24
  const SVC_UCSS = 'ucss';
25
+ const SVC_VPI = 'vpi';
26
  const SVC_LQIP = 'lqip';
27
+ const SVC_QUEUE = 'queue';
28
  const SVC_IMG_OPTM = 'img_optm';
29
  const SVC_HEALTH = 'health';
30
  const SVC_CDN = 'cdn';
54
  self::API_REPORT,
55
  // self::API_VER,
56
  // self::API_BETA_TEST,
57
+ self::SVC_D_SETUP_TOKEN,
58
+ self::SVC_D_DEL_CDN_DNS,
59
  );
60
 
61
  private static $WP_SVC_SET = array(
72
  self::API_BETA_TEST,
73
  );
74
 
75
+ private static $_QUEUE_SVC_SET = array(
76
+ self::SVC_VPI,
77
+ );
78
+
79
  public static $SERVICES_LOAD_CHECK = array(
80
  self::SVC_CCSS,
81
  self::SVC_UCSS,
82
+ // self::SVC_VPI,
83
  self::SVC_LQIP,
84
  self::SVC_HEALTH,
85
  );
89
  self::SVC_PAGE_OPTM,
90
  self::SVC_CCSS,
91
  self::SVC_UCSS,
92
+ self::SVC_VPI,
93
  self::SVC_LQIP,
94
  self::SVC_CDN,
95
  self::SVC_HEALTH,
96
+ // self::SVC_QUEUE,
97
  );
98
 
99
  const TYPE_CLEAR_PROMO = 'clear_promo';
104
  const TYPE_SYNC_USAGE = 'sync_usage';
105
 
106
  private $_api_key;
107
+ private $_setup_token;
108
  protected $_summary;
109
 
110
  /**
114
  */
115
  public function __construct() {
116
  $this->_api_key = $this->conf( self::O_API_KEY );
117
+ $this->_setup_token = $this->conf( self::O_QC_TOKEN );
118
  $this->_summary = self::get_summary();
119
  }
120
 
130
 
131
  $last_check = empty( $this->_summary[ 'last_request.' . self::API_VER ] ) ? 0 : $this->_summary[ 'last_request.' . self::API_VER ] ;
132
 
133
+ if ( time() - $last_check > 86400 ) {
134
  $auto_v = self::version_check( 'dev' );
135
  if ( ! empty( $auto_v[ 'dev' ] ) ) {
136
+ self::save_summary( array( 'version.dev' => $auto_v[ 'dev' ] ) );
 
137
  }
138
  }
139
 
195
  * @since 2.9.9.1
196
  */
197
  private function _update_news() {
198
+ if ( ! empty( $this->_summary[ 'news.utime' ] ) && time() - $this->_summary[ 'news.utime' ] < 86400 * 7 ) {
199
  return;
200
  }
201
 
202
+ self::save_summary( array( 'news.utime' => time() ) );
 
203
 
204
  $data = self::get( self::API_NEWS );
205
  if ( empty( $data[ 'id' ] ) ) {
253
  $this->sync_usage();
254
  }
255
 
256
+ if ( in_array( $service, array( self::SVC_CCSS, self::SVC_UCSS, self::SVC_VPI ) ) ) { // @since 4.2
257
  $service = self::SVC_PAGE_OPTM;
258
  }
259
 
375
  }
376
 
377
  // Send request to Quic Online Service
378
+ $json = $this->_post( self::SVC_D_NODES, array( 'svc' => $this->_maybe_queue( $service ) ) );
379
 
380
  // Check if get list correctly
381
  if ( empty( $json[ 'list' ] ) || ! is_array( $json[ 'list' ] ) ) {
389
  return false;
390
  }
391
 
392
+
393
  // Ping closest cloud
394
  $speed_list = array();
395
  foreach ( $json[ 'list' ] as $v ) {
396
+ // Exclude possible failed 503 nodes
397
+ if ( ! empty( $this->_summary['disabled_node'] ) && ! empty($this->_summary['disabled_node'][$v]) && time() - $this->_summary['disabled_node'][$v] < 86400 ) {
398
+ continue;
399
+ }
400
  $speed_list[ $v ] = Utility::ping( $v );
401
  }
402
 
403
+ if ( ! $speed_list ) {
404
+ self::debug( 'nodes are in 503 failed nodes' );
405
+ return false;
406
+ }
407
+
408
  $min = min( $speed_list );
409
 
410
  if ( $min == 99999 ) {
477
  return $this->_summary[ 'server.' . $service ];
478
  }
479
 
480
+ /**
481
+ * May need to convert to queue service
482
+ */
483
+ private function _maybe_queue( $service ) {
484
+ if ( in_array( $service, self::$_QUEUE_SVC_SET ) ) return self::SVC_QUEUE;
485
+ return $service;
486
+ }
487
+
488
  /**
489
  * Get data from QUIC cloud server
490
  *
522
  $param = array(
523
  'site_url' => home_url(),
524
  'domain_key' => $this->_api_key,
525
+ 'main_domain' => ! empty( $this->_summary[ 'main_domain' ] ) ? $this->_summary[ 'main_domain' ] : '',
526
  'ver' => Core::VER,
527
  );
528
 
534
 
535
  self::debug( 'getting from : ' . $url );
536
 
537
+ self::save_summary( array( 'curr_request.' . $service_tag => time() ) );
 
538
 
539
  $response = wp_remote_get( $url, array( 'timeout' => 15, 'sslverify' => true ) );
540
 
548
  * @access private
549
  */
550
  private function _maybe_cloud( $service_tag ) {
551
+ $home_url = home_url();
552
+ if ( ! wp_http_validate_url( $home_url ) ) {
553
+ return false;
554
+ }
555
+
556
+ /** @since 5.0 If in valid err_domains, bypass request */
557
+ if ( $this->_is_err_domain( $home_url ) ) {
558
  return false;
559
  }
560
 
563
  return true;
564
  }
565
 
566
+ if ( $service_tag == self::SVC_D_SYNC_CONF && $this->_setup_token && ! $this->_api_key ) {
567
+ self::debug( "Skip sync conf if API key is not available yet." );
568
+ return false;
569
+ }
570
+
571
  $expiration_req = self::EXPIRATION_REQ;
572
  // Limit frequent unfinished request to 5min
573
  $timestamp_tag = 'curr_request.';
642
  return;
643
  }
644
 
645
+ $url = $server . '/' . $this->_maybe_queue( $service );
646
 
647
  self::debug( 'posting to : ' . $url );
648
 
649
+ if ( $data ) {
650
+ $data[ 'service_type' ] = $service; // For queue distribution usage
651
+ }
652
+
653
  $param = array(
654
  'site_url' => home_url(),
655
  'domain_key' => $this->_api_key,
656
+ 'main_domain' => ! empty( $this->_summary[ 'main_domain' ] ) ? $this->_summary[ 'main_domain' ] : '',
657
  'ver' => Core::VER,
658
  'data' => $data,
659
  );
660
 
661
+ self::save_summary( array( 'curr_request.' . $service_tag => time() ) );
 
662
 
663
  $response = wp_remote_post( $url, array( 'body' => $param, 'timeout' => $time_out ?: 15, 'sslverify' => true ) );
664
 
680
  $msg = __( 'Failed to request via WordPress', 'litespeed-cache' ) . ': ' . $error_message . " [server] $server [service] $service";
681
  Admin_Display::error( $msg );
682
 
683
+ // Tmp disabled this node from reusing in 1 day
684
+ if (empty($this->_summary['disabled_node'])) $this->_summary['disabled_node'] = array();
685
+ $this->_summary['disabled_node'][$server] = time();
686
+ self::save_summary();
687
+
688
  // Force redetect node
689
  self::debug( 'Node error, redetecting node [svc] ' . $service );
690
  $this->detect_cloud( $service, true );
701
  $msg = __( 'Failed to request via WordPress', 'litespeed-cache' ) . ': ' . $response[ 'body' ] . " [server] $server [service] $service";
702
  Admin_Display::error( $msg );
703
 
704
+ // Tmp disabled this node from reusing in 1 day
705
+ if (empty($this->_summary['disabled_node'])) $this->_summary['disabled_node'] = array();
706
+ $this->_summary['disabled_node'][$server] = time();
707
+ self::save_summary();
708
+
709
  // Force redetect node
710
  self::debug( 'Node error, redetecting node [svc] ' . $service );
711
  $this->detect_cloud( $service, true );
737
  return;
738
  }
739
 
740
+ list( $json, $return ) = $this->extract_msg( $json, $service, $server );
741
+ if ( $return ) return;
742
+
743
+ self::save_summary( array(
744
+ 'last_request.' . $service_tag => $this->_summary[ 'curr_request.' . $service_tag ],
745
+ 'curr_request.' . $service_tag => 0
746
+ ));
747
+
748
+ if ( $json ) {
749
+ self::debug2( 'response ok', $json );
750
+ }
751
+ else {
752
+ self::debug2( 'response ok' );
753
+ }
754
+
755
+ // Only successful request return Array
756
+ return $json;
757
+ }
758
+
759
+ /**
760
+ * Extract msg from json
761
+ * @since 5.0
762
+ */
763
+ public function extract_msg( $json, $service, $server = false, $is_callback = false ) {
764
  if ( ! empty( $json[ '_info' ] ) ) {
765
  self::debug( '_info: ' . $json[ '_info' ] );
766
  $msg = __( 'Message from QUIC.cloud server', 'litespeed-cache' ) . ': ' . $json[ '_info' ];
795
 
796
  $msg2 .= $this->_parse_link( $json );
797
  Admin_Display::error( $msg . $msg2 );
798
+ return array( $json, true );
799
  }
800
 
801
  // Parse _carry_on info
802
  if ( ! empty( $json[ '_carry_on' ] ) ) {
803
  self::debug( 'Carry_on usage', $json[ '_carry_on' ] );
804
  // Store generic info
805
+ foreach ( array( 'usage', 'promo', '_err', '_info', '_note', '_success' ) as $v ) {
806
  if ( ! empty( $json[ '_carry_on' ][ $v ] ) ) {
807
  switch ( $v ) {
808
  case 'usage':
809
+ $usage_svc_tag = in_array( $service, array( self::SVC_CCSS, self::SVC_UCSS, self::SVC_VPI ) ) ? self::SVC_PAGE_OPTM : $service;
810
  $this->_summary[ 'usage.' . $usage_svc_tag ] = $json[ '_carry_on' ][ $v ];
811
  break;
812
 
817
  $this->_summary[ $v ][] = $json[ '_carry_on' ][ $v ];
818
  break;
819
 
820
+ case '_error':
821
+ case '_info':
822
+ case '_note':
823
+ case '_success':
824
+ $color_mode = substr( $v, 1 );
825
+ $msgs = $json[ '_carry_on' ][ $v ];
826
+ Admin_Display::add_unique_notice( $color_mode, $msgs, true );
827
+ break;
828
+
829
  default:
830
  break;
831
  }
836
  }
837
 
838
  // Parse general error msg
839
+ if ( !$is_callback && ( empty( $json[ '_res' ] ) || $json[ '_res' ] !== 'ok' ) ) {
840
  $json_msg = ! empty( $json[ '_msg' ] ) ? $json[ '_msg' ] : 'unknown';
841
+ self::debug( '❌ _err: ' . $json_msg, $json );
842
 
843
+ $str_translated = Error::msg( $json_msg );
844
+ $msg = __( 'Failed to communicate with QUIC.cloud server', 'litespeed-cache' ) . ': ' . $str_translated . " [server] $server [service] $service";
845
  $msg .= $this->_parse_link( $json );
846
  Admin_Display::error( $msg );
847
 
848
+ // QC may try auto alias
849
+ /** @since 5.0 Store the domain as `err_domains` only for QC auto alias feature */
850
+ if ( $json_msg == 'err_alias' ) {
851
+ if ( empty( $this->_summary[ 'err_domains' ] ) ) {
852
+ $this->_summary[ 'err_domains' ] = array();
853
+ }
854
+ $home_url = home_url();
855
+ if ( ! array_key_exists( $home_url, $this->_summary[ 'err_domains' ] ) ) {
856
+ $this->_summary[ 'err_domains' ][ $home_url ] = time();
857
+ }
858
+ self::save_summary();
859
+ }
860
+
861
  // Site not on QC, delete invalid domain key
862
  if ( $json_msg == 'site_not_registered' || $json_msg == 'err_key' ) {
863
+ $this->_clean_api_key();
 
 
 
 
 
864
  }
865
 
866
+ return array( $json, true );
867
  }
868
 
869
  unset( $json[ '_res' ] );
871
  unset( $json[ '_msg' ] );
872
  }
873
 
874
+ return array( $json, false );
875
+ }
876
+
877
+ /**
878
+ * Clear API key and QC linked status
879
+ * @since 5.0
880
+ */
881
+ private function _clean_api_key() {
882
+ $this->cls( 'Conf' )->update_confs( array( self::O_API_KEY => '' ) );
883
+ $this->_summary['is_linked'] = 0;
884
  self::save_summary();
885
 
886
+ $msg = __( 'Site not recognized. Domain Key has been automatically removed. Please request a new one.', 'litespeed-cache' );
887
+ $msg .= Doc::learn_more( admin_url( 'admin.php?page=litespeed-general' ), __( 'Click here to set.', 'litespeed-cache' ), true, false, true );
888
+ $msg .= Doc::learn_more( 'https://docs.litespeedtech.com/lscache/lscwp/general/#domain-key', false, false, false, true );
889
+ Admin_Display::error( $msg, false, true );
890
+ }
891
+
892
+ /**
893
+ * REST call: check if the error domain is valid call for auto alias purpose
894
+ * @since 5.0
895
+ */
896
+ public function rest_err_domains() {
897
+ // Validate token hash first
898
+ if ( empty( $_POST[ 'hash' ] ) || empty( $_POST[ 'main_domain' ] ) || empty( $_POST[ 'alias' ] ) ) {
899
+ return self::err( 'lack_of_param' );
900
  }
901
+
902
+ if ( ! $this->_api_key || $_POST[ 'hash' ] !== md5( substr( $this->_api_key, 1, 8 ) ) ) {
903
+ return self::err( 'wrong_hash' );
904
+ }
905
+
906
+ list( $post_data ) = $this->extract_msg( $_POST, 'Quic.cloud', false, true );
907
+
908
+ if ( $this->_is_err_domain( $_POST[ 'alias' ] ) ) {
909
+ $this->_remove_domain_from_err_list( $_POST[ 'alias' ] );
910
+
911
+ $res_hash = substr( $this->_api_key, 2, 4 );
912
+
913
+ self::debug( '__callback IP request hash: md5(' . $res_hash . ')' );
914
+
915
+ return self::ok( array( 'hash' => md5( $res_hash ) ) );
916
+ }
917
+
918
+ return self::err( 'Not an alias req from here' );
919
+ }
920
+
921
+ /**
922
+ * Remove a domain from err domain
923
+ * @since 5.0
924
+ */
925
+ private function _remove_domain_from_err_list( $url ) {
926
+ unset( $this->_summary[ 'err_domains' ][ $url ] );
927
+ self::save_summary();
928
+ }
929
+
930
+ /**
931
+ * Check if is err domain
932
+ * @since 5.0
933
+ */
934
+ private function _is_err_domain( $home_url ) {
935
+ if ( empty( $this->_summary[ 'err_domains' ] ) ) return false;
936
+ if ( ! array_key_exists( $home_url, $this->_summary[ 'err_domains' ] ) ) return false;
937
+ // Auto delete if too long ago
938
+ if ( time() - $this->_summary[ 'err_domains' ][ $home_url ] > 86400 * 10 ) {
939
+ $this->_remove_domain_from_err_list( $home_url );
940
+ }
941
+ if ( time() - $this->_summary[ 'err_domains' ][ $home_url ] > 86400 ) return false;
942
+ return true;
943
+ }
944
+
945
+ public function req_rest_api($api, $body = array())
946
+ {
947
+
948
+ $token = $this->_setup_token;
949
+
950
+ if (empty($token)) {
951
+
952
+ Admin_Display::error( __( 'Cannot request REST API, no token saved.', 'litespeed-cache' ));
953
+ return;
954
+ }
955
+ $req_args = array(
956
+ 'headers' => array(
957
+ 'Authorization' => 'bearer ' . $token,
958
+ 'Content-Type' => 'application/json',
959
+ ),
960
+ );
961
+ if (!empty($body)) {
962
+ $req_args['body'] = json_encode($body);
963
+
964
+ $response = wp_remote_post(self::CLOUD_SERVER . '/v2' . $api, $req_args);
965
+ } else {
966
+ $response = wp_remote_get(self::CLOUD_SERVER . '/v2' . $api, $req_args);
967
+ }
968
+
969
+ return $this->_parse_rest_response($response);
970
+ }
971
+
972
+ private function _parse_rest_response($response)
973
+ {
974
+ if ( is_wp_error( $response ) ) {
975
+
976
+ $error_message = $response->get_error_message();
977
+ self::debug( 'failed to request REST API: ' . $error_message );
978
+ Admin_Display::error( __( 'Cloud REST Error', 'litespeed-cache' ) . ': ' . $error_message );
979
+ return $error_message;
980
+ }
981
+
982
+ $json = json_decode( $response[ 'body' ], true );
983
+
984
+ if (!$json['success']) {
985
+ if (isset($json['info']['errors'])) {
986
+ $errs = array();
987
+ foreach ($json['info']['errors'] as $err) {
988
+ $errs[] = 'Error ' . $err['code'] . ': ' . $err['message'];
989
+ }
990
+ $error_message = implode('<br>', $errs);
991
+ } else {
992
+ $error_message = 'Unknown error, contact QUIC.cloud support.';
993
+ }
994
+ Admin_Display::error( __( 'Cloud REST API returned error: ', 'litespeed-cache' ) . $error_message );
995
+ return $error_message;
996
  }
997
 
 
998
  return $json;
999
  }
1000
 
1094
  return empty( $this->_summary[ 'token_ts' ] ) || time() - $this->_summary[ 'token_ts' ] > self::EXPIRATION_TOKEN;
1095
  }
1096
 
1097
+ public function set_keygen_token($token)
1098
+ {
1099
+ $this->_summary[ 'token' ] = $token;
1100
+ $this->_summary[ 'token_ts' ] = time();
1101
+ if ( ! empty( $this->_summary[ 'apikey_ts' ] ) ) {
1102
+ unset( $this->_summary[ 'apikey_ts' ] );
1103
+ }
1104
+ self::save_summary();
1105
+ }
1106
+
1107
  /**
1108
  * Send request for domain key, get json [ 'token' => 'asdfasdf' ]
1109
  *
1132
 
1133
  // Save token option
1134
  if ( ! empty( $json[ 'token' ] ) ) {
1135
+ $this->set_keygen_token( $json[ 'token' ] );
 
 
 
 
 
1136
  }
1137
 
1138
  // Parse general error msg
1209
 
1210
  $this->_summary[ 'is_linked' ] = $_POST[ 'is_linked' ] ? 1 : 0;
1211
  $this->_summary[ 'apikey_ts' ] = time();
1212
+ if ( ! empty( $_POST[ 'main_domain' ] ) ) {
1213
+ $this->_summary[ 'main_domain' ] = $_POST[ 'main_domain' ];
1214
+ }
1215
  // Clear token
1216
  unset( $this->_summary[ 'token' ] );
1217
  self::save_summary();
1273
  exit;
1274
  }
1275
 
1276
+ public function set_linked() {
1277
+ $this->_summary[ 'is_linked' ] = 1;
1278
+ self::save_summary();
1279
+ }
1280
+
1281
  /**
1282
  * Update is_linked status if is a redirected back from QC
1283
  *
1284
  * @since 3.0
1285
+ * @since 5.0 renamed update_is_linked_status -> parse_qc_redir, add param for additional args. Return args if exist.
1286
  */
1287
+ public function parse_qc_redir($extra = array()) {
1288
+
1289
+ $extraRet = array();
1290
+ $qsDrop = array();
1291
+ if ( ! $this->_api_key && $this->_summary[ 'is_linked' ]) {
1292
+ $this->_summary[ 'is_linked' ] = 0;
1293
+ self::save_summary();
1294
  }
1295
 
1296
+ if ( empty( $_GET[ 'qc_res' ] ) ) {
1297
+ return $extraRet;
1298
  }
1299
+ $qsDrop[] = ".replace( '&qc_res=" . sanitize_key( $_GET[ 'qc_res' ] ) . ', \'\' )';
1300
 
1301
+ if ( ! empty( $_GET[ 'domain_hash' ] ) ) {
1302
+
1303
+ if ( md5( substr( $this->_api_key, 2, 8 ) ) !== $_GET[ 'domain_hash' ] ) {
1304
+ Admin_Display::error( __( 'Domain Key hash mismatch', 'litespeed-cache' ), true );
1305
+ return $extraRet;
1306
+ }
1307
+
1308
+ $this->set_linked();
1309
+ $qsDrop[] = ".replace( '&domain_hash=" . sanitize_key( $_GET[ 'domain_hash' ] ) . ', \'\' )';
1310
  }
1311
 
1312
+ if ( ! empty( $extra ) ) {
1313
+ foreach ( $extra as $key ) {
1314
+ if ( ! empty( $_GET[ $key ] ) ) {
1315
+ $extraRet[ $key ] = $_GET[ $key ];
1316
+ $qsDrop[] = ".replace( '&$key=" . urlencode( $_GET[ $key ] ) . ', \'\' )';
1317
+ }
1318
+ }
1319
+ }
1320
+
1321
+ $replaceStr = implode('', $qsDrop);
1322
 
1323
  // Drop QS
1324
+ echo "<script>window.history.pushState( 'remove_gen_link', document.title, window.location.href" . $replaceStr . " );</script>";
1325
+ return $extraRet;
1326
  }
1327
 
1328
  /**
1366
 
1367
  $json = json_decode( $response[ 'body' ], true );
1368
 
1369
+ self::save_summary( array( 'ips_ts' => time(), 'ips' => $json ) );
 
 
1370
  }
1371
 
1372
  /**
src/conf.cls.php CHANGED
@@ -120,6 +120,9 @@ class Conf extends Base {
120
  // Bcos we may ask clients to deactivate for debug temporarily, we need to keep the current cfg in deactivation, hence we need to only try adding default cfg when activating.
121
  self::add_option( $k, $v );
122
  }
 
 
 
123
  }
124
 
125
  /**
120
  // Bcos we may ask clients to deactivate for debug temporarily, we need to keep the current cfg in deactivation, hence we need to only try adding default cfg when activating.
121
  self::add_option( $k, $v );
122
  }
123
+
124
+ // Force correct version in case a rare unexpected case that `_ver` exists but empty
125
+ self::update_option( Base::_VER, Core::VER );
126
  }
127
 
128
  /**
src/control.cls.php CHANGED
@@ -502,6 +502,7 @@ class Control extends Root {
502
  PHP_URL_SCHEME,
503
  PHP_URL_HOST,
504
  PHP_URL_PATH,
 
505
  );
506
 
507
  $is_same_redirect = true;
@@ -600,6 +601,17 @@ class Control extends Root {
600
  // return;
601
  }
602
 
 
 
 
 
 
 
 
 
 
 
 
603
  // Check if URI is forced public cache
604
  $excludes = $this->conf( Base::O_CACHE_FORCE_PUB_URI );
605
  $hit = Utility::str_hit_array( $_SERVER[ 'REQUEST_URI' ], $excludes, true );
@@ -645,11 +657,6 @@ class Control extends Root {
645
  return;
646
  }
647
 
648
- if ( is_preview() ) {
649
- self::set_nocache( 'preview page' );
650
- return;
651
- }
652
-
653
  // Check litespeed setting to set cacheable status
654
  if ( ! $this->_setting_cacheable() ) {
655
  self::set_nocache();
502
  PHP_URL_SCHEME,
503
  PHP_URL_HOST,
504
  PHP_URL_PATH,
505
+ PHP_URL_QUERY,
506
  );
507
 
508
  $is_same_redirect = true;
601
  // return;
602
  }
603
 
604
+ if ( is_preview() ) {
605
+ self::set_nocache( 'preview page' );
606
+ return;
607
+ }
608
+
609
+ // Check if has metabox non-cacheable setting or not
610
+ if ( $this->cls( 'Metabox' )->setting( 'litespeed_no_cache' ) ) {
611
+ self::set_nocache( 'per post metabox setting' );
612
+ return;
613
+ }
614
+
615
  // Check if URI is forced public cache
616
  $excludes = $this->conf( Base::O_CACHE_FORCE_PUB_URI );
617
  $hit = Utility::str_hit_array( $_SERVER[ 'REQUEST_URI' ], $excludes, true );
657
  return;
658
  }
659
 
 
 
 
 
 
660
  // Check litespeed setting to set cacheable status
661
  if ( ! $this->_setting_cacheable() ) {
662
  self::set_nocache();
src/core.cls.php CHANGED
@@ -465,7 +465,7 @@ class Core extends Root {
465
  // Hook to modify buffer after
466
  $buffer = apply_filters('litespeed_buffer_after', $buffer);
467
 
468
- Debug2::debug( "End response\n--------------------------------------------------------------------------------\n" );
469
 
470
  return $buffer;
471
  }
465
  // Hook to modify buffer after
466
  $buffer = apply_filters('litespeed_buffer_after', $buffer);
467
 
468
+ Debug2::ended();
469
 
470
  return $buffer;
471
  }
src/crawler.cls.php CHANGED
@@ -8,6 +8,8 @@ namespace LiteSpeed;
8
  defined( 'WPINC' ) || exit;
9
 
10
  class Crawler extends Root {
 
 
11
  const TYPE_REFRESH_MAP = 'refresh_map';
12
  const TYPE_EMPTY = 'empty';
13
  const TYPE_BLACKLIST_EMPTY = 'blacklist_empty';
@@ -23,6 +25,7 @@ class Crawler extends Root {
23
  private $_sitemeta = 'meta.data';
24
  private $_resetfile;
25
  private $_end_reason;
 
26
 
27
  private $_crawler_conf = array(
28
  'cookies' => array(),
@@ -55,7 +58,13 @@ class Crawler extends Root {
55
 
56
  $this->_summary = self::get_summary();
57
 
58
- Debug2::debug( '🐞 Init' );
 
 
 
 
 
 
59
  }
60
 
61
  /**
@@ -99,7 +108,7 @@ class Crawler extends Root {
99
  $msg = __( 'Crawler disabled list is cleared! All crawlers are set to active! ', 'litespeed-cache' );
100
  Admin_Display::note( $msg );
101
 
102
- Debug2::debug( '🐞 All crawlers are set to active...... ' );
103
  }
104
 
105
  /**
@@ -150,15 +159,15 @@ class Crawler extends Root {
150
  * @since 3.0
151
  * @access public
152
  */
153
- public static function save_summary( $data = null ) {
154
  $instance = self::cls();
155
  $instance->_summary[ 'meta_save_time' ] = time();
156
 
157
- if ( $data === null ) {
158
  $data = $instance->_summary;
159
  }
160
 
161
- parent::save_summary( $data );
162
 
163
  File::save( LITESPEED_STATIC_DIR . '/crawler/' . $instance->_sitemeta, json_encode( $data ), true );
164
  }
@@ -171,12 +180,12 @@ class Crawler extends Root {
171
  */
172
  public static function start( $force = false ) {
173
  if ( ! Router::can_crawl() ) {
174
- Debug2::debug( '🐞 ......crawler is NOT allowed by the server admin......' );
175
  return false;
176
  }
177
 
178
  if ( $force ) {
179
- Debug2::debug( '🐞 ......crawler manually ran......' );
180
  }
181
 
182
  self::cls()->_crawl_data( $force );
@@ -189,7 +198,7 @@ class Crawler extends Root {
189
  * @access private
190
  */
191
  private function _crawl_data( $force ) {
192
- Debug2::debug( '🐞 ......crawler started......' );
193
  // for the first time running
194
  if ( ! $this->_summary || ! Data::cls()->tb_exist( 'crawler' ) || ! Data::cls()->tb_exist( 'crawler_blacklist' ) ) {
195
  $this->cls( 'Crawler_Map' )->gen();
@@ -200,11 +209,11 @@ class Crawler extends Root {
200
  // check whole crawling interval
201
  $last_fnished_at = $this->_summary[ 'last_full_time_cost' ] + $this->_summary[ 'this_full_beginning_time' ];
202
  if ( ! $force && time() - $last_fnished_at < $this->conf( Base::O_CRAWLER_CRAWL_INTERVAL ) ) {
203
- Debug2::debug( '🐞 Cron abort: cache warmed already.' );
204
  // if not reach whole crawling interval, exit
205
  return;
206
  }
207
- Debug2::debug( '🐞 TouchedEnd. regenerate sitemap....' );
208
  $this->cls( 'Crawler_Map' )->gen();
209
  }
210
 
@@ -212,7 +221,7 @@ class Crawler extends Root {
212
 
213
  // Skip the crawlers that in bypassed list
214
  while ( ! $this->is_active( $this->_summary[ 'curr_crawler' ] ) && $this->_summary[ 'curr_crawler' ] < count( $this->_crawlers ) ) {
215
- Debug2::debug( '🐞 Skipped the Crawler #' . $this->_summary[ 'curr_crawler' ] . ' ......' );
216
  $this->_summary[ 'curr_crawler' ]++;
217
  }
218
  if ( $this->_summary[ 'curr_crawler' ] >= count( $this->_crawlers ) ) {
@@ -318,7 +327,7 @@ class Crawler extends Root {
318
  // check if is running
319
  if ( $this->_summary['is_running'] && time() - $this->_summary['is_running'] < $this->_crawler_conf[ 'run_duration' ] ) {
320
  $this->_end_reason = 'stopped';
321
- Debug2::debug( '🐞 The crawler is running.' );
322
  return;
323
  }
324
 
@@ -326,17 +335,16 @@ class Crawler extends Root {
326
  $this->_adjust_current_threads();
327
  if ( $this->_cur_threads == 0 ) {
328
  $this->_end_reason = 'stopped_highload';
329
- Debug2::debug( '🐞 Stopped due to heavy load.' );
330
  return;
331
  }
332
 
333
  // log started time
334
- $this->_summary['last_start_time'] = time();
335
- self::save_summary();
336
 
337
  // set time limit
338
  $maxTime = (int) ini_get( 'max_execution_time' );
339
- Debug2::debug( '🐞 ini_get max_execution_time=' . $maxTime );
340
  if ( $maxTime == 0 ) {
341
  $maxTime = 300; // hardlimit
342
  }
@@ -345,13 +353,13 @@ class Crawler extends Root {
345
  }
346
  if ( $maxTime >= $this->_crawler_conf[ 'run_duration' ] ) {
347
  $maxTime = $this->_crawler_conf[ 'run_duration' ];
348
- Debug2::debug( '🐞 Use run_duration setting as max_execution_time=' . $maxTime );
349
  }
350
  elseif ( ini_set( 'max_execution_time', $this->_crawler_conf[ 'run_duration' ] + 15 ) !== false ) {
351
  $maxTime = $this->_crawler_conf[ 'run_duration' ];
352
- Debug2::debug( '🐞 ini_set max_execution_time=' . $maxTime );
353
  }
354
- Debug2::debug( '🐞 final max_execution_time=' . $maxTime );
355
  $this->_max_run_time = $maxTime + time();
356
 
357
  // mark running
@@ -373,13 +381,17 @@ class Crawler extends Root {
373
  * @see https://wordpress.org/support/topic/crawler-keeps-causing-crashes/
374
  */
375
  if ( ! function_exists( 'sys_getloadavg' ) ) {
376
- Debug2::debug( '🐞 set threads=0 due to func sys_getloadavg not exist!' );
377
  $this->_cur_threads = 0;
378
  return;
379
  }
380
 
381
- $load = sys_getloadavg();
382
- $curload = 1;
 
 
 
 
383
 
384
  if ( $this->_cur_threads == -1 ) {
385
  // init
@@ -406,9 +418,9 @@ class Crawler extends Root {
406
  }
407
  }
408
  elseif ( $curload >= $this->_crawler_conf[ 'load_limit' ] ) {
409
- if ( $curthreads > 1 ) {// if already 1, keep
410
  $curthreads --;
411
- }
412
  }
413
  elseif ( ($curload + 1) < $this->_crawler_conf[ 'load_limit' ] ) {
414
  if ( $curthreads < $this->conf( Base::O_CRAWLER_THREADS ) ) {
@@ -478,11 +490,11 @@ class Crawler extends Root {
478
  // check response
479
  if ( $rets[ $row[ 'id' ] ][ 'code' ] == 428 ) { // HTTP/1.1 428 Precondition Required (need to test)
480
  $this->_end_reason = 'crawler_disabled';
481
- Debug2::debug( '🐞 crawler_disabled' );
482
  return;
483
  }
484
 
485
- $status = $this->_status_parse( $rets[ $row[ 'id' ] ][ 'header' ], $rets[ $row[ 'id' ] ][ 'code' ] ); // B or H or M or N(nocache)
486
  $this->_map_status_list[ $status ][ $row[ 'id' ] ] = array(
487
  'url' => $row[ 'url' ],
488
  'code' => $rets[ $row[ 'id' ] ][ 'code' ], // 201 or 200 or 404
@@ -504,7 +516,7 @@ class Crawler extends Root {
504
  // check duration
505
  if ( $this->_summary[ 'last_update_time' ] > $this->_max_run_time ) {
506
  $this->_end_reason = 'stopped_maxtime';
507
- Debug2::debug( '🐞 Terminated due to maxtime' );
508
  return;
509
  // return __('Stopped due to exceeding defined Maximum Run Time', 'litespeed-cache');
510
  }
@@ -519,7 +531,7 @@ class Crawler extends Root {
519
  if ( $_time > $this->_summary[ 'pos_reset_check' ] ) {
520
  $this->_summary[ 'pos_reset_check' ] = $_time + 5;
521
  if ( file_exists( $this->_resetfile ) && unlink( $this->_resetfile ) ) {
522
- Debug2::debug( '🐞 Terminated due to reset file' );
523
 
524
  $this->_summary[ 'last_pos' ] = 0;
525
  $this->_summary[ 'curr_crawler' ] = 0;
@@ -538,7 +550,7 @@ class Crawler extends Root {
538
  $this->_adjust_current_threads();
539
  if ( $this->_cur_threads == 0 ) {
540
  $this->_end_reason = 'stopped_highload';
541
- Debug2::debug( '🐞 Terminated due to highload' );
542
  return;
543
  // return __('Stopped due to load over limit', 'litespeed-cache');
544
  }
@@ -553,7 +565,7 @@ class Crawler extends Root {
553
  // All URLs are done for current crawler
554
  $this->_end_reason = 'end';
555
  $this->_summary[ 'crawler_stats' ][ $this->_summary[ 'curr_crawler' ] ][ 'W' ] = 0;
556
- Debug2::debug( '🐞 Crawler #' . $this->_summary['curr_crawler'] . ' touched end' );
557
  }
558
 
559
  /**
@@ -581,7 +593,7 @@ class Crawler extends Root {
581
  $url = $this->_crawler_conf[ 'base' ] . $row[ 'url' ];
582
  }
583
  curl_setopt( $curls[ $row[ 'id' ] ], CURLOPT_URL, $url );
584
- Debug2::debug( '🐞 Crawling [url] ' . $url . ( $url == $row[ 'url' ] ? '' : ' [ori] ' . $row[ 'url' ] ) );
585
 
586
  curl_setopt_array( $curls[ $row[ 'id' ] ], $options );
587
 
@@ -635,12 +647,22 @@ class Crawler extends Root {
635
  * @since 2.0
636
  * @access private
637
  */
638
- private function _status_parse( $header, $code ) {
639
  if ( $code == 201 ) {
640
  return 'H';
641
  }
642
 
643
  if ( stripos( $header, 'X-Litespeed-Cache-Control: no-cache' ) !== false ) {
 
 
 
 
 
 
 
 
 
 
644
  return 'N'; // Blacklist
645
  }
646
 
@@ -774,8 +796,14 @@ class Crawler extends Root {
774
  curl_setopt_array( $ch, $options );
775
  curl_setopt( $ch, CURLOPT_URL, $url );
776
  $result = curl_exec( $ch );
 
777
  curl_close( $ch );
778
 
 
 
 
 
 
779
  return $result;
780
  }
781
 
@@ -796,7 +824,7 @@ class Crawler extends Root {
796
  $this->_summary[ 'last_crawler_total_cost' ] = time() - $this->_summary[ 'curr_crawler_beginning_time' ];
797
  $count_crawlers = count( $this->list_crawlers() );
798
  if ( $this->_summary[ 'curr_crawler' ] >= $count_crawlers ) {
799
- Debug2::debug( '🐞 _terminate_running Touched end, whole crawled. Reload crawler!' );
800
  $this->_summary[ 'curr_crawler' ] = 0;
801
  // $this->_summary[ 'crawler_stats' ][ $this->_summary[ 'curr_crawler' ] ] = array();
802
  $this->_summary[ 'done' ] = 'touchedEnd';// log done status
@@ -946,8 +974,7 @@ class Crawler extends Root {
946
  public function reset_pos() {
947
  File::save( $this->_resetfile, time() , true );
948
 
949
- $this->_summary[ 'is_running' ] = 0;
950
- self::save_summary();
951
  }
952
 
953
  /**
8
  defined( 'WPINC' ) || exit;
9
 
10
  class Crawler extends Root {
11
+ const LOG_TAG = '🕸️';
12
+
13
  const TYPE_REFRESH_MAP = 'refresh_map';
14
  const TYPE_EMPTY = 'empty';
15
  const TYPE_BLACKLIST_EMPTY = 'blacklist_empty';
25
  private $_sitemeta = 'meta.data';
26
  private $_resetfile;
27
  private $_end_reason;
28
+ private $_ncpu = 1;
29
 
30
  private $_crawler_conf = array(
31
  'cookies' => array(),
58
 
59
  $this->_summary = self::get_summary();
60
 
61
+ if(is_file('/proc/cpuinfo')) {
62
+ $cpuinfo = file_get_contents('/proc/cpuinfo');
63
+ preg_match_all('/^processor/m', $cpuinfo, $matches);
64
+ $this->_ncpu = count($matches[0]) ?: 1;
65
+ }
66
+
67
+ self::debug( 'Init w/ CPU cores=' . $this->_ncpu );
68
  }
69
 
70
  /**
108
  $msg = __( 'Crawler disabled list is cleared! All crawlers are set to active! ', 'litespeed-cache' );
109
  Admin_Display::note( $msg );
110
 
111
+ self::debug( 'All crawlers are set to active...... ' );
112
  }
113
 
114
  /**
159
  * @since 3.0
160
  * @access public
161
  */
162
+ public static function save_summary( $data = false, $reload = false, $overwrite = false ) {
163
  $instance = self::cls();
164
  $instance->_summary[ 'meta_save_time' ] = time();
165
 
166
+ if ( ! $data ) {
167
  $data = $instance->_summary;
168
  }
169
 
170
+ parent::save_summary( $data, $reload, $overwrite );
171
 
172
  File::save( LITESPEED_STATIC_DIR . '/crawler/' . $instance->_sitemeta, json_encode( $data ), true );
173
  }
180
  */
181
  public static function start( $force = false ) {
182
  if ( ! Router::can_crawl() ) {
183
+ self::debug( '......crawler is NOT allowed by the server admin......' );
184
  return false;
185
  }
186
 
187
  if ( $force ) {
188
+ self::debug( '......crawler manually ran......' );
189
  }
190
 
191
  self::cls()->_crawl_data( $force );
198
  * @access private
199
  */
200
  private function _crawl_data( $force ) {
201
+ self::debug( '......crawler started......' );
202
  // for the first time running
203
  if ( ! $this->_summary || ! Data::cls()->tb_exist( 'crawler' ) || ! Data::cls()->tb_exist( 'crawler_blacklist' ) ) {
204
  $this->cls( 'Crawler_Map' )->gen();
209
  // check whole crawling interval
210
  $last_fnished_at = $this->_summary[ 'last_full_time_cost' ] + $this->_summary[ 'this_full_beginning_time' ];
211
  if ( ! $force && time() - $last_fnished_at < $this->conf( Base::O_CRAWLER_CRAWL_INTERVAL ) ) {
212
+ self::debug( 'Cron abort: cache warmed already.' );
213
  // if not reach whole crawling interval, exit
214
  return;
215
  }
216
+ self::debug( 'TouchedEnd. regenerate sitemap....' );
217
  $this->cls( 'Crawler_Map' )->gen();
218
  }
219
 
221
 
222
  // Skip the crawlers that in bypassed list
223
  while ( ! $this->is_active( $this->_summary[ 'curr_crawler' ] ) && $this->_summary[ 'curr_crawler' ] < count( $this->_crawlers ) ) {
224
+ self::debug( 'Skipped the Crawler #' . $this->_summary[ 'curr_crawler' ] . ' ......' );
225
  $this->_summary[ 'curr_crawler' ]++;
226
  }
227
  if ( $this->_summary[ 'curr_crawler' ] >= count( $this->_crawlers ) ) {
327
  // check if is running
328
  if ( $this->_summary['is_running'] && time() - $this->_summary['is_running'] < $this->_crawler_conf[ 'run_duration' ] ) {
329
  $this->_end_reason = 'stopped';
330
+ self::debug( 'The crawler is running.' );
331
  return;
332
  }
333
 
335
  $this->_adjust_current_threads();
336
  if ( $this->_cur_threads == 0 ) {
337
  $this->_end_reason = 'stopped_highload';
338
+ self::debug( 'Stopped due to heavy load.' );
339
  return;
340
  }
341
 
342
  // log started time
343
+ self::save_summary( array( 'last_start_time' => time() ) );
 
344
 
345
  // set time limit
346
  $maxTime = (int) ini_get( 'max_execution_time' );
347
+ self::debug( 'ini_get max_execution_time=' . $maxTime );
348
  if ( $maxTime == 0 ) {
349
  $maxTime = 300; // hardlimit
350
  }
353
  }
354
  if ( $maxTime >= $this->_crawler_conf[ 'run_duration' ] ) {
355
  $maxTime = $this->_crawler_conf[ 'run_duration' ];
356
+ self::debug( 'Use run_duration setting as max_execution_time=' . $maxTime );
357
  }
358
  elseif ( ini_set( 'max_execution_time', $this->_crawler_conf[ 'run_duration' ] + 15 ) !== false ) {
359
  $maxTime = $this->_crawler_conf[ 'run_duration' ];
360
+ self::debug( 'ini_set max_execution_time=' . $maxTime );
361
  }
362
+ self::debug( 'final max_execution_time=' . $maxTime );
363
  $this->_max_run_time = $maxTime + time();
364
 
365
  // mark running
381
  * @see https://wordpress.org/support/topic/crawler-keeps-causing-crashes/
382
  */
383
  if ( ! function_exists( 'sys_getloadavg' ) ) {
384
+ self::debug( 'set threads=0 due to func sys_getloadavg not exist!' );
385
  $this->_cur_threads = 0;
386
  return;
387
  }
388
 
389
+ $curload = sys_getloadavg();
390
+ $curload = $curload[0];
391
+ self::debug( 'Server load: ' . $curload );
392
+ $curload /= $this->_ncpu;
393
+
394
+ // $curload = 1;
395
 
396
  if ( $this->_cur_threads == -1 ) {
397
  // init
418
  }
419
  }
420
  elseif ( $curload >= $this->_crawler_conf[ 'load_limit' ] ) {
421
+ // if ( $curthreads > 1 ) {// if already 1, keep
422
  $curthreads --;
423
+ // }
424
  }
425
  elseif ( ($curload + 1) < $this->_crawler_conf[ 'load_limit' ] ) {
426
  if ( $curthreads < $this->conf( Base::O_CRAWLER_THREADS ) ) {
490
  // check response
491
  if ( $rets[ $row[ 'id' ] ][ 'code' ] == 428 ) { // HTTP/1.1 428 Precondition Required (need to test)
492
  $this->_end_reason = 'crawler_disabled';
493
+ self::debug( 'crawler_disabled' );
494
  return;
495
  }
496
 
497
+ $status = $this->_status_parse( $rets[ $row[ 'id' ] ][ 'header' ], $rets[ $row[ 'id' ] ][ 'code' ], $row[ 'url' ] ); // B or H or M or N(nocache)
498
  $this->_map_status_list[ $status ][ $row[ 'id' ] ] = array(
499
  'url' => $row[ 'url' ],
500
  'code' => $rets[ $row[ 'id' ] ][ 'code' ], // 201 or 200 or 404
516
  // check duration
517
  if ( $this->_summary[ 'last_update_time' ] > $this->_max_run_time ) {
518
  $this->_end_reason = 'stopped_maxtime';
519
+ self::debug( 'Terminated due to maxtime' );
520
  return;
521
  // return __('Stopped due to exceeding defined Maximum Run Time', 'litespeed-cache');
522
  }
531
  if ( $_time > $this->_summary[ 'pos_reset_check' ] ) {
532
  $this->_summary[ 'pos_reset_check' ] = $_time + 5;
533
  if ( file_exists( $this->_resetfile ) && unlink( $this->_resetfile ) ) {
534
+ self::debug( 'Terminated due to reset file' );
535
 
536
  $this->_summary[ 'last_pos' ] = 0;
537
  $this->_summary[ 'curr_crawler' ] = 0;
550
  $this->_adjust_current_threads();
551
  if ( $this->_cur_threads == 0 ) {
552
  $this->_end_reason = 'stopped_highload';
553
+ self::debug( 'Terminated due to highload' );
554
  return;
555
  // return __('Stopped due to load over limit', 'litespeed-cache');
556
  }
565
  // All URLs are done for current crawler
566
  $this->_end_reason = 'end';
567
  $this->_summary[ 'crawler_stats' ][ $this->_summary[ 'curr_crawler' ] ][ 'W' ] = 0;
568
+ self::debug( 'Crawler #' . $this->_summary['curr_crawler'] . ' touched end' );
569
  }
570
 
571
  /**
593
  $url = $this->_crawler_conf[ 'base' ] . $row[ 'url' ];
594
  }
595
  curl_setopt( $curls[ $row[ 'id' ] ], CURLOPT_URL, $url );
596
+ self::debug( 'Crawling [url] ' . $url . ( $url == $row[ 'url' ] ? '' : ' [ori] ' . $row[ 'url' ] ) );
597
 
598
  curl_setopt_array( $curls[ $row[ 'id' ] ], $options );
599
 
647
  * @since 2.0
648
  * @access private
649
  */
650
+ private function _status_parse( $header, $code, $url ) {
651
  if ( $code == 201 ) {
652
  return 'H';
653
  }
654
 
655
  if ( stripos( $header, 'X-Litespeed-Cache-Control: no-cache' ) !== false ) {
656
+ // If is from DIVI, taken as miss
657
+ if ( defined( 'LITESPEED_CRAWLER_IGNORE_NONCACHEABLE' ) && LITESPEED_CRAWLER_IGNORE_NONCACHEABLE ) {
658
+ return 'M';
659
+ }
660
+
661
+ // If blacklist is disabled
662
+ if ( ( defined( 'LITESPEED_CRAWLER_DISABLE_BLOCKLIST' ) && LITESPEED_CRAWLER_DISABLE_BLOCKLIST ) || apply_filters( 'litespeed_crawler_disable_blocklist', '__return_false', $url ) ) {
663
+ return 'M';
664
+ }
665
+
666
  return 'N'; // Blacklist
667
  }
668
 
796
  curl_setopt_array( $ch, $options );
797
  curl_setopt( $ch, CURLOPT_URL, $url );
798
  $result = curl_exec( $ch );
799
+ $code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
800
  curl_close( $ch );
801
 
802
+ if ( $code != 200 ) {
803
+ self::debug('❌ Response code is not 200 in self_curl() [code] ' . var_export( $code, true ) );
804
+ return false;
805
+ }
806
+
807
  return $result;
808
  }
809
 
824
  $this->_summary[ 'last_crawler_total_cost' ] = time() - $this->_summary[ 'curr_crawler_beginning_time' ];
825
  $count_crawlers = count( $this->list_crawlers() );
826
  if ( $this->_summary[ 'curr_crawler' ] >= $count_crawlers ) {
827
+ self::debug( '_terminate_running Touched end, whole crawled. Reload crawler!' );
828
  $this->_summary[ 'curr_crawler' ] = 0;
829
  // $this->_summary[ 'crawler_stats' ][ $this->_summary[ 'curr_crawler' ] ] = array();
830
  $this->_summary[ 'done' ] = 'touchedEnd';// log done status
974
  public function reset_pos() {
975
  File::save( $this->_resetfile, time() , true );
976
 
977
+ self::save_summary( array( 'is_running' => 0 ) );
 
978
  }
979
 
980
  /**
src/css.cls.php CHANGED
@@ -8,6 +8,8 @@ namespace LiteSpeed;
8
  defined( 'WPINC' ) || exit;
9
 
10
  class CSS extends Base {
 
 
11
  const TYPE_GEN_CCSS = 'gen_ccss';
12
  const TYPE_GEN_UCSS = 'gen_ucss';
13
  const TYPE_CLEAR_Q_CCSS = 'clear_q_ccss';
@@ -157,7 +159,7 @@ class CSS extends Base {
157
  $this->_queue = $this->load_queue( 'ccss' );
158
 
159
  if ( count( $this->_queue ) > 500 ) {
160
- Debug2::debug( '[CSS] CCSS Queue is full - 500' );
161
  return null;
162
  }
163
 
@@ -165,14 +167,14 @@ class CSS extends Base {
165
  $this->_queue[ $queue_k ] = array(
166
  'url' => apply_filters( 'litespeed_ccss_url', $request_url ),
167
  'user_agent' => substr( $ua, 0, 200 ),
168
- 'is_mobile' => $this->_separate_mobile_ccss(),
169
  'is_webp' => $this->cls( 'Media' )->webp_support() ? 1 : 0,
170
  'uid' => $uid,
171
  'vary' => $vary,
172
  'url_tag' => $url_tag,
173
  ); // Current UA will be used to request
174
  $this->save_queue( 'ccss', $this->_queue );
175
- Debug2::debug( '[CSS] Added queue_ccss [url_tag] ' . $url_tag . ' [UA] ' . $ua . ' [vary] ' . $vary . ' [uid] ' . $uid );
176
 
177
  // Prepare cache tag for later purge
178
  Tag::add( 'CCSS.' . md5( $queue_k ) );
@@ -194,6 +196,23 @@ class CSS extends Base {
194
  return null;
195
  }
196
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
197
  /**
198
  * Get UCSS path
199
  *
@@ -203,19 +222,13 @@ class CSS extends Base {
203
  // Check UCSS URI excludes
204
  $ucss_exc = apply_filters( 'litespeed_ucss_exc', $this->conf( self::O_OPTM_UCSS_EXC ) );
205
  if ( $ucss_exc && $hit = Utility::str_hit_array( $request_url, $ucss_exc ) ) {
206
- Debug2::debug( '[CSS] UCSS bypassed due to UCSS URI Exclude setting: ' . $hit );
207
  return false;
208
  }
209
 
210
  $filepath_prefix = $this->_build_filepath_prefix( 'ucss' );
211
 
212
- $url_tag = $request_url;
213
- if ( is_404() ) {
214
- $url_tag = '404';
215
- }
216
- elseif ( apply_filters( 'litespeed_ucss_per_pagetype', false ) ) {
217
- $url_tag = Utility::page_type();
218
- }
219
 
220
  $vary = $this->cls( 'Vary' )->finalize_full_varies();
221
  $filename = $this->cls( 'Data' )->load_url_file( $url_tag, $vary, 'ucss' );
@@ -247,7 +260,7 @@ class CSS extends Base {
247
  $this->_queue = $this->load_queue( 'ucss' );
248
 
249
  if ( count( $this->_queue ) > 500 ) {
250
- Debug2::debug( '[CSS] UCSS Queue is full - 500' );
251
  return false;
252
  }
253
 
@@ -255,14 +268,14 @@ class CSS extends Base {
255
  $this->_queue[ $queue_k ] = array(
256
  'url' => apply_filters( 'litespeed_ucss_url', $request_url ),
257
  'user_agent' => substr( $ua, 0, 200 ),
258
- 'is_mobile' => $this->_separate_mobile_ccss(),
259
  'is_webp' => $this->cls( 'Media' )->webp_support() ? 1 : 0,
260
  'uid' => $uid,
261
  'vary' => $vary,
262
  'url_tag' => $url_tag,
263
  ); // Current UA will be used to request
264
  $this->save_queue( 'ucss', $this->_queue );
265
- Debug2::debug( '[CSS] Added queue_ucss [url_tag] ' . $url_tag . ' [UA] ' . $ua . ' [vary] ' . $vary . ' [uid] ' . $uid );
266
 
267
  // Prepare cache tag for later purge
268
  Tag::add( 'UCSS.' . md5( $queue_k ) );
@@ -281,16 +294,6 @@ class CSS extends Base {
281
  return false;
282
  }
283
 
284
- /**
285
- * Check if need to separate ccss for mobile
286
- *
287
- * @since 2.6.4
288
- * @access private
289
- */
290
- private function _separate_mobile_ccss() {
291
- return ( wp_is_mobile() || apply_filters( 'litespeed_is_mobile', false ) ) && $this->conf( self::O_CACHE_MOBILE );
292
- }
293
-
294
  /**
295
  * Cron ccss generation
296
  *
@@ -364,7 +367,7 @@ class CSS extends Base {
364
  }
365
 
366
  if ( $i > 3 ) {
367
- $this->_print_loading( count( $this->_queue ), $type_tag );
368
  return Router::self_redirect( Router::ACTION_CSS, $type == 'ccss' ? CSS::TYPE_GEN_CCSS : CSS::TYPE_GEN_UCSS );
369
  }
370
 
@@ -372,7 +375,7 @@ class CSS extends Base {
372
  }
373
 
374
  // Exit queue if out of quota
375
- if ( $res == 'out_of_quota' ) {
376
  return;
377
  }
378
 
@@ -385,7 +388,7 @@ class CSS extends Base {
385
  }
386
 
387
  if ( $i > 3 ) {
388
- $this->_print_loading( count( $this->_queue ), $type_tag );
389
  return Router::self_redirect( Router::ACTION_CSS, $type == 'ccss' ? CSS::TYPE_GEN_CCSS : CSS::TYPE_GEN_UCSS );
390
  }
391
  }
@@ -460,7 +463,7 @@ class CSS extends Base {
460
  $data[ 'whitelist' ] = $this->_ucss_whitelist;
461
  }
462
 
463
- Debug2::debug( '[CSS] Generating: ', $data );
464
 
465
  $json = Cloud::post( $svc, $data, 30 );
466
  if ( ! is_array( $json ) ) {
@@ -502,7 +505,7 @@ class CSS extends Base {
502
  Debug2::debug2( '[CSS] con: ' . $css );
503
 
504
  if ( substr( $css, 0, 2 ) == '/*' && substr( $css, -2 ) == '*/' ) {
505
- Debug2::debug( '[CSS] ❌ empty ' . $type . ' [content] ' . $css );
506
  // continue; // Save the error info too
507
  }
508
 
@@ -523,17 +526,6 @@ class CSS extends Base {
523
  Purge::add( strtoupper( $type ) . '.' . md5( $queue_k ) );
524
  }
525
 
526
- /**
527
- * Print a loading message when redirecting CCSS/UCSS page to aviod whiteboard confusion
528
- */
529
- private function _print_loading( $counter, $type ) {
530
- echo '<div style="font-size: 25px; text-align: center; padding-top: 150px; width: 100%; position: absolute;">';
531
- echo "<img width='35' src='" . LSWCP_PLUGIN_URL . "assets/img/Litespeed.icon.svg' /> ";
532
- echo sprintf( __( '%1$s %2$s files left in queue', 'litespeed-cache' ), $counter, $type );
533
- echo '<p><a href="' . admin_url( 'admin.php?page=litespeed-page_optm' ) . '">' . __( 'Cancel', 'litespeed-cache' ) . '</a></p>';
534
- echo '</div>';
535
- }
536
-
537
  /**
538
  * Play for fun
539
  *
@@ -561,7 +553,7 @@ class CSS extends Base {
561
  'type' => 'CCSS',
562
  );
563
 
564
- // Debug2::debug( '[CSS] Generating: ', $data );
565
 
566
  $json = Cloud::post( Cloud::SVC_CCSS, $data, 180 );
567
 
8
  defined( 'WPINC' ) || exit;
9
 
10
  class CSS extends Base {
11
+ const LOG_TAG = '[CSS]';
12
+
13
  const TYPE_GEN_CCSS = 'gen_ccss';
14
  const TYPE_GEN_UCSS = 'gen_ucss';
15
  const TYPE_CLEAR_Q_CCSS = 'clear_q_ccss';
159
  $this->_queue = $this->load_queue( 'ccss' );
160
 
161
  if ( count( $this->_queue ) > 500 ) {
162
+ self::debug( 'CCSS Queue is full - 500' );
163
  return null;
164
  }
165
 
167
  $this->_queue[ $queue_k ] = array(
168
  'url' => apply_filters( 'litespeed_ccss_url', $request_url ),
169
  'user_agent' => substr( $ua, 0, 200 ),
170
+ 'is_mobile' => $this->_separate_mobile(),
171
  'is_webp' => $this->cls( 'Media' )->webp_support() ? 1 : 0,
172
  'uid' => $uid,
173
  'vary' => $vary,
174
  'url_tag' => $url_tag,
175
  ); // Current UA will be used to request
176
  $this->save_queue( 'ccss', $this->_queue );
177
+ self::debug( 'Added queue_ccss [url_tag] ' . $url_tag . ' [UA] ' . $ua . ' [vary] ' . $vary . ' [uid] ' . $uid );
178
 
179
  // Prepare cache tag for later purge
180
  Tag::add( 'CCSS.' . md5( $queue_k ) );
196
  return null;
197
  }
198
 
199
+ /**
200
+ * Uniform url tag for ucss usage
201
+ * @since 4.7
202
+ */
203
+ public static function get_url_tag( $request_url = false ) {
204
+ $url_tag = $request_url;
205
+ if ( is_404() ) {
206
+ $url_tag = '404';
207
+ }
208
+ elseif ( apply_filters( 'litespeed_ucss_per_pagetype', false ) ) {
209
+ $url_tag = Utility::page_type();
210
+ self::debug( 'litespeed_ucss_per_pagetype filter altered url to ' . $url_tag );
211
+ }
212
+
213
+ return $url_tag;
214
+ }
215
+
216
  /**
217
  * Get UCSS path
218
  *
222
  // Check UCSS URI excludes
223
  $ucss_exc = apply_filters( 'litespeed_ucss_exc', $this->conf( self::O_OPTM_UCSS_EXC ) );
224
  if ( $ucss_exc && $hit = Utility::str_hit_array( $request_url, $ucss_exc ) ) {
225
+ self::debug( 'UCSS bypassed due to UCSS URI Exclude setting: ' . $hit );
226
  return false;
227
  }
228
 
229
  $filepath_prefix = $this->_build_filepath_prefix( 'ucss' );
230
 
231
+ $url_tag = self::get_url_tag( $request_url );
 
 
 
 
 
 
232
 
233
  $vary = $this->cls( 'Vary' )->finalize_full_varies();
234
  $filename = $this->cls( 'Data' )->load_url_file( $url_tag, $vary, 'ucss' );
260
  $this->_queue = $this->load_queue( 'ucss' );
261
 
262
  if ( count( $this->_queue ) > 500 ) {
263
+ self::debug( 'UCSS Queue is full - 500' );
264
  return false;
265
  }
266
 
268
  $this->_queue[ $queue_k ] = array(
269
  'url' => apply_filters( 'litespeed_ucss_url', $request_url ),
270
  'user_agent' => substr( $ua, 0, 200 ),
271
+ 'is_mobile' => $this->_separate_mobile(),
272
  'is_webp' => $this->cls( 'Media' )->webp_support() ? 1 : 0,
273
  'uid' => $uid,
274
  'vary' => $vary,
275
  'url_tag' => $url_tag,
276
  ); // Current UA will be used to request
277
  $this->save_queue( 'ucss', $this->_queue );
278
+ self::debug( 'Added queue_ucss [url_tag] ' . $url_tag . ' [UA] ' . $ua . ' [vary] ' . $vary . ' [uid] ' . $uid );
279
 
280
  // Prepare cache tag for later purge
281
  Tag::add( 'UCSS.' . md5( $queue_k ) );
294
  return false;
295
  }
296
 
 
 
 
 
 
 
 
 
 
 
297
  /**
298
  * Cron ccss generation
299
  *
367
  }
368
 
369
  if ( $i > 3 ) {
370
+ GUI::print_loading( count( $this->_queue ), $type_tag );
371
  return Router::self_redirect( Router::ACTION_CSS, $type == 'ccss' ? CSS::TYPE_GEN_CCSS : CSS::TYPE_GEN_UCSS );
372
  }
373
 
375
  }
376
 
377
  // Exit queue if out of quota
378
+ if ( $res === 'out_of_quota' ) {
379
  return;
380
  }
381
 
388
  }
389
 
390
  if ( $i > 3 ) {
391
+ GUI::print_loading( count( $this->_queue ), $type_tag );
392
  return Router::self_redirect( Router::ACTION_CSS, $type == 'ccss' ? CSS::TYPE_GEN_CCSS : CSS::TYPE_GEN_UCSS );
393
  }
394
  }
463
  $data[ 'whitelist' ] = $this->_ucss_whitelist;
464
  }
465
 
466
+ self::debug( 'Generating: ', $data );
467
 
468
  $json = Cloud::post( $svc, $data, 30 );
469
  if ( ! is_array( $json ) ) {
505
  Debug2::debug2( '[CSS] con: ' . $css );
506
 
507
  if ( substr( $css, 0, 2 ) == '/*' && substr( $css, -2 ) == '*/' ) {
508
+ self::debug( '❌ empty ' . $type . ' [content] ' . $css );
509
  // continue; // Save the error info too
510
  }
511
 
526
  Purge::add( strtoupper( $type ) . '.' . md5( $queue_k ) );
527
  }
528
 
 
 
 
 
 
 
 
 
 
 
 
529
  /**
530
  * Play for fun
531
  *
553
  'type' => 'CCSS',
554
  );
555
 
556
+ // self::debug( 'Generating: ', $data );
557
 
558
  $json = Cloud::post( Cloud::SVC_CCSS, $data, 180 );
559
 
src/data.cls.php CHANGED
@@ -11,6 +11,8 @@ namespace LiteSpeed;
11
  defined( 'WPINC' ) || exit;
12
 
13
  class Data extends Root {
 
 
14
  private $_db_updater = array(
15
  '3.5.0.3' => array(
16
  'litespeed_update_3_5',
@@ -541,6 +543,8 @@ class Data extends Root {
541
 
542
  $type = $this->_url_file_types[ $file_type ];
543
 
 
 
544
  $tb_url = $this->tb( 'url' );
545
  $q = "SELECT * FROM `$tb_url` WHERE url=%s";
546
  $url_row = $wpdb->get_row( $wpdb->prepare( $q, $request_url ), ARRAY_A );
11
  defined( 'WPINC' ) || exit;
12
 
13
  class Data extends Root {
14
+ const LOG_TAG = '[Data]';
15
+
16
  private $_db_updater = array(
17
  '3.5.0.3' => array(
18
  'litespeed_update_3_5',
543
 
544
  $type = $this->_url_file_types[ $file_type ];
545
 
546
+ self::debug2( 'load url file: ' . $request_url );
547
+
548
  $tb_url = $this->tb( 'url' );
549
  $q = "SELECT * FROM `$tb_url` WHERE url=%s";
550
  $url_row = $wpdb->get_row( $wpdb->prepare( $q, $request_url ), ARRAY_A );
src/debug2.cls.php CHANGED
@@ -39,6 +39,17 @@ class Debug2 extends Root {
39
  ! defined( 'LSCWP_LOG_MORE' ) && define( 'LSCWP_LOG_MORE', true );
40
  }
41
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
 
44
  /**
@@ -143,7 +154,7 @@ class Debug2 extends Root {
143
  $debug = $this->conf( Base::O_DEBUG );
144
  if ( $debug == Base::VAL_ON2 ) {
145
  if ( ! $this->cls( 'Router' )->is_admin_ip() ) {
146
- define( 'LSCWP_LOG_BYPASS_NOTADMIN', true );
147
  return;
148
  }
149
  }
@@ -317,6 +328,10 @@ class Debug2 extends Root {
317
  return;
318
  }
319
 
 
 
 
 
320
  if ( $backtrace_limit !== false ) {
321
  if ( ! is_numeric( $backtrace_limit ) ) {
322
  $backtrace_limit = self::trim_longtext( $backtrace_limit );
39
  ! defined( 'LSCWP_LOG_MORE' ) && define( 'LSCWP_LOG_MORE', true );
40
  }
41
 
42
+ defined( 'LSCWP_DEBUG_EXC_STRINGS' ) || define( 'LSCWP_DEBUG_EXC_STRINGS', $this->conf( Base::O_DEBUG_EXC_STRINGS ) );
43
+ }
44
+
45
+ /**
46
+ * End call of one request process
47
+ * @since 4.7
48
+ * @access public
49
+ */
50
+ public static function ended() {
51
+ self::debug( 'Response headers', headers_list() );
52
+ self::debug( "End response\n--------------------------------------------------------------------------------\n" );
53
  }
54
 
55
  /**
154
  $debug = $this->conf( Base::O_DEBUG );
155
  if ( $debug == Base::VAL_ON2 ) {
156
  if ( ! $this->cls( 'Router' )->is_admin_ip() ) {
157
+ defined( 'LSCWP_LOG_BYPASS_NOTADMIN' ) || define( 'LSCWP_LOG_BYPASS_NOTADMIN', true );
158
  return;
159
  }
160
  }
328
  return;
329
  }
330
 
331
+ if ( defined( 'LSCWP_DEBUG_EXC_STRINGS' ) && Utility::str_hit_array( $msg, LSCWP_DEBUG_EXC_STRINGS ) ) {
332
+ return;
333
+ }
334
+
335
  if ( $backtrace_limit !== false ) {
336
  if ( ! is_numeric( $backtrace_limit ) ) {
337
  $backtrace_limit = self::trim_longtext( $backtrace_limit );
src/error.cls.php CHANGED
@@ -80,6 +80,10 @@ class Error {
80
  $msg = sprintf( __( 'There is proceeding queue not pulled yet. Queue info: %s.', 'litespeed-cache' ), '<code>' . substr( $code, strlen( 'unfinished_queue ' ) ) . '</code>' );
81
  break;
82
 
 
 
 
 
83
  case 'site_not_registered':
84
  $msg = __( 'The site is not registered on QUIC.cloud.', 'litespeed-cache' );
85
  break;
@@ -169,6 +173,10 @@ class Error {
169
  $msg = __( 'Your domain has been forbidden from using our services due to a previous policy violation.', 'litespeed-cache' );
170
  break;
171
 
 
 
 
 
172
  default:
173
  $msg = __( 'Unknown error', 'litespeed-cache' ) . ': ' . $code;
174
  break;
80
  $msg = sprintf( __( 'There is proceeding queue not pulled yet. Queue info: %s.', 'litespeed-cache' ), '<code>' . substr( $code, strlen( 'unfinished_queue ' ) ) . '</code>' );
81
  break;
82
 
83
+ case 'err_alias':
84
+ $msg = __( 'The site is not a valid alias on QUIC.cloud.', 'litespeed-cache' );
85
+ break;
86
+
87
  case 'site_not_registered':
88
  $msg = __( 'The site is not registered on QUIC.cloud.', 'litespeed-cache' );
89
  break;
173
  $msg = __( 'Your domain has been forbidden from using our services due to a previous policy violation.', 'litespeed-cache' );
174
  break;
175
 
176
+ case 'err_dns_active':
177
+ $msg = __( 'You cannot remove this DNS zone, because it is still in use. Please update the domain\'s nameservers, then try to delete this zone again, otherwise your site will become inaccessible.', 'litespeed-cache' );
178
+ break;
179
+
180
  default:
181
  $msg = __( 'Unknown error', 'litespeed-cache' ) . ': ' . $code;
182
  break;
src/esi.cls.php CHANGED
@@ -100,6 +100,7 @@ class ESI extends Root {
100
  *
101
  * 1. `cache` attribute is optional, default to 'public,no-vary'.
102
  * 2. `ttl` attribute is optional, default is your public TTL setting.
 
103
  *
104
  * @since 2.8
105
  * @since 2.8.1 Check is_admin for Elementor compatibility #726013
@@ -208,10 +209,15 @@ class ESI extends Root {
208
  unset( $atts[ 'cache' ] );
209
  }
210
 
 
 
 
 
 
211
  do_action( 'litespeed_esi_shortcode-' . $atts[ 0 ] );
212
 
213
  // Show ESI link
214
- return $this->sub_esi_block( 'esi', 'esi-shortcode', $atts, $cache );
215
  }
216
 
217
  /**
@@ -423,7 +429,7 @@ class ESI extends Root {
423
  }
424
 
425
  if ( $silence ) {
426
- // Don't add comment to esi block ( orignal for nonce used in tag property data-nonce='esi_block' )
427
  $params[ '_ls_silence' ] = true;
428
  }
429
 
100
  *
101
  * 1. `cache` attribute is optional, default to 'public,no-vary'.
102
  * 2. `ttl` attribute is optional, default is your public TTL setting.
103
+ * 3. `_ls_silence` attribute is optional, default is false.
104
  *
105
  * @since 2.8
106
  * @since 2.8.1 Check is_admin for Elementor compatibility #726013
209
  unset( $atts[ 'cache' ] );
210
  }
211
 
212
+ $silence = false;
213
+ if ( ! empty( $atts[ '_ls_silence' ] ) ) {
214
+ $silence = true;
215
+ }
216
+
217
  do_action( 'litespeed_esi_shortcode-' . $atts[ 0 ] );
218
 
219
  // Show ESI link
220
+ return $this->sub_esi_block( 'esi', 'esi-shortcode', $atts, $cache, $silence );
221
  }
222
 
223
  /**
429
  }
430
 
431
  if ( $silence ) {
432
+ // Don't add comment to esi block ( original for nonce used in tag property data-nonce='esi_block' )
433
  $params[ '_ls_silence' ] = true;
434
  }
435
 
src/gui.cls.php CHANGED
@@ -95,6 +95,17 @@ class GUI extends Base {
95
  return $data;
96
  }
97
 
 
 
 
 
 
 
 
 
 
 
 
98
  /**
99
  * Display a pie
100
  *
@@ -400,11 +411,27 @@ class GUI extends Base {
400
  $wp_admin_bar->add_menu( array(
401
  'parent' => 'litespeed-menu',
402
  'id' => 'litespeed-purge-single',
403
- 'title' => __( 'Purge this page', 'litespeed-cache' ),
404
  'href' => Utility::build_url( Router::ACTION_PURGE, Purge::TYPE_PURGE_FRONT, false, true ),
405
  'meta' => array( 'tabindex' => '0' ),
406
  ) );
407
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
408
  $wp_admin_bar->add_menu( array(
409
  'parent' => 'litespeed-menu',
410
  'id' => 'litespeed-single-action',
95
  return $data;
96
  }
97
 
98
+ /**
99
+ * Print a loading message when redirecting CCSS/UCSS page to aviod whiteboard confusion
100
+ */
101
+ public static function print_loading( $counter, $type ) {
102
+ echo '<div style="font-size: 25px; text-align: center; padding-top: 150px; width: 100%; position: absolute;">';
103
+ echo "<img width='35' src='" . LSWCP_PLUGIN_URL . "assets/img/Litespeed.icon.svg' /> ";
104
+ echo sprintf( __( '%1$s %2$s files left in queue', 'litespeed-cache' ), $counter, $type );
105
+ echo '<p><a href="' . admin_url( 'admin.php?page=litespeed-page_optm' ) . '">' . __( 'Cancel', 'litespeed-cache' ) . '</a></p>';
106
+ echo '</div>';
107
+ }
108
+
109
  /**
110
  * Display a pie
111
  *
411
  $wp_admin_bar->add_menu( array(
412
  'parent' => 'litespeed-menu',
413
  'id' => 'litespeed-purge-single',
414
+ 'title' => __( 'Purge this page', 'litespeed-cache' ) . ' - LSCache',
415
  'href' => Utility::build_url( Router::ACTION_PURGE, Purge::TYPE_PURGE_FRONT, false, true ),
416
  'meta' => array( 'tabindex' => '0' ),
417
  ) );
418
 
419
+ if ( $this->has_cache_folder( 'ucss' ) ) {
420
+ $possible_url_tag = CSS::get_url_tag();
421
+ $append_arr = array();
422
+ if ( $possible_url_tag ) {
423
+ $append_arr[ 'url_tag' ] = $possible_url_tag;
424
+ }
425
+
426
+ $wp_admin_bar->add_menu( array(
427
+ 'parent' => 'litespeed-menu',
428
+ 'id' => 'litespeed-purge-single-ucss',
429
+ 'title' => __( 'Purge this page', 'litespeed-cache' ) . ' - UCSS',
430
+ 'href' => Utility::build_url( Router::ACTION_PURGE, Purge::TYPE_PURGE_UCSS, false, true, $append_arr ),
431
+ 'meta' => array( 'tabindex' => '0' ),
432
+ ) );
433
+ }
434
+
435
  $wp_admin_bar->add_menu( array(
436
  'parent' => 'litespeed-menu',
437
  'id' => 'litespeed-single-action',
src/htaccess.cls.php CHANGED
@@ -565,8 +565,7 @@ class Htaccess extends Root {
565
  $id = Base::O_IMG_OPTM_WEBP_REPLACE;
566
  if ( ! empty( $cfg[ $id ] ) || ! empty( $cfg[ Base::O_GUEST ] ) ) {
567
  $new_rules[] = self::MARKER_WEBP . self::MARKER_START;
568
- $new_rules[] = 'RewriteCond %{HTTP_ACCEPT} "image/webp" [or]';
569
- $new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} "Page Speed"';
570
  $new_rules[] = 'RewriteRule .* - [E=Cache-Control:vary=%{ENV:LSCACHE_VARY_VALUE}+webp]';
571
  $new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} iPhone.*Version/(\d{2}).*Safari';
572
  $new_rules[] = 'RewriteCond %1 >13';
565
  $id = Base::O_IMG_OPTM_WEBP_REPLACE;
566
  if ( ! empty( $cfg[ $id ] ) || ! empty( $cfg[ Base::O_GUEST ] ) ) {
567
  $new_rules[] = self::MARKER_WEBP . self::MARKER_START;
568
+ $new_rules[] = 'RewriteCond %{HTTP_ACCEPT} "image/webp"';
 
569
  $new_rules[] = 'RewriteRule .* - [E=Cache-Control:vary=%{ENV:LSCACHE_VARY_VALUE}+webp]';
570
  $new_rules[] = 'RewriteCond %{HTTP_USER_AGENT} iPhone.*Version/(\d{2}).*Safari';
571
  $new_rules[] = 'RewriteCond %1 >13';
src/lang.cls.php CHANGED
@@ -41,6 +41,38 @@ class Lang extends Base {
41
  return $list;
42
  }
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  /**
45
  * Get the title of id
46
  *
@@ -164,6 +196,9 @@ class Lang extends Base {
164
  self::O_MEDIA_PLACEHOLDER_RESP_ASYNC => __( 'Generate LQIP In Background', 'litespeed-cache' ),
165
  self::O_MEDIA_IFRAME_LAZY => __( 'Lazy Load Iframes', 'litespeed-cache' ),
166
  self::O_MEDIA_ADD_MISSING_SIZES => __( 'Add Missing Sizes', 'litespeed-cache' ),
 
 
 
167
  self::O_IMG_OPTM_AUTO => __( 'Auto Request Cron', 'litespeed-cache' ),
168
  self::O_IMG_OPTM_CRON => __( 'Auto Pull Cron', 'litespeed-cache' ),
169
  self::O_IMG_OPTM_ORI => __( 'Optimize Original Images', 'litespeed-cache' ),
@@ -230,6 +265,7 @@ class Lang extends Base {
230
  self::O_DEBUG_COLLAPS_QS => __( 'Collapse Query Strings', 'litespeed-cache' ),
231
  self::O_DEBUG_INC => __( 'Debug URI Includes', 'litespeed-cache' ),
232
  self::O_DEBUG_EXC => __( 'Debug URI Excludes', 'litespeed-cache' ),
 
233
 
234
  self::O_DB_OPTM_REVISIONS_MAX => __( 'Revisions Max Number', 'litespeed-cache' ),
235
  self::O_DB_OPTM_REVISIONS_AGE => __( 'Revisions Max Age', 'litespeed-cache' ),
41
  return $list;
42
  }
43
 
44
+ /**
45
+ * Try translating a string
46
+ *
47
+ * @since 4.7
48
+ */
49
+ public static function maybe_translate( $raw_string ) {
50
+ $map = array(
51
+ 'auto_alias_failed_cdn' => __( 'Unable to automatically add %1$s as a Domain Alias for main %2$s domain, due to potential CDN conflict.', 'litespeed-cache' ) . ' ' . Doc::learn_more( 'https://quic.cloud/docs/cdn/dns/how-to-setup-domain-alias/', false, false, false, true ),
52
+
53
+ 'auto_alias_failed_uid' =>
54
+ __( 'Unable to automatically add %1$s as a Domain Alias for main %2$s domain.', 'litespeed-cache' ) .
55
+ ' ' . __( 'Alias is in use by another QUIC.cloud account.', 'litespeed-cache' ) .
56
+ ' ' . Doc::learn_more( 'https://quic.cloud/docs/cdn/dns/how-to-setup-domain-alias/', false, false, false, true ),
57
+ );
58
+
59
+ // Maybe has placeholder
60
+ if ( strpos( $raw_string, '::' ) ) {
61
+ $replacements = explode( '::', $raw_string );
62
+ if ( empty( $map[ $replacements[0] ] ) ) {
63
+ return $raw_string;
64
+ }
65
+ $tpl = $map[ $replacements[0] ];
66
+ unset($replacements[0]);
67
+ return vsprintf( $tpl, array_values( $replacements ) );
68
+ }
69
+
70
+ // Direct translation only
71
+ if ( empty( $map[ $raw_string ] ) ) return $raw_string;
72
+
73
+ return $map[ $raw_string ];
74
+ }
75
+
76
  /**
77
  * Get the title of id
78
  *
196
  self::O_MEDIA_PLACEHOLDER_RESP_ASYNC => __( 'Generate LQIP In Background', 'litespeed-cache' ),
197
  self::O_MEDIA_IFRAME_LAZY => __( 'Lazy Load Iframes', 'litespeed-cache' ),
198
  self::O_MEDIA_ADD_MISSING_SIZES => __( 'Add Missing Sizes', 'litespeed-cache' ),
199
+ self::O_MEDIA_VPI => __( 'Viewport Images', 'litespeed-cache' ),
200
+ self::O_MEDIA_VPI_CRON => __( 'Viewport Images Cron', 'litespeed-cache' ),
201
+
202
  self::O_IMG_OPTM_AUTO => __( 'Auto Request Cron', 'litespeed-cache' ),
203
  self::O_IMG_OPTM_CRON => __( 'Auto Pull Cron', 'litespeed-cache' ),
204
  self::O_IMG_OPTM_ORI => __( 'Optimize Original Images', 'litespeed-cache' ),
265
  self::O_DEBUG_COLLAPS_QS => __( 'Collapse Query Strings', 'litespeed-cache' ),
266
  self::O_DEBUG_INC => __( 'Debug URI Includes', 'litespeed-cache' ),
267
  self::O_DEBUG_EXC => __( 'Debug URI Excludes', 'litespeed-cache' ),
268
+ self::O_DEBUG_EXC_STRINGS => __( 'Debug String Excludes', 'litespeed-cache' ),
269
 
270
  self::O_DB_OPTM_REVISIONS_MAX => __( 'Revisions Max Number', 'litespeed-cache' ),
271
  self::O_DB_OPTM_REVISIONS_AGE => __( 'Revisions Max Age', 'litespeed-cache' ),
src/media.cls.php CHANGED
@@ -13,6 +13,8 @@ namespace LiteSpeed;
13
  defined( 'WPINC' ) || exit;
14
 
15
  class Media extends Root {
 
 
16
  const LIB_FILE_IMG_LAZYLOAD = 'assets/js/lazyload.min.js';
17
 
18
  private $content;
@@ -53,7 +55,8 @@ class Media extends Root {
53
  }
54
  }
55
 
56
- if ( $this->conf( Base::O_MEDIA_LAZY ) ) {
 
57
  add_filter( 'wp_lazy_loading_enabled', '__return_false' );
58
  }
59
 
@@ -115,7 +118,7 @@ class Media extends Root {
115
  return;
116
  }
117
 
118
- Debug2::debug( '[Media] delete_attachment [pid] ' . $post_id );
119
  Img_Optm::cls()->reset_row( $post_id );
120
  }
121
 
@@ -162,7 +165,7 @@ class Media extends Root {
162
 
163
  if ( file_exists( $real_file ) ) {
164
  unlink( $real_file );
165
- Debug2::debug( '[Media] deleted ' . $real_file );
166
  }
167
 
168
  do_action( 'litespeed_media_del', $short_file_path, $post_id );
@@ -180,7 +183,7 @@ class Media extends Root {
180
 
181
  if ( file_exists( $real_file ) ) {
182
  rename( $real_file, $real_file_new );
183
- Debug2::debug( '[Media] renamed ' . $real_file . ' to ' . $real_file_new );
184
  }
185
 
186
  do_action( 'litespeed_media_rename', $short_file_path, $short_file_path_new, $post_id );
@@ -421,11 +424,11 @@ class Media extends Root {
421
  }
422
 
423
  if ( ! Control::is_cacheable() ) {
424
- Debug2::debug( '[Media] bypass: Not cacheable' );
425
  return $content;
426
  }
427
 
428
- Debug2::debug( '[Media] finalize' );
429
 
430
  $this->content = $content;
431
  $this->_finalize();
@@ -455,20 +458,27 @@ class Media extends Root {
455
  if ( ! defined( 'LITESPEED_GUEST_OPTM' ) ) {
456
  $result = Utility::str_hit_array( $_SERVER[ 'REQUEST_URI' ], $excludes );
457
  if ( $result ) {
458
- Debug2::debug( '[Media] bypass lazyload: hit URI Excludes setting: ' . $result );
459
  return;
460
  }
461
  }
462
 
463
- $cfg_lazy = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_LAZY );
464
  $cfg_iframe_lazy = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_IFRAME_LAZY );
465
  $cfg_js_delay = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_OPTM_JS_DEFER ) == 2;
466
  $cfg_trim_noscript = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_OPTM_NOSCRIPT_RM );
 
467
 
468
  if ( $cfg_lazy ) {
 
 
 
469
  list( $src_list, $html_list, $placeholder_list ) = $this->_parse_img();
470
  $html_list_ori = $html_list;
471
  }
 
 
 
472
 
473
  // image lazy load
474
  if ( $cfg_lazy ) {
@@ -608,7 +618,7 @@ class Media extends Root {
608
  // Add missing dimensions
609
  if ( defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_ADD_MISSING_SIZES ) ) {
610
  if ( empty( $attrs[ 'width' ] ) || $attrs[ 'width' ] == 'auto' || empty( $attrs[ 'height' ] ) || $attrs[ 'height' ] == 'auto' ) {
611
- Debug2::debug( '[Media] ⚠️ Missing sizes for image [src] ' . $attrs[ 'src' ] );
612
  $dimensions = $this->_detect_dimensions( $attrs[ 'src' ] );
613
  if ( $dimensions ) {
614
  $ori_width = $dimensions[ 0 ];
@@ -625,7 +635,7 @@ class Media extends Root {
625
  $attrs[ 'height' ] = $ori_height;
626
  $new_html = preg_replace( '#(width|height)=(["\'])[^\2]*\2#', '', $match[ 0 ] );
627
  $new_html = str_replace( '<img ', '<img width="' . $attrs[ 'width' ] . '" height="' . $attrs[ 'height' ] . '" ', $new_html );
628
- Debug2::debug( '[Media] Add missing sizes ' . $attrs[ 'width' ] . 'x' . $attrs[ 'height' ] . ' to ' . $attrs[ 'src' ] );
629
  $this->content = str_replace( $match[ 0 ], $new_html, $this->content );
630
  $match[ 0 ] = $new_html;
631
  }
@@ -658,6 +668,8 @@ class Media extends Root {
658
  return false;
659
  }
660
 
 
 
661
  $sizes = getimagesize( $src );
662
 
663
  if ( ! empty( $sizes[ 0 ] ) && ! empty( $sizes[ 1 ] ) ) {
13
  defined( 'WPINC' ) || exit;
14
 
15
  class Media extends Root {
16
+ const LOG_TAG = '📺';
17
+
18
  const LIB_FILE_IMG_LAZYLOAD = 'assets/js/lazyload.min.js';
19
 
20
  private $content;
55
  }
56
  }
57
 
58
+ if ( $this->conf( Base::O_MEDIA_LAZY ) && ! $this->cls( 'Metabox' )->setting( 'litespeed_no_image_lazy' ) ) {
59
+ self::debug( 'Suppress default WP lazyload' );
60
  add_filter( 'wp_lazy_loading_enabled', '__return_false' );
61
  }
62
 
118
  return;
119
  }
120
 
121
+ self::debug( 'delete_attachment [pid] ' . $post_id );
122
  Img_Optm::cls()->reset_row( $post_id );
123
  }
124
 
165
 
166
  if ( file_exists( $real_file ) ) {
167
  unlink( $real_file );
168
+ self::debug( 'deleted ' . $real_file );
169
  }
170
 
171
  do_action( 'litespeed_media_del', $short_file_path, $post_id );
183
 
184
  if ( file_exists( $real_file ) ) {
185
  rename( $real_file, $real_file_new );
186
+ self::debug( 'renamed ' . $real_file . ' to ' . $real_file_new );
187
  }
188
 
189
  do_action( 'litespeed_media_rename', $short_file_path, $short_file_path_new, $post_id );
424
  }
425
 
426
  if ( ! Control::is_cacheable() ) {
427
+ self::debug( 'bypass: Not cacheable' );
428
  return $content;
429
  }
430
 
431
+ self::debug( 'finalize' );
432
 
433
  $this->content = $content;
434
  $this->_finalize();
458
  if ( ! defined( 'LITESPEED_GUEST_OPTM' ) ) {
459
  $result = Utility::str_hit_array( $_SERVER[ 'REQUEST_URI' ], $excludes );
460
  if ( $result ) {
461
+ self::debug( 'bypass lazyload: hit URI Excludes setting: ' . $result );
462
  return;
463
  }
464
  }
465
 
466
+ $cfg_lazy = ( defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_LAZY ) ) && ! $this->cls( 'Metabox' )->setting( 'litespeed_no_image_lazy' );
467
  $cfg_iframe_lazy = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_IFRAME_LAZY );
468
  $cfg_js_delay = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_OPTM_JS_DEFER ) == 2;
469
  $cfg_trim_noscript = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_OPTM_NOSCRIPT_RM );
470
+ $cfg_vpi = defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_VPI );
471
 
472
  if ( $cfg_lazy ) {
473
+ if ( $cfg_vpi ) {
474
+ add_filter( 'litespeed_media_lazy_img_excludes', array( $this->cls( 'Metabox' ), 'lazy_img_excludes' ) );
475
+ }
476
  list( $src_list, $html_list, $placeholder_list ) = $this->_parse_img();
477
  $html_list_ori = $html_list;
478
  }
479
+ else {
480
+ self::debug( 'lazyload disabled' );
481
+ }
482
 
483
  // image lazy load
484
  if ( $cfg_lazy ) {
618
  // Add missing dimensions
619
  if ( defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( Base::O_MEDIA_ADD_MISSING_SIZES ) ) {
620
  if ( empty( $attrs[ 'width' ] ) || $attrs[ 'width' ] == 'auto' || empty( $attrs[ 'height' ] ) || $attrs[ 'height' ] == 'auto' ) {
621
+ self::debug( '⚠️ Missing sizes for image [src] ' . $attrs[ 'src' ] );
622
  $dimensions = $this->_detect_dimensions( $attrs[ 'src' ] );
623
  if ( $dimensions ) {
624
  $ori_width = $dimensions[ 0 ];
635
  $attrs[ 'height' ] = $ori_height;
636
  $new_html = preg_replace( '#(width|height)=(["\'])[^\2]*\2#', '', $match[ 0 ] );
637
  $new_html = str_replace( '<img ', '<img width="' . $attrs[ 'width' ] . '" height="' . $attrs[ 'height' ] . '" ', $new_html );
638
+ self::debug( 'Add missing sizes ' . $attrs[ 'width' ] . 'x' . $attrs[ 'height' ] . ' to ' . $attrs[ 'src' ] );
639
  $this->content = str_replace( $match[ 0 ], $new_html, $this->content );
640
  $match[ 0 ] = $new_html;
641
  }
668
  return false;
669
  }
670
 
671
+ if ( substr( $src, 0, 2 ) == '//' ) $src = 'https:' . $src;
672
+
673
  $sizes = getimagesize( $src );
674
 
675
  if ( ! empty( $sizes[ 0 ] ) && ! empty( $sizes[ 1 ] ) ) {
src/metabox.cls.php ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The class to operate post editor metabox settings
4
+ *
5
+ * @since 4.7
6
+ * @package Core
7
+ * @subpackage Core/inc
8
+ * @author LiteSpeed Technologies <info@litespeedtech.com>
9
+ */
10
+ namespace LiteSpeed;
11
+
12
+ defined( 'WPINC' ) || exit;
13
+
14
+ class Metabox extends Root {
15
+ const LOG_TAG = '📦';
16
+
17
+ const POST_NONCE_ACTION = 'post_nonce_action';
18
+
19
+ private $_postmeta_settings;
20
+
21
+ /**
22
+ * Get the setting list
23
+ * @since 4.7
24
+ */
25
+ public function __construct() {
26
+ // Append meta box
27
+ $this->_postmeta_settings = array(
28
+ 'litespeed_no_cache' => __( 'Disable Cache', 'litespeed-cache' ),
29
+ 'litespeed_no_image_lazy' => __( 'Disable Image Lazyload', 'litespeed-cache' ),
30
+ 'litespeed_no_vpi' => __( 'Disable VPI', 'litespeed-cache' ),
31
+ 'litespeed_vpi_list' => __( 'Viewport Images', 'litespeed-cache' ),
32
+ 'litespeed_vpi_list_mobile' => __( 'Viewport Images', 'litespeed-cache' ) . ' - ' . __( 'Mobile', 'litespeed-cache' ),
33
+ );
34
+ }
35
+
36
+ /**
37
+ * Register post edit settings
38
+ * @since 4.7
39
+ */
40
+ public function register_settings() {
41
+ add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
42
+ add_action( 'save_post', array( $this, 'save_meta_box_settings' ), 15, 2 );
43
+ }
44
+
45
+ /**
46
+ * Regsiter meta box
47
+ * @since 4.7
48
+ */
49
+ public function add_meta_boxes( $post_type ) {
50
+ if ( apply_filters( 'litespeed_bypass_metabox', false, $post_type ) ) {
51
+ return;
52
+ }
53
+ add_meta_box( 'litespeed_meta_boxes', __( 'LiteSpeed Options', 'litespeed-cache' ), array( $this, 'meta_box_options' ), $post_type, 'side', 'core' );
54
+ }
55
+
56
+ /**
57
+ * Show meta box content
58
+ * @since 4.7
59
+ */
60
+ public function meta_box_options() {
61
+ require_once LSCWP_DIR . 'tpl/inc/metabox.php';
62
+ }
63
+
64
+ /**
65
+ * Save settings
66
+ * @since 4.7
67
+ */
68
+ public function save_meta_box_settings( $post_id, $post ) {
69
+ global $pagenow;
70
+
71
+ self::debug( 'Maybe save post2 [post_id] ' . $post_id );
72
+
73
+ if ( $pagenow != 'post.php' || ! $post || ! is_object( $post ) ) {
74
+ return;
75
+ }
76
+
77
+ if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
78
+ return;
79
+ }
80
+
81
+ if ( ! $this->cls( 'Router' )->verify_nonce( self::POST_NONCE_ACTION ) ) {
82
+ return;
83
+ }
84
+
85
+ self::debug( 'Saving post [post_id] ' . $post_id );
86
+
87
+ foreach ( $this->_postmeta_settings as $k => $v ) {
88
+ $val = isset( $_POST[ $k ] ) ? $_POST[ $k ] : false;
89
+ $this->save( $post_id, $k, $val );
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Load setting per post
95
+ * @since 4.7
96
+ */
97
+ public function setting( $conf, $post_id = false ) {
98
+ // Check if has metabox non-cacheable setting or not
99
+ if ( ! $post_id ) {
100
+ if ( is_singular() ) {
101
+ $post_id = get_the_ID();
102
+
103
+ }
104
+ }
105
+
106
+ if ( $post_id && $val = get_post_meta( $post_id, $conf, true ) ) {
107
+ return $val;
108
+ }
109
+
110
+ return null;
111
+ }
112
+
113
+ /**
114
+ * Save a metabox value
115
+ * @since 4.7
116
+ */
117
+ public function save( $post_id, $name, $val, $is_append = false ) {
118
+ if( strpos( $name, 'litespeed_vpi_list' ) !== false ) {
119
+ $val = Utility::sanitize_lines( $val, 'basename,drop_webp' );
120
+ }
121
+
122
+ // Load existing data if has set
123
+ if ( $is_append ) {
124
+ $existing_data = $this->setting( $name, $post_id );
125
+ if ( $existing_data ) {
126
+ $existing_data = Utility::sanitize_lines( $existing_data, 'basename' );
127
+ $val = array_unique( array_merge( $val, $existing_data ) );
128
+ }
129
+ }
130
+
131
+ if ( $val ) {
132
+ update_post_meta( $post_id, $name, $val );
133
+ }
134
+ else {
135
+ delete_post_meta( $post_id, $name );
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Load exclude images per post
141
+ * @since 4.7
142
+ */
143
+ public function lazy_img_excludes( $list ) {
144
+ $is_mobile = $this->_separate_mobile();
145
+ $excludes = $this->setting( $is_mobile ? 'litespeed_vpi_list_mobile' : 'litespeed_vpi_list' );
146
+ if ( $excludes !== null ) {
147
+ $excludes = Utility::sanitize_lines( $excludes, 'basename' );
148
+ if ( $excludes ) {
149
+ return array_merge( $list, $excludes );
150
+ }
151
+
152
+ return $list;
153
+ }
154
+
155
+ $this->cls( 'VPI' )->add_to_queue();
156
+
157
+ return $list;
158
+ }
159
+ }
src/optimize.cls.php CHANGED
@@ -65,7 +65,7 @@ class Optimize extends Base {
65
  Debug2::debug( '[Optm] ❌ CCSS set to OFF due to missing domain key' );
66
  $this->cfg_css_async = false;
67
  }
68
- if ( ( defined( 'LITESPEED_GUEST_OPTM' ) || $this->conf( self::O_OPTM_UCSS ) ) && $this->conf( self::O_OPTM_UCSS_INLINE ) ) {
69
  Debug2::debug( '[Optm] ❌ CCSS set to OFF due to UCSS Inline' );
70
  $this->cfg_css_async = false;
71
  }
@@ -784,7 +784,7 @@ class Optimize extends Base {
784
  // Add cache tag in case later file deleted to avoid lscache served stale non-existed files @since 4.4.1
785
  Tag::add( Tag::TYPE_MIN . '.' . $filename );
786
 
787
- $qs_hash = substr( md5( self::get_option( self::ITEM_TIMESTAMP_PURGE_CSS) ), -5 );//xx
788
  // As filename is alreay realted to filecon md5, no need QS anymore
789
  $filepath_prefix = $this->_build_filepath_prefix( $type );
790
  return LITESPEED_STATIC_URL . $filepath_prefix . $filename . '?ver=' . $qs_hash;
65
  Debug2::debug( '[Optm] ❌ CCSS set to OFF due to missing domain key' );
66
  $this->cfg_css_async = false;
67
  }
68
+ if ( ( defined( 'LITESPEED_GUEST_OPTM' ) || ( $this->conf( self::O_OPTM_UCSS ) && $this->conf( self::O_OPTM_CSS_COMB ) ) ) && $this->conf( self::O_OPTM_UCSS_INLINE ) ) {
69
  Debug2::debug( '[Optm] ❌ CCSS set to OFF due to UCSS Inline' );
70
  $this->cfg_css_async = false;
71
  }
784
  // Add cache tag in case later file deleted to avoid lscache served stale non-existed files @since 4.4.1
785
  Tag::add( Tag::TYPE_MIN . '.' . $filename );
786
 
787
+ $qs_hash = substr( md5( self::get_option( self::ITEM_TIMESTAMP_PURGE_CSS) ), -5 );
788
  // As filename is alreay realted to filecon md5, no need QS anymore
789
  $filepath_prefix = $this->_build_filepath_prefix( $type );
790
  return LITESPEED_STATIC_URL . $filepath_prefix . $filename . '?ver=' . $qs_hash;
src/optimizer.cls.php CHANGED
@@ -44,7 +44,7 @@ class Optimizer extends Root {
44
  $obj = new Lib\HTML_MIN( $content, $options );
45
  $content_final = $obj->process();
46
  if ( ! defined( 'LSCACHE_ESI_SILENCE' ) ) {
47
- $content_final .= "\n" . '<!-- Page optimized by LiteSpeed Cache @' . date('Y-m-d H:i:s') . ' -->';
48
  }
49
  return $content_final;
50
 
@@ -183,6 +183,41 @@ class Optimizer extends Root {
183
  return $content;
184
  }
185
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
  /**
187
  * Load remote/local resource
188
  *
@@ -194,16 +229,7 @@ class Optimizer extends Root {
194
  if ( ! $real_file || $postfix != $file_type ) {
195
  Debug2::debug2( '[CSS] Load Remote [' . $file_type . '] ' . $src );
196
  $this_url = substr( $src, 0, 2 ) == '//' ? set_url_scheme( $src ) : $src;
197
- $res = wp_remote_get( $this_url );
198
- $res_code = wp_remote_retrieve_response_code( $res );
199
- if ( is_wp_error( $res ) || $res_code == 404 ) {
200
- Debug2::debug2( '[CSS] ❌ Load Remote error [code] ' . $res_code );
201
- return false;
202
- }
203
- $con = wp_remote_retrieve_body( $res );
204
- if ( ! $con ) {
205
- return false;
206
- }
207
 
208
  if ( $file_type == 'css' ) {
209
  $dirname = dirname( $this_url ) . '/';
44
  $obj = new Lib\HTML_MIN( $content, $options );
45
  $content_final = $obj->process();
46
  if ( ! defined( 'LSCACHE_ESI_SILENCE' ) ) {
47
+ $content_final .= "\n" . '<!-- Page optimized by LiteSpeed Cache @' . date( 'Y-m-d H:i:s', time() + LITESPEED_TIME_OFFSET ) . ' -->';
48
  }
49
  return $content_final;
50
 
183
  return $content;
184
  }
185
 
186
+ /**
187
+ * Load remote resource from cache if existed
188
+ *
189
+ * @since 4.7
190
+ */
191
+ private function load_cached_file( $url, $file_type ) {
192
+ $file_path_prefix = $this->_build_filepath_prefix( $file_type );
193
+ $folder_name = LITESPEED_STATIC_DIR . $file_path_prefix;
194
+ $to_be_deleted_folder = $folder_name . date( 'Ymd', strtotime( '-2 days') );
195
+ if ( file_exists( $to_be_deleted_folder ) ) {
196
+ Debug2::debug( '[Optimizer] ❌ Clearning folder [name] ' . $to_be_deleted_folder );
197
+ File::rrmdir( $to_be_deleted_folder );
198
+ }
199
+
200
+ $today_file = $folder_name . date( 'Ymd' ) . '/' . md5( $url );
201
+ if( file_exists( $today_file ) ) return File::read( $today_file );
202
+
203
+ // Write file
204
+ $res = wp_remote_get( $url );
205
+ $res_code = wp_remote_retrieve_response_code( $res );
206
+ if ( is_wp_error( $res ) || $res_code != 200 ) {
207
+ Debug2::debug2( '[Optimizer] ❌ Load Remote error [code] ' . $res_code );
208
+ return false;
209
+ }
210
+ $con = wp_remote_retrieve_body( $res );
211
+ if ( ! $con ) {
212
+ return false;
213
+ }
214
+
215
+ Debug2::debug( '[Optimizer] ✅ Save remote file to cache [name] ' . $today_file );
216
+ File::save( $today_file, $con, true );
217
+
218
+ return $con;
219
+ }
220
+
221
  /**
222
  * Load remote/local resource
223
  *
229
  if ( ! $real_file || $postfix != $file_type ) {
230
  Debug2::debug2( '[CSS] Load Remote [' . $file_type . '] ' . $src );
231
  $this_url = substr( $src, 0, 2 ) == '//' ? set_url_scheme( $src ) : $src;
232
+ $con = $this->load_cached_file($this_url, $file_type);
 
 
 
 
 
 
 
 
 
233
 
234
  if ( $file_type == 'css' ) {
235
  $dirname = dirname( $this_url ) . '/';
src/placeholder.cls.php CHANGED
@@ -330,7 +330,7 @@ class Placeholder extends Base {
330
  $res = $_instance->_generate_placeholder( $v, true );
331
 
332
  // Exit queue if out of quota
333
- if ( $res == 'out_of_quota' ) {
334
  return;
335
  }
336
 
330
  $res = $_instance->_generate_placeholder( $v, true );
331
 
332
  // Exit queue if out of quota
333
+ if ( $res === 'out_of_quota' ) {
334
  return;
335
  }
336
 
src/purge.cls.php CHANGED
@@ -36,6 +36,7 @@ class Purge extends Base {
36
  const TYPE_PURGE_ALL_OPCACHE = 'purge_all_opcache';
37
 
38
  const TYPE_PURGE_FRONT = 'purge_front';
 
39
  const TYPE_PURGE_FRONTPAGE = 'purge_frontpage';
40
  const TYPE_PURGE_PAGES = 'purge_pages';
41
  const TYPE_PURGE_ERROR = 'purge_error';
@@ -135,6 +136,10 @@ class Purge extends Base {
135
  $this->_purge_front();
136
  break;
137
 
 
 
 
 
138
  case self::TYPE_PURGE_FRONTPAGE:
139
  $this->_purge_frontpage();
140
  break;
@@ -597,6 +602,26 @@ class Purge extends Base {
597
  exit();
598
  }
599
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
600
  /**
601
  * Alerts LiteSpeed Web Server to purge the front page.
602
  *
@@ -1091,7 +1116,13 @@ class Purge extends Base {
1091
 
1092
  // post
1093
  $purge_tags[] = Tag::TYPE_POST . $post_id;
1094
- $purge_tags[] = Tag::get_uri_tag(wp_make_link_relative(get_permalink($post_id)));
 
 
 
 
 
 
1095
 
1096
  // for archive of categories|tags|custom tax
1097
  global $post;
36
  const TYPE_PURGE_ALL_OPCACHE = 'purge_all_opcache';
37
 
38
  const TYPE_PURGE_FRONT = 'purge_front';
39
+ const TYPE_PURGE_UCSS = 'purge_ucss';
40
  const TYPE_PURGE_FRONTPAGE = 'purge_frontpage';
41
  const TYPE_PURGE_PAGES = 'purge_pages';
42
  const TYPE_PURGE_ERROR = 'purge_error';
136
  $this->_purge_front();
137
  break;
138
 
139
+ case self::TYPE_PURGE_UCSS:
140
+ $this->_purge_ucss();
141
+ break;
142
+
143
  case self::TYPE_PURGE_FRONTPAGE:
144
  $this->_purge_frontpage();
145
  break;
602
  exit();
603
  }
604
 
605
+ /**
606
+ * Purge single UCSS
607
+ * @since 4.7
608
+ */
609
+ private function _purge_ucss() {
610
+ if ( empty( $_SERVER[ 'HTTP_REFERER' ] ) ) {
611
+ exit( 'no referer' );
612
+ }
613
+
614
+ $url_tag = empty( $_GET[ 'url_tag' ] ) ? $_SERVER[ 'HTTP_REFERER' ] : $_GET[ 'url_tag' ];
615
+
616
+ self::debug( 'Purge ucss [url_tag] ' . $url_tag );
617
+
618
+ do_action( 'litespeed_purge_ucss', $url_tag );
619
+ $this->purge_url( $_SERVER[ 'HTTP_REFERER' ] );
620
+
621
+ wp_redirect( $_SERVER[ 'HTTP_REFERER' ] );
622
+ exit();
623
+ }
624
+
625
  /**
626
  * Alerts LiteSpeed Web Server to purge the front page.
627
  *
1116
 
1117
  // post
1118
  $purge_tags[] = Tag::TYPE_POST . $post_id;
1119
+ $post_status = get_post_status($post_id);
1120
+ if ( function_exists( 'is_post_status_viewable' ) ) {
1121
+ $viewable = is_post_status_viewable($post_status);
1122
+ if ($viewable) {
1123
+ $purge_tags[] = Tag::get_uri_tag(wp_make_link_relative(get_permalink($post_id)));
1124
+ }
1125
+ }
1126
 
1127
  // for archive of categories|tags|custom tax
1128
  global $post;
src/rest.cls.php CHANGED
@@ -9,6 +9,7 @@ namespace LiteSpeed;
9
  defined( 'WPINC' ) || exit;
10
 
11
  class REST extends Root {
 
12
  private $_internal_rest_status = false;
13
 
14
  /**
@@ -77,6 +78,13 @@ class REST extends Root {
77
  'permission_callback' => array( $this, 'is_from_cloud' ),
78
  ) );
79
 
 
 
 
 
 
 
 
80
  // Image optm notify_img
81
  // Need validation
82
  register_rest_route( 'litespeed/v1', '/notify_img', array(
@@ -85,6 +93,18 @@ class REST extends Root {
85
  'permission_callback' => array( $this, 'is_from_cloud' ),
86
  ) );
87
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  // Image optm check_img
89
  // Need validation
90
  register_rest_route( 'litespeed/v1', '/check_img', array(
@@ -171,6 +191,15 @@ class REST extends Root {
171
  return $this->cls( 'Cloud' )->save_apikey();
172
  }
173
 
 
 
 
 
 
 
 
 
 
174
  /**
175
  * Launch api call
176
  *
@@ -180,6 +209,22 @@ class REST extends Root {
180
  return Img_Optm::cls()->notify_img();
181
  }
182
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  /**
184
  * Launch api call
185
  *
9
  defined( 'WPINC' ) || exit;
10
 
11
  class REST extends Root {
12
+ const LOG_TAG = '☎️';
13
  private $_internal_rest_status = false;
14
 
15
  /**
78
  'permission_callback' => array( $this, 'is_from_cloud' ),
79
  ) );
80
 
81
+ // CDN setup callback notification
82
+ register_rest_route( 'litespeed/v1', '/cdn_status', array(
83
+ 'methods' => 'POST',
84
+ 'callback' => array( $this, 'cdn_status' ),
85
+ 'permission_callback' => array( $this, 'is_from_cloud' ),
86
+ ) );
87
+
88
  // Image optm notify_img
89
  // Need validation
90
  register_rest_route( 'litespeed/v1', '/notify_img', array(
93
  'permission_callback' => array( $this, 'is_from_cloud' ),
94
  ) );
95
 
96
+ register_rest_route( 'litespeed/v1', '/notify_vpi', array(
97
+ 'methods' => 'POST',
98
+ 'callback' => array( $this, 'notify_vpi' ),
99
+ 'permission_callback' => array( $this, 'is_from_cloud' ),
100
+ ) );
101
+
102
+ register_rest_route( 'litespeed/v1', '/err_domains', array(
103
+ 'methods' => 'POST',
104
+ 'callback' => array( $this, 'err_domains' ),
105
+ 'permission_callback' => array( $this, 'is_from_cloud' ),
106
+ ) );
107
+
108
  // Image optm check_img
109
  // Need validation
110
  register_rest_route( 'litespeed/v1', '/check_img', array(
191
  return $this->cls( 'Cloud' )->save_apikey();
192
  }
193
 
194
+ /**
195
+ * Endpoint for QC to notify plugin of CDN setup status update.
196
+ *
197
+ * @since 3.0
198
+ */
199
+ public function cdn_status() {
200
+ return $this->cls( 'Cdn_Setup' )->update_cdn_status();
201
+ }
202
+
203
  /**
204
  * Launch api call
205
  *
209
  return Img_Optm::cls()->notify_img();
210
  }
211
 
212
+ /**
213
+ * @since 4.7
214
+ */
215
+ public function notify_vpi() {
216
+ self::debug('notify_vpi');
217
+ return VPI::cls()->notify();
218
+ }
219
+
220
+ /**
221
+ * @since 4.7
222
+ */
223
+ public function err_domains() {
224
+ self::debug('err_domains');
225
+ return $this->cls( 'Cloud' )->rest_err_domains();
226
+ }
227
+
228
  /**
229
  * Launch api call
230
  *
src/root.cls.php CHANGED
@@ -18,6 +18,16 @@ abstract class Root {
18
  private static $_primary_options = array();
19
  private static $_network_options = array();
20
 
 
 
 
 
 
 
 
 
 
 
21
  /**
22
  * Log a debug message.
23
  *
@@ -95,8 +105,7 @@ abstract class Root {
95
  File::rrmdir( LITESPEED_STATIC_DIR . '/' . $type . '/' . $subsite_id );
96
 
97
  // Clear All summary data
98
- $this->_summary = array();
99
- self::save_summary();
100
 
101
  if ( $type == 'ccss' || $type == 'ucss') {
102
  Debug2::debug( '[CSS] Cleared ' . $type . ' queue' );
@@ -562,12 +571,28 @@ abstract class Root {
562
  * @since 3.0
563
  * @access public
564
  */
565
- public static function save_summary( $data = null ) {
566
- if ( $data === null ) {
567
- $data = static::cls()->_summary;
568
  }
569
 
570
- self::update_option( '_summary', $data );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
571
  }
572
 
573
  /**
18
  private static $_primary_options = array();
19
  private static $_network_options = array();
20
 
21
+ /**
22
+ * Check if need to separate ccss for mobile
23
+ *
24
+ * @since 4.7
25
+ * @access protected
26
+ */
27
+ protected function _separate_mobile() {
28
+ return ( wp_is_mobile() || apply_filters( 'litespeed_is_mobile', false ) ) && $this->conf( Base::O_CACHE_MOBILE );
29
+ }
30
+
31
  /**
32
  * Log a debug message.
33
  *
105
  File::rrmdir( LITESPEED_STATIC_DIR . '/' . $type . '/' . $subsite_id );
106
 
107
  // Clear All summary data
108
+ self::save_summary( false, false, true );
 
109
 
110
  if ( $type == 'ccss' || $type == 'ucss') {
111
  Debug2::debug( '[CSS] Cleared ' . $type . ' queue' );
571
  * @since 3.0
572
  * @access public
573
  */
574
+ public static function save_summary( $data = false, $reload = false, $overwrite = false ) {
575
+ if ( $reload ) {
576
+ self::reload_summary();
577
  }
578
 
579
+ $existing_summary = static::cls()->_summary;
580
+ if ( $overwrite ) {
581
+ $existing_summary = array();
582
+ }
583
+ $new_summary = array_merge( $existing_summary, $data ?: array() );
584
+ // self::debug2( 'Save after Reloaded summary', $new_summary );
585
+
586
+ self::update_option( '_summary', $new_summary );
587
+ }
588
+
589
+ /**
590
+ * Reload summary
591
+ * @since 5.0
592
+ */
593
+ public static function reload_summary() {
594
+ static::cls()->_summary = self::get_summary();
595
+ // self::debug2( 'Reloaded summary', static::cls()->_summary );
596
  }
597
 
598
  /**
src/router.cls.php CHANGED
@@ -20,6 +20,7 @@ class Router extends Base {
20
  const ACTION_AVATAR = 'avatar';
21
  const ACTION_SAVE_SETTINGS = 'save-settings';
22
  const ACTION_CLOUD = 'cloud';
 
23
  const ACTION_IMG_OPTM = 'img_optm';
24
  const ACTION_HEALTH = 'health';
25
  const ACTION_CRAWLER = 'crawler';
@@ -27,6 +28,7 @@ class Router extends Base {
27
  const ACTION_CONF = 'conf';
28
  const ACTION_ACTIVATION = 'activation';
29
  const ACTION_CSS = 'css';
 
30
  const ACTION_IMPORT = 'import';
31
  const ACTION_REPORT = 'report';
32
  const ACTION_DEBUG2 = 'debug2';
@@ -38,9 +40,11 @@ class Router extends Base {
38
  self::ACTION_AVATAR,
39
  self::ACTION_CDN_CLOUDFLARE,
40
  self::ACTION_CLOUD,
 
41
  self::ACTION_CONF,
42
  self::ACTION_CRAWLER,
43
  self::ACTION_CSS,
 
44
  self::ACTION_DB_OPTM,
45
  self::ACTION_DEBUG2,
46
  self::ACTION_HEALTH,
@@ -557,11 +561,13 @@ class Router extends Base {
557
  case self::ACTION_AVATAR:
558
  case self::ACTION_IMG_OPTM:
559
  case self::ACTION_CLOUD:
 
560
  case self::ACTION_CDN_CLOUDFLARE:
561
  case self::ACTION_CRAWLER:
562
  case self::ACTION_IMPORT:
563
  case self::ACTION_REPORT:
564
  case self::ACTION_CSS:
 
565
  case self::ACTION_CONF:
566
  case self::ACTION_ACTIVATION:
567
  case self::ACTION_HEALTH:
@@ -599,11 +605,11 @@ class Router extends Base {
599
  * Verify nonce
600
  *
601
  * @since 1.1.0
602
- * @access private
603
  * @param string $action
604
  * @return bool
605
  */
606
- private function verify_nonce( $action ) {
607
  if ( ! isset( $_REQUEST[ Router::NONCE ] ) || ! wp_verify_nonce( $_REQUEST[ Router::NONCE ], $action ) ) {
608
  return false;
609
  }
20
  const ACTION_AVATAR = 'avatar';
21
  const ACTION_SAVE_SETTINGS = 'save-settings';
22
  const ACTION_CLOUD = 'cloud';
23
+ const ACTION_CDN_SETUP = 'cdn_setup';
24
  const ACTION_IMG_OPTM = 'img_optm';
25
  const ACTION_HEALTH = 'health';
26
  const ACTION_CRAWLER = 'crawler';
28
  const ACTION_CONF = 'conf';
29
  const ACTION_ACTIVATION = 'activation';
30
  const ACTION_CSS = 'css';
31
+ const ACTION_VPI = 'vpi';
32
  const ACTION_IMPORT = 'import';
33
  const ACTION_REPORT = 'report';
34
  const ACTION_DEBUG2 = 'debug2';
40
  self::ACTION_AVATAR,
41
  self::ACTION_CDN_CLOUDFLARE,
42
  self::ACTION_CLOUD,
43
+ self::ACTION_CDN_SETUP,
44
  self::ACTION_CONF,
45
  self::ACTION_CRAWLER,
46
  self::ACTION_CSS,
47
+ self::ACTION_VPI,
48
  self::ACTION_DB_OPTM,
49
  self::ACTION_DEBUG2,
50
  self::ACTION_HEALTH,
561
  case self::ACTION_AVATAR:
562
  case self::ACTION_IMG_OPTM:
563
  case self::ACTION_CLOUD:
564
+ case self::ACTION_CDN_SETUP:
565
  case self::ACTION_CDN_CLOUDFLARE:
566
  case self::ACTION_CRAWLER:
567
  case self::ACTION_IMPORT:
568
  case self::ACTION_REPORT:
569
  case self::ACTION_CSS:
570
+ case self::ACTION_VPI:
571
  case self::ACTION_CONF:
572
  case self::ACTION_ACTIVATION:
573
  case self::ACTION_HEALTH:
605
  * Verify nonce
606
  *
607
  * @since 1.1.0
608
+ * @access public
609
  * @param string $action
610
  * @return bool
611
  */
612
+ public function verify_nonce( $action ) {
613
  if ( ! isset( $_REQUEST[ Router::NONCE ] ) || ! wp_verify_nonce( $_REQUEST[ Router::NONCE ], $action ) ) {
614
  return false;
615
  }
src/task.cls.php CHANGED
@@ -14,6 +14,7 @@ class Task extends Root {
14
  Base::O_IMG_OPTM_CRON => array( 'name' => 'litespeed_task_imgoptm_pull', 'hook' => 'LiteSpeed\Img_Optm::cron_pull' ), // always fetch immediately
15
  Base::O_OPTM_CSS_ASYNC => array( 'name' => 'litespeed_task_ccss', 'hook' => 'LiteSpeed\CSS::cron_ccss' ),
16
  Base::O_OPTM_UCSS => array( 'name' => 'litespeed_task_ucss', 'hook' => 'LiteSpeed\CSS::cron_ucss' ),
 
17
  Base::O_MEDIA_PLACEHOLDER_RESP_ASYNC => array( 'name' => 'litespeed_task_lqip', 'hook' => 'LiteSpeed\Placeholder::cron' ),
18
  Base::O_DISCUSS_AVATAR_CRON => array( 'name' => 'litespeed_task_avatar', 'hook' => 'LiteSpeed\Avatar::cron' ),
19
  Base::O_IMG_OPTM_AUTO => array( 'name' => 'litespeed_task_imgoptm_req', 'hook' => 'LiteSpeed\Img_Optm::cron_auto_request' ),
@@ -23,6 +24,7 @@ class Task extends Root {
23
  private static $_guest_options = array(
24
  Base::O_OPTM_CSS_ASYNC,
25
  Base::O_OPTM_UCSS,
 
26
  );
27
 
28
  const FITLER_CRAWLER = 'litespeed_crawl_filter';
14
  Base::O_IMG_OPTM_CRON => array( 'name' => 'litespeed_task_imgoptm_pull', 'hook' => 'LiteSpeed\Img_Optm::cron_pull' ), // always fetch immediately
15
  Base::O_OPTM_CSS_ASYNC => array( 'name' => 'litespeed_task_ccss', 'hook' => 'LiteSpeed\CSS::cron_ccss' ),
16
  Base::O_OPTM_UCSS => array( 'name' => 'litespeed_task_ucss', 'hook' => 'LiteSpeed\CSS::cron_ucss' ),
17
+ Base::O_MEDIA_VPI_CRON => array( 'name' => 'litespeed_task_vpi', 'hook' => 'LiteSpeed\VPI::cron' ),
18
  Base::O_MEDIA_PLACEHOLDER_RESP_ASYNC => array( 'name' => 'litespeed_task_lqip', 'hook' => 'LiteSpeed\Placeholder::cron' ),
19
  Base::O_DISCUSS_AVATAR_CRON => array( 'name' => 'litespeed_task_avatar', 'hook' => 'LiteSpeed\Avatar::cron' ),
20
  Base::O_IMG_OPTM_AUTO => array( 'name' => 'litespeed_task_imgoptm_req', 'hook' => 'LiteSpeed\Img_Optm::cron_auto_request' ),
24
  private static $_guest_options = array(
25
  Base::O_OPTM_CSS_ASYNC,
26
  Base::O_OPTM_UCSS,
27
+ Base::O_MEDIA_VPI,
28
  );
29
 
30
  const FITLER_CRAWLER = 'litespeed_crawl_filter';
src/utility.cls.php CHANGED
@@ -402,6 +402,30 @@ class Utility extends Root {
402
  return $url;
403
  }
404
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  /**
406
  * Convert URL to URI
407
  *
@@ -525,6 +549,8 @@ class Utility extends Root {
525
  * @return string
526
  */
527
  public static function sanitize_lines( $arr, $type = null ) {
 
 
528
  if ( ! $arr ) {
529
  if ( $type === 'string' ) {
530
  return '';
@@ -538,31 +564,44 @@ class Utility extends Root {
538
 
539
  $arr = array_map( 'trim', $arr );
540
  $changed = false;
541
- if ( $type === 'uri' ) {
542
  $arr = array_map( __CLASS__ . '::url2uri', $arr );
543
  $changed = true;
544
  }
545
- if ( $type === 'relative' ) {
 
 
 
 
 
 
 
 
546
  $arr = array_map( __CLASS__ . '::make_relative', $arr );// Remove domain
547
  $changed = true;
548
  }
549
- if ( $type === 'domain' ) {
550
  $arr = array_map( __CLASS__ . '::parse_domain', $arr );// Only keep domain
551
  $changed = true;
552
  }
553
 
554
- if ( $type === 'noprotocol' ) {
555
  $arr = array_map( __CLASS__ . '::noprotocol', $arr ); // Drop protocol, `https://example.com` -> `//example.com`
556
  $changed = true;
557
  }
558
 
 
 
 
 
 
559
  if ( $changed ) {
560
  $arr = array_map( 'trim', $arr );
561
  }
562
  $arr = array_unique( $arr );
563
  $arr = array_filter( $arr );
564
 
565
- if ( $type === 'string' ) {
566
  return implode( "\n", $arr );
567
  }
568
 
402
  return $url;
403
  }
404
 
405
+ /**
406
+ * Convert URL to basename (filename)
407
+ *
408
+ * @since 4.7
409
+ */
410
+ public static function basename( $url ) {
411
+ $url = trim( $url );
412
+ $uri = @parse_url( $url, PHP_URL_PATH );
413
+ $basename = pathinfo( $uri, PATHINFO_BASENAME );
414
+
415
+ return $basename;
416
+ }
417
+
418
+ /**
419
+ * Drop .webp if existed in filename
420
+ *
421
+ * @since 4.7
422
+ */
423
+ public static function drop_webp( $filename ) {
424
+ if ( substr($filename, -5 ) === '.webp' ) $filename = substr( $filename, 0, -5 );
425
+
426
+ return $filename;
427
+ }
428
+
429
  /**
430
  * Convert URL to URI
431
  *
549
  * @return string
550
  */
551
  public static function sanitize_lines( $arr, $type = null ) {
552
+ $types = $type ? explode( ',', $type ) : array();
553
+
554
  if ( ! $arr ) {
555
  if ( $type === 'string' ) {
556
  return '';
564
 
565
  $arr = array_map( 'trim', $arr );
566
  $changed = false;
567
+ if ( in_array( 'uri', $types ) ) {
568
  $arr = array_map( __CLASS__ . '::url2uri', $arr );
569
  $changed = true;
570
  }
571
+ if ( in_array( 'basename', $types ) ) {
572
+ $arr = array_map( __CLASS__ . '::basename', $arr );
573
+ $changed = true;
574
+ }
575
+ if ( in_array( 'drop_webp', $types ) ) {
576
+ $arr = array_map( __CLASS__ . '::drop_webp', $arr );
577
+ $changed = true;
578
+ }
579
+ if ( in_array( 'relative', $types ) ) {
580
  $arr = array_map( __CLASS__ . '::make_relative', $arr );// Remove domain
581
  $changed = true;
582
  }
583
+ if ( in_array( 'domain', $types ) ) {
584
  $arr = array_map( __CLASS__ . '::parse_domain', $arr );// Only keep domain
585
  $changed = true;
586
  }
587
 
588
+ if ( in_array( 'noprotocol', $types ) ) {
589
  $arr = array_map( __CLASS__ . '::noprotocol', $arr ); // Drop protocol, `https://example.com` -> `//example.com`
590
  $changed = true;
591
  }
592
 
593
+ if ( in_array( 'trailingslash', $types ) ) {
594
+ $arr = array_map( 'trailingslashit', $arr ); // Append trailing slach, `https://example.com` -> `https://example.com/`
595
+ $changed = true;
596
+ }
597
+
598
  if ( $changed ) {
599
  $arr = array_map( 'trim', $arr );
600
  }
601
  $arr = array_unique( $arr );
602
  $arr = array_filter( $arr );
603
 
604
+ if ( in_array( 'string', $types ) ) {
605
  return implode( "\n", $arr );
606
  }
607
 
src/vary.cls.php CHANGED
@@ -170,6 +170,11 @@ class Vary extends Root {
170
  return;
171
  }
172
 
 
 
 
 
 
173
  Debug2::debug( '[Vary] 👒👒 Guest mode' );
174
 
175
  ! defined( 'LITESPEED_GUEST' ) && define( 'LITESPEED_GUEST', true );
170
  return;
171
  }
172
 
173
+ /* @ref https://wordpress.org/support/topic/checkout-add-to-cart-executed-twice/ */
174
+ if ( ! empty( $_GET[ 'litespeed_guest_off' ] ) ) {
175
+ return;
176
+ }
177
+
178
  Debug2::debug( '[Vary] 👒👒 Guest mode' );
179
 
180
  ! defined( 'LITESPEED_GUEST' ) && define( 'LITESPEED_GUEST', true );
src/vpi.cls.php ADDED
@@ -0,0 +1,329 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The viewport image class.
4
+ *
5
+ * @since 4.7
6
+ */
7
+ namespace LiteSpeed;
8
+ defined( 'WPINC' ) || exit;
9
+
10
+ class VPI extends Base {
11
+ const LOG_TAG = '[VPI]';
12
+
13
+ const TYPE_GEN = 'gen';
14
+ const TYPE_CLEAR_Q = 'clear_q';
15
+
16
+ /**
17
+ * Init
18
+ *
19
+ * @since 4.7
20
+ */
21
+ public function __construct() {
22
+ $this->_summary = self::get_summary();
23
+ }
24
+
25
+ /**
26
+ * The VPI content of the current page
27
+ *
28
+ * @since 4.7
29
+ */
30
+ public function add_to_queue() {
31
+ $is_mobile = $this->_separate_mobile();
32
+
33
+ global $wp;
34
+ $request_url = home_url( $wp->request );
35
+
36
+ $ua = ! empty( $_SERVER[ 'HTTP_USER_AGENT' ] ) ? $_SERVER[ 'HTTP_USER_AGENT' ] : '';
37
+
38
+ // Store it to prepare for cron
39
+ $this->_queue = $this->load_queue( 'vpi' );
40
+
41
+ if ( count( $this->_queue ) > 500 ) {
42
+ self::debug( 'Queue is full - 500' );
43
+ return;
44
+ }
45
+
46
+ if ( ! is_singular() ) {
47
+ self::debug( 'not single post ID' );
48
+ return;
49
+ }
50
+
51
+ $post_id = get_the_ID();
52
+
53
+ $queue_k = ( $is_mobile ? 'mobile' : '' ) . ' ' . $request_url;
54
+ if ( ! empty( $this->_queue[ $queue_k ] ) ) {
55
+ self::debug( 'queue k existed ' . $queue_k );
56
+ return;
57
+ }
58
+
59
+ $this->_queue[ $queue_k ] = array(
60
+ 'url' => apply_filters( 'litespeed_vpi_url', $request_url ),
61
+ 'post_id' => $post_id,
62
+ 'user_agent' => substr( $ua, 0, 200 ),
63
+ 'is_mobile' => $this->_separate_mobile(),
64
+ ); // Current UA will be used to request
65
+ $this->save_queue( 'vpi', $this->_queue );
66
+ self::debug( 'Added queue_vpi [url] ' . $queue_k . ' [UA] ' . $ua );
67
+
68
+ // Prepare cache tag for later purge
69
+ Tag::add( 'VPI.' . md5( $queue_k ) );
70
+
71
+ return null;
72
+ }
73
+
74
+ /**
75
+ * Notify finished from server
76
+ * @since 4.7
77
+ */
78
+ public function notify() {
79
+ $post_data = json_decode(file_get_contents('php://input'), true);
80
+ if( is_null( $post_data ) ) {
81
+ $post_data = $_POST;
82
+ }
83
+ self::debug( 'notify() data', $post_data );
84
+
85
+ $this->_queue = $this->load_queue( 'vpi' );
86
+
87
+ // Validate key
88
+ if ( empty( $post_data[ 'domain_key' ] ) || $post_data[ 'domain_key' ] !== md5( $this->conf( self::O_API_KEY ) ) ) {
89
+ self::debug( '❌ notify wrong key' );
90
+ self::save_summary( array( 'notify_ts_err' => time() ) );
91
+ return Cloud::err( 'wrong_key' );
92
+ }
93
+
94
+ list( $post_data ) = $this->cls( 'Cloud' )->extract_msg( $post_data, 'vpi' );
95
+
96
+ global $wpdb;
97
+
98
+ $notified_data = $post_data[ 'data' ];
99
+ if ( empty( $notified_data ) || ! is_array( $notified_data ) ) {
100
+ self::debug( '❌ notify exit: no notified data' );
101
+ return Cloud::err( 'no notified data' );
102
+ }
103
+
104
+ // Check if its in queue or not
105
+ $valid_i = 0;
106
+ foreach ( $notified_data as $v ) {
107
+ if ( empty( $v[ 'request_url' ] ) ) {
108
+ self::debug( '❌ notify bypass: no request_url', $v );
109
+ continue;
110
+ }
111
+ $is_mobile = !empty( $v[ 'is_mobile' ] );
112
+ $queue_k = ( $is_mobile ? 'mobile' : '' ) . ' ' . $v[ 'request_url' ];
113
+
114
+ if ( empty( $this->_queue[ $queue_k ] ) ) {
115
+ self::debug( '❌ notify bypass: no this queue [q_k]' . $queue_k );
116
+ continue;
117
+ }
118
+
119
+ // Save data
120
+ if ( ! empty( $v[ 'data' ] ) ) {
121
+ $post_id = $this->_queue[ $queue_k ][ 'post_id' ];
122
+ $name = $is_mobile ? 'litespeed_vpi_list_mobile' : 'litespeed_vpi_list';
123
+ $this->cls( 'Metabox' )->save( $post_id, $name, $v[ 'data' ], true );
124
+
125
+ $valid_i ++;
126
+ }
127
+
128
+ unset( $this->_queue[ $queue_k ] );
129
+ self::debug( 'notify data handled, unset queue [q_k] ' . $queue_k );
130
+ }
131
+ $this->save_queue( 'vpi', $this->_queue );
132
+
133
+ self::debug( 'notified' );
134
+
135
+ return Cloud::ok( array( 'count' => $valid_i ) );
136
+ }
137
+
138
+ /**
139
+ * Cron
140
+ *
141
+ * @since 4.7
142
+ */
143
+ public static function cron( $continue = false ) {
144
+ $_instance = self::cls();
145
+ return $_instance->_cron_handler( $continue );
146
+ }
147
+
148
+ /**
149
+ * Cron generation
150
+ *
151
+ * @since 4.7
152
+ */
153
+ private function _cron_handler( $continue = false ) {
154
+ self::debug( 'cron start' );
155
+ $this->_queue = $this->load_queue( 'vpi' );
156
+
157
+ if ( empty( $this->_queue ) ) {
158
+ return;
159
+ }
160
+
161
+ // For cron, need to check request interval too
162
+ if ( ! $continue ) {
163
+ if ( ! empty( $this->_summary[ 'curr_request_vpi' ] ) && time() - $this->_summary[ 'curr_request_vpi' ] < 300 && ! $this->conf( self::O_DEBUG ) ) {
164
+ self::debug( 'Last request not done' );
165
+ return;
166
+ }
167
+ }
168
+
169
+ $i = 0;
170
+ foreach ( $this->_queue as $k => $v ) {
171
+ if ( ! empty( $v[ '_status' ] ) ) {
172
+ continue;
173
+ }
174
+
175
+ self::debug( 'cron job [tag] ' . $k . ' [url] ' . $v[ 'url' ] . ( $v[ 'is_mobile' ] ? ' 📱 ' : '' ) . ' [UA] ' . $v[ 'user_agent' ] );
176
+
177
+ $i ++;
178
+ $res = $this->_send_req( $v[ 'url' ], $k, $v[ 'user_agent' ], $v[ 'is_mobile' ] );
179
+ if ( ! $res ) { // Status is wrong, drop this this->_queue
180
+ $this->_queue = $this->load_queue( 'vpi' );
181
+ unset( $this->_queue[ $k ] );
182
+ $this->save_queue( 'vpi', $this->_queue );
183
+
184
+ if ( ! $continue ) {
185
+ return;
186
+ }
187
+
188
+ // if ( $i > 3 ) {
189
+ GUI::print_loading( count( $this->_queue ), 'VPI' );
190
+ return Router::self_redirect( Router::ACTION_VPI, self::TYPE_GEN );
191
+ // }
192
+
193
+ continue;
194
+ }
195
+
196
+ // Exit queue if out of quota
197
+ if ( $res === 'out_of_quota' ) {
198
+ return;
199
+ }
200
+
201
+ $this->_queue = $this->load_queue( 'vpi' );
202
+ $this->_queue[ $k ][ '_status' ] = 'requested';
203
+ $this->save_queue( 'vpi', $this->_queue );
204
+ self::debug( 'Saved to queue [k] ' . $k );
205
+
206
+ // only request first one
207
+ if ( ! $continue ) {
208
+ return;
209
+ }
210
+
211
+ // if ( $i > 3 ) {
212
+ GUI::print_loading( count( $this->_queue ), 'VPI' );
213
+ return Router::self_redirect( Router::ACTION_VPI, self::TYPE_GEN );
214
+ // }
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Prepare HTML from URL
220
+ *
221
+ * @since 4.7
222
+ */
223
+ public function prepare_html( $request_url, $user_agent ) {
224
+ $html = $this->cls( 'Crawler' )->self_curl( $request_url, $user_agent );
225
+ self::debug2( 'self_curl result....', $html );
226
+
227
+
228
+ $html = $this->cls( 'Optimizer' )->html_min( $html, true );
229
+ // Drop <noscript>xxx</noscript>
230
+ $html = preg_replace( '#<noscript>.*</noscript>#isU', '', $html );
231
+
232
+ return $html;
233
+ }
234
+
235
+ /**
236
+ * Send to QC API to generate VPI
237
+ *
238
+ * @since 4.7
239
+ * @access private
240
+ */
241
+ private function _send_req( $request_url, $queue_k, $user_agent, $is_mobile ) {
242
+ $svc = Cloud::SVC_VPI;
243
+ // Check if has credit to push or not
244
+ $err = false;
245
+ $allowance = $this->cls( 'Cloud' )->allowance( $svc, $err );
246
+ if ( ! $allowance ) {
247
+ self::debug( '❌ No credit: ' . $err );
248
+ $err && Admin_Display::error( Error::msg( $err ) );
249
+ return 'out_of_quota';
250
+ }
251
+
252
+ set_time_limit( 120 );
253
+
254
+ // Update css request status
255
+ self::save_summary( array( 'curr_request_vpi' => time() ), true );
256
+
257
+ // Gather guest HTML to send
258
+ $html = $this->prepare_html( $request_url, $user_agent );
259
+
260
+ if ( ! $html ) {
261
+ return false;
262
+ }
263
+
264
+ // Parse HTML to gather all CSS content before requesting
265
+ $css = false;
266
+ list( $css, $html ) = $this->cls( 'CSS' )->prepare_css( $html );
267
+
268
+ if ( ! $css ) {
269
+ self::debug( '❌ No css' );
270
+ return false;
271
+ }
272
+
273
+ // Generate critical css
274
+ $data = array(
275
+ // 'type' => strtoupper( $type ), // Backward compatibility for v4.1-
276
+ 'url' => $request_url,
277
+ 'queue_k' => $queue_k,
278
+ 'user_agent' => $user_agent,
279
+ 'is_mobile' => $is_mobile ? 1 : 0, // todo:compatible w/ tablet
280
+ 'html' => $html,
281
+ 'css' => $css,
282
+ );
283
+ self::debug( 'Generating: ', $data );
284
+
285
+ $json = Cloud::post( $svc, $data, 30 );
286
+ if ( ! is_array( $json ) ) {
287
+ return false;
288
+ }
289
+
290
+ // Unknown status, remove this line
291
+ if ( $json[ 'status' ] != 'queued' ) {
292
+ return false;
293
+ }
294
+
295
+ // Save summary data
296
+ self::reload_summary();
297
+ $this->_summary[ 'last_spent_vpi' ] = time() - $this->_summary[ 'curr_request_vpi' ];
298
+ $this->_summary[ 'last_request_vpi' ] = $this->_summary[ 'curr_request_vpi' ];
299
+ $this->_summary[ 'curr_request_vpi' ] = 0;
300
+ self::save_summary();
301
+
302
+ return true;
303
+ }
304
+
305
+ /**
306
+ * Handle all request actions from main cls
307
+ *
308
+ * @since 4.7
309
+ */
310
+ public function handler() {
311
+ $type = Router::verify_type();
312
+
313
+ switch ( $type ) {
314
+ case self::TYPE_GEN:
315
+ self::cron( true );
316
+ break;
317
+
318
+ case self::TYPE_CLEAR_Q:
319
+ $this->clear_q( 'vpi' );
320
+ break;
321
+
322
+ default:
323
+ break;
324
+ }
325
+
326
+ Admin::redirect();
327
+ }
328
+
329
+ }
thirdparty/divi-theme-builder.cls.php CHANGED
@@ -29,6 +29,10 @@ class Divi_Theme_Builder
29
  public static function detect()
30
  {
31
  if ( ! defined( 'ET_CORE' ) ) return;
 
 
 
 
32
  /**
33
  * Add contact form to nonce
34
  * @since 2.9.7.1 #475461
29
  public static function detect()
30
  {
31
  if ( ! defined( 'ET_CORE' ) ) return;
32
+
33
+ // As DIVI will set page to non-cacheable for the 1st visit to generate CCSS, will need to ignore that no-cache for crawler
34
+ defined( 'LITESPEED_CRAWLER_IGNORE_NONCACHEABLE' ) || define( 'LITESPEED_CRAWLER_IGNORE_NONCACHEABLE', true );
35
+
36
  /**
37
  * Add contact form to nonce
38
  * @since 2.9.7.1 #475461
thirdparty/entry.inc.php CHANGED
@@ -23,6 +23,7 @@ $third_cls = array(
23
  'Caldera_Forms',
24
  'Divi_Theme_Builder',
25
  'Facetwp',
 
26
  'Theme_My_Login',
27
  'User_Switching',
28
  'WCML',
23
  'Caldera_Forms',
24
  'Divi_Theme_Builder',
25
  'Facetwp',
26
+ 'LiteSpeed_Check',
27
  'Theme_My_Login',
28
  'User_Switching',
29
  'WCML',
thirdparty/litespeed-check.cls.php ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Check if any plugins that could conflict with LiteSpeed Cache are active.
4
+ * @since 4.7
5
+ */
6
+
7
+ namespace LiteSpeed\Thirdparty;
8
+
9
+ defined( 'WPINC' ) || exit;
10
+
11
+ class LiteSpeed_Check {
12
+
13
+ public static $_incompatible_plugins =
14
+ array(
15
+ 'autoptimize/autoptimize.php',
16
+ 'breeze/breeze.php',
17
+ 'cache-enabler/cache-enabler.php',
18
+ 'cachify/cachify.php',
19
+ 'cloudflare/cloudflare.php',
20
+ 'comet-cache/comet-cache.php',
21
+ 'docket-cache/docket-cache.php',
22
+ 'fast-velocity-minify/fvm.php',
23
+ 'hummingbird-performance/wp-hummingbird.php',
24
+ 'nginx-cache/nginx-cache.php',
25
+ 'nitropack/main.php',
26
+ 'pantheon-advanced-page-cache/pantheon-advanced-page-cache.php',
27
+ 'powered-cache/powered-cache.php',
28
+ 'sg-cachepress/sg-cachepress.php',
29
+ 'simple-cache/simple-cache.php',
30
+ 'redis-cache/redis-cache.php',
31
+ 'w3-total-cache/w3-total-cache.php',
32
+ 'wp-cloudflare-page-cache/wp-cloudflare-page-cache.php',
33
+ 'wp-fastest-cache/wpFastestCache.php',
34
+ 'wp-meteor/wp-meteor.php',
35
+ 'wp-optimize/wp-optimize.php',
36
+ 'wp-performance-score-booster/wp-performance-score-booster.php',
37
+ 'wp-rocket/wp-rocket.php',
38
+ 'wp-super-cache/wp-cache.php',
39
+ );
40
+
41
+ private static $_option = 'thirdparty_litespeed_check';
42
+ private static $_msg_id = 'id="lscwp-incompatible-plugin-notice"';
43
+
44
+ public static function detect() {
45
+ if ( ! is_admin() ) {
46
+ return;
47
+ }
48
+
49
+ /**
50
+ * Check for incompatible plugins when `litespeed-cache` is first activated.
51
+ */
52
+ $plugin = basename( LSCWP_DIR ) . '/litespeed-cache.php';
53
+ register_deactivation_hook( $plugin, function( $_network_wide ) {
54
+ \LiteSpeed\Admin_Display::delete_option( self::$_option );
55
+ } );
56
+ if ( ! \LiteSpeed\Admin_Display::get_option( self::$_option ) ) {
57
+ self::activated_plugin( $plugin, null );
58
+ \LiteSpeed\Admin_Display::add_option( self::$_option, true );
59
+ }
60
+
61
+ /**
62
+ * Check for incompatible plugins when any plugin is (de)activated.
63
+ */
64
+ add_action( 'activated_plugin', __CLASS__ . '::activated_plugin', 10, 2 );
65
+ add_action( 'deactivated_plugin', __CLASS__ . '::deactivated_plugin', 10, 2 );
66
+ }
67
+
68
+ public static function activated_plugin( $plugin, $network_wide ) {
69
+ self::incompatible_plugin_notice( $plugin, $network_wide, 'activated' );
70
+ }
71
+
72
+ public static function deactivated_plugin( $plugin, $network_wide ) {
73
+ self::incompatible_plugin_notice( $plugin, $network_wide, 'deactivated' );
74
+ }
75
+
76
+ /**
77
+ * Detect any incompatible plugins that are currently `active` and `valid`.
78
+ * Show a notification if there are any.
79
+ */
80
+ public static function incompatible_plugin_notice( $plugin, $_network_wide, $action ) {
81
+ self::update_messages();
82
+
83
+ /**
84
+ * The 'deactivated_plugin' action fires before
85
+ * `wp_get_active_and_valid_plugins` can see the change, so we'll need to
86
+ * remove `$plugin` from the list.
87
+ */
88
+ $deactivated = 'deactivated' === $action ? array( $plugin ) : array();
89
+
90
+ $incompatible_plugins =
91
+ array_map(
92
+ function( $plugin ) { return WP_PLUGIN_DIR . '/' . $plugin; },
93
+ array_diff( self::$_incompatible_plugins, $deactivated )
94
+ );
95
+
96
+ $active_incompatible_plugins =
97
+ array_map(
98
+ function( $plugin ) {
99
+ $plugin = get_plugin_data( $plugin, false, true );
100
+ return $plugin['Name'];
101
+ },
102
+ array_intersect( $incompatible_plugins, wp_get_active_and_valid_plugins() )
103
+ );
104
+
105
+ if ( empty( $active_incompatible_plugins ) ) {
106
+ return;
107
+ }
108
+
109
+ \LiteSpeed\Admin_Display::error(
110
+ '<div ' . self::$_msg_id . '>'
111
+ . esc_html__(
112
+ 'Please consider disabling the following detected plugins, as they may conflict with LiteSpeed Cache:',
113
+ 'litespeed-cache'
114
+ )
115
+ . '<p style="color: red; font-weight: 700;">'
116
+ . implode( ', ', $active_incompatible_plugins )
117
+ . '</p>'
118
+ . '</div>',
119
+ false,
120
+ true
121
+ );
122
+ }
123
+
124
+ /**
125
+ * Prevent multiple incompatible plugin notices, in case an admin (de)activates
126
+ * a number of incompatible plugins in succession without dismissing the
127
+ * notice(s).
128
+ */
129
+ private static function update_messages() {
130
+ $messages =
131
+ \LiteSpeed\Admin_Display::get_option(
132
+ \LiteSpeed\Admin_Display::DB_MSG_PIN,
133
+ array()
134
+ );
135
+ if ( is_array( $messages ) ) {
136
+ foreach ( $messages as $index => $message ) {
137
+ if ( strpos( $message, self::$_msg_id ) !== false ) {
138
+ unset( $messages[ $index ] );
139
+ if ( ! $messages ) {
140
+ $messages = -1;
141
+ }
142
+ \LiteSpeed\Admin_Display::update_option(
143
+ \LiteSpeed\Admin_Display::DB_MSG_PIN,
144
+ $messages
145
+ );
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ }
tpl/banner/new_version.php CHANGED
@@ -21,14 +21,12 @@ if ( ! isset( $current->response[ Core::PLUGIN_FILE ] ) ) {
21
  $last_check = empty( $this->_summary[ 'new_version.last_check' ] ) ? 0 : $this->_summary[ 'new_version.last_check' ];
22
  // Check once in a half day
23
  if ( time() - $last_check > 43200 ) {
24
- $this->_summary[ 'new_version.last_check' ] = time();
25
- Admin_Display::save_summary( $this->_summary );
26
 
27
  // Detect version
28
  $auto_v = Cloud::version_check( 'new_version_banner' );
29
  if ( ! empty( $auto_v[ 'latest' ] ) ) {
30
- $this->_summary[ 'new_version.v' ] = $auto_v[ 'latest' ];
31
- Admin_Display::save_summary( $this->_summary );
32
  }
33
  // After detect, don't show, just return and show next time
34
  return;
21
  $last_check = empty( $this->_summary[ 'new_version.last_check' ] ) ? 0 : $this->_summary[ 'new_version.last_check' ];
22
  // Check once in a half day
23
  if ( time() - $last_check > 43200 ) {
24
+ Admin_Display::save_summary( array( 'new_version.last_check' => time() ) );
 
25
 
26
  // Detect version
27
  $auto_v = Cloud::version_check( 'new_version_banner' );
28
  if ( ! empty( $auto_v[ 'latest' ] ) ) {
29
+ Admin_Display::save_summary( array( 'new_version.v' => $auto_v[ 'latest' ] ) );
 
30
  }
31
  // After detect, don't show, just return and show next time
32
  return;
tpl/cache/settings-purge.tpl.php CHANGED
@@ -128,7 +128,7 @@ $break_arr = array(
128
  <?php $this->build_input( $id, null, null, 'time' ); ?>
129
  <div class="litespeed-desc">
130
  <?php echo sprintf( __( 'Specify the time to purge the "%s" list.', 'litespeed-cache' ), __( 'Scheduled Purge URLs', 'litespeed-cache' ) ); ?>
131
- <?php echo sprintf( __( 'Current server time is %s.', 'litespeed-cache' ), '<code>' . date( 'H:i:s' ) . '</code>' ); ?>
132
  </div>
133
  </td>
134
  </tr>
128
  <?php $this->build_input( $id, null, null, 'time' ); ?>
129
  <div class="litespeed-desc">
130
  <?php echo sprintf( __( 'Specify the time to purge the "%s" list.', 'litespeed-cache' ), __( 'Scheduled Purge URLs', 'litespeed-cache' ) ); ?>
131
+ <?php echo sprintf( __( 'Current server time is %s.', 'litespeed-cache' ), '<code>' . date( 'H:i:s', time() + LITESPEED_TIME_OFFSET ) . '</code>' ); ?>
132
  </div>
133
  </td>
134
  </tr>
tpl/cdn/auto_setup.tpl.php ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LiteSpeed;
3
+ defined( 'WPINC' ) || exit;
4
+
5
+ $__cdnsetup = Cdn_Setup::cls();
6
+
7
+ // This will drop QS param `qc_res` `domain_hash` and `token` also
8
+ $__cdnsetup->maybe_extract_token();
9
+
10
+ $cloud_linked = Cloud::get_summary( 'is_linked' );
11
+ $setup_summary = Cdn_Setup::get_summary();
12
+
13
+ $cdn_setup_done_ts = 0;
14
+ if ( ! empty( $setup_summary[ 'cdn_setup_done_ts' ] ) ) {
15
+ $cdn_setup_done_ts = $setup_summary[ 'cdn_setup_done_ts' ];
16
+ }
17
+
18
+ $has_setup_token = $__cdnsetup->has_cdn_setup_token();
19
+
20
+ if ( ! empty( $setup_summary[ 'cdn_setup_ts' ] ) ) {
21
+ $cdn_setup_ts = $setup_summary[ 'cdn_setup_ts' ];
22
+
23
+ if ( !empty( $setup_summary[ 'cdn_setup_err' ] ) ) {
24
+ $cdn_setup_err = $setup_summary[ 'cdn_setup_err' ];
25
+ }
26
+
27
+ if ($this->conf( Base::O_QC_NAMESERVERS )) {
28
+ $nameservers = explode(',', $this->conf( Base::O_QC_NAMESERVERS ));
29
+ }
30
+ } else {
31
+ $cdn_setup_ts = 0;
32
+ }
33
+
34
+ $curr_status = '<span class="litespeed-desc">' . __('Not running', 'litespeed-cache') . '</span>';
35
+ $apply_btn_txt = __( 'Run CDN Setup', 'litespeed-cache' );
36
+ $apply_btn_type = Cdn_Setup::TYPE_RUN;
37
+ $disabled = '';
38
+ $dom = parse_url(home_url(), PHP_URL_HOST);
39
+
40
+ if ($cdn_setup_done_ts) {
41
+ $curr_status = '<span class="litespeed-success dashicons dashicons-yes"></span> '
42
+ . __('Done', 'litespeed-cache')
43
+ . ' <span class="litespeed-desc litespeed-left10">'
44
+ . sprintf( __('Completed at %s', 'litespeed-cache'), wp_date(get_option( 'date_format' ) . ' ' . get_option( 'time_format'), $cdn_setup_done_ts) )
45
+ . '</span>';
46
+ $disabled = 'disabled';
47
+ } else if (!$has_setup_token) {
48
+ $disabled = 'disabled';
49
+ } else if ( ! empty( $cdn_setup_err ) ) {
50
+ $curr_status = '<span class="litespeed-warning dashicons dashicons-controls-pause"></span> ' . __('Paused', 'litespeed-cache');
51
+ $curr_status_subline = '<p class="litespeed-desc">' . $cdn_setup_err . '</p>';
52
+ } else if ( $cdn_setup_ts > 0 ) {
53
+ if ( isset($nameservers) ) {
54
+ $curr_status = '<span class="litespeed-primary dashicons dashicons-hourglass"></span> ' . __('Verifying, waiting for nameservers to be updated.', 'litespeed-cache') . ' ' . __('Click the refresh button below to refresh status.', 'litespeed-cache');
55
+ if ( isset( $setup_summary[ 'cdn_verify_msg' ])) {
56
+ $curr_status_subline = '<p class="litespeed-desc">' . __( 'Last Verification Result', 'litespeed-cache' ) . ': ' . $setup_summary[ 'cdn_verify_msg' ] . '</p>';
57
+ }
58
+ } else {
59
+ $curr_status = '<span class="litespeed-primary dashicons dashicons-hourglass"></span> ' . __('In Progress', 'litespeed-cache');
60
+ $curr_status_subline = '<p class="litespeed-desc">' . __( 'You will receive an email upon status update.', 'litespeed-cache' ) . ' ' . __( 'This process may take several minutes.', 'litespeed-cache' ) . '</p>';
61
+ }
62
+ $apply_btn_txt = __( 'Refresh CDN Setup Status', 'litespeed-cache' );
63
+ $apply_btn_type = Cdn_Setup::TYPE_STATUS;
64
+ }
65
+
66
+ ?>
67
+ <h3 class="litespeed-title">
68
+ <?php echo __( 'Auto QUIC.cloud CDN Setup', 'litespeed-cache' ); ?>
69
+ </h3>
70
+ <p>
71
+ <?php echo __( 'This is a three step process for configuring your site to use QUIC.cloud CDN with QUIC.cloud DNS. This setup will perform the following actions', 'litespeed-cache' ) . ':'; ?>
72
+ </p>
73
+ <ol>
74
+ <li><?php echo __( 'Set up a QUIC.cloud account.', 'litespeed-cache' ); ?></li>
75
+ <li><?php echo __( 'Prepare the site for QUIC.cloud CDN, detect the DNS, and create a DNS Zone.', 'litespeed-cache' ); ?></li>
76
+ <li><?php echo __( 'Provide the nameservers necessary to enable the CDN.', 'litespeed-cache' ); ?></li>
77
+ <li>
78
+ <?php echo __( 'After successful DNS detection, QUIC.cloud will attempt to generate an SSL certificate and enable the CDN.', 'litespeed-cache' ); ?>
79
+ <?php echo __( 'This last stage could take 15 to 20 minutes.', 'litespeed-cache' ); ?>
80
+ <?php echo __( 'Your site will be available, but browsers may issue a "not secure" warning during this time.', 'litespeed-cache' ); ?>
81
+ </li>
82
+ </ol>
83
+
84
+ <p>
85
+ <?php echo __( 'After you set your nameservers, QUIC.cloud will detect the change and automatically enable the CDN.', 'litespeed-cache' ); ?>
86
+ </p>
87
+
88
+ <p class="litespeed-desc">
89
+ <?php echo __( 'Notes', 'litespeed-cache' ) . ':'; ?>
90
+ </p>
91
+ <ul class="litespeed-desc">
92
+ <li>
93
+ <?php echo __( 'QUIC.cloud CDN/DNS does not support DNSSEC.', 'litespeed-cache' ); ?>
94
+ <?php echo __( 'If you have this enabled for your domain, you must disable DNSSEC to continue.', 'litespeed-cache' ); ?>
95
+ </li>
96
+ <li>
97
+ <?php echo __( 'This setup process will create a DNS zone on QUIC.cloud if one does not currently exist.', 'litespeed-cache' ); ?>
98
+ <?php printf(__( 'If you prefer to use the CNAME setup, please <a %s>set up the CDN manually at QUIC.cloud</a>.', 'litespeed-cache' ),
99
+ 'href="https://quic.cloud/docs/onboarding/" target="_blank" class="litespeed-learn-more"'); ?>
100
+ </li>
101
+ <li>
102
+ <?php echo __( 'QUIC.cloud will detect most normal DNS entries.', 'litespeed-cache' ); ?>
103
+ <?php echo __( 'If you have custom DNS records, it is possible that they are not detected.', 'litespeed-cache' ); ?>
104
+ <?php echo __( 'Visit your QUIC.cloud dashboard after the DNS Zone is set up to confirm your DNS zone.', 'litespeed-cache' ); ?>
105
+ </li>
106
+ </ul>
107
+
108
+ <h3 class="litespeed-title-section">
109
+ <?php echo __( 'Set up QUIC.cloud Account', 'litespeed-cache' ); ?>
110
+ </h3>
111
+
112
+ <?php if ( $cdn_setup_done_ts ) : ?>
113
+ <p>
114
+ <?php echo '<span class="litespeed-right10"><span class="litespeed-success dashicons dashicons-yes"></span> ' . __( 'Account is linked!', 'litespeed-cache' ) . '</span>'; ?>
115
+ <p>
116
+ <?php Doc::learn_more( Cloud::CLOUD_SERVER_DASH . '/dm/' . $dom . '/cdn/',
117
+ __( 'Manage CDN', 'litespeed-cache' ) . ' <span class="dashicons dashicons-external"></span>',
118
+ false,
119
+ 'litespeed-link-with-icon' ); ?>
120
+ <?php Doc::learn_more( Cloud::CLOUD_SERVER_DASH . '/dns/records/' . $dom . '.',
121
+ __( 'Manage DNS Zone', 'litespeed-cache' ) . ' <span class="dashicons dashicons-external"></span>',
122
+ false,
123
+ 'litespeed-link-with-icon' ); ?>
124
+ </p>
125
+ </p>
126
+ <?php elseif ( $has_setup_token ) : ?>
127
+ <?php echo '<span class="litespeed-right10"><span class="litespeed-success dashicons dashicons-yes"></span> ' . __( 'Ready to run CDN setup.', 'litespeed-cache' ) . '</span>'; ?>
128
+ <?php elseif ( $cloud_linked ) : ?>
129
+ <p><?php echo __( 'Domain key and QUIC.cloud link detected.', 'litespeed-cache' ); ?></p>
130
+ <div><?php Doc::learn_more( Utility::build_url( Router::ACTION_CDN_SETUP, Cdn_Setup::TYPE_NOLINK ), __( 'Begin QUIC.cloud CDN Setup', 'litespeed-cache' ), true, 'button button-primary' ); ?></div>
131
+ <?php else: ?>
132
+ <div><?php Doc::learn_more( Utility::build_url( Router::ACTION_CDN_SETUP, Cdn_Setup::TYPE_LINK ), __( 'Link to QUIC.cloud', 'litespeed-cache' ), true, 'button button-primary' ); ?></div>
133
+ <?php endif; ?>
134
+
135
+ <h3 class="litespeed-title-section">
136
+ <?php echo __( 'CDN Setup Status', 'litespeed-cache' ); ?>
137
+ </h3>
138
+
139
+ <p>
140
+ <span class="litespeed-inline"><?php echo $curr_status; ?></span>
141
+ </p>
142
+
143
+ <?php if ( isset ( $curr_status_subline ) ) { ?>
144
+ <?php echo $curr_status_subline; ?>
145
+ <?php } ?>
146
+
147
+ <?php if ( !$cdn_setup_done_ts ) { ?>
148
+ <?php if ( isset( $setup_summary[ 'cdn_dns_summary' ] ) ) { ?>
149
+ <h4>
150
+ <?php echo __( 'QUIC.cloud Detected Records Summary', 'litespeed-cache' ); ?>
151
+ </h4>
152
+ <table class="wp-list-table widefat striped litespeed-width-auto litespeed-table-compact">
153
+ <thead>
154
+ <tr>
155
+ <th>
156
+ <?php echo __( 'Record Type', 'litespeed-cache' ); ?>
157
+ </th>
158
+ <th>
159
+ <?php echo __( 'Count', 'litespeed-cache' ); ?>
160
+ </th>
161
+ </tr>
162
+ </thead>
163
+ <tbody>
164
+ <?php foreach ( $setup_summary[ 'cdn_dns_summary' ]['types'] as $type => $cnt ) {
165
+ echo '<tr><td>' . $type . '</td><td>' . $cnt . '</td></tr>';
166
+ } ?>
167
+ </tbody>
168
+ </table>
169
+
170
+ <p>
171
+ <?php echo __( 'Record names found', 'litespeed-cache' ) . ': ' . $setup_summary[ 'cdn_dns_summary' ]['names'] ; ?>
172
+ </p>
173
+ <p>
174
+ <?php echo __( 'Is something missing?', 'litespeed-cache' ) ; ?>
175
+ <?php Doc::learn_more( Cloud::CLOUD_SERVER_DASH . '/dns/records/' . $dom . '.',
176
+ __( 'Review DNS records', 'litespeed-cache' ) . ' <span class="dashicons dashicons-external"></span>',
177
+ false,
178
+ 'litespeed-link-with-icon' ); ?>
179
+ </p>
180
+ <p>
181
+ <?php echo __('Note: For 15 to 20 minutes after setup completes, browsers may issue a "not secure" warning for your site while QUIC.cloud generates your SSL certificate.', 'litespeed-cache'); ?>
182
+ </p>
183
+ <?php } ?>
184
+ <?php } ?>
185
+
186
+ <?php if ( !$cdn_setup_done_ts ) { ?>
187
+
188
+ <div>
189
+ <?php Doc::learn_more( ( $disabled ? '#' : Utility::build_url( Router::ACTION_CDN_SETUP, $apply_btn_type ) ), $apply_btn_txt, true, 'button button-primary ' . $disabled ); ?>
190
+ </div>
191
+
192
+ <h3 class="litespeed-title-section">
193
+ <?php echo __( 'Nameservers', 'litespeed-cache' ); ?>
194
+ </h3>
195
+
196
+ <?php if ( isset( $nameservers ) ) { ?>
197
+ <p>
198
+ <?php echo __( 'Please update your domain registrar to use these custom nameservers:', 'litespeed-cache' ); ?>
199
+ </p>
200
+ <ul>
201
+ <?php
202
+ foreach ( $nameservers as $nameserver ) {
203
+ echo '<li><strong>' . $nameserver . '</strong></li>';
204
+ }
205
+ ?>
206
+ </ul>
207
+ <p>
208
+ <?php echo __( 'QUIC.cloud will attempt to verify the DNS update.', 'litespeed-cache' ); ?>
209
+ <?php echo __( 'If it does not verify within 24 hours, the CDN setup will mark the verification as failed.', 'litespeed-cache' ); ?>
210
+ <?php echo __( 'At that stage, you may re-start the verification process by pressing the Run CDN Setup button.', 'litespeed-cache' ); ?>
211
+ </p>
212
+ <?php } else { ?>
213
+ <p>
214
+ <?php echo __( 'This section will automatically populate once nameservers are configured for the site.', 'litespeed-cache' ); ?>
215
+ </p>
216
+ <?php } ?>
217
+
218
+ <?php } ?>
219
+
220
+ <?php if ( $has_setup_token || $cdn_setup_done_ts ) { ?>
221
+ <?php $disabled = $cdn_setup_done_ts && ! $cloud_linked ? 'disabled' : ''; ?>
222
+ <h3 class="litespeed-title-section">
223
+ <?php echo __( 'Action', 'litespeed-cache' ); ?>
224
+ </h3>
225
+ <div>
226
+ <p><?php echo __( 'The following actions are available:', 'litespeed-cache' ); ?></p>
227
+ <p>
228
+ <strong><?php echo __('Reset CDN Setup', 'litespeed-cache') . ': '; ?></strong>
229
+ <?php echo __( 'Resets all LiteSpeed Cache plugin settings related to CDN setup back to the initial state and disables the CDN.', 'litespeed-cache' ); ?>
230
+ <?php echo __( 'QUIC.cloud DNS settings are not changed.', 'litespeed-cache' ); ?>
231
+ <?php echo __( 'This allows you to try Auto CDN setup again.', 'litespeed-cache' ); ?>
232
+ <?php if ( $cdn_setup_done_ts ) : ?>
233
+ <br/>
234
+ <span class="litespeed-desc">
235
+ <?php echo __( 'NOTE', 'litespeed-cache' ) . ': '; ?>
236
+ <?php echo __( 'This action will not update anything on the QUIC.cloud servers.', 'litespeed-cache' ); ?>
237
+ </span>
238
+ <?php endif; ?>
239
+ </p>
240
+ <p>
241
+ <strong><?php echo __('Delete QUIC.cloud data', 'litespeed-cache') . ': '; ?></strong>
242
+ <?php echo __( 'Resets all LiteSpeed Cache plugin settings related to CDN setup back to the initial state and deletes the DNS Zone, if one exists for the domain.', 'litespeed-cache' ); ?>
243
+ <?php echo __( 'This allows you to try Auto CDN setup again, or abandon the setup entirely.', 'litespeed-cache' ); ?>
244
+ <br/>
245
+ <span class="litespeed-desc">
246
+ <?php echo __( 'NOTE', 'litespeed-cache' ) . ': '; ?>
247
+ <?php echo __( 'This action is not available if there is no domain key, the domain is not linked, or the DNS Zone is in active use.', 'litespeed-cache' ); ?>
248
+ <?php echo __( 'If you have not yet done so, please replace the QUIC.cloud nameservers at your domain registrar before proceeding. ', 'litespeed-cache' ); ?>
249
+ </span>
250
+ </p>
251
+ <div>
252
+ <a href="<?php echo Utility::build_url( Router::ACTION_CDN_SETUP, Cdn_Setup::TYPE_RESET ); ?>" data-litespeed-cfm="<?php echo __( 'Are you sure you want to reset CDN Setup?', 'litespeed-cache' ); ?>" class="button litespeed-btn-warning">
253
+ <?php echo __( 'Reset CDN Setup', 'litespeed-cache' ); ?>
254
+ </a>
255
+ <a href="<?php echo ( $disabled ? '#' : Utility::build_url( Router::ACTION_CDN_SETUP, Cdn_Setup::TYPE_DELETE ) ); ?>" <?php if (empty($disabled)) : ?> data-litespeed-cfm="<?php echo __( 'Are you sure you want to delete QUIC.cloud data?', 'litespeed-cache' ); ?>"<?php endif; ?> class="button litespeed-btn-danger <?php echo $disabled; ?>" >
256
+ <?php echo __( 'Delete QUIC.cloud data', 'litespeed-cache' ); ?>
257
+ </a>
258
+ </div>
259
+ </div>
260
+ <?php } ?>
tpl/cdn/entry.tpl.php CHANGED
@@ -4,6 +4,7 @@ defined( 'WPINC' ) || exit ;
4
 
5
  $menu_list = array(
6
  'settings' => __( 'CDN Settings', 'litespeed-cache' ),
 
7
  'manage' => __( 'Manage', 'litespeed-cache' ),
8
  ) ;
9
 
4
 
5
  $menu_list = array(
6
  'settings' => __( 'CDN Settings', 'litespeed-cache' ),
7
+ 'auto_setup' => __( 'QUIC.cloud CDN Setup', 'litespeed-cache' ),
8
  'manage' => __( 'Manage', 'litespeed-cache' ),
9
  ) ;
10
 
tpl/crawler/blacklist.tpl.php CHANGED
@@ -50,7 +50,12 @@ $pagination = Utility::pagination( $count, 30 );
50
  </tbody>
51
  </table>
52
  <?php echo $pagination; ?>
53
-
 
 
 
 
 
54
  <p>
55
  <i class="litespeed-dot litespeed-bg-default"></i> = <?php echo __( 'Not blocklisted', 'litespeed-cache' ); ?><br>
56
  <i class="litespeed-dot litespeed-bg-warning"></i> = <?php echo __( 'Blocklisted due to not cacheable', 'litespeed-cache' ); ?><br>
50
  </tbody>
51
  </table>
52
  <?php echo $pagination; ?>
53
+ <p>
54
+ <font class="litespeed-success">API: <?php echo sprintf( __( 'PHP Constant %s available to disable blocklist.', 'litespeed-cache' ), "<code>LITESPEED_CRAWLER_DISABLE_BLOCKLIST</code>" ); ?></font>
55
+ </p>
56
+ <p>
57
+ <font class="litespeed-success">API: <?php echo sprintf( __( 'Filter %s available to disable blocklist.', 'litespeed-cache' ), "<code>add_filter( 'litespeed_crawler_disable_blocklist', '__return_true' );</code>" ); ?></font>
58
+ </p>
59
  <p>
60
  <i class="litespeed-dot litespeed-bg-default"></i> = <?php echo __( 'Not blocklisted', 'litespeed-cache' ); ?><br>
61
  <i class="litespeed-dot litespeed-bg-warning"></i> = <?php echo __( 'Blocklisted due to not cacheable', 'litespeed-cache' ); ?><br>
tpl/crawler/settings-general.tpl.php CHANGED
@@ -145,9 +145,6 @@ $this->form_action();
145
  <?php echo __('NOTE', 'litespeed-cache'); ?>:
146
  <?php echo __( 'Server allowed max value', 'litespeed-cache'); ?>: <code><?php echo $_SERVER[ Base::ENV_CRAWLER_LOAD_LIMIT ]; ?></code>
147
  </font>
148
- <?php else : ?>
149
- <?php $this->recommended($id); ?>
150
-
151
  <?php endif; ?>
152
 
153
  <br />
145
  <?php echo __('NOTE', 'litespeed-cache'); ?>:
146
  <?php echo __( 'Server allowed max value', 'litespeed-cache'); ?>: <code><?php echo $_SERVER[ Base::ENV_CRAWLER_LOAD_LIMIT ]; ?></code>
147
  </font>
 
 
 
148
  <?php endif; ?>
149
 
150
  <br />
tpl/crawler/summary.tpl.php CHANGED
@@ -116,7 +116,7 @@ if($seconds > 0):
116
  </p>
117
 
118
 
119
- <table class="wp-list-table widefat striped">
120
  <thead><tr >
121
  <th scope="col">#</th>
122
  <th scope="col"><?php echo __('Cron Name', 'litespeed-cache'); ?></th>
116
  </p>
117
 
118
 
119
+ <table class="wp-list-table widefat striped" data-crawler-list>
120
  <thead><tr >
121
  <th scope="col">#</th>
122
  <th scope="col"><?php echo __('Cron Name', 'litespeed-cache'); ?></th>
tpl/dash/dashboard.tpl.php CHANGED
@@ -28,10 +28,12 @@ else {
28
  $cloud_summary = Cloud::get_summary();
29
  $css_summary = CSS::get_summary();
30
  $placeholder_summary = Placeholder::get_summary();
 
31
 
32
  $ccss_count = count( $this->load_queue( 'ccss' ) );
33
  $ucss_count = count( $this->load_queue( 'ucss' ) );
34
  $placeholder_queue_count = count( $this->load_queue( 'lqip' ) );
 
35
  ?>
36
 
37
  <div class="litespeed-dashboard">
@@ -137,7 +139,6 @@ $placeholder_queue_count = count( $this->load_queue( 'lqip' ) );
137
  <?php if ( ! empty( $usage[ 'sub_svc' ] ) ) : ?>
138
  <p class="litespeed-dashboard-stats-total">
139
  <?php $i=0;foreach ( $usage[ 'sub_svc' ] as $sub_svc => $sub_usage ) : ?>
140
- <?php if ($sub_svc=='vpi') continue; ?>
141
  <span class="<?php if ( $i++>0 ) echo 'litespeed-left10'; ?>"><?php echo strtoupper( esc_html( $sub_svc ) ); ?>: <strong><?php echo (int)$sub_usage; ?></strong></span>
142
  <?php endforeach; ?>
143
  </p>
@@ -523,6 +524,38 @@ $placeholder_queue_count = count( $this->load_queue( 'lqip' ) );
523
  <?php endif; ?>
524
  </div>
525
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526
  <div class="postbox litespeed-postbox litespeed-postbox-crawler">
527
  <div class="inside">
528
  <h3 class="litespeed-title">
28
  $cloud_summary = Cloud::get_summary();
29
  $css_summary = CSS::get_summary();
30
  $placeholder_summary = Placeholder::get_summary();
31
+ $vpi_summary = VPI::get_summary();
32
 
33
  $ccss_count = count( $this->load_queue( 'ccss' ) );
34
  $ucss_count = count( $this->load_queue( 'ucss' ) );
35
  $placeholder_queue_count = count( $this->load_queue( 'lqip' ) );
36
+ $vpi_queue_count = count( $this->load_queue( 'vpi' ) );
37
  ?>
38
 
39
  <div class="litespeed-dashboard">
139
  <?php if ( ! empty( $usage[ 'sub_svc' ] ) ) : ?>
140
  <p class="litespeed-dashboard-stats-total">
141
  <?php $i=0;foreach ( $usage[ 'sub_svc' ] as $sub_svc => $sub_usage ) : ?>
 
142
  <span class="<?php if ( $i++>0 ) echo 'litespeed-left10'; ?>"><?php echo strtoupper( esc_html( $sub_svc ) ); ?>: <strong><?php echo (int)$sub_usage; ?></strong></span>
143
  <?php endforeach; ?>
144
  </p>
524
  <?php endif; ?>
525
  </div>
526
 
527
+ <div class="postbox litespeed-postbox litespeed-postbox-vpi">
528
+ <div class="inside">
529
+ <h3 class="litespeed-title">
530
+ <?php echo __( 'Viewport Image', 'litespeed-cache' ); ?> (VPI)
531
+ <a href="<?php echo admin_url( 'admin.php?page=litespeed-page_optm#settings_vpi' ); ?>" class="litespeed-title-right-icon"><?php echo __( 'More', 'litespeed-cache' ); ?></a>
532
+ </h3>
533
+
534
+ <?php if ( ! empty( $vpi_summary[ 'last_request' ] ) ) : ?>
535
+ <p>
536
+ <?php echo __( 'Last generated', 'litespeed-cache' ) . ': <code>' . Utility::readable_time( $vpi_summary[ 'last_request' ] ) . '</code>'; ?>
537
+ </p>
538
+ <p>
539
+ <?php echo __( 'Time to execute previous request', 'litespeed-cache' ) . ': <code>' . esc_html( $vpi_summary[ 'last_spent' ] ) . 's</code>'; ?>
540
+ </p>
541
+ <?php endif; ?>
542
+
543
+ <p>
544
+ <?php echo __( 'Requests in queue', 'litespeed-cache' ); ?>: <code><?php echo $vpi_queue_count ?: '-' ?></code>
545
+ <a href="<?php echo $vpi_queue_count ? Utility::build_url( Router::ACTION_VPI, VPI::TYPE_GEN ) : 'javascript:;'; ?>" class="button button-secondary button-small <?php if ( ! $vpi_queue_count ) echo 'disabled'; ?>">
546
+ <?php echo __( 'Force cron', 'litespeed-cache' ); ?>
547
+ </a>
548
+ </p>
549
+
550
+ </div>
551
+
552
+ <?php if ( ! empty( $cloud_summary[ 'last_request.vpi' ] ) ) : ?>
553
+ <div class="inside litespeed-postbox-footer litespeed-postbox-footer--compact">
554
+ <?php echo __( 'Last requested', 'litespeed-cache' ) . ': ' . Utility::readable_time( $cloud_summary[ 'last_request.vpi' ] ) ?>
555
+ </div>
556
+ <?php endif; ?>
557
+ </div>
558
+
559
  <div class="postbox litespeed-postbox litespeed-postbox-crawler">
560
  <div class="inside">
561
  <h3 class="litespeed-title">
tpl/general/settings.tpl.php CHANGED
@@ -5,7 +5,7 @@ defined( 'WPINC' ) || exit;
5
  $__cloud = Cloud::cls();
6
 
7
  // This will drop QS param `qc_res` and `domain_hash` also
8
- $__cloud->update_is_linked_status();
9
 
10
  $cloud_summary = Cloud::get_summary();
11
 
@@ -110,7 +110,18 @@ if ( ! $can_token ) {
110
 
111
  <div class="litespeed-desc">
112
  <?php echo __( 'A Domain Key is required for QUIC.cloud online services.', 'litespeed-cache' ); ?>
113
- <br /><?php Doc::notice_ips(); ?>
 
 
 
 
 
 
 
 
 
 
 
114
  <div class="litespeed-callout notice notice-success inline">
115
  <h4><?php echo __( 'Current Cloud Nodes in Service','litespeed-cache' ); ?>
116
  <a class="litespeed-right" href="<?php echo Utility::build_url( Router::ACTION_CLOUD, Cloud::TYPE_CLEAR_CLOUD ); ?>" data-balloon-pos="up" data-balloon-break aria-label='<?php echo __( 'Click to clear all nodes for further redetection.', 'litespeed-cache' ); ?>' data-litespeed-cfm="<?php echo __( 'Are you sure you want to clear all cloud nodes?', 'litespeed-cache' ); ?>"><i class='litespeed-quic-icon'></i></a>
@@ -130,7 +141,6 @@ if ( ! $can_token ) {
130
  ?>
131
  </p>
132
  </div>
133
-
134
  </div>
135
  </td>
136
  </tr>
@@ -169,7 +179,7 @@ if ( ! $can_token ) {
169
 
170
  <?php if ( ! $this->conf( Base::O_GUEST ) ) : ?>
171
  <br /><font class="litespeed-warning litespeed-left10">
172
- ⚠️ <?php echo __( 'Notice', 'litespeed-cache' ); ?>: <?php echo sprintf( __( 'This option only works when turning %s on.', 'litespeed-cache' ), '<code>' . Lang::title( Base::O_GUEST ) . '</code>' ); ?>
173
  </font>
174
  <?php endif; ?>
175
 
5
  $__cloud = Cloud::cls();
6
 
7
  // This will drop QS param `qc_res` and `domain_hash` also
8
+ $__cloud->parse_qc_redir();
9
 
10
  $cloud_summary = Cloud::get_summary();
11
 
110
 
111
  <div class="litespeed-desc">
112
  <?php echo __( 'A Domain Key is required for QUIC.cloud online services.', 'litespeed-cache' ); ?>
113
+
114
+ <br />
115
+ <?php if ( ! empty( $cloud_summary[ 'main_domain' ] ) ) : ?>
116
+ <?php echo __( 'Main domain', 'litespeed-cache' ); ?>: <code><?php echo $cloud_summary[ 'main_domain' ]; ?></code>
117
+ <?php else: ?>
118
+ <font class="litespeed-warning">
119
+ ⚠️ <?php echo __( 'Main domain not generated yet', 'litespeed-cache' ); ?>
120
+ </font>
121
+ <?php endif; ?>
122
+
123
+ <br />
124
+ <?php Doc::notice_ips(); ?>
125
  <div class="litespeed-callout notice notice-success inline">
126
  <h4><?php echo __( 'Current Cloud Nodes in Service','litespeed-cache' ); ?>
127
  <a class="litespeed-right" href="<?php echo Utility::build_url( Router::ACTION_CLOUD, Cloud::TYPE_CLEAR_CLOUD ); ?>" data-balloon-pos="up" data-balloon-break aria-label='<?php echo __( 'Click to clear all nodes for further redetection.', 'litespeed-cache' ); ?>' data-litespeed-cfm="<?php echo __( 'Are you sure you want to clear all cloud nodes?', 'litespeed-cache' ); ?>"><i class='litespeed-quic-icon'></i></a>
141
  ?>
142
  </p>
143
  </div>
 
144
  </div>
145
  </td>
146
  </tr>
179
 
180
  <?php if ( ! $this->conf( Base::O_GUEST ) ) : ?>
181
  <br /><font class="litespeed-warning litespeed-left10">
182
+ ⚠️ <?php echo __( 'Notice', 'litespeed-cache' ); ?>: <?php echo sprintf( __( '%s must be turned ON for this setting to work.', 'litespeed-cache' ), '<code>' . Lang::title( Base::O_GUEST ) . '</code>' ); ?>
183
  </font>
184
  <?php endif; ?>
185
 
tpl/inc/metabox.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LiteSpeed;
3
+ defined( 'WPINC' ) || exit;
4
+
5
+ wp_nonce_field( self::POST_NONCE_ACTION, Router::NONCE );
6
+
7
+ $post_id = get_the_ID();
8
+
9
+ foreach ( $this->_postmeta_settings as $k => $v ) {
10
+ $existing_val = get_post_meta( $post_id, $k, true );
11
+
12
+
13
+ if ( in_array( $k, array( 'litespeed_vpi_list', 'litespeed_vpi_list_mobile' ) ) ) {
14
+ if ( is_array( $existing_val ) ) $existing_val = implode( PHP_EOL, $existing_val );
15
+ echo '<div style="margin-bottom:10px;"><label for="' . $k . '">' . $v . '</label>';
16
+ echo '<textarea style="width:100%" rows="5" id="' . $k . '" name="' . $k . '">' . $existing_val . '</textarea>';
17
+ echo '</div>';
18
+ }
19
+ else {
20
+ echo '<div style="display:flex;margin-bottom:10px;align-items: center;gap: 2ch;justify-content: space-between;"><label for="' . $k . '">' . $v . '</label>';
21
+ echo '<input class="litespeed-tiny-toggle" id="' . $k . '" name="' . $k . '" type="checkbox" value="1" ' . ( $existing_val ? 'checked' : '' ) . ' />';
22
+ echo '</div>';
23
+ }
24
+ }
25
+
26
+ echo '<div style="text-align:right;">';
27
+ Doc::learn_more( 'https://docs.litespeedtech.com/lscache/lscwp/metabox/' );
28
+ echo '</div>';
tpl/page_optm/entry.tpl.php CHANGED
@@ -7,6 +7,7 @@ $menu_list = array(
7
  'settings_js' => __( 'JS Settings', 'litespeed-cache' ),
8
  'settings_html' => __( 'HTML Settings', 'litespeed-cache' ),
9
  'settings_media' => __( 'Media Settings', 'litespeed-cache' ),
 
10
  'settings_media_exc' => __( 'Media Excludes', 'litespeed-cache' ),
11
  'settings_localization' => __( 'Localization', 'litespeed-cache' ),
12
  'settings_tuning' => __( 'Tuning', 'litespeed-cache' ),
7
  'settings_js' => __( 'JS Settings', 'litespeed-cache' ),
8
  'settings_html' => __( 'HTML Settings', 'litespeed-cache' ),
9
  'settings_media' => __( 'Media Settings', 'litespeed-cache' ),
10
+ 'settings_vpi' => __( 'VPI', 'litespeed-cache' ),
11
  'settings_media_exc' => __( 'Media Excludes', 'litespeed-cache' ),
12
  'settings_localization' => __( 'Localization', 'litespeed-cache' ),
13
  'settings_tuning' => __( 'Tuning', 'litespeed-cache' ),
tpl/page_optm/settings_css.tpl.php CHANGED
@@ -6,6 +6,7 @@ defined( 'WPINC' ) || exit;
6
  // exit;
7
 
8
  $css_summary = CSS::get_summary();
 
9
  $closest_server = Cloud::get_summary( 'server.' . Cloud::SVC_CCSS );
10
 
11
  $ccss_queue = $this->load_queue( 'ccss' );
@@ -87,8 +88,8 @@ $ucss_queue = $this->load_queue( 'ucss' );
87
  <?php endif; ?>
88
  <?php endif; ?>
89
 
90
- <?php if ( $closest_server ) : ?>
91
- <a href="<?php echo Utility::build_url( Router::ACTION_CLOUD, Cloud::TYPE_REDETECT_CLOUD, false, null, array( 'svc' => Cloud::SVC_CCSS ) ); ?>" data-balloon-pos="up" data-balloon-break aria-label='<?php echo sprintf( __( 'Current closest Cloud server is %s.&#10; Click to redetect.', 'litespeed-cache' ), $closest_server ); ?>' data-litespeed-cfm="<?php echo __( 'Are you sure you want to redetect the closest cloud server for this service?', 'litespeed-cache' ) ; ?>"><i class='litespeed-quic-icon'></i></a>
92
  <?php endif; ?>
93
 
94
  <?php if ( ! empty( $ucss_queue ) ) : ?>
6
  // exit;
7
 
8
  $css_summary = CSS::get_summary();
9
+ $closest_server_ucss = Cloud::get_summary( 'server.' . Cloud::SVC_UCSS );
10
  $closest_server = Cloud::get_summary( 'server.' . Cloud::SVC_CCSS );
11
 
12
  $ccss_queue = $this->load_queue( 'ccss' );
88
  <?php endif; ?>
89
  <?php endif; ?>
90
 
91
+ <?php if ( $closest_server_ucss ) : ?>
92
+ <a href="<?php echo Utility::build_url( Router::ACTION_CLOUD, Cloud::TYPE_REDETECT_CLOUD, false, null, array( 'svc' => Cloud::SVC_CCSS ) ); ?>" data-balloon-pos="up" data-balloon-break aria-label='<?php echo sprintf( __( 'Current closest Cloud server is %s.&#10; Click to redetect.', 'litespeed-cache' ), $closest_server_ucss ); ?>' data-litespeed-cfm="<?php echo __( 'Are you sure you want to redetect the closest cloud server for this service?', 'litespeed-cache' ) ; ?>"><i class='litespeed-quic-icon'></i></a>
93
  <?php endif; ?>
94
 
95
  <?php if ( ! empty( $ucss_queue ) ) : ?>
tpl/page_optm/settings_media.tpl.php CHANGED
@@ -226,7 +226,15 @@ $lqip_queue = $this->load_queue( 'lqip' );
226
  <div class="litespeed-desc">
227
  <?php echo __( 'Set an explicit width and height on image elements to reduce layout shifts and improve CLS (a Core Web Vitals metric).', 'litespeed-cache' ); ?>
228
  <?php Doc::learn_more( 'https://web.dev/optimize-cls/#images-without-dimensions' ); ?>
229
- <br /><?php echo sprintf( __( 'Note: this option only works when %1$s is %2$s.', 'litespeed-cache' ), '<code>' . Lang::title( Base::O_MEDIA_LAZY ) . '</code>', '<code>' . __( 'ON', 'litespeed-cache' ) . '</code>' ); ?>
 
 
 
 
 
 
 
 
230
  </div>
231
  </td>
232
  </tr>
226
  <div class="litespeed-desc">
227
  <?php echo __( 'Set an explicit width and height on image elements to reduce layout shifts and improve CLS (a Core Web Vitals metric).', 'litespeed-cache' ); ?>
228
  <?php Doc::learn_more( 'https://web.dev/optimize-cls/#images-without-dimensions' ); ?>
229
+
230
+ <br /><font class="litespeed-warning litespeed-left10">
231
+ ⚠️ <?php echo __( 'Notice', 'litespeed-cache' ); ?>: <?php echo sprintf( __( '%s must be turned ON for this setting to work.', 'litespeed-cache' ), '<code>' . Lang::title( Base::O_MEDIA_LAZY ) . '</code>' ); ?>
232
+ </font>
233
+
234
+ <br /><font class="litespeed-success">
235
+ <?php echo __( 'API', 'litespeed-cache' ); ?>:
236
+ <?php echo sprintf( __( 'Use %1$s to bypass remote image dimension check when %2$s is ON.', 'litespeed-cache' ), '<code>add_filter( "litespeed_media_ignore_remote_missing_sizes", "__return_true" );</code>', '<code>' . Lang::title( Base::O_MEDIA_ADD_MISSING_SIZES ) . '</code>' ); ?>
237
+ </font>
238
  </div>
239
  </td>
240
  </tr>
tpl/page_optm/settings_vpi.tpl.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace LiteSpeed;
3
+ defined( 'WPINC' ) || exit;
4
+
5
+ $summary = VPI::get_summary();
6
+ $closest_server = Cloud::get_summary( 'server.' . Cloud::SVC_VPI );
7
+
8
+ $queue = $this->load_queue( 'vpi' );
9
+ ?>
10
+
11
+ <h3 class="litespeed-title-short">
12
+ <?php echo __( 'Viewport Images', 'litespeed-cache' ); ?>
13
+ <?php Doc::learn_more( 'https://docs.litespeedtech.com/lscache/lscwp/pageopt/#vpi-settings-tab' ); ?>
14
+ </h3>
15
+
16
+ <table class="wp-list-table striped litespeed-table"><tbody>
17
+
18
+ <tr>
19
+ <th>
20
+ <?php $id = Base::O_MEDIA_VPI; ?>
21
+ <?php $this->title( $id ); ?>
22
+ </th>
23
+ <td>
24
+ <?php $this->build_switch( $id ); ?>
25
+ <div class="litespeed-desc">
26
+ <?php echo __( 'When you use Lazy Load, it will delay the loading of all images on a page.', 'litespeed-cache' ); ?>
27
+ <br /><?php echo __( 'The Viewport Images service detects which images appear above the fold, and excludes them from lazy load.', 'litespeed-cache' ); ?>
28
+ <br /><?php echo __( 'This enables the page\'s initial screenful of imagery to be fully displayed without delay.', 'litespeed-cache' ); ?>
29
+
30
+ <?php if ( ! $this->conf( Base::O_MEDIA_LAZY ) ) : ?>
31
+ <br /><font class="litespeed-warning litespeed-left10">
32
+ ⚠️ <?php echo __( 'Notice', 'litespeed-cache' ); ?>: <?php echo sprintf( __( '%s must be turned ON for this setting to work.', 'litespeed-cache' ), '<code>' . Lang::title( Base::O_MEDIA_LAZY ) . '</code>' ); ?>
33
+ </font>
34
+ <?php endif; ?>
35
+
36
+ </div>
37
+
38
+ <div class="litespeed-desc litespeed-left20">
39
+ <?php if ( $summary ) : ?>
40
+ <?php if ( ! empty( $summary[ 'last_request' ] ) ) : ?>
41
+ <p>
42
+ <?php echo __( 'Last generated', 'litespeed-cache' ) . ': <code>' . Utility::readable_time( $summary[ 'last_request' ] ) . '</code>'; ?>
43
+ </p>
44
+ <?php endif; ?>
45
+ <?php endif; ?>
46
+
47
+ <?php if ( $closest_server ) : ?>
48
+ <a href="<?php echo Utility::build_url( Router::ACTION_CLOUD, Cloud::TYPE_REDETECT_CLOUD, false, null, array( 'svc' => Cloud::SVC_VPI ) ); ?>" data-balloon-pos="up" data-balloon-break aria-label='<?php echo sprintf( __( 'Current closest Cloud server is %s.&#10; Click to redetect.', 'litespeed-cache' ), $closest_server ); ?>' data-litespeed-cfm="<?php echo __( 'Are you sure you want to redetect the closest cloud server for this service?', 'litespeed-cache' ) ; ?>"><i class='litespeed-quic-icon'></i></a>
49
+ <?php endif; ?>
50
+
51
+ <?php if ( ! empty( $queue ) ) : ?>
52
+ <div class="litespeed-callout notice notice-warning inline">
53
+ <h4>
54
+ <?php echo sprintf( __( 'URL list in %s queue waiting for cron', 'litespeed-cache' ), 'VPI' ); ?> ( <?php echo count( $queue ); ?> )
55
+ <a href="<?php echo Utility::build_url( Router::ACTION_VPI, VPI::TYPE_CLEAR_Q ); ?>" class="button litespeed-btn-warning litespeed-right">Clear</a>
56
+ </h4>
57
+ <p>
58
+ <?php $i=0; foreach ( $queue as $k => $v ) : ?>
59
+ <?php if ( $i++ > 20 ) : ?>
60
+ <?php echo '...'; ?>
61
+ <?php break; ?>
62
+ <?php endif; ?>
63
+ <?php if ( ! is_array( $v ) ) continue; ?>
64
+ <?php if ( ! empty( $v[ '_status' ] ) ) : ?><span class="litespeed-success"><?php endif; ?>
65
+ <?php echo esc_html( $v[ 'url' ] ); ?>
66
+ <?php if ( ! empty( $v[ '_status' ] ) ) : ?></span><?php endif; ?>
67
+ <?php if ( $pos = strpos( $k, ' ' ) ) echo ' (' . __( 'Vary Group', 'litespeed-cache' ) . ':' . substr( $k, 0, $pos ) . ')'; ?>
68
+ <?php if ( $v[ 'is_mobile' ] ) echo ' <span data-balloon-pos="up" aria-label="mobile">📱</span>'; ?>
69
+ <br />
70
+ <?php endforeach; ?>
71
+ </p>
72
+ </div>
73
+ <a href="<?php echo Utility::build_url( Router::ACTION_VPI, VPI::TYPE_GEN ); ?>" class="button litespeed-btn-success">
74
+ <?php echo sprintf( __( 'Run %s Queue Manually', 'litespeed-cache' ), 'VPI' ); ?>
75
+ </a>
76
+ <?php endif; ?>
77
+ </div>
78
+
79
+ </td>
80
+ </tr>
81
+
82
+ <tr>
83
+ <th>
84
+ <?php $id = Base::O_MEDIA_VPI_CRON; ?>
85
+ <?php $this->title( $id ); ?>
86
+ </th>
87
+ <td>
88
+ <?php $this->build_switch( $id ); ?>
89
+ <div class="litespeed-desc">
90
+ <?php echo __( 'Enable Viewport Images auto generation cron.', 'litespeed-cache' ); ?>
91
+ </div>
92
+ </td>
93
+ </tr>
94
+
95
+ </tbody></table>
tpl/toolbox/beta_test.tpl.php CHANGED
@@ -4,6 +4,7 @@ defined( 'WPINC' ) || exit;
4
 
5
  // Existing public version list
6
  $v_list = array(
 
7
  '4.6',
8
  '4.5.0.1',
9
  '4.4.7',
4
 
5
  // Existing public version list
6
  $v_list = array(
7
+ '5.0',
8
  '4.6',
9
  '4.5.0.1',
10
  '4.4.7',
tpl/toolbox/settings-debug.tpl.php CHANGED
@@ -5,6 +5,18 @@ defined( 'WPINC' ) || exit;
5
  $this->form_action( $this->_is_network_admin ? Router::ACTION_SAVE_SETTINGS_NETWORK : false );
6
  ?>
7
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  <h3 class="litespeed-title-short">
10
  <?php echo __('Debug Settings', 'litespeed-cache'); ?>
@@ -143,6 +155,20 @@ $this->form_action( $this->_is_network_admin ? Router::ACTION_SAVE_SETTINGS_NETW
143
  </td>
144
  </tr>
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  </tbody></table>
147
 
148
  <?php
5
  $this->form_action( $this->_is_network_admin ? Router::ACTION_SAVE_SETTINGS_NETWORK : false );
6
  ?>
7
 
8
+ <h3 class="litespeed-title-short">
9
+ <?php echo __('Debug Helpers', 'litespeed-cache'); ?>
10
+ </h3>
11
+
12
+ <a href="<?php echo home_url( '/' ) . '?' . Router::ACTION . '=before_optm'; ?>" class="button button-success" target="_blank">
13
+ <?php echo __( 'View Site Before Optimization', 'litespeed-cache' ); ?>
14
+ </a>
15
+
16
+ <a href="<?php echo home_url( '/' ) . '?' . Router::ACTION . '=' . Core::ACTION_QS_NOCACHE; ?>" class="button button-success" target="_blank">
17
+ <?php echo __( 'View Site Before Cache', 'litespeed-cache' ); ?>
18
+ </a>
19
+
20
 
21
  <h3 class="litespeed-title-short">
22
  <?php echo __('Debug Settings', 'litespeed-cache'); ?>
155
  </td>
156
  </tr>
157
 
158
+ <tr>
159
+ <th>
160
+ <?php $id = Base::O_DEBUG_EXC_STRINGS; ?>
161
+ <?php $this->title( $id ); ?>
162
+ </th>
163
+ <td>
164
+ <?php $this->build_textarea( $id ); ?>
165
+ <div class="litespeed-desc">
166
+ <?php echo __( 'Prevent writing log entries that include listed strings.', 'litespeed-cache' ); ?>
167
+ <?php Doc::one_per_line(); ?>
168
+ </div>
169
+ </td>
170
+ </tr>
171
+
172
  </tbody></table>
173
 
174
  <?php