问题描述
我正在尝试使用 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();
这似乎不行。我失踪了什么
最佳解决方案
几个月前,我更新了 get_users()
和 WP_User_Query
的 Codex,关于用户注册日期在 WordPress 4.1+中的 date_query
支持。
然后我还添加了一个 simple example 如何找到在过去 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 ;
我们还可以明确设置 year
,month
和 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 ;
次佳解决方案
字段 user_registered
不是在*_usermeta
表中,而是在*_users
中。
在使用 WP_User_Query
时,似乎也没有任何适当的钩子更改 SQL 语句。看来你需要使用直接的 SQL 语句。
另一个 (次要的) 并发症是注册日期存储为 date-time 。
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;
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。