web-dev-qa-db-fra.com

Triez les utilisateurs par "anniversaire" en utilisant WP_User_Query

J'ai créé une méta utilisateur contenant l'anniversaire de l'utilisateur.

anniversaire est le champ de la date.

Maintenant, j'essaie de comprendre comment trier (obtenir) tous les utilisateurs ayant un anniversaire basé sur un mois spécifique.

J'ai créé un menu déroulant qui contient tous les mois.

function users_months_dropdown() {
?> 
<select name="month" id="month" onchange="" size="1">
    <option value="01">January</option>
    <option value="02">February</option>
    <option value="03">March</option>
    <option value="04">April</option>
    <option value="05">May</option>
    <option value="06">June</option>
    <option value="07">July</option>
    <option value="08">August</option>
    <option value="09">September</option>
    <option value="10">October</option>
    <option value="11">November</option>
    <option value="12">December</option>
</select>
<?php
        submit_button( __( 'Filter Date' ), 'secondary', 'filter_date_action', false );
}
add_action( 'restrict_manage_users', 'users_months_dropdown' );

et maintenant j'empile avec la requête

j'essaie aussi

function extended_user_searchs( $user_query ){
    if( isset( $_GET['month'] ) && !empty( $_GET['month'] ) ) {
        $date = $_GET['month'];
        $user_query->query_where .= " AND MONTH(birthday) = $date";
    }
}
add_action( 'pre_user_query', 'extended_user_searchs' );
1
need-help

Méta-requête utilisateur avec RLIKE:

Si la date de naissance est stockée comme dd/mm/yyyy, dans la méta de l'utilisateur, vous pourrez trouver tous les utilisateurs du mois d'août ayant la méta requête suivante:

'meta_query' => [
    [
        'key'     => 'birthday',
        'value'   => '/08/',
        'compare' => 'RLIKE'
    ],
]

Vous pouvez également envisager de stocker le mois d'anniversaire en plus dans la méta de l'utilisateur.

Ici J'ai listé les comparaisons de méta disponibles.

Appliqué à votre extrait de code:

Partie # 1

Voici comment vous pouvez appliquer cela à votre exemple de code:

/**
 * Setup the user meta query for the current birth month
 */
add_action( 'pre_get_users', function( $user_query ) 
{
    // User input:
    $birthmonth = filter_input( INPUT_GET, 'birthmonth', FILTER_SANITIZE_NUMBER_INT );

    // Setup the meta query:
    if( $birthmonth ) 
    {
        $user_query->query_vars['meta_key']     = 'birthday';
        $user_query->query_vars['meta_value']   = zeroise( $birthmonth, 2 );
        $user_query->query_vars['meta_compare'] = 'RLIKE';
    }
} );          

où nous utilisons le hook pre_get_users au lieu du pre_user_query et utilisons la fonction pratique zeroise() - il est informatif de vérifier la classe \WP_Locale. Nous allons utiliser sa méthode get_month() dans la deuxième partie ci-dessous.

Notez que dans votre tentative actuelle de modification directe de la requête SQL, le champ birthday est traité comme faisant partie de la table wp_users. De plus, le INNER JOIN, dans la table wp_usermeta, est manquant.

Vous devez également valider/désinfecter la saisie de l'utilisateur.

Partie n ° 2

La deuxième partie est modifiée pour:

/**
 * Add a birth month filter to the users table
 */    
add_action( 'restrict_manage_users', function()
{   
    global $wp_locale;

    // User input:
    $birthmonth = filter_input( INPUT_GET, 'birthmonth', FILTER_SANITIZE_NUMBER_INT );

    // Birthmonth select box: 
    print '<select name="birthmonth" id="birthmonth" onchange="" size="1">';
    printf( '<option value="">%s</option>', __( 'Birthmonth' ) );
    foreach( range(1,12) as $month )
    {
        printf( 
            '<option value="%d" %s>%s</option>', 
            $month, 
            selected( $birthmonth, $month ), 
            $wp_locale->get_month( $month )  
        );
    } 
    print '</select>';
} );

où nous utilisons birthmonth au lieu de month, pour éviter les collisions de noms.

J'ai également ajouté l'état par défaut, sans aucune birthmonth sélectionnée.

Également ajouté la fonction pratique selected(), pour afficher l'option actuellement sélectionnée.

Les noms de mois sont définis dans la classe \WP_Locale et l'instance de classe est disponible via l'objet global $wp_locale.

2
birgire