PluginProbe
Code Profiler – WordPress Performance Profiling and Debugging Made Easy / 1.7.4
Code Profiler – WordPress Performance Profiling and Debugging Made Easy v1.7.4
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 1.6.8 All 40 releases
← All changes | lib/menu_view_plugins.php +108 -13 1.4.31.7.4 View file →
@@ -6,46 +6,61 @@
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
58 +// Check if we should warn about composer
59 +if (! empty( $cp_options['warn_composer'] ) ) {
60 + $composer_warning = code_profiler_composer_warning( $profile_path, $cp_options['display_name'] );
61 +}
62 +
48 63 $label = [];
49 64 $data = '';
50 65 $theme = esc_attr__('theme', 'code-profiler');
51 66 $total_time = 0;
@@ -70,9 +85,9 @@
70 85 continue;
71 86 }
72 87
73 88 // Check whether we should use the name or the slug
74 - if ( $cp_options['display_name'] == 'slug' ) {
89 + if ( $cp_options['display_name'] == 'slug') {
75 90 $n = $slugs[0];
76 91 } else {
77 92 $n = $slugs[2];
78 93 }
@@ -82,10 +97,13 @@
82 97 $n = mb_substr( $n, 0, $cp_options['truncate_name'] , 'utf-8') .'...';
83 98 }
84 99
85 100 // Mark theme as such
86 - if ( $slugs[3] == 'theme' ) {
101 + if ( $slugs[3] == 'theme') {
87 102 $label[] = "{$n} ($theme)";
103 + // ...and MU plugins
104 + } elseif ( $slugs[3] == 'mu-plugin') {
105 + $label[] = "{$n} (MU)";
88 106 } else {
89 107 $label[] = $n;
90 108 }
91 109
@@ -91,12 +109,12 @@
91 109
92 110 $data .= "{$slugs[1]},";
93 111 $total_time += $slugs[1];
94 112 }
95 -$data = rtrim( $data, ',' );
113 +$data = rtrim( $data, ',');
96 114 $count = count( $label ) - 1;
97 115 ?>
98 -<div style="width:80vw;margin:auto">
116 +<div style="width:80vw;margin:auto" aria-hidden="true">
99 117 <canvas id="myChart"></canvas>
100 118 </div>
101 119 <script>
102 120 jQuery(document).ready(function() {
@@ -111,12 +129,89 @@
111 129 [<?php echo esc_js( $data ) ?>], <?php echo esc_js( number_format( $total_time, 4 ) ) ?>
112 130 );
113 131 });
114 132 </script>
133 +
134 +<!-- Screen-reader only -->
135 +<div class="visually-hidden">
115 136 <?php
137 + $sr_data = explode(',', $data );
138 + echo "<table>\n".
139 + "\t<tr>\n".
140 + "\t\t<td>". esc_html__('Component name', 'code-profiler') ."</td>".
141 + "<td>". esc_html__('Time in seconds', 'code-profiler') ."</td>".
142 + "<td>". esc_html__('Time in percentage', 'code-profiler') ."</td>\n";
143 + for( $i = 0; $i <= $count; $i++ ) {
144 + if ( empty( $sr_data[ $i ] ) ) {
145 + $sr_data[ $i ] = 0;
146 + }
147 + echo "\t<tr>\n\t\t<td>". esc_html( $label[ $i ] ) ."</td>".
148 + "<td>". esc_html( number_format( $sr_data[ $i ], 3 ) ) ."</td>".
149 + "<td>". esc_html( number_format( ( $sr_data[ $i ] / $total_time ) * 100 ) ) .
150 + "%</td>\n\t</tr>\n";
151 + }
152 + echo "</table>\n";
153 +?>
154 +</div>
155 +<!-- End of Screen-reader only -->
156 +
157 +<?php
116 158 // Actions below stats
117 159 $save_png = 1;
118 160 $rotate_img = 1;
119 161 $type = 'slugs';
120 162
163 +// ===================================================================== 2023-11-17
164 +// Warn if multiple plugins are using composer
165 +
166 +function code_profiler_composer_warning( $profile_path, $display_name ) {
167 +
168 + if (! file_exists( "$profile_path.composer.profile" ) ) {
169 + return;
170 + }
171 + $res = json_decode( file_get_contents( "$profile_path.composer.profile" ), true );
172 + // Make sure there are at least two items (free version only)
173 + if ( $res === false || count( $res ) < 2 ) {
174 + return;
175 + }
176 +
177 + $list = '';
178 + $first = '';
179 + $count = 1;
180 + foreach( $res as $slug => $name ) {
181 + if ( $display_name == 'full') {
182 + $list .= "$count: <strong>". esc_html( $name ) .'</strong>, ';
183 + if ( empty( $first ) ) {
184 + $first = '<strong>'. esc_html( $name ) .'</strong>';
185 + }
186 + } else {
187 + $list .= "$count: <strong>". esc_html( $slug ) .'</strong>, ';
188 + if ( empty( $first ) ) {
189 + $first = '<strong>'. esc_html( $slug ) .'</strong>';
190 + }
191 + }
192 + $count++;
193 + }
194 + $list = rtrim( $list, ', ') .'.';
195 +
196 + $msg = esc_html__('Code Profiler has detected that the following components, sorted by execution'.
197 + ' order, are using Composer dependency manager:', 'code-profiler') . "<br />$list<br />".
198 + sprintf(
199 + esc_html__(
200 + 'As that may increase the execution time of %s, make sure to consult the following FAQ: '.
201 + '%s%s%s', 'code-profiler'
202 + ),
203 + $first,
204 + '<a href="?page=code-profiler&cptab=faq#composerwarning" target="_blank" rel="noopener '.
205 + 'noreferrer">',
206 + esc_html__(
207 + 'Why does Code Profiler warn me that I have multiple plugins using Composer?',
208 + 'code-profiler'
209 + ),
210 + '</a>'
211 + );
212 +
213 + return '<div class="cp-notice cp-notice-orange"><p>'. $msg .'</p></div>';
214 +
215 +}
121 216 // =====================================================================
122 217 // EOF