web-dev-qa-db-fra.com

Obtenir un tableau de meta_values ​​pour un utilisateur meta_key

J'ai besoin d'obtenir un tableau de toutes les valeurs méta pour un utilisateur meta_key. J'ai trouvé ce code:

$cities = $wpdb->get_col("SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = 'my_cities_meta_key'" );

qui se traduit par ceci:

array(3) { [0]=> string(8) "Chicago" [1]=> string(8) "New York" [2]=> string(8) "New York" }

Ce n'est pas exactement ce dont j'ai besoin. Voyez comment la valeur de New York est répertoriée deux fois car il y a deux utilisateurs situés à New York? J'ai besoin d'un tableau qui liste chaque méta_value unique une fois. Comme ça:

$cities = array(New York, Chicago, Los Angeles);

Comment puis-je y arriver?

1
LBF

Vous devez juste ajouter une DISTINCT à votre requête SQL, quelque chose comme:

$cities = $wpdb->get_col("SELECT DISTINCT(meta_value) FROM $wpdb->usermeta WHERE meta_key = 'my_cities_meta_key'" );

Alternativement, si vous voulez le faire avec php pour une raison quelconque (si vous voulez savoir qu'une ville est listée deux fois avant d'afficher uniquement des entrées uniques)

$cities = $wpdb->get_col("SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = 'my_cities_meta_key'" );
$cities = array_keys(array_flip($cities));

Si vous souhaitez filtrer en fonction du rôle utilisateur à l'aide de SQL uniquement, cela devrait fonctionner, même si c'est un peu compliqué, car WP stocke les rôles d'utilisateur dans un tableau sérialisé:

$cities = $wpdb->get_col("SELECT Distinct(c.meta_value) 
    FROM $wpdb->usermeta AS r 
    INNER JOIN $wpdb->usermeta AS c
      ON r.user_id = c.user_id
    WHERE r.meta_value LIKE '%subscriber%'
    AND c.meta_key = 'my_cities_meta_key'");

Pour ajouter des filtres basés sur plusieurs clés méta, faites plus de INNER JOIN, par exemple. pour votre région metakey:

$cities = $wpdb->get_col("SELECT Distinct(c.meta_value) 
    FROM $wpdb->usermeta AS r 
    INNER JOIN $wpdb->usermeta AS c
      ON r.user_id = c.user_id
    INNER JOIN $wpdb->usermeta AS re
      ON r.user_id = re.user_id
    WHERE r.meta_value LIKE '%subscriber%'
    AND c.meta_key = 'my_cities_meta_key'
    AND re.meta_key = 'region'");
1
TheGentleman