ユーザーmeta_keyのすべてのmeta_valueの配列を取得する必要があります。私はこのコードを見つけました:
$cities = $wpdb->get_col("SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = 'my_cities_meta_key'" );
これは次のようになります。
array(3) { [0]=> string(8) "Chicago" [1]=> string(8) "New York" [2]=> string(8) "New York" }
これはまさに私が必要としているものではありません。ニューヨークに2人のユーザーがいるため、ニューヨークの値が2回リストされていることを確認しますそれぞれ一意のmeta_valueを1回リストする配列が必要です。このような:
$cities = array(New York, Chicago, Los Angeles);
どうやってそれを達成できますか?
SQLクエリにDISTINCT
を追加するだけです。
$cities = $wpdb->get_col("SELECT DISTINCT(meta_value) FROM $wpdb->usermeta WHERE meta_key = 'my_cities_meta_key'" );
あるいは、何らかの理由でphpでそれを実行したい場合(固有のエントリのみを表示する前に都市が2回リストされていることを知りたい場合)
$cities = $wpdb->get_col("SELECT meta_value FROM $wpdb->usermeta WHERE meta_key = 'my_cities_meta_key'" );
$cities = array_keys(array_flip($cities));
SQLのみを使用してユーザーロールに基づいてフィルターをかけたい場合、これはうまくいくはずですが、WPはユーザーロールを直列化された配列に格納するため、少し厄介です。
$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'");
複数のメタキーに基づいてフィルタを追加するには、さらにINNER JOIN
を行います。あなたの地域のメタキーの場合:
$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'");