web-dev-qa-db-fra.com

Comment obtenir une liste de tous les utilisateurs enregistrés avant une date donnée?

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?

1
henrywright

Méthode n ° 1: le hook 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.

Méthode n ° 2: 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' );

Méthode n ° 3: SQL manuel:

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 );
4
birgire

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>';
        }
    }
?>
2
Pieter Goosen