WordPress.org

Make WordPress Core


Ignore:
Timestamp:
08/11/2010 09:54:51 PM (11 years ago)
Author:
scribu
Message:

Ajaxify list-type screens in the admin. See #14579

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/user.php

    r15355 r15491  
    327327
    328328/**
     329 * WordPress User Query class.
     330 *
     331 * @since 3.1.0
     332 */
     333class WP_User_Query {
     334
     335    /**
     336     * {@internal Missing Description}}
     337     *
     338     * @since 3.1.0
     339     * @access private
     340     * @var array
     341     */
     342    var $results;
     343
     344    /**
     345     * The total number of users for the current query
     346     *
     347     * @since 3.1.0
     348     * @access private
     349     * @var int
     350     */
     351    var $total_users = 0;
     352
     353    var $query_from;
     354    var $query_where;
     355    var $query_orderby;
     356    var $query_limit;
     357
     358    /**
     359     * Sets up the object properties.
     360     *
     361     * @since 3.1.0
     362     *
     363     * @param string|array $args The query variables
     364     * @return WP_User_Query
     365     */
     366    function WP_User_Query( $query ) {
     367        $this->query_vars = wp_parse_args( $query, array(
     368            'search' => '', 'role' => '',
     369            'offset' => '', 'number' => '', 'count_total' => true,
     370            'orderby' => 'login', 'order' => 'ASC',
     371            'meta_key' => '', 'meta_value' => '',
     372            'include' => array(), 'exclude' => array(),
     373            'fields' => 'all'
     374        ) );
     375
     376        $this->prepare_query();
     377        $this->query();
     378    }
     379
     380    /**
     381     * Prepare the query variables
     382     *
     383     * @since 3.1.0
     384     * @access private
     385     */
     386    function prepare_query() {
     387        global $wpdb;
     388
     389        $qv = &$this->query_vars;
     390
     391        $this->query_from = " FROM $wpdb->users";
     392        $this->query_where = " WHERE 1=1";
     393
     394        // sorting
     395        if ( in_array( $qv['orderby'], array('email', 'url', 'registered') ) ) {
     396            $orderby = 'user_' . $qv['orderby'];
     397        }
     398        elseif ( 'name' == $qv['orderby'] ) {
     399            $orderby = 'display_name';
     400        }
     401        elseif ( 'post_count' == $qv['orderby'] ) {
     402            $where = get_posts_by_author_sql('post');
     403            $this->query_from .= " LEFT OUTER JOIN (
     404                SELECT post_author, COUNT(*) as post_count
     405                FROM wp_posts
     406                $where
     407                GROUP BY post_author
     408            ) p ON (wp_users.ID = p.post_author)
     409            ";
     410            $orderby = 'post_count';
     411        }
     412        else {
     413            $orderby = 'user_login';
     414        }
     415
     416        $qv['order'] = strtoupper( $qv['order'] );
     417        if ( 'ASC' == $qv['order'] )
     418            $order = 'ASC';
     419        else
     420            $order = 'DESC';
     421        $this->query_orderby = " ORDER BY $orderby $order";
     422
     423        // limit
     424        if ( $qv['number'] ) {
     425            if ( $qv['offset'] )
     426                $this->query_limit = $wpdb->prepare(" LIMIT %d, %d", $qv['offset'], $qv['offset'] + $qv['number']);
     427            else
     428                $this->query_limit = $wpdb->prepare(" LIMIT %d", $qv['number']);
     429        }
     430
     431        $search = trim( $qv['search'] );
     432        if ( $search ) {
     433            $this->query_where .= _wp_search_sql( $search, array('user_login', 'user_nicename', 'user_email', 'user_url', 'display_name') );
     434        }
     435
     436        $role = trim( $qv['role'] );
     437        if ( $role ) {
     438            $this->query_from .= " INNER JOIN $wpdb->usermeta ON $wpdb->users.ID = $wpdb->usermeta.user_id";
     439            $this->query_where .= $wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $role . '%');
     440        } elseif ( is_multisite() ) {
     441            $level_key = $wpdb->prefix . 'capabilities'; // wpmu site admins don't have user_levels
     442            $this->query_from .= ", $wpdb->usermeta";
     443            $this->query_where .= " AND $wpdb->users.ID = $wpdb->usermeta.user_id AND meta_key = '{$level_key}'";
     444        }
     445
     446        $meta_key = trim( $qv['meta_key'] );
     447        $meta_value = trim( $qv['meta_value'] );
     448        if ( $meta_key ) {
     449            if ( empty( $meta_value ) ) {
     450                $subquery = $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s", $meta_key );
     451            }
     452            else {
     453                $subquery = $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s AND meta_value = %s", $meta_key, $meta_value );
     454            }
     455
     456            $this->query_where .= " AND $wpdb->users.ID IN ($subquery)";
     457        }
     458
     459        if ( !empty($qv['include']) ) {
     460            $ids = implode( ',', wp_parse_id_list( $qv['include'] ) );
     461            $this->query_where .= " AND $wpdb->users.ID IN ($ids)";
     462        }
     463        elseif ( !empty($qv['exclude']) ) {
     464            $ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) );
     465            $this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)";
     466        }
     467
     468        do_action_ref_array( 'pre_user_query', array( &$this ) );
     469    }
     470
     471    /**
     472     * Execute the query, with the current variables
     473     *
     474     * @since 3.1.0
     475     * @access private
     476     */
     477    function query() {
     478        global $wpdb;
     479
     480        $this->results = $wpdb->get_col("SELECT DISTINCT($wpdb->users.ID)" . $this->query_from . $this->query_where . $this->query_orderby . $this->query_limit);
     481
     482        if ( !$this->results )
     483            return;
     484
     485        if ( $this->query_vars['count_total'] )
     486            $this->total_users = $wpdb->get_var("SELECT COUNT(DISTINCT($wpdb->users.ID))" . $this->query_from . $this->query_where);
     487
     488        if ( 'all' == $this->query_vars['fields'] ) {
     489            cache_users($this->results);
     490
     491            $r = array();
     492            foreach ( $this->results as $userid )
     493                $r[ $userid ] = new WP_User( $userid );
     494
     495            $this->results = $r;
     496        }
     497    }
     498
     499    /**
     500     * Return the list of users
     501     *
     502     * @since 3.1.0
     503     * @access public
     504     *
     505     * @return array
     506     */
     507    function get_results() {
     508        return $this->results;
     509    }
     510
     511    /**
     512     * Return the total number of users for the current query
     513     *
     514     * @since 3.1.0
     515     * @access public
     516     *
     517     * @return array
     518     */
     519    function get_total() {
     520        return $this->total_users;
     521    }
     522}
     523
     524/**
     525 * Retrieve list of users matching criteria.
     526 *
     527 * @since 3.1.0
     528 * @uses $wpdb
     529 * @uses WP_User_Query See for default arguments and information.
     530 *
     531 * @param array $args
     532 * @return array List of users.
     533 */
     534function get_users( $args ) {
     535
     536    $args = wp_parse_args( $args );
     537    $args['count_total'] = false;
     538
     539    $user_search = new WP_User_Query($args);
     540
     541    return (array) $user_search->get_results();
     542}
     543
     544/**
    329545 * Get users for the blog.
    330546 *
     
    430646 *
    431647 * Assumes there are neither duplicated nor orphaned capabilities meta_values.
    432  * Assumes role names are unique phrases.  Same assumption made by WP_User_Search::prepare_query()
     648 * Assumes role names are unique phrases.  Same assumption made by WP_User_Query::prepare_query()
    433649 * Using $strategy = 'time' this is CPU-intensive and should handle around 10^7 users.
    434650 * Using $strategy = 'memory' this is memory-intensive and should handle around 10^5 users, but see WP Bug #12257.
Note: See TracChangeset for help on using the changeset viewer.