web-dev-qa-db-fra.com

mysql interroge deux tables de base de données, users et usermeta, et les trie par valeur meta int personnalisée

J'essaie d'obtenir un tableau d'utilisateurs du site triés par une méta valeur personnalisée (un int).

Je peux très bien interroger les utilisateurs et les utiliser à nouveau dans un foreach. Actuellement, les résultats de la requête sont déjà triés par nom d'affichage, dans la table users. Je veux qu'il trie par la valeur usermeta personnalisée.

Des idées sur la façon de modifier cette requête pour que cela soit 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;
}
1
estern23

Vous n'obtiendrez pas un tri approprié sur la colonne meta_value car 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 à celle utilisée précédemment dans WordPress lorsque vous utilisiez meta_value_num pour effectuer le tri. essentiellement impliqué l'ajout d'un nombre sur le devant 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;
}

Cela vous donne alors un tri approprié sur la colonne de méta-valeur.

Vous pensiez que vous aimeriez peut-être une fonction pour pouvoir l'appeler où vous en avez besoin, il vous suffit de lui transmettre la clé méta que vous avez configurée pour les utilisateurs et éventuellement de modifier l'ordre de tri.

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

Trier par ordre décroissant.

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

Vous obtiendrez un tableau d'objets renvoyés comme avant, je suppose donc que vous savez comment effectuer une boucle sur ces données et que vous les appropriez pour les afficher, etc. (sinon, postez un commentaire).

0
t31os

essayez:

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 changez META_KEY_HERE en votre clé méta

1
Bainternet

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 conventions de type WP {{Query}}, vous pouvez commander, limiter le nombre de résultats, etc.

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

edit - Caveat: cela suppose que vous affectiez des données utilisateur personnalisées à la (aux) table (s) utilisateur (s) anticipée (s) de wp_core - ce qui est le cas dans le PO. Pour les tables personnalisées, vous voudrez utiliser l'approche $ wpdb décrite par un autre utilisateur.

0
Brandt Solovij