WordPress.org

Make WordPress Core

Ticket #2793: WP_User_Search_class.diff

File WP_User_Search_class.diff, 9.0 KB (added by markjaquith, 9 years ago)

Move user search/paging to a class

  • wp-admin/users.php

     
    2020        $redirect = 'users.php'; 
    2121} 
    2222 
     23 
     24// WP_User_Search class 
     25// by Mark Jaquith 
     26 
     27 
     28class WP_User_Search { 
     29        var $results; 
     30        var $search_term; 
     31        var $page; 
     32        var $raw_page; 
     33        var $users_per_page = 50; 
     34        var $first_user; 
     35        var $last_user; 
     36        var $query_limit; 
     37        var $query_from_where; 
     38        var $total_users_for_query = 0; 
     39        var $too_many_total_users = false; 
     40        var $search_errors; 
     41 
     42        function WP_User_Search ($search_term = '', $page = '') { // constructor 
     43                $this->search_term = $search_term; 
     44                $this->raw_page = ( '' == $page ) ? false : (int) $page; 
     45                $this->page = (int) ( '' == $page ) ? 1 : $page; 
     46 
     47                $this->prepare_query(); 
     48                $this->query(); 
     49                $this->prepare_vars_for_template_usage(); 
     50                $this->do_paging(); 
     51        } 
     52 
     53        function prepare_query() { 
     54                global $wpdb; 
     55                $this->first_user = ($this->page - 1) * $this->users_per_page; 
     56                $this->query_limit = 'LIMIT ' . $this->first_user . ',' . $this->users_per_page; 
     57                if ( $this->search_term ) { 
     58                        $searches = array(); 
     59                        $search_sql = 'AND ('; 
     60                        foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col ) 
     61                                $searches[] = $col . " LIKE '%$this->search_term%'"; 
     62                        $search_sql .= implode(' OR ', $searches); 
     63                        $search_sql .= ')'; 
     64                } 
     65                $this->query_from_where = "FROM $wpdb->users WHERE 1=1 $search_sql"; 
     66 
     67                if ( !$_GET['update'] && !$this->search_term && !$this->raw_page && $wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users") > $this->users_per_page ) 
     68                        $this->too_many_total_users = sprintf(__('Because this blog has more than %s users, they cannot all be shown on one page.  Use the paging or search functionality in order to find the user you want to edit.'), $this->users_per_page); 
     69        } 
     70 
     71        function query() { 
     72                global $wpdb; 
     73                $this->results = $wpdb->get_col('SELECT ID ' . $this->query_from_where . $this->query_limit); 
     74 
     75                if ( $this->results ) 
     76                        $this->total_users_for_query = $wpdb->get_var('SELECT COUNT(ID) ' . $this->query_from_where); // no limit 
     77                else 
     78                        $this->search_errors = new WP_Error('no_matching_users_found', __('No matching users were found!')); 
     79        } 
     80 
     81        function prepare_vars_for_template_usage() { 
     82                $this->search_term = stripslashes($this->search_term); // done with DB, from now on we want slashes gone 
     83        } 
     84 
     85        function do_paging() { 
     86                if ( $this->total_users_for_query > $this->users_per_page ) { // have to page the results 
     87                        $prev_page = ( $this->page > 1) ? true : false; 
     88                        $next_page = ( ($this->page * $this->users_per_page) < $this->total_users_for_query ) ? true : false; 
     89                        $this->paging_text = ''; 
     90                        if ( $prev_page ) 
     91                                $this->paging_text .= '<p class="alignleft"><a href="' . add_query_arg(array('usersearch' => $this->search_term, 'userspage' => $this->page - 1), 'users.php?') . '">&laquo; Previous Page</a></p>'; 
     92                        if ( $next_page ) 
     93                                $this->paging_text .= '<p class="alignright"><a href="' . add_query_arg(array('usersearch' => $this->search_term, 'userspage' => $this->page + 1), 'users.php?') . '">Next Page &raquo;</a></p>'; 
     94                        if ( $prev_page || $next_page ) 
     95                                $this->paging_text .= '<br style="clear:both" />'; 
     96                } 
     97        } 
     98 
     99        function get_results() { 
     100                return $this->results; 
     101        } 
     102 
     103        function page_links() { 
     104                echo $this->paging_text; 
     105        } 
     106 
     107        function results_are_paged() { 
     108                if ( $this->paging_text ) 
     109                        return true; 
     110                return false; 
     111        } 
     112 
     113        function is_search() { 
     114                if ( $this->search_term ) 
     115                        return true; 
     116                return false; 
     117        } 
     118} 
     119 
     120 
    23121switch ($action) { 
    24122 
    25123case 'promote': 
     
    172270 
    173271        include('admin-header.php'); 
    174272 
    175         /* Paging and Search by Mark Jaquith, June 6th, 2006 */ 
     273        // Query the users 
     274        $wp_user_search = new WP_User_Search($_GET['usersearch'], $_GET['userspage']); 
    176275 
    177         $users_per_page = 50; 
    178  
    179         $page = (int) $_GET['userspage']; 
    180         if ( !$page ) 
    181                 $page = 1; 
    182  
    183         $starton = ($page - 1) * $users_per_page; 
    184  
    185         $limit = 'LIMIT ' . $starton . ',' .  $users_per_page; 
    186  
    187         $search_term = $_GET['usersearch']; 
    188         if ( $search_term ) { 
    189                 $searches = array(); 
    190                 $search_sql = 'AND ('; 
    191                 foreach ( array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') as $col ) 
    192                         $searches[] = $col . " LIKE '%$search_term%'"; 
    193                 $search_sql .= implode(' OR ', $searches); 
    194                 $search_sql .= ')'; 
    195                 $search_term = stripslashes($search_term); // done with DB, from now on we want slashes gone 
    196         } 
    197  
    198         if ( !$_GET['update'] && !$search_term && !$_GET['userspage'] && $wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users") > $users_per_page ) 
    199                 $too_many_users = sprintf(__('Because this blog has more than %s users, they cannot all be shown on one page.  Use the paging or search functionality in order to find the user you want to edit.'), $users_per_page); 
    200  
    201         $from_where = "FROM $wpdb->users WHERE 1=1 $search_sql"; 
    202         $userids = $wpdb->get_col('SELECT ID ' . $from_where . $limit); 
    203  
    204         if ( $userids ) 
    205                 $total_users_for_this_query = $wpdb->get_var('SELECT COUNT(ID) ' . $from_where); // no limit 
    206         else 
    207                 $search_errors = new WP_Error('no_matching_users_found', __('No matching users were found!')); 
    208  
    209         // Now for the paging 
    210         if ( $total_users_for_this_query > $users_per_page ) { // have to page the results 
    211                 $prev_page = ( $page > 1) ? true : false; 
    212                 $next_page = ( ($page * $users_per_page) < $total_users_for_this_query ) ? true : false; 
    213                 $paging_text = ''; 
    214                 if ( $prev_page ) 
    215                         $paging_text .= '<p class="alignleft"><a href="' . add_query_arg(array('usersearch' => $search_term, 'userspage' => $page - 1), 'users.php?') . '">&laquo; Previous Page</a></p>'; 
    216                 if ( $next_page ) 
    217                         $paging_text .= '<p class="alignright"><a href="' . add_query_arg(array('usersearch' => $search_term, 'userspage' => $page + 1), 'users.php?') . '">Next Page &raquo;</a></p>'; 
    218                 if ( $prev_page || $next_page ) 
    219                         $paging_text .= '<br style="clear:both" />'; 
    220         } 
    221  
    222         // Clean up, we're done with these variables 
    223         unset($prev_page, $next_page, $limit, $searches, $search_sql, $col); 
    224  
    225276        // Make the user objects 
    226         foreach ( (array) $userids as $userid ) { 
     277        foreach ( $wp_user_search->get_results() as $userid ) { 
    227278                $tmp_user = new WP_User($userid); 
    228279                $roles = $tmp_user->roles; 
    229280                $role = array_shift($roles); 
     
    275326        </div> 
    276327<?php endif; ?> 
    277328 
    278 <?php if ( $too_many_users ) : ?> 
     329<?php if ( $wp_user_search->too_many_total_users ) : ?> 
    279330        <div id="message" class="updated"> 
    280                 <p><?php echo $too_many_users; ?></p> 
     331                <p><?php echo $wp_user_search->too_many_total_users; ?></p> 
    281332        </div> 
    282333<?php endif; ?> 
    283334 
    284335<div class="wrap"> 
    285336 
    286         <?php if ( $search_term ) : ?> 
    287                 <h2><?php printf(__('Users Matching "%s" by Role'), $search_term); ?></h2> 
     337        <?php if ( $wp_user_search->is_search() ) : ?> 
     338                <h2><?php printf(__('Users Matching "%s" by Role'), $wp_user_search->search_term); ?></h2> 
    288339        <?php else : ?> 
    289340                <h2><?php _e('User List by Role'); ?></h2> 
    290341        <?php endif; ?> 
    291342 
    292343        <form action="" method="get" name="search" id="search"> 
    293                 <p><input type="text" name="usersearch" id="usersearch" value="<?php echo wp_specialchars($search_term); ?>" /> <input type="submit" value="<?php _e('Search for users &raquo;'); ?>" /></p> 
     344                <p><input type="text" name="usersearch" id="usersearch" value="<?php echo wp_specialchars($wp_user_search->search_term); ?>" /> <input type="submit" value="<?php _e('Search for users &raquo;'); ?>" /></p> 
    294345        </form> 
    295346 
    296         <?php if ( is_wp_error( $search_errors ) ) : ?> 
     347        <?php if ( is_wp_error( $wp_user_search->search_errors ) ) : ?> 
    297348                <div class="error"> 
    298349                        <ul> 
    299350                        <?php 
    300                                 foreach ( $search_errors->get_error_messages() as $message ) 
     351                                foreach ( $wp_user_search->search_errors->get_error_messages() as $message ) 
    301352                                        echo "<li>$message</li>"; 
    302353                        ?> 
    303354                        </ul> 
     
    305356        <?php endif; ?> 
    306357 
    307358 
    308 <?php if ( $userids ) : ?> 
     359<?php if ( $wp_user_search->get_results() ) : ?> 
    309360 
    310         <?php if ( $search_term ) : ?> 
     361        <?php if ( $wp_user_search->is_search() ) : ?> 
    311362                <p><a href="users.php"><?php _e('&laquo; Back to All Users'); ?></a></p> 
    312363        <?php endif; ?> 
    313364 
    314         <h3><?php printf(__('Results %1$s - %2$s of %3$s shown below'), $starton + 1, min($starton + $users_per_page, $total_users_for_this_query), $total_users_for_this_query); ?></h3> 
     365        <h3><?php printf(__('Results %1$s - %2$s of %3$s shown below'), $wp_user_search->first_user + 1, min($wp_user_search->first_user + $wp_user_search->users_per_page, $wp_user_search->total_users_for_query), $wp_user_search->total_users_for_query); ?></h3> 
    315366 
    316         <?php if ( $paging_text ) : ?> 
    317                 <div class="user-paging-text"><?php echo $paging_text; ?></p></div> 
     367        <?php if ( $wp_user_search->results_are_paged() ) : ?> 
     368                <div class="user-paging-text"><?php $wp_user_search->page_links(); ?></p></div> 
    318369        <?php endif; ?> 
    319370 
    320371<form action="" method="post" name="updateusers" id="updateusers"> 
     
    353404<?php } ?> 
    354405</table> 
    355406 
    356 <?php if ( $paging_text ) : ?> 
    357         <div class="user-paging-text"><?php echo $paging_text; ?></div> 
     407<?php if ( $wp_user_search->results_are_paged() ) : ?> 
     408        <div class="user-paging-text"><?php $wp_user_search->page_links(); ?></div> 
    358409<?php endif; ?> 
    359410 
    360411        <h2><?php _e('Update Users'); ?></h2>