aeh_debug = true;
$this->cachepath = $this->aeh_cachepath();
$this->inddir = $this->cachepath['inddir'];
$this->cachedir = $this->cachepath['cachedir'];
$this->cachedirurl = $this->cachepath['cachedirurl'];
$this->site_home = site_url();
$this->domain = trim(str_ireplace(array('http://', 'https://'), '', trim($this->site_home, '/')));
$this->settings = AEH_Settings::get_instance();
$this->aeh_ignore = $this->settings->expires_headers_minify_default_excludes;
$this->pb_keywords = $this->settings->expires_headers_minify_pb_keywords;
$this->minify_settings = get_option('aeh_expires_headers_minify_settings',$this->settings->init_minify_default());
if(!empty($this->minify_settings['escape_minify'])){
$escape_string = preg_replace('/\s+/', '', $this->minify_settings['escape_minify']);
$escape_string = rtrim($escape_string,',');
$escape_array = explode (',', $escape_string);
if(!empty($escape_array) && is_array($escape_array)){
$this->aeh_ignore = array_unique (array_merge ($this->aeh_ignore, $escape_array));
}
}
$this->aeh_cache_update_time = get_option('aeh-last-cache-update', '0');
if(is_admin()) {
add_action('upgrader_process_complete',array( $this, 'aeh_purge_minify'));
add_action('after_switch_theme', array( $this,'aeh_purge_minify'));
add_action('deactivated_plugin',array( $this,'aeh_purge_minify'));
add_action('activated_plugin',array( $this,'aeh_purge_minify'));
add_action('admin_init', array( $this,'aeh_purge_minify_on_update'),1);
add_action( 'admin_bar_menu',array( $this, 'aeh_admin_minify_purge_link'), 100 );
}else{
add_action('setup_theme', array( $this,'aeh_minification') );
}
}
/* exclude ceratin data operations mostly associated with wp and wc */
public function aeh_ignore_operations() {
if(isset($_SERVER['REQUEST_URI']) && stripos($_SERVER['REQUEST_URI'], '/wp-admin/') !== false) {
return true;
}
if ((function_exists('is_checkout') && is_checkout() === true) || is_feed() || is_admin() || is_preview() || is_customize_preview() || wp_doing_ajax()) {
return true;
}
if(is_array($_GET)) {
foreach ($_GET as $k=>$v) {
if(is_string($v) && is_string($k)) {
if(isset($this->pb_keywords) && !empty($this->pb_keywords) && is_array($this->pb_keywords)){
foreach($this->pb_keywords as $pb_keyword){
if(stripos($k, $pb_keyword) !== false || stripos($v, $pb_keyword) !== false) {
return true;
}
}
}
}
}
}
return false;
}
/* creating buffering before compression of html */
public function aeh_min_html_compression_start(){
if ($this->aeh_ignore_operations()) {
return;
}
ob_start(array($this,'aeh_min_html_compression_finish'));
}
/* Uses third party solution for html minification */
public function aeh_min_html_compression_finish($html){
return Mrclay_Minify_HTML::minify($html);
}
/* creating admin toolbar link to purge minify and external cache */
public function aeh_admin_minify_purge_link(){
if(current_user_can('manage_options')) {
global $wp_admin_bar;
$wp_admin_bar->add_node(array(
'id' => 'aeh',
'title' => 'AEH Purge Minify',
'href' => wp_nonce_url( add_query_arg('_aehcache', 'clear'), 'aeh_purge_nonce')
));
}
}
/* frontend minification hooks at work */
public function aeh_minification(){
if( current_user_can('editor') || current_user_can('administrator') ) {
if(isset($this->minify_settings['escape_admin'])){
return;
}
}
if(!$this->aeh_ignore_operations()) {
if(isset($this->minify_settings['process_css'])){
add_action('wp_print_styles',array( $this, 'aeh_merge_min_css_header'), PHP_INT_MAX );
add_action('wp_print_footer_scripts',array( $this, 'aeh_merge_min_css_footer'), 9.99999999 );
}
if(isset($this->minify_settings['min_html'])){
add_action('template_redirect', array( $this, 'aeh_min_html_compression_start'), PHP_INT_MAX);
}
add_filter( 'style_loader_tag', array( $this,'aeh_min_async_css'), 10, 3 );
}
}
public function aeh_min_async_css($tag, $handle, $src) {
$tag = trim($tag);
if (stripos($src, '?ver') !== false) {
$srcf = stristr($src, '?ver', true);
$tag = str_ireplace($src, $srcf, $tag);
$src = $srcf;
}
if($this->aeh_ignore_operations()) {
return $tag;
}
if (!isset($this->minify_settings['async_css'])) {
return $tag;
}
if ($this->aeh_is_local_domain($src) !== true) {
return $tag;
}
if (stripos($tag, PHP_EOL) !== false || stripos($tag, 'navigator.userAgent.match') !== false) {
return $tag;
}
if(stripos($_SERVER["SCRIPT_NAME"], strrchr(wp_login_url(), '/')) !== false){
return $tag;
}
if (stripos($tag, 'defer') === false && stripos($tag, 'async') === false) {
$cssasync = str_replace( 'rel=\'stylesheet\' ','rel=\'preload\' as=\'style\' onload=\'this.rel="stylesheet"\' ',$tag);
array_filter($this->aeh_ignore, function ($var) { return (stripos($var, '/cache/') === false); });
if(isset($this->minify_settings['async_css'])) {
if(count($this->aeh_ignore) > 0 && $this->aeh_array_check($src, $this->aeh_ignore)) {
return $tag;
} else {
return $cssasync;
}
}
}
return $tag;
}
public function aeh_get_styles(){
global $wp_styles;
if(!is_object($wp_styles)) {
return false;
}
$styles = wp_clone($wp_styles);
return $styles;
}
public function aeh_merge_min_css_header(){
global $wp_styles;
$styles = $this->aeh_get_styles();
if($styles == false){
return false;
}
$styles->all_deps($styles->queue);
$done = $styles->done;
$google_fonts = array();
$aeh_min_source = array();
$aeh_no_dup = array();
foreach( $styles->to_do as $handle):
$conditional = NULL;
if(isset($wp_styles->registered[$handle]->extra["conditional"])) {
$conditional = $wp_styles->registered[$handle]->extra["conditional"];
}
$type_of_media = isset($wp_styles->registered[$handle]->args) ? $wp_styles->registered[$handle]->args : 'all';
if ($type_of_media == 'screen' || $type_of_media == 'screen, print' || empty($type_of_media) || is_null($type_of_media) || $type_of_media == false) { $type_of_media = 'all'; }
$mediatype = $type_of_media;
$aeh_handle_url = $this->aeh_get_handle_url($wp_styles->registered[$handle]->src);
if( empty($aeh_handle_url)) {
continue;
}
if(!empty($aeh_handle_url)) {
$key = hash('sha1', $aeh_handle_url);
if (isset($aeh_no_dup[$key])) {
$done = array_merge($done, array($handle));
continue;
} else {
$aeh_no_dup[$key] = $handle;
}
}
$aeh_min_source[$handle] = array('handle'=>$handle, 'url'=>$aeh_handle_url, 'conditional'=>$conditional, 'mediatype'=>$mediatype);
if (stripos($aeh_handle_url, 'fonts.googleapis.com') !== false) {
if(isset($this->minify_settings['inline_gfonts'])) {
$google_fonts[$handle] = $aeh_handle_url;
}else {
wp_enqueue_style($handle);
}
continue;
}
endforeach;
if(isset($this->minify_settings['inline_gfonts']) && count($google_fonts) > 0){
$done = $this->aeh_inline_gfonts($google_fonts,$done,'processed-header');
}
$aeh_header_urls = $this->aeh_fecth_min_urls($done,$styles,$google_fonts,$aeh_min_source);
$done = $this->aeh_process_min_urls($aeh_header_urls,'processed-header',$done);
$wp_styles->done = $done;
}
public function aeh_merge_min_css_footer() {
global $wp_styles;
$styles = $this->aeh_get_styles();
if($styles == false){
return false;
}
$styles->all_deps($styles->queue);
$done = $styles->done;
$google_fonts = array();
$aeh_min_source = array();
$aeh_no_dup = array();
foreach( $styles->to_do as $handle ) :
$conditional = NULL;
if(isset($wp_styles->registered[$handle]->extra["conditional"])) {
$conditional = $wp_styles->registered[$handle]->extra["conditional"];
}
$type_of_media = isset($wp_styles->registered[$handle]->args) ? $wp_styles->registered[$handle]->args : 'all';
if ($type_of_media == 'screen' || $type_of_media == 'screen, print' || empty($type_of_media) || is_null($type_of_media) || $type_of_media == false) {
$type_of_media = 'all';
}
$mediatype = $type_of_media;
$aeh_handle_url = $this->aeh_get_handle_url($wp_styles->registered[$handle]->src);
if( empty($aeh_handle_url)) {
continue;
}
if(!empty($aeh_handle_url)) {
$key = hash('sha1', $aeh_handle_url);
if (isset($aeh_no_dup[$key])) {
$done = array_merge($done, array($handle));
continue;
} else {
$aeh_no_dup[$key] = $handle;
}
}
$aeh_min_source[$handle] = array('handle'=>$handle, 'url'=>$aeh_handle_url, 'conditional'=>$conditional, 'mediatype'=>$mediatype);
if (stripos($aeh_handle_url, 'fonts.googleapis.com') !== false) {
wp_dequeue_style($handle);
if(isset($this->minify_settings['inline_gfonts'])) {
$google_fonts[$handle] = $aeh_handle_url;
} else {
wp_enqueue_style($handle);
}
} else {
wp_dequeue_style($handle);
wp_enqueue_style($handle);
}
endforeach;
if(count($google_fonts) > 0 || (isset($this->minify_settings['inline_gfonts']) && count($google_fonts) > 0)) {
$done = $this->aeh_inline_gfonts($google_fonts,$done,'processed-footer');
}
$aeh_footer_urls = $this->aeh_fecth_min_urls($done,$styles,$google_fonts,$aeh_min_source);
$done = $this->aeh_process_min_urls($aeh_footer_urls,'processed-footer',$done);
$wp_styles->done = $done;
}
public function aeh_process_min_urls($aeh_header_urls,$title,$done,$type = 'css'){
global $wp_styles,$wp_scripts;
for($i=0,$l=count($aeh_header_urls);$i<$l;$i++){
if(!isset($aeh_header_urls[$i]['handle'])) {
if($type == 'css'){
$aeh_inline_css_combine = array();
foreach($aeh_header_urls[$i]['handles'] as $handle_url){
if(isset($this->inline_css[$handle_url]) && !empty($this->inline_css[$handle_url])) {
$aeh_inline_css_combine[] = $this->inline_css[$handle_url];
}
}
$aeh_inline_css_combine_hash = md5(implode('',$aeh_inline_css_combine));
$aeh_hash = $title.'-'.hash('sha1',implode('',$aeh_header_urls[$i]['handles']).$aeh_inline_css_combine_hash);
}else{
$aeh_hash = $title.'-'.hash('sha1',implode('',$aeh_header_urls[$i]['handles']));
}
$aeh_cache_file = $this->cachedir.$this->aeh_slash().$aeh_hash.'.min.'.$type;
$aeh_cache_file_url = $this->aeh_check_ssl($this->cachedirurl.'/'.$aeh_hash.'.min.'.$type);
clearstatcache();
if (!file_exists($aeh_cache_file)) {
$log = '';
$code = '';
foreach($aeh_header_urls[$i]['handles'] as $handle) :
if($type == 'css'){
$global_type = 'styles';
}else{
$global_type = 'scripts';
}
if(!empty(${'wp_'.$global_type}->registered[$handle]->src)) {
$aeh_handle_url = $this->aeh_get_handle_url(${'wp_'.$global_type}->registered[$handle]->src);
if( empty($aeh_handle_url)) {
continue;
}
$aeh_json_data = $this->aeh_process_url($aeh_handle_url,$type,$handle);
$res = json_decode($aeh_json_data, true);
if($res['status'] != true) {
$log.= $res['log'];
continue;
}
if($type == 'js'){
if (!empty( $wp_scripts->registered[$handle]->extra)) {
if (!empty( $wp_scripts->registered[$handle]->extra['before'])){
$code.= PHP_EOL . $this->aeh_try_catch_wrap(implode(PHP_EOL, $wp_scripts->registered[$handle]->extra['before']));
}
}
$code.= "/* $aeh_handle_url */ ". PHP_EOL . $this->aeh_try_catch_wrap($res['code']);
}else{
$code.= $res['code'];
}
$log.= $res['log'];
if($type == 'js'){
if (!empty( $wp_scripts->registered[$handle]->extra)) {
if (!empty( $wp_scripts->registered[$handle]->extra['after'])){
$code.= PHP_EOL . $this->aeh_try_catch_wrap(implode(PHP_EOL, $wp_scripts->registered[$handle]->extra['after']));
}
}
}else{
if(isset($this->inline_css[$handle]) && !empty($this->inline_css[$handle])) {
$code.= $this->inline_css[$handle];
}
}
} else {
if($type == 'css'){
wp_dequeue_style($handle);
wp_enqueue_style($handle);
}else {
wp_dequeue_script($handle);
wp_enqueue_script($handle);
}
}
endforeach;
$log = "Cached on ".date('r').PHP_EOL.$log.PHP_EOL;
if(!empty($code)) {
file_put_contents($aeh_cache_file.'.txt', $log);
$this->aeh_set_file_permissions($aeh_cache_file.'.txt');
file_put_contents($aeh_cache_file, $code);
$this->aeh_set_file_permissions($aeh_cache_file);
file_put_contents($aeh_cache_file.'.gz', gzencode(file_get_contents($aeh_cache_file), 9));
$this->aeh_set_file_permissions($aeh_cache_file.'.gz');
if(function_exists('brotli_compress')) {
file_put_contents($aeh_cache_file.'.br', brotli_compress(file_get_contents($aeh_cache_file), 11));
$this->aeh_set_file_permissions($aeh_cache_file.'.br');
}
}
}
if(file_exists($aeh_cache_file) && filesize($aeh_cache_file) > 0) {
if(filesize($aeh_cache_file) < 20000 && $aeh_header_urls[$i]['media'] != 'all' && $type !== 'js') {
echo '';
} else {
if($type == 'css'){
wp_enqueue_style('aeh-'.$title.'-'.$i, $aeh_cache_file_url, array(), null, $aeh_header_urls[$i]['media']);
}else{
wp_register_script('aeh-'.$title.'-'.$i, $aeh_cache_file_url, array(), null, false);
$data = array();
foreach($aeh_header_urls[$i]['handles'] as $handle) {
if(isset($wp_scripts->registered[$handle]->extra['data'])) {
$data[] = $wp_scripts->registered[$handle]->extra['data'];
}
}
if(count($data) > 0) {
$wp_scripts->registered['aeh-'.$title.'-'.$i]->extra['data'] = implode(PHP_EOL, $data);
}
if(file_exists($aeh_cache_file) && (filesize($aeh_cache_file) > 0 || count($data) > 0)) {
wp_enqueue_script('aeh-'.$title.'-'.$i);
} else {
echo "";
}
}
}
} else {
echo "";
}
} else {
if($type == 'css'){
wp_dequeue_style($aeh_header_urls[$i]['handle']);
wp_enqueue_style($aeh_header_urls[$i]['handle']);
}else {
wp_dequeue_script($aeh_header_urls[$i]['handle']);
wp_enqueue_script($aeh_header_urls[$i]['handle']);
}
}
if(isset($aeh_header_urls[$i]['handles'])){
$done = array_merge($done, $aeh_header_urls[$i]['handles']);
}
}
return $done;
}
/* inline google fonts */
public function aeh_inline_gfonts($google_fonts,$done,$string){
$aeh_google_fonts = array();
foreach ($google_fonts as $a) {
if(!empty($a)) {
$aeh_google_fonts[] = $a;
}
}
if(count($aeh_google_fonts) > 0) {
$f = 0;
foreach($aeh_google_fonts as $google_font_url) {
$f++;
if($this->minify_settings['inline_gfonts'] == true) {
$aeh_json_data = $this->aeh_process_url($google_font_url,'css');
$res = json_decode($aeh_json_data, true);
if($res['status'] != true) {
$log.= $res['log'];
continue;
}
if($res['code'] !== false) {
$res['code'] = str_ireplace('font-style:normal;', 'font-display:block;font-style:normal;', $res['code']);
echo ''.PHP_EOL;
echo ''.PHP_EOL;
} else {
echo "\n";
}
} else {
wp_enqueue_style($string.'-aeh-fonts-'.$aeh_file_url, $google_font_url, array(), null, 'all');
}
}
}
foreach ($google_fonts as $h=>$a) {
$done = array_merge($done, array($h));
}
return $done;
}
/* getting file url needs to processed in proper array */
public function aeh_fecth_min_urls($done,$styles,$google_fonts,$aeh_min_source){
global $wp_styles;
$aeh_header_urls = array();
foreach( $styles->to_do as $handle ) :
if(isset($google_fonts[$handle])) {
continue;
}
if(empty($wp_styles->registered[$handle]->src)) {
continue;
}
if ($this->aeh_array_check($handle, $done)) {
continue;
}
if (!isset($aeh_min_source[$handle])) {
continue;
}
$aeh_handle_url = $aeh_min_source[$handle]['url'];
$conditional = $aeh_min_source[$handle]['conditional'];
$mediatype = $aeh_min_source[$handle]['mediatype'];
if ( (!$this->aeh_array_check($aeh_handle_url,$this->aeh_ignore) && !isset($conditional) && $this->aeh_local_url_check($aeh_handle_url)) || empty($aeh_handle_url)){
if(isset($wp_styles->registered[$handle]->extra['after']) && is_array($wp_styles->registered[$handle]->extra['after'])) {
$this->inline_css[$handle] = $this->aeh_minify_inline_css(implode('', $wp_styles->registered[$handle]->extra['after']));
$wp_styles->registered[$handle]->extra['after'] = null;
}
if(isset($aeh_header_urls[count($aeh_header_urls)-1]['handle']) || count($aeh_header_urls) == 0 || $aeh_header_urls[count($aeh_header_urls)-1]['media'] != $mediatype) {
array_push($aeh_header_urls, array('handles'=>array(), 'media'=>$mediatype));
}
array_push($aeh_header_urls[count($aeh_header_urls)-1]['handles'], $handle);
} else {
array_push($aeh_header_urls, array('handle'=>$handle));
}
endforeach;
return $aeh_header_urls;
}
public function aeh_process_url($url,$aeh_cache_file_type,$handle = null){
$tran_file_key = $aeh_cache_file_type.'-'.hash('sha1', $url).'.'.$aeh_cache_file_type;
$aeh_json_data = false;
$aeh_json_data = $this->aeh_get_json_data($tran_file_key);
if ( $aeh_json_data === false) {
$aeh_json_data = $this->aeh_get_processed_json_data($url,$aeh_cache_file_type,$handle);
$this->aeh_set_ind_file($tran_file_key, $aeh_json_data);
}
return $aeh_json_data;
}
function aeh_try_catch_wrap($js) {
return 'try{'.PHP_EOL . $js . PHP_EOL . '}' . PHP_EOL . 'catch(e){console.error("An error has occurred: "+e.stack);}'.PHP_EOL;
}
public function aeh_get_processed_json_data($aeh_handle_url,$type, $handle){
if(is_null($aeh_handle_url) || empty($aeh_handle_url) || !in_array($type, array('js', 'css'))) {
return false;
}
if($this->aeh_check_os_windows() === false) {
if (stripos($aeh_handle_url, $this->domain) !== false) {
$aeh_file_url = str_ireplace(rtrim($this->site_home, '/'), rtrim($this->home_abs_path, '/'), $aeh_handle_url);
$response = $this->aeh_get_json_response($aeh_handle_url,$type,false,$aeh_file_url);
if($response){
return $response;
}
$nhurl = str_ireplace(site_url(), home_url(), $aeh_handle_url);
$aeh_file_url = str_ireplace(rtrim($this->site_home, '/'), rtrim($this->home_abs_path, '/'), $nhurl);
$response = $this->aeh_get_json_response($aeh_handle_url,$type,false,$aeh_file_url);
if($response){
return $response;
}
}
}
$response = $this->aeh_get_json_response($aeh_handle_url,$type,true);
if($response){
return $response;
}
if(stripos($aeh_handle_url, $this->domain) !== false && home_url() != site_url()) {
$nhurl = str_ireplace(site_url(), home_url(), $aeh_handle_url);
$response = $this->aeh_get_json_response($nhurl,$type,true);
if($response){
return $response;
}
}
$aeh_log_url = str_ireplace(array(site_url(), home_url(), 'http://', 'https://'), '', $aeh_handle_url);
$log = $aeh_log_url.PHP_EOL;
$return = array('log'=>$log, 'code'=>'', 'status'=>false);
return json_encode($return);
}
public function aeh_get_json_response($aeh_handle_url, $type, $fetch = false, $aeh_src_url=null){
clearstatcache();
if($fetch){
$code = $this->aeh_content_download($aeh_handle_url);
}else{
$code = file_get_contents($aeh_src_url);
}
if(($code !== false) && !empty($code) && (strtolower(substr($code, 0, 9)) != "aeh_min_get_js($aeh_handle_url, $code );
} else {
$code = $this->aeh_min_get_css($aeh_handle_url, $code);
}
$aeh_log_url = str_ireplace(array(site_url(), home_url(), 'http://', 'https://'), '', $aeh_handle_url);
$log = $aeh_log_url.PHP_EOL;
$return = array('log'=>$log, 'code'=>$code, 'status'=>true);
return json_encode($return);
}
return false;
}
public function aeh_content_download($url) {
$uagent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586';
$response = wp_remote_get($url, array('user-agent'=>$uagent, 'timeout' => 7, 'httpversion' => '1.1', 'sslverify'=>false));
$res_code = wp_remote_retrieve_response_code($response);
if($res_code == '200') {
$data = wp_remote_retrieve_body($response);
if(strlen($data) > 1) {
return $data;
}
}
return false;
}
public function aeh_min_get_css($url, $css) {
if(isset($this->minify_settings['min_css'])){
$css_minification = true;
}else{
$css_minification = false;
}
$css = $this->aeh_min_remove_utf8_bom($css);
if(!empty($url)) {
$matches = array();
preg_match_all("/url\(\s*['\"]?(?!data:)(?!http)(?![\/'\"])(.+?)['\"]?\s*\)/ui", $css, $matches);
foreach($matches[1] as $a) {
$b = trim($a);
if($b != $a) {
$css = str_replace($a, $b, $css);
}
}
$css = preg_replace("/url\(\s*['\"]?(?!data:)(?!http)(?![\/'\"])(.+?)['\"]?\s*\)/ui", "url(".dirname($url)."/$1)", $css);
}
$css = str_ireplace('@charset "UTF-8";', '', $css);
$aeh_cache_update_time = get_option('aeh-last-cache-update', '0');
$css = preg_replace('/(.eot|.woff2|.woff|.ttf)+[?+](.+?)(\)|\'|\")/ui', "$1"."#".$aeh_cache_update_time."$3", $css);
if($css_minification) {
$css = $this->aeh_minify_inline_css($css);
} else {
$css = $this->aeh_replace_local_urls($css);
}
$css = trim($css);
return $css;
}
public function aeh_is_local_domain($src) {
$locations = array(home_url(), site_url(), network_home_url(), network_site_url());
$result = false;
foreach ($locations as $l) {
$l = trim(trim(str_ireplace(array('http://', 'https://', 'www.'), '', trim($l)), '/'));
if (stripos($src, $l) !== false && $result === false) { $result = true; }
}
return $result;
}
public function aeh_min_remove_utf8_bom($text) {
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/ui", '', $text);
return $text;
}
public function aeh_check_ssl($url) {
$url = ltrim(str_ireplace(array('http://', 'https://'), '', $url), '/');
if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) {
$aeh_url_base = 'https://';
} else {
$aeh_url_base = 'http://';
}
return $aeh_url_base.$url;
}
public function aeh_minify_inline_css($css) {
$minifier = new Minify\CSS($css);
$minifier->setMaxImportSize(15);
$min = $minifier->minify();
if($min !== false) {
return $this->aeh_replace_local_urls($min);
}
return $this->aeh_replace_local_urls($css);
}
public function aeh_check_os_windows() {
if(defined('PHP_OS_FAMILY')) {
if(strtolower(PHP_OS_FAMILY) == 'windows') { return true; }
}
if(function_exists('php_uname')) {
$os = @php_uname('s');
if (stripos($os, 'Windows') !== false) {
return true;
}
}
return false;
}
public function aeh_local_url_check($aeh_handle_url) {
if (substr($aeh_handle_url, 0, strlen($this->site_home)) === $this->site_home) {
return true;
}
if (stripos($aeh_handle_url, $this->site_home) !== false) {
return true;
}
if (isset($_SERVER['HTTP_HOST']) && stripos($aeh_handle_url, preg_replace('/:\d+$/', '', $_SERVER['HTTP_HOST'])) !== false) {
return true;
}
if (isset($_SERVER['SERVER_NAME']) && stripos($aeh_handle_url, preg_replace('/:\d+$/', '', $_SERVER['SERVER_NAME'])) !== false) {
return true;
}
if (isset($_SERVER['SERVER_ADDR']) && stripos($aeh_handle_url, preg_replace('/:\d+$/', '', $_SERVER['SERVER_ADDR'])) !== false) {
return true;
}
return false;
}
public function aeh_array_check($aeh_handle_url, $aeh_ignore){
$aeh_handle_url = str_ireplace(array('http://', 'https://'), '//', $aeh_handle_url);
$aeh_handle_url = strtok(urldecode(rawurldecode($aeh_handle_url)), '?');
if (!empty($aeh_handle_url) && is_array($aeh_ignore)) {
foreach ($aeh_ignore as $i) {
$i = str_ireplace(array('http://', 'https://'), '//', $i);
$i = strtok(urldecode(rawurldecode($i)), '?');
$i = trim(trim(trim(rtrim($i, '/')), '*'));
if (stripos($aeh_handle_url, $i) !== false) {
return true;
}
}
}
return false;
}
public function aeh_get_handle_url($src) {
$aeh_handle_url = trim($src);
if(empty($aeh_handle_url)) {
return $aeh_handle_url;
}
$aeh_handle_url = str_ireplace(array('&', '&'), '&', $aeh_handle_url);
if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) {
$aeh_url_base = 'https://';
}else {
$aeh_url_base = 'http://';
}
$this->site_home= rtrim($this->site_home, '/');
if (substr($aeh_handle_url, 0, 2) === "//") {
$aeh_handle_url = $aeh_url_base.ltrim($aeh_handle_url, "/");
}
if (substr($aeh_handle_url, 0, 4) === "http" && stripos($aeh_handle_url, $this->domain) === false) {
return $aeh_handle_url;
}
if (substr($aeh_handle_url, 0, 4) !== "http" && stripos($aeh_handle_url, $this->domain) !== false) {
$aeh_handle_url = $this->site_home.'/'.ltrim($aeh_handle_url, "/");
}
$aeh_handle_url = str_ireplace('###', '://', str_ireplace('//', '/', str_ireplace('://', '###', $aeh_handle_url)));
$proceed = 0;
if(!empty($this->site_home)) {
$alt_wp_content = basename($this->site_home);
if(substr($aeh_handle_url, 0, strlen($alt_wp_content)) === $alt_wp_content) { $proceed = 1; }
}
if (substr($aeh_handle_url, 0, 12) === "/wp-includes" || substr($aeh_handle_url, 0, 9) === "/wp-admin" || substr($aeh_handle_url, 0, 11) === "/wp-content" || $proceed == 1) {
$aeh_handle_url = $this->site_home.'/'.ltrim($aeh_handle_url, "/");
}
$aeh_handle_url = $aeh_url_base.str_ireplace(array('http://', 'https://'), '', $aeh_handle_url);
if (stripos($aeh_handle_url, '.js?v') !== false) {
$aeh_handle_url = stristr($aeh_handle_url, '.js?v', true).'.js';
}
if (stripos($aeh_handle_url, '.css?v') !== false) {
$aeh_handle_url = stristr($aeh_handle_url, '.css?v', true).'.css';
}
$aeh_handle_url = $this->aeh_replace_local_urls($aeh_handle_url);
return $aeh_handle_url;
}
public function aeh_replace_local_urls($code) {
if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) {
$aeh_url_base = 'https://';
}else {
$aeh_url_base = 'http://';
}
$code = str_ireplace(array('http://', 'https://'), $aeh_url_base, $code);
$code = str_ireplace($aeh_url_base.'www.w3.org', 'http://www.w3.org', $code);
return $code;
}
public function aeh_slash() {
if($this->aeh_check_os_windows() === false) {
$slash = '/';
} else {
$slash = '\\';
}
return $slash;
}
public function aeh_set_file_permissions($aeh_cache_file){
$perms = 0644;
@chmod($aeh_cache_file, $perms);
clearstatcache();
return true;
}
public function aeh_cachepath() {
$plugin['basedir'] = rtrim(plugin_dir_path(dirname( __FILE__ )));
$plugin['baseurl'] = rtrim(plugin_dir_url(dirname( __FILE__ )));
$aeh_cache_update_time = get_option('aeh-last-cache-update', '0');
$pluginsdir = str_ireplace('cache'.$this->aeh_slash().'cache', 'cache', $plugin['basedir'].$this->aeh_slash().'cache');
$pluginsurl = str_ireplace('cache/cache', 'cache', $plugin['baseurl'].'cache');
$cachebase = $pluginsdir.$this->aeh_slash().$aeh_cache_update_time;
$cachebaseurl = $pluginsurl.'/'.$aeh_cache_update_time;
$this->cachedir = $cachebase.$this->aeh_slash().'com';
$this->inddir = $cachebase.$this->aeh_slash().'ind';
$this->cachedirurl = $cachebaseurl.'/com';
$dir_perms = 0755;
$dirs = array($cachebase, $this->cachedir, $this->inddir);
foreach ($dirs as $target) {
if(!is_dir($target)) {
if (@mkdir($target, $dir_perms, true)){
if ($dir_perms != ($dir_perms & ~umask())){
$folder_parts = explode( $this->aeh_slash(), substr($target, strlen(dirname($target)) + 1 ));
for ($i = 1, $c = count($folder_parts ); $i <= $c; $i++){
@chmod(dirname($target) . $this->aeh_slash() . implode( $this->aeh_slash(), array_slice( $folder_parts, 0, $i ) ), $dir_perms );
}
}
} else {
wp_mkdir_p($target);
}
}
}
return array('cachebase'=>$cachebase,'inddir'=>$this->inddir, 'cachedir'=>$this->cachedir, 'cachedirurl'=>$this->cachedirurl);
}
public function aeh_cache_increment() {
update_option('aeh-last-cache-update', time());
}
public function aeh_purge_all() {
$this->cachepath = $this->aeh_cachepath();
$this->inddir = $this->cachepath['inddir'];
$this->aeh_cache_increment();
if(is_dir($this->inddir)) {
$this->aeh_rrmdir($this->inddir);
}
$this->aeh_purge_old();
return true;
}
public function aeh_purge_all_uninstall() {
$this->cachepath = $this->aeh_cachepath();
$cachebaseparent = dirname($this->cachepath['cachebase']);
if(is_dir($cachebaseparent)) {
$this->aeh_rrmdir($cachebaseparent);
}
return true;
}
public function aeh_purge_old() {
$this->cachepath = $this->aeh_cachepath();
$cachebaseparent = dirname($this->cachepath['cachebase']);
$aeh_cache_update_time = get_option('aeh-last-cache-update', '0');
$expires = time() - 86400 * 2;
if(is_dir($cachebaseparent) && is_writable(dirname($cachebaseparent))) {
if ($handle = opendir($cachebaseparent)) {
while (false !== ($d = readdir($handle))) {
if (strcmp($d, '.')==0 || strcmp($d, '..')==0) { continue; }
if($d != $aeh_cache_update_time && (is_numeric($d) && $d <= $expires)) {
$dir = $cachebaseparent.$this->aeh_slash().$d;
if(is_dir($dir)) {
$this->aeh_rrmdir($dir);
if(is_dir($dir)) { @rmdir($dir); }
}
}
}
closedir($handle);
}
}
return true;
}
public function aeh_purge_minify() {
if(current_user_can( 'manage_options')){
$this->aeh_purge_all();
$this->aeh_purge_others();
}
}
public function aeh_purge_minify_on_update() {
if((current_user_can( 'manage_options') && isset($_POST['aeh_min_save_options']))|| (isset($_GET['_aehcache']) && wp_verify_nonce($_GET['_wpnonce'], 'aeh_purge_nonce')) ){
$this->aeh_purge_all();
$this->aeh_purge_others();
}
}
public function aeh_get_json_data($key) {
$this->cachepath = $this->aeh_cachepath();
$this->inddir = $this->cachepath['inddir'];
$aeh_file_url = $this->inddir.$this->aeh_slash().$key.'.transient';
clearstatcache();
if(file_exists($aeh_file_url)) {
return file_get_contents($aeh_file_url);
} else {
return false;
}
}
public function aeh_set_ind_file($key, $code) {
if(is_null($code) || empty($code)) { return false; }
$this->cachepath = $this->aeh_cachepath();
$this->inddir = $this->cachepath['inddir'];
$aeh_file_url = $this->inddir.$this->aeh_slash().$key.'.transient';
file_put_contents($aeh_file_url, $code);
$this->aeh_set_file_permissions($aeh_file_url);
return true;
}
public function aeh_rrmdir($path) {
clearstatcache();
if(is_dir($path)) {
$i = new DirectoryIterator($path);
foreach($i as $aeh_file_url){
if($aeh_file_url->isFile()){
unlink($aeh_file_url->getRealPath());
} else if(!$aeh_file_url->isDot() && $aeh_file_url->isDir()){
$this->aeh_rrmdir($aeh_file_url->getRealPath());
if(is_dir($aeh_file_url->getRealPath())) {
@rmdir($aeh_file_url->getRealPath()); }
}
}
if(is_dir($path)) {
@rmdir($path);
}
}
}
public function aeh_purge_others(){
if(isset($this->settings->expires_headers_clear_all_cache) && is_array($this->settings->expires_headers_clear_all_cache)){
foreach($this->settings->expires_headers_clear_all_cache as $key=>$value){
if(function_exists($key) || class_exists($key)){
if(is_array($value)){
foreach($value as $v_key => $v_value){
if(method_exists($v_key,$v_value)){
call_user_func($value);
}
}
}else{
call_user_func($value);
}
}
}
}
}
}