PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.9.2
Admin and Site Enhancements (ASE) v4.9.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / classes / class-settings-fields-render.php
admin-site-enhancements / classes Last commit date
class-activation.php 3 years ago class-admin-interface.php 3 years ago class-common-methods.php 3 years ago class-content-management.php 3 years ago class-custom-code.php 3 years ago class-deactivation.php 3 years ago class-disable-components.php 3 years ago class-login-logout.php 3 years ago class-optimizations.php 3 years ago class-security.php 3 years ago class-settings-fields-render.php 3 years ago class-settings-sanitization.php 3 years ago class-settings-sections-fields.php 3 years ago class-utilities.php 3 years ago
class-settings-fields-render.php
776 lines
1 <?php
2
3 namespace ASENHA\Classes;
4
5 /**
6 * Class related to rendering of settings fields on the admin page
7 *
8 * @since 2.2.0
9 */
10 class Settings_Fields_Render {
11
12 /**
13 * Render checkbox field as a toggle/switcher
14 *
15 * @since 1.0.0
16 */
17 function render_checkbox_toggle( $args ) {
18
19 $options = get_option( ASENHA_SLUG_U, array() );
20
21 $field_name = $args['field_name'];
22 $field_description = $args['field_description'];
23 $field_option_value = ( array_key_exists( $args['field_id'], $options ) ) ? $options[$args['field_id']] : false;
24
25 echo '<input type="checkbox" id="' . esc_attr( $field_name ) . '" class="asenha-field-checkbox" name="' . esc_attr( $field_name ) . '" ' . checked( $field_option_value, true, false ) . '>';
26 echo '<label for="' . esc_attr( $field_name ) . '"></label>';
27
28 // For field with additional options / sub-fields, we add a wrapper to enclose field descriptions
29 if ( array_key_exists( 'field_options_wrapper', $args ) && $args['field_options_wrapper'] ) {
30 // For when the options / sub-fields occupy lengthy vertical space, we add show all / less toggler
31 if ( array_key_exists( 'field_options_moreless', $args ) && $args['field_options_moreless'] ) {
32 echo '<div class="asenha-field-with-options field-show-more">';
33 echo '<a id="' . $args['field_slug'] . '-show-moreless" class="show-more-less show-more" href="#">Expand &#9660;</a>';
34 echo '<div class="asenha-field-options-wrapper wrapper-show-more">';
35 } else {
36 echo '<div class="asenha-field-with-options">';
37 echo '<div class="asenha-field-options-wrapper">';
38 }
39
40 }
41
42 echo '<div class="asenha-field-description">' . wp_kses_post( $field_description ) . '</div>';
43
44 // For field with additional options / sub-fields, we add wrapper for them
45 if ( array_key_exists( 'field_options_wrapper', $args ) && $args['field_options_wrapper'] ) {
46 echo '<div class="asenha-subfields" style="display:none"></div>';
47 }
48
49
50 // For field with additional options / sub-fields, we add a wrapper to enclose field descriptions
51 if ( array_key_exists( 'field_options_wrapper', $args ) && $args['field_options_wrapper'] ) {
52 echo '</div>';
53 echo '</div>';
54 }
55
56 }
57
58 /**
59 * Render checkbox field as sub-field of a toggle/switcher checkbox
60 *
61 * @since 1.9.0
62 */
63 function render_checkbox_plain( $args ) {
64
65 $options = get_option( ASENHA_SLUG_U, array() );
66
67 $field_name = $args['field_name'];
68 $field_label = $args['field_label'];
69 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : false;
70
71 echo '<input type="checkbox" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox" name="' . esc_attr( $field_name ) . '" ' . checked( $field_option_value, true, false ) . '>';
72 echo '<label for="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox-label">' . wp_kses_post( $field_label ) . '</label>';
73
74 }
75
76 /**
77 * Render checkbox field as sub-field of a toggle/switcher checkbox
78 *
79 * @since 1.3.0
80 */
81 function render_checkbox_subfield( $args ) {
82
83 $options = get_option( ASENHA_SLUG_U, array() );
84
85 $field_name = $args['field_name'];
86 $field_label = $args['field_label'];
87 $field_option_value = ( isset( $options[$args['parent_field_id']][$args['field_id']] ) ) ? $options[$args['parent_field_id']][$args['field_id']] : false;
88
89 echo '<input type="checkbox" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox" name="' . esc_attr( $field_name ) . '" ' . checked( $field_option_value, true, false ) . '>';
90 echo '<label for="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox-label">' . wp_kses_post( $field_label ) . '</label>';
91
92 }
93
94 /**
95 * Render radio buttons field as sub-field of a toggle/switcher checkbox
96 *
97 * @since 1.3.0
98 */
99 function render_radio_buttons_subfield( $args ) {
100
101 $options = get_option( ASENHA_SLUG_U, array() );
102
103 $field_id = $args['field_id'];
104 $field_name = $args['field_name'];
105 // $field_label = $args['field_label'];
106 $field_radios = $args['field_radios'];
107 if ( ! empty( $args['field_default'] ) ) {
108 $default_value = $args['field_default'];
109 } else {
110 $default_value = false;
111 }
112 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : $default_value;
113
114 foreach ( $field_radios as $radio_label => $radio_value ) {
115 echo '<input type="radio" id="' . esc_attr( $field_id . '_' . $radio_value ) . '" class="asenha-subfield-radio-button" name="' . esc_attr( $field_name ) . '" value="' . $radio_value . '" ' . checked( $radio_value, $field_option_value, false ) . '>';
116 echo '<label for="' . esc_attr( $field_id . '_' . $radio_value ) . '" class="asenha-subfield-radio-button-label">' . wp_kses_post( $radio_label ) . '</label>';
117 }
118
119 }
120
121 /**
122 * Render text field as sub-field of a toggle/switcher checkbox
123 *
124 * @since 1.4.0
125 */
126 function render_text_subfield( $args ) {
127
128 $options = get_option( ASENHA_SLUG_U, array() );
129
130 $field_id = $args['field_id'];
131 $field_name = $args['field_name'];
132 $field_type = $args['field_type'];
133 $field_prefix = $args['field_prefix'];
134 $field_suffix = $args['field_suffix'];
135 $field_description = $args['field_description'];
136 $field_placeholder = isset( $args['field_placeholder'] ) ? $args['field_placeholder'] : '';
137 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
138
139 if ( ! empty( $field_prefix ) && ! empty( $field_suffix ) ) {
140 $field_classname = ' with-prefix with-suffix';
141 } elseif ( ! empty( $field_prefix ) && empty( $field_suffix ) ) {
142 $field_classname = ' with-prefix';
143 } elseif ( empty( $field_prefix ) && ! empty( $field_suffix ) ) {
144 $field_classname = ' with-suffix';
145 } else {
146 $field_classname = '';
147 }
148
149 if ( $field_id == 'custom_login_slug' ) {
150 $field_placeholder = 'e.g. backend';
151 } elseif ( $field_id == 'redirect_after_login_to_slug' ) {
152 $field_placeholder = 'e.g. my-account';
153 } elseif ( $field_id == 'redirect_after_logout_to_slug' ) {
154 $field_placeholder = 'e.g. come-visit-again';
155 } elseif ( $field_id == 'login_fails_allowed' ) {
156 $field_placeholder = '3';
157 } elseif ( $field_id == 'login_lockout_maxcount' ) {
158 $field_placeholder = '3';
159 } else {}
160
161 echo $field_prefix . '<input type="text" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text' . esc_attr( $field_classname ) . '" name="' . esc_attr( $field_name ) . '" placeholder="' . esc_attr( $field_placeholder ) . '" value="' . esc_attr( $field_option_value ) . '">' . $field_suffix;
162 echo '<label for="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox-label">' . esc_html( $field_description ) . '</label>';
163
164 }
165
166 /**
167 * Render description field as sub-field of a toggle/switcher checkbox
168 *
169 * @since 4.6.0
170 */
171 function render_description_subfield( $args ) {
172
173 $field_description = $args['field_description'];
174
175 echo '<div class="asenha-subfield-description">' . $field_description . '</div>';
176
177 }
178
179 /**
180 * Render password field as sub-field of a toggle/switcher checkbox
181 *
182 * @since 4.1.0
183 */
184 function render_password_subfield( $args ) {
185
186 $options = get_option( ASENHA_SLUG_U, array() );
187
188 $field_id = $args['field_id'];
189 $field_name = $args['field_name'];
190 $field_type = $args['field_type'];
191 $field_prefix = $args['field_prefix'];
192 $field_suffix = $args['field_suffix'];
193 $field_description = $args['field_description'];
194 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
195
196 if ( ! empty( $field_prefix ) && ! empty( $field_suffix ) ) {
197 $field_classname = ' with-prefix with-suffix';
198 } elseif ( ! empty( $field_prefix ) && empty( $field_suffix ) ) {
199 $field_classname = ' with-prefix';
200 } elseif ( empty( $field_prefix ) && ! empty( $field_suffix ) ) {
201 $field_classname = ' with-suffix';
202 } else {
203 $field_classname = '';
204 }
205
206 $placeholder = '';
207
208 echo $field_prefix . '<input type="password" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-password' . esc_attr( $field_classname ) . '" name="' . esc_attr( $field_name ) . '" placeholder="' . esc_attr( $placeholder ) . '" size="24" autocomplete="off" value="' . base64_decode( $field_option_value ) . '">' . $field_suffix;
209 echo '<label for="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox-label">' . esc_html( $field_description ) . '</label>';
210
211 }
212
213 /**
214 * Render number field as sub-field of a toggle/switcher checkbox
215 *
216 * @since 1.4.0
217 */
218 function render_number_subfield( $args ) {
219
220 $options = get_option( ASENHA_SLUG_U, array() );
221
222 $field_id = $args['field_id'];
223 $field_name = $args['field_name'];
224 $field_type = $args['field_type'];
225 $field_prefix = $args['field_prefix'];
226 $field_suffix = $args['field_suffix'];
227 $field_intro = $args['field_intro'];
228 $field_description = $args['field_description'];
229 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
230
231 if ( ! empty( $field_prefix ) && ! empty( $field_suffix ) ) {
232 $field_classname = ' with-prefix with-suffix';
233 } elseif ( ! empty( $field_prefix ) && empty( $field_suffix ) ) {
234 $field_classname = ' with-prefix';
235 } elseif ( empty( $field_prefix ) && ! empty( $field_suffix ) ) {
236 $field_classname = ' with-suffix';
237 } else {
238 $field_classname = '';
239 }
240
241 if ( ( $field_id == 'revisions_max_number' ) || ( $field_id == 'head_code_priority' ) || ( $field_id == 'body_code_priority' ) || ( $field_id == 'footer_code_priority' ) ) {
242 $placeholder = '10';
243 } else {
244 $placeholder = '';
245 }
246
247 echo '<div class="asenha-subfield-number-wrapper">';
248
249 if ( ! empty( $field_intro ) ) {
250 echo '<div class="asenha-subfield-number-intro">' . wp_kses_post( $field_intro ) . '</div>';
251 }
252
253 echo '<div>' . $field_prefix . '<input type="number" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-number' . esc_attr( $field_classname ) . '" name="' . esc_attr( $field_name ) . '" placeholder="' . esc_attr( $placeholder ) . '" value="' . esc_attr( $field_option_value ) . '">' . $field_suffix . '</div>';
254
255 if ( ! empty( $field_description ) ) {
256 echo '<div class="asenha-subfield-number-description">' . wp_kses_post( $field_description ) . '</div>';
257 }
258
259 echo '</div>';
260
261 }
262
263 /**
264 * Render select field as sub-field of a toggle/switcher checkbox
265 *
266 * @since 1.4.0
267 */
268 function render_select_subfield( $args ) {
269
270 $options = get_option( ASENHA_SLUG_U, array() );
271
272 $field_id = $args['field_id'];
273 $field_name = $args['field_name'];
274 $field_type = $args['field_type'];
275 $field_prefix = $args['field_prefix'];
276 $field_suffix = $args['field_suffix'];
277 $field_select_options = $args['field_select_options'];
278 $field_select_default = $args['field_select_default'];
279 $field_intro = $args['field_intro'];
280 $field_description = $args['field_description'];
281 if ( ! empty( $args['field_select_default'] ) ) {
282 $default_value = $args['field_select_default'];
283 } else {
284 $default_value = false;
285 }
286 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : $default_value;
287
288 if ( ! empty( $field_prefix ) && ! empty( $field_suffix ) ) {
289 $field_classname = ' with-prefix with-suffix';
290 } elseif ( ! empty( $field_prefix ) && empty( $field_suffix ) ) {
291 $field_classname = ' with-prefix';
292 } elseif ( empty( $field_prefix ) && ! empty( $field_suffix ) ) {
293 $field_classname = ' with-suffix';
294 } else {
295 $field_classname = '';
296 }
297
298 if ( $args['display_none_on_load'] ) {
299 $inline_style = ' style="display:none;"';
300 } else {
301 $inline_style = '';
302 }
303
304 echo '<div class="asenha-subfield-select-wrapper">';
305
306 if ( ! empty( $field_intro ) ) {
307 echo '<div class="asenha-subfield-select-intro">' . wp_kses_post( $field_intro ) . '</div>';
308 }
309
310 echo '<div' . $inline_style . ' class="asenha-subfield-select-inner">' . $field_prefix;
311 echo '<select name="' . $field_name . '" class="asenha-subfield-select' . esc_attr( $field_classname ) . '">';
312
313 foreach ( $field_select_options as $label => $value ) {
314 echo '<option value="' . $value . '" ' . selected( $value, $field_option_value, false ) . '>' . $label . '</option>';
315 }
316
317 echo '</select>';
318 echo $field_suffix . '</div>';
319
320 if ( ! empty( $field_description ) ) {
321 echo '<div class="asenha-subfield-select-description">' . wp_kses_post( $field_description ) . '</div>';
322 }
323
324 echo '</div>';
325
326 }
327
328 /**
329 * Render textarea field as sub-field of a toggle/switcher checkbox
330 *
331 * @since 2.3.0
332 */
333 function render_textarea_subfield( $args ) {
334
335 $options = get_option( ASENHA_SLUG_U, array() );
336
337 $field_id = $args['field_id'];
338 $field_slug = $args['field_slug'];
339 $field_name = $args['field_name'];
340 $field_type = $args['field_type'];
341 $field_rows = $args['field_rows'];
342 $field_intro = $args['field_intro'];
343 $field_description = $args['field_description'];
344 $field_placeholder = isset( $args['field_placeholder'] ) ? $args['field_placeholder'] : '';
345
346 // Always load textarea content from robots.txt URL, whether it's a real, custom-made robots.txt file or a virtual one generated by WordPress
347 if ( 'robots_txt_content' == $field_id ) {
348 if ( array_key_exists( 'manage_robots_txt', $options ) ) {
349 if ( ! $options['manage_robots_txt'] ) { // Manage robots.txt feature is NOT enabled
350 if ( array_key_exists( 'robots_txt_content', $options ) && $options['robots_txt_content'] ) {
351 $field_option_value = $options['robots_txt_content'];
352 } else {
353 $robots_txt_content = wp_remote_get( get_site_url() . '/robots.txt' );
354 $robots_txt_content = esc_textarea( trim( wp_remote_retrieve_body( $robots_txt_content ) ) );
355 $field_option_value = $robots_txt_content;
356 }
357 } else { // Manage robots.txt feature is enabled
358 if ( array_key_exists( 'robots_txt_content', $options ) && $options['robots_txt_content'] ) {
359 $field_option_value = $options['robots_txt_content'];
360 } else {
361 $robots_txt_content = wp_remote_get( get_site_url() . '/robots.txt' );
362 $robots_txt_content = esc_textarea( trim( wp_remote_retrieve_body( $robots_txt_content ) ) );
363 $field_option_value = $robots_txt_content;
364 }
365 }
366 } else { // Manage robots.txt feature has never been enabled yet
367 $robots_txt_content = wp_remote_get( get_site_url() . '/robots.txt' );
368 $robots_txt_content = esc_textarea( trim( wp_remote_retrieve_body( $robots_txt_content ) ) );
369 $field_option_value = $robots_txt_content;
370 }
371 } else {
372 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
373 }
374
375 echo '<div class="asenha-subfield-textarea-wrapper">';
376
377 if ( ! empty( $field_intro ) ) {
378 echo '<div class="asenha-subfield-textarea-intro">' . wp_kses_post( $field_intro ) . '</div>';
379 }
380
381
382 echo '<textarea rows="' . $field_rows . '" class="asenha-subfield-textarea" id="' . esc_attr( $field_name ) . '" name="' . esc_attr( $field_name ) . '" placeholder="' . esc_attr( $field_placeholder ) . '">' . esc_textarea( $field_option_value ) . '</textarea>';
383
384 if ( ! empty( $field_description ) ) {
385 echo '<div class="asenha-subfield-textarea-description">' . wp_kses_post( $field_description ) . '</div>';
386 }
387
388 echo '</div>';
389
390 }
391
392 /**
393 * Render sortable menu field
394 *
395 * @since 2.0.0
396 */
397 function render_sortable_menu( $args ) {
398
399 ?>
400 <div class="subfield-description">Drag and drop menu items to the desired position. Optionally change item titles or hide some items until "Show All" at the bottom of the admin menu is clicked.</div>
401 <ul id="custom-admin-menu" class="menu ui-sortable">
402 <?php
403
404 global $menu, $submenu;
405 $common_methods = new Common_Methods;
406 $options = get_option( ASENHA_SLUG_U, array() );
407
408 // Set menu items to be excluded from title renaming. These are from WordPress core.
409 $renaming_not_allowed = array( 'menu-dashboard', 'menu-pages', 'menu-posts', 'menu-media', 'menu-comments', 'menu-appearance', 'menu-plugins', 'menu-users', 'menu-tools', 'menu-settings' );
410
411 // Get custom menu item titles
412 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
413 $custom_menu_titles = $options['custom_menu_titles'];
414 $custom_menu_titles = explode( ',', $custom_menu_titles );
415 } else {
416 $custom_menu_titles = array();
417 }
418
419 // Get hidden menu items
420 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
421 $hidden_menu = $options['custom_menu_hidden'];
422 $hidden_menu = explode( ',', $hidden_menu );
423 } else {
424 $hidden_menu = array();
425 }
426
427 $i = 1;
428
429 // Check if there's an existing custom menu order data stored in options
430
431 if ( array_key_exists( 'custom_menu_order', $options ) ) {
432
433 $custom_menu = $options['custom_menu_order'];
434 $custom_menu = explode( ',', $custom_menu );
435
436 $menu_key_in_use = array();
437
438 // Render sortables with data in custom menu order
439
440 foreach ( $custom_menu as $custom_menu_item ) {
441
442 foreach ( $menu as $menu_key => $menu_info ) {
443
444 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
445 $menu_item_id = $menu_info[2];
446 } else {
447 $menu_item_id = $menu_info[5];
448 }
449
450 if ( $custom_menu_item == $menu_item_id ) {
451
452 ?>
453 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
454 <div class="menu-item-bar">
455 <div class="menu-item-handle ui-sortable-handle">
456 <div class="item-title">
457 <span class="menu-item-title">
458 <?php
459
460 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
461 $separator_name = $menu_info[2];
462 $separator_name = str_replace( 'separator', 'Separator-', $separator_name );
463 $separator_name = str_replace( '--last', '-Last', $separator_name );
464 echo '~~ ' . esc_html( $separator_name ) . ' ~~';
465 } else {
466 if ( in_array( $menu_item_id, $renaming_not_allowed ) ) {
467 // echo wp_kses_post( $menu_info[0] );
468 echo wp_kses_post( $common_methods->strip_html_tags_and_content( $menu_info[0] ) );
469 } else {
470
471 // Get defaul/custom menu item title
472 foreach ( $custom_menu_titles as $custom_menu_title ) {
473
474 // At this point, $custom_menu_title value looks like toplevel_page_snippets__Code Snippets
475
476 $custom_menu_title = explode( '__', $custom_menu_title );
477
478 if ( $custom_menu_title[0] == $menu_item_id ) {
479 $menu_item_title = $common_methods->strip_html_tags_and_content( $custom_menu_title[1] ); // e.g. Code Snippets
480 break; // stop foreach loop so $menu_item_title is not overwritten in the next iteration
481 } else {
482 $menu_item_title = $common_methods->strip_html_tags_and_content( $menu_info[0] );
483 }
484
485 }
486
487 ?>
488 <input type="text" value="<?php echo wp_kses_post( $menu_item_title ); ?>" class="menu-item-custom-title" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
489 <?php
490 }
491 }
492
493 ?>
494 </span>
495 <label class="menu-item-checkbox-label">
496 <?php
497 if ( in_array( $custom_menu_item, $hidden_menu ) ) {
498 ?>
499 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>" checked>
500 <span>Hide</span>
501 <?php
502 } else {
503 ?>
504 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
505 <span>Hide</span>
506 <?php
507 }
508 ?>
509 </label>
510 </div>
511 </div>
512 </div>
513 <?php
514
515 $i = 1;
516
517 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
518 ?>
519 <div class="menu-item-settings wp-clearfix" style="display:none;">
520 <?php
521
522 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
523
524 $i++;
525
526 // echo $submenu_item[0];
527
528 }
529 ?>
530 </div>
531 <?php
532
533 }
534 ?>
535 </li>
536
537 <?php
538
539 $menu_key_in_use[] = $menu_key;
540
541 }
542
543 }
544
545 }
546
547 // Render the rest of the current menu towards the end of the sortables
548
549 foreach ( $menu as $menu_key => $menu_info ) {
550
551 if ( ! in_array( $menu_key, $menu_key_in_use ) ) {
552
553 $menu_item_id = $menu_info[5];
554 $menu_item_title = $menu_info[0];
555
556 // Exclude Show All/Less toggles
557
558 if ( false === strpos( $menu_item_id, 'toplevel_page_asenha_' ) ) {
559
560 ?>
561 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
562 <div class="menu-item-bar">
563 <div class="menu-item-handle ui-sortable-handle">
564 <div class="item-title">
565 <span class="menu-item-title">
566 <input type="text" value="<?php echo wp_kses_post( $menu_item_title ); ?>" class="menu-item-custom-title" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
567 </span>
568 <label class="menu-item-checkbox-label">
569 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
570 <span>Hide</span>
571 </label>
572 </div>
573 </div>
574 </div>
575 <?php
576
577 }
578
579 $i = 1;
580
581 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
582 ?>
583 <div class="menu-item-settings wp-clearfix" style="display:none;">
584 <?php
585
586 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
587
588 $i++;
589
590 // echo $submenu_item[0];
591
592 }
593 ?>
594 </div>
595 <?php
596
597 }
598 ?>
599 </li>
600
601 <?php
602
603 }
604
605 }
606
607 } else {
608
609 // Render sortables with existing items in the admin menu
610
611 foreach ( $menu as $menu_key => $menu_info ) {
612
613 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
614 $menu_item_id = $menu_info[2];
615 } else {
616 $menu_item_id = $menu_info[5];
617 }
618
619 ?>
620 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
621 <div class="menu-item-bar">
622 <div class="menu-item-handle ui-sortable-handle">
623 <div class="item-title">
624 <span class="menu-item-title">
625 <?php
626
627 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
628 $separator_name = $menu_info[2];
629 $separator_name = str_replace( 'separator', 'Separator-', $separator_name );
630 $separator_name = str_replace( '--last', '-Last', $separator_name );
631 echo '~~ ' . esc_html( $separator_name ) . ' ~~';
632 } else {
633 if ( in_array( $menu_item_id, $renaming_not_allowed ) ) {
634 echo wp_kses_post( $common_methods->strip_html_tags_and_content( $menu_info[0] ) );
635 } else {
636 ?>
637 <input type="text" value="<?php echo wp_kses_post( $common_methods->strip_html_tags_and_content( $menu_info[0] ) ); ?>" class="menu-item-custom-title" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
638 <?php
639 }
640 }
641
642 ?>
643 </span>
644 <label class="menu-item-checkbox-label">
645 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
646 <span>Hide</span>
647 </label>
648 </div>
649 </div>
650 </div>
651 <?php
652
653 $i = 1;
654
655 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
656 ?>
657 <div class="menu-item-settings wp-clearfix" style="display:none;">
658 <?php
659
660 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
661
662 $i++;
663
664 // echo $submenu_item[0];
665
666 }
667 ?>
668 </div>
669 <?php
670
671 }
672 ?>
673 </li>
674
675 <?php
676
677 }
678
679
680 }
681
682
683 ?>
684 </ul>
685 <?php
686
687 $field_id = $args['field_id'];
688 $field_name = $args['field_name'];
689 $field_description = $args['field_description'];
690 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
691
692 // Hidden input field to store custom menu order (from options as is, or sortupdate) upon clicking Save Changes.
693 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
694
695 $field_id = 'custom_menu_titles';
696 $field_name = ASENHA_SLUG_U . '['. $field_id .']';
697 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : '';
698
699 // Hidden input field to store custom menu titles (from options as is, or custom values entered on each non-WP-default menu items.
700 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
701
702 $field_id = 'custom_menu_hidden';
703 $field_name = ASENHA_SLUG_U . '['. $field_id .']';
704 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : '';
705
706 // Hidden input field to store hidden menu itmes (from options as is, or 'Hide' checkbox clicks) upon clicking Save Changes.
707 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
708
709 }
710
711 /**
712 * Render textarea field as sub-field of a toggle/switcher checkbox
713 *
714 * @since 2.3.0
715 */
716 function render_datatable( $args ) {
717
718 global $wpdb;
719
720 $options = get_option( ASENHA_SLUG_U, array() );
721
722 $field_id = $args['field_id'];
723 $field_slug = $args['field_slug'];
724 $field_name = $args['field_name'];
725 $field_type = $args['field_type'];
726 $field_description = $args['field_description'];
727 $table_title = $args['table_title'];
728 $table_name = $args['table_name'];
729 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
730
731 ?>
732 <table id="login-attempts-log" class="wp-list-table widefat striped datatable">
733 <thead>
734 <tr class="datatable-tr">
735 <th class="datatable-th">IP Address<br />Last Username</th>
736 <th class="datatable-th">Attempts<br />Lockouts</th>
737 <th class="datatable-th">Last Attempt On</th>
738 </tr>
739 </thead>
740 <tbody>
741 <?php
742
743 $limit = 1000;
744
745 $sql = $wpdb->prepare( "SELECT * FROM {$table_name} ORDER BY unixtime DESC LIMIT %d", array( $limit ) );
746
747 $entries = $wpdb->get_results( $sql, ARRAY_A );
748
749 foreach( $entries as $entry ) {
750
751 $unixtime = $entry['unixtime'];
752 if ( function_exists( 'wp_date' ) ) {
753 $date = wp_date( 'F j, Y', $unixtime );
754 $time = wp_date( 'H:i:s', $unixtime );
755 } else {
756 $date = date_i18n( 'F j, Y', $unixtime );
757 $time = date_i18n( 'H:i:s', $unixtime );
758 }
759 ?>
760 <tr class="datatable-tr">
761 <td class="datatable-td"><?php echo esc_html( $entry['ip_address'] ); ?><br /><?php echo esc_html( $entry['username'] ); ?></td>
762 <td class="datatable-td"><?php echo esc_html( $entry['fail_count'] ); ?><br /><?php echo esc_html( $entry['lockout_count'] ); ?></td>
763 <td class="datatable-td"><?php echo esc_html( $date ); ?><br /><?php echo esc_html( $time ); ?></td>
764 </tr>
765 <?php
766 }
767
768 ?>
769 </tbody>
770 </table>
771 <?php
772
773 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-datatable" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
774 }
775
776 }