PageRenderTime 47ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/autoptimize/autoptimize.php

https://bitbucket.org/viruscommdev/jboivinavocat
PHP | 333 lines | 232 code | 50 blank | 51 comment | 73 complexity | 7c7c8ed69ea051a3e480c8610e97e403 MD5 | raw file
Possible License(s): GPL-3.0, GPL-2.0, MIT, Apache-2.0
  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. */
  14. if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
  15. define('AUTOPTIMIZE_PLUGIN_DIR',plugin_dir_path(__FILE__));
  16. // Load config class
  17. include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeConfig.php');
  18. // Load toolbar class
  19. include( AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeToolbar.php' );
  20. // Load partners tab if admin
  21. if (is_admin()) {
  22. include AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizePartners.php';
  23. }
  24. // Do we gzip when caching (needed early to load autoptimizeCache.php)
  25. define('AUTOPTIMIZE_CACHE_NOGZIP',(bool) get_option('autoptimize_cache_nogzip'));
  26. // Load cache class
  27. include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeCache.php');
  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. // Plugin dir constants (plugin url's defined later to accomodate domain mapped sites)
  33. if (is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true )) {
  34. $blog_id = get_current_blog_id();
  35. define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
  36. } else {
  37. define('AUTOPTIMIZE_CACHE_DIR', WP_CONTENT_DIR.AUTOPTIMIZE_CACHE_CHILD_DIR);
  38. }
  39. define('AUTOPTIMIZE_CACHE_DELAY',true);
  40. define('WP_ROOT_DIR',substr(WP_CONTENT_DIR, 0, strlen(WP_CONTENT_DIR)-strlen(AUTOPTIMIZE_WP_CONTENT_NAME)));
  41. // WP CLI
  42. if ( defined( 'WP_CLI' ) && WP_CLI ) {
  43. require_once AUTOPTIMIZE_PLUGIN_DIR . 'classes/autoptimizeCLI.php';
  44. }
  45. // Initialize the cache at least once
  46. $conf = autoptimizeConfig::instance();
  47. /* Check if we're updating, in which case we might need to do stuff and flush the cache
  48. to avoid old versions of aggregated files lingering around */
  49. $autoptimize_version="2.3.0";
  50. $autoptimize_db_version=get_option('autoptimize_version','none');
  51. if ($autoptimize_db_version !== $autoptimize_version) {
  52. if ($autoptimize_db_version==="none") {
  53. add_action('admin_notices', 'autoptimize_install_config_notice');
  54. } else {
  55. // updating, include the update-code
  56. include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeUpdateCode.php');
  57. }
  58. update_option('autoptimize_version',$autoptimize_version);
  59. $autoptimize_db_version=$autoptimize_version;
  60. }
  61. // Load translations
  62. function autoptimize_load_plugin_textdomain() {
  63. load_plugin_textdomain('autoptimize',false,plugin_basename(dirname( __FILE__ )).'/localization');
  64. }
  65. add_action( 'init', 'autoptimize_load_plugin_textdomain' );
  66. function autoptimize_uninstall(){
  67. autoptimizeCache::clearall();
  68. $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");
  69. if ( !is_multisite() ) {
  70. foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
  71. } else {
  72. global $wpdb;
  73. $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs" );
  74. $original_blog_id = get_current_blog_id();
  75. foreach ( $blog_ids as $blog_id ) {
  76. switch_to_blog( $blog_id );
  77. foreach ($delete_options as $del_opt) { delete_option( $del_opt ); }
  78. }
  79. switch_to_blog( $original_blog_id );
  80. }
  81. if ( wp_get_schedule( 'ao_cachechecker' ) ) {
  82. wp_clear_scheduled_hook( 'ao_cachechecker' );
  83. }
  84. }
  85. function autoptimize_install_config_notice() {
  86. echo '<div class="updated"><p>';
  87. _e('Thank you for installing and activating Autoptimize. Please configure it under "Settings" -> "Autoptimize" to start improving your site\'s performance.', 'autoptimize' );
  88. echo '</p></div>';
  89. }
  90. function autoptimize_update_config_notice() {
  91. echo '<div class="updated"><p>';
  92. _e('Autoptimize has just been updated. Please <strong>test your site now</strong> and adapt Autoptimize config if needed.', 'autoptimize' );
  93. echo '</p></div>';
  94. }
  95. function autoptimize_cache_unavailable_notice() {
  96. echo '<div class="error"><p>';
  97. printf( __( 'Autoptimize cannot write to the cache directory (%s), please fix to enable CSS/ JS optimization!', 'autoptimize' ), AUTOPTIMIZE_CACHE_DIR );
  98. echo '</p></div>';
  99. }
  100. // Set up the buffering
  101. function autoptimize_start_buffering() {
  102. $ao_noptimize = false;
  103. // noptimize in qs to get non-optimized page for debugging
  104. if (array_key_exists("ao_noptimize",$_GET) || array_key_exists("ao_noptirocket",$_GET)) {
  105. if ( ( ($_GET["ao_noptimize"]==="1") || ($_GET["ao_noptirocket"]==="1") ) && (apply_filters('autoptimize_filter_honor_qs_noptimize',true)) ) {
  106. $ao_noptimize = true;
  107. }
  108. }
  109. // check for DONOTMINIFY constant as used by e.g. WooCommerce POS
  110. if (defined('DONOTMINIFY') && (constant('DONOTMINIFY')===true || constant('DONOTMINIFY')==="true")) {
  111. $ao_noptimize = true;
  112. }
  113. // if setting says not to optimize logged in user and user is logged in
  114. if ( get_option('autoptimize_optimize_logged','on') !== 'on' && is_user_logged_in() && current_user_can('edit_posts') ) {
  115. $ao_noptimize = true;
  116. }
  117. // if setting says not to optimize cart/ checkout
  118. if ( get_option('autoptimize_optimize_checkout','on') !== 'on' ) {
  119. // checking for woocommerce, easy digital downloads and wp ecommerce
  120. foreach ( array("is_checkout","is_cart","edd_is_checkout","wpsc_is_cart","wpsc_is_checkout") as $shopCond ) {
  121. if ( function_exists($shopCond) && $shopCond() ) {
  122. $ao_noptimize = true;
  123. break;
  124. }
  125. }
  126. }
  127. // filter you can use to block autoptimization on your own terms
  128. $ao_noptimize = (bool) apply_filters( 'autoptimize_filter_noptimize', $ao_noptimize );
  129. if (!is_feed() && !$ao_noptimize && !is_admin() && ( !function_exists('is_customize_preview') || !is_customize_preview() ) ) {
  130. // load speedupper conditionally (true by default?)
  131. if ( apply_filters('autoptimize_filter_speedupper', true) ) {
  132. include(AUTOPTIMIZE_PLUGIN_DIR.'classlesses/autoptimizeSpeedupper.php');
  133. }
  134. // Config element
  135. $conf = autoptimizeConfig::instance();
  136. // Load our base class
  137. include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeBase.php');
  138. // Load extra classes and set some vars
  139. if($conf->get('autoptimize_html')) {
  140. include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeHTML.php');
  141. // BUG: new minify-html does not support keeping HTML comments, skipping for now
  142. // if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
  143. @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-html.php');
  144. // } else {
  145. // @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.1.7-html.php');
  146. // }
  147. }
  148. if($conf->get('autoptimize_js')) {
  149. include(AUTOPTIMIZE_PLUGIN_DIR.'classes/autoptimizeScripts.php');
  150. if (!class_exists('JSMin')) {
  151. if (defined('AUTOPTIMIZE_LEGACY_MINIFIERS')) {
  152. @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/jsmin-1.1.1.php');
  153. } else {
  154. @include(AUTOPTIMIZE_PLUGIN_DIR.'classes/external/php/minify-2.3.1-jsmin.php');
  155. }
  156. }
  157. if ( ! defined( 'CONCATENATE_SCRIPTS' )) {
  158. define('CONCATENATE_SCRIPTS',false);
  159. }
  160. if ( ! defined( 'COMPRESS_SCRIPTS' )) {
  161. define('COMPRESS_SCRIPTS',false);
  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. // filter to be used with care, kills all output buffers when true. use with extreme caution. you have been warned!
  180. if (apply_filters('autoptimize_filter_obkiller',false)) {
  181. while (ob_get_level() > 0) {
  182. ob_end_clean();
  183. }
  184. }
  185. // Now, start the real thing!
  186. ob_start('autoptimize_end_buffering');
  187. }
  188. }
  189. // Action on end, this is where the magic happens
  190. function autoptimize_end_buffering($content) {
  191. if ( ((stripos($content,"<html") === false) && (stripos($content,"<!DOCTYPE html") === false)) || preg_match('/<html[^>]*(?:amp|⚡)/',$content) === 1 || stripos($content,"<xsl:stylesheet") !== false ) { return $content; }
  192. // load URL constants as late as possible to allow domain mapper to kick in
  193. if (function_exists("domain_mapping_siteurl")) {
  194. define('AUTOPTIMIZE_WP_SITE_URL',domain_mapping_siteurl(get_current_blog_id()));
  195. define('AUTOPTIMIZE_WP_CONTENT_URL',str_replace(get_original_url(AUTOPTIMIZE_WP_SITE_URL),AUTOPTIMIZE_WP_SITE_URL,content_url()));
  196. } else {
  197. define('AUTOPTIMIZE_WP_SITE_URL',site_url());
  198. define('AUTOPTIMIZE_WP_CONTENT_URL',content_url());
  199. }
  200. if ( is_multisite() && apply_filters( 'autoptimize_separate_blog_caches' , true ) ) {
  201. $blog_id = get_current_blog_id();
  202. define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR.$blog_id.'/' );
  203. } else {
  204. define('AUTOPTIMIZE_CACHE_URL',AUTOPTIMIZE_WP_CONTENT_URL.AUTOPTIMIZE_CACHE_CHILD_DIR);
  205. }
  206. define('AUTOPTIMIZE_WP_ROOT_URL',str_replace(AUTOPTIMIZE_WP_CONTENT_NAME,'',AUTOPTIMIZE_WP_CONTENT_URL));
  207. define('AUTOPTIMIZE_HASH',wp_hash(AUTOPTIMIZE_CACHE_DIR));
  208. // Config element
  209. $conf = autoptimizeConfig::instance();
  210. // Choose the classes
  211. $classes = array();
  212. if($conf->get('autoptimize_js'))
  213. $classes[] = 'autoptimizeScripts';
  214. if($conf->get('autoptimize_css'))
  215. $classes[] = 'autoptimizeStyles';
  216. if($conf->get('autoptimize_html'))
  217. $classes[] = 'autoptimizeHTML';
  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. $content = apply_filters( 'autoptimize_filter_html_before_minify', $content );
  244. // Run the classes
  245. foreach($classes as $name) {
  246. $instance = new $name($content);
  247. if($instance->read($classoptions[$name])) {
  248. $instance->minify();
  249. $instance->cache();
  250. $content = $instance->getcontent();
  251. }
  252. unset($instance);
  253. }
  254. $content = apply_filters( 'autoptimize_html_after_minify', $content );
  255. return $content;
  256. }
  257. if ( autoptimizeCache::cacheavail() ) {
  258. $conf = autoptimizeConfig::instance();
  259. if( $conf->get('autoptimize_html') || $conf->get('autoptimize_js') || $conf->get('autoptimize_css') ) {
  260. // Hook to wordpress
  261. if (defined('AUTOPTIMIZE_INIT_EARLIER')) {
  262. add_action('init','autoptimize_start_buffering',-1);
  263. } else {
  264. if (!defined('AUTOPTIMIZE_HOOK_INTO')) { define('AUTOPTIMIZE_HOOK_INTO', 'template_redirect'); }
  265. add_action(constant("AUTOPTIMIZE_HOOK_INTO"),'autoptimize_start_buffering',2);
  266. }
  267. }
  268. } else {
  269. add_action('admin_notices', 'autoptimize_cache_unavailable_notice');
  270. }
  271. function autoptimize_activate() {
  272. register_uninstall_hook( __FILE__, 'autoptimize_uninstall' );
  273. }
  274. register_activation_hook( __FILE__, 'autoptimize_activate' );
  275. include_once('classlesses/autoptimizeCacheChecker.php');
  276. add_action('plugins_loaded','includeAutoptimizeExtra');
  277. function includeAutoptimizeExtra() {
  278. if ( apply_filters('autoptimize_filter_extra_activate',true) ) {
  279. include_once('classlesses/autoptimizeExtra.php');
  280. }
  281. }
  282. // Do not pollute other plugins
  283. unset($conf);