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 ?
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 ;
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;
}