web-dev-qa-db-ja.com

ユーザーmeta_keyのmeta_valuesの配列を取得します

ユーザー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);

どうやってそれを達成できますか?

1
LBF

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