web-dev-qa-db-ja.com

特定の日付け前に登録されたすべてのユーザーのリストを取得する方法

私は次のようなことができると期待していました。与えられた日付より前に登録したすべてのユーザーを返すと私は考えました。

$args = array(
    'post_type' => 'post',
    'date_query' => array(
        array(
            'before' => current_time( 'mysql' )
        )
    )
);
$query = new WP_User_Query( $args );

ただし、WP_Queryとは異なり、WP_User_Querydate_queryパラメータをサポートしていないため、上記のコードは機能しません。

特定の日付より前に登録されたすべてのユーザーのリストを取得する方法を教えてください。

1
henrywright

方法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 );
4
birgire

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>';
        }
    }
?>
2
Pieter Goosen