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 | autoptimize.php +74 -307 2.3.3 → trunk View file →
@@ -1,335 +1,102 @@
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.3
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/pro/
5 + * Description: Makes your site faster by optimizing CSS, JS, Images, Google fonts and more.
6 + * Version: 3.1.16
7 + * Author: Frank Goossens (futtta)
8 + * Author URI: https://autoptimize.com/pro/
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.1.16' );
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 (!defined('AUTOPTIMIZE_CACHE_DIR')) {
43 - if (is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true )) {
44 - $blog_id = get_current_blog_id();
45 - define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
46 - } else {
47 - define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR );
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>' . esc_html__( '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'] );
36 + }
48 37 }
49 -}
50 -define('AUTOPTIMIZE_CACHE_DELAY',true);
51 -define('WP_ROOT_DIR',substr(WP_CONTENT_DIR, 0, strlen(WP_CONTENT_DIR)-strlen(AUTOPTIMIZE_WP_CONTENT_NAME)));
52 -
53 -// WP CLI
54 -if ( defined( 'WP_CLI' ) && WP_CLI ) {
55 - require_once AUTOPTIMIZE_PLUGIN_DIR . 'classes/autoptimizeCLI.php';
56 -}
57 -
58 -// Initialize the cache at least once
59 -$conf = autoptimizeConfig::instance();
60 -
61 -/* Check if we're updating, in which case we might need to do stuff and flush the cache
62 -to avoid old versions of aggregated files lingering around */
63 -
64 -$autoptimize_version="2.3.0";
65 -$autoptimize_db_version=get_option('autoptimize_version','none');
66 -
67 -if ($autoptimize_db_version !== $autoptimize_version) {
68 - if ($autoptimize_db_version==="none") {
69 - add_action('admin_notices', 'autoptimize_install_config_notice');
70 - } else {
71 - // updating, include the update-code
72 - include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeUpdateCode.php');
38 + function autoptimize_deactivate_self() {
39 + deactivate_plugins( plugin_basename( AUTOPTIMIZE_PLUGIN_FILE ) );
73 40 }
74 -
75 - update_option('autoptimize_version',$autoptimize_version);
76 - $autoptimize_db_version=$autoptimize_version;
41 + add_action( 'admin_notices', 'autoptimize_incompatible_admin_notice' );
42 + add_action( 'admin_init', 'autoptimize_deactivate_self' );
43 + return;
77 44 }
78 45
79 -// Load translations
80 -function autoptimize_load_plugin_textdomain() {
81 - load_plugin_textdomain('autoptimize',false,plugin_basename(dirname( __FILE__ )).'/localization');
82 -}
83 -add_action( 'init', 'autoptimize_load_plugin_textdomain' );
84 -
85 -function autoptimize_uninstall(){
86 - autoptimizeCache::clearall();
87 -
88 - $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");
89 -
90 - if ( !is_multisite() ) {
91 - foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
92 - } else {
93 - global $wpdb;
94 - $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
95 - $original_blog_id = get_current_blog_id();
96 - foreach ( $blog_ids as $blog_id ) {
97 - switch_to_blog( $blog_id );
98 - foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
99 - }
100 - switch_to_blog( $original_blog_id );
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';
101 65 }
102 66
103 - if ( wp_get_schedule( 'ao_cachechecker' ) ) {
104 - wp_clear_scheduled_hook( 'ao_cachechecker' );
67 + // If we didn't match one of our rules, bail!
68 + if ( ! isset( $filepath ) || ! is_readable( $filepath ) ) {
69 + return;
105 70 }
106 -}
107 71
108 -function autoptimize_install_config_notice() {
109 - echo '<div class="updated"><p>';
110 - _e('Thank you for installing and activating Autoptimize. Please configure it under "Settings" -> "Autoptimize" to start improving your site\'s performance.', 'autoptimize' );
111 - echo '</p></div>';
72 + require $filepath;
112 73 }
113 74
114 -function autoptimize_update_config_notice() {
115 - echo '<div class="updated"><p>';
116 - _e('Autoptimize has just been updated. Please <strong>test your site now</strong> and adapt Autoptimize config if needed.', 'autoptimize' );
117 - echo '</p></div>';
118 -}
75 +spl_autoload_register( 'autoptimize_autoload' );
119 76
120 -function autoptimize_cache_unavailable_notice() {
121 - echo '<div class="error"><p>';
122 - printf( __( 'Autoptimize cannot write to the cache directory (%s), please fix to enable CSS/ JS optimization!', 'autoptimize' ), AUTOPTIMIZE_CACHE_DIR );
123 - echo '</p></div>';
77 +// Load WP CLI command(s) on demand.
78 +if ( defined( 'WP_CLI' ) && WP_CLI ) {
79 + require AUTOPTIMIZE_PLUGIN_DIR . 'classes/autoptimizeCLI.php';
124 80 }
125 81
126 -// Set up the buffering
127 -function autoptimize_start_buffering() {
128 - $ao_noptimize = false;
129 -
130 - // noptimize in qs to get non-optimized page for debugging
131 - if (array_key_exists("ao_noptimize",$_GET) || array_key_exists("ao_noptirocket",$_GET)) {
132 - if ( ( ($_GET["ao_noptimize"]==="1") || ($_GET["ao_noptirocket"]==="1") ) && (apply_filters('autoptimize_filter_honor_qs_noptimize',true)) ) {
133 - $ao_noptimize = true;
134 - }
135 - }
136 -
137 - // check for DONOTMINIFY constant as used by e.g. WooCommerce POS
138 - if (defined('DONOTMINIFY') && (constant('DONOTMINIFY')===true || constant('DONOTMINIFY')==="true")) {
139 - $ao_noptimize = true;
140 - }
141 -
142 - // if setting says not to optimize logged in user and user is logged in
143 - if ( get_option('autoptimize_optimize_logged','on') !== 'on' && is_user_logged_in() && current_user_can('edit_posts') ) {
144 - $ao_noptimize = true;
145 - }
146 -
147 - // if setting says not to optimize cart/ checkout
148 - if ( get_option('autoptimize_optimize_checkout','on') !== 'on' ) {
149 - // checking for woocommerce, easy digital downloads and wp ecommerce
150 - foreach ( array("is_checkout","is_cart","edd_is_checkout","wpsc_is_cart","wpsc_is_checkout") as $shopCond ) {
151 - if ( function_exists($shopCond) && $shopCond() ) {
152 - $ao_noptimize = true;
153 - break;
154 - }
155 - }
156 - }
157 -
158 - // filter you can use to block autoptimization on your own terms
159 - $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
160 -
161 - if (!is_feed() && !$ao_noptimize && !is_admin() && ( !function_exists('is_customize_preview') || !is_customize_preview() ) ) {
162 - // load speedupper conditionally (true by default?)
163 - if ( apply_filters('autoptimize_filter_speedupper', true) ) {
164 - include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeSpeedupper.php');
165 - }
166 -
167 - // Config element
168 - $conf = autoptimizeConfig::instance();
169 -
170 - // Load our base class
171 - include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeBase.php');
172 -
173 - // Load extra classes and set some vars
174 - if($conf->get('autoptimize_html')) {
175 - include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeHTML.php');
176 - // BUG: new minify-html does not support keeping HTML comments, skipping for now
177 - // if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
178 - @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-html.php');
179 - // } else {
180 - // @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-html.php');
181 - // }
182 - }
183 -
184 - if($conf->get('autoptimize_js')) {
185 - include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeScripts.php');
186 - if (!class_exists('JSMin')) {
187 - if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
188 - @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/jsmin-1.1.1.php');
189 - } else {
190 - @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.3.1-jsmin.php');
191 - }
192 - }
193 - if ( ! defined( 'CONCATENATE_SCRIPTS' )) {
194 - define('CONCATENATE_SCRIPTS',false);
195 - }
196 - if ( ! defined( 'COMPRESS_SCRIPTS' )) {
197 - define('COMPRESS_SCRIPTS',false);
198 - }
199 - }
200 -
201 - if($conf->get('autoptimize_css')) {
202 - include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeStyles.php');
203 - if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
204 - if (!class_exists('Minify_CSS_Compressor')) {
205 - @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-css-compressor.php');
206 - }
207 - } else {
208 - if (!class_exists('CSSmin')) {
209 - @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/yui-php-cssmin-2.4.8-4_fgo.php');
210 - }
211 - }
212 - if ( ! defined( 'COMPRESS_CSS' )) {
213 - define('COMPRESS_CSS',false);
214 - }
215 - }
216 -
217 - // filter to be used with care, kills all output buffers when true. use with extreme caution. you have been warned!
218 - if (apply_filters('autoptimize_filter_obkiller',false)) {
219 - while (ob_get_level() > 0) {
220 - ob_end_clean();
221 - }
222 - }
223 - // Now, start the real thing!
224 - ob_start('autoptimize_end_buffering');
225 - }
82 +// filter to disable AO both on front- and backend.
83 +if ( apply_filters( 'autoptimize_filter_disable_plugin', false ) ) {
84 + return;
226 85 }
227 86
228 -// Action on end, this is where the magic happens
229 -function autoptimize_end_buffering($content) {
230 - if ( ((stripos($content,"<html") === false) && (stripos($content,"<!DOCTYPE html") === false)) || preg_match('/<html[^>]*(?:amp|âš¡)/',$content) === 1 || stripos($content,"<xsl:stylesheet") !== false ) { return $content; }
87 +/**
88 + * Retrieve the instance of the main plugin class.
89 + *
90 + * @return autoptimizeMain
91 + */
92 +function autoptimize() {
93 + static $plugin = null;
231 94
232 - // load URL constants as late as possible to allow domain mapper to kick in
233 - if (function_exists("domain_mapping_siteurl")) {
234 - define('AUTOPTIMIZE_WP_SITE_URL',domain_mapping_siteurl(get_current_blog_id()));
235 - define('AUTOPTIMIZE_WP_CONTENT_URL',str_replace(get_original_url(AUTOPTIMIZE_WP_SITE_URL),AUTOPTIMIZE_WP_SITE_URL,content_url()));
236 - } else {
237 - define('AUTOPTIMIZE_WP_SITE_URL',site_url());
238 - define('AUTOPTIMIZE_WP_CONTENT_URL',content_url());
95 + if ( null === $plugin ) {
96 + $plugin = new autoptimizeMain( AUTOPTIMIZE_PLUGIN_VERSION, AUTOPTIMIZE_PLUGIN_FILE );
239 97 }
240 98
241 - if ( is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true ) ) {
242 - $blog_id = get_current_blog_id();
243 - define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
244 - } else {
245 - define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR);
246 - }
247 - define('AUTOPTIMIZE_WP_ROOT_URL',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',AUTOPTIMIZE_WP_CONTENT_URL));
248 - define('AUTOPTIMIZE_HASH',wp_hash(AUTOPTIMIZE_CACHE_DIR));
249 -
250 - // Config element
251 - $conf = autoptimizeConfig::instance();
252 -
253 - // Choose the classes
254 - $classes = array();
255 - if($conf->get('autoptimize_js'))
256 - $classes[] = 'autoptimizeScripts';
257 - if($conf->get('autoptimize_css'))
258 - $classes[] = 'autoptimizeStyles';
259 - if($conf->get('autoptimize_html'))
260 - $classes[] = 'autoptimizeHTML';
261 -
262 - // Set some options
263 - $classoptions = array(
264 - 'autoptimizeScripts' => array(
265 - 'justhead' => $conf->get('autoptimize_js_justhead'),
266 - 'forcehead' => $conf->get('autoptimize_js_forcehead'),
267 - 'trycatch' => $conf->get('autoptimize_js_trycatch'),
268 - 'js_exclude' => $conf->get('autoptimize_js_exclude'),
269 - 'cdn_url' => $conf->get('autoptimize_cdn_url'),
270 - 'include_inline' => $conf->get('autoptimize_js_include_inline')
271 - ),
272 - 'autoptimizeStyles' => array(
273 - 'justhead' => $conf->get('autoptimize_css_justhead'),
274 - 'datauris' => $conf->get('autoptimize_css_datauris'),
275 - 'defer' => $conf->get('autoptimize_css_defer'),
276 - 'defer_inline' => $conf->get('autoptimize_css_defer_inline'),
277 - 'inline' => $conf->get('autoptimize_css_inline'),
278 - 'css_exclude' => $conf->get('autoptimize_css_exclude'),
279 - 'cdn_url' => $conf->get('autoptimize_cdn_url'),
280 - 'include_inline' => $conf->get('autoptimize_css_include_inline'),
281 - 'nogooglefont' => $conf->get('autoptimize_css_nogooglefont')
282 - ),
283 - 'autoptimizeHTML' => array(
284 - 'keepcomments' => $conf->get('autoptimize_html_keepcomments')
285 - )
286 - );
287 -
288 - $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
289 -
290 - // Run the classes
291 - foreach($classes as $name) {
292 - $instance = new $name($content);
293 - if($instance->read($classoptions[$name])) {
294 - $instance->minify();
295 - $instance->cache();
296 - $content = $instance->getcontent();
297 - }
298 - unset($instance);
299 - }
300 -
301 - $content = apply_filters( 'autoptimize_html_after_minify', $content );
302 - return $content;
99 + return $plugin;
303 100 }
304 101
305 -if ( autoptimizeCache::cacheavail() ) {
306 - $conf = autoptimizeConfig::instance();
307 - if( $conf->get('autoptimize_html') || $conf->get('autoptimize_js') || $conf->get('autoptimize_css') ) {
308 - // Hook to wordpress
309 - if (defined('AUTOPTIMIZE_INIT_EARLIER')) {
310 - add_action('init','autoptimize_start_buffering',-1);
311 - } else {
312 - if (!defined('AUTOPTIMIZE_HOOK_INTO')) { define('AUTOPTIMIZE_HOOK_INTO', 'template_redirect'); }
313 - add_action(constant("AUTOPTIMIZE_HOOK_INTO"),'autoptimize_start_buffering',2);
314 - }
315 - }
316 -} else {
317 - add_action('admin_notices', 'autoptimize_cache_unavailable_notice');
318 -}
319 -
320 -function autoptimize_activate() {
321 - register_uninstall_hook( __FILE__, 'autoptimize_uninstall' );
322 -}
323 -register_activation_hook( __FILE__, 'autoptimize_activate' );
324 -
325 -include_once('classlesses/autoptimizeCacheChecker.php');
326 -
327 -add_action('plugins_loaded','includeAutoptimizeExtra');
328 -function includeAutoptimizeExtra() {
329 - if ( apply_filters('autoptimize_filter_extra_activate',true) ) {
330 - include_once('classlesses/autoptimizeExtra.php');
331 - }
332 -}
333 -
334 -// Do not pollute other plugins
335 -unset($conf);
102 +autoptimize()->run();