it-swarm.com.de

Holen Sie sich alle Benutzer Meta von Meta-Schlüssel anstelle von ID

Ich versuche, Benutzer-Metawerte zu vergleichen, um höchste und niedrigste Werte zu finden. Ich habe einen Benutzer-Meta-Wert namens "hourly_rate" eingerichtet. Ich möchte den Stundensatz für alle Benutzer ermitteln und dann die PHP-Befehle min() und max() für diese Werte ausführen, um den niedrigsten und höchsten Stundensatz für alle meine Benutzer zu ermitteln.

Momentan mache ich das, indem ich alle Benutzer aus der Datenbank hole und eine foreach-Schleife durchlaufe, den spezifischen Metaschlüssel für jeden Benutzer greife und ihn in einem Array verstecke. Dann starte ich min und max auf diesem Array.

Da die Site in der Anzahl der Benutzer skaliert, scheint es ziemlich umständlich zu werden, nur einen minimalen und einen maximalen Wert zu finden. Gibt es eine Möglichkeit, etwas wie get_user_meta() per Schlüssel anstelle von ID zu tun?

Zum Beispiel mache ich momentan Folgendes:

$users = new WP_User_Query(array(
    'order' => 'DESC',
    'fields' => 'all_with_meta'
));

$hourly_rates_array = array();

foreach($users->results as $user){
    $hourly_rate = get_user_meta($user->ID, 'hourly_rate', true);
    array_Push($hourly_rates_array, $hourly_rate);
}

//Find the necessary limits for each user

$lowest_hourly_rate = min($hourly_rates_array);
$highest_hourly_rate = max($hourly_rates_array);

Gibt es eine Möglichkeit, wie ich so etwas machen könnte:

$hourly_rates_array = get_user_meta('ALL', 'hourly_rate', true);

$lowest_hourly_rate = min($hourly_rates_array);
$highest_hourly_rate = max($hourly_rates_array);

Welcher greift direkt auf die Tabelle wp_usermeta zu, anstatt über wp_users und dann über wp_usermeta zu springen? Dies würde meine DB-Abfragen drastisch reduzieren und die Leistung erheblich verbessern. Es scheint jedoch nicht möglich zu sein, user_meta anhand des Schlüssels anstelle der Benutzer-ID abzurufen.

Zwei Optionen. Die erste Methode hält Sie von benutzerdefiniertem SQL fern und sollte wesentlich effizienter sein als die derzeitige.

Es werden zwei Abfragen ausgeführt, eine, um die Benutzer-ID mit dem höchsten Stundensatz zu ermitteln, und eine weitere, um die niedrigste zu ermitteln. Sie benötigen noch eine Abfrage, um den Benutzer-Meta-Cache zu aktualisieren und dann sind Sie zuhause frei:

$query = new WP_User_Query;
$users = array(
    'min_user' => 'ASC',
    'max_user' => 'DESC',
);

foreach ( $users as $var => $order ) {
    $query->query(
        array(
            'count_total' => false, // Save SQL_CALC_FOUND_ROWS, don't need it
            'meta_key' => 'hourly_rate',
            'orderby' => 'meta_value',
            'fields' => 'ID', // Don't waste memory
            'number' => 1, // Just need the first user ID of the result
            'order' => $order,
        )
    );

    if ( $data = $query->get_results() )
        $$var = $data[0]; // User ID
    else
        $$var = 0;
}

update_meta_cache( 'users', array( $min_user, $max_user ) );

echo get_post_meta( $max_user, 'hourly_rate', true ); // Highest hourly rate
echo get_post_meta( $min_user, 'hourly_rate', true ); // Lowest hourly rate

Die zweite ist eine benutzerdefinierte SQL-Abfrage:

$rates = $wpdb->get_row( "SELECT MAX( CAST( meta_value AS UNSIGNED ) ) AS max_rate, MIN( CAST( meta_value AS UNSIGNED ) ) AS min_rate FROM $wpdb->usermeta WHERE meta_key = 'hourly_rate'" ); 

echo $rates->max_rate;
echo $rates->min_rate;

Schlanker geht es nicht!

2
TheDeadMedic