PluginProbe
Autoptimize / trunk
Autoptimize vtrunk
3.1.16 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 All 108 releases
← All changes | classes/autoptimizeCriticalCSSSettings.php +134 -69 2.7.3 → trunk View file →
@@ -14,10 +14,17 @@
14 14 * @var bool
15 15 */
16 16 private $settings_screen_do_remote_http = true;
17 17
18 - public function __construct()
19 - {
18 + /**
19 + * Critical CSS object.
20 + *
21 + * @var object
22 + */
23 + protected $criticalcss;
24 +
25 + public function __construct() {
26 + $this->criticalcss = autoptimize()->criticalcss();
20 27 $this->settings_screen_do_remote_http = apply_filters( 'autoptimize_settingsscreen_remotehttp', $this->settings_screen_do_remote_http );
21 28 $this->run();
22 29 }
23 30
@@ -38,14 +45,19 @@
38 45 add_action( 'admin_menu', array( $this, 'add_critcss_admin_menu' ) );
39 46 }
40 47
41 48 $criticalcss_ajax = new autoptimizeCriticalCSSSettingsAjax();
49 +
50 + // if debug logging is off but the file is present, then remove the debug log file.
51 + if ( empty( $this->criticalcss->get_option( 'debug' ) ) && file_exists( AO_CCSS_LOG ) ) {
52 + unlink( AO_CCSS_LOG );
53 + }
42 54 }
43 55 }
44 56
45 57 public function add_critcss_tabs( $in )
46 58 {
47 - $in = array_merge( $in, array( 'ao_critcss' => '⚡ ' . __( 'Critical CSS', 'autoptimize' ) ) );
59 + $in = array_merge( $in, array( 'ao_critcss' => apply_filters( 'autoptimize_filter_ccss_tab_text', '⚡ ' . esc_html__( 'Critical CSS', 'autoptimize' ) ) ) );
48 60
49 61 return $in;
50 62 }
51 63
@@ -57,9 +69,9 @@
57 69 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_additional' );
58 70 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_queue' );
59 71 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_viewport' );
60 72 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_finclude' );
61 - register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_rlimit' );
73 + register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_rtimelimit' );
62 74 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_noptimize' );
63 75 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_debug' );
64 76 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_key' );
65 77 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_keyst' );
@@ -66,11 +78,12 @@
66 78 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_loggedin' );
67 79 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_forcepath' );
68 80 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_deferjquery' );
69 81 register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_domain' );
82 + register_setting( 'ao_ccss_options_group', 'autoptimize_ccss_unloadccss' );
70 83
71 84 // And add submenu-page.
72 - add_submenu_page( null, 'Critical CSS', 'Critical CSS', 'manage_options', 'ao_critcss', array( $this, 'ao_criticalcsssettings_page' ) );
85 + add_submenu_page( '', 'Critical CSS', 'Critical CSS', 'manage_options', 'ao_critcss', array( $this, 'ao_criticalcsssettings_page' ) );
73 86 }
74 87
75 88 public function admin_assets( $hook ) {
76 89 // Return if plugin is not hooked.
@@ -79,16 +92,16 @@
79 92 }
80 93
81 94 // Stylesheets to add.
82 95 wp_enqueue_style( 'wp-jquery-ui-dialog' );
83 - wp_enqueue_style( 'ao-tablesorter', plugins_url( 'critcss-inc/css/ao-tablesorter/style.css', __FILE__ ) );
84 - wp_enqueue_style( 'ao-ccss-admin-css', plugins_url( 'critcss-inc/css/admin_styles.css', __FILE__ ) );
96 + wp_enqueue_style( 'ao-tablesorter', plugins_url( 'critcss-inc/css/ao-tablesorter/style.css', __FILE__ ), null, AUTOPTIMIZE_PLUGIN_VERSION );
97 + wp_enqueue_style( 'ao-ccss-admin-css', plugins_url( 'critcss-inc/css/admin_styles.css', __FILE__ ), null, AUTOPTIMIZE_PLUGIN_VERSION );
85 98
86 99 // Scripts to add.
87 - wp_enqueue_script( 'jquery-ui-dialog', array( 'jquery' ) );
88 - wp_enqueue_script( 'md5', plugins_url( 'critcss-inc/js/md5.min.js', __FILE__ ), null, null, true );
89 - wp_enqueue_script( 'tablesorter', plugins_url( 'critcss-inc/js/jquery.tablesorter.min.js', __FILE__ ), array( 'jquery' ), null, true );
90 - wp_enqueue_script( 'ao-ccss-admin-license', plugins_url( 'critcss-inc/js/admin_settings.js', __FILE__ ), array( 'jquery' ), null, true );
100 + wp_enqueue_script( 'jquery-ui-dialog', '', array( 'jquery' ), null, true );
101 + wp_enqueue_script( 'md5', plugins_url( 'critcss-inc/js/md5.min.js', __FILE__ ), null, AUTOPTIMIZE_PLUGIN_VERSION, true );
102 + wp_enqueue_script( 'tablesorter', plugins_url( 'critcss-inc/js/jquery.tablesorter.min.js', __FILE__ ), array( 'jquery' ), AUTOPTIMIZE_PLUGIN_VERSION, true );
103 + wp_enqueue_script( 'ao-ccss-admin-license', plugins_url( 'critcss-inc/js/admin_settings.js', __FILE__ ), array( 'jquery' ), AUTOPTIMIZE_PLUGIN_VERSION, true );
91 104 }
92 105
93 106 public function ao_criticalcsssettings_page()
94 107 {
@@ -98,19 +111,29 @@
98 111 require_once( 'critcss-inc/admin_settings_key.php' );
99 112 require_once( 'critcss-inc/admin_settings_adv.php' );
100 113 require_once( 'critcss-inc/admin_settings_explain.php' );
101 114
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 - }
115 + $ao_ccss_key = $this->criticalcss->get_option( 'key' );
116 + $ao_ccss_keyst = $this->criticalcss->get_option( 'keyst' );
117 + $ao_css_defer = $this->criticalcss->get_option( 'css_defer' );
118 + $ao_ccss_deferjquery = $this->criticalcss->get_option( 'deferjquery' );
119 + $ao_ccss_queue = $this->criticalcss->get_option( 'queue' );
120 + $ao_ccss_rules = $this->criticalcss->get_option( 'rules' );
121 + $ao_ccss_servicestatus = $this->criticalcss->get_option( 'servicestatus' );
122 + $ao_ccss_finclude = $this->criticalcss->get_option( 'finclude' );
123 + $ao_ccss_rtimelimit = $this->criticalcss->get_option( 'rtimelimit' );
124 + $ao_ccss_debug = $this->criticalcss->get_option( 'debug' );
125 + $ao_ccss_noptimize = $this->criticalcss->get_option( 'noptimize' );
126 + $ao_css_defer_inline = $this->criticalcss->get_option( 'css_defer_inline' );
127 + $ao_ccss_loggedin = $this->criticalcss->get_option( 'loggedin' );
128 + $ao_ccss_forcepath = $this->criticalcss->get_option( 'forcepath' );
129 + $ao_ccss_domain = $this->criticalcss->get_option( 'domain' );
108 130 ?>
131 + <script>document.title = "Autoptimize: <?php esc_html_e( 'Critical CSS', 'autoptimize' ); ?> " + document.title;</script>
109 132 <div class="wrap">
110 133 <div id="autoptimize_main">
111 134 <div id="ao_title_and_button">
112 - <h1><?php _e( 'Autoptimize Settings', 'autoptimize' ); ?></h1>
135 + <h1><?php apply_filters( 'autoptimize_filter_settings_is_pro', false ) ? esc_html_e( 'Autoptimize Pro Settings', 'autoptimize' ) : esc_html_e( 'Autoptimize Settings', 'autoptimize' ); ?></h1>
113 136 </div>
114 137
115 138 <?php
116 139 // Print AO settings tabs.
@@ -115,41 +138,59 @@
115 138 <?php
116 139 // Print AO settings tabs.
117 140 echo autoptimizeConfig::ao_admin_tabs();
118 141
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>
126 - <?php
127 - _e( 'Could not create the required directory. Make sure the webserver can write to the wp-content directory.', 'autoptimize' );
128 - ?>
129 - </p></div>
130 - <?php
131 - }
142 + if ( autoptimizeUtils::is_local_server() && isset( $ao_ccss_key ) ) { ?>
143 + <div class="notice-warning notice"><p>
144 + <?php
145 + echo esc_html__( 'The Critical CSS service does not work on locally hosted sites or when the server is on a private network.', 'autoptimize' );
146 + ?>
147 + </p></div>
148 + <?php }
149 +
150 + $mkdirresult = $this->criticalcss->create_ao_ccss_dir();
151 +
152 + // Warn if we could not create those files.
153 + if ( ( true !== $mkdirresult ) ) {
154 + ?>
155 + <div class="notice-error notice"><p>
156 + <?php
157 + esc_html_e( 'Could not create the required directory. Make sure the webserver can write to the wp-content/uploads directory.', 'autoptimize' );
158 + ?>
159 + </p></div>
160 + <?php
132 161 }
133 162
134 - // Check for Autoptimize.
135 - if ( ! empty( $ao_ccss_key ) && ! $ao_css_defer ) {
163 + // Check if CSS optimization is on.
164 + if ( 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_css' ) || 'on' !== autoptimizeOptionWrapper::get_option( 'autoptimize_css_defer' ) ) {
136 165 ?>
137 - <div class="notice-error notice"><p>
166 + <div class="notice-info notice"><p>
138 167 <?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' );
168 + esc_html_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' );
140 169 ?>
141 170 </p></div>
142 171 <?php
143 - return;
144 172 }
145 173
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' ) ) {
174 + // Check for "inline & defer CSS" being active in Autoptimize.
175 + if ( ! empty( $ao_ccss_key ) && ! $ao_css_defer && empty( $ao_ccss_keyst ) ) {
176 + // no keystate so likely in activation-process of CCSS, let's enable "inline & defer CSS" immediately to make things easier!
177 + autoptimizeOptionWrapper::update_option( 'autoptimize_css_defer', 'on' );
148 178 ?>
149 - <div data-dismissible="i-know-about-disable-cron-forever" class="notice-warning notice is-dismissible"><p>
179 + <div class="notice-info notice"><p>
180 + <?php
181 + esc_html_e( 'The "Eliminate render-blocking CSS" option was activated to allow critical CSS to be used.', 'autoptimize' );
182 + ?>
183 + </p></div>
184 + <?php
185 + }
186 +
187 + // check if defer jQuery is active and warn if so.
188 + if ( 1 == $ao_ccss_deferjquery && PAnD::is_admin_notice_active( 'i-know-about-defer-inline-forever' ) ) {
189 + ?>
190 + <div data-dismissible="i-know-about-defer-inline-forever" class="notice-warning notice is-dismissible"><p>
150 191 <?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' );
192 + esc_html_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 193 ?>
153 194 </p></div>
154 195 <?php
155 196 }
@@ -196,13 +237,13 @@
196 237 // and set transient.
197 238 set_transient( 'ao_ccss_cronwarning', $_warn_cron, $_transient_multiplier * HOUR_IN_SECONDS );
198 239 }
199 240
200 - if ( ! empty( $ao_ccss_key ) && 'on' == $_warn_cron && PAnD::is_admin_notice_active( 'i-know-about-cron-1' ) ) {
241 + if ( ! empty( $ao_ccss_key ) && 'on' == $_warn_cron && PAnD::is_admin_notice_active( 'i-know-about-cron-30' ) ) {
201 242 ?>
202 - <div data-dismissible="i-know-about-cron-1" class="notice-warning notice is-dismissible"><p>
243 + <div data-dismissible="i-know-about-cron-30" class="notice-warning notice is-dismissible"><p>
203 244 <?php
204 - _e( 'It looks like there might be a problem with WordPress cron (task scheduling). 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' );
245 + _e( 'It looks like there might be a problem with WordPress cron (task scheduling). Have a look at <a href="https://blog.futtta.be/2023/03/17/how-to-fix-autoptimize-critical-css-cron-issue/" 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' );
205 246 ?>
206 247 </p></div>
207 248 <?php
208 249 } elseif ( ! empty( $ao_ccss_key ) && '2' == $ao_ccss_keyst && 'on' != $_warn_cron && ! $this->ao_ccss_has_autorules() ) {
@@ -208,9 +249,11 @@
208 249 } elseif ( ! empty( $ao_ccss_key ) && '2' == $ao_ccss_keyst && 'on' != $_warn_cron && ! $this->ao_ccss_has_autorules() ) {
209 250 ?>
210 251 <div class="notice-success notice"><p>
211 252 <?php
212 - _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' );
253 + esc_html_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' );
254 + echo ' ';
255 + _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 256 ?>
214 257 </p></div>
215 258 <?php
216 259 }
@@ -219,14 +262,27 @@
219 262 if ( ! empty( $ao_ccss_key ) && ! empty( $ao_ccss_servicestatus ) && is_array( $ao_ccss_servicestatus ) && 'down' === $ao_ccss_servicestatus['critcss']['status'] ) {
220 263 ?>
221 264 <div class="notice-warning notice"><p>
222 265 <?php
223 - _e( 'The critical CSS service has been reported to be down. Although no new rules will be created for now, this does not prevent existing rules from being applied.', 'autoptimize' );
266 + esc_html_e( 'The critical CSS service has been reported to be down. Although no new rules will be created for now, this does not prevent existing rules from being applied.', 'autoptimize' );
224 267 ?>
225 268 </p></div>
226 269 <?php
227 270 }
228 271
272 + // warn if too many rules (based on length of ao_ccss_rules option) as that might cause issues at e.g. wpengine
273 + // see https://wpengine.com/support/database-optimization-best-practices/#Autoloaded_Data .
274 + $_raw_rules_length = strlen( get_option( 'autoptimize_ccss_rules', '' ) );
275 + if ( $_raw_rules_length > apply_filters( 'autoptimize_ccss_rules_length_warning', 500000 ) ) {
276 + ?>
277 + <div class="notice-warning notice"><p>
278 + <?php
279 + esc_html_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' );
280 + ?>
281 + </p></div>
282 + <?php
283 + }
284 +
229 285 // Settings Form.
230 286 ?>
231 287 <form id="settings" method="post" action="options.php">
232 288 <?php
@@ -232,9 +288,9 @@
232 288 <?php
233 289 settings_fields( 'ao_ccss_options_group' );
234 290
235 291 // Get API key status.
236 - $key = autoptimizeCriticalCSSCore::ao_ccss_key_status( true );
292 + $key = $this->criticalcss->key_status( true );
237 293
238 294 if ( $this->is_multisite_network_admin() ) {
239 295 ?>
240 296 <ul id="key-panel">
@@ -240,15 +296,15 @@
240 296 <ul id="key-panel">
241 297 <li class="itemDetail">
242 298 <?php
243 299 // translators: the placesholder is for a line of code in wp-config.php.
244 - echo sprintf( __( '<p>Critical CSS settings cannot be set at network level as critical CSS is specific to each sub-site.</p><p>You can however provide the critical CSS API key for use by all sites by adding this your wp-config.php as %s</p>', 'autoptimize' ), '<br/><code>define(\'AUTOPTIMIZE_CRITICALCSS_API_KEY\', \'eyJhbGmorestringsherexHa7MkOQFtDFkZgLmBLe-LpcHx4\');</code>' );
300 + echo sprintf( esc_html__( '<p>Critical CSS settings cannot be set at network level as critical CSS is specific to each sub-site.</p><p>You can however provide the critical CSS API key for use by all sites by adding this your wp-config.php as %s</p>', 'autoptimize' ), '<br/><code>define(\'AUTOPTIMIZE_CRITICALCSS_API_KEY\', \'eyJhbGmorestringsherexHa7MkOQFtDFkZgLmBLe-LpcHx4\');</code>' );
245 301 ?>
246 302 </li>
247 303 </ul>
248 304 <?php
249 305 } else {
250 - if ( 'valid' == $key['status'] ) {
306 + if ( 'valid' == $key['status'] || ( defined( 'AO_PRO_VERSION' ) && has_filter( 'autoptimize_filter_ccss_key' ) ) ) {
251 307 // If key status is valid, render other panels.
252 308 // Render rules section.
253 309 ao_ccss_render_rules();
254 310 // Render queue section.
@@ -255,33 +311,40 @@
255 311 ao_ccss_render_queue();
256 312 // Render advanced panel.
257 313 ao_ccss_render_adv();
258 314 } else {
315 + if ( apply_filters( 'autoptimize_filter_ccss_rules_without_api', true ) ) {
316 + // Render rules section for manual rules.
317 + ao_ccss_render_rules();
318 + } else {
319 + echo "<input class='hidden' name='autoptimize_ccss_rules' value='" . esc_attr( json_encode( $ao_ccss_rules, JSON_FORCE_OBJECT ) ) . "'>";
320 + }
321 +
259 322 // But if key is other than valid, add hidden fields to persist settings when submitting form
260 323 // Show explanation of why and how to get a API key.
261 324 ao_ccss_render_explain();
262 325
263 326 // Get viewport size.
264 - $viewport = autoptimizeCriticalCSSCore::ao_ccss_viewport();
327 + $viewport = $this->criticalcss->viewport();
265 328
266 329 // 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 . '">';
330 + echo "<input class='hidden' name='autoptimize_ccss_queue' value='" . esc_attr( json_encode( $ao_ccss_queue, JSON_FORCE_OBJECT ) ) . "'>";
331 + echo '<input class="hidden" name="autoptimize_ccss_viewport[w]" value="' . esc_attr( $viewport['w'] ) . '">';
332 + echo '<input class="hidden" name="autoptimize_ccss_viewport[h]" value="' . esc_attr( $viewport['h'] ) . '">';
333 + echo '<input class="hidden" name="autoptimize_ccss_finclude" value="' . esc_attr( $ao_ccss_finclude ) . '">';
334 + echo '<input class="hidden" name="autoptimize_ccss_rtimelimit" value="' . esc_attr( $ao_ccss_rtimelimit ) . '">';
335 + echo '<input class="hidden" name="autoptimize_ccss_debug" value="' . esc_attr( $ao_ccss_debug ) . '">';
336 + echo '<input class="hidden" name="autoptimize_ccss_noptimize" value="' . esc_attr( $ao_ccss_noptimize ) . '">';
275 337 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 . '">';
338 + echo '<input class="hidden" name="autoptimize_ccss_loggedin" value="' . esc_attr( $ao_ccss_loggedin ) . '">';
339 + echo '<input class="hidden" name="autoptimize_ccss_forcepath" value="' . esc_attr( $ao_ccss_forcepath ) . '">';
340 + echo '<input class="hidden" name="autoptimize_ccss_domain" id="autoptimize_ccss_domain" value="' . esc_attr( $ao_ccss_domain ) . '">';
278 341 }
279 342 // Render key panel unconditionally.
280 343 ao_ccss_render_key( $ao_ccss_key, $key['status'], $key['stmsg'], $key['msg'], $key['color'] );
281 344 ?>
282 345 <p class="submit left">
283 - <input type="submit" class="button-primary" value="<?php _e( 'Save Changes', 'autoptimize' ); ?>" />
346 + <input type="submit" class="button-primary" value="<?php esc_html_e( 'Save Changes', 'autoptimize' ); ?>" />
284 347 </p>
285 348 <?php
286 349 }
287 350 ?>
@@ -297,11 +360,11 @@
297 360 return String.fromCharCode((letter <= 'Z' ? 90 : 122) >= (letter = letter.charCodeAt(0) + itype) ? letter : letter - 26);
298 361 });
299 362 }
300 363 </script>
301 - <form id="importSettingsForm"<?php if ( $this->is_multisite_network_admin() ) { echo ' class="hidden"'; } ?>>
302 - <span id="exportSettings" class="button-secondary"><?php _e( 'Export Settings', 'autoptimize' ); ?></span>
303 - <input class="button-secondary" id="importSettings" type="button" value="<?php _e( 'Import Settings', 'autoptimize' ); ?>" onclick="upload();return false;" />
364 + <form id="importSettingsForm"<?php if ( $this->is_multisite_network_admin() ) { echo ' class="hidden"'; } // @codingStandardsIgnoreLine ?>>
365 + <span id="exportSettings" class="button-secondary"><?php esc_html_e( 'Export Settings', 'autoptimize' ); ?></span>
366 + <input class="button-secondary" id="importSettings" type="button" value="<?php esc_html_e( 'Import Settings', 'autoptimize' ); ?>" onclick="upload();return false;" />
304 367 <input class="button-secondary" id="settingsfile" name="settingsfile" type="file" />
305 368 </form>
306 369 <div id="importdialog"></div>
307 370 </div><!-- /#autoptimize_main -->
@@ -309,16 +372,18 @@
309 372 <?php
310 373 if ( ! $this->is_multisite_network_admin() ) {
311 374 // Include debug panel if debug mode is enable.
312 375 if ( $ao_ccss_debug ) {
313 - ?>
376 + ?>
314 377 <div id="debug">
315 378 <?php
316 379 // Include debug panel.
317 - include( 'critcss-inc/admin_settings_debug.php' );
380 + if ( true === apply_filters( 'autoptimize_filter_ccss_debug_browser_output', true ) ) {
381 + include( 'critcss-inc/admin_settings_debug.php' );
382 + }
318 383 ?>
319 384 </div><!-- /#debug -->
320 - <?php
385 + <?php
321 386 }
322 387 echo '<script>';
323 388 include( 'critcss-inc/admin_settings_rules.js.php' );
324 389 include( 'critcss-inc/admin_settings_queue.js.php' );
@@ -326,13 +391,13 @@
326 391 echo '</script>';
327 392 }
328 393 }
329 394
330 - public static function ao_ccss_has_autorules() {
395 + public function ao_ccss_has_autorules() {
331 396 static $_has_auto_rules = null;
332 397
333 398 if ( null === $_has_auto_rules ) {
334 - global $ao_ccss_rules;
399 + $ao_ccss_rules = $this->criticalcss->get_option( 'rules' );
335 400 $_has_auto_rules = false;
336 401 if ( ! empty( $ao_ccss_rules ) ) {
337 402 foreach ( array( 'types', 'paths' ) as $_typat ) {
338 403 foreach ( $ao_ccss_rules[ $_typat ] as $rule ) {
@@ -351,9 +416,9 @@
351 416
352 417 return $_has_auto_rules;
353 418 }
354 419
355 - public function is_multisite_network_admin() {
420 + public static function is_multisite_network_admin() {
356 421 static $_multisite_network_admin = null;
357 422
358 423 if ( null === $_multisite_network_admin ) {
359 424 if ( is_multisite() && is_network_admin() ) {