web-dev-qa-db-ja.com

今日登録したすべてのユーザーに問い合わせるにはどうすればよいですか。

今日登録したすべてのユーザーを返すためにmeta_queryを使用しようとしています。

$args = array(
    'meta_query' => array(
        array(
            'key' => 'user_registered',
            'value' => date('Y-m-d'),
            'compare' => '=',
            'type' => 'DATE'
        )
    )
);

$query = new WP_User_Query( $args );
$users = $query->get_results();

これはうまくいきません。何が足りないの?

6
mike23

数ヶ月前、WordPress 4.1以降で、 ユーザーの登録日 でのWP_User_Queryのサポートに関して、 get_users() および date_query のCodexを更新しました。

それから私はまた 簡単な例を/ - 最近の12時間の間に登録したユーザを見つける方法について 追加しました。

しかし現在の質問は、 今日 を登録したユーザーをどのように見つけるかです。

単に相対的な日付文字列を使うことができます:

$args = [
    'date_query' => [
        [ 'after'  => 'today', 'inclusive' => true ],
    ] 
];

$query = new WP_User_Query( $args );

これにより、次のSQLクエリが生成されます。

SELECT SQL_CALC_FOUND_ROWS wp_users.* FROM wp_users WHERE 1=1 AND ( 
    wp_users.user_registered >= '2015-11-06 00:00:00'
) ORDER BY user_login ASC ;

yearmonthおよびdayパラメータを明示的に設定することもできます。

$args = [
    'date_query' => [
        [   
            'year'  => current_time( 'Y' ),
            'month' => current_time( 'm' ),
            'day'   => current_time( 'd' ),
        ],
    ] 
];

$query = new WP_User_Query( $args );

それは生成されます:

SELECT SQL_CALC_FOUND_ROWS wp_users.* FROM wp_users WHERE 1=1 AND ( 
    ( 
        YEAR( wp_users.user_registered ) = 2015 
        AND MONTH( wp_users.user_registered ) = 11 
        AND DAYOFMONTH( wp_users.user_registered ) = 6 
    )
) ORDER BY user_login ASC ;
6
birgire

フィールドuser_registered*_usermetaテーブル内のaではなく、in *_users内にあります。

WP_User_Queryを使用するときにSQLステートメントを変更するための適切なフックもないようです。直接SQLステートメントを使用する必要があるようです。

もう1つの(マイナー)複雑な点は、登録日が日時として格納されていることです。

function wpse51485_get_users_registered_on( $date='' ){
    global $wpdb;

    if( empty($date) )
        $date = date('Y-m-d');

    $morning = new DateTime($date. ' 00:00:00');
    $night = new DateTime($date.' 23:59:59'); 
    $m = $morning->format('Y-m-d H:i:s');
    $n = $night->format('Y-m-d H:i:s');

    $sql = $wpdb->prepare("SELECT wp_users.* FROM wp_users WHERE 1=1 AND CAST(user_registered AS DATE) BETWEEN %s AND %s ORDER BY user_login ASC",$m,$n);

    $users = $wpdb->get_results($sql);

    return $users;
 }
11
Stephen Harris