PluginProbe ʕ •ᴥ•ʔ
10Web Booster – Website speed optimization, Cache & Page Speed optimizer / 2.33.6
10Web Booster – Website speed optimization, Cache & Page Speed optimizer v2.33.6
2.33.6 2.33.5 2.33.0 2.30.5 2.30.7 2.30.9 2.31.10 2.31.8 2.32.11 2.32.21 2.32.3 2.32.4 2.32.7 2.6.31 2.6.40 2.6.42 2.6.7 2.7.37 2.7.44 2.7.47 2.8.18 2.8.19 2.8.32 2.8.34 2.8.35 2.9.23 2.9.24 2.9.25 2.9.27 v2.27.4 trunk 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.17 2.0.18 2.0.21 2.0.22 2.0.25 2.0.26 2.0.27 2.0.3 2.0.7 2.0.9 2.10.46 2.10.65 2.10.66 2.10.68 2.11.41 2.11.42 2.11.43 2.12.15 2.12.21 2.12.22 2.12.23 2.12.26 2.13.37 2.13.40 2.13.41 2.13.42 2.13.44 2.13.45 2.13.47 2.14.49 2.14.50 2.15.18 2.17.21 2.17.23 2.18.17 2.19.44 2.19.45 2.19.46 2.19.49 2.2.12 2.2.15 2.2.16 2.2.18 2.2.8 2.20.31 2.20.32 2.20.33 2.21.11 2.21.12 2.21.16 2.21.25 2.22.32 2.23.13 2.23.15 2.23.16 2.23.18 2.24.12 2.24.14 2.24.18 2.25.14 2.26.6 2.28.10 2.28.13 2.28.14 2.28.7 2.29.1 2.29.2 2.29.3 2.3.0 2.3.1 2.3.2 2.3.3 2.30.18
tenweb-speed-optimizer / includes / OptimizerCriticalCss.php
tenweb-speed-optimizer / includes Last commit date
WebPageCache 2 weeks ago external 1 week ago ExcludeJsFromDelay.php 2 years ago OptimizerBanner.php 1 year ago OptimizerBase.php 2 years ago OptimizerCSSMin.php 2 years ago OptimizerCache.php 2 weeks ago OptimizerCacheStructure.php 2 years ago OptimizerCriticalCss.php 2 weeks ago OptimizerElementor.php 2 years ago OptimizerFonts.php 2 years ago OptimizerImages.php 1 year ago OptimizerLogger.php 1 year ago OptimizerMain.php 2 weeks ago OptimizerOnInit.php 2 weeks ago OptimizerScripts.php 2 years ago OptimizerSettings.php 2 weeks ago OptimizerStyles.php 2 weeks ago OptimizerUrl.php 1 year ago OptimizerUtils.php 2 weeks ago OptimizerWhiteLabel.php 2 years ago
OptimizerCriticalCss.php
689 lines
1 <?php
2
3 namespace TenWebOptimizer;
4
5 use Exception;
6 use TenwebServices;
7
8 class OptimizerCriticalCss
9 {
10 public $critical_enabled = false;
11
12 public $critical_font_enabled = false;
13
14 public $uncritical_load_type = null;
15
16 public $critical_data = null;
17
18 public $critical_css = null;
19
20 public $uncritical_css = null;
21
22 public $critical_bg = null;
23
24 public $critical_fonts = null;
25
26 public $images_in_viewport = null;
27
28 public $status = false;
29
30 public $use_uncritical = false;
31
32 public $two_critical_pages = null;
33
34 public $page_id = null;
35
36 public function __construct($id = null)
37 {
38 global $TwoSettings;
39 $critical_status = $TwoSettings->get_settings('two_critical_status');
40
41 if ($critical_status === 'true') {
42 $this->critical_enabled = true;
43 }
44
45 if ($TwoSettings->get_settings('two_critical_font_status') === 'true') {
46 $this->critical_font_enabled = true;
47 }
48 $this->two_critical_pages = OptimizerUtils::getCriticalPages();
49
50 if ($id === null) {
51 global $post;
52
53 if (is_front_page()) {
54 $id = '';
55
56 if (!empty($this->two_critical_pages) && !empty($post)) {
57 if (!empty($this->two_critical_pages[$post->ID])) {
58 $id = $post->ID; // translated home page
59 } elseif (isset($this->two_critical_pages['front_page'])) {
60 $id = OptimizerUtils::get_post_id($this->two_critical_pages['front_page']['url']);
61 }
62 }
63 }
64
65 if (!isset($id) || $id === 0 || empty($id)) {
66 $id = OptimizerUtils::get_post_id();
67 }
68 }
69 $this->page_id = $id;
70 OptimizerUtils::two_critical_status($id);
71 $this->getCriticalCssData($id);
72 }
73
74 public static function getCriticalCssApi($request_data)
75 {
76 global $TwoSettings;
77 $newly_connected_website = $request_data['newly_connected_website'] ?? false;
78 $two_flow_critical_start = get_option('two_flow_critical_start');
79
80 if (!TENWEB_SO_HOSTED_ON_10WEB && !$newly_connected_website && $two_flow_critical_start !== '1' && !\Tenweb_Authorization\Login::get_instance()->check_logged_in()) {
81 return;
82 }
83
84 if (empty($request_data['page_id'])) {
85 return;
86 }
87 $critical_key = 'two_critical_' . $request_data['page_id'];
88 $critical_key_transient = \TenWebWpTransients\OptimizerTransients::get($critical_key);
89
90 if (!$newly_connected_website && $critical_key_transient === '1') {
91 return;
92 }
93 \TenWebWpTransients\OptimizerTransients::set($critical_key, '1', MINUTE_IN_SECONDS * 15);
94
95 try {
96 $response_data = null;
97
98 if (filter_var($request_data['url'], FILTER_VALIDATE_URL) === false) {
99 $page_data = OptimizerUtils::get_permalink_name_by_id($request_data['page_id']);
100 $request_data['url'] = $page_data[ 'url' ];
101 }
102
103 if (empty($request_data['url'])) {
104 return;
105 }
106 $check_redirect = OptimizerUtils::check_page_has_no_redirects($request_data['url'], true);
107
108 if (!$check_redirect) {
109 return;
110 }
111
112 if (empty($request_data['url_query'])) {
113 $request_data['url_query'] = 'two_version=' . TENWEB_SO_VERSION;
114 } else {
115 $request_data['url_query'] .= '&two_version=' . TENWEB_SO_VERSION;
116 }
117 $url = wp_parse_url($request_data['url'], PHP_URL_QUERY) ? $request_data['url'] . '&' . $request_data['url_query'] : $request_data['url'] . '?' . $request_data['url_query'];
118 $request_data['url'] = $url;
119 $critical_flag = \TenWebWpTransients\OptimizerTransients::get('two_critical_flag');
120 $critical_flag = (int) $critical_flag;
121
122 if ($critical_flag > 0) {
123 $critical_flag++;
124 \TenWebWpTransients\OptimizerTransients::set('two_critical_flag', $critical_flag, 24 * HOUR_IN_SECONDS);
125 } else {
126 \TenWebWpTransients\OptimizerTransients::set('two_critical_flag', 1, 24 * HOUR_IN_SECONDS);
127 }
128 $page_id = sanitize_text_field($request_data['page_id']);
129
130 if (strpos($page_id, 'no_critical') === 0) {
131 return;
132 }
133
134 if (!OptimizerUtils::is_valid_critical_page_id($page_id)) {
135 return;
136 }
137 $critical_in_progress_key = 'two_critical_in_progress_' . $page_id;
138 \TenWebWpTransients\OptimizerTransients::set($critical_in_progress_key, '1', 30 * MINUTE_IN_SECONDS);
139
140 if (!TENWEB_SO_HOSTED_ON_10WEB || is_multisite()) {
141 $domain_id = get_site_option('tenweb_domain_id');
142 $access_token = get_site_option(TENWEB_PREFIX . '_access_token');
143 $critical_token = OptimizerUtils::get_critical_token($page_id);
144
145 if (!$critical_token || empty($critical_token)) {
146 $critical_token = wp_generate_uuid4() . bin2hex(random_bytes(12));
147 }
148
149 if ($access_token && $domain_id) {
150 $home_url = trailingslashit(home_url());
151 $callback_url = add_query_arg([ 'rest_route' => '/tenweb_so/v1/set_critical'], $home_url);
152 $request_data['callback_url'] = $callback_url;
153 $request_data['action'] = 'two_set_critical';
154 $request_data['token'] = $critical_token;
155
156 /*for flow*/
157 $notification_id = get_site_option(TENWEB_PREFIX . '_notification_id', false);
158 $flow_id = get_site_option(TENWEB_PREFIX . '_flow_id', false);
159
160 if ($newly_connected_website && $request_data['page_id'] == 'front_page') {
161 $request_data['flow_id'] = $flow_id;
162 $request_data['notification_id'] = $notification_id;
163 $request_data['initiator'] = 'automatic_during_onboarding_flow';
164 update_option('two_flow_critical_start', '1');
165 }
166
167 /*-----------End Flow-------------*/
168 if (TENWEB_SO_HOSTED_ON_10WEB && is_multisite()) {
169 $request_data['newly_connected_website'] = false;
170 $request_data['flow_id'] = false;
171 $request_data['notification_id'] = false;
172 }
173 $request_data_to_send = ['critical_data' => $request_data];
174
175 $res = wp_remote_post(TENWEB_SO_CRITICAL_URL . '/v1/critical/' . $domain_id . '/create', [
176 'timeout' => 5, // phpcs:ignore
177 'redirection' => 5,
178 'httpversion' => '1.0',
179 'blocking' => true,
180 'headers' => [
181 'accept' => 'application/x.10webperformance.v1+json',
182 'authorization' => 'Bearer ' . $access_token,
183 ],
184 'body' => $request_data_to_send,
185 'cookies' => []
186 ]);
187
188 if (wp_remote_retrieve_response_code($res) !== 200) {
189 $critical_key = 'two_critical_' . $page_id;
190 \TenWebWpTransients\OptimizerTransients::delete($critical_key);
191 \TenWebWpTransients\OptimizerTransients::delete($critical_in_progress_key);
192
193 if (OptimizerUrl::isCriticalSavedInSettings($page_id)) {
194 $two_critical_pages = $TwoSettings->get_settings('two_critical_pages');
195 unset($two_critical_pages[$page_id]);
196 unset($two_critical_pages['']);
197 $TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
198 } else {
199 delete_post_meta($page_id, 'two_critical_pages');
200 }
201 /* unset optimize_inprogress */
202 \TenWebWpTransients\OptimizerTransients::delete('two_optimize_inprogress_' . $page_id);
203 /* Keeping all posts statuses which is in progress or optimized to manage notif popup view one time for each case */
204 $two_optimization_notif_status = get_option('two_optimization_notif_status');
205 unset($two_optimization_notif_status[$page_id]);
206 update_option('two_optimization_notif_status', $two_optimization_notif_status, 1);
207
208 if ($newly_connected_website && $request_data['page_id'] == 'front_page') {
209 $debug_data = [
210 'response' => wp_remote_retrieve_body($res),
211 'request' => $request_data_to_send,
212 'response_status_code' => wp_remote_retrieve_response_code($res),
213 ];
214 OptimizerUtils::update_connection_flow_progress('running', 'ccss_generation_queue_rejected', $debug_data);
215 }
216 }
217 OptimizerLogger::add_critical_css_log($request_data, $newly_connected_website, $flow_id, wp_remote_retrieve_response_code($res), wp_remote_retrieve_body($res));
218 }
219 OptimizerUtils::set_critical_token($page_id, $critical_token);
220 } elseif (true === TenwebServices::manager_ready()) {
221 $response = TenwebServices::do_request(TENWEB_API_URL . '/domains/critical-css', [
222 'body' => [
223 'critical_data' => $request_data
224 ],
225 'method' => 'POST',
226 'blocking' => false
227 ]);
228
229 OptimizerLogger::add_critical_css_log($request_data, $newly_connected_website, get_site_option(TENWEB_PREFIX . '_flow_id'), wp_remote_retrieve_response_code($response));
230
231 if (!is_wp_error($response)) {
232 $response_data = [
233 'status' => 'success',
234 ];
235 }
236 } else {
237 $response_data = [
238 'status' => 'error',
239 'error' => 'Tenweb Manager not ready'
240 ];
241 }
242 } catch (Exception $e) {
243 $response_data = [
244 'status' => 'error',
245 'error' => $e->getMessage()
246 ];
247 }
248
249 return $response_data;
250 }
251
252 public static function getDefaultSettings()
253 {
254 return [
255 'desktop_width' => 1280,
256 'desktop_height' => 800,
257 'mobile_width' => 360,
258 'mobile_height' => 640,
259 'url_query' => 'PageSpeed=off&two_nooptimize=1'
260 ];
261 }
262
263 public static function checkManagerIsActive()
264 {
265 if (!defined('TENWEB_INCLUDES_DIR')) {
266 return false;
267 }
268 include_once TENWEB_INCLUDES_DIR . '/class-tenweb-services.php';
269
270 if (!defined('TENWEB_API_URL')) {
271 return false;
272 }
273
274 return true;
275 }
276
277 public static function setCritical($data)
278 {
279 global $TwoSettings;
280 $tenweb_domain_id = get_option('tenweb_domain_id');
281 $url = $data['page_url'];
282 $page_id = $data['page_id'];
283 $initiator = 'auto';
284
285 if (isset($data['initiator']) && !empty($data['initiator'])) {
286 $initiator = $data['initiator'];
287 }
288 $url_query = $data['url_query'];
289 $wait_until = 'load';
290
291 if (isset($data['wait_until'])) {
292 $wait_until = $data['wait_until'];
293 }
294
295 if (isset($data['url_query'])) {
296 $url_query = $data['url_query'];
297 }
298
299 if (is_array($data['page_sizes']) && isset($tenweb_domain_id)) {
300 if (empty($data['page_sizes'])) {
301 $data['page_sizes'] = $TwoSettings->default_settings['two_critical_sizes'];
302 }
303
304 $request_data = [
305 'url' => $url,
306 'page_id' => $page_id,
307 'initiator' => $initiator,
308 'sizes' => array_values($data['page_sizes']),
309 'url_query' => $url_query,
310 'wait_until' => $wait_until,
311 'tenweb_domain_id' => $tenweb_domain_id,
312 'newly_connected_website' => $data['newly_connected_website'] ?? false
313 ];
314 $two_img_in_viewport_lazyload = $TwoSettings->get_settings('two_img_in_viewport_lazyload');
315
316 if ($two_img_in_viewport_lazyload == 'on') {
317 $request_data['two_img_in_viewport'] = 'on';
318 } else {
319 $request_data['two_img_in_viewport'] = 'off';
320 }
321 self::getCriticalCssApi($request_data);
322 }
323 }
324
325 public function getCriticalCssData($id)
326 {
327 if (is_array($this->two_critical_pages) && isset($this->two_critical_pages[$id])) {
328 $critical_page = $this->two_critical_pages[$id];
329
330 if (isset($this->two_critical_pages[$id]['critical_css']) && !empty($this->two_critical_pages[$id]['critical_css'])) {
331 $this->critical_css = $this->two_critical_pages[$id]['critical_css'];
332 $file_dir = TWO_CACHE_DIR . 'critical/' . $this->critical_css;
333
334 if (!file_exists($file_dir)) {
335 if (isset($critical_page['status']) && $critical_page['status'] === 'success') {
336 global $TwoSettings;
337 $this->two_critical_pages[$id]['status'] = 'not_started';
338 $TwoSettings->update_setting('two_critical_pages', $this->two_critical_pages);
339 }
340
341 return;
342 }
343 } else {
344 return;
345 }
346
347 if (isset($critical_page['load_type'])) {
348 $this->uncritical_load_type = $critical_page['load_type'];
349 } else {
350 $this->uncritical_load_type = 'async';
351 }
352
353 if (isset($critical_page['status'])) {
354 $this->status = $critical_page['status'];
355 } else {
356 $this->status = 'not_started';
357 }
358
359 if (isset($this->two_critical_pages[$id]['uncritical_css']) && !empty($this->two_critical_pages[$id]['uncritical_css'])) {
360 $this->uncritical_css = $this->two_critical_pages[$id]['uncritical_css'];
361 }
362
363 if (isset($this->two_critical_pages[$id]['critical_bg']) && !empty($this->two_critical_pages[$id]['critical_bg'])) {
364 $this->critical_bg = $this->two_critical_pages[$id]['critical_bg'];
365 }
366
367 if (isset($this->two_critical_pages[$id]['images_in_viewport']) && !empty($this->two_critical_pages[$id]['images_in_viewport'])) {
368 if (file_exists(TWO_CACHE_DIR . 'critical/' . $this->two_critical_pages[$id]['images_in_viewport'])) {
369 $this->images_in_viewport = json_decode(file_get_contents(TWO_CACHE_DIR . 'critical/' . $this->two_critical_pages[$id]['images_in_viewport'])); // phpcs:ignore WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsUnknown
370 }
371 }
372
373 if (isset($this->two_critical_pages[$id]['critical_fonts']) && !empty($this->two_critical_pages[$id]['critical_fonts'])) {
374 if (file_exists(TWO_CACHE_DIR . 'critical/' . $this->two_critical_pages[$id]['critical_fonts'])) {
375 $this->critical_fonts = json_decode(file_get_contents(TWO_CACHE_DIR . 'critical/' . $this->two_critical_pages[$id]['critical_fonts'])); // phpcs:ignore WordPressVIPMinimum.Performance.FetchingRemoteData.FileGetContentsUnknown
376 }
377 }
378
379 if (isset($this->two_critical_pages[$id]['use_uncritical']) && $this->two_critical_pages[$id]['use_uncritical'] == 'true') {
380 $this->use_uncritical = true;
381 }
382 }
383 }
384
385 /**
386 * Generate Critical CSS for a single post.
387 */
388 public static function generate_critical_css_by_id($post_id, $rightAfterConnect = false, $initiator = '')
389 {
390 $tenweb_subscription_id = \TenWebWpTransients\OptimizerTransients::get(TENWEB_PREFIX . '_subscription_id');
391 $is_free = (in_array((int) $tenweb_subscription_id, TENWEB_SO_FREE_SUBSCRIPTION_IDS) && !TENWEB_SO_HOSTED_ON_10WEB);
392 global $TwoSettings;
393
394 if ($TwoSettings->get_settings('two_critical_status') === 'true' || $is_free) {
395 $post_data = OptimizerUtils::get_permalink_name_by_id($post_id);
396 $post_url = $post_data[ 'url' ];
397 $post_title = $post_data[ 'title' ];
398
399 $waitUntil = 'load';
400 $load_type = 'load_type';
401 $use_uncritical = 'off';
402 $two_critical_default_settings = get_option('two_critical_default_settings');
403
404 if (isset($two_critical_default_settings['wait_until'])) {
405 $waitUntil = $two_critical_default_settings['wait_until'];
406 }
407
408 if (isset($two_critical_default_settings['load_type'])) {
409 $load_type = $two_critical_default_settings['load_type'];
410 }
411
412 if (isset($two_critical_default_settings['use_uncritical'])) {
413 $use_uncritical = $two_critical_default_settings['use_uncritical'];
414 }
415 $page_sizes = OptimizerUtils::get_critical_default_sizes($two_critical_default_settings);
416
417 $data = [
418 'action' => 'two_critical',
419 'two_critical_sizes' => $TwoSettings->get_settings('two_critical_sizes'),
420 'data' => [
421 'page_url' => $post_url,
422 'page_id' => $post_id,
423 'newly_connected_website' => $rightAfterConnect,
424 'page_sizes' => $page_sizes,
425 'wait_until' => $waitUntil,
426 'url_query' => $TwoSettings->get_settings('two_critical_url_args'),
427 'task' => 'generate',
428 'initiator' => $initiator,
429 'clear_cache' => true
430 ],
431 ];
432 $two_critical_pages = [];
433 $two_critical_pages[$post_id] = [
434 'title' => $post_title,
435 'url' => $post_url,
436 'id' => $post_id,
437 'sizes' => $page_sizes,
438 'load_type' => $load_type,
439 'wait_until' => $waitUntil,
440 'use_uncritical' => $use_uncritical,
441 'status' => 'in_progress'
442 ];
443 $data['two_critical_pages'] = $two_critical_pages;
444 $response = self::generateCriticalCSS($data);
445 }
446 }
447
448 public static function generateCriticalCSS($data)
449 {
450 do_action('two_before_generate_critical_css', debug_backtrace()); //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
451 global $TwoSettings;
452 $return_data = [
453 'success' => false,
454 ];
455 $two_critical_pages = OptimizerUtils::getCriticalPages();
456 OptimizerUtils::init_defines();
457
458 if (!defined('TWO_CACHE_DIR')) {
459 define('TWO_CACHE_DIR', OptimizerCache::get_path());
460 }
461
462 if (isset($data['two_critical_pages']) && is_array($data['two_critical_pages'])) {
463 foreach ($data['two_critical_pages'] as $key => $critical_page_data) {
464 if (isset($two_critical_pages[$key])) {
465 if (isset($two_critical_pages[$key]['critical_css'])) {
466 $data['two_critical_pages'][$key]['critical_css'] = $two_critical_pages[$key]['critical_css'];
467 }
468
469 if (isset($two_critical_pages[$key]['uncritical_css'])) {
470 $data['two_critical_pages'][$key]['uncritical_css'] = $two_critical_pages[$key]['uncritical_css'];
471 }
472
473 if (isset($two_critical_pages[$key]['critical_fonts'])) {
474 $data['two_critical_pages'][$key]['critical_fonts'] = $two_critical_pages[$key]['critical_fonts'];
475 }
476
477 if (isset($two_critical_pages[$key]['critical_bg'])) {
478 $data['two_critical_pages'][$key]['critical_bg'] = $two_critical_pages[$key]['critical_bg'];
479 }
480 }
481 }
482
483 // Restore front_page when regenerating criticals for other pages.
484 foreach ($two_critical_pages as $key => $critical_page_data) {
485 if (!isset($data[ 'two_critical_pages' ][ $key ]) && OptimizerUrl::isCriticalSavedInSettings($key)) {
486 $data[ 'two_critical_pages' ][ $key ] = $critical_page_data;
487 }
488 }
489 $TwoSettings->update_setting('two_critical_pages', $data['two_critical_pages']);
490 }
491
492 if (isset($data['two_critical_sizes'])) {
493 $TwoSettings->update_setting('two_critical_sizes', $data['two_critical_sizes']);
494 }
495
496 if (isset($data['data']) && is_array($data['data']) && isset($data['data']['page_id']) && isset($data['data']['page_url']) && isset($data['data']['page_sizes'])) {
497 $critical_in_progress_key = 'two_critical_in_progress_' . $data['data']['page_id'];
498 \TenWebWpTransients\OptimizerTransients::set($critical_in_progress_key, '1', 30 * MINUTE_IN_SECONDS);
499 OptimizerCriticalCss::setCritical($data['data']);
500 $return_data['success'] = true;
501 }
502 //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace, PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.Changed
503 do_action('two_after_generate_critical_css', debug_backtrace());
504
505 return $return_data;
506 }
507
508 /**
509 * Create / import critical CSS from uploaded JSON or string payload.
510 *
511 * @param string|false $file_path
512 * @param bool $firstImportOfCss
513 * @param string $file_content
514 * @param bool $css_import_no_rest
515 * @param string|null $expected_page_id when set, JSON page_id must match (callback auth)
516 *
517 * @return bool true only when critical CSS was successfully written for the page
518 */
519 public static function createCriticalCSS($file_path, $firstImportOfCss = false, $file_content = '', $css_import_no_rest = false, $expected_page_id = null)
520 {
521 do_action('two_before_create_critical_css', debug_backtrace()); //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
522 OptimizerUtils::init_defines();
523
524 if (!defined('TWO_CACHE_DIR')) {
525 define('TWO_CACHE_DIR', OptimizerCache::get_path());
526 }
527 global $TwoSettings;
528 $success = false;
529
530 if (!empty($file_content) || (file_exists($file_path) && is_readable($file_path))) {
531 try {
532 if (empty($file_content)) {
533 $critical_data_json = file_get_contents($file_path); // phpcs:ignore
534 } else {
535 $critical_data_json = $file_content;
536 }
537 $two_critical_pages = OptimizerUtils::getCriticalPages();
538
539 if (!empty($critical_data_json)) {
540 $critical_data = json_decode($critical_data_json, true);
541
542 if (isset($critical_data['page_data']['page_id'])) {
543 if (isset($critical_data['subscription_id']) && (int) $critical_data['subscription_id'] > 0) {
544 \TenWebWpTransients\OptimizerTransients::set(TENWEB_PREFIX . '_subscription_id', (int) $critical_data['subscription_id'], 12 * HOUR_IN_SECONDS);
545 }
546 $page_id = sanitize_text_field($critical_data['page_data']['page_id']);
547
548 if (!OptimizerUtils::is_valid_critical_page_id($page_id)) {
549 return false;
550 }
551
552 // Callback must only write CSS for the page that was authorized.
553 if (null !== $expected_page_id && (string) $expected_page_id !== (string) $page_id) {
554 return false;
555 }
556
557 $critical_key = 'two_critical_' . $page_id;
558 \TenWebWpTransients\OptimizerTransients::delete($critical_key);
559
560 if (isset($two_critical_pages[$page_id])) {
561 $critical_page = $two_critical_pages[$page_id];
562
563 if (isset($critical_data['critical_css']) && !empty($critical_data['critical_css'])) {
564 $critical_data['critical_css'] = OptimizerUtils::sanitize_critical_css($critical_data['critical_css']);
565 }
566
567 if (isset($critical_data['uncritical_css']) && !empty($critical_data['uncritical_css'])) {
568 $critical_data['uncritical_css'] = OptimizerUtils::sanitize_critical_css($critical_data['uncritical_css']);
569 }
570
571 if (isset($critical_data['critical_css']) && !empty($critical_data['critical_css'])) {
572 $cssMinifier = new OptimizerCSSMin();
573 $critical_css = $cssMinifier->run($critical_data['critical_css'], true);
574 $cache = new OptimizerCache($page_id, 'critical', 'all', 'critical');
575 $critical_page['critical_css'] = basename($cache->getname(true));
576 $cache->cache($critical_css, 'text/critical');
577 }
578
579 if (isset($critical_data['uncritical_css']) && !empty($critical_data['uncritical_css'])) {
580 $cssMinifier = new OptimizerCSSMin();
581 $uncritical_css = $cssMinifier->run($critical_data['uncritical_css'], true);
582 $cache = new OptimizerCache($page_id, 'critical', 'all', 'uncritical');
583 $critical_page['uncritical_css'] = basename($cache->getname(true));
584 $uncritical_css = "/* 10Web Booster Uncritical CSS */\n" . $critical_data['uncritical_css'];
585 $cache->cache($uncritical_css, 'text/critical');
586 }
587
588 if (isset($critical_data['critical_fonts'])) {
589 $critical_fonts = $critical_data['critical_fonts'];
590 $critical_fonts_json = json_encode($critical_fonts); // phpcs:ignore
591 $cache = new OptimizerCache($page_id, 'font', 'all', 'critical_font');
592 $critical_page['critical_fonts'] = basename($cache->getname(true));
593 $cache->cache($critical_fonts_json, 'text/json');
594 }
595
596 if (isset($critical_data['critical_bg'])) {
597 $critical_bg = $critical_data['critical_bg'];
598
599 // Regenerate missing image sizes.
600 foreach ($critical_bg as $bg) {
601 $id = OptimizerUtils::getImageIdByUrl($bg['bg_url']);
602
603 if ($id) {
604 $attachment = get_post($id);
605 OptimizerUtils::wp_maybe_generate_attachment_metadata($attachment);
606 }
607 }
608 $critical_bg_json = json_encode($critical_bg); // phpcs:ignore
609
610 $cache = new OptimizerCache($page_id, 'font', 'all', 'critical_bg');
611 $critical_page['critical_bg'] = basename($cache->getname(true));
612 $cache->cache($critical_bg_json, 'text/json');
613 }
614
615 if (isset($critical_data['images_in_viewport'])) {
616 $images_in_viewport = json_encode($critical_data['images_in_viewport']); // phpcs:ignore
617 $cache = new OptimizerCache($page_id, 'font', 'all', 'images_in_viewport');
618 $critical_page['images_in_viewport'] = basename($cache->getname(true));
619 $cache->cache($images_in_viewport, 'text/json');
620 }
621
622 if (!empty($critical_page['critical_css'])) {
623 $date = time();
624 delete_option('two_critical_blocked');
625 $critical_page['status'] = 'success';
626 $critical_page['critical_date'] = $date;
627 $two_critical_pages[$page_id] = $critical_page;
628 $TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
629 $regenerate_data = \TenWebWpTransients\OptimizerTransients::get('two_regenerate_critical_data');
630
631 if (is_array($regenerate_data) && !empty($regenerate_data)) {
632 OptimizerUtils::regenerate_critical();
633 } else {
634 \TenWebOptimizer\OptimizerAdmin::clear_cache(false, true);
635
636 if ($page_id !== 'front_page') {
637 OptimizerUtils::update_post($page_id);
638 } else {
639 OptimizerUtils::update_post();
640 }
641 }
642 $success = true;
643 } else {
644 update_option('two_critical_blocked', true);
645 $critical_page['status'] = 'error';
646 $two_critical_pages[$page_id] = $critical_page;
647 $TwoSettings->update_setting('two_critical_pages', $two_critical_pages);
648 $regenerate_data = \TenWebWpTransients\OptimizerTransients::get('two_regenerate_critical_data');
649
650 if (is_array($regenerate_data) && !empty($regenerate_data)) {
651 OptimizerUtils::regenerate_critical();
652 }
653 }
654 }
655
656 if (has_action('two_page_optimized')) {
657 do_action('two_page_optimized', $page_id);
658 }
659
660 if ($page_id === 'front_page' && has_action('bwg_hompage_optimized')) {
661 do_action('bwg_hompage_optimized');
662 }
663 }
664 }
665 //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace,PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection
666 do_action('two_after_create_critical_css', debug_backtrace());
667
668 if (empty($file_content) && file_exists($file_path)) {
669 unlink($file_path); // phpcs:ignore
670 }
671 } catch (Exception $exception) {
672 update_option('two_critical_data_import_exception_' . time(), $exception->getMessage() . ' on ' . $exception->getLine() . ' in ' . $exception->getFile(), false);
673 $success = false;
674 }
675 }
676
677 if ($firstImportOfCss) {
678 if ($css_import_no_rest) {
679 OptimizerUtils::update_connection_flow_progress('running', 'css_import_no_rest');
680 }
681 update_option('two_triggerPostOptimizationTasks', '1', false);
682 // phpcs:ignore Squiz.PHP.CommentedOutCode.Found
683 //OptimizerUtils::triggerPostOptimizationTasks();
684 }
685
686 return $success;
687 }
688 }
689