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_profiler.php +288 -154 1.6.101.9.6 View file →
@@ -6,9 +6,9 @@
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 14 if (! defined('ABSPATH') ) { die('Forbidden'); }
@@ -39,176 +39,264 @@
39 39 esc_html__('The following folder is not writable: %s. Please change its permissions or ownership so that Code Profiler can write to it.', 'code-profiler'), CODE_PROFILER_UPLOAD_DIR )
40 40 );
41 41 }
42 42
43 +/**
44 + * Check and warn if the Xdebug extension is loaded.
45 + */
46 +if ( extension_loaded('xdebug') ) {
47 + printf( CODE_PROFILER_WARNING_NOTICE,
48 + esc_html__('Warning: the PHP Xdebug extension is loaded. Consider disabling it as it can drastically impact the performance and results of Code Profiler.', 'code-profiler')
49 + );
50 +}
51 +
43 52 // Clear the log if it's too big
44 53 code_profiler_clearlog();
45 54
55 +// Clean-up temp files left in the profiles folder
56 +code_profiler_cleantmpfiles();
57 +
58 +/**
59 + * Create temporary folder and file used to profile cron events.
60 + */
61 +$error = code_profiler_create_tmpfile();
62 +if ( $error ) {
63 + printf( CODE_PROFILER_ERROR_NOTICE, esc_html( $error ) );
64 +}
65 +
46 66 $home = home_url('/'); // Frontend
47 67 $site = site_url('/'); // Backend
68 +
48 69 // Get user login name
49 70 $current_user = wp_get_current_user();
50 -// Profile's name
51 -$profile = code_profiler_profile_name();
52 71
53 72 $cp_options = get_option('code-profiler');
54 -// Memorized options
55 -if ( empty( $cp_options['mem_where'] ) ) {
56 - $cp_options['mem_where'] = 'frontend';
73 +/**
74 + * Check if we've been asked to re-run a profile.
75 + */
76 +if (! empty( $_REQUEST['action'] ) && $_REQUEST['action'] == 'rerun' &&
77 + ! empty( $_REQUEST['profiles'][0] ) ) {
78 + /**
79 + * Make sure the profile exists and get its full path.
80 + */
81 + $profile_path = code_profiler_get_profile_path( $_REQUEST['profiles'][0] );
82 + if ( $profile_path !== false ) {
83 +
84 + $cp_data = json_decode( file_get_contents("$profile_path.summary.profile"), true );
85 + if (! empty( $cp_data['rerun'] ) ) {
86 + $cp_options['mem'] = $cp_data['rerun'];
87 + $rerun = true;
88 + }
89 + }else {
90 + // Display why we don't want to run.
91 + wp_die( esc_html__('Missing profile ID.', 'code-profiler') );
92 + }
57 93 }
58 -if ( empty( $cp_options['mem_post'] ) ) {
59 - $cp_options['mem_post'] = '';
94 +// Profile's name
95 +if (! empty( $cp_options['mem']['profile'] ) ) {
96 + $profile = $cp_options['mem']['profile'];
97 +} else {
98 + $profile = code_profiler_profile_name();
60 99 }
61 -if ( empty( $cp_options['mem_user'] ) ) {
62 - $cp_options['mem_user'] = 'unauthenticated';
100 +/**
101 + * Memorized options from last run.
102 + */
103 +if ( empty( $cp_options['mem']['x_end'] ) ) {
104 + $cp_options['mem']['x_end'] = 'frontend';
63 105 }
64 -if ( $cp_options['mem_where'] == 'backend') {
65 - $cp_options['mem_user'] = 'authenticated';
106 +if ( empty( $cp_options['mem']['post'] ) ) {
107 + $cp_options['mem']['post'] = '';
66 108 }
67 -if ( empty( $cp_options['mem_method'] ) ) {
68 - $cp_options['mem_method'] = 'get';
109 +if ( empty( $cp_options['mem']['x_auth'] ) ) {
110 + $cp_options['mem']['x_auth'] = 'unauthenticated';
69 111 }
112 +if ( $cp_options['mem']['x_end'] == 'backend') {
113 + $cp_options['mem']['x_auth'] = 'authenticated';
114 +}
115 +if ( empty( $cp_options['mem']['method'] ) ) {
116 + $cp_options['mem']['method'] = 'get';
117 +}
70 118 $default_theme = get_option('stylesheet');
71 -if ( empty( $cp_options['mem_theme'] ) ) {
72 - $cp_options['mem_theme'] = $default_theme;
119 +if ( empty( $cp_options['mem']['theme'] ) ) {
120 + $cp_options['mem']['theme'] = $default_theme;
73 121 }
74 -if ( empty( $cp_options['ua'] ) ) {
75 - $cp_options['ua'] = 'Firefox';
122 +if ( empty( $cp_options['mem']['user_agent'] ) ) {
123 + $cp_options['mem']['user_agent'] = 'Firefox';
76 124 }
77 -$cookies = '';
78 -$payload = '';
79 -$custom_headers = '';
80 -$exclusions = [];
81 -
82 -if ( isset( $cp_options['cookies'] ) ) {
125 +if ( isset( $cp_options['mem']['cookies'] ) ) {
83 126 // stripslashes is only needed for cookies
84 - $cookies = trim( stripslashes( json_decode( $cp_options['cookies'] ) ) );
127 + $cookies = trim( stripslashes( json_decode( $cp_options['mem']['cookies'] ) ) );
128 +} else {
129 + $cookies = '';
85 130 }
86 -if ( empty( $cp_options['mem_content_type'] ) ||
87 - ! in_array( $cp_options['mem_content_type'], [ 1, 2 ] ) ) {
131 +if ( empty( $cp_options['mem']['content_type'] ) ||
132 + ! in_array( $cp_options['mem']['content_type'], [ 1, 2, 3 ] ) ) {
88 133
89 - $cp_options['mem_content_type'] = 1;
134 + $cp_options['mem']['content_type'] = 1;
90 135 }
91 -if ( isset( $cp_options['payload'] ) ) {
92 - $payload = trim( json_decode( $cp_options['payload'] ) );
136 +if ( isset( $cp_options['mem']['payload'] ) ) {
137 + $payload = trim( json_decode( $cp_options['mem']['payload'] ) );
138 +} else {
139 + $payload = '';
93 140 }
94 -if ( isset( $cp_options['custom_headers'] ) ) {
95 - $custom_headers = trim( json_decode( $cp_options['custom_headers'] ) );
141 +if ( isset( $cp_options['mem']['custom_headers'] ) ) {
142 + $custom_headers = trim( json_decode( $cp_options['mem']['custom_headers'] ) );
143 +} else {
144 + $custom_headers = '';
96 145 }
97 -if ( isset( $cp_options['exclusions'] ) ) {
98 - $exclusions = json_decode( $cp_options['exclusions'] );
146 +if ( isset( $cp_options['mem']['exclusions'] ) ) {
147 + $exclusions = json_decode( $cp_options['mem']['exclusions'] );
148 +} else {
149 + $exclusions = [];
99 150 }
151 +
100 152 ?>
101 -<table class="form-table">
153 +
154 +<table style="width:100%">
102 155 <tr>
103 - <th scope="row"><?php esc_html_e('Page to profile', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Select the page you want the profiler to analyze. It can be in the frontend of the site, in the admin backend or a custom URL.', 'code-profiler') ?>"></span></th>
104 156 <td>
105 - <p><label><input type="radio" name="where" value="frontend" onclick="cpjs_front_or_backend(1);"<?php checked( $cp_options['mem_where'], 'frontend') ?> /> <?php esc_html_e('Website frontend', 'code-profiler') ?></label>
106 - &nbsp;&nbsp;&nbsp;&nbsp;
107 - <label><input type="radio" name="where" value="custom" onclick="cpjs_front_or_backend(3);"<?php checked( $cp_options['mem_where'], 'custom') ?> /> <?php esc_html_e('Custom post/URL', 'code-profiler') ?></label>
108 - &nbsp;&nbsp;&nbsp;&nbsp;
109 - <label><input type="radio" name="where" value="backend" onclick="cpjs_front_or_backend(2);"<?php checked( $cp_options['mem_where'], 'backend') ?> /> <?php esc_html_e('Admin backend', 'code-profiler') ?></label>
110 - </p>
111 - <br />
112 - <?php
113 - if ( $cp_options['mem_where'] == 'frontend') {
114 - echo '<p id="p-frontend">';
115 - } else {
116 - echo '<p id="p-frontend" style="display:none">';
117 - }
118 - ?>
119 - <?php esc_html_e('Select a page:', 'code-profiler') ?>
120 - <select name="frontend" id="id-frontend">
121 - <?php echo code_profiler_fetch_pages( $home, $cp_options ); ?>
122 - </select>
123 - </p>
124 - <?php
125 - if ( $cp_options['mem_where'] == 'custom') {
126 - $value = $cp_options['mem_post'];
127 - echo '<p id="p-custom">';
128 - } else {
129 - $value = '';
130 - echo '<p id="p-custom" style="display:none">';
131 - }
132 - ?>
133 - <input name="custom" id="id-custom" type="text" value="<?php echo esc_attr( $value ) ?>" size="70" placeholder="<?php
134 - echo esc_attr(
135 - sprintf(
136 - __('e.g., %s', 'code-profiler'),
137 - "{$home}foo/bar/"
138 - )
139 - ) ?>" />
140 - </p>
141 - <?php
142 - if ( $cp_options['mem_where'] == 'backend') {
143 - echo '<p id="p-backend">';
144 - } else {
145 - echo '<p id="p-backend" style="display:none">';
146 - }
147 - if (! empty( $cp_options['mem_username'] ) ) {
148 - $username = $cp_options['mem_username'];
149 - } else {
150 - $username = $current_user->user_login;
151 - }
152 - ?>
153 - <?php esc_html_e('Select a page:', 'code-profiler') ?>
154 - <select name="backend" id="id-backend"><?php echo code_profiler_fetch_admin_pages( $site, $cp_options ) ?></select>
155 - </p>
157 + <table class="form-table">
158 + <tr>
159 + <th scope="row"><?php esc_html_e('Page to profile', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Select the page you want the profiler to analyze. It can be in the frontend of the site, in the admin backend, a custom URL or a cron event. Note that in case of a cron event, the "HTTP Method" option will be ignored by Code Profiler as it will always send a POST request with an empty payload.', 'code-profiler') ?>"></span></th>
160 + <td>
161 + <p><label><input type="radio" name="x_end" value="frontend" onclick="cpjs_front_or_backend(this.value);"<?php checked( $cp_options['mem']['x_end'], 'frontend') ?> /> <?php esc_html_e('Website frontend', 'code-profiler') ?></label>
162 + &nbsp;&nbsp;&nbsp;&nbsp;
163 + <label><input type="radio" name="x_end" value="custom" onclick="cpjs_front_or_backend(this.value);"<?php checked( $cp_options['mem']['x_end'], 'custom') ?> /> <?php esc_html_e('Custom post/URL', 'code-profiler') ?></label>
164 + &nbsp;&nbsp;&nbsp;&nbsp;
165 + <label><input type="radio" name="x_end" value="backend" onclick="cpjs_front_or_backend(this.value);"<?php checked( $cp_options['mem']['x_end'], 'backend') ?> /> <?php esc_html_e('Admin backend', 'code-profiler') ?></label>
166 + &nbsp;&nbsp;&nbsp;&nbsp;
167 + <label><input type="radio" name="x_end" value="wpcron" onclick="cpjs_front_or_backend(this.value);"<?php checked( $cp_options['mem']['x_end'], 'wpcron') ?> /> <?php esc_html_e('WP-Cron', 'code-profiler') ?></label>
168 + </p>
169 + <br />
170 + <?php
171 + if ( $cp_options['mem']['x_end'] == 'frontend') {
172 + echo '<p id="p-frontend">';
173 + } else {
174 + echo '<p id="p-frontend" style="display:none">';
175 + }
176 + ?>
177 + <?php esc_html_e('Select a page:', 'code-profiler') ?>
178 + <select name="frontend" id="id-frontend">
179 + <?php echo code_profiler_fetch_pages( $home, $cp_options ); ?>
180 + </select>
181 + </p>
182 + <?php
183 + if ( $cp_options['mem']['x_end'] == 'custom') {
184 + $value = $cp_options['mem']['post'];
185 + echo '<p id="p-custom">';
186 + } else {
187 + $value = '';
188 + echo '<p id="p-custom" style="display:none">';
189 + }
190 + ?>
191 + <input name="custom" id="id-custom" type="text" value="<?php echo esc_attr( $value ) ?>" size="70" placeholder="<?php
192 + echo esc_attr(
193 + sprintf(
194 + __('e.g., %s', 'code-profiler'),
195 + "{$home}foo/bar/"
196 + )
197 + ) ?>" />
198 + </p>
199 + <?php
200 + if ( $cp_options['mem']['x_end'] == 'backend') {
201 + echo '<p id="p-backend">';
202 + } else {
203 + echo '<p id="p-backend" style="display:none">';
204 + }
205 + if (! empty( $cp_options['mem']['username'] ) ) {
206 + $username = $cp_options['mem']['username'];
207 + } else {
208 + $username = $current_user->user_login;
209 + }
210 + ?>
211 + <?php esc_html_e('Select a page:', 'code-profiler') ?>
212 + <select name="backend" id="id-backend"><?php echo code_profiler_fetch_admin_pages( $site, $cp_options ) ?></select>
213 + </p>
214 + <?php
215 + /**
216 + * Cron tasks.
217 + */
218 + if ( $cp_options['mem']['x_end'] == 'wpcron') {
219 + echo '<p id="p-wpcron">';
220 + } else {
221 + echo '<p id="p-wpcron" style="display:none">';
222 + }
223 + ?>
224 + <?php esc_html_e('Select a cron event:', 'code-profiler') ?>
225 + <select name="wpcron" id="id-wpcron">
226 + <?php echo code_profiler_fetch_crontasks( $cp_options['mem']['post'] ); ?>
227 + </select>
228 + </p>
229 + </td>
230 + </tr>
231 + <tr>
232 + <th scope="row"><?php esc_html_e('Run profiler as', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('The profiler can access the requested page as an unauthenticated user (frontend only) or as an authenticated user (frontend and backend). You can enter the login name of any registered user, but make sure that the user has the required capability to access the page you are going to profile, otherwise Code Profiler will return an error if the user isn\'t allowed to access it.', 'code-profiler') ?>"></span></th>
233 + <td>
234 + <p><label><input type="radio" onclick="cpjs_authenticated(0);" name="x_auth" value="unauthenticated" id="user-unauthenticated"<?php checked( $cp_options['mem']['x_auth'], 'unauthenticated'); disabled( $cp_options['mem']['x_end'], 'backend'); ?> /> <?php esc_html_e('Unauthenticated user', 'code-profiler') ?></label></p>
235 + <p><label><input type="radio" onclick="cpjs_authenticated(1);" name="x_auth" value="authenticated" id="user-authenticated"<?php checked( $cp_options['mem']['x_auth'], 'authenticated') ?> /> <?php esc_html_e('Authenticated user', 'code-profiler') ?></label></p>
236 + <p><label><?php esc_html_e('User:', 'code-profiler') ?> <input type="text" name="username" id="user-name" value ="<?php esc_attr_e( $username ) ?>"<?php disabled( $cp_options['mem']['x_auth'], 'unauthenticated') ?> /></label></p>
237 + </td>
238 + </tr>
239 + <tr>
240 + <th scope="row"><?php esc_html_e('Theme', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('If you want to profile different themes, you can use this option so that you don\'t need to modify your WordPress settings. The change will not affect your visitors, but only the profiler when it is running.', 'code-profiler') ?>"></span></th>
241 + <td>
242 + <select name="theme" id="id-theme">
243 + <?php
244 + $themes = code_profiler_get_themes();
245 + foreach( $themes as $slug => $name ) {
246 + if ( $slug == $default_theme ) {
247 + echo '<option value=""'. selected( $cp_options['mem']['theme'], $slug, false ) .'>'.
248 + esc_html( $name['n'] ) .' '. __('(active theme)', 'code-profiler') .'</option>';
249 + } else {
250 + echo '<option value="'. esc_attr( $slug ) .'"'. selected( $cp_options['mem']['theme'], $slug, false ) .'>'.
251 + esc_html( $name['n'] ) .'</option>';
252 + }
253 + }
254 + ?>
255 + </select>
256 + </td>
257 + </tr>
258 + <tr>
259 + <th scope="row"><?php esc_html_e('User agent', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Some themes and plugins may execute different code depending on the type of device used to visit the website (e.g., a desktop computer, a mobile phone, a search engine bot etc). This option lets you change the User-Agent request header used by Code Profiler.', 'code-profiler') ?>"></span></th>
260 + <td>
261 + <select name="user_agent" id="ua-id">
262 + <?php
263 + foreach( CODE_PROFILER_UA as $types => $types_array ) {
264 + echo '<optgroup label="'. esc_attr( $types ) .'">';
265 + foreach( $types_array as $name => $value ) {
266 + echo '<option value="'. esc_attr( $name ) .'"'. selected( $cp_options['mem']['user_agent'], $name, false ) .'>'. esc_html( $name ) .'</option>';
267 + }
268 + echo '</optgroup>';
269 + }
270 + ?>
271 + </select>
272 + </td>
273 + </tr>
274 + <tr>
275 + <th scope="row"><?php esc_html_e('Name of the profile', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Enter the name for this profile. It will be saved to the "Profiles List" page, with all other profiles.', 'code-profiler') ?>"></span></th>
276 + <td>
277 + <p><label><input type="text" class="regular-text" name="profile" maxlength="100" value="<?php echo esc_attr( $profile ) ?>" id="profile-name" /></label></p>
278 + <p class="description"><?php esc_html_e('Max 100 characters', 'code-profiler') ?></p>
279 + </td>
280 + </tr>
281 + </table>
156 282 </td>
157 - </tr>
158 - <tr>
159 - <th scope="row"><?php esc_html_e('Run profiler as', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('The profiler can access the requested page as an unauthenticated user (frontend only) or as an authenticated user (frontend and backend). You can enter the login name of any registered user, but make sure that the user has the required capability to access the page you are going to profile, otherwise Code Profiler will return an error if the user isn\'t allowed to access it.', 'code-profiler') ?>"></span></th>
160 - <td>
161 - <p><label><input type="radio" onclick="cpjs_authenticated(0);" name="user" value="unauthenticated" id="user-unauthenticated"<?php checked( $cp_options['mem_user'], 'unauthenticated'); disabled( $cp_options['mem_where'], 'backend'); ?> /> <?php esc_html_e('Unauthenticated user', 'code-profiler') ?></label></p>
162 - <p><label><input type="radio" onclick="cpjs_authenticated(1);" name="user" value="authenticated" id="user-authenticated"<?php checked( $cp_options['mem_user'], 'authenticated') ?> /> <?php esc_html_e('Authenticated user', 'code-profiler') ?></label></p>
163 - <p><label><?php esc_html_e('User:', 'code-profiler') ?> <input type="text" name="username" id="user-name" value ="<?php esc_attr_e( $username ) ?>"<?php disabled( $cp_options['mem_user'], 'unauthenticated') ?> /></label></p>
283 + <td style="vertical-align:top;text-align: center">
284 + <?php
285 + /**
286 + * Display any available discount coupon.
287 + */
288 + CodeProfiler_WPCron::display_coupon();
289 + ?>
164 290 </td>
165 291 </tr>
166 - <tr>
167 - <th scope="row"><?php esc_html_e('Theme', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('If you want to profile different themes, you can use this option so that you don\'t need to modify your WordPress settings. The change will not affect your visitors, but only the profiler when it is running.', 'code-profiler') ?>"></span></th>
168 - <td>
169 - <select name="theme" id="id-theme">
170 - <?php
171 - $themes = code_profiler_get_themes();
172 - foreach( $themes as $slug => $name ) {
173 - if ( $slug == $default_theme ) {
174 - echo '<option value=""'. selected( $cp_options['mem_theme'], $slug, false ) .'>'.
175 - esc_html( $name['n'] ) .' '. __('(active theme)', 'code-profiler') .'</option>';
176 - } else {
177 - echo '<option value="'. esc_attr( $slug ) .'"'. selected( $cp_options['mem_theme'], $slug, false ) .'>'.
178 - esc_html( $name['n'] ) .'</option>';
179 - }
180 - }
181 - ?>
182 - </select>
183 - </td>
184 - </tr>
185 - <tr>
186 - <th scope="row"><?php esc_html_e('User agent', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Some themes and plugins may execute different code depending on the type of device used to visit the website (e.g., a desktop computer, a mobile phone, a search engine bot etc). This option lets you change the User-Agent request header used by Code Profiler.', 'code-profiler') ?>"></span></th>
187 - <td>
188 - <select name="ua" id="ua-id">
189 - <?php
190 - foreach( CODE_PROFILER_UA as $types => $types_array ) {
191 - echo '<optgroup label="'. esc_attr( $types ) .'">';
192 - foreach( $types_array as $name => $value ) {
193 - echo '<option value="'. esc_attr( $name ) .'"'. selected( $cp_options['ua'], $name, false ) .'>'. esc_html( $name ) .'</option>';
194 - }
195 - echo '</optgroup>';
196 - }
197 - ?>
198 - </select>
199 - </td>
200 - </tr>
201 - <tr>
202 - <th scope="row"><?php esc_html_e('Name of the profile', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Enter the name for this profile. It will be saved to the "Profiles List" page, with all other profiles.', 'code-profiler') ?>"></span></th>
203 - <td>
204 - <p><label><input type="text" class="regular-text" name="profile" maxlength="100" value="<?php echo esc_attr( $profile ) ?>" id="profile-name" /></label></p>
205 - <p class="description"><?php esc_html_e('Max 100 characters', 'code-profiler') ?></p>
206 - </td>
207 - </tr>
208 292 </table>
209 293 <?php
210 -if (! empty( $cookies ) || ! empty( $custom_headers ) || $cp_options['mem_method'] == 'post' || ! empty( $exclusions ) ) {
294 +if ( (! empty( $cookies ) || ! empty( $custom_headers ) ||
295 + $cp_options['mem']['method'] == 'post' || ! empty( $exclusions ) ) &&
296 + // We don't display the advanced section if the last profile was a cron event.
297 + $cp_options['mem']['x_end'] != 'wpcron' ) {
298 +
211 299 echo '<div id="cp-advanced-settings">';
212 300 $disabled_button = ' disabled';
213 301 } else {
214 302 echo '<div id="cp-advanced-settings" style="display:none">';
@@ -220,32 +308,36 @@
220 308 <th scope="row"><?php esc_html_e('HTTP Method', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('You can select which HTTP method will be used by the profiler: GET or POST. If you select POST, you can also send an optional payload.', 'code-profiler') ?>"></span></th>
221 309 <td>
222 310 <p>
223 311 <label>
224 - <input onclick="cpjs_get_post(0);" type="radio" name="method" value="get" id="get-method"<?php checked( $cp_options['mem_method'], 'get') ?> /> GET(<?php esc_html_e('default', 'code-profiler') ?>)
312 + <input onclick="cpjs_get_post(0);" type="radio" name="method" value="get" id="get-method"<?php checked( $cp_options['mem']['method'], 'get') ?> /> GET(<?php esc_html_e('default', 'code-profiler') ?>)
225 313 </label>
226 314 </p>
227 315 <p>
228 316 <label>
229 - <input onclick="cpjs_get_post(1);" type="radio" name="method" value="post" id="post-method"<?php checked( $cp_options['mem_method'], 'post') ?> /> POST
317 + <input onclick="cpjs_get_post(1);" type="radio" name="method" value="post" id="post-method"<?php checked( $cp_options['mem']['method'], 'post') ?> /> POST
230 318 </label>
231 319 </p>
232 320 <p>
233 321 <?php esc_html_e('Content-type:', 'code-profiler') ?>
234 - <select name="cp-content-type" id="id-content-type"<?php disabled( $cp_options['mem_method'], 'get') ?> onChange="cpjs_content_type(this.value);">
235 - <option value="1"<?php selected( $cp_options['mem_content_type'], 1 )?>>application/x-www-form-urlencoded (<?php esc_html_e('default', 'code-profiler') ?>)</option>
236 - <option value="2"<?php selected( $cp_options['mem_content_type'], 2 )?>>application/json</option>
322 + <select name="cp-content-type" id="id-content-type"<?php disabled( $cp_options['mem']['method'], 'get') ?> onChange="cpjs_content_type(this.value);">
323 + <option value="1"<?php selected( $cp_options['mem']['content_type'], 1 )?>>application/x-www-form-urlencoded (<?php esc_html_e('formatted', 'code-profiler') ?>)</option>
324 + <option value="3"<?php selected( $cp_options['mem']['content_type'], 3 )?>>application/x-www-form-urlencoded (<?php esc_html_e('raw', 'code-profiler') ?>)</option>
325 + <option value="2"<?php selected( $cp_options['mem']['content_type'], 2 )?>>application/json</option>
237 326 </select>
238 327 </p>
239 328 <p>
240 - <textarea name="post-value" id="post-value" class="regular-text code"<?php disabled( $cp_options['mem_method'], 'get') ?> maxlength="4000" rows="6"><?php echo esc_textarea( $payload ) ?></textarea>
329 + <textarea name="post-value" id="post-value" class="regular-text code"<?php disabled( $cp_options['mem']['method'], 'get') ?> maxlength="4000" rows="6"><?php echo esc_textarea( $payload ) ?></textarea>
241 330 </p>
242 - <p class="description" id="ct-1"<?php echo code_profiler_hide( $cp_options['mem_content_type'], 2) ?>>
331 + <p class="description" id="ct-1"<?php echo code_profiler_showhide( $cp_options['mem']['content_type'], 1 ) ?>>
243 332 <?php printf( esc_html__('Optional POST payload in %s format, one item per line.', 'code-profiler'), '<code>name=value</code>') ?> <?php printf( esc_html__('%sView example%s', 'code-profiler'), '<a href="'. plugins_url('/static/help/http_method-1.png', dirname( __FILE__ ) ) .'" target="_blank" rel="noopener noreferrer">', '</a>') ?>
244 333 </p>
245 - <p class="description" id="ct-2"<?php echo code_profiler_hide( $cp_options['mem_content_type'], 1) ?>>
246 - <?php printf( esc_html__('Optional JSON-encoded payload.', 'code-profiler'), '<code>name=value</code>') ?> <?php printf( esc_html__('%sView example%s', 'code-profiler'), '<a href="'. plugins_url('/static/help/http_method-2.png', dirname( __FILE__ ) ) .'" target="_blank" rel="noopener noreferrer">', '</a>') ?>
334 + <p class="description" id="ct-3"<?php echo code_profiler_showhide( $cp_options['mem']['content_type'], 3 ) ?>>
335 + <?php printf( esc_html__('Optional raw POST payload, on a single line.', 'code-profiler'), '<code>name=value</code>') ?> <?php printf( esc_html__('%sView example%s', 'code-profiler'), '<a href="'. plugins_url('/static/help/http_method-3.png', dirname( __FILE__ ) ) .'" target="_blank" rel="noopener noreferrer">', '</a>') ?>
247 336 </p>
337 + <p class="description" id="ct-2"<?php echo code_profiler_showhide( $cp_options['mem']['content_type'], 2 ) ?>>
338 + <?php printf( esc_html__('Optional JSON-encoded payload, on a single line.', 'code-profiler'), '<code>name=value</code>') ?> <?php printf( esc_html__('%sView example%s', 'code-profiler'), '<a href="'. plugins_url('/static/help/http_method-2.png', dirname( __FILE__ ) ) .'" target="_blank" rel="noopener noreferrer">', '</a>') ?>
339 + </p>
248 340 </td>
249 341 </tr>
250 342 <tr>
251 343 <th scope="row"><?php esc_html_e('Cookie', 'code-profiler') ?> <span class="code-profiler-tip" data-tip="<?php esc_attr_e('Some websites may execute different code if the user has one or more specific cookies. You can use this field for that purpose.', 'code-profiler') ?>"></span></th>
@@ -285,10 +377,16 @@
285 377 <br />
286 378 <div class="cp-progress-bar"><span id="cp-span-progress" style="width:0%"></span></div>
287 379 <img style="vertical-align:middle;display:none" id="progress-gif" src="<?php echo plugins_url('/static/progress.gif', dirname (__FILE__ ) ) ?>" />&nbsp;&nbsp;<font id="progress-text" style="display:none"><?php esc_html_e('Starting the profiler...', 'code-profiler') ?></font>
288 380 </div>
381 +<?php
289 382
290 -<?php
383 +/**
384 + * Re-run a profile.
385 + */
386 +if (! empty( $rerun ) ) {
387 + echo '<script>window.addEventListener("load", cpjs_start_profiler);</script>';
388 +}
291 389
292 390 // =====================================================================
293 391 // Fetch pages and posts.
294 392
@@ -295,13 +393,13 @@
295 393 function code_profiler_fetch_pages( $home, $cp_options ) {
296 394
297 395 $posts = '';
298 396
299 - if ( empty( $cp_options['mem_post'] ) ) {
300 - $cp_options['mem_post'] = $home;
397 + if ( empty( $cp_options['mem']['post'] ) ) {
398 + $cp_options['mem']['post'] = $home;
301 399 }
302 400
303 - if ( $cp_options['mem_post'] == $home ) {
401 + if ( $cp_options['mem']['post'] == $home ) {
304 402 $pages = sprintf(
305 403 '<option value="%1$s" title="%1$s" selected>%2$s</option>',
306 404 esc_attr( $home ),
307 405 esc_html__('Homepage', 'code-profiler')
@@ -329,9 +427,9 @@
329 427 $item->post_title = __('Untitled');
330 428 }
331 429 $permalink = get_permalink( $item->ID );
332 430
333 - if ( $cp_options['mem_post'] == $permalink ) {
431 + if ( $cp_options['mem']['post'] == $permalink ) {
334 432 $pages .= sprintf(
335 433 '<option value="%1$s" title="%1$s" selected>%2$s</option>',
336 434 esc_attr( $permalink ),
337 435 esc_html( $item->post_title )
@@ -358,10 +456,10 @@
358 456 function code_profiler_fetch_admin_pages( $home, $cp_options ) {
359 457
360 458 $backend = '';
361 459
362 - if ( empty( $cp_options['mem_post'] ) ) {
363 - $cp_options['mem_post'] = $home;
460 + if ( empty( $cp_options['mem']['post'] ) ) {
461 + $cp_options['mem']['post'] = $home;
364 462 }
365 463
366 464 if (! empty( $GLOBALS[ 'menu' ] ) ) {
367 465 foreach( $GLOBALS[ 'menu' ] as $menu => $value ) {
@@ -368,9 +466,9 @@
368 466 if (! empty( $value[0] ) && substr( $value[2], -4 ) == '.php') {
369 467 // E.g., "Comments", "Plugins" etc
370 468 $value[0] = trim( preg_replace('/\s*<.+$/', '', $value[0] ) );
371 469
372 - if ( $cp_options['mem_post'] == "{$home}wp-admin/{$value[2]}" ) {
470 + if ( $cp_options['mem']['post'] == "{$home}wp-admin/{$value[2]}" ) {
373 471 $backend .= sprintf(
374 472 '<option value="%1$s" title="%1$s" selected>%2$s</option>',
375 473 esc_attr("{$home}wp-admin/{$value[2]}"),
376 474 esc_html( $value[0] )
@@ -393,8 +491,44 @@
393 491 );
394 492
395 493 }
396 494 return $backend;
495 +}
496 +
497 +// =====================================================================
498 +// Fetch scheduled tasks.
499 +
500 +function code_profiler_fetch_crontasks( $mem ) {
501 +
502 + $cron_list = '';
503 +
504 + $wp_crons = code_profiler_get_crons();
505 +
506 + if ( empty( $wp_crons ) ) {
507 + $cron_list = sprintf(
508 + '<option value="0">%s</option>',
509 + esc_html__('No cron tasks found.', 'code-profiler')
510 + );
511 + return $cron_list;
512 + }
513 +
514 + foreach( $wp_crons as $cron ) {
515 +
516 + if ( $mem == $cron ) {
517 + $selected = ' selected';
518 + } else {
519 + $selected = '';
520 + }
521 +
522 + $cron_list .= sprintf(
523 + "<option value='%s'%s>%s</option>",
524 + esc_attr( $cron ),
525 + $selected,
526 + esc_html( $cron )
527 + );
528 + }
529 +
530 + return $cron_list;
397 531 }
398 532
399 533 // =====================================================================
400 534 // EOF