web-dev-qa-db-de.com

mysql fragt zwei Datenbanktabellen ab, users und usermeta, und sortiert nach benutzerdefiniertem Meta-Int-Wert

Ich versuche, ein Array von Site-Benutzern nach einem benutzerdefinierten Metawert (einem Int) zu sortieren.

Ich kann die Benutzer gut abfragen und sie wieder in einem foreach verwenden. Ich habe derzeit die Abfrageergebnisse bereits sortiert nach Anzeigename aus der Benutzertabelle zurückgekommen. Ich möchte, dass es nach dem benutzerdefinierten usermeta-Wert sortiert wird.

Haben Sie Ideen, wie Sie diese Abfrage ändern können, um dies zu erreichen?

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

Sie werden keine richtige Sortierung für die Spalte meta_value erhalten, da die dort gespeicherten Werte nicht als Ganzzahlwerte behandelt werden. Sie können jedoch eine Methode verwenden, die der von WordPress bei der Verwendung von meta_value_num für die Sortierung ähnelt Im Grunde ging es darum, eine Zahl auf die Vorderseite der Daten zu setzen.

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;
}

Dies gibt Ihnen dann eine richtige Sortierung für die Meta-Wert-Spalte.

Vielleicht möchten Sie eine Funktion, damit Sie sie an jedem Ort aufrufen können, an dem Sie sie benötigen. Übergeben Sie ihr einfach den für Benutzer eingerichteten Metaschlüssel und ändern Sie optional die Sortierreihenfolge.

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

Absteigend sortieren.

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

Sie erhalten eine Reihe von Objekten, die wie zuvor zurückgegeben wurden. Ich gehe also davon aus, dass Sie wissen, wie Sie diese Daten durchlaufen und für die Anzeige usw. verwenden können (wenn nicht, senden Sie einen Kommentar).

0
t31os

versuchen :

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;

und ändere META_KEY_HERE in deinen Metaschlüssel

1
Bainternet

Ihr macht zu viel Arbeit: 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 );

Wie bei anderen Konventionen vom Typ WP {{Query}} können Sie nach Reihenfolge sortieren, die Anzahl der Ergebnisse begrenzen usw.

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

bearbeiten - Einschränkung: Dies setzt voraus, dass Sie der (den) erwarteten Benutzertabelle (n) von wp_core benutzerdefinierte Benutzerdaten zuweisen. Dies sieht im OP so aus, als ob Sie es sind. Für benutzerdefinierte Tabellen sollten Sie den von einem anderen Benutzer beschriebenen $ wpdb-Ansatz verwenden

0
Brandt Solovij