PluginProbe
Autoptimize / 3.0.3
Autoptimize v3.0.3
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 | autoptimize.php +71 -307 2.3.23.0.3 View file →
@@ -1,333 +1,97 @@
1 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.2
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 -*/
2 +/**
3 + * Plugin Name: Autoptimize
4 + * Plugin URI: https://autoptimize.com/
5 + * Description: Makes your site faster by optimizing CSS, JS, Images, Google fonts and more.
6 + * Version: 3.0.3
7 + * Author: Frank Goossens (futtta)
8 + * Author URI: https://autoptimize.com/
9 + * Text Domain: autoptimize
10 + * License: GPLv2
11 + * Released under the GNU General Public License (GPL)
12 + * https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
13 + */
14 14
15 -if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
15 +/**
16 + * Autoptimize main plugin file.
17 + */
16 18
17 -define('AUTOPTIMIZE_PLUGIN_DIR',plugin_dir_path(__FILE__));
18 19
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';
20 +if ( ! defined( 'ABSPATH' ) ) {
21 + exit;
28 22 }
29 23
30 -// Do we gzip when caching (needed early to load autoptimizeCache.php)
31 -define('AUTOPTIMIZE_CACHE_NOGZIP',(bool) get_option('autoptimize_cache_nogzip'));
24 +define( 'AUTOPTIMIZE_PLUGIN_VERSION', '3.0.3' );
32 25
33 -// Load cache class
34 -include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeCache.php');
26 +// plugin_dir_path() returns the trailing slash!
27 +define( 'AUTOPTIMIZE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
28 +define( 'AUTOPTIMIZE_PLUGIN_FILE', __FILE__ );
35 29
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 -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 ); }
30 +// Bail early if attempting to run on non-supported php versions.
31 +if ( version_compare( PHP_VERSION, '5.6', '<' ) ) {
32 + function autoptimize_incompatible_admin_notice() {
33 + echo '<div class="error"><p>' . __( 'Autoptimize requires PHP 5.6 (or higher) to function properly. Please upgrade PHP. The Plugin has been auto-deactivated.', 'autoptimize' ) . '</p></div>';
34 + if ( isset( $_GET['activate'] ) ) {
35 + unset( $_GET['activate'] );
97 36 }
98 - switch_to_blog( $original_blog_id );
99 37 }
100 -
101 - if ( wp_get_schedule( 'ao_cachechecker' ) ) {
102 - wp_clear_scheduled_hook( 'ao_cachechecker' );
38 + function autoptimize_deactivate_self() {
39 + deactivate_plugins( plugin_basename( AUTOPTIMIZE_PLUGIN_FILE ) );
103 40 }
41 + add_action( 'admin_notices', 'autoptimize_incompatible_admin_notice' );
42 + add_action( 'admin_init', 'autoptimize_deactivate_self' );
43 + return;
104 44 }
105 45
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 - }
46 +function autoptimize_autoload( $class_name ) {
47 + if ( in_array( $class_name, array( 'AO_Minify_HTML', 'JSMin' ) ) ) {
48 + $file = strtolower( $class_name );
49 + $file = str_replace( '_', '-', $file );
50 + $path = dirname( __FILE__ ) . '/classes/external/php/';
51 + $filepath = $path . $file . '.php';
52 + } elseif ( false !== strpos( $class_name, 'Autoptimize\\tubalmartin\\CssMin' ) ) {
53 + $file = str_replace( 'Autoptimize\\tubalmartin\\CssMin\\', '', $class_name );
54 + $path = dirname( __FILE__ ) . '/classes/external/php/yui-php-cssmin-bundled/';
55 + $filepath = $path . $file . '.php';
56 + } elseif ( 'autoptimize' === substr( $class_name, 0, 11 ) ) {
57 + // One of our "old" classes.
58 + $file = $class_name;
59 + $path = dirname( __FILE__ ) . '/classes/';
60 + $filepath = $path . $file . '.php';
61 + } elseif ( 'PAnD' === $class_name ) {
62 + $file = 'persist-admin-notices-dismissal';
63 + $path = dirname( __FILE__ ) . '/classes/external/php/persist-admin-notices-dismissal/';
64 + $filepath = $path . $file . '.php';
133 65 }
134 66
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;
67 + // If we didn't match one of our rules, bail!
68 + if ( ! isset( $filepath ) ) {
69 + return;
138 70 }
139 71
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 - }
72 + require $filepath;
73 +}
144 74
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 - }
75 +spl_autoload_register( 'autoptimize_autoload' );
155 76
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')) {
176 - @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-html.php');
177 - // } else {
178 - // @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-html.php');
179 - // }
180 - }
181 -
182 - 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 - 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 - }
77 +// Load WP CLI command(s) on demand.
78 +if ( defined( 'WP_CLI' ) && WP_CLI ) {
79 + require AUTOPTIMIZE_PLUGIN_DIR . 'classes/autoptimizeCLI.php';
224 80 }
225 81
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; }
82 +/**
83 + * Retrieve the instance of the main plugin class.
84 + *
85 + * @return autoptimizeMain
86 + */
87 +function autoptimize() {
88 + static $plugin = null;
229 89
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());
90 + if ( null === $plugin ) {
91 + $plugin = new autoptimizeMain( AUTOPTIMIZE_PLUGIN_VERSION, AUTOPTIMIZE_PLUGIN_FILE );
237 92 }
238 93
239 - 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;
94 + return $plugin;
301 95 }
302 96
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);
97 +autoptimize()->run();