Viewing file: MinifyAdminView.php (23.46 KB) -rw-rw-rw- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
if (!defined('W3TC')) { die(); } w3_require_once(W3TC_INC_FUNCTIONS_DIR . '/themes.php'); w3_require_once(W3TC_LIB_W3_DIR . '/UI/PluginView.php');
class W3_UI_MinifyAdminView extends W3_UI_PluginView { /** * Current page * * @var string */ var $_page = 'w3tc_minify';
/** * Minify tab * * @return void */ function view() { $minify_enabled = $this->_config->get_boolean('minify.enabled');
$minify_rewrite_disabled = (w3_is_network() && !$this->is_master() && !$this->_config_master->get_boolean('minify.rewrite')); $themes = w3_get_themes(); $templates = array();
$current_theme = w3tc_get_current_theme_name(); $current_theme_key = '';
foreach ($themes as $theme_key => $theme_name) { if ($theme_name == $current_theme) { $current_theme_key = $theme_key; }
$templates[$theme_key] = w3_get_theme_templates($theme_name); }
$css_imports_values = array( '' => 'None', 'bubble' => 'Bubble', 'process' => 'Process', );
$auto = $this->_config->get_boolean('minify.auto');
w3_require_once(W3TC_LIB_W3_DIR . '/Request.php');
$js_theme = W3_Request::get_string('js_theme', $current_theme_key); $js_groups = $this->_config->get_array('minify.js.groups');
$css_theme = W3_Request::get_string('css_theme', $current_theme_key); $css_groups = $this->_config->get_array('minify.css.groups');
$js_engine = $this->_config->get_string('minify.js.engine'); $css_engine = $this->_config->get_string('minify.css.engine'); $html_engine = $this->_config->get_string('minify.html.engine');
$css_imports = $this->_config->get_string('minify.css.imports');
// Required for Update Media Query String button $browsercache_enabled = $this->_config->get_boolean('browsercache.enabled'); $browsercache_update_media_qs = ($this->_config->get_boolean('browsercache.cssjs.replace'));
include W3TC_INC_DIR . '/options/minify.php'; }
function recommendations() { $themes = w3_get_themes();
$current_theme = w3tc_get_current_theme_name(); $current_theme_key = array_search($current_theme, $themes);
w3_require_once(W3TC_LIB_W3_DIR . '/Request.php');
$theme_key = W3_Request::get_string('theme_key', $current_theme_key); $theme_name = (isset($themes[$theme_key]) ? $themes[$theme_key] : $current_theme);
$templates = w3_get_theme_templates($theme_name); $recommendations = $this->get_theme_recommendations($theme_name);
list ($js_groups, $css_groups) = $recommendations;
$minify_js_groups = $this->_config->get_array('minify.js.groups'); $minify_css_groups = $this->_config->get_array('minify.css.groups');
$checked_js = array(); $checked_css = array();
$locations_js = array();
if (isset($minify_js_groups[$theme_key])) { foreach ((array) $minify_js_groups[$theme_key] as $template => $locations) { foreach ((array) $locations as $location => $config) { if (isset($config['files'])) { foreach ((array) $config['files'] as $file) { if (!isset($js_groups[$template]) || !in_array($file, $js_groups[$template])) { $js_groups[$template][] = $file; }
$checked_js[$template][$file] = true; $locations_js[$template][$file] = $location; } } } } }
if (isset($minify_css_groups[$theme_key])) { foreach ((array) $minify_css_groups[$theme_key] as $template => $locations) { foreach ((array) $locations as $location => $config) { if (isset($config['files'])) { foreach ((array) $config['files'] as $file) { if (!isset($css_groups[$template]) || !in_array($file, $css_groups[$template])) { $css_groups[$template][] = $file; }
$checked_css[$template][$file] = true; } } } } }
include W3TC_INC_DIR . '/lightbox/minify_recommendations.php'; }
/** * Returns array of detected URLs for theme templates * * @param string $theme_name * @return array */ function get_theme_urls($theme_name) { $urls = array(); $theme = w3tc_get_theme($theme_name);
if ($theme && isset($theme['Template Files'])) { $front_page_template = false;
if (get_option('show_on_front') == 'page') { $front_page_id = get_option('page_on_front');
if ($front_page_id) { $front_page_template_file = get_post_meta($front_page_id, '_wp_page_template', true);
if ($front_page_template_file) { $front_page_template = basename($front_page_template_file, '.php'); } } }
$home_url = w3_get_home_url(); $template_files = (array) $theme['Template Files'];
$mime_types = get_allowed_mime_types(); $custom_mime_types = array();
foreach ($mime_types as $mime_type) { list ($type1, $type2) = explode('/', $mime_type); $custom_mime_types = array_merge($custom_mime_types, array( $type1, $type2, $type1 . '_' . $type2 )); }
foreach ($template_files as $template_file) { $link = false; $template = basename($template_file, '.php');
/** * Check common templates */ switch (true) { /** * Handle home.php or index.php or front-page.php */ case (!$front_page_template && $template == 'home'): case (!$front_page_template && $template == 'index'): case (!$front_page_template && $template == 'front-page'):
/** * Handle custom home page */ case ($template == $front_page_template): $link = $home_url . '/'; break;
/** * Handle 404.php */ case ($template == '404'): $permalink = get_option('permalink_structure'); if ($permalink) { $link = sprintf('%s/%s/', $home_url, '404_test'); } else { $link = sprintf('%s/?p=%d', $home_url, 999999999); } break;
/** * Handle search.php */ case ($template == 'search'): $link = sprintf('%s/?s=%s', $home_url, 'search_test'); break;
/** * Handle date.php or archive.php */ case ($template == 'date'): case ($template == 'archive'): $posts = get_posts(array( 'numberposts' => 1, 'orderby' => 'rand' )); if (is_array($posts) && count($posts)) { $time = strtotime($posts[0]->post_date); $link = get_day_link(date('Y', $time), date('m', $time), date('d', $time)); } break;
/** * Handle author.php */ case ($template == 'author'): $author_id = false; if (function_exists('get_users')) { $users = get_users(); if (is_array($users) && count($users)) { $user = current($users); $author_id = $user->ID; } } else { $author_ids = get_author_user_ids(); if (is_array($author_ids) && count($author_ids)) { $author_id = $author_ids[0]; } } if ($author_id) { $link = get_author_posts_url($author_id); } break;
/** * Handle category.php */ case ($template == 'category'): $category_ids = get_all_category_ids(); if (is_array($category_ids) && count($category_ids)) { $link = get_category_link($category_ids[0]); } break;
/** * Handle tag.php */ case ($template == 'tag'): $term_ids = get_terms('post_tag', 'fields=ids'); if (is_array($term_ids) && count($term_ids)) { $link = get_term_link($term_ids[0], 'post_tag'); } break;
/** * Handle taxonomy.php */ case ($template == 'taxonomy'): $taxonomy = ''; if (isset($GLOBALS['wp_taxonomies']) && is_array($GLOBALS['wp_taxonomies'])) { foreach ($GLOBALS['wp_taxonomies'] as $wp_taxonomy) { if (!in_array($wp_taxonomy->name, array( 'category', 'post_tag', 'link_category' ))) { $taxonomy = $wp_taxonomy->name; break; } } } if ($taxonomy) { $terms = get_terms($taxonomy, array( 'number' => 1 )); if (is_array($terms) && count($terms)) { $link = get_term_link($terms[0], $taxonomy); } } break;
/** * Handle attachment.php */ case ($template == 'attachment'): $attachments = get_posts(array( 'post_type' => 'attachment', 'numberposts' => 1, 'orderby' => 'rand' )); if (is_array($attachments) && count($attachments)) { $link = get_attachment_link($attachments[0]->ID); } break;
/** * Handle single.php */ case ($template == 'single'): $posts = get_posts(array( 'numberposts' => 1, 'orderby' => 'rand' )); if (is_array($posts) && count($posts)) { $link = get_permalink($posts[0]->ID); } break;
/** * Handle page.php */ case ($template == 'page'): $pages_ids = get_all_page_ids(); if (is_array($pages_ids) && count($pages_ids)) { $link = get_page_link($pages_ids[0]); } break;
/** * Handle comments-popup.php */ case ($template == 'comments-popup'): $posts = get_posts(array( 'numberposts' => 1, 'orderby' => 'rand' )); if (is_array($posts) && count($posts)) { $link = sprintf('%s/?comments_popup=%d', $home_url, $posts[0]->ID); } break;
/** * Handle paged.php */ case ($template == 'paged'): global $wp_rewrite; if ($wp_rewrite->using_permalinks()) { $link = sprintf('%s/page/%d/', $home_url, 1); } else { $link = sprintf('%s/?paged=%d', 1); } break;
/** * Handle author-id.php or author-nicename.php */ case preg_match('~^author-(.+)$~', $template, $matches): if (is_numeric($matches[1])) { $link = get_author_posts_url($matches[1]); } else { $link = get_author_posts_url(null, $matches[1]); } break;
/** * Handle category-id.php or category-slug.php */ case preg_match('~^category-(.+)$~', $template, $matches): if (is_numeric($matches[1])) { $link = get_category_link($matches[1]); } else { $term = get_term_by('slug', $matches[1], 'category'); if (is_object($term)) { $link = get_category_link($term->term_id); } } break;
/** * Handle tag-id.php or tag-slug.php */ case preg_match('~^tag-(.+)$~', $template, $matches): if (is_numeric($matches[1])) { $link = get_tag_link($matches[1]); } else { $term = get_term_by('slug', $matches[1], 'post_tag'); if (is_object($term)) { $link = get_tag_link($term->term_id); } } break;
/** * Handle taxonomy-taxonomy-term.php */ case preg_match('~^taxonomy-(.+)-(.+)$~', $template, $matches): $link = get_term_link($matches[2], $matches[1]); break;
/** * Handle taxonomy-taxonomy.php */ case preg_match('~^taxonomy-(.+)$~', $template, $matches): $terms = get_terms($matches[1], array( 'number' => 1 )); if (is_array($terms) && count($terms)) { $link = get_term_link($terms[0], $matches[1]); } break;
/** * Handle MIME_type.php */ case in_array($template, $custom_mime_types): $posts = get_posts(array( 'post_mime_type' => '%' . $template . '%', 'post_type' => 'attachment', 'numberposts' => 1, 'orderby' => 'rand' )); if (is_array($posts) && count($posts)) { $link = get_permalink($posts[0]->ID); } break;
/** * Handle single-posttype.php */ case preg_match('~^single-(.+)$~', $template, $matches): $posts = get_posts(array( 'post_type' => $matches[1], 'numberposts' => 1, 'orderby' => 'rand' ));
if (is_array($posts) && count($posts)) { $link = get_permalink($posts[0]->ID); } break;
/** * Handle page-id.php or page-slug.php */ case preg_match('~^page-(.+)$~', $template, $matches): if (is_numeric($matches[1])) { $link = get_permalink($matches[1]); } else { $posts = get_posts(array( 'pagename' => $matches[1], 'post_type' => 'page', 'numberposts' => 1 ));
if (is_array($posts) && count($posts)) { $link = get_permalink($posts[0]->ID); } } break;
/** * Try to handle custom template */ default: $posts = get_posts(array( 'pagename' => $template, 'post_type' => 'page', 'numberposts' => 1 ));
if (is_array($posts) && count($posts)) { $link = get_permalink($posts[0]->ID); } break; }
if ($link && !is_wp_error($link)) { $urls[$template] = $link; } } }
return $urls; }
/** * Returns theme recommendations * * @param string $theme_name * @return array */ function get_theme_recommendations($theme_name) { $urls = $this->get_theme_urls($theme_name);
$js_groups = array(); $css_groups = array();
@set_time_limit($this->_config->get_integer('timelimit.minify_recommendations'));
foreach ($urls as $template => $url) { /** * Append theme identifier */ $url .= (strstr($url, '?') !== false ? '&' : '?') . 'w3tc_theme=' . urlencode($theme_name);
/** * If preview mode enabled append w3tc_preview */ if ($this->_config->is_preview()) { $url .= '&w3tc_preview=1'; }
/** * Get page contents */ $response = w3_http_get($url);
if (!is_wp_error($response) && ($response['response']['code'] == 200 || ($response['response']['code'] == 404 && $template == '404'))) { $js_files = $this->get_recommendations_js($response['body']); $css_files = $this->get_recommendations_css($response['body']);
$js_groups[$template] = $js_files; $css_groups[$template] = $css_files; } }
$js_groups = $this->get_theme_recommendations_by_groups($js_groups); $css_groups = $this->get_theme_recommendations_by_groups($css_groups);
$recommendations = array( $js_groups, $css_groups );
return $recommendations; }
/** * Find common files and place them into default group * * @param array $groups * @return array */ function get_theme_recommendations_by_groups($groups) { /** * First calculate file usage count */ $all_files = array();
foreach ($groups as $template => $files) { foreach ($files as $file) { if (!isset($all_files[$file])) { $all_files[$file] = 0; }
$all_files[$file]++; } }
/** * Determine default group files */ $default_files = array(); $count = count($groups);
foreach ($all_files as $all_file => $all_file_count) { /** * If file usage count == groups count then file is common */ if ($count == $all_file_count) { $default_files[] = $all_file;
/** * If common file found unset it from all groups */ foreach ($groups as $template => $files) { foreach ($files as $index => $file) { if ($file == $all_file) { array_splice($groups[$template], $index, 1); if (!count($groups[$template])) { unset($groups[$template]); } break; } } } } }
/** * If there are common files append add them into default group */ if (count($default_files)) { $new_groups = array(); $new_groups['default'] = $default_files;
foreach ($groups as $template => $files) { $new_groups[$template] = $files; }
$groups = $new_groups; }
/** * Unset empty templates */ foreach ($groups as $template => $files) { if (!count($files)) { unset($groups[$template]); } }
return $groups; }
/** * Parse content and return JS recommendations * * @param string $content * @return array */ function get_recommendations_js(&$content) { w3_require_once(W3TC_INC_DIR . '/functions/extract.php');
$files = w3_extract_js($content);
$files = array_map('w3_normalize_file_minify', $files); $files = array_unique($files); $ignore_files = $this->_config->get_array('minify.reject.files.js'); $files = array_diff($files, $ignore_files); return $files; }
/** * Parse content and return CSS recommendations * * @param string $content * @return array */ function get_recommendations_css(&$content) { w3_require_once(W3TC_INC_DIR . '/functions/extract.php');
$files = w3_extract_css($content);
$files = array_map('w3_normalize_file_minify', $files); $files = array_unique($files); $ignore_files = $this->_config->get_array('minify.reject.files.css'); $files = array_diff($files, $ignore_files);
return $files; } }
|