問題描述
我正在嘗試使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。