PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 3.4.0
Admin and Site Enhancements (ASE) v3.4.0
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-deactivation.php 3 years ago class-disable-components.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
609 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 text field as sub-field of a toggle/switcher checkbox
96 *
97 * @since 1.4.0
98 */
99 function render_text_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_type = $args['field_type'];
106 $field_prefix = $args['field_prefix'];
107 $field_suffix = $args['field_suffix'];
108 $field_description = $args['field_description'];
109 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
110
111 if ( ! empty( $field_prefix ) && ! empty( $field_suffix ) ) {
112 $field_classname = ' with-prefix with-suffix';
113 } elseif ( ! empty( $field_prefix ) && empty( $field_suffix ) ) {
114 $field_classname = ' with-prefix';
115 } elseif ( empty( $field_prefix ) && ! empty( $field_suffix ) ) {
116 $field_classname = ' with-suffix';
117 } else {
118 $field_classname = '';
119 }
120
121 if ( $field_id == 'custom_login_slug' ) {
122 $placeholder = 'e.g. backend';
123 } elseif ( $field_id == 'redirect_after_login_to_slug' ) {
124 $placeholder = 'e.g. my-account';
125 } elseif ( $field_id == 'redirect_after_logout_to_slug' ) {
126 $placeholder = 'e.g. come-visit-again';
127 } elseif ( $field_id == 'login_fails_allowed' ) {
128 $placeholder = '3';
129 } elseif ( $field_id == 'login_lockout_maxcount' ) {
130 $placeholder = '3';
131 } else {
132 $placeholder = '';
133 }
134
135 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( $placeholder ) . '" value="' . esc_attr( $field_option_value ) . '">' . $field_suffix;
136 echo '<label for="' . esc_attr( $field_name ) . '" class="asenha-subfield-checkbox-label">' . esc_html( $field_description ) . '</label>';
137
138 }
139
140 /**
141 * Render number field as sub-field of a toggle/switcher checkbox
142 *
143 * @since 1.4.0
144 */
145 function render_number_subfield( $args ) {
146
147 $options = get_option( ASENHA_SLUG_U, array() );
148
149 $field_id = $args['field_id'];
150 $field_name = $args['field_name'];
151 $field_type = $args['field_type'];
152 $field_prefix = $args['field_prefix'];
153 $field_suffix = $args['field_suffix'];
154 $field_intro = $args['field_intro'];
155 $field_description = $args['field_description'];
156 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
157
158 if ( ! empty( $field_prefix ) && ! empty( $field_suffix ) ) {
159 $field_classname = ' with-prefix with-suffix';
160 } elseif ( ! empty( $field_prefix ) && empty( $field_suffix ) ) {
161 $field_classname = ' with-prefix';
162 } elseif ( empty( $field_prefix ) && ! empty( $field_suffix ) ) {
163 $field_classname = ' with-suffix';
164 } else {
165 $field_classname = '';
166 }
167
168 if ( ( $field_id == 'head_code_priority' ) || ( $field_id == 'body_code_priority' ) || ( $field_id == 'footer_code_priority' ) ) {
169 $placeholder = '10';
170 } else {
171 $placeholder = '';
172 }
173
174 echo '<div class="asenha-subfield-number-wrapper">';
175
176 if ( ! empty( $field_intro ) ) {
177 echo '<div class="asenha-subfield-number-intro">' . wp_kses_post( $field_intro ) . '</div>';
178 }
179
180 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>';
181
182 if ( ! empty( $field_description ) ) {
183 echo '<div class="asenha-subfield-number-description">' . wp_kses_post( $field_description ) . '</div>';
184 }
185
186 echo '</div>';
187
188 }
189
190 /**
191 * Render textarea field as sub-field of a toggle/switcher checkbox
192 *
193 * @since 2.3.0
194 */
195 function render_textarea_subfield( $args ) {
196
197 $options = get_option( ASENHA_SLUG_U, array() );
198
199 $field_id = $args['field_id'];
200 $field_slug = $args['field_slug'];
201 $field_name = $args['field_name'];
202 $field_type = $args['field_type'];
203 $field_intro = $args['field_intro'];
204 $field_description = $args['field_description'];
205 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
206
207 echo '<div class="asenha-subfield-textarea-wrapper">';
208
209 if ( ! empty( $field_intro ) ) {
210 echo '<div class="asenha-subfield-textarea-intro">' . wp_kses_post( $field_intro ) . '</div>';
211 }
212
213
214 echo '<textarea rows="30" class="asenha-subfield-textarea" id="' . esc_attr( $field_name ) . '" name="' . esc_attr( $field_name ) . '">' . esc_textarea( $field_option_value ) . '</textarea>';
215
216 if ( ! empty( $field_description ) ) {
217 echo '<div class="asenha-subfield-textarea-description">' . wp_kses_post( $field_description ) . '</div>';
218 }
219
220 echo '</div>';
221
222 }
223
224 /**
225 * Render sortable menu field
226 *
227 * @since 2.0.0
228 */
229 function render_sortable_menu( $args ) {
230
231 ?>
232 <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>
233 <ul id="custom-admin-menu" class="menu ui-sortable">
234 <?php
235
236 global $menu;
237 global $submenu;
238 $common_methods = new Common_Methods;
239 $options = get_option( ASENHA_SLUG_U, array() );
240
241 // Set menu items to be excluded from title renaming. These are from WordPress core.
242 $renaming_not_allowed = array( 'menu-dashboard', 'menu-pages', 'menu-posts', 'menu-media', 'menu-comments', 'menu-appearance', 'menu-plugins', 'menu-users', 'menu-tools', 'menu-settings' );
243
244 // Get custom menu item titles
245 if ( array_key_exists( 'custom_menu_titles', $options ) ) {
246 $custom_menu_titles = $options['custom_menu_titles'];
247 $custom_menu_titles = explode( ',', $custom_menu_titles );
248 } else {
249 $custom_menu_titles = array();
250 }
251
252 // Get hidden menu items
253 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
254 $hidden_menu = $options['custom_menu_hidden'];
255 $hidden_menu = explode( ',', $hidden_menu );
256 } else {
257 $hidden_menu = array();
258 }
259
260 $i = 1;
261
262 // Check if there's an existing custom menu order data stored in options
263
264 if ( array_key_exists( 'custom_menu_order', $options ) ) {
265
266 $custom_menu = $options['custom_menu_order'];
267 $custom_menu = explode( ',', $custom_menu );
268
269 $menu_key_in_use = array();
270
271 // Render sortables with data in custom menu order
272
273 foreach ( $custom_menu as $custom_menu_item ) {
274
275 foreach ( $menu as $menu_key => $menu_info ) {
276
277 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
278 $menu_item_id = $menu_info[2];
279 } else {
280 $menu_item_id = $menu_info[5];
281 }
282
283 if ( $custom_menu_item == $menu_item_id ) {
284
285 ?>
286 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
287 <div class="menu-item-bar">
288 <div class="menu-item-handle ui-sortable-handle">
289 <div class="item-title">
290 <span class="menu-item-title">
291 <?php
292
293 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
294 $separator_name = $menu_info[2];
295 $separator_name = str_replace( 'separator', 'Separator-', $separator_name );
296 $separator_name = str_replace( '--last', '-Last', $separator_name );
297 echo '~~ ' . esc_html( $separator_name ) . ' ~~';
298 } else {
299 if ( in_array( $menu_item_id, $renaming_not_allowed ) ) {
300 // echo wp_kses_post( $menu_info[0] );
301 echo wp_kses_post( $common_methods->strip_html_tags_and_content( $menu_info[0] ) );
302 } else {
303
304 // Get defaul/custom menu item title
305 foreach ( $custom_menu_titles as $custom_menu_title ) {
306
307 // At this point, $custom_menu_title value looks like toplevel_page_snippets__Code Snippets
308
309 $custom_menu_title = explode( '__', $custom_menu_title );
310
311 if ( $custom_menu_title[0] == $menu_item_id ) {
312 $menu_item_title = $common_methods->strip_html_tags_and_content( $custom_menu_title[1] ); // e.g. Code Snippets
313 break; // stop foreach loop so $menu_item_title is not overwritten in the next iteration
314 } else {
315 $menu_item_title = $common_methods->strip_html_tags_and_content( $menu_info[0] );
316 }
317
318 }
319
320 ?>
321 <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 ); ?>">
322 <?php
323 }
324 }
325
326 ?>
327 </span>
328 <label class="menu-item-checkbox-label">
329 <?php
330 if ( in_array( $custom_menu_item, $hidden_menu ) ) {
331 ?>
332 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>" checked>
333 <span>Hide</span>
334 <?php
335 } else {
336 ?>
337 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
338 <span>Hide</span>
339 <?php
340 }
341 ?>
342 </label>
343 </div>
344 </div>
345 </div>
346 <?php
347
348 $i = 1;
349
350 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
351 ?>
352 <div class="menu-item-settings wp-clearfix" style="display:none;">
353 <?php
354
355 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
356
357 $i++;
358
359 // echo $submenu_item[0];
360
361 }
362 ?>
363 </div>
364 <?php
365
366 }
367 ?>
368 </li>
369
370 <?php
371
372 $menu_key_in_use[] = $menu_key;
373
374 }
375
376 }
377
378 }
379
380 // Render the rest of the current menu towards the end of the sortables
381
382 foreach ( $menu as $menu_key => $menu_info ) {
383
384 if ( ! in_array( $menu_key, $menu_key_in_use ) ) {
385
386 $menu_item_id = $menu_info[5];
387 $menu_item_title = $menu_info[0];
388
389 // Exclude Show All/Less toggles
390
391 if ( false === strpos( $menu_item_id, 'toplevel_page_asenha_' ) ) {
392
393 ?>
394 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
395 <div class="menu-item-bar">
396 <div class="menu-item-handle ui-sortable-handle">
397 <div class="item-title">
398 <span class="menu-item-title">
399 <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 ); ?>">
400 </span>
401 <label class="menu-item-checkbox-label">
402 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
403 <span>Hide</span>
404 </label>
405 </div>
406 </div>
407 </div>
408 <?php
409
410 }
411
412 $i = 1;
413
414 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
415 ?>
416 <div class="menu-item-settings wp-clearfix" style="display:none;">
417 <?php
418
419 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
420
421 $i++;
422
423 // echo $submenu_item[0];
424
425 }
426 ?>
427 </div>
428 <?php
429
430 }
431 ?>
432 </li>
433
434 <?php
435
436 }
437
438 }
439
440 } else {
441
442 // Render sortables with existing items in the admin menu
443
444 foreach ( $menu as $menu_key => $menu_info ) {
445
446 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
447 $menu_item_id = $menu_info[2];
448 } else {
449 $menu_item_id = $menu_info[5];
450 }
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( $common_methods->strip_html_tags_and_content( $menu_info[0] ) );
468 } else {
469 ?>
470 <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 ); ?>">
471 <?php
472 }
473 }
474
475 ?>
476 </span>
477 <label class="menu-item-checkbox-label">
478 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
479 <span>Hide</span>
480 </label>
481 </div>
482 </div>
483 </div>
484 <?php
485
486 $i = 1;
487
488 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
489 ?>
490 <div class="menu-item-settings wp-clearfix" style="display:none;">
491 <?php
492
493 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
494
495 $i++;
496
497 // echo $submenu_item[0];
498
499 }
500 ?>
501 </div>
502 <?php
503
504 }
505 ?>
506 </li>
507
508 <?php
509
510 }
511
512
513 }
514
515
516 ?>
517 </ul>
518 <?php
519
520 $field_id = $args['field_id'];
521 $field_name = $args['field_name'];
522 $field_description = $args['field_description'];
523 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
524
525 // Hidden input field to store custom menu order (from options as is, or sortupdate) upon clicking Save Changes.
526 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
527
528 $field_id = 'custom_menu_titles';
529 $field_name = ASENHA_SLUG_U . '['. $field_id .']';
530 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : '';
531
532 // Hidden input field to store custom menu titles (from options as is, or custom values entered on each non-WP-default menu items.
533 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
534
535 $field_id = 'custom_menu_hidden';
536 $field_name = ASENHA_SLUG_U . '['. $field_id .']';
537 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : '';
538
539 // Hidden input field to store hidden menu itmes (from options as is, or 'Hide' checkbox clicks) upon clicking Save Changes.
540 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
541
542 }
543
544 /**
545 * Render textarea field as sub-field of a toggle/switcher checkbox
546 *
547 * @since 2.3.0
548 */
549 function render_datatable( $args ) {
550
551 global $wpdb;
552
553 $options = get_option( ASENHA_SLUG_U, array() );
554
555 $field_id = $args['field_id'];
556 $field_slug = $args['field_slug'];
557 $field_name = $args['field_name'];
558 $field_type = $args['field_type'];
559 $field_description = $args['field_description'];
560 $table_title = $args['table_title'];
561 $table_name = $args['table_name'];
562 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
563
564 ?>
565 <table id="login-attempts-log" class="wp-list-table widefat striped datatable">
566 <thead>
567 <tr class="datatable-tr">
568 <th class="datatable-th">IP Address<br />Last Username</th>
569 <th class="datatable-th">Attempts<br />Lockouts</th>
570 <th class="datatable-th">Last Attempt On</th>
571 </tr>
572 </thead>
573 <tbody>
574 <?php
575
576 $limit = 1000;
577
578 $sql = $wpdb->prepare( "SELECT * FROM {$table_name} ORDER BY unixtime DESC LIMIT %d", array( $limit ) );
579
580 $entries = $wpdb->get_results( $sql, ARRAY_A );
581
582 foreach( $entries as $entry ) {
583
584 $unixtime = $entry['unixtime'];
585 if ( function_exists( 'wp_date' ) ) {
586 $date = wp_date( 'F j, Y', $unixtime );
587 $time = wp_date( 'H:i:s', $unixtime );
588 } else {
589 $date = date_i18n( 'F j, Y', $unixtime );
590 $time = date_i18n( 'H:i:s', $unixtime );
591 }
592 ?>
593 <tr class="datatable-tr">
594 <td class="datatable-td"><?php echo esc_html( $entry['ip_address'] ); ?><br /><?php echo esc_html( $entry['username'] ); ?></td>
595 <td class="datatable-td"><?php echo esc_html( $entry['fail_count'] ); ?><br /><?php echo esc_html( $entry['lockout_count'] ); ?></td>
596 <td class="datatable-td"><?php echo esc_html( $date ); ?><br /><?php echo esc_html( $time ); ?></td>
597 </tr>
598 <?php
599 }
600
601 ?>
602 </tbody>
603 </table>
604 <?php
605
606 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-datatable" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
607 }
608
609 }