web-dev-qa-db-fra.com

Comment interroger tous les utilisateurs enregistrés aujourd'hui?

J'essaie d'utiliser meta_query pour renvoyer tous les utilisateurs qui se sont inscrits aujourd'hui:

$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();

Cela ne semble pas fonctionner si. Qu'est-ce que je rate ?

6
mike23

Il y a quelques mois, j'ai mis à jour le Codex pour get_users() et WP_User_Query , concernant le support de date_query sur date d'enregistrement de l'utilisateur, dans WordPress 4.1+.

Ensuite, j'ai également ajouté un exemple simple sur la recherche des utilisateurs enregistrés au cours des 12 dernières heures.

Mais la question actuelle est de savoir comment trouver les utilisateurs enregistrés aujourd'hui.

Nous pourrions simplement utiliser une chaîne de date relative:

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

$query = new WP_User_Query( $args );

qui générera la requête SQL suivante:

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 ;

Nous pourrions également définir les paramètres year, month et day explicitement:

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

$query = new WP_User_Query( $args );

cela va générer:

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

Le champ user_registered n'est pas un dans la table *_usermeta, mais le dans *_users.

Il ne semble pas non plus exister de crochets appropriés pour modifier l'instruction SQL lors de l'utilisation de WP_User_Query. Il semble que vous deviez utiliser une instruction SQL directe.

Une autre complication (mineure) est que la date enregistrée est stockée sous forme de date-heure.

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