Je m'attendais à pouvoir faire quelque chose comme ce qui suit qui, à mon avis, renverrait tous les utilisateurs qui se sont inscrits avant une date donnée:
$args = array(
'post_type' => 'post',
'date_query' => array(
array(
'before' => current_time( 'mysql' )
)
)
);
$query = new WP_User_Query( $args );
Cependant, contrairement à WP_Query
, WP_User_Query
ne prend pas en charge le paramètre date_query
et le code ci-dessus ne fonctionne donc pas.
Comment puis-je obtenir une liste de tous les utilisateurs enregistrés avant une date donnée?
pre_user_query
:Il n'y a pas beaucoup de filtres disponibles, mais vous pouvez essayer le hook pre_user_query
:
// Add filter:
add_action( 'pre_user_query', 'wpse_filter_by_reg_date' );
// Query:
$query = new WP_User_Query( $args );
// Remove filter:
remove_action( 'pre_user_query', 'wpse_filter_by_reg_date' );
où le rappel du filtre est:
/**
* Filter WP_User_Query by user_registered date
*
* @see http://wordpress.stackexchange.com/a/160826/26350
* @param WP_User_Query The current WP_User_Query instance
*/
function wpse_filter_by_reg_date( $q )
{
global $wpdb;
$q->query_where .= $wpdb->prepare(
" AND {$wpdb->users}.user_registered >= '%s' ",
date( "Y-m-d" )
);
}
Vous pouvez ensuite modifier le rappel de filtre en fonction de vos besoins.
WP_User_Query
avec des variables de requête personnalisées:Vous pouvez également rendre cela plus dynamique en utilisant les paramètres de chaîne personnalisés _registered
et _registered_compare
. Ensuite, votre requête pourrait être:
$args = array(
'orderby' => 'login',
'order' => 'ASC',
'_registered' => date( 'Y-m-d' ),
'_registered_compare' => '>=',
);
$query = new WP_User_Query( $args );
où:
/**
* Add support for the custom '_registered' and '_registered_compare'
* string input parameters in WP_User_Query().
*
* @see http://wordpress.stackexchange.com/a/160826/26350
* @param WP_User_Query The current WP_User_Query instance
*/
function wpse_registered_filter( $q )
{
if( isset( $q->query_vars['_registered'] )
&& isset( $q->query_vars['_registered_compare'] )
&& is_string( $q->query_vars['_registered_compare'] )
)
{
// Input:
$registered = $q->query_vars['_registered'];
$compare = $q->query_vars['_registered_compare'];
// Init:
$available_compares = array( '=', '<', '>', '<=', '>=', '!=' );
// Default compare:
if( ! in_array( $compare, $available_compares, TRUE ) )
$compare = '=';
// Modify query:
global $wpdb;
$q->query_where .= $wpdb->prepare(
" AND {$wpdb->users}.user_registered {$compare} '%s' ",
$registered
);
}
}
add_action( 'pre_user_query', 'wpse_registered_filter' );
En réponse au commentaire ci-dessous, voici un exemple de la manière dont vous pouvez écrire le SQL manuellement:
global $wpdb;
$sql = $wpdb->prepare(
"SELECT ID FROM {$wpdb->users} WHERE {$wpdb->users}.user_registered >= '%s' ",
current_time( 'mysql' )
);
$uids = $wpdb->get_col( $sql );
Vous pouvez utiliser WP_User_Query
pour récupérer une liste de tous les identifiants d’utilisateur, puis le transmettre à get_userdata
pour récupérer la date d'enregistrement d'un utilisateur.
Vous pouvez ensuite trier et exclure les utilisateurs en fonction d'une date et d'une heure spécifiques.
Voici mon idée
<?php
$user_query = new WP_User_Query( array(
'fields' => 'ID',
) );
$users = $user_query->get_results();
foreach( $users as $user ) {
$user_object = get_userdata( $user );
$cutoffdate = '2013-07-01 00:00:01';
if( $user_object->user_registered < $cutoffdate ) {
echo '<p>' . $user_object->display_name;
echo '</br>';
echo $user_object->user_registered . '</p>';
}
}
?>