PluginProbe
Autoptimize / 2.5.1
Autoptimize v2.5.1
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
autoptimize / classes / autoptimizeConfig.php

autoptimizeConfig.php in Autoptimize 2.5.1, at classes/autoptimizeConfig.php

897 lines 40.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
3
4 class autoptimizeConfig
5 {
6 private $config = null;
7 static private $instance = null;
8
9 private $settings_screen_do_remote_http = true;
10
11 /**
12 * Singleton.
13 */
14 private function __construct()
15 {
16 if ( is_admin() ) {
17 // Add the admin page and settings.
18 add_action( 'admin_menu', array( $this, 'addmenu' ) );
19 add_action( 'admin_init', array( $this, 'registersettings' ) );
20
21 // Set meta info.
22 if ( function_exists( 'plugin_row_meta' ) ) {
23 // 2.8 and higher.
24 add_filter( 'plugin_row_meta', array( $this, 'setmeta' ), 10, 2 );
25 } elseif ( function_exists( 'post_class' ) ) {
26 // 2.7 and lower.
27 $plugin = plugin_basename( AUTOPTIMIZE_PLUGIN_DIR . 'autoptimize.php' );
28 add_filter( 'plugin_action_links_' . $plugin, array( $this, 'setmeta' ) );
29 }
30
31 // Clean cache?
32 if ( get_option( 'autoptimize_cache_clean' ) ) {
33 autoptimizeCache::clearall();
34 update_option( 'autoptimize_cache_clean', 0 );
35 }
36
37 $this->settings_screen_do_remote_http = apply_filters( 'autoptimize_settingsscreen_remotehttp', $this->settings_screen_do_remote_http );
38 }
39
40 // Adds the Autoptimize Toolbar to the Admin bar.
41 // (we load outside the is_admin check so it's also displayed on the frontend toolbar).
42 $toolbar = new autoptimizeToolbar();
43 }
44
45 /**
46 * @return autoptimizeConfig
47 */
48 static public function instance()
49 {
50 // Only one instance.
51 if ( null === self::$instance ) {
52 self::$instance = new autoptimizeConfig();
53 }
54
55 return self::$instance;
56 }
57
58 public function show()
59 {
60 $conf = self::instance();
61 ?>
62 <style>
63 /* title and button */
64 #ao_title_and_button:after {content:''; display:block; clear:both;}
65 #ao_adv_button{float:right;}
66 #ao_hide_adv:before, #ao_show_adv:before {
67 display: inline-block;
68 float: left;
69 height: 20px;
70 width: 35px;
71 background: none;
72 color: #b4b9be;
73 font: normal 20px/26px dashicons;
74 letter-spacing: -4px;
75 text-align: left;
76 speak: none;
77 -webkit-font-smoothing: antialiased;
78 -moz-osx-font-smoothing: grayscale;
79 }
80 #ao_hide_adv:before {
81 content: "\f108 \f142";
82 }
83 #ao_show_adv:before {
84 content: "\f108 \f140";
85 }
86
87 /* animate "show adv" button */
88 #ao_show_adv { animation: watchmenow 3s linear 5s 10; }
89 #ao_show_adv:hover { animation: none; }
90 @keyframes watchmenow {
91 0% { box-shadow: unset; }
92 100% { box-shadow: 0px 0px 20px yellow; }
93 }
94
95 /* form */
96 .itemDetail {
97 background: #fff;
98 border: 1px solid #ccc;
99 padding: 15px;
100 margin: 15px 10px 10px 0;
101 }
102 .itemTitle {
103 margin-top: 0;
104 }
105
106 input[type=url]:invalid {color: red; border-color:red;} .form-table th{font-weight:normal;}
107 #autoptimize_main .cb_label {display: block; padding-left: 25px; text-indent: -25px;}
108
109 /* rss block */
110 #futtta_feed ul{list-style:outside;}
111 #futtta_feed {font-size:medium; margin:0px 20px;}
112
113 /* banner + unslider */
114 .autoptimize_banner {
115 margin: 0 38px;
116 padding-bottom: 5px;
117 }
118 .autoptimize_banner ul li {
119 font-size:medium;
120 text-align:center;
121 }
122 .unslider {
123 position:relative;
124 }
125 .unslider-arrow {
126 display: block;
127 left: unset;
128 margin-top: -35px;
129 margin-left: 7px;
130 margin-right: 7px;
131 border-radius: 32px;
132 background: rgba(0, 0, 0, 0.10) no-repeat 50% 50%;
133 color: rgba(255, 255, 255, 0.8);
134 font: normal 20px/1 dashicons;
135 speak: none;
136 padding: 3px 2px 3px 4px;
137 -webkit-font-smoothing: antialiased;
138 -moz-osx-font-smoothing: grayscale;
139 }
140 .unslider-arrow:hover {
141 background-color: rgba(0, 0, 0, 0.20);
142 color: #FFF;
143 }
144 .unslider-arrow.prev {
145 padding: 3px 4px 3px 2px;
146 }
147 .unslider-arrow.next {
148 right: 0px;
149 }
150 .unslider-arrow.prev::before {
151 content: "\f341";
152 }
153 .unslider-arrow.next::before {
154 content: "\f345";
155 }
156
157 /* responsive stuff: hide admin-feed on smaller screens */
158 @media (min-width: 961px) {
159 #autoptimize_main {float:left;width:69%;}
160 #autoptimize_admin_feed{float:right;width:30%;display:block !important;}
161 }
162 @media (max-width: 960px) {
163 #autoptimize_main {width:100%;}
164 #autoptimize_admin_feed {width:0%;display:none !important;}
165 }
166 @media (max-width: 782px) {
167 #ao_hide_adv span, #ao_show_adv span {display: none;}
168 #ao_hide_adv,#ao_show_adv {height: 34px;padding: 4px 12px 8px 8px;}
169 #ao_hide_adv:before,#ao_show_adv:before {font-size: 25px;}
170 #autoptimize_main input[type="checkbox"] {margin-left: 10px;}
171 #autoptimize_main .cb_label {display: block; padding-left: 45px; text-indent: -45px;}
172 }
173 </style>
174
175 <div class="wrap">
176
177 <?php if ( version_compare( PHP_VERSION, '5.3.0' ) < 0 ) { ?>
178 <div class="notice-error notice"><?php echo '<p>' . sprintf( __( '<strong>You are using a very old version of PHP</strong> (5.2.x or older) which has <a href=%s>serious security and performance issues</a>. Support for PHP 5.5 and below will be removed in one of the next AO released, please ask your hoster to provide you with an upgrade path to 7.x.', 'autoptimize' ), '"http://blog.futtta.be/2016/03/15/why-would-you-still-be-on-php-5-2/" target="_blank"' ) . '</p>'; ?></div>
179 <?php } ?>
180
181 <?php if ( defined( 'AUTOPTIMIZE_LEGACY_MINIFIERS' ) ) { ?>
182 <div class="notice-error notice"><p>
183 <?php _e( "You are using the (no longer supported) AUTOPTIMIZE_LEGACY_MINIFIERS constant. Ensure your site is working properly and remove the constant, it doesn't do anything any more.", 'autoptimize' ); ?>
184 </p></div>
185 <?php } ?>
186
187 <div id="autoptimize_main">
188 <div id="ao_title_and_button">
189 <h1 id="ao_title"><?php _e( 'Autoptimize Settings', 'autoptimize' ); ?>
190 <span id="ao_adv_button">
191 <?php if ( get_option( 'autoptimize_show_adv', '1' ) == '1' ) { ?>
192 <a href="javascript:void(0);" id="ao_show_adv" class="button" style="display:none;"><span><?php _e("Show advanced settings","autoptimize") ?></span></a>
193 <a href="javascript:void(0);" id="ao_hide_adv" class="button"><span><?php _e("Hide advanced settings","autoptimize") ?></span></a>
194 <style>tr.ao_adv{display:table-row;} li.ao_adv{display:list-item;}</style>
195 <?php $hiddenClass = ''; ?>
196 <?php } else { ?>
197 <a href="javascript:void(0);" id="ao_show_adv" class="button"><span><?php _e("Show advanced settings","autoptimize") ?></span></a>
198 <a href="javascript:void(0);" id="ao_hide_adv" class="button" style="display:none;"><span><?php _e("Hide advanced settings","autoptimize") ?></span></a>
199 <?php $hiddenClass = 'hidden '; ?>
200 <?php } ?>
201 </span>
202 </h1>
203 </div>
204
205 <?php echo $this->ao_admin_tabs(); ?>
206
207 <form method="post" action="options.php">
208 <?php settings_fields( 'autoptimize' ); ?>
209
210 <ul>
211
212 <li class="itemDetail">
213 <h2 class="itemTitle"><?php _e('JavaScript Options','autoptimize'); ?></h2>
214 <table class="form-table">
215 <tr valign="top">
216 <th scope="row"><?php _e('Optimize JavaScript Code?','autoptimize'); ?></th>
217 <td><input type="checkbox" id="autoptimize_js" name="autoptimize_js" <?php echo get_option('autoptimize_js')?'checked="checked" ':''; ?>/></td>
218 </tr>
219 <tr valign="top" class="<?php echo $hiddenClass;?>js_sub ao_adv">
220 <th scope="row"><?php _e( 'Aggregate JS-files?', 'autoptimize' ); ?></th>
221 <td><label class="cb_label"><input type="checkbox" id="autoptimize_js_aggregate" name="autoptimize_js_aggregate" <?php echo $conf->get( 'autoptimize_js_aggregate' ) ? 'checked="checked" ':''; ?>/>
222 <?php _e( 'Aggregate all linked JS-files to have them loaded non-render blocking? If this option is off, the individual JS-files will remain in place but will be minified.', 'autoptimize' ); ?></label></td>
223 </tr>
224 <tr valign="top" class="<?php echo $hiddenClass;?>js_sub ao_adv js_aggregate">
225 <th scope="row"><?php _e('Also aggregate inline JS?','autoptimize'); ?></th>
226 <td><label class="cb_label"><input type="checkbox" name="autoptimize_js_include_inline" <?php echo get_option('autoptimize_js_include_inline')?'checked="checked" ':''; ?>/>
227 <?php _e('Let Autoptimize also extract JS from the HTML. <strong>Warning</strong>: this can make Autoptimize\'s cache size grow quickly, so only enable this if you know what you\'re doing.','autoptimize'); ?></label></td>
228 </tr>
229 <tr valign="top" class="<?php echo $hiddenClass;?>js_sub ao_adv js_aggregate">
230 <th scope="row"><?php _e('Force JavaScript in &lt;head&gt;?','autoptimize'); ?></th>
231 <td><label class="cb_label"><input type="checkbox" name="autoptimize_js_forcehead" <?php echo get_option('autoptimize_js_forcehead')?'checked="checked" ':''; ?>/>
232 <?php _e('Load JavaScript early, this can potentially fix some JS-errors, but makes the JS render blocking.','autoptimize'); ?></label></td>
233 </tr>
234 <?php if (get_option('autoptimize_js_justhead')) { ?>
235 <tr valign="top" class="<?php echo $hiddenClass;?>js_sub ao_adv js_aggregate">
236 <th scope="row"><?php _e('Look for scripts only in &lt;head&gt;?','autoptimize'); echo ' <i>'. __('(deprecated)','autoptimize') . '</i>'; ?></th>
237 <td><label class="cb_label"><input type="checkbox" name="autoptimize_js_justhead" <?php echo get_option('autoptimize_js_justhead')?'checked="checked" ':''; ?>/>
238 <?php _e('Mostly useful in combination with previous option when using jQuery-based templates, but might help keeping cache size under control.','autoptimize'); ?></label></td>
239 </tr>
240 <?php } ?>
241 <tr valign="top" class="<?php echo $hiddenClass;?>js_sub ao_adv">
242 <th scope="row"><?php _e('Exclude scripts from Autoptimize:','autoptimize'); ?></th>
243 <td><label><input type="text" style="width:100%;" name="autoptimize_js_exclude" value="<?php echo get_option('autoptimize_js_exclude',"wp-includes/js/dist/, wp-includes/js/tinymce/, js/jquery/jquery.js"); ?>"/><br />
244 <?php _e('A comma-separated list of scripts you want to exclude from being optimized, for example \'whatever.js, another.js\' (without the quotes) to exclude those scripts from being aggregated by Autoptimize.','autoptimize'); ?></label></td>
245 </tr>
246 <tr valign="top" class="<?php echo $hiddenClass;?>js_sub ao_adv js_aggregate">
247 <th scope="row"><?php _e('Add try-catch wrapping?','autoptimize'); ?></th>
248 <td><label class="cb_label"><input type="checkbox" name="autoptimize_js_trycatch" <?php echo get_option('autoptimize_js_trycatch')?'checked="checked" ':''; ?>/>
249 <?php _e('If your scripts break because of a JS-error, you might want to try this.','autoptimize'); ?></label></td>
250 </tr>
251 </table>
252 </li>
253
254 <li class="itemDetail">
255 <h2 class="itemTitle"><?php _e('CSS Options','autoptimize'); ?></h2>
256 <table class="form-table">
257 <tr valign="top">
258 <th scope="row"><?php _e('Optimize CSS Code?','autoptimize'); ?></th>
259 <td><input type="checkbox" id="autoptimize_css" name="autoptimize_css" <?php echo get_option('autoptimize_css')?'checked="checked" ':''; ?>/></td>
260 </tr>
261 <tr class="<?php echo $hiddenClass;?>css_sub ao_adv" valign="top">
262 <th scope="row"><?php _e( 'Aggregate CSS-files?', 'autoptimize' ); ?></th>
263 <td><label class="cb_label"><input type="checkbox" id="autoptimize_css_aggregate" name="autoptimize_css_aggregate" <?php echo $conf->get( 'autoptimize_css_aggregate' ) ? 'checked="checked" ' : ''; ?>/>
264 <?php _e('Aggregate all linked CSS-files? If this option is off, the individual CSS-files will remain in place but will be minified.', 'autoptimize' ); ?></label></td>
265 </tr>
266 <tr valign="top" class="<?php echo $hiddenClass;?>css_sub ao_adv css_aggregate">
267 <th scope="row"><?php _e('Also aggregate inline CSS?','autoptimize'); ?></th>
268 <td><label class="cb_label"><input type="checkbox" name="autoptimize_css_include_inline" <?php echo get_option('autoptimize_css_include_inline','1')?'checked="checked" ':''; ?>/>
269 <?php _e('Check this option for Autoptimize to also aggregate CSS in the HTML.','autoptimize'); ?></label></td>
270 </tr>
271 <tr class="<?php echo $hiddenClass;?>css_sub ao_adv css_aggregate" valign="top">
272 <th scope="row"><?php _e('Generate data: URIs for images?','autoptimize'); ?></th>
273 <td><label class="cb_label"><input type="checkbox" name="autoptimize_css_datauris" <?php echo get_option('autoptimize_css_datauris')?'checked="checked" ':''; ?>/>
274 <?php _e('Enable this to include small background-images in the CSS itself instead of as separate downloads.','autoptimize'); ?></label></td>
275 </tr>
276 <?php if (get_option('autoptimize_css_justhead')) { ?>
277 <tr valign="top" class="<?php echo $hiddenClass;?>css_sub ao_adv css_aggregate">
278 <th scope="row"><?php _e('Look for styles only in &lt;head&gt;?','autoptimize'); echo ' <i>'. __('(deprecated)','autoptimize') . '</i>'; ?></th>
279 <td><label class="cb_label"><input type="checkbox" name="autoptimize_css_justhead" <?php echo get_option('autoptimize_css_justhead')?'checked="checked" ':''; ?>/>
280 <?php _e('Don\'t autoptimize CSS outside the head-section. If the cache gets big, you might want to enable this.','autoptimize'); ?></label></td>
281 </tr>
282 <?php } ?>
283 <tr valign="top" class="<?php echo $hiddenClass;?>css_sub ao_adv">
284 <th scope="row"><?php _e('Inline and Defer CSS?','autoptimize'); ?></th>
285 <td><label class="cb_label"><input type="checkbox" name="autoptimize_css_defer" id="autoptimize_css_defer" <?php echo get_option('autoptimize_css_defer')?'checked="checked" ':''; ?>/>
286 <?php
287 _e( 'Inline "above the fold CSS" while loading the main autoptimized CSS only after page load. <a href="http://wordpress.org/plugins/autoptimize/faq/" target="_blank">Check the FAQ</a> for more info.', 'autoptimize' );
288 if ( function_exists( 'is_plugin_active' ) && ! is_plugin_active( 'autoptimize-criticalcss/ao_criticss_aas.php' ) ) {
289 echo ' ';
290 $critcss_install_url = network_admin_url() . 'plugin-install.php?s=autoptimize+criticalcss&tab=search&type=term';
291 echo sprintf( __( 'This can be fully automated for different types of pages with the %s.', 'autoptimize' ), '<a href="'.$critcss_install_url.'">Autoptimize CriticalCSS Power-Up</a>' );
292 }
293 ?>
294 </label></td>
295 </tr>
296 <tr valign="top" class="<?php echo $hiddenClass;?>css_sub ao_adv" id="autoptimize_css_defer_inline">
297 <th scope="row"></th>
298 <td><label><textarea rows="10" cols="10" style="width:100%;" placeholder="<?php _e('Paste the above the fold CSS here.','autoptimize'); ?>" name="autoptimize_css_defer_inline"><?php echo get_option('autoptimize_css_defer_inline'); ?></textarea></label></td>
299 </tr>
300 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv css_sub css_aggregate">
301 <th scope="row"><?php _e('Inline all CSS?','autoptimize'); ?></th>
302 <td><label class="cb_label"><input type="checkbox" id="autoptimize_css_inline" name="autoptimize_css_inline" <?php echo get_option('autoptimize_css_inline')?'checked="checked" ':''; ?>/>
303 <?php _e('Inlining all CSS can improve performance for sites with a low pageviews/ visitor-rate, but may slow down performance otherwise.','autoptimize'); ?></label></td>
304 </tr>
305 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv css_sub">
306 <th scope="row"><?php _e('Exclude CSS from Autoptimize:','autoptimize'); ?></th>
307 <td><label><input type="text" style="width:100%;" name="autoptimize_css_exclude" value="<?php echo get_option('autoptimize_css_exclude','wp-content/cache/, wp-content/uploads/, admin-bar.min.css, dashicons.min.css'); ?>"/><br />
308 <?php _e('A comma-separated list of CSS you want to exclude from being optimized.','autoptimize'); ?></label></td>
309 </tr>
310 </table>
311 </li>
312
313 <li class="itemDetail">
314 <h2 class="itemTitle"><?php _e('HTML Options','autoptimize'); ?></h2>
315 <table class="form-table">
316 <tr valign="top">
317 <th scope="row"><?php _e('Optimize HTML Code?','autoptimize'); ?></th>
318 <td><input type="checkbox" id="autoptimize_html" name="autoptimize_html" <?php echo get_option('autoptimize_html')?'checked="checked" ':''; ?>/></td>
319 </tr>
320 <tr class="<?php echo $hiddenClass;?>html_sub ao_adv" valign="top">
321 <th scope="row"><?php _e('Keep HTML comments?','autoptimize'); ?></th>
322 <td><label class="cb_label"><input type="checkbox" name="autoptimize_html_keepcomments" <?php echo get_option('autoptimize_html_keepcomments')?'checked="checked" ':''; ?>/>
323 <?php _e('Enable this if you want HTML comments to remain in the page.','autoptimize'); ?></label></td>
324 </tr>
325 </table>
326 </li>
327
328 <li class="itemDetail">
329 <h2 class="itemTitle"><?php _e('CDN Options','autoptimize'); ?></h2>
330 <table class="form-table">
331 <tr valign="top">
332 <th scope="row"><?php _e('CDN Base URL','autoptimize'); ?></th>
333 <td><label><input id="cdn_url" type="text" name="autoptimize_cdn_url" pattern="^(https?:)?\/\/([\da-z\.-]+)\.([\da-z\.]{2,6})([\/\w \.-]*)*(:\d{2,5})?\/?$" style="width:100%" value="<?php echo esc_url(get_option('autoptimize_cdn_url',''),array("http","https")); ?>" /><br />
334 <?php _e('Enter your CDN root URL to enable CDN for Autoptimized files. The URL can be http, https or protocol-relative (e.g. <code>//cdn.example.com/</code>). This is not needed for Cloudflare.','autoptimize'); ?></label></td>
335 </tr>
336 </table>
337 </li>
338
339 <li class="<?php echo $hiddenClass;?>itemDetail ao_adv">
340 <h2 class="itemTitle"><?php _e('Cache Info','autoptimize'); ?></h2>
341 <table class="form-table" >
342 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv">
343 <th scope="row"><?php _e('Cache folder','autoptimize'); ?></th>
344 <td><?php echo htmlentities(AUTOPTIMIZE_CACHE_DIR); ?></td>
345 </tr>
346 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv">
347 <th scope="row"><?php _e('Can we write?','autoptimize'); ?></th>
348 <td><?php echo (autoptimizeCache::cacheavail() ? __('Yes','autoptimize') : __('No','autoptimize')); ?></td>
349 </tr>
350 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv">
351 <th scope="row"><?php _e('Cached styles and scripts','autoptimize'); ?></th>
352 <td><?php
353 $AOstatArr = autoptimizeCache::stats();
354 if ( ! empty( $AOstatArr ) && is_array( $AOstatArr ) ) {
355 $AOcacheSize = size_format( $AOstatArr[1], 2 );
356 $details = '';
357 if ( $AOcacheSize > 0 ) {
358 $details = ', ~' . $AOcacheSize . ' total';
359 }
360 printf( __( '%1$s files, totalling %2$s Kbytes (calculated at %3$s)', 'autoptimize' ), $AOstatArr[0], $AOcacheSize, date( 'H:i e', $AOstatArr[2] ) );
361 }
362 ?></td>
363 </tr>
364 </table>
365 </li>
366
367 <li class="<?php echo $hiddenClass;?>itemDetail ao_adv">
368 <h2 class="itemTitle"><?php _e('Misc Options','autoptimize'); ?></h2>
369 <table class="form-table">
370 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv">
371 <th scope="row"><?php _e('Save aggregated script/css as static files?','autoptimize'); ?></th>
372 <td><label class="cb_label"><input type="checkbox" name="autoptimize_cache_nogzip" <?php echo get_option('autoptimize_cache_nogzip','1')?'checked="checked" ':''; ?>/>
373 <?php _e('By default files saved are static css/js, uncheck this option if your webserver doesn\'t properly handle the compression and expiry.','autoptimize'); ?></label></td>
374 </tr>
375 <?php
376 $_min_excl_class = 'ao_adv';
377 if ( !$conf->get( 'autoptimize_css_aggregate' ) && !$conf->get( 'autoptimize_js_aggregate' ) ) {
378 $_min_excl_class = ' hidden';
379 }
380 ?>
381 <tr valign="top" id="min_excl_row" class="<?php echo $hiddenClass.$_min_excl_class; ?>">
382 <th scope="row"><?php _e('Minify excluded CSS and JS files?','autoptimize'); ?></th>
383 <td><label class="cb_label"><input type="checkbox" name="autoptimize_minify_excluded" <?php echo get_option('autoptimize_minify_excluded','1')?'checked="checked" ':''; ?>/>
384 <?php _e('When aggregating JS or CSS, excluded files that are not minified (based on filename) are by default minified by Autoptimize despite being excluded. Uncheck this option if anything breaks despite excluding.','autoptimize'); ?></label></td>
385 </tr>
386 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv">
387 <th scope="row"><?php _e('Also optimize for logged in users?','autoptimize'); ?></th>
388 <td><label class="cb_label"><input type="checkbox" name="autoptimize_optimize_logged" <?php echo get_option('autoptimize_optimize_logged','1')?'checked="checked" ':''; ?>/>
389 <?php _e('By default Autoptimize is also active for logged on users, uncheck not to optimize when logged in e.g. to use a pagebuilder.','autoptimize'); ?></label></td>
390 </tr>
391 <?php
392 if ( function_exists("is_checkout") || function_exists("is_cart") || function_exists("edd_is_checkout") || function_exists("wpsc_is_cart") || function_exists("wpsc_is_checkout") ) {
393 ?>
394 <tr valign="top" class="<?php echo $hiddenClass;?>ao_adv">
395 <th scope="row"><?php _e('Also optimize shop cart/ checkout?','autoptimize'); ?></th>
396 <td><label class="cb_label"><input type="checkbox" name="autoptimize_optimize_checkout" <?php echo get_option('autoptimize_optimize_checkout','1')?'checked="checked" ':''; ?>/>
397 <?php _e('By default Autoptimize is also active on your shop\'s cart/ checkout, uncheck not to optimize those.','autoptimize'); ?></label>
398 </td>
399 </tr>
400 <?php } ?>
401 </table>
402 </li>
403
404 </ul>
405
406 <input type="hidden" id="autoptimize_show_adv" name="autoptimize_show_adv" value="<?php echo get_option('autoptimize_show_adv','1'); ?>">
407
408 <p class="submit">
409 <input type="submit" class="button-secondary" value="<?php _e('Save Changes','autoptimize') ?>" />
410 <input type="submit" class="button-primary" name="autoptimize_cache_clean" value="<?php _e('Save Changes and Empty Cache','autoptimize') ?>" />
411 </p>
412
413 </form>
414 </div>
415 <div id="autoptimize_admin_feed" class="hidden">
416 <div class="autoptimize_banner hidden">
417 <ul>
418 <?php
419 if ( $this->settings_screen_do_remote_http ) {
420 $AO_banner = get_transient( 'autoptimize_banner' );
421 if ( empty( $AO_banner ) ) {
422 $banner_resp = wp_remote_get( 'https://misc.optimizingmatters.com/autoptimize_news.html?ao_ver='.AUTOPTIMIZE_PLUGIN_VERSION );
423 if ( ! is_wp_error( $banner_resp ) ) {
424 if ( '200' == wp_remote_retrieve_response_code( $banner_resp ) ) {
425 $AO_banner = wp_kses_post( wp_remote_retrieve_body( $banner_resp ) );
426 set_transient('autoptimize_banner', $AO_banner, DAY_IN_SECONDS);
427 }
428 }
429 }
430 echo $AO_banner;
431 }
432 ?>
433 <li><?php _e("Need help? <a href='https://wordpress.org/plugins/autoptimize/faq/'>Check out the FAQ here</a>.","autoptimize"); ?></li>
434 <li><?php _e("Happy with Autoptimize?","autoptimize"); ?><br /><a href="<?php echo network_admin_url(); ?>plugin-install.php?tab=search&type=author&s=optimizingmatters"><?php _e("Try my other plugins!","autoptimize"); ?></a></li>
435 </ul>
436 </div>
437 <div style="margin-left:10px;margin-top:-5px;">
438 <h2>
439 <?php _e("futtta about","autoptimize") ?>
440 <select id="feed_dropdown" >
441 <option value="1"><?php _e("Autoptimize","autoptimize") ?></option>
442 <option value="2"><?php _e("WordPress","autoptimize") ?></option>
443 <option value="3"><?php _e("Web Technology","autoptimize") ?></option>
444 </select>
445 </h2>
446 <div id="futtta_feed">
447 <div id="autoptimizefeed">
448 <?php $this->getFutttaFeeds("http://feeds.feedburner.com/futtta_autoptimize"); ?>
449 </div>
450 <div id="wordpressfeed">
451 <?php $this->getFutttaFeeds("http://feeds.feedburner.com/futtta_wordpress"); ?>
452 </div>
453 <div id="webtechfeed">
454 <?php $this->getFutttaFeeds("http://feeds.feedburner.com/futtta_webtech"); ?>
455 </div>
456 </div>
457 </div>
458 <div style="float:right;margin:50px 15px;"><a href="http://blog.futtta.be/2013/10/21/do-not-donate-to-me/" target="_blank"><img width="100px" height="85px" src="<?php echo plugins_url().'/'.plugin_basename(dirname(__FILE__)).'/external/do_not_donate_smallest.png'; ?>" title="<?php _e("Do not donate for this plugin!","autoptimize"); ?>"></a></div>
459 </div>
460
461 <script type="text/javascript">
462 var feed = new Array;
463 feed[1]="autoptimizefeed";
464 feed[2]="wordpressfeed";
465 feed[3]="webtechfeed";
466 cookiename="autoptimize_feed";
467
468 jQuery(document).ready(function() {
469 check_ini_state();
470
471 jQuery('#autoptimize_admin_feed').fadeTo("slow",1).show();
472 jQuery('.autoptimize_banner').unslider({autoplay:true, delay:3500, infinite: false, arrows:{prev:'<a class="unslider-arrow prev"></a>', next:'<a class="unslider-arrow next"></a>'}}).fadeTo("slow",1).show();
473
474 jQuery( "#feed_dropdown" ).change(function() {
475 jQuery("#futtta_feed").fadeTo(0,0);
476 jQuery("#futtta_feed").fadeTo("slow",1);
477 });
478
479 jQuery( "#ao_show_adv" ).click(function() {
480 jQuery( "#ao_show_adv" ).hide();
481 jQuery( "#ao_hide_adv" ).show();
482 jQuery( ".ao_adv" ).removeClass("hidden");
483 jQuery( ".ao_adv" ).show("slow");
484 if (jQuery("#autoptimize_css").attr('checked')) {
485 jQuery(".css_sub:visible").fadeTo("fast",1);
486 if (!jQuery("#autoptimize_css_defer").attr('checked')) {
487 jQuery("#autoptimize_css_defer_inline").hide();
488 }
489 }
490 if (jQuery("#autoptimize_js").attr('checked')) {
491 jQuery(".js_sub:visible").fadeTo("fast",1);
492 }
493 check_ini_state();
494 jQuery( "input#autoptimize_show_adv" ).val("1");
495 });
496
497 jQuery( "#ao_hide_adv" ).click(function() {
498 jQuery( "#ao_hide_adv" ).hide();
499 jQuery( "#ao_show_adv" ).show();
500 jQuery( ".ao_adv" ).hide("slow");
501 jQuery( ".ao_adv" ).addClass("hidden");
502 if (!jQuery("#autoptimize_css").attr('checked')) {
503 jQuery(".css_sub:visible").fadeTo("fast",.33);
504 }
505 if (!jQuery("#autoptimize_js").attr('checked')) {
506 jQuery(".js_sub:visible").fadeTo("fast",.33);
507 }
508 check_ini_state();
509 jQuery( "input#autoptimize_show_adv" ).val("0");
510 });
511
512 jQuery( "#autoptimize_html" ).change(function() {
513 if (this.checked) {
514 jQuery(".html_sub:visible").fadeTo("fast",1);
515 } else {
516 jQuery(".html_sub:visible").fadeTo("fast",.33);
517 }
518 });
519
520 jQuery( "#autoptimize_js" ).change(function() {
521 if (this.checked) {
522 jQuery(".js_sub:visible").fadeTo("fast",1);
523 } else {
524 jQuery(".js_sub:visible").fadeTo("fast",.33);
525 }
526 });
527
528 jQuery( "#autoptimize_js_aggregate" ).change(function() {
529 if (this.checked && jQuery("#autoptimize_js").attr('checked')) {
530 jQuery(".js_aggregate:visible").fadeTo("fast",1);
531 jQuery( "#min_excl_row" ).show();
532 } else {
533 jQuery(".js_aggregate:visible").fadeTo("fast",.33);
534 if ( jQuery( "#autoptimize_css_aggregate" ).prop('checked') == false ) {
535 jQuery( "#min_excl_row" ).hide();
536 }
537 }
538 });
539
540 jQuery( "#autoptimize_css" ).change(function() {
541 if (this.checked) {
542 jQuery(".css_sub:visible").fadeTo("fast",1);
543 } else {
544 jQuery(".css_sub:visible").fadeTo("fast",.33);
545 }
546 });
547
548 jQuery( "#autoptimize_css_aggregate" ).change(function() {
549 if (this.checked && jQuery("#autoptimize_css").attr('checked')) {
550 jQuery(".css_aggregate:visible").fadeTo("fast",1);
551 jQuery( "#min_excl_row" ).show();
552 } else {
553 jQuery(".css_aggregate:visible").fadeTo("fast",.33);
554 if ( jQuery( "#autoptimize_js_aggregate" ).prop('checked') == false ) {
555 jQuery( "#min_excl_row" ).hide();
556 }
557 }
558 });
559
560 jQuery( "#autoptimize_css_inline" ).change(function() {
561 if (this.checked) {
562 jQuery("#autoptimize_css_defer").prop("checked",false);
563 jQuery("#autoptimize_css_defer_inline").hide("slow");
564 }
565 });
566
567 jQuery( "#autoptimize_css_defer" ).change(function() {
568 if (this.checked) {
569 jQuery("#autoptimize_css_inline").prop("checked",false);
570 jQuery("#autoptimize_css_defer_inline").show("slow");
571 } else {
572 jQuery("#autoptimize_css_defer_inline").hide("slow");
573 }
574 });
575
576 jQuery("#feed_dropdown").change(function() { show_feed(jQuery("#feed_dropdown").val()) });
577 feedid=jQuery.cookie(cookiename);
578 if(typeof(feedid) !== "string") feedid=1;
579 show_feed(feedid);
580 })
581
582 // validate cdn_url.
583 var cdn_url=document.getElementById("cdn_url");
584 cdn_url_baseCSS=cdn_url.style.cssText;
585 if ("validity" in cdn_url) {
586 jQuery("#cdn_url").focusout(function (event) {
587 if (cdn_url.validity.valid) {
588 cdn_url.style.cssText=cdn_url_baseCSS;
589 } else {
590 cdn_url.style.cssText=cdn_url_baseCSS+"border:1px solid #f00;color:#f00;box-shadow: 0 0 2px #f00;";
591 }});
592 }
593
594 function check_ini_state() {
595 if (!jQuery("#autoptimize_css_defer").attr('checked')) {
596 jQuery("#autoptimize_css_defer_inline").hide();
597 }
598 if (!jQuery("#autoptimize_html").attr('checked')) {
599 jQuery(".html_sub:visible").fadeTo('fast',.33);
600 }
601 if (!jQuery("#autoptimize_css").attr('checked')) {
602 jQuery(".css_sub:visible").fadeTo('fast',.33);
603 }
604 if (!jQuery("#autoptimize_css_aggregate").attr('checked')) {
605 jQuery(".css_aggregate:visible").fadeTo('fast',.33);
606 }
607 if (!jQuery("#autoptimize_js").attr('checked')) {
608 jQuery(".js_sub:visible").fadeTo('fast',.33);
609 }
610 if (!jQuery("#autoptimize_js_aggregate").attr('checked')) {
611 jQuery(".js_aggregate:visible").fadeTo('fast',.33);
612 }
613 }
614
615 function show_feed(id) {
616 jQuery('#futtta_feed').children().hide();
617 jQuery('#'+feed[id]).show();
618 jQuery("#feed_dropdown").val(id);
619 jQuery.cookie(cookiename,id,{ expires: 365 });
620 }
621 </script>
622 </div>
623
624 <?php
625 }
626
627 public function addmenu()
628 {
629 $hook = add_options_page( __( 'Autoptimize Options', 'autoptimize' ), 'Autoptimize', 'manage_options', 'autoptimize', array( $this, 'show' ) );
630 add_action( 'admin_print_scripts-' . $hook, array( $this, 'autoptimize_admin_scripts' ) );
631 add_action( 'admin_print_styles-' . $hook, array( $this, 'autoptimize_admin_styles' ) );
632 }
633
634 public function autoptimize_admin_scripts()
635 {
636 wp_enqueue_script( 'jqcookie', plugins_url( '/external/js/jquery.cookie.min.js', __FILE__ ), array( 'jquery' ), null, true );
637 wp_enqueue_script( 'unslider', plugins_url( '/external/js/unslider-min.js', __FILE__ ), array( 'jquery' ), null, true );
638 }
639
640 public function autoptimize_admin_styles()
641 {
642 wp_enqueue_style( 'unslider', plugins_url( '/external/js/unslider.css', __FILE__ ) );
643 wp_enqueue_style( 'unslider-dots', plugins_url( '/external/js/unslider-dots.css', __FILE__ ) );
644 }
645
646 public function registersettings() {
647 register_setting( 'autoptimize', 'autoptimize_html' );
648 register_setting( 'autoptimize', 'autoptimize_html_keepcomments' );
649 register_setting( 'autoptimize', 'autoptimize_js' );
650 register_setting( 'autoptimize', 'autoptimize_js_aggregate' );
651 register_setting( 'autoptimize', 'autoptimize_js_exclude' );
652 register_setting( 'autoptimize', 'autoptimize_js_trycatch' );
653 register_setting( 'autoptimize', 'autoptimize_js_justhead' );
654 register_setting( 'autoptimize', 'autoptimize_js_forcehead' );
655 register_setting( 'autoptimize', 'autoptimize_js_include_inline' );
656 register_setting( 'autoptimize', 'autoptimize_css' );
657 register_setting( 'autoptimize', 'autoptimize_css_aggregate' );
658 register_setting( 'autoptimize', 'autoptimize_css_exclude' );
659 register_setting( 'autoptimize', 'autoptimize_css_justhead' );
660 register_setting( 'autoptimize', 'autoptimize_css_datauris' );
661 register_setting( 'autoptimize', 'autoptimize_css_defer' );
662 register_setting( 'autoptimize', 'autoptimize_css_defer_inline' );
663 register_setting( 'autoptimize', 'autoptimize_css_inline' );
664 register_setting( 'autoptimize', 'autoptimize_css_include_inline' );
665 register_setting( 'autoptimize', 'autoptimize_cdn_url' );
666 register_setting( 'autoptimize', 'autoptimize_cache_clean' );
667 register_setting( 'autoptimize', 'autoptimize_cache_nogzip' );
668 register_setting( 'autoptimize', 'autoptimize_show_adv' );
669 register_setting( 'autoptimize', 'autoptimize_optimize_logged' );
670 register_setting( 'autoptimize', 'autoptimize_optimize_checkout' );
671 register_setting( 'autoptimize', 'autoptimize_minify_excluded' );
672 }
673
674 public function setmeta($links, $file = null)
675 {
676 // Inspired on http://wpengineer.com/meta-links-for-wordpress-plugins/.
677 // Do it only once - saves time.
678 static $plugin;
679 if ( empty( $plugin ) ) {
680 $plugin = plugin_basename( AUTOPTIMIZE_PLUGIN_DIR . 'autoptimize.php' );
681 }
682
683 if ( null === $file ) {
684 // 2.7 and lower.
685 $settings_link = sprintf( '<a href="options-general.php?page=autoptimize">%s</a>', __( 'Settings' ) );
686 array_unshift( $links, $settings_link );
687 } else {
688 // 2.8 and higher.
689 // If it's us, add the link.
690 if ( $file === $plugin ) {
691 $newlink = array( sprintf( '<a href="options-general.php?page=autoptimize">%s</a>', __( 'Settings' ) ) );
692 $links = array_merge( $links, $newlink );
693 }
694 }
695
696 return $links;
697 }
698
699 /**
700 * @return array
701 */
702 public static function get_defaults()
703 {
704 static $config = array(
705 'autoptimize_html' => 0,
706 'autoptimize_html_keepcomments' => 0,
707 'autoptimize_js' => 0,
708 'autoptimize_js_aggregate' => 1,
709 'autoptimize_js_exclude' => 'wp-includes/js/dist/, wp-includes/js/tinymce/, js/jquery/jquery.js',
710 'autoptimize_js_trycatch' => 0,
711 'autoptimize_js_justhead' => 0,
712 'autoptimize_js_include_inline' => 0,
713 'autoptimize_js_forcehead' => 0,
714 'autoptimize_css' => 0,
715 'autoptimize_css_aggregate' => 1,
716 'autoptimize_css_exclude' => 'admin-bar.min.css, dashicons.min.css, wp-content/cache/, wp-content/uploads/',
717 'autoptimize_css_justhead' => 0,
718 'autoptimize_css_include_inline' => 1,
719 'autoptimize_css_defer' => 0,
720 'autoptimize_css_defer_inline' => '',
721 'autoptimize_css_inline' => 0,
722 'autoptimize_css_datauris' => 0,
723 'autoptimize_cdn_url' => '',
724 'autoptimize_cache_nogzip' => 1,
725 'autoptimize_show_adv' => 1,
726 'autoptimize_optimize_logged' => 1,
727 'autoptimize_optimize_checkout' => 1,
728 'autoptimize_minify_excluded' => 1,
729 );
730
731 return $config;
732 }
733
734 /**
735 * Returns default option values for autoptimizeExtra.
736 *
737 * @return array
738 */
739 public static function get_ao_extra_default_options()
740 {
741 $defaults = array(
742 'autoptimize_extra_checkbox_field_1' => '0',
743 'autoptimize_extra_checkbox_field_0' => '0',
744 'autoptimize_extra_radio_field_4' => '1',
745 'autoptimize_extra_text_field_2' => '',
746 'autoptimize_extra_text_field_3' => '',
747 );
748
749 return $defaults;
750 }
751
752 /**
753 * Returns default option values for autoptimizeExtra.
754 *
755 * @return array
756 */
757 public static function get_ao_imgopt_default_options()
758 {
759 $defaults = array(
760 'autoptimize_imgopt_checkbox_field_1' => '0', // imgopt off.
761 'autoptimize_imgopt_select_field_2' => '2', // quality glossy.
762 'autoptimize_imgopt_checkbox_field_3' => '0', // lazy load off.
763 'autoptimize_imgopt_checkbox_field_4' => '0', // webp off (might be removed).
764 'autoptimize_imgopt_text_field_5' => '', // lazy load exclusions empty.
765 );
766 return $defaults;
767 }
768
769 /**
770 * Returns preload polyfill JS.
771 *
772 * @return string
773 */
774 public static function get_ao_css_preload_polyfill()
775 {
776 $preload_poly = apply_filters('autoptimize_css_preload_polyfill','<script data-cfasync=\'false\'>!function(t){"use strict";t.loadCSS||(t.loadCSS=function(){});var e=loadCSS.relpreload={};if(e.support=function(){var e;try{e=t.document.createElement("link").relList.supports("preload")}catch(t){e=!1}return function(){return e}}(),e.bindMediaToggle=function(t){function e(){t.media=a}var a=t.media||"all";t.addEventListener?t.addEventListener("load",e):t.attachEvent&&t.attachEvent("onload",e),setTimeout(function(){t.rel="stylesheet",t.media="only x"}),setTimeout(e,3e3)},e.poly=function(){if(!e.support())for(var a=t.document.getElementsByTagName("link"),n=0;n<a.length;n++){var o=a[n];"preload"!==o.rel||"style"!==o.getAttribute("as")||o.getAttribute("data-loadcss")||(o.setAttribute("data-loadcss",!0),e.bindMediaToggle(o))}},!e.support()){e.poly();var a=t.setInterval(e.poly,500);t.addEventListener?t.addEventListener("load",function(){e.poly(),t.clearInterval(a)}):t.attachEvent&&t.attachEvent("onload",function(){e.poly(),t.clearInterval(a)})}"undefined"!=typeof exports?exports.loadCSS=loadCSS:t.loadCSS=loadCSS}("undefined"!=typeof global?global:this);</script>');
777 return $preload_poly;
778 }
779
780 /**
781 * Returns preload JS onload handler.
782 *
783 * @return string
784 */
785 public static function get_ao_css_preload_onload()
786 {
787 $preload_onload = apply_filters('autoptimize_filter_css_preload_onload',"this.onload=null;this.rel='stylesheet'");
788 return $preload_onload;
789 }
790
791 public function get($key)
792 {
793 if ( ! is_array( $this->config ) ) {
794 // Default config.
795 $config = self::get_defaults();
796
797 // Override with user settings.
798 foreach ( array_keys( $config ) as $name ) {
799 $conf = get_option( $name );
800 if ( false !== $conf ) {
801 // It was set before!
802 $config[ $name ] = $conf;
803 }
804 }
805
806 // Save for next call.
807 $this->config = apply_filters( 'autoptimize_filter_get_config', $config );
808 }
809
810 if ( isset( $this->config[ $key ] ) ) {
811 return $this->config[ $key ];
812 }
813
814 return false;
815 }
816
817 private function getFutttaFeeds($url) {
818 if ( $this->settings_screen_do_remote_http ) {
819 $rss = fetch_feed( $url );
820 $maxitems = 0;
821
822 if ( ! is_wp_error( $rss ) ) {
823 $maxitems = $rss->get_item_quantity( 7 );
824 $rss_items = $rss->get_items( 0, $maxitems );
825 }
826 ?>
827 <ul>
828 <?php if ( $maxitems == 0 ) : ?>
829 <li><?php _e( 'No items', 'autoptimize' ); ?></li>
830 <?php else : ?>
831 <?php foreach ( $rss_items as $item ) : ?>
832 <li>
833 <a href="<?php echo esc_url( $item->get_permalink() ); ?>"
834 title="<?php printf( __( 'Posted %s', 'autoptimize' ), $item->get_date('j F Y | g:i a') ); ?>">
835 <?php echo esc_html( $item->get_title() ); ?>
836 </a>
837 </li>
838 <?php endforeach; ?>
839 <?php endif; ?>
840 </ul>
841 <?php
842 }
843 }
844
845 // based on http://wordpress.stackexchange.com/a/58826
846 static function ao_admin_tabs()
847 {
848 $tabs = apply_filters( 'autoptimize_filter_settingsscreen_tabs' ,array( 'autoptimize' => __( 'JS, CSS &amp; HTML', 'autoptimize' ) ) );
849 $tabContent = '';
850 $tabs_count = count($tabs);
851 if ( $tabs_count > 1 ) {
852 if ( isset( $_GET['page'] ) ) {
853 $currentId = $_GET['page'];
854 } else {
855 $currentId = "autoptimize";
856 }
857 $tabContent .= '<h2 class="nav-tab-wrapper">';
858 foreach ($tabs as $tabId => $tabName) {
859 if ( $currentId == $tabId ) {
860 $class = ' nav-tab-active';
861 } else{
862 $class = '';
863 }
864 $tabContent .= '<a class="nav-tab' . $class . '" href="?page=' . $tabId . '">' . $tabName . '</a>';
865 }
866 $tabContent .= '</h2>';
867 } else {
868 $tabContent = '<hr/>';
869 }
870
871 return $tabContent;
872 }
873
874 /**
875 * Returns true if in admin (and not in admin-ajax.php!)
876 *
877 * @return bool
878 */
879 public static function is_admin_and_not_ajax()
880 {
881 return ( is_admin() && ! self::doing_ajax() );
882 }
883
884 /**
885 * Returns true if doing ajax.
886 *
887 * @return bool
888 */
889 protected static function doing_ajax()
890 {
891 if ( function_exists( 'wp_doing_ajax' ) ) {
892 return wp_doing_ajax();
893 }
894 return ( defined( 'DOING_AJAX' ) && DOING_AJAX );
895 }
896 }
897