PluginProbe
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP / 1.2.34
UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP v1.2.34
1.2.72 1.2.71 1.2.70 1.2.69 1.2.68 1.2.67 1.2.66 1.2.65 1.2.64 1.2.63 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 All 172 releases
userswp / admin / settings / class-uwp-settings-user-sorting.php

class-uwp-settings-user-sorting.php in UsersWP – Front-end login form, User Registration, User Profile & Members Directory plugin for WP 1.2.34, at admin/settings/class-uwp-settings-user-sorting.php

857 lines 32.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * UsersWP Tabs in form builder
4 *
5 * @author AyeCode
6 * @category Admin
7 * @package userswp/Admin
8 * @version 1.0.24
9 */
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit; // Exit if accessed directly
13 }
14
15 if ( ! class_exists( 'UsersWP_Settings_User_Sorting', false ) ) {
16
17 /**
18 * UsersWP_Settings_Email.
19 */
20 class UsersWP_Settings_User_Sorting {
21
22 public function __construct() {
23
24 add_filter( 'uwp_form_builder_tabs_array', array( $this, 'form_builder_tab_items' ), 99 );
25 add_filter( 'uwp_form_builder_available_fields_head', array( $this, 'available_fields_head' ), 10, 2 );
26 add_filter( 'uwp_form_builder_available_fields_note', array( $this, 'available_fields_note' ), 10, 2 );
27 add_filter( 'uwp_form_builder_selected_fields_head', array( $this, 'selected_fields_head' ), 10, 2 );
28 add_filter( 'uwp_form_builder_selected_fields_note', array( $this, 'selected_fields_note' ), 10, 2 );
29 add_action( 'uwp_manage_available_fields', array( $this, 'manage_available_fields' ), 10, 1 );
30 add_action( 'uwp_manage_selected_fields', array( $this, 'manage_selected_fields' ), 10, 1 );
31 add_action( 'wp_ajax_uwp_ajax_user_sorting_action', array( $this, 'ajax_handler' ) );
32 add_action( 'uwp_add_custom_sort_options', array( $this, 'add_custom_sort_options' ) );
33 add_action( 'pre_user_query', array( $this, 'pre_user_query' ), 99 );
34 }
35
36 public function pre_user_query( $vars ) {
37
38 global $wpdb;
39
40 if ( isset( $vars->query_vars['orderby'] ) && 'uwp_meta_value' == $vars->query_vars['orderby'] && is_uwp_users_page() ) {
41
42 $sort_by = $meta_key = '';
43 $order = 'ASC';
44 if ( isset( $_GET['uwp_sort_by'] ) && $_GET['uwp_sort_by'] != '' ) {
45 $sort_by = sanitize_key( strip_tags( esc_sql( $_GET['uwp_sort_by'] ) ) );
46 }
47
48 if ( empty( $sort_by ) ) {
49 $sort_by = uwp_get_default_sort();
50 }
51
52 if ( $sort_by ) {
53
54 if ( substr( strtolower( $sort_by ), - 5 ) == '_desc' ) {
55 $order = 'DESC';
56 $meta_key = substr( $sort_by, 0, strlen( $sort_by ) - 5 );
57 $order_by = 'meta_value';
58 } elseif ( substr( strtolower( $sort_by ), - 4 ) == '_asc' ) {
59 $order = 'ASC';
60 $meta_key = substr( $sort_by, 0, strlen( $sort_by ) - 4 );
61 $order_by = 'meta_value';
62 }
63
64 // check meta key exists
65 if ( $meta_key && 'user_registered' !== $meta_key ) {
66 $table = new UsersWP_Tables();
67 if ( ! in_array( $meta_key, $table->get_db_usermeta_columns() ) ) {
68 $meta_key = '';
69 }
70 }
71
72 if ( ! empty( $order_by ) && $meta_key ) {
73 $meta_table_name = uwp_get_table_prefix() . 'uwp_usermeta';
74 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
75
76 if ( 'user_registered' == $meta_key ) {
77 $orderby = $meta_key;
78 } else {
79 $orderby = $meta_table_name . '.' . sanitize_key( $meta_key );
80 }
81
82 $vars->query_from .= ' INNER JOIN ' . $meta_table_name . ' ON (' . $meta_table_name . ".user_id = $wpdb->users.ID) "; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
83 $vars->query_orderby = 'ORDER BY ' . $orderby . ' ' . $order;
84
85 $parent_id = $wpdb->get_var( $wpdb->prepare( 'SELECT id FROM ' . $table_name . ' WHERE htmlvar_name = %s AND sort = %s AND tab_parent = 0', $meta_key, $order ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
86
87 if ( $parent_id ) {
88 $children = $wpdb->get_results( $wpdb->prepare( 'SELECT * FROM ' . $table_name . ' WHERE tab_parent = %d ORDER BY sort_order ASC', $parent_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
89
90 if ( $children ) {
91
92 foreach ( $children as $child ) {
93 if ( ! in_array( $child->field_type, array( 'newer', 'older' ) ) ) {
94 $vars->query_orderby .= ' , ' . $child->htmlvar_name . ' ' . $order;
95 }
96 }
97 }
98 }
99 }
100 }
101 }
102
103 return $vars;
104 }
105
106 /**
107 * Add a tab to form builder
108 *
109 * @since 1.2.2.38
110 * @package userswp
111 *
112 * @param array $tabs Tabs
113 *
114 * @return array $tabs
115 */
116 public function form_builder_tab_items( $tabs ) {
117 $tabs['user-sorting'] = __( 'User Sorting', 'userswp' );
118
119 return $tabs;
120 }
121
122 /**
123 * Add a tab to form builder
124 *
125 * @since 1.2.2.38
126 * @package userswp
127 *
128 * @param string $heading Heading
129 * @param string $form_type Form type
130 *
131 * @return string
132 */
133 public function available_fields_head( $heading, $form_type ) {
134 switch ( $form_type ) {
135 case 'user-sorting':
136 $heading = __( 'Available sorting options for users listing and search results', 'userswp' );
137 break;
138 }
139
140 return $heading;
141 }
142
143 /**
144 * Add a note above available fields.
145 *
146 * @since 1.2.2.38
147 * @package userswp
148 *
149 * @param string $note Note to display
150 * @param string $form_type Form type
151 *
152 * @return string
153 */
154 public function available_fields_note( $note, $form_type ) {
155 switch ( $form_type ) {
156 case 'user-sorting':
157 $note = __( "Click on any box below to make it appear in the sorting option dropdown on users listing and search results. To make a field available here, go to account tab and expand any field from selected fields panel and tick the checkbox saying 'Include this field in sorting options'.", 'userswp' );
158 break;
159 }
160
161 return $note;
162 }
163
164 /**
165 * Heading for the selected fields
166 *
167 * @since 1.2.2.38
168 * @package userswp
169 *
170 * @param string $heading Heading to display
171 * @param string $form_type Form type
172 *
173 * @return string
174 */
175 public function selected_fields_head( $heading, $form_type ) {
176 switch ( $form_type ) {
177 case 'user-sorting':
178 $heading = __( 'List of fields that will appear in users listing and search results sorting option dropdown box.', 'userswp' );
179 break;
180 }
181
182 return $heading;
183 }
184
185 /**
186 * Add a note above selected fields.
187 *
188 * @since 1.2.2.38
189 * @package userswp
190 *
191 * @param string $note Note to display
192 * @param string $form_type Form type
193 *
194 * @return string
195 */
196 public function selected_fields_note( $note, $form_type ) {
197 switch ( $form_type ) {
198 case 'user-sorting':
199 $note = __( 'Click to expand and view field related settings. You may drag and drop to arrange fields order in sorting option dropdown box on users listing and search results page.', 'userswp' );
200 break;
201 }
202
203 return $note;
204 }
205
206 /**
207 * Display available fields
208 *
209 * @since 1.2.2.38
210 * @package userswp
211 *
212 * @param string $form_type Form type
213 *
214 */
215 public function manage_available_fields( $form_type ) {
216 if ( 'user-sorting' == $form_type ) {
217 $this->available_fields( $form_type );
218 }
219 }
220
221 /**
222 * Display selected fields
223 *
224 * @since 1.2.2.38
225 * @package userswp
226 *
227 * @param string $form_type Form type
228 *
229 */
230 public function manage_selected_fields( $form_type ) {
231 if ( 'user-sorting' == $form_type ) {
232 $this->selected_fields( $form_type );
233 }
234 }
235
236 /**
237 * Display available sorting fields
238 *
239 * @since 1.2.2.38
240 * @package userswp
241 *
242 * @param string $form_type Form type
243 *
244 */
245 public function available_fields( $form_type ) {
246 global $wpdb;
247
248 $fields = array();
249
250 $fields['newer'] = array(
251 'data_type' => '',
252 'field_type' => 'newer',
253 'site_title' => __( 'Newer', 'userswp' ),
254 'htmlvar_name' => 'newer',
255 'field_icon' => 'fas fa-calendar',
256 'sort' => 'asc',
257 'description' => __( 'Sort by new user registration', 'userswp' ),
258 );
259
260 $fields['older'] = array(
261 'data_type' => '',
262 'field_type' => 'older',
263 'site_title' => __( 'Older', 'userswp' ),
264 'htmlvar_name' => 'older',
265 'field_icon' => 'fas fa-calendar',
266 'sort' => 'desc',
267 'description' => __( 'Sort by new user registration in descending order', 'userswp' ),
268 );
269
270 $fields['display_name'] = array(
271 'data_type' => '',
272 'field_type' => 'text',
273 'site_title' => __( 'Display Name', 'userswp' ),
274 'htmlvar_name' => 'display_name',
275 'field_icon' => 'fas fa-sort-alpha-up',
276 'sort' => 'asc',
277 'description' => __( 'Sort alphabetically by display name in ascending order', 'userswp' ),
278 );
279
280 $fields['first_name'] = array(
281 'data_type' => '',
282 'field_type' => 'text',
283 'site_title' => __( 'First Name', 'userswp' ),
284 'htmlvar_name' => 'first_name',
285 'field_icon' => 'fas fa-sort-alpha-up',
286 'sort' => 'asc',
287 'description' => __( 'Sort alphabetically by first name in ascending order', 'userswp' ),
288 );
289
290 $fields['last_name'] = array(
291 'data_type' => '',
292 'field_type' => 'text',
293 'site_title' => __( 'Last Name', 'userswp' ),
294 'htmlvar_name' => 'last_name',
295 'field_icon' => 'fas fa-sort-alpha-up',
296 'sort' => 'asc',
297 'description' => __( 'Sort alphabetically by last name in ascending order', 'userswp' ),
298 );
299
300 $fields = apply_filters( 'uwp_add_custom_sort_options', $fields );
301
302 ?>
303 <input type="hidden" name="form_type" id="form_type" value="<?php echo esc_attr( $form_type ); ?>"/>
304 <input type="hidden" name="manage_field_type" class="manage_field_type" value="user_sorting">
305 <?php wp_nonce_field( 'uwp-admin-settings' ); ?>
306
307 <ul class="row row-cols-2 px-2 mb-0">
308 <?php
309
310 if ( ! empty( $fields ) ) {
311 foreach ( $fields as $field ) {
312 $field = stripslashes_deep( $field ); // strip slashes
313
314 $icon = $field['field_icon'];
315 if ( uwp_is_fa_icon( $icon ) ) {
316 $field_icon = '<i class="' . esc_attr( $icon ) . '" aria-hidden="true"></i>';
317 } elseif ( uwp_is_icon_url( $icon ) ) {
318 $field_icon = '<b style="background-image: url("' . esc_url( $icon ) . '")"></b>';
319 } else {
320 $field_icon = '<i class="fas fa-sort" aria-hidden="true"></i>';
321 }
322 ?>
323 <li class="col px-1">
324 <a id="uwp-<?php echo esc_attr( $field['htmlvar_name'] ); ?>"
325 class="uwp-draggable-form-itemsx btn btn-sm d-block m-0 btn-outline-gray text-dark text-start"
326 data-field_type="<?php echo isset( $field['field_type'] ) ? esc_attr( $field['field_type'] ) : ''; ?>"
327 data-site_title="<?php echo isset( $field['site_title'] ) ? esc_attr( $field['site_title'] ) : ''; ?>"
328 data-field_icon="<?php echo isset( $field['field_icon'] ) ? esc_attr( $field['field_icon'] ) : ''; ?>"
329 data-id="<?php echo isset( $field['htmlvar_name'] ) ? esc_attr( $field['htmlvar_name'] ) : ''; ?>"
330 data-data_type="<?php echo isset( $field['data_type'] ) ? esc_attr( $field['data_type'] ) : 'VARCHAR'; ?>"
331 data-tab_parent="<?php echo isset( $field['tab_parent'] ) ? esc_attr( $field['tab_parent'] ) : ''; ?>"
332 data-tab_level="<?php echo isset( $field['tab_content'] ) ? esc_attr( $field['tab_content'] ) : ''; ?>"
333 data-sort="<?php echo isset( $field['sort'] ) ? esc_attr( $field['sort'] ) : 'asc'; ?>"
334 href="javascript:void(0);">
335 <?php echo $field_icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
336 <?php echo esc_attr( $field['site_title'] ); ?>
337 </a>
338 </li>
339 <?php
340 }
341 }
342 ?>
343 </ul>
344 <?php
345 }
346
347 /**
348 * Display selected tabs fields
349 *
350 * @since 2.0.0
351 * @package userswp
352 *
353 * @param string $form_type Form type
354 *
355 */
356 public function selected_fields( $form_type ) {
357 global $wpdb;
358 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
359 ?>
360 <input type="hidden" name="form_type" id="form_type" value="<?php echo esc_attr( $form_type ); ?>"/>
361 <input type="hidden" name="manage_field_type" class="manage_field_type" value="user_sorting">
362 <ul class="uwp-profile-tabs-selected core uwp_form_extras ps-0 list-group ">
363 <?php
364 $tabs = $wpdb->get_results( 'SELECT * FROM ' . $table_name . ' order by sort_order asc' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
365 if ( ! empty( $tabs ) ) {
366 foreach ( $tabs as $key => $tab ) {
367 $field_ins_upd = 'display';
368
369 if ( $tab->tab_level == '1' ) {
370 continue;
371 }
372
373 ob_start();
374 $this->field_adminhtml( $tab->id, $field_ins_upd );
375 $tab_rendered = ob_get_clean();
376
377 $tab_rendered = str_replace( '</li>', '', $tab_rendered );
378 $child_tabs = '';
379 foreach ( $tabs as $child_tab ) {
380 if ( $child_tab->tab_parent == $tab->id ) {
381 ob_start();
382 $this->field_adminhtml( $child_tab->id, $field_ins_upd );
383 $child_tabs .= ob_get_clean();
384 }
385 }
386
387 if ( $child_tabs ) {
388 $tab_rendered .= '<ul>';
389 $tab_rendered .= $child_tabs;
390 $tab_rendered .= '</ul>';
391 }
392
393 echo $tab_rendered; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
394 echo '</li>';
395
396 unset( $tabs[ $key ] );
397 }
398 }
399 ?>
400 </ul>
401 <?php
402 }
403
404 /**
405 * Displays sorting field HTML
406 *
407 * @since 2.0.0
408 * @package userswp
409 *
410 * @param int $field_id Field ID
411 * @param string $field_ins_upd Field action
412 * @param array $request Request data
413 *
414 */
415 public function field_adminhtml( $field_id, $field_ins_upd = '', $request = array() ) {
416 global $wpdb;
417
418 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
419
420 if ( ! is_object( $field_id ) && ( is_int( $field_id ) || ctype_digit( $field_id ) ) ) {
421 $field = $wpdb->get_row( $wpdb->prepare( 'select * from ' . $table_name . ' where id= %d', array( $field_id ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
422 } elseif ( is_object( $field_id ) ) {
423 $field_id = $field_id->id;
424 $field = $wpdb->get_row( $wpdb->prepare( 'select * from ' . $table_name . ' where id= %d', array( (int) $field_id->id ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
425 } elseif ( isset( $field_id ) && ! empty( $field_id ) ) {
426 $field = $wpdb->get_row( $wpdb->prepare( 'select * from ' . $table_name . ' where htmlvar_name= %s', array( $field_id ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
427 } else {
428 $field = array();
429 }
430
431 if ( isset( $request['site_title'] ) ) {
432 $site_title = esc_attr( $request['site_title'] );
433 } elseif ( $field && isset( $field->site_title ) ) {
434 $site_title = wp_unslash( $field->site_title );
435 } else {
436 $site_title = '';
437 }
438
439 if ( isset( $request['htmlvar_name'] ) ) {
440 $htmlvar_name = esc_attr( $request['htmlvar_name'] );
441 } elseif ( $field && isset( $field->htmlvar_name ) ) {
442 $htmlvar_name = $field->htmlvar_name;
443 } else {
444 $htmlvar_name = '';
445 }
446
447 if ( isset( $request['field_type'] ) ) {
448 $field_type = esc_attr( $request['field_type'] );
449 } elseif ( $field && isset( $field->field_type ) ) {
450 $field_type = $field->field_type;
451 } else {
452 $field_type = '';
453 }
454
455 if ( isset( $request['data_type'] ) ) {
456 $data_type = esc_attr( $request['data_type'] );
457 } elseif ( $field && isset( $field->data_type ) ) {
458 $data_type = $field->data_type;
459 } else {
460 $data_type = '';
461 }
462
463 if ( isset( $request['field_icon'] ) && $request['field_icon'] != '' ) {
464 $icon = esc_attr( $request['field_icon'] );
465 } elseif ( $field && isset( $field->field_icon ) ) {
466 $icon = $field->field_icon;
467 } else {
468 $icon = 'fas fa-sort';
469 }
470
471 if ( uwp_is_fa_icon( $icon ) ) {
472 $field_icon = '<i class="' . esc_attr( $icon ) . '" aria-hidden="true"></i>';
473 } elseif ( uwp_is_icon_url( $icon ) ) {
474 $field_icon = '<b style="background-image: url("' . esc_url( $icon ) . '")"></b>';
475 } elseif ( isset( $field->tab_type ) && $field->tab_type == 'fieldset' ) {
476 $field_icon = '<i class="fas fa-arrows-h" aria-hidden="true"></i>';
477 } else {
478 $field_icon = '<i class="fas fa-sort" aria-hidden="true"></i>';
479 }
480
481 if ( isset( $request['tab_parent'] ) && $request['tab_parent'] != '' ) {
482 $tab_parent = esc_attr( $request['tab_parent'] );
483 } elseif ( $field && isset( $field->tab_parent ) ) {
484 $tab_parent = $field->tab_parent;
485 } else {
486 $tab_parent = 0;
487 }
488
489 if ( isset( $request['tab_level'] ) && $request['tab_level'] != '' ) {
490 $tab_level = esc_attr( $request['tab_level'] );
491 } elseif ( $field && isset( $field->tab_level ) ) {
492 $tab_level = $field->tab_level;
493 } else {
494 $tab_level = 0;
495 }
496
497 $nonce = wp_create_nonce( 'uwp_sort_extras_nonce_' . $field_id );
498 ?>
499 <li class="text li-settings" id="licontainer_<?php echo esc_attr( $field_id ); ?>">
500 <div class="title title<?php echo esc_attr( $field_id ); ?> uwp-fieldset hover-shadow dd-form d-flex justify-content-between rounded c-pointer list-group-item border rounded-smx text-start bg-light " onclick="uwp_tabs_item_settings(this);">
501 <?php
502 ?>
503 <div class=" flex-fill font-weight-bold fw-bold">
504 <?php echo $field_icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
505 <b><?php echo esc_html( uwp_ucwords( ' ' . $site_title ) ); ?></b>
506 <span class="field-type float-end text-end small"><?php echo ' (' . esc_html( uwp_ucwords( $field_type ) ) . ')'; ?></span>
507 </div>
508 <div class="dd-handle ui-sortable-handle">
509 <i class="far fa-trash-alt text-danger ml-2 ms-2" id="delete-16"
510 onclick="delete_field('<?php echo esc_attr( $field_id ); ?>', '<?php echo esc_attr( wp_create_nonce( 'uwp_sort_delete_nonce_' . $field_id ) ); ?>', '<?php echo esc_attr( $htmlvar_name ); ?>', 'user_sorting');event.stopPropagation();return false;"></i>
511 <i class="fas fa-grip-vertical text-muted ml-2 ms-2" style="cursor: move" aria-hidden="true"></i>
512 </div>
513
514 </div>
515
516 <?php // store the form as a template. This saves a load of memory on page load. ?>
517 <script type="text/template" class="dd-setting <?php echo 'dd-type-' . esc_attr( $field_type ); ?>">
518 <div id="field_frm<?php echo esc_attr( $field_id ); ?>" class="field_frm" style="<?php echo ( $field_ins_upd == 'submit' ) ? 'display:block;' : ''; ?>">
519
520 <input type="hidden" name="_wpnonce" id="uwp_sort_extras_nonce" value="<?php echo esc_attr( $nonce ); ?>"/>
521 <input type="hidden" name="field_id" id="field_id" value="<?php echo esc_attr( $field_id ); ?>"/>
522 <input type="hidden" name="form_type" id="form_type" value="user_sorting"/>
523 <input type="hidden" name="field_icon" id="field_icon" value="<?php echo esc_attr( $icon ); ?>"/>
524 <input type="hidden" name="field_type" id="field_type" value="<?php echo esc_attr( $field_type ); ?>"/>
525 <input type="hidden" name="data_type" id="data_type" value="<?php echo esc_attr( $data_type ); ?>"/>
526 <input type="hidden" name="tab_parent" value="<?php echo esc_attr( $tab_parent ); ?>"/>
527 <input type="hidden" name="tab_level" value="<?php echo esc_attr( $tab_level ); ?>"/>
528 <input type="hidden" name="htmlvar_name" value="<?php echo esc_attr( $htmlvar_name ); ?>"/>
529
530 <?php
531 // site_title
532 echo aui()->input(
533 array(
534 'id' => 'site_title',
535 'name' => 'site_title',
536 'label_type' => 'top',
537 'label' => esc_html__( 'Frontend title', 'userswp' ) . uwp_help_tip( __( 'This is the text used for the sort option.', 'userswp' ) ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
538 'type' => 'text',
539 // 'wrap_class' => uwp_advanced_toggle_class(),
540 'value' => $site_title,
541 )
542 );
543
544 // sort
545 $value = isset( $field->sort ) && $field->sort == 'desc' ? 'desc' : 'asc';
546 echo aui()->select(
547 array(
548 'id' => 'uwp-sort-' . ( isset( $field->id ) ? esc_attr( $field->id ) : '' ),
549 'name' => 'sort',
550 'label_type' => 'top',
551 'multiple' => false,
552 'class' => ' mw-100',
553 'options' => array(
554 'asc' => esc_html__( 'Ascending', 'userswp' ),
555 'desc' => esc_html__( 'Descending', 'userswp' ),
556 ),
557 'label' => __( 'Ascending or Descending', 'userswp' ) . uwp_help_tip( __( 'Select the sort direction: (A-Z or Z-A).', 'userswp' ) ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
558 'value' => $value,
559 // 'wrap_class' => uwp_advanced_toggle_class(),
560 )
561 );
562
563 echo aui()->input(
564 array(
565 'id' => 'is_default',
566 'name' => 'is_default',
567 'type' => 'checkbox', //'!$exclude_privacy_option ? 'hidden' : 'checkbox',
568 'label_type' => 'horizontal',
569 'label_col' => '4',
570 'label' => __( 'Default sort', 'userswp' ),
571 'checked' => isset( $field->is_default ) && $field->is_default == 1,
572 'value' => '1',
573 'switch' => 'md',
574 'label_force_left' => true,
575 'help_text' => uwp_help_tip( __( 'This sets the option as the overall default sort value, there can be only one.', 'userswp' ) ),
576 )
577 );
578
579 echo aui()->input(
580 array(
581 'id' => 'is_active',
582 'name' => 'is_active',
583 'type' => 'checkbox', //'!$exclude_privacy_option ? 'hidden' : 'checkbox',
584 'label_type' => 'horizontal',
585 'label_col' => '4',
586 'label' => __( 'Is active', 'userswp' ),
587 'checked' => isset( $field->is_active ) && $field->is_active,
588 'value' => '1',
589 'switch' => 'md',
590 'label_force_left' => true,
591 'help_text' => uwp_help_tip( __( 'Set if this sort option is active or not, if not it will not be shown to users.', 'userswp' ) ),
592 )
593 );
594 ?>
595 <input type="hidden" readonly="readonly" name="sort_order" id="sort_order" value="<?php echo (isset( $field->sort_order )) ? esc_attr( $field->sort_order ) : ''; ?>" size="50"/>
596 <?php do_action( 'uwp_user_sorting_custom_fields', $field_id ); ?>
597
598 <div class="uwp-input-wrap uwp-tab-actions" data-setting="save_button">
599 <a class=" btn btn-link text-muted" href="javascript:void(0);" onclick="uwp_tabs_close_settings(this); return false;"><?php _e( 'Close', 'userswp' ); ?></a>
600 <a href='javascript:void(0);' type="button" class="btn btn-primary" id="save"
601 onclick="save_field('<?php echo esc_attr( $field_id ); ?>', 'user_sorting');return false;"><?php echo esc_attr( __( 'Save', 'userswp' ) ); ?></a>
602 </div>
603 </div>
604 </script>
605 </li>
606 <?php
607 }
608
609 /**
610 * Handles tabs fields AJAX
611 *
612 * @since 2.0.0
613 * @package userswp
614 *
615 * @return mixed|void
616 *
617 */
618 public function ajax_handler() {
619
620 if ( isset( $_REQUEST['create_field'] ) ) {
621
622 if ( ! current_user_can( 'manage_options' ) ) {
623 wp_die( - 1 );
624 }
625
626 $field_id = isset( $_REQUEST['field_id'] ) ? trim( sanitize_text_field( $_REQUEST['field_id'] ), '_' ) : '';
627 $field_action = isset( $_REQUEST['field_ins_upd'] ) ? sanitize_text_field( $_REQUEST['field_ins_upd'] ) : '';
628
629 /* ------- check nonce field ------- */
630 if ( isset( $_REQUEST['update'] ) && $_REQUEST['update'] == 'update' ) {
631
632 if ( ! empty( $_REQUEST['tabs'] ) && is_array( $_REQUEST['tabs'] ) ) {
633 if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp-admin-settings' ) ) {
634 return;
635 }
636 $tabs = $_REQUEST['tabs'];
637 $this->update_field_order( $tabs );
638
639 }
640 }
641
642 /* ---- Show field form in admin ---- */
643 if ( $field_action == 'new' ) {
644 if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp-admin-settings' ) ) {
645 return;
646 }
647 $htmlvar_name = isset( $_REQUEST['htmlvar_name'] ) ? sanitize_text_field( $_REQUEST['htmlvar_name'] ) : sanitize_text_field( $_REQUEST['tab_key'] );
648 $this->field_adminhtml( $htmlvar_name, $field_action, $_REQUEST );
649 }
650
651 /* ---- Delete field ---- */
652 if ( $field_id != '' && $field_action == 'delete' && isset( $_REQUEST['_wpnonce'] ) ) {
653 if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp_sort_delete_nonce_' . $field_id ) ) {
654 return;
655 }
656
657 $this->field_delete( $field_id );
658 }
659
660 /* ---- Save field ---- */
661 if ( $field_action == 'submit' && isset( $_REQUEST['_wpnonce'] ) ) {
662 if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp_sort_extras_nonce_' . $field_id ) ) {
663 return;
664 }
665
666 foreach ( $_REQUEST as $pkey => $pval ) {
667 $tags = is_array( $_REQUEST[ $pkey ] ) ? 'skip_field' : '';
668
669 if ( $tags != 'skip_field' ) {
670 $_REQUEST[ $pkey ] = strip_tags( sanitize_text_field( $_REQUEST[ $pkey ] ), $tags );
671 }
672 }
673
674 $lastid = $this->field_save( $_REQUEST );
675
676 if ( is_int( $lastid ) && $lastid > 0 ) {
677 $this->field_adminhtml( $lastid, 'submit' );
678 } else {
679 echo esc_html( $lastid );
680 }
681 }
682 }
683 die();
684 }
685
686 /**
687 * Save tabs fields
688 *
689 * @since 2.0.0
690 * @package userswp
691 *
692 * @param array $request_field Request data
693 *
694 * @return string|int
695 *
696 */
697 public function field_save( $request_field = array() ) {
698 global $wpdb;
699 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
700
701 $id = isset( $request_field['field_id'] ) && $request_field['field_id'] ? absint( $request_field['field_id'] ) : '';
702 $data_type = isset( $request_field['data_type'] ) ? sanitize_text_field( $request_field['data_type'] ) : 'VARCHAR';
703 $field_type = isset( $request_field['field_type'] ) ? sanitize_text_field( $request_field['field_type'] ) : '';
704 $site_title = isset( $request_field['site_title'] ) ? sanitize_text_field( $request_field['site_title'] ) : '';
705 $htmlvar_name = ! empty( $request_field['htmlvar_name'] ) ? sanitize_text_field( $request_field['htmlvar_name'] ) : str_replace(
706 array(
707 '-',
708 ' ',
709 '"',
710 "'",
711 ),
712 array( '_', '', '', '' ),
713 sanitize_title_with_dashes( $request_field['site_title'] )
714 );
715 $tab_parent = ! empty( $request_field['tab_parent'] ) ? sanitize_text_field( $request_field['tab_parent'] ) : 0;
716 $tab_level = ! empty( $request_field['tab_level'] ) ? sanitize_text_field( $request_field['tab_level'] ) : 0;
717 $field_icon = isset( $request_field['field_icon'] ) ? sanitize_text_field( $request_field['field_icon'] ) : '';
718 $is_active = isset( $request_field['is_active'] ) ? absint( $request_field['is_active'] ) : 0;
719 $is_default = isset( $request_field['is_default'] ) ? absint( $request_field['is_default'] ) : 0;
720 $sort = isset( $request_field['sort'] ) ? sanitize_text_field( $request_field['sort'] ) : 'asc';
721
722 $total_tabs = $wpdb->get_var( "SELECT COUNT(id) FROM {$table_name}" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
723
724 if ( isset( $is_default ) && $is_default > 0 ) {
725 $wpdb->query( 'update ' . $table_name . " set is_default='0' where is_default='1'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
726 }
727
728 $data = array(
729 'data_type' => $data_type,
730 'field_type' => $field_type,
731 'site_title' => $site_title,
732 'htmlvar_name' => $htmlvar_name,
733 'sort_order' => $total_tabs + 1,
734 'tab_parent' => $tab_parent,
735 'tab_level' => $tab_level,
736 'field_icon' => $field_icon,
737 'is_active' => $is_active,
738 'is_default' => $is_default,
739 'sort' => $sort,
740 );
741
742 $format = array_fill( 0, count( $data ), '%s' );
743
744 if ( $id ) { // update
745
746 $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
747 $table_name,
748 $data,
749 array( 'id' => $id ),
750 $format
751 );
752
753 $lastid = $id;
754
755 } else { // insert
756 $wpdb->insert( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
757 $table_name,
758 $data,
759 $format
760 );
761
762 $lastid = $wpdb->insert_id;
763 }
764
765 return (int) $lastid;
766 }
767
768 /**
769 * Save tabs fields
770 *
771 * @since 2.0.0
772 * @package userswp
773 *
774 * @param string $field_id Request data
775 *
776 * @return int
777 *
778 */
779 public function field_delete( $field_id = '' ) {
780 global $wpdb;
781 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
782
783 if ( $field_id != '' ) {
784 $cf = trim( $field_id, '_' );
785 $wpdb->query( $wpdb->prepare( 'delete from ' . $table_name . ' where id= %d ', array( $cf ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
786
787 return $field_id;
788 } else {
789 return 0;
790 }
791 }
792
793 /**
794 * Updates user sorting sort order.
795 *
796 * @param array $tabs Tabs array.
797 *
798 * @return object|bool Sorted tabs.
799 */
800 public function update_field_order( $tabs = array() ) {
801 global $wpdb;
802 $table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
803
804 $count = 0;
805 if ( ! empty( $tabs ) ) {
806 $result = false;
807 foreach ( $tabs as $index => $tab ) {
808 $result = $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
809 $table_name,
810 array(
811 'sort_order' => $index,
812 'tab_level' => (int) $tab['tab_level'],
813 'tab_parent' => (int) $tab['tab_parent'],
814 ),
815 array( 'id' => absint( $tab['id'] ) ),
816 array( '%d', '%d', '%d' )
817 );
818 ++$count;
819 }
820 if ( $result !== false ) {
821 return true;
822 } else {
823 return new WP_Error( 'failed', __( 'Failed to sort tab items.', 'userswp' ) );
824 }
825 } else {
826 return new WP_Error( 'failed', __( 'Failed to sort tab items.', 'userswp' ) );
827 }
828 }
829
830 /**
831 * Show custom fields in the user sorting form builder.
832 *
833 * @param array $fields Fields array.
834 *
835 * @return array Merged fields array.
836 */
837 public function add_custom_sort_options( $fields ) {
838 global $wpdb;
839 $table_name = uwp_get_table_prefix() . 'uwp_form_fields';
840
841 $custom_fields = $wpdb->get_results( 'select data_type,field_type,site_title,htmlvar_name,field_icon from ' . $table_name . " where is_active='1' and user_sort='1' AND field_type != 'fieldset' order by sort_order asc", 'ARRAY_A' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
842
843 if ( ! empty( $custom_fields ) ) {
844
845 foreach ( $custom_fields as $val ) {
846 $fields[ $val['htmlvar_name'] ] = $val;
847 }
848 }
849
850 return $fields;
851 }
852 }
853
854 }
855
856 new UsersWP_Settings_User_Sorting();
857