query_vars['orderby'] ) && 'uwp_meta_value' == $vars->query_vars['orderby'] && is_uwp_users_page() ) {
$sort_by = $meta_key = '';
$order = 'ASC';
if ( isset( $_GET['uwp_sort_by'] ) && $_GET['uwp_sort_by'] != '' ) {
$sort_by = sanitize_key( strip_tags( esc_sql( $_GET['uwp_sort_by'] ) ) );
}
if ( empty( $sort_by ) ) {
$sort_by = uwp_get_default_sort();
}
if ( $sort_by ) {
if ( substr( strtolower( $sort_by ), - 5 ) == '_desc' ) {
$order = 'DESC';
$meta_key = substr( $sort_by, 0, strlen( $sort_by ) - 5 );
$order_by = 'meta_value';
} elseif ( substr( strtolower( $sort_by ), - 4 ) == '_asc' ) {
$order = 'ASC';
$meta_key = substr( $sort_by, 0, strlen( $sort_by ) - 4 );
$order_by = 'meta_value';
}
// check meta key exists
if ( $meta_key && 'user_registered' !== $meta_key ) {
$table = new UsersWP_Tables();
if ( ! in_array( $meta_key, $table->get_db_usermeta_columns() ) ) {
$meta_key = '';
}
}
if ( ! empty( $order_by ) && $meta_key ) {
$meta_table_name = uwp_get_table_prefix() . 'uwp_usermeta';
$table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
if ( 'user_registered' == $meta_key ) {
$orderby = $meta_key;
} else {
$orderby = $meta_table_name . '.' . sanitize_key( $meta_key );
}
$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
$vars->query_orderby = 'ORDER BY ' . $orderby . ' ' . $order;
$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
if ( $parent_id ) {
$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
if ( $children ) {
foreach ( $children as $child ) {
if ( ! in_array( $child->field_type, array( 'newer', 'older' ) ) ) {
$vars->query_orderby .= ' , ' . $child->htmlvar_name . ' ' . $order;
}
}
}
}
}
}
}
if ( is_uwp_users_page() && !empty($_GET['uwp_sort_by']) ) {
if ($_GET['uwp_sort_by'] === 'random_asc' || $_GET['uwp_sort_by'] === 'random_desc') {
// Random order
$vars->query_orderby = 'ORDER BY RAND()';
}
}
return $vars;
}
/**
* Add a tab to form builder
*
* @since 1.2.2.38
* @package userswp
*
* @param array $tabs Tabs
*
* @return array $tabs
*/
public function form_builder_tab_items( $tabs ) {
$tabs['user-sorting'] = __( 'User Sorting', 'userswp' );
return $tabs;
}
/**
* Add a tab to form builder
*
* @since 1.2.2.38
* @package userswp
*
* @param string $heading Heading
* @param string $form_type Form type
*
* @return string
*/
public function available_fields_head( $heading, $form_type ) {
switch ( $form_type ) {
case 'user-sorting':
$heading = __( 'Available sorting options for users listing and search results', 'userswp' );
break;
}
return $heading;
}
/**
* Add a note above available fields.
*
* @since 1.2.2.38
* @package userswp
*
* @param string $note Note to display
* @param string $form_type Form type
*
* @return string
*/
public function available_fields_note( $note, $form_type ) {
switch ( $form_type ) {
case 'user-sorting':
$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' );
break;
}
return $note;
}
/**
* Heading for the selected fields
*
* @since 1.2.2.38
* @package userswp
*
* @param string $heading Heading to display
* @param string $form_type Form type
*
* @return string
*/
public function selected_fields_head( $heading, $form_type ) {
switch ( $form_type ) {
case 'user-sorting':
$heading = __( 'List of fields that will appear in users listing and search results sorting option dropdown box.', 'userswp' );
break;
}
return $heading;
}
/**
* Add a note above selected fields.
*
* @since 1.2.2.38
* @package userswp
*
* @param string $note Note to display
* @param string $form_type Form type
*
* @return string
*/
public function selected_fields_note( $note, $form_type ) {
switch ( $form_type ) {
case 'user-sorting':
$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' );
break;
}
return $note;
}
/**
* Display available fields
*
* @since 1.2.2.38
* @package userswp
*
* @param string $form_type Form type
*
*/
public function manage_available_fields( $form_type ) {
if ( 'user-sorting' == $form_type ) {
$this->available_fields( $form_type );
}
}
/**
* Display selected fields
*
* @since 1.2.2.38
* @package userswp
*
* @param string $form_type Form type
*
*/
public function manage_selected_fields( $form_type ) {
if ( 'user-sorting' == $form_type ) {
$this->selected_fields( $form_type );
}
}
/**
* Display available sorting fields
*
* @since 1.2.2.38
* @package userswp
*
* @param string $form_type Form type
*
*/
public function available_fields( $form_type ) {
global $wpdb;
$fields = array();
$fields['newer'] = array(
'data_type' => '',
'field_type' => 'newer',
'site_title' => __( 'Newer', 'userswp' ),
'htmlvar_name' => 'newer',
'field_icon' => 'fas fa-calendar',
'sort' => 'asc',
'description' => __( 'Sort by new user registration', 'userswp' ),
);
$fields['older'] = array(
'data_type' => '',
'field_type' => 'older',
'site_title' => __( 'Older', 'userswp' ),
'htmlvar_name' => 'older',
'field_icon' => 'fas fa-calendar',
'sort' => 'desc',
'description' => __( 'Sort by new user registration in descending order', 'userswp' ),
);
$fields['display_name'] = array(
'data_type' => '',
'field_type' => 'text',
'site_title' => __( 'Display Name', 'userswp' ),
'htmlvar_name' => 'display_name',
'field_icon' => 'fas fa-sort-alpha-up',
'sort' => 'asc',
'description' => __( 'Sort alphabetically by display name in ascending order', 'userswp' ),
);
$fields['first_name'] = array(
'data_type' => '',
'field_type' => 'text',
'site_title' => __( 'First Name', 'userswp' ),
'htmlvar_name' => 'first_name',
'field_icon' => 'fas fa-sort-alpha-up',
'sort' => 'asc',
'description' => __( 'Sort alphabetically by first name in ascending order', 'userswp' ),
);
$fields['last_name'] = array(
'data_type' => '',
'field_type' => 'text',
'site_title' => __( 'Last Name', 'userswp' ),
'htmlvar_name' => 'last_name',
'field_icon' => 'fas fa-sort-alpha-up',
'sort' => 'asc',
'description' => __( 'Sort alphabetically by last name in ascending order', 'userswp' ),
);
$fields['random'] = array(
'data_type' => '',
'field_type' => 'text',
'site_title' => __( 'Random', 'userswp' ),
'htmlvar_name' => 'random',
'field_icon' => 'fa-solid fa-shuffle',
'sort' => '',
'description' => __( 'Sort users by random', 'userswp' )
);
$fields = apply_filters( 'uwp_add_custom_sort_options', $fields );
?>
';
} elseif ( uwp_is_icon_url( $icon ) ) {
$field_icon = '';
} else {
$field_icon = '';
}
?>
-
get_row( $wpdb->prepare( 'select * from ' . $table_name . ' where id= %d', array( $field_id ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
} elseif ( is_object( $field_id ) ) {
$field_id = $field_id->id;
$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
} elseif ( isset( $field_id ) && ! empty( $field_id ) ) {
$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
} else {
$field = array();
}
if ( isset( $request['site_title'] ) ) {
$site_title = esc_attr( $request['site_title'] );
} elseif ( $field && isset( $field->site_title ) ) {
$site_title = wp_unslash( $field->site_title );
} else {
$site_title = '';
}
if ( isset( $request['htmlvar_name'] ) ) {
$htmlvar_name = esc_attr( $request['htmlvar_name'] );
} elseif ( $field && isset( $field->htmlvar_name ) ) {
$htmlvar_name = $field->htmlvar_name;
} else {
$htmlvar_name = '';
}
if ( isset( $request['field_type'] ) ) {
$field_type = esc_attr( $request['field_type'] );
} elseif ( $field && isset( $field->field_type ) ) {
$field_type = $field->field_type;
} else {
$field_type = '';
}
if ( isset( $request['data_type'] ) ) {
$data_type = esc_attr( $request['data_type'] );
} elseif ( $field && isset( $field->data_type ) ) {
$data_type = $field->data_type;
} else {
$data_type = '';
}
if ( isset( $request['field_icon'] ) && $request['field_icon'] != '' ) {
$icon = esc_attr( $request['field_icon'] );
} elseif ( $field && isset( $field->field_icon ) ) {
$icon = $field->field_icon;
} else {
$icon = 'fas fa-sort';
}
if ( uwp_is_fa_icon( $icon ) ) {
$field_icon = '';
} elseif ( uwp_is_icon_url( $icon ) ) {
$field_icon = '';
} elseif ( isset( $field->tab_type ) && $field->tab_type == 'fieldset' ) {
$field_icon = '';
} else {
$field_icon = '';
}
if ( isset( $request['tab_parent'] ) && $request['tab_parent'] != '' ) {
$tab_parent = esc_attr( $request['tab_parent'] );
} elseif ( $field && isset( $field->tab_parent ) ) {
$tab_parent = $field->tab_parent;
} else {
$tab_parent = 0;
}
if ( isset( $request['tab_level'] ) && $request['tab_level'] != '' ) {
$tab_level = esc_attr( $request['tab_level'] );
} elseif ( $field && isset( $field->tab_level ) ) {
$tab_level = $field->tab_level;
} else {
$tab_level = 0;
}
$nonce = wp_create_nonce( 'uwp_sort_extras_nonce_' . $field_id );
?>
update_field_order( $tabs );
}
}
/* ---- Show field form in admin ---- */
if ( $field_action == 'new' ) {
if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp-admin-settings' ) ) {
return;
}
$htmlvar_name = isset( $_REQUEST['htmlvar_name'] ) ? sanitize_text_field( $_REQUEST['htmlvar_name'] ) : sanitize_text_field( $_REQUEST['tab_key'] );
$this->field_adminhtml( $htmlvar_name, $field_action, $_REQUEST );
}
/* ---- Delete field ---- */
if ( $field_id != '' && $field_action == 'delete' && isset( $_REQUEST['_wpnonce'] ) ) {
if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp_sort_delete_nonce_' . $field_id ) ) {
return;
}
$this->field_delete( $field_id );
}
/* ---- Save field ---- */
if ( $field_action == 'submit' && isset( $_REQUEST['_wpnonce'] ) ) {
if ( ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'uwp_sort_extras_nonce_' . $field_id ) ) {
return;
}
foreach ( $_REQUEST as $pkey => $pval ) {
$tags = is_array( $_REQUEST[ $pkey ] ) ? 'skip_field' : '';
if ( $tags != 'skip_field' ) {
$_REQUEST[ $pkey ] = strip_tags( sanitize_text_field( $_REQUEST[ $pkey ] ), $tags );
}
}
$lastid = $this->field_save( $_REQUEST );
if ( is_int( $lastid ) && $lastid > 0 ) {
$this->field_adminhtml( $lastid, 'submit' );
} else {
echo esc_html( $lastid );
}
}
}
die();
}
/**
* Save tabs fields
*
* @since 2.0.0
* @package userswp
*
* @param array $request_field Request data
*
* @return string|int
*
*/
public function field_save( $request_field = array() ) {
global $wpdb;
$table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
$id = isset( $request_field['field_id'] ) && $request_field['field_id'] ? absint( $request_field['field_id'] ) : '';
$data_type = isset( $request_field['data_type'] ) ? sanitize_text_field( $request_field['data_type'] ) : 'VARCHAR';
$field_type = isset( $request_field['field_type'] ) ? sanitize_text_field( $request_field['field_type'] ) : '';
$site_title = isset( $request_field['site_title'] ) ? sanitize_text_field( $request_field['site_title'] ) : '';
$htmlvar_name = ! empty( $request_field['htmlvar_name'] ) ? sanitize_text_field( $request_field['htmlvar_name'] ) : str_replace(
array(
'-',
' ',
'"',
"'",
),
array( '_', '', '', '' ),
sanitize_title_with_dashes( $request_field['site_title'] )
);
$tab_parent = ! empty( $request_field['tab_parent'] ) ? sanitize_text_field( $request_field['tab_parent'] ) : 0;
$tab_level = ! empty( $request_field['tab_level'] ) ? sanitize_text_field( $request_field['tab_level'] ) : 0;
$field_icon = isset( $request_field['field_icon'] ) ? sanitize_text_field( $request_field['field_icon'] ) : '';
$is_active = isset( $request_field['is_active'] ) ? absint( $request_field['is_active'] ) : 0;
$is_default = isset( $request_field['is_default'] ) ? absint( $request_field['is_default'] ) : 0;
$sort = isset( $request_field['sort'] ) ? sanitize_text_field( $request_field['sort'] ) : 'asc';
$total_tabs = $wpdb->get_var( "SELECT COUNT(id) FROM {$table_name}" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
if ( isset( $is_default ) && $is_default > 0 ) {
$wpdb->query( 'update ' . $table_name . " set is_default='0' where is_default='1'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
}
$data = array(
'data_type' => $data_type,
'field_type' => $field_type,
'site_title' => $site_title,
'htmlvar_name' => $htmlvar_name,
'sort_order' => $total_tabs + 1,
'tab_parent' => $tab_parent,
'tab_level' => $tab_level,
'field_icon' => $field_icon,
'is_active' => $is_active,
'is_default' => $is_default,
'sort' => $sort,
);
$format = array_fill( 0, count( $data ), '%s' );
if ( $id ) { // update
$wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$table_name,
$data,
array( 'id' => $id ),
$format
);
$lastid = $id;
} else { // insert
$wpdb->insert( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
$table_name,
$data,
$format
);
$lastid = $wpdb->insert_id;
}
return (int) $lastid;
}
/**
* Save tabs fields
*
* @since 2.0.0
* @package userswp
*
* @param string $field_id Request data
*
* @return int
*
*/
public function field_delete( $field_id = '' ) {
global $wpdb;
$table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
if ( $field_id != '' ) {
$cf = trim( $field_id, '_' );
$wpdb->query( $wpdb->prepare( 'delete from ' . $table_name . ' where id= %d ', array( $cf ) ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
return $field_id;
} else {
return 0;
}
}
/**
* Updates user sorting sort order.
*
* @param array $tabs Tabs array.
*
* @return object|bool Sorted tabs.
*/
public function update_field_order( $tabs = array() ) {
global $wpdb;
$table_name = uwp_get_table_prefix() . 'uwp_user_sorting';
$count = 0;
if ( ! empty( $tabs ) ) {
$result = false;
foreach ( $tabs as $index => $tab ) {
$result = $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$table_name,
array(
'sort_order' => $index,
'tab_level' => (int) $tab['tab_level'],
'tab_parent' => (int) $tab['tab_parent'],
),
array( 'id' => absint( $tab['id'] ) ),
array( '%d', '%d', '%d' )
);
++$count;
}
if ( $result !== false ) {
return true;
} else {
return new WP_Error( 'failed', __( 'Failed to sort tab items.', 'userswp' ) );
}
} else {
return new WP_Error( 'failed', __( 'Failed to sort tab items.', 'userswp' ) );
}
}
/**
* Show custom fields in the user sorting form builder.
*
* @param array $fields Fields array.
*
* @return array Merged fields array.
*/
public function add_custom_sort_options( $fields ) {
global $wpdb;
$table_name = uwp_get_table_prefix() . 'uwp_form_fields';
$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
if ( ! empty( $custom_fields ) ) {
foreach ( $custom_fields as $val ) {
$fields[ $val['htmlvar_name'] ] = $val;
}
}
return $fields;
}
}
}
new UsersWP_Settings_User_Sorting();