PluginProbe
Autoptimize / 2.0.1
Autoptimize v2.0.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.0.1, at autoptimize.php

279 lines 10.7 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.0.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 // Do we gzip when caching (needed early to load autoptimizeCache.php)
23 define('AUTOPTIMIZE_CACHE_NOGZIP',(bool) get_option('autoptimize_cache_nogzip'));
24
25 // Load cache class
26 include(AUTOPTIMIZE_PLUGIN_DIR.'/classes/autoptimizeCache.php');
27
28 // 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
29 if (!defined('AUTOPTIMIZE_WP_CONTENT_NAME')) { define('AUTOPTIMIZE_WP_CONTENT_NAME','/'.wp_basename( WP_CONTENT_DIR )); }
30 if (!defined('AUTOPTIMIZE_CACHE_CHILD_DIR')) { define('AUTOPTIMIZE_CACHE_CHILD_DIR','/cache/autoptimize/'); }
31 if (!defined('AUTOPTIMIZE_CACHEFILE_PREFIX')) { define('AUTOPTIMIZE_CACHEFILE_PREFIX', 'autoptimize_'); }
32
33 // Plugin dir constants (plugin url's defined later to accomodate domain mapped sites)
34 if (is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true )) {
35 $blog_id = get_current_blog_id();
36 define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
37 } else {
38 define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR);
39 }
40 define('AUTOPTIMIZE_CACHE_DELAY',true);
41 define('WP_ROOT_DIR',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',WP_CONTENT_DIR));
42
43 // Initialize the cache at least once
44 $conf = autoptimizeConfig::instance();
45
46 /* Check if we're updating, in which case we might need to do stuff and flush the cache
47 to avoid old versions of aggregated files lingering around */
48
49 $autoptimize_version="2.0.0";
50 $autoptimize_db_version=get_option('autoptimize_version','none');
51
52 if ($autoptimize_db_version !== $autoptimize_version) {
53 if ($autoptimize_db_version==="none") {
54 add_action('admin_notices', 'autoptimize_install_config_notice');
55 } else {
56 // updating, include the update-code
57 include(AUTOPTIMIZE_PLUGIN_DIR.'/classlesses/autoptimizeUpdateCode.php');
58 }
59
60 update_option('autoptimize_version',$autoptimize_version);
61 $autoptimize_db_version=$autoptimize_version;
62 }
63
64 // Load translations
65 load_plugin_textdomain('autoptimize',false,plugin_basename(dirname( __FILE__ )).'/localization');
66
67 function autoptimize_uninstall(){
68 autoptimizeCache::clearall();
69
70 $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");
71
72 if ( !is_multisite() ) {
73 foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
74 } else {
75 global $wpdb;
76 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
77 $original_blog_id = get_current_blog_id();
78 foreach ( $blog_ids as $blog_id )
79 {
80 switch_to_blog( $blog_id );
81 foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
82 }
83 switch_to_blog( $original_blog_id );
84 }
85
86 if ( wp_get_schedule( 'ao_cachechecker' ) ) {
87 wp_clear_scheduled_hook( 'ao_cachechecker' );
88 }
89 }
90
91 function autoptimize_install_config_notice() {
92 echo '<div class="updated"><p>';
93 _e('Thank you for installing and activating Autoptimize. Please configure it under "Settings" -> "Autoptimize" to start improving your site\'s performance.', 'autoptimize' );
94 echo '</p></div>';
95 }
96
97 function autoptimize_update_config_notice() {
98 echo '<div class="updated"><p>';
99 _e('Autoptimize has just been updated. Please <strong>test your site now</strong> and adapt Autoptimize config if needed.', 'autoptimize' );
100 echo '</p></div>';
101 }
102
103 function autoptimize_cache_unavailable_notice() {
104 echo '<div class="error"><p>';
105 _e('Autoptimize cannot write to the cache directory (default: /wp-content/cache/autoptimize), please fix to enable CSS/ JS optimization!', 'autoptimize' );
106 echo '</p></div>';
107 }
108
109
110 // Set up the buffering
111 function autoptimize_start_buffering() {
112 $ao_noptimize = false;
113
114 // noptimize in qs to get non-optimized page for debugging
115 if (array_key_exists("ao_noptimize",$_GET)) {
116 if ( ($_GET["ao_noptimize"]==="1") && (apply_filters('autoptimize_filter_honor_qs_noptimize',true)) ) {
117 $ao_noptimize = true;
118 }
119 }
120
121 // check for DONOTMINIFY constant as used by e.g. WooCommerce POS
122 if (defined('DONOTMINIFY') && (constant('DONOTMINIFY')===true || constant('DONOTMINIFY')==="true")) {
123 $ao_noptimize = true;
124 }
125
126 // filter you can use to block autoptimization on your own terms
127 $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
128
129 if (!is_feed() && !$ao_noptimize && !is_admin()) {
130 // Config element
131 $conf = autoptimizeConfig::instance();
132
133 // Load our base class
134 include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeBase.php');
135
136 // Load extra classes and set some vars
137 if($conf->get('autoptimize_html')) {
138 include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeHTML.php');
139 // BUG: new minify-html does not support keeping HTML comments, skipping for now
140 // if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
141 @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-html.php');
142 // } else {
143 // @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-html.php');
144 // }
145 }
146
147 if($conf->get('autoptimize_js')) {
148 include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeScripts.php');
149 if (!class_exists('JSMin')) {
150 if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
151 @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/jsmin-1.1.1.php');
152 } else {
153 @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-jsmin.php');
154 }
155 }
156 if ( ! defined( 'CONCATENATE_SCRIPTS' )) {
157 define('CONCATENATE_SCRIPTS',false);
158 }
159 if ( ! defined( 'COMPRESS_SCRIPTS' )) {
160 define('COMPRESS_SCRIPTS',false);
161 }
162 }
163
164 if($conf->get('autoptimize_css')) {
165 include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeStyles.php');
166 if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
167 if (!class_exists('Minify_CSS_Compressor')) {
168 @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-css-compressor.php');
169 }
170 } else {
171 if (!class_exists('CSSmin')) {
172 @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/yui-php-cssmin-2.4.8-4_fgo.php');
173 }
174 }
175 if ( ! defined( 'COMPRESS_CSS' )) {
176 define('COMPRESS_CSS',false);
177 }
178 }
179
180 // Now, start the real thing!
181 ob_start('autoptimize_end_buffering');
182 }
183 }
184
185 // Action on end, this is where the magic happens
186 function autoptimize_end_buffering($content) {
187 if ( stripos($content,"<html") === false || stripos($content,"<html amp") !== false || stripos($content,"<html âš¡") !== false ||stripos($content,"<xsl:stylesheet") !== false ) { return $content;}
188
189 // load URL constants as late as possible to allow domain mapper to kick in
190 if (function_exists("domain_mapping_siteurl")) {
191 define('AUTOPTIMIZE_WP_SITE_URL',domain_mapping_siteurl(get_current_blog_id()));
192 define('AUTOPTIMIZE_WP_CONTENT_URL',str_replace(get_original_url(AUTOPTIMIZE_WP_SITE_URL),AUTOPTIMIZE_WP_SITE_URL,content_url()));
193 } else {
194 define('AUTOPTIMIZE_WP_SITE_URL',site_url());
195 define('AUTOPTIMIZE_WP_CONTENT_URL',content_url());
196 }
197
198 if ( is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true ) ) {
199 $blog_id = get_current_blog_id();
200 define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
201 } else {
202 define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR);
203 }
204 define('AUTOPTIMIZE_WP_ROOT_URL',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',AUTOPTIMIZE_WP_CONTENT_URL));
205
206 // Config element
207 $conf = autoptimizeConfig::instance();
208
209 // Choose the classes
210 $classes = array();
211 if($conf->get('autoptimize_js'))
212 $classes[] = 'autoptimizeScripts';
213 if($conf->get('autoptimize_css'))
214 $classes[] = 'autoptimizeStyles';
215 if($conf->get('autoptimize_html'))
216 $classes[] = 'autoptimizeHTML';
217
218 // Set some options
219 $classoptions = array(
220 'autoptimizeScripts' => array(
221 'justhead' => $conf->get('autoptimize_js_justhead'),
222 'forcehead' => $conf->get('autoptimize_js_forcehead'),
223 'trycatch' => $conf->get('autoptimize_js_trycatch'),
224 'js_exclude' => $conf->get('autoptimize_js_exclude'),
225 'cdn_url' => $conf->get('autoptimize_cdn_url'),
226 'include_inline' => $conf->get('autoptimize_js_include_inline')
227 ),
228 'autoptimizeStyles' => array(
229 'justhead' => $conf->get('autoptimize_css_justhead'),
230 'datauris' => $conf->get('autoptimize_css_datauris'),
231 'defer' => $conf->get('autoptimize_css_defer'),
232 'defer_inline' => $conf->get('autoptimize_css_defer_inline'),
233 'inline' => $conf->get('autoptimize_css_inline'),
234 'css_exclude' => $conf->get('autoptimize_css_exclude'),
235 'cdn_url' => $conf->get('autoptimize_cdn_url'),
236 'include_inline' => $conf->get('autoptimize_css_include_inline'),
237 'nogooglefont' => $conf->get('autoptimize_css_nogooglefont')
238 ),
239 'autoptimizeHTML' => array(
240 'keepcomments' => $conf->get('autoptimize_html_keepcomments')
241 )
242 );
243
244 $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
245 // Run the classes
246 foreach($classes as $name) {
247 $instance = new $name($content);
248 if($instance->read($classoptions[$name]))
249 {
250 $instance->minify();
251 $instance->cache();
252 $content = $instance->getcontent();
253 }
254 unset($instance);
255 }
256 $content = apply_filters( 'autoptimize_html_after_minify', $content );
257 return $content;
258 }
259
260 if ( autoptimizeCache::cacheavail() ) {
261 $conf = autoptimizeConfig::instance();
262 if( $conf->get('autoptimize_html') || $conf->get('autoptimize_js') || $conf->get('autoptimize_css') ) {
263 // Hook to wordpress
264 if (defined('AUTOPTIMIZE_INIT_EARLIER')) {
265 add_action('init','autoptimize_start_buffering',-1);
266 } else {
267 add_action('template_redirect','autoptimize_start_buffering',2);
268 }
269 }
270 } else {
271 add_action('admin_notices', 'autoptimize_cache_unavailable_notice');
272 }
273
274 register_uninstall_hook(__FILE__, "autoptimize_uninstall");
275 include_once('classlesses/autoptimizeCacheChecker.php');
276
277 // Do not pollute other plugins
278 unset($conf);
279