PluginProbe
Autoptimize / 2.1.1
Autoptimize v2.1.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 / autoptimize.php

autoptimize.php in Autoptimize 2.1.1, at autoptimize.php

297 lines 12.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Plugin Name: Autoptimize
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.1
7 Author: Frank Goossens (futtta)
8 Author URI: http://blog.futtta.be/
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 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 ); }
92 }
93 switch_to_blog( $original_blog_id );
94 }
95
96 if ( wp_get_schedule( 'ao_cachechecker' ) ) {
97 wp_clear_scheduled_hook( 'ao_cachechecker' );
98 }
99 }
100
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 }
128 }
129
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;
133 }
134
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 }
199 }
200
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 }
213
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_URL.microtime()));
222
223 // Config element
224 $conf = autoptimizeConfig::instance();
225
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);
272 }
273
274 $content = apply_filters( 'autoptimize_html_after_minify', $content );
275 return $content;
276 }
277
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');
290 }
291
292 register_uninstall_hook(__FILE__, "autoptimize_uninstall");
293 include_once('classlesses/autoptimizeCacheChecker.php');
294
295 // Do not pollute other plugins
296 unset($conf);
297