PluginProbe
Autoptimize / 2.1.2
Autoptimize v2.1.2
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 +263 -63 2.4.42.1.2 View file →
@@ -1,96 +1,296 @@
1 1 <?php
2 2 /*
3 3 Plugin Name: Autoptimize
4 -Plugin URI: https://autoptimize.com/
5 -Description: Optimize your website's performance: JS, CSS, HTML, images, Google Fonts and more!
6 -Version: 2.4.4
4 +Plugin URI: http://blog.futtta.be/autoptimize
5 +Description: Optimizes your website, concatenating the CSS and JavaScript code, and compressing it.
6 +Version: 2.1.2
7 7 Author: Frank Goossens (futtta)
8 -Author URI: https://autoptimize.com/
8 +Author URI: http://blog.futtta.be/
9 +Domain Path: localization/
9 10 Text Domain: autoptimize
10 11 Released under the GNU General Public License (GPL)
11 12 http://www.gnu.org/licenses/gpl.txt
12 13 */
13 14
14 -/**
15 - * Autoptimize main plugin file.
16 - */
15 +if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
17 16
17 +define('AUTOPTIMIZE_PLUGIN_DIR',plugin_dir_path(__FILE__));
18 18
19 -if ( ! defined( 'ABSPATH' ) ) {
20 - exit;
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';
21 28 }
22 29
23 -define( 'AUTOPTIMIZE_PLUGIN_VERSION', '2.4.4' );
30 +// Do we gzip when caching (needed early to load autoptimizeCache.php)
31 +define('AUTOPTIMIZE_CACHE_NOGZIP',(bool) get_option('autoptimize_cache_nogzip'));
24 32
25 -// plugin_dir_path() returns the trailing slash!
26 -define( 'AUTOPTIMIZE_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
27 -define( 'AUTOPTIMIZE_PLUGIN_FILE', __FILE__ );
33 +// Load cache class
34 +include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeCache.php');
28 35
29 -// Bail early if attempting to run on non-supported php versions.
30 -if ( version_compare( PHP_VERSION, '5.3', '<' ) ) {
31 - function autoptimize_incompatible_admin_notice() {
32 - echo '<div class="error"><p>' . __( 'Autoptimize requires PHP 5.3 (or higher) to function properly. Please upgrade PHP. The Plugin has been auto-deactivated.', 'autoptimize' ) . '</p></div>';
33 - if ( isset( $_GET['activate'] ) ) {
34 - unset( $_GET['activate'] );
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',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',WP_CONTENT_DIR));
50 +
51 +// Initialize the cache at least once
52 +$conf = autoptimizeConfig::instance();
53 +
54 +/* Check if we're updating, in which case we might need to do stuff and flush the cache
55 +to avoid old versions of aggregated files lingering around */
56 +
57 +$autoptimize_version="2.1.0";
58 +$autoptimize_db_version=get_option('autoptimize_version','none');
59 +
60 +if ($autoptimize_db_version !== $autoptimize_version) {
61 + if ($autoptimize_db_version==="none") {
62 + add_action('admin_notices', 'autoptimize_install_config_notice');
63 + } else {
64 + // updating, include the update-code
65 + include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeUpdateCode.php');
66 + }
67 +
68 + update_option('autoptimize_version',$autoptimize_version);
69 + $autoptimize_db_version=$autoptimize_version;
70 +}
71 +
72 +// Load translations
73 +function autoptimize_load_plugin_textdomain() {
74 + load_plugin_textdomain('autoptimize',false,plugin_basename(dirname( __FILE__ )).'/localization');
75 +}
76 +add_action( 'init', 'autoptimize_load_plugin_textdomain' );
77 +
78 +function autoptimize_uninstall(){
79 + autoptimizeCache::clearall();
80 +
81 + $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_css_nogooglefont");
82 +
83 + if ( !is_multisite() ) {
84 + foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
85 + } else {
86 + global $wpdb;
87 + $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
88 + $original_blog_id = get_current_blog_id();
89 + foreach ( $blog_ids as $blog_id ) {
90 + switch_to_blog( $blog_id );
91 + foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
35 92 }
93 + switch_to_blog( $original_blog_id );
36 94 }
37 - function autoptimize_deactivate_self() {
38 - deactivate_plugins( plugin_basename( AUTOPTIMIZE_PLUGIN_FILE ) );
95 +
96 + if ( wp_get_schedule( 'ao_cachechecker' ) ) {
97 + wp_clear_scheduled_hook( 'ao_cachechecker' );
39 98 }
40 - add_action( 'admin_notices', 'autoptimize_incompatible_admin_notice' );
41 - add_action( 'admin_init', 'autoptimize_deactivate_self' );
42 - return;
43 99 }
44 100
45 -function autoptimize_autoload( $class_name ) {
46 - if ( in_array( $class_name, array( 'Minify_HTML', 'JSMin' ) ) ) {
47 - $file = strtolower( $class_name );
48 - $file = str_replace( '_', '-', $file );
49 - $path = dirname( __FILE__ ) . '/classes/external/php/';
50 - $filepath = $path . $file . '.php';
51 - } elseif ( false !== strpos( $class_name, 'Autoptimize\\tubalmartin\\CssMin' ) ) {
52 - $file = str_replace( 'Autoptimize\\tubalmartin\\CssMin\\', '', $class_name );
53 - $path = dirname( __FILE__ ) . '/classes/external/php/yui-php-cssmin-bundled/';
54 - $filepath = $path . $file . '.php';
55 - } elseif ( 'autoptimize' === substr( $class_name, 0, 11 ) ) {
56 - // One of our "old" classes.
57 - $file = $class_name;
58 - $path = dirname( __FILE__ ) . '/classes/';
59 - $filepath = $path . $file . '.php';
60 - } elseif ( 'PAnD' === $class_name ) {
61 - $file = 'persist-admin-notices-dismissal';
62 - $path = dirname( __FILE__ ) . '/classes/external/php/persist-admin-notices-dismissal/';
63 - $filepath = $path . $file . '.php';
101 +function autoptimize_install_config_notice() {
102 + echo '<div class="updated"><p>';
103 + _e('Thank you for installing and activating Autoptimize. Please configure it under "Settings" -> "Autoptimize" to start improving your site\'s performance.', 'autoptimize' );
104 + echo '</p></div>';
105 +}
106 +
107 +function autoptimize_update_config_notice() {
108 + echo '<div class="updated"><p>';
109 + _e('Autoptimize has just been updated. Please <strong>test your site now</strong> and adapt Autoptimize config if needed.', 'autoptimize' );
110 + echo '</p></div>';
111 +}
112 +
113 +function autoptimize_cache_unavailable_notice() {
114 + echo '<div class="error"><p>';
115 + _e('Autoptimize cannot write to the cache directory (default: /wp-content/cache/autoptimize), please fix to enable CSS/ JS optimization!', 'autoptimize' );
116 + echo '</p></div>';
117 +}
118 +
119 +// Set up the buffering
120 +function autoptimize_start_buffering() {
121 + $ao_noptimize = false;
122 +
123 + // noptimize in qs to get non-optimized page for debugging
124 + if (array_key_exists("ao_noptimize",$_GET)) {
125 + if ( ($_GET["ao_noptimize"]==="1") && (apply_filters('autoptimize_filter_honor_qs_noptimize',true)) ) {
126 + $ao_noptimize = true;
127 + }
64 128 }
65 129
66 - // If we didn't match one of our rules, bail!
67 - if ( ! isset( $filepath ) ) {
68 - return;
130 + // check for DONOTMINIFY constant as used by e.g. WooCommerce POS
131 + if (defined('DONOTMINIFY') && (constant('DONOTMINIFY')===true || constant('DONOTMINIFY')==="true")) {
132 + $ao_noptimize = true;
69 133 }
70 134
71 - require $filepath;
135 + // filter you can use to block autoptimization on your own terms
136 + $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
137 +
138 + if (!is_feed() && !$ao_noptimize && !is_admin() && ( !function_exists('is_customize_preview') || !is_customize_preview() ) ) {
139 + // Config element
140 + $conf = autoptimizeConfig::instance();
141 +
142 + // Load our base class
143 + include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeBase.php');
144 +
145 + // Load extra classes and set some vars
146 + if($conf->get('autoptimize_html')) {
147 + include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeHTML.php');
148 + // BUG: new minify-html does not support keeping HTML comments, skipping for now
149 + // if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
150 + @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-html.php');
151 + // } else {
152 + // @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-html.php');
153 + // }
154 + }
155 +
156 + if($conf->get('autoptimize_js')) {
157 + include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeScripts.php');
158 + if (!class_exists('JSMin')) {
159 + if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
160 + @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/jsmin-1.1.1.php');
161 + } else {
162 + @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.3.1-jsmin.php');
163 + }
164 + }
165 + if ( ! defined( 'CONCATENATE_SCRIPTS' )) {
166 + define('CONCATENATE_SCRIPTS',false);
167 + }
168 + if ( ! defined( 'COMPRESS_SCRIPTS' )) {
169 + define('COMPRESS_SCRIPTS',false);
170 + }
171 + }
172 +
173 + if($conf->get('autoptimize_css')) {
174 + include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeStyles.php');
175 + if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
176 + if (!class_exists('Minify_CSS_Compressor')) {
177 + @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-css-compressor.php');
178 + }
179 + } else {
180 + if (!class_exists('CSSmin')) {
181 + @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/yui-php-cssmin-2.4.8-4_fgo.php');
182 + }
183 + }
184 + if ( ! defined( 'COMPRESS_CSS' )) {
185 + define('COMPRESS_CSS',false);
186 + }
187 + }
188 +
189 + // filter to be used with care, kills all output buffers when true. use with extreme caution. you have been warned!
190 + if (apply_filters('autoptimize_filter_obkiller',false)) {
191 + while (ob_get_level() > 0) {
192 + ob_end_clean();
193 + }
194 + }
195 +
196 + // Now, start the real thing!
197 + ob_start('autoptimize_end_buffering');
198 + }
72 199 }
73 200
74 -spl_autoload_register( 'autoptimize_autoload' );
201 +// Action on end, this is where the magic happens
202 +function autoptimize_end_buffering($content) {
203 + if ( ((stripos($content,"<html") === false) && (stripos($content,"<!DOCTYPE html") === false)) || preg_match('/<html[^>]*(?:amp|âš¡)/',$content) === 1 || stripos($content,"<xsl:stylesheet") !== false ) { return $content; }
204 +
205 + // load URL constants as late as possible to allow domain mapper to kick in
206 + if (function_exists("domain_mapping_siteurl")) {
207 + define('AUTOPTIMIZE_WP_SITE_URL',domain_mapping_siteurl(get_current_blog_id()));
208 + define('AUTOPTIMIZE_WP_CONTENT_URL',str_replace(get_original_url(AUTOPTIMIZE_WP_SITE_URL),AUTOPTIMIZE_WP_SITE_URL,content_url()));
209 + } else {
210 + define('AUTOPTIMIZE_WP_SITE_URL',site_url());
211 + define('AUTOPTIMIZE_WP_CONTENT_URL',content_url());
212 + }
75 213
76 -// Load WP CLI command(s) on demand.
77 -if ( defined( 'WP_CLI' ) && WP_CLI ) {
78 - require AUTOPTIMIZE_PLUGIN_DIR . 'classes/autoptimizeCLI.php';
79 -}
214 + if ( is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true ) ) {
215 + $blog_id = get_current_blog_id();
216 + define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
217 + } else {
218 + define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR);
219 + }
220 + define('AUTOPTIMIZE_WP_ROOT_URL',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',AUTOPTIMIZE_WP_CONTENT_URL));
221 + define('AUTOPTIMIZE_HASH',wp_hash(AUTOPTIMIZE_CACHE_DIR . DB_HOST . DB_USER . DB_PASSWORD));
80 222
81 -/**
82 - * Retrieve the instance of the main plugin class.
83 - *
84 - * @return autoptimizeMain
85 - */
86 -function autoptimize() {
87 - static $plugin = null;
223 + // Config element
224 + $conf = autoptimizeConfig::instance();
88 225
89 - if ( null === $plugin ) {
90 - $plugin = new autoptimizeMain( AUTOPTIMIZE_PLUGIN_VERSION, AUTOPTIMIZE_PLUGIN_FILE );
226 + // Choose the classes
227 + $classes = array();
228 + if($conf->get('autoptimize_js'))
229 + $classes[] = 'autoptimizeScripts';
230 + if($conf->get('autoptimize_css'))
231 + $classes[] = 'autoptimizeStyles';
232 + if($conf->get('autoptimize_html'))
233 + $classes[] = 'autoptimizeHTML';
234 +
235 + // Set some options
236 + $classoptions = array(
237 + 'autoptimizeScripts' => array(
238 + 'justhead' => $conf->get('autoptimize_js_justhead'),
239 + 'forcehead' => $conf->get('autoptimize_js_forcehead'),
240 + 'trycatch' => $conf->get('autoptimize_js_trycatch'),
241 + 'js_exclude' => $conf->get('autoptimize_js_exclude'),
242 + 'cdn_url' => $conf->get('autoptimize_cdn_url'),
243 + 'include_inline' => $conf->get('autoptimize_js_include_inline')
244 + ),
245 + 'autoptimizeStyles' => array(
246 + 'justhead' => $conf->get('autoptimize_css_justhead'),
247 + 'datauris' => $conf->get('autoptimize_css_datauris'),
248 + 'defer' => $conf->get('autoptimize_css_defer'),
249 + 'defer_inline' => $conf->get('autoptimize_css_defer_inline'),
250 + 'inline' => $conf->get('autoptimize_css_inline'),
251 + 'css_exclude' => $conf->get('autoptimize_css_exclude'),
252 + 'cdn_url' => $conf->get('autoptimize_cdn_url'),
253 + 'include_inline' => $conf->get('autoptimize_css_include_inline'),
254 + 'nogooglefont' => $conf->get('autoptimize_css_nogooglefont')
255 + ),
256 + 'autoptimizeHTML' => array(
257 + 'keepcomments' => $conf->get('autoptimize_html_keepcomments')
258 + )
259 + );
260 +
261 + $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
262 +
263 + // Run the classes
264 + foreach($classes as $name) {
265 + $instance = new $name($content);
266 + if($instance->read($classoptions[$name])) {
267 + $instance->minify();
268 + $instance->cache();
269 + $content = $instance->getcontent();
270 + }
271 + unset($instance);
91 272 }
273 +
274 + $content = apply_filters( 'autoptimize_html_after_minify', $content );
275 + return $content;
276 +}
92 277
93 - return $plugin;
278 +if ( autoptimizeCache::cacheavail() ) {
279 + $conf = autoptimizeConfig::instance();
280 + if( $conf->get('autoptimize_html') || $conf->get('autoptimize_js') || $conf->get('autoptimize_css') ) {
281 + // Hook to wordpress
282 + if (defined('AUTOPTIMIZE_INIT_EARLIER')) {
283 + add_action('init','autoptimize_start_buffering',-1);
284 + } else {
285 + add_action('template_redirect','autoptimize_start_buffering',2);
286 + }
287 + }
288 +} else {
289 + add_action('admin_notices', 'autoptimize_cache_unavailable_notice');
94 290 }
95 291
96 -autoptimize()->run();
292 +register_uninstall_hook(__FILE__, "autoptimize_uninstall");
293 +include_once('classlesses/autoptimizeCacheChecker.php');
294 +
295 +// Do not pollute other plugins
296 +unset($conf);