Получите массив мета-значений для пользовательского мета-ключа
Мне нужно получить массив всех мета_значений для пользовательского мета_ключа. Я нашел этот код:
$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);
Как мне этого добиться?
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'");