wake-up-neo.net

Wie kann ich alle Benutzer abfragen, die sich heute registriert haben?

Ich versuche, meta_query zu verwenden, um alle Benutzer zurückzugeben, die sich heute registriert haben:

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

Dies scheint jedoch nicht zu funktionieren. Was vermisse ich ?

6
mike23

Vor ein paar Monaten habe ich den Codex für get_users() und WP_User_Query in Bezug auf die date_query-Unterstützung am Registrierungsdatum des Benutzers in WordPress 4.1+ aktualisiert.

Dann habe ich noch ein einfaches Beispiel hinzugefügt, wie man Benutzer findet, die sich in den letzten 12 Stunden registriert haben.

Aber die aktuelle Frage ist, wie man Benutzer findet, die heute registriert haben.

Wir könnten einfach eine relative Datumszeichenfolge verwenden:

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

$query = new WP_User_Query( $args );

das wird die folgende SQL-Abfrage generieren:

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 ;

Wir könnten auch die Parameter year, month und day explizit setzen:

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

$query = new WP_User_Query( $args );

das wird erzeugen:

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

Das Feld user_registered befindet sich nicht in der Tabelle *_usermeta, sondern im Feld *_users.

Es scheint auch keine geeigneten Hooks zu geben, um die SQL-Anweisung bei Verwendung von WP_User_Query zu ändern. Es scheint, dass Sie eine direkte SQL-Anweisung verwenden müssen.

Eine weitere (geringfügige) Komplikation besteht darin, dass das registrierte Datum als Datums- und Uhrzeitangabe gespeichert wird.

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