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