如何获取在给定日期之前注册的所有用户的列表?

时间:2014-09-09 作者:henrywright

我希望能够执行以下操作,我认为这将返回在给定日期之前注册的所有用户:

$args = array(
    \'post_type\' => \'post\',
    \'date_query\' => array(
        array(
            \'before\' => current_time( \'mysql\' )
        )
    )
);
$query = new WP_User_Query( $args );
但是,与WP_Query, WP_User_Query 不支持date_query 参数,因此上述代码不起作用。

如何获取给定日期之前注册的所有用户的列表?

2 个回复
最合适的回答,由SO网友:birgire 整理而成

方法#1:pre_user_query 挂钩:

可用的过滤器不多,但您可以尝试pre_user_query 挂钩:

// Add filter:
add_action(    \'pre_user_query\', \'wpse_filter_by_reg_date\' );

// Query:
$query = new WP_User_Query( $args );

// Remove filter:
remove_action( \'pre_user_query\', \'wpse_filter_by_reg_date\' );
其中,筛选器回调为:

/**
 * Filter WP_User_Query by user_registered date
 *
 * @see   http://wordpress.stackexchange.com/a/160826/26350
 * @param WP_User_Query The current WP_User_Query instance
 */

function wpse_filter_by_reg_date( $q )
{
    global $wpdb;
    $q->query_where .=  $wpdb->prepare(
        " AND {$wpdb->users}.user_registered >= \'%s\' ",
        date( "Y-m-d" )
    );
}
然后可以根据需要修改过滤器回调。

方法#2:WP_User_Query 使用自定义查询变量:

您还可以通过使用自定义字符串参数使其更加动态_registered_registered_compare. 那么您的查询可能是:

$args = array(
    \'orderby\'             => \'login\',
    \'order\'               => \'ASC\',
    \'_registered\'         => date( \'Y-m-d\' ),
    \'_registered_compare\' => \'>=\',
);
$query = new WP_User_Query( $args );
其中:

/**
 * Add support for the custom \'_registered\' and \'_registered_compare\'
 * string input parameters in WP_User_Query().
 *
 * @see   http://wordpress.stackexchange.com/a/160826/26350
 * @param WP_User_Query The current WP_User_Query instance
 */

function wpse_registered_filter( $q )
{
    if( isset( $q->query_vars[\'_registered\'] )
        && isset( $q->query_vars[\'_registered_compare\'] )
        && is_string( $q->query_vars[\'_registered_compare\'] )
    )
    {   
        // Input:
        $registered = $q->query_vars[\'_registered\'];
        $compare    = $q->query_vars[\'_registered_compare\'];

        // Init:     
        $available_compares = array( \'=\', \'<\', \'>\', \'<=\', \'>=\', \'!=\' );

        // Default compare:
        if( ! in_array( $compare, $available_compares, TRUE ) )
            $compare = \'=\';

        // Modify query:
        global $wpdb;                                               
        $q->query_where .=  $wpdb->prepare(
            " AND {$wpdb->users}.user_registered {$compare} \'%s\' ",
            $registered
        );
    }
}
add_action( \'pre_user_query\', \'wpse_registered_filter\' );
方法#3:手动SQL:响应下面的注释,这是一个如何手动编写SQL的示例:

    global $wpdb;
    $sql = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->users} WHERE {$wpdb->users}.user_registered >= \'%s\' ",
        current_time( \'mysql\' )
    );
    $uids = $wpdb->get_col( $sql );

SO网友:Pieter Goosen

你可以利用WP_User_Query 检索所有用户ID的列表,然后将其传递给get_userdata 检索用户的注册日期。

然后,您可以根据特定的日期和时间对用户进行排序并将其排除在外。

这是我的想法

<?php
    $user_query = new WP_User_Query( array(
        \'fields\'    => \'ID\',
    ) );
    $users = $user_query->get_results();

    foreach( $users as $user ) {
        $user_object = get_userdata( $user );
        $cutoffdate = \'2013-07-01 00:00:01\';

        if( $user_object->user_registered < $cutoffdate ) {
            echo \'<p>\' . $user_object->display_name; 
            echo \'</br>\';
            echo $user_object->user_registered . \'</p>\';
        }
    }
?>

结束

相关推荐

激活时插件错误-中断页面编码并打印插件php文件的代码

我有WordPress多站点安装,一切正常。在我的本地服务器上开发了一个自定义pugin(与Nginx、PHP、MySQL、Memcached的配置相同,唯一的区别是本地操作系统-Windows 7与服务器上的Ubuntu 14.04 LTS),它运行得很好。插件处理自定义前端重新注册、登录、密码重置和用户激活、自定义配置文件页面和配置文件编辑(配置文件是带有一些自定义分类的自定义帖子类型)。所有表单都通过ajax提交。一切都在本地运行。当我尝试在服务器上激活插件时,它会激活,但会完全弄乱西里尔文编码,并