Получите массив мета-значений для пользовательского мета-ключа


Мне нужно получить массив всех мета_значений для пользовательского мета_ключа. Я нашел этот код:

$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" }

Это не совсем то, что мне нужно. Посмотрите, как значение в Нью-Йорке указано дважды, потому что в Нью-Йорке находятся два пользователя? Мне нужен массив, в котором однократно перечисляется каждое уникальное значение meta_value. Вот так:

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

Как мне этого добиться?

Author: LBF, 2015-04-14

1 answers

Вам просто нужно добавить DISTINCT в свой SQL-запрос, что-то вроде:

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

В качестве альтернативы, если вы по какой-то причине хотите сделать это с помощью php (если вы хотите знать, что город указан дважды, прежде чем отображать только уникальные записи)

$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
Author: TheGentleman, 2015-04-15 12:39:40