Advertisement
TIEro

WP_User_Query with sorting, filtering and pagination

Jun 24th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.72 KB | None | 0 0
  1.     global $wpdb;
  2.  
  3.     $show = (isset($_GET['show'])) ? $_GET['show'] : 'all';
  4.     $sort_by = (isset($_GET['sort'])) ? $_GET['sort'] : 'login';
  5.     $sort_order = (isset($_GET['order'])) ? $_GET['order'] : 'ASC';
  6.     $num_posts = (isset($_GET['num'])) ? $_GET['num'] : 20;
  7.     $user = (isset($_POST['user'])) ? $_POST['user'] : 'all';
  8.     $paged = (isset($_GET['paged'])) ? $_GET['paged'] : 1;
  9.  
  10.     // If a specific user, reset all other params to defaults (only 1 record to show).
  11.     if ($user != 'all') {
  12.         $show = 'all';
  13.         $sort_by = 'login';
  14.         $sort_order = 'ASC';
  15.         $paged = 1;
  16.     }
  17.    
  18.     $user_clause = ($user == 'all') ? "" : "AND a.ID = " . $user;
  19.     $role_clause = ($show == 'all') ? "" : "AND b.meta_key = 'aa_capabilities' AND b.meta_value LIKE '%" . $show . "%'";
  20.     switch ($sort_by) {
  21.         case 'login':
  22.             $sort_clause = "ORDER BY LOWER(a.user_login) " . $sort_order;
  23.             break;
  24.         case 'email':
  25.             $sort_clause = "ORDER BY LOWER(a.user_email) " . $sort_order;
  26.             break;
  27.         case 'display_name':
  28.             $sort_clause = "ORDER BY LOWER(a.display_name) " . $sort_order;
  29.             break;
  30.         case 'balance':
  31.             $sort_clause = "ORDER BY CAST(c.meta_value AS decimal) " . $sort_order;
  32.             break;
  33.         default:
  34.             $sort_clause = "ORDER BY LOWER(a.user_login) " . $sort_order;
  35.             break;
  36.     }
  37.    
  38.     $query =   "SELECT COUNT(DISTINCT a.ID) FROM $wpdb->users a
  39.                 JOIN $wpdb->usermeta b ON a.ID = b.user_id
  40.                 JOIN $wpdb->usermeta c ON a.ID = c.user_id
  41.                 WHERE c.meta_key = '_account_balance'
  42.                 " . $user_clause . " " . $role_clause . " " . $sort_clause;
  43.                
  44.     $num_users = $wpdb->get_var($query);
  45.  
  46.     // Work out pagination.
  47.     $num_pages = ceil($num_users/$num_posts);
  48.     $bottom_limit = $num_posts*($paged-1);
  49.    
  50.     $limit_clause = "LIMIT " . $num_posts . " OFFSET " . (($bottom_limit>0) ? $bottom_limit : 0);
  51.    
  52.     // Get actual results.
  53.     $query =   "SELECT DISTINCT a.ID FROM $wpdb->users a
  54.                 JOIN $wpdb->usermeta b ON a.ID = b.user_id
  55.                 JOIN $wpdb->usermeta c ON a.ID = c.user_id
  56.                 WHERE c.meta_key = '_account_balance'
  57.                 " . $user_clause . " " . $role_clause . " " . $sort_clause . " " . $limit_clause;
  58.                
  59.     $userlist = $wpdb->get_results($query);
  60.  
  61.     if ($num_users > 0) {
  62.     // Display code goes here (the foreach $userlist, yada yada yada)
  63.  
  64.     }
  65.  
  66.     if ($paged > 1) {
  67.         $prev = $paged-1;
  68.         echo '<span class="link-class"><a href="' . $base_url . '&show=' . $show . '&sort=' . $sort_by . '&order=' . $sort_order . '&num=' . $num_posts . '&paged=' . $prev . '">« Previous</a></span>&nbsp;&nbsp;&nbsp;';
  69.     }
  70.     if ($num_pages > 1 && $paged < $num_pages) {
  71.         $next = $paged+1;
  72.         echo  '<span class="link-class"><a href="' . $base_url . '&show=' . $show . '&sort=' . $sort_by . '&order=' . $sort_order . '&num=' . $num_posts . '&paged=' . $next . '">Next »</a></span>';
  73.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement