PluginProbe
Autoptimize / 3.1.4
Autoptimize v3.1.4
2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 2.7.8 All 107 releases
← All changes | classes/autoptimizeCriticalCSSSettings.php +116 -49 2.7.03.1.4 View file →
@@ -14,10 +14,10 @@
14 14 * @var bool
15 15 */
16 16 private $settings_screen_do_remote_http = true;
17 17
18 - public function __construct()
19 - {
18 + public function __construct() {
19 + $this->criticalcss = autoptimize()->criticalcss();
20 20 $this->settings_screen_do_remote_http = apply_filters( 'autoptimize_settingsscreen_remotehttp', $this->settings_screen_do_remote_http );
21 21 $this->run();
22 22 }
23 23
@@ -38,14 +38,19 @@
38 38 add_action( 'admin_menu', array( $this, 'add_critcss_admin_menu' ) );
39 39 }
40 40
41 41 $criticalcss_ajax = new autoptimizeCriticalCSSSettingsAjax();
42 +
43 + // if debug logging is off but the file is present, then remove the debug log file.
44 + if ( empty( $this->criticalcss->get_option( 'debug' ) ) && file_exists( AO_CCSS_LOG ) ) {
45 + unlink( AO_CCSS_LOG );
46 + }
42 47 }
43 48 }
44 49
45 50 public function add_critcss_tabs( $in )
46 51 {
47 - $in = array_merge( $in, array( 'ao_critcss' => '⚡ ' . __( 'Critical CSS', 'autoptimize' ) ) );
52 + $in = array_merge( $in, array( 'ao_critcss' => apply_filters( 'autoptimize_filter_ccss_tab_text', '⚡ ' . __( 'Critical CSS', 'autoptimize' ) ) ) );
48 53
49 54 return $in;
50 55 }
51 56
@@ -57,9 +62,9 @@
57 62 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_additional' );
58 63 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_queue' );
59 64 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_viewport' );
60 65 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_finclude' );
61 - register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_rlimit' );
66 + register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_rtimelimit' );
62 67 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_noptimize' );
63 68 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_debug' );
64 69 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_key' );
65 70 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_keyst' );
@@ -66,11 +71,12 @@
66 71 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_loggedin' );
67 72 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_forcepath' );
68 73 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_deferjquery' );
69 74 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_domain' );
75 + register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_unloadccss' );
70 76
71 77 // And add submenu-page.
72 - add_submenu_page( null, 'Critical CSS', 'Critical CSS', 'manage_options', 'ao_critcss', array( $this, 'ao_criticalcsssettings_page' ) );
78 + add_submenu_page( '', 'Critical CSS', 'Critical CSS', 'manage_options', 'ao_critcss', array( $this, 'ao_criticalcsssettings_page' ) );
73 79 }
74 80
75 81 public function admin_assets( $hook ) {
76 82 // Return if plugin is not hooked.
@@ -98,19 +104,29 @@
98 104 require_once( 'critcss-inc/admin_settings_key.php' );
99 105 require_once( 'critcss-inc/admin_settings_adv.php' );
100 106 require_once( 'critcss-inc/admin_settings_explain.php' );
101 107
102 - // fetch all options at once and populate them individually explicitely as globals.
103 - $all_options = autoptimizeCriticalCSSBase::fetch_options();
104 - foreach ( $all_options as $_option => $_value ) {
105 - global ${$_option};
106 - ${$_option} = $_value;
107 - }
108 + $ao_ccss_key = $this->criticalcss->get_option( 'key' );
109 + $ao_ccss_keyst = $this->criticalcss->get_option( 'keyst' );
110 + $ao_css_defer = $this->criticalcss->get_option( 'css_defer' );
111 + $ao_ccss_deferjquery = $this->criticalcss->get_option( 'deferjquery' );
112 + $ao_ccss_queue = $this->criticalcss->get_option( 'queue' );
113 + $ao_ccss_rules = $this->criticalcss->get_option( 'rules' );
114 + $ao_ccss_servicestatus = $this->criticalcss->get_option( 'servicestatus' );
115 + $ao_ccss_finclude = $this->criticalcss->get_option( 'finclude' );
116 + $ao_ccss_rtimelimit = $this->criticalcss->get_option( 'rtimelimit' );
117 + $ao_ccss_debug = $this->criticalcss->get_option( 'debug' );
118 + $ao_ccss_noptimize = $this->criticalcss->get_option( 'noptimize' );
119 + $ao_css_defer_inline = $this->criticalcss->get_option( 'css_defer_inline' );
120 + $ao_ccss_loggedin = $this->criticalcss->get_option( 'loggedin' );
121 + $ao_ccss_forcepath = $this->criticalcss->get_option( 'forcepath' );
122 + $ao_ccss_domain = $this->criticalcss->get_option( 'domain' );
108 123 ?>
124 + <script>document.title = "Autoptimize: <?php _e( 'Critical CSS', 'autoptimize' ); ?> " + document.title;</script>
109 125 <div class="wrap">
110 126 <div id="autoptimize_main">
111 127 <div id="ao_title_and_button">
112 - <h1><?php _e( 'Autoptimize Settings', 'autoptimize' ); ?></h1>
128 + <h1><?php apply_filters( 'autoptimize_filter_settings_is_pro', false ) ? _e( 'Autoptimize Pro Settings', 'autoptimize' ) : _e( 'Autoptimize Settings', 'autoptimize' ); ?></h1>
113 129 </div>
114 130
115 131 <?php
116 132 // Print AO settings tabs.
@@ -115,41 +131,70 @@
115 131 <?php
116 132 // Print AO settings tabs.
117 133 echo autoptimizeConfig::ao_admin_tabs();
118 134
119 - // Make sure dir to write ao_ccss exists and is writable.
120 - if ( ! is_dir( AO_CCSS_DIR ) ) {
121 - $mkdirresp = @mkdir( AO_CCSS_DIR, 0775, true ); // @codingStandardsIgnoreLine
122 - $fileresp = file_put_contents( AO_CCSS_DIR . 'index.html', '<html><head><meta name="robots" content="noindex, nofollow"></head><body>Generated by <a href="http://wordpress.org/extend/plugins/autoptimize/" rel="nofollow">Autoptimize</a></body></html>' );
123 - if ( ( ! $mkdirresp ) || ( ! $fileresp ) ) {
124 - ?>
125 - <div class="notice-error notice"><p>
135 + if ( autoptimizeUtils::is_local_server() && isset( $ao_ccss_key ) ) { ?>
136 + <div class="notice-warning notice"><p>
137 + <?php
138 + echo __( 'The Critical CSS service does not work on locally hosted sites or when the server is on a private network.', 'autoptimize' );
139 + ?>
140 + </p></div>
141 + <?php }
142 +
143 + $mkdirresult = $this->criticalcss->create_ao_ccss_dir();
144 +
145 + // Warn if we could not create those files.
146 + if ( ( true !== $mkdirresult ) ) {
147 + ?>
148 + <div class="notice-error notice"><p>
149 + <?php
150 + _e( 'Could not create the required directory. Make sure the webserver can write to the wp-content/uploads directory.', 'autoptimize' );
151 + ?>
152 + </p></div>
153 + <?php
154 + }
155 +
156 + // Check if CSS optimization is on.
157 + if ( 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_css' ) || 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_css_defer' ) ) {
158 + ?>
159 + <div class="notice-info notice"><p>
160 + <?php
161 + _e( 'To be able to use Critical CSS you will have to enable CSS optimization and make sure "eliminate render-blocking CSS" is active on the main Autoptimize settings page.', 'autoptimize' );
162 + ?>
163 + </p></div>
164 + <?php
165 + }
166 +
167 + // Check for "inline & defer CSS" being active in Autoptimize.
168 + if ( ! empty( $ao_ccss_key ) && ! $ao_css_defer && empty( $ao_ccss_keyst ) ) {
169 + // no keystate so likely in activation-process of CCSS, let's enable "inline & defer CSS" immediately to make things easier!
170 + autoptimizeOptionWrapper::update_option( 'autoptimize_css_defer', 'on' );
171 + ?>
172 + <div class="notice-info notice"><p>
126 173 <?php
127 - _e( 'Could not create the required directory. Make sure the webserver can write to the wp-content directory.', 'autoptimize' );
174 + _e( 'The "Eliminate render-blocking CSS" option was activated to allow critical CSS to be used.', 'autoptimize' );
128 175 ?>
129 176 </p></div>
130 177 <?php
131 - }
132 178 }
133 179
134 - // Check for Autoptimize.
135 - if ( ! empty( $ao_ccss_key ) && ! $ao_css_defer ) {
180 + // check if WordPress cron is disabled and warn if so.
181 + if ( ! empty( $ao_ccss_key ) && defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON && PAnD::is_admin_notice_active( 'i-know-about-disable-cron-forever' ) ) {
136 182 ?>
137 - <div class="notice-error notice"><p>
183 + <div data-dismissible="i-know-about-disable-cron-forever" class="notice-warning notice is-dismissible"><p>
138 184 <?php
139 - _e( "Oops! Please <strong>activate the \"Inline and Defer CSS\" option</strong> on Autoptimize's main settings page to use this power-up.", 'autoptimize' );
185 + _e( 'WordPress cron (for task scheduling) seems to be disabled. Have a look at <a href="https://wordpress.org/plugins/autoptimize-criticalcss/faq/" target="_blank">the FAQ</a> or the info in the Job Queue instructions if all jobs remain in "N" status and no rules are created.', 'autoptimize' );
140 186 ?>
141 187 </p></div>
142 188 <?php
143 - return;
144 189 }
145 190
146 - // check if WordPress cron is disabled and warn if so.
147 - if ( ! empty( $ao_ccss_key ) && defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON && PAnD::is_admin_notice_active( 'i-know-about-disable-cron-forever' ) ) {
191 + // check if defer jQuery is active and warn if so.
192 + if ( 1 == $ao_ccss_deferjquery && PAnD::is_admin_notice_active( 'i-know-about-defer-inline-forever' ) ) {
148 193 ?>
149 - <div data-dismissible="i-know-about-disable-cron-forever" class="notice-warning notice is-dismissible"><p>
194 + <div data-dismissible="i-know-about-defer-inline-forever" class="notice-warning notice is-dismissible"><p>
150 195 <?php
151 - _e( 'WordPress cron (for task scheduling) seems to be disabled. Have a look at <a href="https://wordpress.org/plugins/autoptimize-criticalcss/faq/" target="_blank">the FAQ</a> or the info in the Job Queue instructions if all jobs remain in "N" status and no rules are created.', 'autoptimize' );
196 + _e( 'You have "defer jQuery and other non-aggregated JS-files" active (under Advanced Settings), but that functionality is deprecated and will be removed in the next major version of Autoptimize. Consider using the new "Do not aggregate but defer" and "Also defer inline JS" options on the main settings page instead.', 'autoptimize' );
152 197 ?>
153 198 </p></div>
154 199 <?php
155 200 }
@@ -209,8 +254,10 @@
209 254 ?>
210 255 <div class="notice-success notice"><p>
211 256 <?php
212 257 _e( 'Great, Autoptimize will now automatically start creating new critical CSS rules, you should see those appearing below in the next couple of hours.', 'autoptimize' );
258 + echo ' ';
259 + _e( 'In the meantime you might want to <strong>edit default rule CSS now</strong>, to avoid all CSS being inlined when no (applicable) rules are found.', 'autoptimize' );
213 260 ?>
214 261 </p></div>
215 262 <?php
216 263 }
@@ -225,8 +272,21 @@
225 272 </p></div>
226 273 <?php
227 274 }
228 275
276 + // warn if too many rules (based on length of ao_ccss_rules option) as that might cause issues at e.g. wpengine
277 + // see https://wpengine.com/support/database-optimization-best-practices/#Autoloaded_Data .
278 + $_raw_rules_length = strlen( get_option( 'autoptimize_ccss_rules', '' ) );
279 + if ( $_raw_rules_length > apply_filters( 'autoptimize_ccss_rules_length_warning', 500000 ) ) {
280 + ?>
281 + <div class="notice-warning notice"><p>
282 + <?php
283 + _e( 'It looks like the amount of Critical CSS rules is very high, it is recommended to reconfigure Autoptimize (e.g. by manually creating broader rules) to ensure less rules are created.', 'autoptimize' );
284 + ?>
285 + </p></div>
286 + <?php
287 + }
288 +
229 289 // Settings Form.
230 290 ?>
231 291 <form id="settings" method="post" action="options.php">
232 292 <?php
@@ -232,9 +292,9 @@
232 292 <?php
233 293 settings_fields( 'ao_ccss_options_group' );
234 294
235 295 // Get API key status.
236 - $key = autoptimizeCriticalCSSCore::ao_ccss_key_status( true );
296 + $key = $this->criticalcss->key_status( true );
237 297
238 298 if ( $this->is_multisite_network_admin() ) {
239 299 ?>
240 300 <ul id="key-panel">
@@ -246,9 +306,9 @@
246 306 </li>
247 307 </ul>
248 308 <?php
249 309 } else {
250 - if ( 'valid' == $key['status'] ) {
310 + if ( 'valid' == $key['status'] || ( defined( 'AO_PRO_VERSION' ) && has_filter( 'autoptimize_filter_ccss_key' ) ) ) {
251 311 // If key status is valid, render other panels.
252 312 // Render rules section.
253 313 ao_ccss_render_rules();
254 314 // Render queue section.
@@ -255,27 +315,34 @@
255 315 ao_ccss_render_queue();
256 316 // Render advanced panel.
257 317 ao_ccss_render_adv();
258 318 } else {
319 + if ( apply_filters( 'autoptimize_filter_ccss_rules_without_api', true ) ) {
320 + // Render rules section for manual rules.
321 + ao_ccss_render_rules();
322 + } else {
323 + echo "<input class='hidden' name='autoptimize_ccss_rules' value='" . json_encode( $ao_ccss_rules, JSON_FORCE_OBJECT ) . "'>";
324 + }
325 +
259 326 // But if key is other than valid, add hidden fields to persist settings when submitting form
260 327 // Show explanation of why and how to get a API key.
261 328 ao_ccss_render_explain();
262 329
263 330 // Get viewport size.
264 - $viewport = autoptimizeCriticalCSSCore::ao_ccss_viewport();
331 + $viewport = $this->criticalcss->viewport();
265 332
266 333 // Add hidden fields.
267 - echo "<input class='hidden' name='autoptimize_ccss_rules' value='" . $ao_ccss_rules_raw . "'>";
268 - echo "<input class='hidden' name='autoptimize_ccss_queue' value='" . $ao_ccss_queue_raw . "'>";
269 - echo '<input class="hidden" name="autoptimize_ccss_viewport[w]" value="' . $viewport['w'] . '">';
270 - echo '<input class="hidden" name="autoptimize_ccss_viewport[h]" value="' . $viewport['h'] . '">';
271 - echo '<input class="hidden" name="autoptimize_ccss_finclude" value="' . $ao_ccss_finclude . '">';
272 - echo '<input class="hidden" name="autoptimize_ccss_rlimit" value="' . $ao_ccss_rlimit . '">';
273 - echo '<input class="hidden" name="autoptimize_ccss_debug" value="' . $ao_ccss_debug . '">';
274 - echo '<input class="hidden" name="autoptimize_ccss_noptimize" value="' . $ao_ccss_noptimize . '">';
334 + echo "<input class='hidden' name='autoptimize_ccss_queue' value='" . json_encode( $ao_ccss_queue, JSON_FORCE_OBJECT ) . "'>";
335 + echo '<input class="hidden" name="autoptimize_ccss_viewport[w]" value="' . esc_attr( $viewport['w'] ) . '">';
336 + echo '<input class="hidden" name="autoptimize_ccss_viewport[h]" value="' . esc_attr( $viewport['h'] ) . '">';
337 + echo '<input class="hidden" name="autoptimize_ccss_finclude" value="' . esc_attr( $ao_ccss_finclude ) . '">';
338 + echo '<input class="hidden" name="autoptimize_ccss_rtimelimit" value="' . esc_attr( $ao_ccss_rtimelimit ) . '">';
339 + echo '<input class="hidden" name="autoptimize_ccss_debug" value="' . esc_attr( $ao_ccss_debug ) . '">';
340 + echo '<input class="hidden" name="autoptimize_ccss_noptimize" value="' . esc_attr( $ao_ccss_noptimize ) . '">';
275 341 echo '<input class="hidden" name="autoptimize_css_defer_inline" value="' . esc_attr( $ao_css_defer_inline ) . '">';
276 - echo '<input class="hidden" name="autoptimize_ccss_loggedin" value="' . $ao_ccss_loggedin . '">';
277 - echo '<input class="hidden" name="autoptimize_ccss_forcepath" value="' . $ao_ccss_forcepath . '">';
342 + echo '<input class="hidden" name="autoptimize_ccss_loggedin" value="' . esc_attr( $ao_ccss_loggedin ) . '">';
343 + echo '<input class="hidden" name="autoptimize_ccss_forcepath" value="' . esc_attr( $ao_ccss_forcepath ) . '">';
344 + echo '<input class="hidden" name="autoptimize_ccss_domain" id="autoptimize_ccss_domain" value="' . esc_attr( $ao_ccss_domain ) . '">';
278 345 }
279 346 // Render key panel unconditionally.
280 347 ao_ccss_render_key( $ao_ccss_key, $key['status'], $key['stmsg'], $key['msg'], $key['color'] );
281 348 ?>
@@ -297,9 +364,9 @@
297 364 return String.fromCharCode((letter <= 'Z' ? 90 : 122) >= (letter = letter.charCodeAt(0) + itype) ? letter : letter - 26);
298 365 });
299 366 }
300 367 </script>
301 - <form id="importSettingsForm"<?php if ( $this->is_multisite_network_admin() ) { echo ' class="hidden"'; } ?>>
368 + <form id="importSettingsForm"<?php if ( $this->is_multisite_network_admin() ) { echo ' class="hidden"'; } // @codingStandardsIgnoreLine ?>>
302 369 <span id="exportSettings" class="button-secondary"><?php _e( 'Export Settings', 'autoptimize' ); ?></span>
303 370 <input class="button-secondary" id="importSettings" type="button" value="<?php _e( 'Import Settings', 'autoptimize' ); ?>" onclick="upload();return false;" />
304 371 <input class="button-secondary" id="settingsfile" name="settingsfile" type="file" />
305 372 </form>
@@ -309,9 +376,9 @@
309 376 <?php
310 377 if ( ! $this->is_multisite_network_admin() ) {
311 378 // Include debug panel if debug mode is enable.
312 379 if ( $ao_ccss_debug ) {
313 - ?>
380 + ?>
314 381 <div id="debug">
315 382 <?php
316 383 // Include debug panel.
317 384 include( 'critcss-inc/admin_settings_debug.php' );
@@ -316,9 +383,9 @@
316 383 // Include debug panel.
317 384 include( 'critcss-inc/admin_settings_debug.php' );
318 385 ?>
319 386 </div><!-- /#debug -->
320 - <?php
387 + <?php
321 388 }
322 389 echo '<script>';
323 390 include( 'critcss-inc/admin_settings_rules.js.php' );
324 391 include( 'critcss-inc/admin_settings_queue.js.php' );
@@ -326,13 +393,13 @@
326 393 echo '</script>';
327 394 }
328 395 }
329 396
330 - public static function ao_ccss_has_autorules() {
397 + public function ao_ccss_has_autorules() {
331 398 static $_has_auto_rules = null;
332 399
333 400 if ( null === $_has_auto_rules ) {
334 - global $ao_ccss_rules;
401 + $ao_ccss_rules = $this->criticalcss->get_option( 'rules' );
335 402 $_has_auto_rules = false;
336 403 if ( ! empty( $ao_ccss_rules ) ) {
337 404 foreach ( array( 'types', 'paths' ) as $_typat ) {
338 405 foreach ( $ao_ccss_rules[ $_typat ] as $rule ) {
@@ -351,9 +418,9 @@
351 418
352 419 return $_has_auto_rules;
353 420 }
354 421
355 - public function is_multisite_network_admin() {
422 + public static function is_multisite_network_admin() {
356 423 static $_multisite_network_admin = null;
357 424
358 425 if ( null === $_multisite_network_admin ) {
359 426 if ( is_multisite() && is_network_admin() ) {