These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /* |
||
3 | Plugin Name: Autoptimize |
||
4 | Plugin URI: https://autoptimize.com/ |
||
5 | Description: Optimizes your website, concatenating the CSS and JavaScript code, and compressing it. |
||
6 | Version: 2.3.1 |
||
7 | Author: Frank Goossens (futtta) |
||
8 | Author URI: https://autoptimize.com/ |
||
9 | Domain Path: localization/ |
||
10 | Text Domain: autoptimize |
||
11 | Released under the GNU General Public License (GPL) |
||
12 | http://www.gnu.org/licenses/gpl.txt |
||
13 | */ |
||
14 | |||
15 | if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly |
||
16 | |||
17 | define('AUTOPTIMIZE_PLUGIN_DIR',plugin_dir_path(__FILE__)); |
||
18 | |||
19 | // Load config class |
||
20 | include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeConfig.php'); |
||
21 | |||
22 | // Load toolbar class |
||
23 | include( AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeToolbar.php' ); |
||
24 | |||
25 | // Load partners tab if admin |
||
26 | if (is_admin()) { |
||
27 | include AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizePartners.php'; |
||
28 | } |
||
29 | |||
30 | // Do we gzip when caching (needed early to load autoptimizeCache.php) |
||
31 | define('AUTOPTIMIZE_CACHE_NOGZIP',(bool) get_option('autoptimize_cache_nogzip')); |
||
32 | |||
33 | // Load cache class |
||
34 | include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeCache.php'); |
||
35 | |||
36 | // wp-content dir name (automagically set, should not be needed), dirname of AO cache dir and AO-prefix can be overridden in wp-config.php |
||
37 | if (!defined('AUTOPTIMIZE_WP_CONTENT_NAME')) { define('AUTOPTIMIZE_WP_CONTENT_NAME','/'.wp_basename( WP_CONTENT_DIR )); } |
||
38 | if (!defined('AUTOPTIMIZE_CACHE_CHILD_DIR')) { define('AUTOPTIMIZE_CACHE_CHILD_DIR','/cache/autoptimize/'); } |
||
39 | if (!defined('AUTOPTIMIZE_CACHEFILE_PREFIX')) { define('AUTOPTIMIZE_CACHEFILE_PREFIX', 'autoptimize_'); } |
||
40 | |||
41 | // Plugin dir constants (plugin url's defined later to accomodate domain mapped sites) |
||
42 | View Code Duplication | if (is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true )) { |
|
43 | $blog_id = get_current_blog_id(); |
||
44 | define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' ); |
||
45 | } else { |
||
46 | define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR); |
||
47 | } |
||
48 | define('AUTOPTIMIZE_CACHE_DELAY',true); |
||
49 | define('WP_ROOT_DIR',substr(WP_CONTENT_DIR, 0, strlen(WP_CONTENT_DIR)-strlen(AUTOPTIMIZE_WP_CONTENT_NAME))); |
||
50 | |||
51 | // WP CLI |
||
52 | if ( defined( 'WP_CLI' ) && WP_CLI ) { |
||
53 | require_once AUTOPTIMIZE_PLUGIN_DIR . 'classes/autoptimizeCLI.php'; |
||
54 | } |
||
55 | |||
56 | // Initialize the cache at least once |
||
57 | $conf = autoptimizeConfig::instance(); |
||
58 | |||
59 | /* Check if we're updating, in which case we might need to do stuff and flush the cache |
||
60 | to avoid old versions of aggregated files lingering around */ |
||
61 | |||
62 | $autoptimize_version="2.3.0"; |
||
63 | $autoptimize_db_version=get_option('autoptimize_version','none'); |
||
64 | |||
65 | if ($autoptimize_db_version !== $autoptimize_version) { |
||
66 | if ($autoptimize_db_version==="none") { |
||
67 | add_action('admin_notices', 'autoptimize_install_config_notice'); |
||
68 | } else { |
||
69 | // updating, include the update-code |
||
70 | include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeUpdateCode.php'); |
||
71 | } |
||
72 | |||
73 | update_option('autoptimize_version',$autoptimize_version); |
||
74 | $autoptimize_db_version=$autoptimize_version; |
||
75 | } |
||
76 | |||
77 | // Load translations |
||
78 | function autoptimize_load_plugin_textdomain() { |
||
79 | load_plugin_textdomain('autoptimize',false,plugin_basename(dirname( __FILE__ )).'/localization'); |
||
80 | } |
||
81 | add_action( 'init', 'autoptimize_load_plugin_textdomain' ); |
||
82 | |||
83 | function autoptimize_uninstall(){ |
||
84 | autoptimizeCache::clearall(); |
||
85 | |||
86 | $delete_options=array("autoptimize_cache_clean", "autoptimize_cache_nogzip", "autoptimize_css", "autoptimize_css_datauris", "autoptimize_css_justhead", "autoptimize_css_defer", "autoptimize_css_defer_inline", "autoptimize_css_inline", "autoptimize_css_exclude", "autoptimize_html", "autoptimize_html_keepcomments", "autoptimize_js", "autoptimize_js_exclude", "autoptimize_js_forcehead", "autoptimize_js_justhead", "autoptimize_js_trycatch", "autoptimize_version", "autoptimize_show_adv", "autoptimize_cdn_url", "autoptimize_cachesize_notice","autoptimize_css_include_inline","autoptimize_js_include_inline","autoptimize_optimize_logged","autoptimize_optimize_checkout","autoptimize_extra_settings"); |
||
87 | |||
88 | if ( !is_multisite() ) { |
||
89 | foreach ($delete_options as $del_opt) { delete_option( $del_opt ); } |
||
90 | } else { |
||
91 | global $wpdb; |
||
92 | $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" ); |
||
93 | $original_blog_id = get_current_blog_id(); |
||
94 | foreach ( $blog_ids as $blog_id ) { |
||
95 | switch_to_blog( $blog_id ); |
||
96 | foreach ($delete_options as $del_opt) { delete_option( $del_opt ); } |
||
97 | } |
||
98 | switch_to_blog( $original_blog_id ); |
||
99 | } |
||
100 | |||
101 | if ( wp_get_schedule( 'ao_cachechecker' ) ) { |
||
102 | wp_clear_scheduled_hook( 'ao_cachechecker' ); |
||
103 | } |
||
104 | } |
||
105 | |||
106 | function autoptimize_install_config_notice() { |
||
107 | echo '<div class="updated"><p>'; |
||
108 | _e('Thank you for installing and activating Autoptimize. Please configure it under "Settings" -> "Autoptimize" to start improving your site\'s performance.', 'autoptimize' ); |
||
109 | echo '</p></div>'; |
||
110 | } |
||
111 | |||
112 | function autoptimize_update_config_notice() { |
||
113 | echo '<div class="updated"><p>'; |
||
114 | _e('Autoptimize has just been updated. Please <strong>test your site now</strong> and adapt Autoptimize config if needed.', 'autoptimize' ); |
||
115 | echo '</p></div>'; |
||
116 | } |
||
117 | |||
118 | function autoptimize_cache_unavailable_notice() { |
||
119 | echo '<div class="error"><p>'; |
||
120 | printf( __( 'Autoptimize cannot write to the cache directory (%s), please fix to enable CSS/ JS optimization!', 'autoptimize' ), AUTOPTIMIZE_CACHE_DIR ); |
||
121 | echo '</p></div>'; |
||
122 | } |
||
123 | |||
124 | // Set up the buffering |
||
125 | function autoptimize_start_buffering() { |
||
126 | $ao_noptimize = false; |
||
127 | |||
128 | // noptimize in qs to get non-optimized page for debugging |
||
129 | if (array_key_exists("ao_noptimize",$_GET) || array_key_exists("ao_noptirocket",$_GET)) { |
||
130 | if ( ( ($_GET["ao_noptimize"]==="1") || ($_GET["ao_noptirocket"]==="1") ) && (apply_filters('autoptimize_filter_honor_qs_noptimize',true)) ) { |
||
131 | $ao_noptimize = true; |
||
132 | } |
||
133 | } |
||
134 | |||
135 | // check for DONOTMINIFY constant as used by e.g. WooCommerce POS |
||
136 | if (defined('DONOTMINIFY') && (constant('DONOTMINIFY')===true || constant('DONOTMINIFY')==="true")) { |
||
137 | $ao_noptimize = true; |
||
138 | } |
||
139 | |||
140 | // if setting says not to optimize logged in user and user is logged in |
||
141 | if ( get_option('autoptimize_optimize_logged','on') !== 'on' && is_user_logged_in() && current_user_can('edit_posts') ) { |
||
142 | $ao_noptimize = true; |
||
143 | } |
||
144 | |||
145 | // if setting says not to optimize cart/ checkout |
||
146 | if ( get_option('autoptimize_optimize_checkout','on') !== 'on' ) { |
||
147 | // checking for woocommerce, easy digital downloads and wp ecommerce |
||
148 | foreach ( array("is_checkout","is_cart","edd_is_checkout","wpsc_is_cart","wpsc_is_checkout") as $shopCond ) { |
||
149 | if ( function_exists($shopCond) && $shopCond() ) { |
||
150 | $ao_noptimize = true; |
||
151 | break; |
||
152 | } |
||
153 | } |
||
154 | } |
||
155 | |||
156 | // filter you can use to block autoptimization on your own terms |
||
157 | $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize ); |
||
158 | |||
159 | if (!is_feed() && !$ao_noptimize && !is_admin() && ( !function_exists('is_customize_preview') || !is_customize_preview() ) ) { |
||
160 | // load speedupper conditionally (true by default?) |
||
161 | if ( apply_filters('autoptimize_filter_speedupper', true) ) { |
||
162 | include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeSpeedupper.php'); |
||
163 | } |
||
164 | |||
165 | // Config element |
||
166 | $conf = autoptimizeConfig::instance(); |
||
167 | |||
168 | // Load our base class |
||
169 | include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeBase.php'); |
||
170 | |||
171 | // Load extra classes and set some vars |
||
172 | if($conf->get('autoptimize_html')) { |
||
173 | include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeHTML.php'); |
||
174 | // BUG: new minify-html does not support keeping HTML comments, skipping for now |
||
175 | // if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) { |
||
0 ignored issues
–
show
|
|||
176 | @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-html.php'); |
||
177 | // } else { |
||
0 ignored issues
–
show
Unused Code
Comprehensibility
introduced
by
50% of this comment could be valid code. Did you maybe forget this after debugging?
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it. The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production. This check looks for comments that seem to be mostly valid code and reports them. ![]() |
|||
178 | // @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-html.php'); |
||
179 | // } |
||
180 | } |
||
181 | |||
182 | View Code Duplication | if($conf->get('autoptimize_js')) { |
|
183 | include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeScripts.php'); |
||
184 | if (!class_exists('JSMin')) { |
||
185 | if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) { |
||
186 | @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/jsmin-1.1.1.php'); |
||
187 | } else { |
||
188 | @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.3.1-jsmin.php'); |
||
189 | } |
||
190 | } |
||
191 | if ( ! defined( 'CONCATENATE_SCRIPTS' )) { |
||
192 | define('CONCATENATE_SCRIPTS',false); |
||
193 | } |
||
194 | if ( ! defined( 'COMPRESS_SCRIPTS' )) { |
||
195 | define('COMPRESS_SCRIPTS',false); |
||
196 | } |
||
197 | } |
||
198 | |||
199 | View Code Duplication | if($conf->get('autoptimize_css')) { |
|
200 | include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeStyles.php'); |
||
201 | if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) { |
||
202 | if (!class_exists('Minify_CSS_Compressor')) { |
||
203 | @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-css-compressor.php'); |
||
204 | } |
||
205 | } else { |
||
206 | if (!class_exists('CSSmin')) { |
||
207 | @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/yui-php-cssmin-2.4.8-4_fgo.php'); |
||
208 | } |
||
209 | } |
||
210 | if ( ! defined( 'COMPRESS_CSS' )) { |
||
211 | define('COMPRESS_CSS',false); |
||
212 | } |
||
213 | } |
||
214 | |||
215 | // filter to be used with care, kills all output buffers when true. use with extreme caution. you have been warned! |
||
216 | if (apply_filters('autoptimize_filter_obkiller',false)) { |
||
217 | while (ob_get_level() > 0) { |
||
218 | ob_end_clean(); |
||
219 | } |
||
220 | } |
||
221 | // Now, start the real thing! |
||
222 | ob_start('autoptimize_end_buffering'); |
||
223 | } |
||
224 | } |
||
225 | |||
226 | // Action on end, this is where the magic happens |
||
227 | function autoptimize_end_buffering($content) { |
||
228 | if ( ((stripos($content,"<html") === false) && (stripos($content,"<!DOCTYPE html") === false)) || preg_match('/<html[^>]*(?:amp|⚡)/',$content) === 1 || stripos($content,"<xsl:stylesheet") !== false ) { return $content; } |
||
229 | |||
230 | // load URL constants as late as possible to allow domain mapper to kick in |
||
231 | if (function_exists("domain_mapping_siteurl")) { |
||
232 | define('AUTOPTIMIZE_WP_SITE_URL',domain_mapping_siteurl(get_current_blog_id())); |
||
233 | define('AUTOPTIMIZE_WP_CONTENT_URL',str_replace(get_original_url(AUTOPTIMIZE_WP_SITE_URL),AUTOPTIMIZE_WP_SITE_URL,content_url())); |
||
234 | } else { |
||
235 | define('AUTOPTIMIZE_WP_SITE_URL',site_url()); |
||
236 | define('AUTOPTIMIZE_WP_CONTENT_URL',content_url()); |
||
237 | } |
||
238 | |||
239 | View Code Duplication | if ( is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true ) ) { |
|
240 | $blog_id = get_current_blog_id(); |
||
241 | define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' ); |
||
242 | } else { |
||
243 | define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR); |
||
244 | } |
||
245 | define('AUTOPTIMIZE_WP_ROOT_URL',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',AUTOPTIMIZE_WP_CONTENT_URL)); |
||
246 | define('AUTOPTIMIZE_HASH',wp_hash(AUTOPTIMIZE_CACHE_DIR)); |
||
247 | |||
248 | // Config element |
||
249 | $conf = autoptimizeConfig::instance(); |
||
250 | |||
251 | // Choose the classes |
||
252 | $classes = array(); |
||
253 | if($conf->get('autoptimize_js')) |
||
254 | $classes[] = 'autoptimizeScripts'; |
||
255 | if($conf->get('autoptimize_css')) |
||
256 | $classes[] = 'autoptimizeStyles'; |
||
257 | if($conf->get('autoptimize_html')) |
||
258 | $classes[] = 'autoptimizeHTML'; |
||
259 | |||
260 | // Set some options |
||
261 | $classoptions = array( |
||
262 | 'autoptimizeScripts' => array( |
||
263 | 'justhead' => $conf->get('autoptimize_js_justhead'), |
||
264 | 'forcehead' => $conf->get('autoptimize_js_forcehead'), |
||
265 | 'trycatch' => $conf->get('autoptimize_js_trycatch'), |
||
266 | 'js_exclude' => $conf->get('autoptimize_js_exclude'), |
||
267 | 'cdn_url' => $conf->get('autoptimize_cdn_url'), |
||
268 | 'include_inline' => $conf->get('autoptimize_js_include_inline') |
||
269 | ), |
||
270 | 'autoptimizeStyles' => array( |
||
271 | 'justhead' => $conf->get('autoptimize_css_justhead'), |
||
272 | 'datauris' => $conf->get('autoptimize_css_datauris'), |
||
273 | 'defer' => $conf->get('autoptimize_css_defer'), |
||
274 | 'defer_inline' => $conf->get('autoptimize_css_defer_inline'), |
||
275 | 'inline' => $conf->get('autoptimize_css_inline'), |
||
276 | 'css_exclude' => $conf->get('autoptimize_css_exclude'), |
||
277 | 'cdn_url' => $conf->get('autoptimize_cdn_url'), |
||
278 | 'include_inline' => $conf->get('autoptimize_css_include_inline'), |
||
279 | 'nogooglefont' => $conf->get('autoptimize_css_nogooglefont') |
||
280 | ), |
||
281 | 'autoptimizeHTML' => array( |
||
282 | 'keepcomments' => $conf->get('autoptimize_html_keepcomments') |
||
283 | ) |
||
284 | ); |
||
285 | |||
286 | $content = apply_filters( 'autoptimize_filter_html_before_minify', $content ); |
||
287 | |||
288 | // Run the classes |
||
289 | foreach($classes as $name) { |
||
290 | $instance = new $name($content); |
||
291 | if($instance->read($classoptions[$name])) { |
||
292 | $instance->minify(); |
||
293 | $instance->cache(); |
||
294 | $content = $instance->getcontent(); |
||
295 | } |
||
296 | unset($instance); |
||
297 | } |
||
298 | |||
299 | $content = apply_filters( 'autoptimize_html_after_minify', $content ); |
||
300 | return $content; |
||
301 | } |
||
302 | |||
303 | if ( autoptimizeCache::cacheavail() ) { |
||
304 | $conf = autoptimizeConfig::instance(); |
||
305 | if( $conf->get('autoptimize_html') || $conf->get('autoptimize_js') || $conf->get('autoptimize_css') ) { |
||
306 | // Hook to wordpress |
||
307 | if (defined('AUTOPTIMIZE_INIT_EARLIER')) { |
||
308 | add_action('init','autoptimize_start_buffering',-1); |
||
309 | } else { |
||
310 | if (!defined('AUTOPTIMIZE_HOOK_INTO')) { define('AUTOPTIMIZE_HOOK_INTO', 'template_redirect'); } |
||
311 | add_action(constant("AUTOPTIMIZE_HOOK_INTO"),'autoptimize_start_buffering',2); |
||
312 | } |
||
313 | } |
||
314 | } else { |
||
315 | add_action('admin_notices', 'autoptimize_cache_unavailable_notice'); |
||
316 | } |
||
317 | |||
318 | function autoptimize_activate() { |
||
319 | register_uninstall_hook( __FILE__, 'autoptimize_uninstall' ); |
||
320 | } |
||
321 | register_activation_hook( __FILE__, 'autoptimize_activate' ); |
||
322 | |||
323 | include_once('classlesses/autoptimizeCacheChecker.php'); |
||
324 | |||
325 | add_action('plugins_loaded','includeAutoptimizeExtra'); |
||
326 | function includeAutoptimizeExtra() { |
||
327 | if ( apply_filters('autoptimize_filter_extra_activate',true) ) { |
||
328 | include_once('classlesses/autoptimizeExtra.php'); |
||
329 | } |
||
330 | } |
||
331 | |||
332 | // Do not pollute other plugins |
||
333 | unset($conf); |
||
334 |
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.