requête mysql deux tables de base de données, les utilisateurs et usermeta et sorte par la coutume méta valeur int

wordpress.stackexchange https://wordpress.stackexchange.com/questions/11403

Question

Je suis en train d'obtenir un tableau des utilisateurs du site classé par une valeur méta personnalisée (un int).

Je peux interroger les utilisateurs très bien et les faire revenir à l'utilisation dans un foreach. J'ai actuellement les résultats de la requête en reviennent triés déjà par display_name de la table des utilisateurs. Je veux trier par la valeur usermeta personnalisée.

Toutes les idées sur la façon de modifier cette requête pour obtenir ce fait?

function get_all_top_members() {
    global $wpdb;
   $gather_users = "SELECT * FROM ".$wpdb->prefix."users ORDER BY display_name ASC";
$all_users = $wpdb->get_results($gather_users);
return $all_users;
}
Était-ce utile?

La solution

Vous n'obtiendrez une sorte appropriée sur la colonne meta_value parce que les valeurs qui y sont stockées ne sont pas traitées comme des valeurs entières, mais vous pouvez utiliser une méthode similaire à la façon dont il a été fait ce WordPress arrière quand nous utilisions meta_value_num à faire le tri, qui intervient essentiellement en ajoutant un certain nombre sur la face avant des données.

function get_users_ordered_by_meta( $key = '', $d = 'ASC' ) {
    global $wpdb;
    $d = ( strtoupper( $d ) == 'DESC' ) ? 'DESC' : 'ASC';
    if( '' == $key )
        return;
    $r = $wpdb->get_results( $wpdb->prepare( "
        SELECT u.ID, u.display_name, u.user_nicename, um.meta_value 
        FROM {$wpdb->usermeta} um, {$wpdb->users} u
        WHERE um.user_id = u.ID
        AND um.meta_key = %s
        ORDER by (0 + um.meta_value) $d
    ", $key ) );
    return $r;
}

vous donne alors une sorte appropriée sur la colonne meta valeur.

FIGURED vous pourriez aimer une fonction de sorte que vous pouvez appeler partout où vous en avez besoin, juste passer la clé de méta que vous avez configuré pour les utilisateurs, et éventuellement modifier l'ordre de tri.

$yourvar = get_users_ordered_by_meta('your-key');

Tri décroissant.

$yourvar = get_users_ordered_by_meta('your-key', 'desc');

Vous obtiendrez un tableau d'objets est revenu comme avant, donc je vais suppose que vous savez comment faire une boucle sur ces données et qu'il est approprié pour l'affichage, etc ... (sinon, poster un commentaire).

Autres conseils

essayer:

global $wpdb;
$gather_users = $wpdb->get_col("SELECT user_id FROM $wpdb->usermeta WHERE $wpdb->usermeta.meta_key = 'META_KEY_HERE' ORDER BY $wpdb->usermeta.meta_value ASC");
$all_users = $wpdb->get_results($gather_users);
return $all_users;

et le changement META_KEY_HERE à votre clé méta

Les gars, vous faites trop de travail: https://codex.wordpress.org/Class_Reference/WP_User_Query

$args = array(
    'meta_query' => array(
        array(
            array(
                'key'     => 'YOUR_KEY',
                'value'   => 'whatever_value_you\'re_looking_for',
                'compare' => '='
            )
        )
    )
 );
$user_query = new WP_User_Query( $args );

Comme les autres WP {{query}} conventions de type, vous pouvez orderBy, le nombre de résultat limite, etc ...

https://codex.wordpress.org/Class_Reference/WP_User_Query

modifier - caveat: cela suppose que vous assignez des données utilisateur personnalisée à la table de l'utilisateur prévu de wp_core (s) - qui, dans le OP il semble que vous êtes. Pour les tables personnalisées, vous aurez envie d'aller l'approche wpdb de $ décrit par un autre utilisateur

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top