function gpi_render_list_page() { // Filter report type $report_filter = 'all'; if (isset($_GET['filter'])) { $report_filter = $_GET['filter']; } $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); $post_per_page = isset($_GET['post-per-page']) ? $_GET['post-per-page'] : 25; $GPI_ListTable->prepare_items(false, $report_filter, $post_per_page); ?> <!-- Forms are NOT created automatically, so you need to wrap the table in one to use features like bulk actions --> <form id="reports-filter" action="" method="get"> <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?> " /> <input type="hidden" name="render" value="list" /> <?php $GPI_ListTable->display(); ?> </form> <?php }
function gpi_action_single_recheck_page($page_id) { global $wpdb; // If we are going to recheck this data, now is the time to do it if (!empty($page_id)) { $gpi_page_stats = $wpdb->prefix . 'gpi_page_stats'; $query = "\n SELECT URL, type, object_id, term_id\n FROM {$gpi_page_stats}\n WHERE ID = {$page_id}\n "; $page_stats = $wpdb->get_row($query, ARRAY_A); $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); require_once GPI_DIRECTORY . '/core/core.php'; $googlePagespeedInsights = new googlePagespeedInsights($gpi_options); $urls_to_recheck = array(); if (!is_null($page_stats['object_id'])) { $theid = $page_stats['object_id']; } elseif (!is_null($page_stats['term_id'])) { $theid = $page_stats['term_id']; } $urls_to_recheck[$page_stats['type']][] = array('url' => $page_stats['URL'], 'objectid' => $theid); $checkstatus = $googlePagespeedInsights->googlepagespeedinsightsworker($urls_to_recheck); if ($checkstatus == false) { $message = __('The API is busy checking other pages, please try again later.', 'gpagespeedi'); } else { $message = __('Recheck Complete.', 'gpagespeedi'); } return $message; } }
function gpi_action_recheck_page($page_id, $page_report) { global $wpdb; $gpi_page_stats = $wpdb->prefix . 'gpi_page_stats'; if (is_array($page_report) && !empty($page_report)) { // Build our where clauses for selecting URLs $page_report_count = count($page_report); $x = 1; $where_clause = ''; foreach ($page_report as $page) { if ($x < $page_report_count) { $where_clause .= 'ID = ' . $page . ' OR '; } else { $where_clause .= 'ID = ' . $page; } $x++; } // Set Force Recheck to 1 on selected URLs $wpdb->query("\n UPDATE {$gpi_page_stats} SET force_recheck = 1\n WHERE {$where_clause}\n "); // Schedule the api to check pages immediately $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); require_once GPI_DIRECTORY . '/core/core.php'; $googlePagespeedInsights = new googlePagespeedInsights($gpi_options); $googlePagespeedInsights->google_pagespeed_insights_Update_Options('last_run_finished', false, 'gpagespeedi_options'); wp_schedule_event(time(), 'gpi_lastrun_checker', 'googlepagespeedinsightschecker'); $return_message = $page_report_count; } elseif (!empty($page_id)) { // Set Force Recheck to 1 on selected URL $wpdb->query("\n UPDATE {$gpi_page_stats} SET force_recheck = 1\n WHERE ID = {$page_id}\n "); // Schedule the api to check pages immediately $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); require_once GPI_DIRECTORY . '/core/core.php'; $googlePagespeedInsights = new googlePagespeedInsights($gpi_options); $googlePagespeedInsights->google_pagespeed_insights_Update_Options('last_run_finished', false, 'gpagespeedi_options'); wp_schedule_event(time(), 'gpi_lastrun_checker', 'googlepagespeedinsightschecker'); $return_message = '1'; } return $return_message; }
function gpi_render_ignored_urls_page() { $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); $post_per_page = isset($_GET['post-per-page']) ? $_GET['post-per-page'] : 25; $GPI_ListTable->prepare_items(true, 'ignored', $post_per_page); ?> <!-- Forms are NOT created automatically, so you need to wrap the table in one to use features like bulk actions --> <form id="reports-filter" method="get"> <!-- For plugins, we also need to ensure that the form posts back to our current page --> <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?> " /> <input type="hidden" name="render" value="ignored-urls" /> <!-- Now we can render the completed list table --> <?php $GPI_ListTable->display(); ?> </form> <?php }
function gpi_render_details_page($default_strategy, $page_id) { global $wpdb; require_once GPI_DIRECTORY . '/includes/helper.php'; //Create an instance of our package class... $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); $strategy = isset($_GET['strategy']) ? $_GET['strategy'] : $default_strategy; $page_stats_column = $strategy . '_page_stats'; $score_column = $strategy . '_score'; $last_checked_column = $strategy . '_last_modified'; if (!empty($page_id)) { $gpi_page_stats = $wpdb->prefix . 'gpi_page_stats'; $query = "\n SELECT *\n FROM {$gpi_page_stats}\n WHERE ID = {$page_id}\n "; $page_stats = $wpdb->get_row($query, ARRAY_A); $page_stats[$page_stats_column] = unserialize($page_stats[$page_stats_column]); $resource_sizes = array(); foreach ($page_stats[$page_stats_column] as $key => $value) { $adjusted_value = number_format($value / 1000, 2, '.', ''); switch ($key) { case 'htmlResponseBytes': $resource_sizes['HTML'] = $adjusted_value; break; case 'cssResponseBytes': $resource_sizes['CSS'] = $adjusted_value; break; case 'imageResponseBytes': $resource_sizes['IMAGES'] = $adjusted_value; break; case 'javascriptResponseBytes': $resource_sizes['JS'] = $adjusted_value; break; case 'otherResponseBytes': $resource_sizes['OTHER'] = $adjusted_value; break; } } $gpi_page_reports = $wpdb->prefix . 'gpi_page_reports'; $query2 = "\n SELECT rule_key, rule_name, rule_impact, rule_blocks\n FROM {$gpi_page_reports}\n WHERE page_id = {$page_id}\n AND strategy = '{$strategy}'\n "; $page_report = $wpdb->get_results($query2, ARRAY_A); foreach ($page_report as $report_key => $report) { if ($report['rule_blocks'] !== null) { $report['rule_blocks'] = unserialize($report['rule_blocks']); foreach ($report['rule_blocks'] as $rule_key => $ruleblock) { // Format description for each rule if (isset($ruleblock['header']['args'])) { $x = 1; foreach ($ruleblock['header']['args'] as $arg) { $report['rule_blocks'][$rule_key]['header']['format'] = str_replace('$' . $x, $arg['value'], $report['rule_blocks'][$rule_key]['header']['format']); if ($arg['type'] == 'HYPERLINK') { $report['rule_blocks'][$rule_key]['header']['hyperlink'] = $arg['value']; } $x++; } } $report['rule_blocks'][$rule_key]['description'] = $report['rule_blocks'][$rule_key]['header']['format']; if (isset($report['rule_blocks'][$rule_key]['header']['hyperlink'])) { $report['rule_blocks'][$rule_key]['hyperlink']['url'] = $report['rule_blocks'][$rule_key]['header']['hyperlink']; $report['rule_blocks'][$rule_key]['hyperlink']['name'] = $report['rule_name']; } unset($report['rule_blocks'][$rule_key]['header']); //Format description for each instance of broken rule if (isset($ruleblock['urls'])) { foreach ($ruleblock['urls'] as $url_key => $url) { $x = 1; foreach ($url['result']['args'] as $arg) { $report['rule_blocks'][$rule_key]['urls'][$url_key]['result']['format'] = str_replace('$' . $x, $arg['value'], $report['rule_blocks'][$rule_key]['urls'][$url_key]['result']['format']); $x++; } $report['rule_blocks'][$rule_key]['results'][] = $report['rule_blocks'][$rule_key]['urls'][$url_key]['result']['format']; } } unset($report['rule_blocks'][$rule_key]['urls']); } $page_report[$report_key]['rule_blocks'] = json_encode($report['rule_blocks']); } } usort($page_report, "cmpfloat_impact"); $page_report = array_reverse($page_report); ?> <?php $url_to_nonce = '?page=' . $_REQUEST['page'] . '&render=details&page_id=' . $_GET['page_id'] . '&action=single-recheck'; $nonced_url = function_exists('wp_nonce_url') ? wp_nonce_url($url_to_nonce, 'bulk-gpi_page_reports') : $url_to_nonce; ?> <h3 class="subTitle"><?php echo $page_stats['URL']; ?> </h3> <div class="toolbar"> <div class="left"> <a href="<?php echo $page_stats['URL']; ?> " class="button-gpi view" target="_blank"><?php _e('View Page', 'gpagespeedi'); ?> </a> <a href="<?php echo $nonced_url; ?> " class="button-gpi recheck"><?php _e('Recheck Results', 'gpagespeedi'); ?> </a> </div> </div> <?php if (isset($message)) { ?> <div id="message" class="error"> <p><strong><?php echo $message; ?> </strong></p> </div> <?php } ?> <!--Load the AJAX API--> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> var page_report = <?php echo json_encode($page_report); ?> ; // Figure out Pagespeed score into degrees for gauge var score = <?php echo $page_stats[$score_column]; ?> ; var degrees = (3.38 * score) + 11; jQuery(document).ready(function() { jQuery("#pagespeed_needle").rotate(degrees); }); // Load the Visualization API and the piechart package. google.load('visualization', '1.0', {'packages':['corechart']}); // Set a callback to run when the Google Visualization API is loaded. google.setOnLoadCallback(drawCharts); // Callback that creates and populates a data table, // instantiates the pie chart, passes in the data and // draws it. function drawCharts() { /*********************************************** Create impact pie chart ************************************************/ var impact = new google.visualization.DataTable(); impact.addColumn('string', 'Rule'); impact.addColumn('number', 'Impact'); impact.addRows([ <?php foreach ($page_report as $rule) { $rule_name = htmlentities($rule['rule_name'], ENT_QUOTES, "UTF-8"); $rule_impact = htmlentities($rule['rule_impact'], ENT_QUOTES, "UTF-8"); if ($rule_impact > 0) { echo '["' . $rule_name . '", ' . $rule_impact . '],' . "\r\n"; } } ?> ]); // Set chart options var impact_options = { 'width': 463, 'height': 320, 'chartArea': {top:15,width:"85%",height:"91%"}, 'legend': 'none', 'tooltip': {trigger:'none'}, 'backgroundColor':'transparent', 'colors': ["#3366cc","#dc3912","#ff9900","#109618","#990099","#0099c6","#dd4477","#66aa00","#b82e2e","#316395","#994499","#22aa99","#aaaa11","#6633cc","#e67300","#8b0707","#651067","#329262","#5574a6","#3b3eac","#b77322","#16d620","#b91383","#f4359e","#9c5935","#a9c413","#2a778d","#668d1c","#bea413","#0c5922","#743411"], 'pieSliceTextStyle': {color: 'black', fontSize: 14} }; // Instantiate and draw our chart, passing in some options. var impact_chart = new google.visualization.PieChart(document.getElementById('impact_chart_div')); impact_chart.draw(impact, impact_options); // google.visualization.table exposes a 'page' event. google.visualization.events.addListener(impact_chart, 'select', impactSelectHandler); google.visualization.events.addListener(impact_chart, 'onmouseover', highlightHover); google.visualization.events.addListener(impact_chart, 'onmouseout', clearHover); /*********************************************** Create resource size bar chart ************************************************/ var sizes = new google.visualization.DataTable(); sizes.addColumn('string', 'Rule'); sizes.addColumn('number', ''); sizes.addRows([ <?php foreach ($resource_sizes as $key => $value) { echo "['{$key}', {$value}],\r\n"; } ?> ]); // Set chart options var sizes_options = { 'legend':'none', 'backgroundColor':'transparent', 'chartArea': {top:10,width:"75%",height:"80%"}, }; // Instantiate and draw our chart, passing in some options. var sizes_chart = new google.visualization.BarChart(document.getElementById('sizes_chart_div')); sizes_chart.draw(sizes, sizes_options); function impactSelectHandler() { var selected = impact_chart.getSelection(); if(typeof selected[0] != 'undefined') { var ruleindex = selected[0].row; var rule_object = page_report[ruleindex]; var html = buildHTML(rule_object); jQuery('.impact_chart_right tr').removeClass('active'); jQuery('.impact_chart_right tr a[data-pieslice=' + ruleindex + ']').closest('tr').addClass('active'); jQuery('#impact_rule_report').css('display', 'block'); jQuery('#impact_rule_report').html(html); clearHover(); } else { jQuery('#impact_rule_report').css('display', 'none'); jQuery('#impact_rule_report').html(''); clearActive(); } } function buildHTML(rule_object) { var rule_blocks = JSON.parse(rule_object.rule_blocks); var html = ''; var rule_blocks_count = rule_blocks.length; for(i=0;i<rule_blocks_count;i++) { html = html + '<h3>' + rule_blocks[i].description + '</h3>'; if (typeof rule_blocks[i].results != 'undefined') { var results_count = rule_blocks[i].results.length; html = html + '<ul>'; for(y=0;y<results_count;y++) { html = html + '<li>' + rule_blocks[i].results[y] + '</li>'; } html = html + '</ul>'; } if(typeof rule_blocks[i].hyperlink != 'undefined') { html = html + '<a class="rule_docs" href="' + rule_blocks[i].hyperlink.url + '" target="_blank" alt="<?php _e("Read Documentation", "gpagespeedi"); ?> " ><?php _e("Read Documentation", "gpagespeedi"); ?> </a>'; } } return html; } function highlightHover(e) { var current = jQuery('.impact_chart_right tr a[data-pieslice=' + e.row + ']'); jQuery('.impact_chart_right tr').removeClass('hover'); if(!current.closest('tr').hasClass('active')) { current.closest('tr').addClass('hover'); } } function clearHover() { jQuery('.impact_chart_right tr').removeClass('hover'); } function clearActive() { jQuery('.impact_chart_right tr').removeClass('active'); } jQuery('.legend-item').on('click', function() { var selected = jQuery(this).data('pieslice'); impact_chart.setSelection([{row: selected}]); impactSelectHandler(); impact_chart.getSelection([{row: selected}]); jQuery('.impact_chart_right tr').removeClass('active'); jQuery(this).closest('tr').addClass('active'); return false; }); } </script> <!--Div's to hold output from google charts--> <div class="row"> <div class="top-row boxsizing" id="pagespeed_gauge_wrapper"> <div id="score_chart_div"> <img id="pagespeed_needle" src="<?php echo GPI_PUBLIC_PATH; ?> /images/pagespeed_gauge_needle.png" width="204" height="204" alt="" /> <div id="score_text"><?php echo $page_stats[$score_column]; ?> <span><?php _e('score', 'gpagespeedi'); ?> </span></div> </div> </div> <div class="top-row boxsizing framed" id="pagespeed_stats_wrapper"> <div class="boxheader"> <span class="left"><?php _e('Page Statistics', 'gpagespeedi'); ?> </span> <span class="right" style="padding-right: 19px;"><?php _e('Value', 'gpagespeedi'); ?> </span> </div> <table id="stats"> <tbody> <tr> <td class="leftcol"><?php _e('Last Checked', 'gpagespeedi'); ?> </td> <td class="rightcol"><?php echo date_i18n('M d', $page_stats[$last_checked_column]); ?> </td> </tr> <tr class="alt"> <td class="leftcol"><?php _e('Number of Hosts', 'gpagespeedi'); ?> </td> <td class="rightcol"><?php echo $page_stats[$page_stats_column]['numberHosts']; ?> </td> </tr> <tr> <td class="leftcol"><?php _e('Total Request Bytes', 'gpagespeedi'); ?> </td> <td class="rightcol"><?php echo $page_stats[$page_stats_column]['totalRequestBytes']; ?> </td> </tr> <tr class="alt"> <td class="leftcol"><?php _e('Total Resources', 'gpagespeedi'); ?> </td> <td class="rightcol"><?php echo $page_stats[$page_stats_column]['numberResources']; ?> </td> </tr> <tr> <td class="leftcol"><?php _e('JavaScript Resources', 'gpagespeedi'); ?> </td> <td class="rightcol"><?php echo $page_stats[$page_stats_column]['numberJsResources']; ?> </td> </tr> <tr class="alt"> <td class="leftcol"><?php _e('CSS Resources', 'gpagespeedi'); ?> </td> <td class="rightcol"><?php echo $page_stats[$page_stats_column]['numberCssResources']; ?> </td> </tr> </tbody> </table> </div> <div class="top-row boxsizing framed" id="pagespeed_sizes_wrapper"> <div class="boxheader"> <span class="left"><?php _e('Total Size of Resources', 'gpagespeedi'); ?> </span> <span class="right light"><span class="legend"></span><?php _e('Size (kB)', 'gpagespeedi'); ?> </span> </div> <div id="sizes_chart_div"></div> </div> </div> <div class="row boxsizing framed"> <div class="boxheader"> <span class="left"><?php _e('Opportunities for improvement', 'gpagespeedi'); ?> </span><span class="light"><?php _e('(Click for detailed report)', 'gpagespeedi'); ?> </span> </div> <div id="opportunities"> <div class="impact_chart_left boxsizing"> <div id="impact_chart_div"></div> <div id="impact_rule_report"></div> </div> <div class="impact_chart_right"> <table> <tbody> <th> <?php _e('Insights Key', 'gpagespeedi'); ?> </th> <?php $x = 0; $color_array = array("#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", "#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707", "#651067", "#329262", "#5574a6", "#3b3eac", "#b77322", "#16d620", "#b91383", "#f4359e", "#9c5935", "#a9c413", "#2a778d", "#668d1c", "#bea413", "#0c5922", "#743411"); foreach ($page_report as $rule) { $rule_name = $rule['rule_name']; $rule_impact = $rule['rule_impact']; if ($rule_impact > 0) { ?> <tr> <td class="leftcol"> <span class="swatch" style="background: <?php echo $color_array[$x]; ?> "></span> <div class="box"><a data-pieslice="<?php echo $x; ?> " class="legend-item"><?php echo $rule_name; ?> </a></div> </td> </tr> <?php } $x++; } ?> </tbody> </table> </div> </div> </div> <?php } }
function gpi_render_admin_page() { $admin_page = isset($_GET['render']) ? $_GET['render'] : ''; if (isset($_REQUEST['render1']) && -1 != $_REQUEST['render1']) { $admin_page = $_REQUEST['render1']; } if (isset($_REQUEST['render2']) && -1 != $_REQUEST['render2']) { $admin_page = $_REQUEST['render2']; } $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); $gpi_ui_options = $GPI_ListTable->getOptions('gpagespeedi_ui_options'); ?> <div class="wrap"> <div id="icon-gpi" class="icon32"><br/></div> <h2>Google Pagespeed Insights</h2> <div class="reportmodes"> <?php if ($gpi_options['strategy'] == 'both' || $gpi_options['strategy'] == 'desktop') { ?> <a href="<?php echo $_SERVER['REQUEST_URI']; ?> &strategy=desktop" class="button-gpi desktop<?php if ($gpi_ui_options['view_preference'] == "desktop") { echo ' active'; } ?> "><?php _e('Desktop Mode', 'gpagespeedi'); ?> </a> <?php } ?> <?php if ($gpi_options['strategy'] == 'both' || $gpi_options['strategy'] == 'mobile') { ?> <a href="<?php echo $_SERVER['REQUEST_URI']; ?> &strategy=mobile" class="button-gpi mobile<?php if ($gpi_ui_options['view_preference'] == "mobile") { echo ' active'; } ?> "><?php _e('Mobile Mode', 'gpagespeedi'); ?> </a> <?php } ?> </div> <h3 class="nav-tab-wrapper"> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=list" class="nav-tab <?php if ($admin_page == '' || $admin_page == 'list' || $admin_page == 'ignore' || $admin_page == 'recheck') { echo 'nav-tab-active'; } ?> "><?php _e('Report List', 'gpagespeedi'); ?> </a> <?php if ($admin_page == 'details') { ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=details&page_id=<?php echo $_GET['page_id']; ?> " class="nav-tab nav-tab-active nav-tab-temp"><?php _e('Report Details', 'gpagespeedi'); ?> </a> <?php } ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=summary" class="nav-tab <?php if ($admin_page == 'summary') { echo 'nav-tab-active'; } ?> "><?php _e('Report Summary', 'gpagespeedi'); ?> </a> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=ignored-urls" class="nav-tab <?php if ($admin_page == 'ignored-urls' || $admin_page == 'activate') { echo 'nav-tab-active'; } ?> "><?php _e('Ignored URLs', 'gpagespeedi'); ?> </a> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=options" class="nav-tab <?php if ($admin_page == 'options') { echo 'nav-tab-active'; } ?> "><?php _e('Options', 'gpagespeedi'); ?> </a> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=about" class="nav-tab <?php if ($admin_page == 'about') { echo 'nav-tab-active'; } ?> "><?php _e('About', 'gpagespeedi'); ?> </a> </h3> <?php if ($gpi_options['google_developer_key'] == '' && $admin_page != 'options') { ?> <div id="message" class="error"> <p><strong><?php _e('You must enter your Google API key to use this plugin! Enter your API key in the', 'gpagespeedi'); ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=options"><?php _e('Options', 'gpagespeedi'); ?> </a></strong>.</p> </div> <?php } ?> <?php if ($gpi_options['bad_api_key'] && $admin_page != 'options') { ?> <div id="message" class="error"> <p><strong><?php _e('The Google Pagespeed API Key you entered appears to be invalid. Please update your API key in the', 'gpagespeedi'); ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=options"><?php _e('Options', 'gpagespeedi'); ?> </a></strong>.</p> </div> <?php } ?> <?php if ($gpi_options['pagespeed_disabled'] && $admin_page != 'options') { ?> <div id="message" class="error"> <p><strong><?php _e('The "PageSpeed Insights API" service is not enabled. To enable it, please visit the "Services" page from your ', 'gpagespeedi'); ?> <a href="https://code.google.com/apis/console/" target="_blank"><?php _e('Google API Console', 'gpagespeedi'); ?> </a></strong>.</p> </div> <?php } ?> <?php if ($gpi_ui_options['action_message']) { ?> <div id="message" class="updated"> <p><?php echo $gpi_ui_options['action_message']; ?> </p> </div> <?php } ?> <?php if ($gpi_options['new_ignored_items']) { ?> <div id="message" class="error"> <p><strong><?php _e('One or more URLs could not be reached by Google Pagespeed Insights and have automatically been added to the', 'gpagespeedi'); ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=ignored-urls"><?php _e('Ignored URLs', 'gpagespeedi'); ?> </a></strong>.</p> </div> <?php } ?> <?php if ($gpi_options['backend_error']) { ?> <div id="message" class="error"> <p><strong><?php _e('An error has been encountered while checking one or more URLs. Possible causes: <br /><br />Daily API Limit Exceeded <a href="https://code.google.com/apis/console" target="_blank">Check API Usage</a> <br />API Key user limit exceeded <a href="https://code.google.com/apis/console" target="_blank">Check API Usage</a> <br />the URL is not publicly accessible or is bad. <br /><br />The URL(s) have been added to the', 'gpagespeedi'); ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=ignored-urls"><?php _e('Ignored URLs', 'gpagespeedi'); ?> </a></strong></p> </div> <?php } ?> <?php require_once GPI_DIRECTORY . '/core/core.php'; $googlePagespeedInsights = new googlePagespeedInsights($gpi_options); //Show currently working status on admin pages if GPI is working in the background $worker_status = $googlePagespeedInsights->google_pagespeed_insights_Check_Status(); if ($worker_status) { ?> <div id="message" class="updated"> <span><p id="gpi_status_finished" style="font-size: 13px; display: none;"><?php _e('Google Pagespeed has finished checking pagespeed scores. <a href="javascript:location.reload(true);">Refresh to see new results.</a>', 'gpagespeedi'); ?> </p><p id="gpi_status_ajax" style="font-size: 13px;"><?php _e('Google Pagespeed is running in the background. Progress...', 'gpagespeedi'); ?> </p></span> </div> <?php } //Clear any one-time messages from above $googlePagespeedInsights->google_pagespeed_insights_Update_Options('backend_error', false, 'gpagespeedi_options'); $googlePagespeedInsights->google_pagespeed_insights_Update_Options('action_message', false, 'gpagespeedi_ui_options'); $googlePagespeedInsights->google_pagespeed_insights_Update_Options('new_ignored_items', false, 'gpagespeedi_options'); $default_strategy = $gpi_ui_options['view_preference']; switch ($admin_page) { case 'list': require_once GPI_DIRECTORY . '/includes/admin/list.php'; gpi_render_list_page(); break; case 'ignored-urls': require_once GPI_DIRECTORY . '/includes/admin/ignored-urls.php'; gpi_render_ignored_urls_page(); break; case 'options': require_once GPI_DIRECTORY . '/includes/admin/options.php'; gpi_render_options_page(); break; case 'details': $page_id = isset($_GET['page_id']) ? $_GET['page_id'] : ''; require_once GPI_DIRECTORY . '/includes/admin/details.php'; gpi_render_details_page($default_strategy, $page_id); break; case 'summary': require_once GPI_DIRECTORY . '/includes/admin/summary.php'; gpi_render_summary_page($default_strategy); break; case 'about': require_once GPI_DIRECTORY . '/includes/admin/about.php'; gpi_render_about(); break; default: require_once GPI_DIRECTORY . '/includes/admin/list.php'; gpi_render_list_page(); break; } ?> </div> <?php }
function gpi_render_summary_page($default_strategy) { global $wpdb; require_once GPI_DIRECTORY . '/includes/helper.php'; //Create an instance of our package class... $GPI_ListTable = new GPI_List_Table(); $gpi_options = $GPI_ListTable->getOptions(); // Mobile or Desktop reports? $strategy = isset($_GET['strategy']) ? $_GET['strategy'] : $default_strategy; $score_column = $strategy . '_score'; $page_stats_column = $strategy . '_page_stats'; // Create our empty arrays for use later when divying up our data for display $rule_stats = $scores = $html_sizes = $css_sizes = $image_sizes = $js_sizes = $other_sizes = array(); // Filter report type $filter = 'all'; if (isset($_GET['filter'])) { $filter = $_GET['filter']; } // Page Data Query $data_typestocheck = $GPI_ListTable->getTypesToCheck($filter); $gpi_page_stats = $wpdb->prefix . 'gpi_page_stats'; if (!empty($data_typestocheck)) { $allpagedata = $wpdb->get_results($wpdb->prepare("SELECT ID, URL, {$score_column}, {$page_stats_column}\n FROM {$gpi_page_stats}\n WHERE ({$data_typestocheck['0']})", $data_typestocheck[1]), ARRAY_A); } else { $allpagedata = array(); } // Page Reports Query $reports_typestocheck = $GPI_ListTable->getTypesToCheck($filter); $gpi_page_reports = $wpdb->prefix . 'gpi_page_reports'; if (!empty($reports_typestocheck)) { $allpagereports = $wpdb->get_results($wpdb->prepare("SELECT r.rule_key, r.rule_name, r.rule_impact\n FROM {$gpi_page_stats} d\n INNER JOIN {$gpi_page_reports} r \n ON r.page_id = d.ID\n AND r.rule_impact > 0\n AND r.strategy = '{$strategy}'\n WHERE ({$reports_typestocheck['0']})", $reports_typestocheck[1]), ARRAY_A); } else { $allpagereports = array(); } foreach ($allpagereports as $pagereports) { $rulekey = $pagereports['rule_key']; if (!isset($rule_stats[$rulekey])) { $rule_stats[$rulekey]['name'] = $pagereports['rule_name']; $rule_stats[$rulekey]['total_impact'] = $pagereports['rule_impact']; $rule_stats[$rulekey]['occurances'] = 1; } else { $rule_stats[$rulekey]['total_impact'] = abs($rule_stats[$rulekey]['total_impact'] + $pagereports['rule_impact']); $rule_stats[$rulekey]['occurances'] = $rule_stats[$rulekey]['occurances'] + 1; } } usort($rule_stats, "cmpfloat_rules"); foreach ($rule_stats as $key => $rule) { $total_impact = $rule['total_impact']; $occurances = $rule['occurances']; $avg_impact = number_format($total_impact / $occurances, 2); $rule_stats[$key]['avg_impact'] = $avg_impact; } // Count all pages (needed for calculating averages) $total_pages = count($allpagedata); $total_scores = 0; if (!empty($total_pages) && !empty($allpagereports)) { foreach ($allpagedata as $key => $pagedata) { $id = $pagedata['ID']; $total_scores = $total_scores + $pagedata[$score_column]; $pagedata[$page_stats_column] = unserialize($pagedata[$page_stats_column]); $allpagedata[$key]['page_stats'] = $pagedata[$page_stats_column]; $scores[$id]['score'] = isset($pagedata[$score_column]) ? $pagedata[$score_column] : ''; $scores[$id]['url'] = isset($pagedata['URL']) ? $pagedata['URL'] : ''; $scores[$id]['id'] = $id; $html_sizes[$id] = isset($pagedata[$page_stats_column]['htmlResponseBytes']) ? $pagedata[$page_stats_column]['htmlResponseBytes'] : '0'; $css_sizes[$id] = isset($pagedata[$page_stats_column]['cssResponseBytes']) ? $pagedata[$page_stats_column]['cssResponseBytes'] : '0'; $image_sizes[$id] = isset($pagedata[$page_stats_column]['imageResponseBytes']) ? $pagedata[$page_stats_column]['imageResponseBytes'] : '0'; $js_sizes[$id] = isset($pagedata[$page_stats_column]['javascriptResponseBytes']) ? $pagedata[$page_stats_column]['javascriptResponseBytes'] : '0'; $other_sizes[$id] = isset($pagedata[$page_stats_column]['otherResponseBytes']) ? $pagedata[$page_stats_column]['otherResponseBytes'] : '0'; } $average_score = number_format($total_scores / $total_pages); usort($scores, "cmpfloat_scores"); usort($html_sizes, "cmpfloat"); usort($css_sizes, "cmpfloat"); usort($image_sizes, "cmpfloat"); usort($js_sizes, "cmpfloat"); usort($other_sizes, "cmpfloat"); $average_resource_sizes = array('HTML' => array(number_format(end($html_sizes) / 1000, 0, '', ''), number_format(array_sum($html_sizes) / $total_pages / 1000, 0, '', ''), number_format($html_sizes[0] / 1000, 0, '', '')), 'CSS' => array(number_format(end($css_sizes) / 1000, 0, '', ''), number_format(array_sum($css_sizes) / $total_pages / 1000, 0, '', ''), number_format($css_sizes[0] / 1000, 0, '', '')), 'IMAGES' => array(number_format(end($image_sizes) / 1000, 0, '', ''), number_format(array_sum($image_sizes) / $total_pages / 1000, 0, '', ''), number_format($image_sizes[0] / 1000, 0, '', '')), 'JS' => array(number_format(end($js_sizes) / 1000, 0, '', ''), number_format(array_sum($js_sizes) / $total_pages / 1000, 0, '', ''), number_format($js_sizes[0] / 1000, 0, '', '')), 'OTHER' => array(number_format(end($other_sizes) / 1000, 0, '', ''), number_format(array_sum($other_sizes) / $total_pages / 1000, 0, '', ''), number_format($other_sizes[0] / 1000, 0, '', ''))); $highest_scores = array(); $lowest_scores = array(); $x = 0; foreach ($scores as $score) { if ($x > 4) { break; } array_push($lowest_scores, $score); $x++; } $x = 0; $scores = array_reverse($scores); foreach ($scores as $score) { if ($x > 4) { break; } array_push($highest_scores, $score); $x++; } ?> <!--Load the AJAX API--> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> // Figure out Pagespeed score into degrees for gauge var score = <?php echo $average_score; ?> ; var degrees = (3.38 * score) + 11; jQuery(document).ready(function() { jQuery("#pagespeed_needle").rotate(degrees); }); // Load the Visualization API and the piechart package. google.load('visualization', '1.0', {'packages':['corechart']}); // Set a callback to run when the Google Visualization API is loaded. google.setOnLoadCallback(drawCharts); // Callback that creates and populates a data table, // instantiates the pie chart, passes in the data and // draws it. function drawCharts() { /*********************************************** Create resource size bar chart ************************************************/ var sizes = google.visualization.arrayToDataTable([ ['Type', 'High', 'Average', 'Low'], <?php foreach ($average_resource_sizes as $key => $values) { echo "['{$key}', {$values['0']}, {$values['1']}, {$values['2']}],\r\n"; } ?> ]); // Set chart options var sizes_options = { 'legend':{position: 'none'}, 'backgroundColor':'transparent', 'width': 615, 'height': 200, 'chartArea': {top:10,width:"80%",height:"80%"}, }; // Instantiate and draw our chart, passing in some options. var sizes_chart = new google.visualization.BarChart(document.getElementById('sizes_chart_div')); sizes_chart.draw(sizes, sizes_options); } </script> <div class="tablenav top"> <div class="alignleft actions"> <form method="get" action="" id="filter" name="filter"> <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?> " /> <input type="hidden" name="render" value="summary" /> <div class="tablenav top"> <?php $GPI_ListTable->extra_tablenav('top'); ?> </div> </form> </div> <br class="clear"> </div> <!--Div's to hold output from google charts--> <div class="row"> <div class="top-row boxsizing" id="pagespeed_gauge_wrapper"> <div id="score_chart_div"> <img id="pagespeed_needle" src="<?php echo GPI_PUBLIC_PATH; ?> /images/pagespeed_gauge_needle.png" width="204" height="204" alt="" /> <div id="score_text"><?php echo $average_score; ?> <span><?php _e('score', 'gpagespeedi'); ?> </span></div> </div> </div> <div class="top-row boxsizing framed" id="pagespeed_avg_sizes_wrapper"> <div class="boxheader"> <span class="left"><?php _e('Size of Resources (in kB)', 'gpagespeedi'); ?> </span> <span class="right light"><span class="legend low"></span><?php _e('Lowest', 'gpagespeedi'); ?> </span> <span class="right light"><span class="legend avg"></span><?php _e('Average', 'gpagespeedi'); ?> </span> <span class="right light"><span class="legend"></span><?php _e('Highest', 'gpagespeedi'); ?> </span> </div> <div id="sizes_chart_div"></div> </div> </div> <div class="row boxsizing framed" id="largest_improvement"> <div class="boxheader"> <span class="left"><?php _e('Largest Areas for Improvement', 'gpagespeedi'); ?> </span> <span class="right"><?php _e('Pages Effected', 'gpagespeedi'); ?> </span> <span class="right"><?php _e('Average Impact', 'gpagespeedi'); ?> </span> </div> <table id="stats"> <tbody> <?php $x = 0; foreach ($rule_stats as $rule) { if ($x == 5) { break; } $rule_name = $rule['name']; $avg_impact = $rule['avg_impact']; $occurances = $rule['occurances']; $altclass = 'class="alt"'; if ($x % 2 == 0) { $altclass = ''; } ?> <tr <?php echo $altclass; ?> > <td class="leftcol"><?php echo $rule_name; ?> </td> <td class="rightcol"><?php echo $avg_impact; ?> </td> <td class="rightcol"><?php echo $occurances; ?> </td> </tr> <?php $x++; } ?> </tbody> </table> </div> <div class="row scores_div"> <div class="halfwidth boxsizing framed left"> <div class="boxheader"> <span class="left"><?php _e('Highest Scoring Pages', 'gpagespeedi'); ?> </span> <span class="right"><?php _e('Score', 'gpagespeedi'); ?> </span> </div> <table id="stats"> <tbody> <?php $x = 0; $request = $_REQUEST['page']; foreach ($highest_scores as $score) { if ($x == 5) { break; } $url = $score['url']; $thescore = $score['score']; $id = $score['id']; $altclass = 'class="alt"'; if ($x % 2 == 0) { $altclass = ''; } ?> <tr <?php echo $altclass; ?> > <td class="leftcol"><?php echo "<a href=\"?page={$request}&render=details&page_id={$id}\">{$url}</a>"; ?> </td> <td class="rightcol"><?php echo $thescore; ?> </td> </tr> <?php $x++; } ?> </tbody> </table> </div> <div class="halfwidth boxsizing framed right"> <div class="boxheader"> <span class="left"><?php _e('Lowest Scoring Pages', 'gpagespeedi'); ?> </span> <span class="right"><?php _e('Score', 'gpagespeedi'); ?> </span> </div> <table id="stats"> <tbody> <?php $x = 0; $request = $_REQUEST['page']; foreach ($lowest_scores as $score) { if ($x == 5) { break; } $url = $score['url']; $thescore = $score['score']; $id = $score['id']; $altclass = 'class="alt"'; if ($x % 2 == 0) { $altclass = ''; } ?> <tr <?php echo $altclass; ?> > <td class="leftcol"><?php echo "<a href=\"?page={$request}&render=details&page_id={$id}\">{$url}</a>"; ?> </td> <td class="rightcol"><?php echo $thescore; ?> </td> </tr> <?php $x++; } ?> </tbody> </table> </div> </div> <?php } else { ?> <div class="tablenav top"> <div class="alignleft actions"> <form method="get" action="" id="filter" name="filter"> <input type="hidden" name="page" value="<?php echo $_REQUEST['page']; ?> " /> <input type="hidden" name="render" value="summary" /> <div class="tablenav top"> <?php $GPI_ListTable->extra_tablenav('top'); ?> </div> </form> </div> <br class="clear"> </div> <?php _e('No Pagespeed Reports Found. Google Pagespeed may still be checking your pages. If problems persist, see the following possible solutions:', 'gpagespeedi'); ?> <ul class="no-items"> <?php if (isset($_GET['filter']) && $_GET['filter'] != 'all') { ?> <li><?php _e('There may not be any results for the "' . $_GET['filter'] . '" filter. Try another filter.', 'gpagespeedi'); ?> </li> <?php } ?> <?php if ($gpi_options['strategy'] == 'both') { ?> <li><?php _e('There may not be any ' . $default_strategy . ' reports completed yet.', 'gpagespeedi'); ?> </li> <?php } ?> <li><?php _e('Make sure that you have entered your Google API key on the ', 'gpagespeedi'); ?> <a href="?page=<?php echo $_REQUEST['page']; ?> &render=options">Options</a> page.</li> <li><?php _e('Make sure that you have enabled "PageSpeed Insights API" from the Services page of the ', 'gpagespeedi'); ?> <a href="https://code.google.com/apis/console/">Google Console</a>.</li> <li><?php _e('The Google Pagespeed API may be temporarily unavailable.', 'gpagespeedi'); ?> </li> </ul> <?php } }