PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 3.0.0
Admin and Site Enhancements (ASE) v3.0.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
480 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 // Render sortables with data in custom menu order
206
207 foreach ( $custom_menu as $custom_menu_item ) {
208
209 foreach ( $menu as $menu_key => $menu_info ) {
210
211 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
212 $menu_item_id = $menu_info[2];
213 } else {
214 $menu_item_id = $menu_info[5];
215 }
216
217 if ( $custom_menu_item == $menu_item_id ) {
218
219 ?>
220 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
221 <div class="menu-item-bar">
222 <div class="menu-item-handle ui-sortable-handle">
223 <div class="item-title">
224 <span class="menu-item-title">
225 <?php
226
227 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
228 $separator_name = $menu_info[2];
229 $separator_name = str_replace( 'separator', 'Separator-', $separator_name );
230 $separator_name = str_replace( '--last', '-Last', $separator_name );
231 echo '~~ ' . esc_html( $separator_name ) . ' ~~';
232 } else {
233 if ( in_array( $menu_item_id, $renaming_not_allowed ) ) {
234 echo wp_kses_post( $menu_info[0] );
235 } else {
236
237 // Get defaul/custom menu item title
238 foreach ( $custom_menu_titles as $custom_menu_title ) {
239
240 // At this point, $custom_menu_title value looks like toplevel_page_snippets__Code Snippets
241
242 $custom_menu_title = explode( '__', $custom_menu_title );
243
244 if ( $custom_menu_title[0] == $menu_item_id ) {
245 $menu_item_title = $custom_menu_title[1]; // e.g. Code Snippets
246 break; // stop foreach loop so $menu_item_title is not overwritten in the next iteration
247 } else {
248 $menu_item_title = $menu_info[0];
249 }
250
251 }
252
253 ?>
254 <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 ); ?>">
255 <?php
256 }
257 }
258
259 ?>
260 </span>
261 <label class="menu-item-checkbox-label">
262 <?php
263 if ( in_array( $custom_menu_item, $hidden_menu ) ) {
264 ?>
265 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>" checked>
266 <span>Hide</span>
267 <?php
268 } else {
269 ?>
270 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
271 <span>Hide</span>
272 <?php
273 }
274 ?>
275 </label>
276 </div>
277 </div>
278 </div>
279 <?php
280
281 $i = 1;
282
283 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
284 ?>
285 <div class="menu-item-settings wp-clearfix" style="display:none;">
286 <?php
287
288 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
289
290 $i++;
291
292 // echo $submenu_item[0];
293
294 }
295 ?>
296 </div>
297 <?php
298
299 }
300 ?>
301 </li>
302
303 <?php
304
305 }
306
307 }
308
309 }
310
311 } else {
312
313 // Render sortables with existing items in the admin menu
314
315 foreach ( $menu as $menu_key => $menu_info ) {
316
317 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
318 $menu_item_id = $menu_info[2];
319 } else {
320 $menu_item_id = $menu_info[5];
321 }
322
323 ?>
324 <li id="<?php echo esc_attr( $menu_item_id ); ?>" class="menu-item menu-item-depth-0">
325 <div class="menu-item-bar">
326 <div class="menu-item-handle ui-sortable-handle">
327 <div class="item-title">
328 <span class="menu-item-title">
329 <?php
330
331 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
332 $separator_name = $menu_info[2];
333 $separator_name = str_replace( 'separator', 'Separator-', $separator_name );
334 $separator_name = str_replace( '--last', '-Last', $separator_name );
335 echo '~~ ' . esc_html( $separator_name ) . ' ~~';
336 } else {
337 if ( in_array( $menu_item_id, $renaming_not_allowed ) ) {
338 echo wp_kses_post( $menu_info[0] );
339 } else {
340 ?>
341 <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 ); ?>">
342 <?php
343 }
344 }
345
346 ?>
347 </span>
348 <label class="menu-item-checkbox-label">
349 <input type="checkbox" class="menu-item-checkbox" data-menu-item-id="<?php echo esc_attr( $menu_item_id ); ?>">
350 <span>Hide</span>
351 </label>
352 </div>
353 </div>
354 </div>
355 <?php
356
357 $i = 1;
358
359 if ( array_key_exists( $menu_info[2], $submenu ) && @is_countable( $submenu[$menu_info[2]] ) && @sizeof( $submenu[$menu_info[2]] ) > 0 ) {
360 ?>
361 <div class="menu-item-settings wp-clearfix" style="display:none;">
362 <?php
363
364 foreach ( $submenu[$menu_info[2]] as $submenu_item ) {
365
366 $i++;
367
368 // echo $submenu_item[0];
369
370 }
371 ?>
372 </div>
373 <?php
374
375 }
376 ?>
377 </li>
378
379 <?php
380
381 }
382
383
384 }
385
386
387 ?>
388 </ul>
389 <?php
390
391 $field_id = $args['field_id'];
392 $field_name = $args['field_name'];
393 $field_description = $args['field_description'];
394 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
395
396 // Hidden input field to store custom menu order (from options as is, or sortupdate) upon clicking Save Changes.
397 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
398
399 $field_id = 'custom_menu_titles';
400 $field_name = ASENHA_SLUG_U . '['. $field_id .']';
401 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : '';
402
403 // Hidden input field to store custom menu titles (from options as is, or custom values entered on each non-WP-default menu items.
404 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
405
406 $field_id = 'custom_menu_hidden';
407 $field_name = ASENHA_SLUG_U . '['. $field_id .']';
408 $field_option_value = ( isset( $options[$field_id] ) ) ? $options[$field_id] : '';
409
410 // Hidden input field to store hidden menu itmes (from options as is, or 'Hide' checkbox clicks) upon clicking Save Changes.
411 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-text" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
412
413 }
414
415 /**
416 * Render textarea field as sub-field of a toggle/switcher checkbox
417 *
418 * @since 2.3.0
419 */
420 function render_datatable( $args ) {
421
422 global $wpdb;
423
424 $options = get_option( ASENHA_SLUG_U, array() );
425
426 $field_id = $args['field_id'];
427 $field_slug = $args['field_slug'];
428 $field_name = $args['field_name'];
429 $field_type = $args['field_type'];
430 $field_description = $args['field_description'];
431 $table_title = $args['table_title'];
432 $table_name = $args['table_name'];
433 $field_option_value = ( isset( $options[$args['field_id']] ) ) ? $options[$args['field_id']] : '';
434
435 ?>
436 <table id="login-attempts-log" class="wp-list-table widefat striped datatable">
437 <thead>
438 <tr class="datatable-tr">
439 <th class="datatable-th">IP Address<br />Last Username</th>
440 <th class="datatable-th">Attempts<br />Lockouts</th>
441 <th class="datatable-th">Last Attempt On</th>
442 </tr>
443 </thead>
444 <tbody>
445 <?php
446
447 $limit = 1000;
448
449 $sql = $wpdb->prepare( "SELECT * FROM {$table_name} ORDER BY unixtime DESC LIMIT %d", array( $limit ) );
450
451 $entries = $wpdb->get_results( $sql, ARRAY_A );
452
453 foreach( $entries as $entry ) {
454
455 $unixtime = $entry['unixtime'];
456 if ( function_exists( 'wp_date' ) ) {
457 $date = wp_date( 'F j, Y', $unixtime );
458 $time = wp_date( 'H:i:s', $unixtime );
459 } else {
460 $date = date_i18n( 'F j, Y', $unixtime );
461 $time = date_i18n( 'H:i:s', $unixtime );
462 }
463 ?>
464 <tr class="datatable-tr">
465 <td class="datatable-td"><?php echo esc_html( $entry['ip_address'] ); ?><br /><?php echo esc_html( $entry['username'] ); ?></td>
466 <td class="datatable-td"><?php echo esc_html( $entry['fail_count'] ); ?><br /><?php echo esc_html( $entry['lockout_count'] ); ?></td>
467 <td class="datatable-td"><?php echo esc_html( $date ); ?><br /><?php echo esc_html( $time ); ?></td>
468 </tr>
469 <?php
470 }
471
472 ?>
473 </tbody>
474 </table>
475 <?php
476
477 echo '<input type="hidden" id="' . esc_attr( $field_name ) . '" class="asenha-subfield-datatable" name="' . esc_attr( $field_name ) . '" value="' . esc_attr( $field_option_value ) . '">';
478 }
479
480 }