File "user.php"
Full Path: /www/wwwroot/shphe-en.com/wp-content/plugins/admin-columns-pro/classes/sortable/classes/user.php
File size: 7.8 KB
MIME-type: --
Charset: utf-8
<?php
/**
* Addon class
*
* @since 1.0
*/
class CAC_Sortable_Model_User extends CAC_Sortable_Model {
/**
* Constructor
*
* @since 1.0
*/
function __construct( $storage_model ) {
parent::__construct( $storage_model );
// default sortby
$this->default_orderby = '';
// handle sorting request
add_action( 'pre_user_query', array( $this, 'handle_sorting_request' ), 1 );
// register sortable headings
add_filter( "manage_users_sortable_columns", array( $this, 'add_sortable_headings' ) );
// add reset button
add_action( 'restrict_manage_users', array( $this, 'add_reset_button' ) );
}
/**
* @see CAC_Sortable_Model::get_sortables()
* @since 1.0
*/
public function get_sortables() {
$column_names = array(
// WP default columns
'role',
'posts',
// Custom Columns
'column-first_name',
'column-display_name',
'column-last_name',
'column-meta',
'column-nickname',
'column-user_commentcount',
'column-user_description',
'column-user_id',
'column-user_postcount',
'column-user_registered',
'column-user_url',
// ACF Fields
'column-acf_field',
// WooCommerce
'column-wc-user-orders',
'column-wc-user-order_count'
//'column-wc-user-total-sales'
// WC Subscriptions extension
//'column-wc-user-subscription-expiration-date',
//'column-wc-user-subscription-trial-expiration-date',
//'column-wc-user-subscription-status',
//'column-wc-user-subscription-next-payment-date',
//'column-wc-user-subscription-last-payment-date',
//'column-wc-user-subscription-end-date'
);
return $column_names;
}
/**
* Get Users
*
* Do not use get_users() method.
*
* @since 1.0
*/
private function get_user_ids() {
global $wpdb;
return $wpdb->get_col( "SELECT ID FROM $wpdb->users" );
}
/**
* Admin requests for orderby column
*
* Only works for WP_Query objects ( such as posts and media )
*
* @since 1.0
*
* @param array $vars
* @return array Vars
*/
public function handle_sorting_request( $user_query ) {
global $wpdb;
$vars = $user_query->query_vars;
// prevent looping because this filter is trigered by get_users();
/*if ( 'ID' === $vars['fields'] ) {
return;
}*/
// sorting event?
if ( empty( $vars['orderby'] ) ) {
return;
}
$vars = $this->apply_sorting_preference( $vars );
$column = $this->get_column_by_orderby( $vars['orderby'] );
if ( empty( $column ) ) {
return;
}
// unsorted Users
$_users = array();
switch ( $column->properties->type ) :
// WP Default Columns
case 'role' :
$sort_flag = SORT_REGULAR;
foreach ( $this->get_user_ids() as $id ) {
$u = get_userdata( $id );
$role = ! empty( $u->roles[0] ) ? $u->roles[0] : '';
if ( $role ) {
$_users[ $id ] = $this->prepare_sort_string_value( $role );
}
}
break;
case 'posts' :
$sort_flag = SORT_NUMERIC;
foreach ( $this->get_user_ids() as $id ) {
$_users[ $id ] = $column->get_user_postcount( $id, 'post' );
}
break;
// Custom Columns
case 'column-user_id' :
$user_query->query_orderby = "ORDER BY ID {$vars['order']}";
$vars['orderby'] = 'ID';
break;
case 'column-user_registered' :
$user_query->query_orderby = "ORDER BY user_registered {$vars['order']}";
$vars['orderby'] = 'registered';
break;
case 'column-nickname' :
$sort_flag = SORT_REGULAR;
break;
case 'column-first_name' :
$sort_flag = SORT_REGULAR;
break;
case 'column-display_name' :
$sort_flag = SORT_REGULAR;
break;
case 'column-last_name' :
$sort_flag = SORT_REGULAR;
break;
case 'column-user_url' :
$sort_flag = SORT_REGULAR;
break;
case 'column-user_description' :
$sort_flag = SORT_REGULAR;
break;
case 'column-user_commentcount' :
// @todo: maybe use WP_Comment_Query to generate this subquery? penalty is extra query and bloat, advantage is WP_Comment_Query filters used
$sub_query = "
LEFT JOIN (
SELECT user_id, COUNT(user_id) AS comment_count
FROM {$wpdb->comments}
WHERE user_id <> 0
GROUP BY user_id
) AS comments
ON {$wpdb->users}.ID = comments.user_id
";
$user_query->query_from .= $sub_query;
$user_query->query_orderby = "ORDER BY comment_count " . $vars['order'];
if ( ! $this->show_all_results ) {
$user_query->query_where .= " AND comment_count IS NOT NULL";
}
break;
case 'column-user_postcount' :
$sort_flag = SORT_NUMERIC;
foreach ( $this->get_user_ids() as $id ) {
$_users[ $id ] = $column->get_count( $id );
}
break;
case 'column-meta' :
$sort_flag = SORT_REGULAR;
if ( 'numeric' == $column->options->field_type ) {
$sort_flag = SORT_NUMERIC;
}
if ( 'checkmark' == $column->options->field_type ) {
foreach ( $this->get_user_ids() as $id ) {
$value = $column->get_value( $id );
$_users[ $id ] = $this->prepare_sort_string_value( $value ? '1' : '0' );
}
}
if ( in_array( $column->options->field_type, array( 'image', 'library_id' ) ) ) {
$sort_flag = SORT_NUMERIC;
foreach ( $this->get_user_ids() as $id ) {
$thumbs = $column->get_thumbnails( $column->get_meta_by_id( $id ) );
$_users[ $id ] = $thumbs ? count( $thumbs ) : 0;
}
}
break;
case 'column-acf_field' :
if ( method_exists( $column, 'get_field' ) ) {
$field = $column->get_field();
$sort_flag = in_array( $field['type'], array( 'date_picker', 'number' ) ) ? SORT_NUMERIC : SORT_REGULAR;
foreach ( $this->get_user_ids() as $id ) {
$value = $column->get_sorting_value( $id );
if ( $value || $this->show_all_results ) {
$_users[ $id ] = $this->prepare_sort_string_value( $value );
}
}
}
break;
// WooCommerce
case 'column-wc-user-orders':
$sort_flag = SORT_NUMERIC;
foreach ( $this->get_user_ids() as $id ) {
$value = $column->get_raw_value( $id );
if ( $value || $this->show_all_results ) {
$_users[ $id ] = count( $value );
}
}
break;
case 'column-wc-user-order_count':
$sort_flag = SORT_NUMERIC;
break;
case 'column-wc-user-total-sales':
$sort_flag = SORT_NUMERIC;
foreach ( $this->get_user_ids() as $id ) {
$value = $column->get_sorting_value( $id );
if ( $value || $this->show_all_results ) {
$_users[ $id ] = $value;
}
}
break;
// Try to sort by raw value.
default :
$sort_flag = SORT_REGULAR;
foreach ( $this->get_user_ids() as $id ) {
$_users[ $id ] = $column->get_raw_value( $id );
}
endswitch;
if ( isset( $sort_flag ) ) {
// set sorting value
if ( empty( $_users ) ) {
foreach ( $this->get_user_ids() as $id ) {
$value = $column->get_raw_value( $id );
if ( $value || $this->show_all_results ) {
$_users[ $id ] = $this->prepare_sort_string_value( $value );
}
}
}
// sorting
if ( 'ASC' == $vars['order'] ) {
asort( $_users, $sort_flag );
} else {
arsort( $_users, $sort_flag );
}
// alter orderby SQL
if ( ! empty( $_users ) ) {
global $wpdb;
// for MU site compatibility
$prefix = $wpdb->base_prefix;
$column_names = implode( ',', array_keys( $_users ) );
$user_query->query_where .= " AND {$prefix}users.ID IN ({$column_names})";
$user_query->query_orderby = "ORDER BY FIELD({$prefix}users.ID,{$column_names})";
}
// cleanup the vars we dont need
$vars['order'] = '';
$vars['orderby'] = '';
}
$user_query->query_vars = array_merge( $user_query->query_vars, $vars );
}
}