PluginProbe
Code Profiler – WordPress Performance Profiling and Debugging Made Easy / 1.9.6
Code Profiler – WordPress Performance Profiling and Debugging Made Easy v1.9.6
1.9.6 1.9.5 1.9.4 1.9.3 trunk 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.6 1.6.1 1.6.10 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 All 41 releases
← All changes | lib/menu_view_plugins.php +49 -65 1.5.11.9.6 View file →
@@ -6,51 +6,56 @@
6 6 | | | / _ \ / _` |/ _ \ | |_) | '__/ _ \| |_| | |/ _ \ '__| |
7 7 | | |__| (_) | (_| | __/ | __/| | | (_) | _| | | __/ | |
8 8 | \____\___/ \__,_|\___| |_| |_| \___/|_| |_|_|\___|_| |
9 9 | |
10 - | (c) Jerome Bruandet ~ https://code-profiler.com/ |
10 + | (c) Jerome Bruandet ~ https://nintechnet.com/codeprofiler/ |
11 11 +=====================================================================+
12 12 */
13 13
14 -if (! defined( 'ABSPATH' ) ) { die( 'Forbidden' ); }
14 +if (! defined('ABSPATH') ) {
15 + die('Forbidden');
16 +}
15 17
16 -// =====================================================================
18 +// ===================================================================== 2023-11-17
17 19 // Display Plugins & Theme stats.
18 20
19 -$buffer = code_profiler_get_profile_data( $profile_path, 'slugs' );
21 +$buffer = code_profiler_get_profile_data( $profile_path, 'slugs');
20 22 if ( isset( $buffer['error'] ) ) {
21 23 return;
22 24 }
23 25
24 26 // Fetch options
25 -$cp_options = get_option( 'code-profiler' );
27 +$cp_options = get_option('code-profiler');
26 28
27 29 // Name vs slug
28 -if ( empty( $cp_options['display_name'] ) || ! in_array( $cp_options['display_name'], ['full', 'slug' ] ) ) {
30 +if ( empty( $cp_options['display_name'] ) ||
31 + ! in_array( $cp_options['display_name'], ['full', 'slug' ] ) ) {
32 +
29 33 $cp_options['display_name'] = 'full';
30 34 }
31 35 // Truncate name
32 -if ( empty( $cp_options['truncate_name'] ) || ! preg_match( '/^\d+$/', ( $cp_options['truncate_name'] ) ) ) {
36 +if ( empty( $cp_options['truncate_name'] ) ||
37 + ! preg_match('/^\d+$/', ( $cp_options['truncate_name'] ) ) ) {
38 +
33 39 $cp_options['truncate_name'] = 30;
34 40 }
35 41 // Horizontal vs vertical chart
36 -if ( empty( $cp_options['chart_type'] ) || ! in_array( $cp_options['chart_type'], ['x', 'y' ] ) ) {
42 +if ( empty( $cp_options['chart_type'] ) ||
43 + ! in_array( $cp_options['chart_type'], ['x', 'y' ] ) ) {
44 +
37 45 $axis = 'x';
38 46 } else {
39 47 $axis = $cp_options['chart_type'];
40 48 }
41 49 // Max plugins to display
42 -if ( empty( $cp_options['chart_max_plugins'] ) || ! preg_match( '/^\d+$/', ( $cp_options['chart_max_plugins'] ) ) ) {
50 +if ( empty( $cp_options['chart_max_plugins'] ) ||
51 + ! preg_match('/^\d+$/', ( $cp_options['chart_max_plugins'] ) ) ) {
52 +
43 53 $chart_max_plugins = 25;
44 54 } else {
45 55 $chart_max_plugins = $cp_options['chart_max_plugins'];
46 56 }
47 57
48 -// Check if we should warn about composer
49 -if (! empty( $cp_options['warn_composer'] ) ) {
50 - $composer_warning = code_profiler_composer_warning( $profile_path, $cp_options['display_name'] );
51 -}
52 -
53 58 $label = [];
54 59 $data = '';
55 60 $theme = esc_attr__('theme', 'code-profiler');
56 61 $total_time = 0;
@@ -75,9 +80,9 @@
75 80 continue;
76 81 }
77 82
78 83 // Check whether we should use the name or the slug
79 - if ( $cp_options['display_name'] == 'slug' ) {
84 + if ( $cp_options['display_name'] == 'slug') {
80 85 $n = $slugs[0];
81 86 } else {
82 87 $n = $slugs[2];
83 88 }
@@ -87,12 +92,12 @@
87 92 $n = mb_substr( $n, 0, $cp_options['truncate_name'] , 'utf-8') .'...';
88 93 }
89 94
90 95 // Mark theme as such
91 - if ( $slugs[3] == 'theme' ) {
96 + if ( $slugs[3] == 'theme') {
92 97 $label[] = "{$n} ($theme)";
93 98 // ...and MU plugins
94 - } elseif ( $slugs[3] == 'mu-plugin' ) {
99 + } elseif ( $slugs[3] == 'mu-plugin') {
95 100 $label[] = "{$n} (MU)";
96 101 } else {
97 102 $label[] = $n;
98 103 }
@@ -99,12 +104,12 @@
99 104
100 105 $data .= "{$slugs[1]},";
101 106 $total_time += $slugs[1];
102 107 }
103 -$data = rtrim( $data, ',' );
108 +$data = rtrim( $data, ',');
104 109 $count = count( $label ) - 1;
105 110 ?>
106 -<div style="width:80vw;margin:auto">
111 +<div style="width:80vw;margin:auto" aria-hidden="true">
107 112 <canvas id="myChart"></canvas>
108 113 </div>
109 114 <script>
110 115 jQuery(document).ready(function() {
@@ -111,9 +116,9 @@
111 116 'use strict';
112 117 cpjs_plugins_chart(
113 118 '<?php echo esc_js( $axis ) ?>', [<?php
114 119 for( $i = 0; $i < $count; $i++ ) {
115 - echo "'". addslashes( $label[ $i ] ) ."',";
120 + echo "'". esc_js( $label[ $i ] ) ."',";
116 121 }
117 122 echo "'". esc_js( $label[ $i ] ) ."'";
118 123 ?>],
119 124 [<?php echo esc_js( $data ) ?>], <?php echo esc_js( number_format( $total_time, 4 ) ) ?>
@@ -119,57 +124,36 @@
119 124 [<?php echo esc_js( $data ) ?>], <?php echo esc_js( number_format( $total_time, 4 ) ) ?>
120 125 );
121 126 });
122 127 </script>
128 +
129 +<!-- Screen-reader only -->
130 +<div class="visually-hidden">
123 131 <?php
132 + $sr_data = explode(',', $data );
133 + echo "<table>\n".
134 + "\t<tr>\n".
135 + "\t\t<td>". esc_html__('Component name', 'code-profiler') ."</td>".
136 + "<td>". esc_html__('Time in seconds', 'code-profiler') ."</td>".
137 + "<td>". esc_html__('Time in percentage', 'code-profiler') ."</td>\n";
138 + for( $i = 0; $i <= $count; $i++ ) {
139 + if ( empty( $sr_data[ $i ] ) ) {
140 + $sr_data[ $i ] = 0;
141 + }
142 + echo "\t<tr>\n\t\t<td>". esc_html( $label[ $i ] ) ."</td>".
143 + "<td>". esc_html( number_format( $sr_data[ $i ], 3 ) ) ."</td>".
144 + "<td>". esc_html( number_format( ( $sr_data[ $i ] / $total_time ) * 100 ) ) .
145 + "%</td>\n\t</tr>\n";
146 + }
147 + echo "</table>\n";
148 +?>
149 +</div>
150 +<!-- End of Screen-reader only -->
151 +
152 +<?php
124 153 // Actions below stats
125 154 $save_png = 1;
126 155 $rotate_img = 1;
127 156 $type = 'slugs';
128 157
129 -// =====================================================================
130 -// Warn if multiple plugins are using composer
131 -
132 -function code_profiler_composer_warning( $profile_path, $display_name ) {
133 -
134 - if (! file_exists( "$profile_path.composer.profile" ) ) {
135 - return;
136 - }
137 - $res = json_decode( file_get_contents( "$profile_path.composer.profile" ), true );
138 - // Make sure there are at least two items (free version only)
139 - if ( $res === false || count( $res ) < 2 ) {
140 - return;
141 - }
142 -
143 - $list = '';
144 - $first = '';
145 - $count = 1;
146 - foreach( $res as $slug => $name ) {
147 - if ( $display_name == 'full' ) {
148 - $list .= "$count: <strong>". esc_html( $name ) .'</strong>, ';
149 - if ( empty( $first ) ) {
150 - $first = '<strong>'. esc_html( $name ) .'</strong>';
151 - }
152 - } else {
153 - $list .= "$count: <strong>". esc_html( $slug ) .'</strong>, ';
154 - if ( empty( $first ) ) {
155 - $first = '<strong>'. esc_html( $slug ) .'</strong>';
156 - }
157 - }
158 - $count++;
159 - }
160 - $list = rtrim( $list, ', ' ) .'.';
161 -
162 - $msg = esc_html__('Code Profiler has detected that the following components, sorted by execution order, are using Composer dependency manager:', 'code-profiler') . "<br />$list<br />".
163 - sprintf(
164 - esc_html__('As that may increase the execution time of %s, make sure to consult the following FAQ: %s%s%s', 'code-profiler'),
165 - $first,
166 - '<a href="?page=code-profiler&cptab=faq#composerwarning" target="_blank" rel="noopener noreferrer">',
167 - esc_html__('Why does Code Profiler warn me that I have multiple plugins using Composer?', 'code-profiler' ),
168 - '</a>'
169 - );
170 -
171 - return '<div class="cp-notice cp-notice-orange"><p>'. $msg .'</p></div>';
172 -
173 -}
174 158 // =====================================================================
175 159 // EOF