674 分类:

菜比用WordPress里的WP_User_Query类来进行用户查询

有这么一个类WP_User_Query,基本用法可以通过get_results()方法或者$results获取用户列表

<?php
$args = array(
    .
    .
    .
);

// The Query
$user_query = new WP_User_Query( $args );

// User Loop
if ( ! empty( $user_query->get_results() ) ) {
    foreach ( $user_query->get_results() as $user ) {
        echo '<p>' . $user->display_name . '</p>';
    }
} else {
    echo 'No users found.';
}
?>

role表示查询匹配角色的用户
fields表示查询返回指定的字段

$user_fields = array( 'user_login', 'user_nicename', 'user_email', 'user_url' );
$user_query = new WP_User_Query( array( 'role' => 'editor', 'fields' => $user_fields ) );

如果只是查询所有用户的话,也可以通过get_users()函数
File: wp-includes/user.php

function get_users( $args = array() ) {

$args                = wp_parse_args( $args );
$args['count_total'] = false;
 
$user_search = new WP_User_Query( $args );
 
return (array) $user_search->get_results();
}

但是查询参数里的count_total始终设置为false,想获取用户查询结果用户数的话,还得用WP_User_Query类里的get_total()方法或者total_users属性,在这里默认值是true

分页的话用到number,offset或paged这三个参数,number指返回结果最大数量,offset设置偏移量或者用paged设置查询的页码

// limit
if ( isset( $qv['number'] ) && $qv['number'] > 0 ) {
    if ( $qv['offset'] ) {
        $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['offset'], $qv['number'] );
    } else {
         $this->query_limit = $wpdb->prepare( 'LIMIT %d, %d', $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] );
    }
}

通过源码可知,设置了offset就不用paged这参数了,所以两者选其一

最后我想在函数中使用怎么办,通过百度可知,PHP中全局变量在函数中使用时必须声明为 global。

所以函数中使用global $user_query;但我要设置每次分页的参数怎么办,发现了WP_User_Query类有get,set方法$user_query->set('paged',$page);

然后我又还尝试获取结果,每次都是第一页

$users= $user_query->get_results();
$total=$user_query->get_total();

看上面那get_users()函数是在函数内实例化类,或者我看那简单的没用函数直接展示页面。但我这次用的是AJAX,不知道是什么思想不想每次都在函数内实例化类,就想用全局的,一番查找后发现可以这样

/**
 * PHP5 constructor.
 *
 * @since 3.1.0
 *
 * @param null|string|array $query Optional. The query variables.
 */
public function __construct( $query = null ) {
    if ( ! empty( $query ) ) {
        $this->prepare_query( $query );
        $this->query();
    }
}

看到源码他是这样在构造函数里,处理了查询参数,再执行查询,我一看prepare_query函数里最终用到的是$this->query_vars,而这函数作用应该就是设置SQL查询语句,你光set方法设置了变量不改动查询语句也没用啊,看到这些函数都是public然后在我自己的函数里这样试着

$user_query->prepare_query($user_query->$query_vars );
$user_query->query();

因为之前只用了query()发现不行,看来还是要在查询前处理下查询参数,这样的话就可以在函数内使用全局的对象,每次分页只用设置一下参数重新执行查询方法。

#WordPress, WP_User_Query

作者: 站长

版权: 除特别声明,均采用BY-NC-SA 4.0许可协议,转载请表明出处

目录Content

评论