今日登録したすべてのユーザーを返すために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();
これはうまくいきません。何が足りないの?
数ヶ月前、WordPress 4.1以降で、 ユーザーの登録日 でのWP_User_Query
のサポートに関して、 get_users()
および date_query
のCodexを更新しました。
それから私はまた 簡単な例を/ - 最近の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
テーブル内のaではなく、in *_users
内にあります。
WP_User_Query
を使用するときにSQLステートメントを変更するための適切なフックもないようです。直接SQLステートメントを使用する必要があるようです。
もう1つの(マイナー)複雑な点は、登録日が日時として格納されていることです。
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;
}