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?
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'");