web-dev-qa-db-fra.com

Obtenir tous les méta utilisateur par clé méta au lieu de l'ID

J'essaie de comparer les méta-valeurs utilisateur pour trouver les valeurs les plus élevées et les plus basses. J'ai une méta-valeur utilisateur configurée appelée "hourly_rate". Je souhaite obtenir le tarif horaire pour tous les utilisateurs, puis exécuter les fonctions min() et max() de PHP sur ces valeurs afin de rechercher les taux horaires les plus bas et les plus élevés pour l'ensemble de mes utilisateurs.

Actuellement, je le fais en récupérant tous les utilisateurs de la base de données et en effectuant une itération dans une boucle foreach, en saisissant la clé méta spécifique de chaque utilisateur et en la stockant dans un tableau. Ensuite, je lance min et max sur ce tableau.

Au fur et à mesure que le site évolue en nombre d'utilisateurs, il semble que cela puisse devenir assez lourd simplement pour trouver une valeur minimale et maximale. Existe-t-il un moyen de faire quelque chose comme get_user_meta() à l'aide d'une clé au lieu d'un ID?

Par exemple, je fais actuellement ceci:

$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);

Est-il possible de faire quelque chose comme ça:

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

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

Qui aurait directement accès à la table wp_usermeta au lieu de rebondir via wp_users puis wp_usermeta? Cela réduirait considérablement mes requêtes de base de données et améliorerait considérablement les performances, mais je n'arrive pas à trouver un moyen d'obtenir user_meta par clé plutôt que par ID utilisateur.

1
Thought Space Designs

Deux options. Le premier vous éloignera du SQL personnalisé et devrait être beaucoup plus efficace que ce que vous avez actuellement.

Il exécute deux requêtes, l'une pour obtenir l'ID utilisateur avec le taux horaire le plus élevé, puis de nouveau pour obtenir le plus bas. Vous avez besoin d’une autre requête pour mettre à jour le méta cache de l’utilisateur et vous n’êtes plus à la maison:

$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

La seconde est une requête SQL personnalisée:

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

Ne devient pas beaucoup plus maigre que ça!

2
TheDeadMedic