2016-09-06 2 views
0

Как я могу получить всех пользователей, у которых есть 2 настраиваемых мета поля meta_1 и meta_2 равной ценности?Wordpress запрос для пользователей, у которых есть 2 равных meta

Например:

// This user will be in the result 
User 1: 
meta_key : meta_1, meta_value: 6 
meta_key : meta_2, meta_value: 6 

// This user will also be in the result 
User 2: 
meta_key : meta_1, meta_value: 9001 
meta_key : meta_2, meta_value: 9001 

// This user will NOT be in the result 
User 3: 
meta_key : meta_1, meta_value: 25 
meta_key : meta_2, meta_value: 6 

// This user will NOT be in the result 
User 4: 
meta_key : meta_1, meta_value: 9001 
// (this user does not have meta_2) 
+1

Чтобы быть уверенным, что пользователь должен иметь результат meta_1 = 123 и meta_2 = 123 (ничего, кроме _6_) или нет? –

+0

Да, они будут в результате, если значения их meta_1 и meta_2 равны :) – AVAVT

ответ

1

Как я хотел бы сделать это:

добавить дополнительный аргумент WP_Query:

$args = array(
'equal_meta' => array('meta_1', 'meta_2') 
); 
$query = new WP_Query($query_args); 

и создать join filter для него:

function my_posts_join($join, $query) { 

    if(_some_security_checks_if_needed) { 
     $rule = $query->get('equal_meta', array()); 
     if(!empty($rule) { 
      ... write custom INNER JOIN using data from $rule 
      $join .= $customJoin 
     } 
    } 
    return $join; 
} 

я думаю, что соединение является лучшим способом, но может быть лучше ... Я не SQL гуру;)

И конечно же «привязать» этот фильтр:

add_filter('posts_join', 'my_posts_join'); 
$query = new WP_Query($query_args); 
remove_filter('posts_join', 'my_posts_join'); 

Если у вас хочу этот фильтр будет применяться ко всем WP_Query, а не одной конкретной, то вы должны «привязать» его где-то за пределами функции, лучшая практика, чтобы добавить его до/после функции, которую он называет:

add_filter('posts_join', 'my_posts_join'); 
function my_posts_join($join, $query) { ... } 

Тогда вам не нужно его удалять.

[ДОБАВЛЕНО SQL]

Простейшая SQL-запрос я мог думать:

select wu.* from wp_users wu 
-- two joins ensure we get only users with existing both meta values 
inner join wp_usermeta wm1 on wm1.user_id = wu.ID and wm1.meta_key = 'meta_1' 
inner join wp_usermeta wm2 on wm2.user_id = wu.ID and wm2.meta_key = 'meta_2' 
-- now we filter only those with the same meta 
where wm1.meta_value = wm2.meta_value; 

Это показывает нам потребуется два фильтра: posts_join и posts_where. Надеюсь, вам удастся создать их обоих на основе моего ответа.

$ customJoin должен выглядеть следующим образом (псевдокод):

inner join wp_usermeta wm1 on wm1.user_id = wu.ID and wm1.meta_key = $rule[0] 
inner join wp_usermeta wm2 on wm2.user_id = wu.ID and wm2.meta_key = $rule[1] 

$ customWhere:

AND wm1.meta_value = wm2.meta_value 

Пожалуйста, обратите внимание, что в где есть и, так как $, где (функция в первый аргумент) будет фактически включать начало.

Вы также должны добавить пустое пространство в начале строки пользовательского запроса, иначе они могут привести к недействительному SQL.

+0

Спасибо за ваш ответ @ m.cichacz. Это очень помогло бы, если бы вы могли провести меня через процесс query & SQL, так как я почти ничего не знаю о них. У меня есть парень-db, который обычно помогает мне с запросом, но он не здесь сегодня, чтобы спросить. – AVAVT

+0

Я добавил образец SQL. Попробуйте и дайте мне знать, если это сработает :) –

+0

Да, теперь это работает! Я должен был изменить точный запрос немного здесь и там, но он работает, как я хочу, благодаря большому количеству m.cichacz! : D – AVAVT

Смежные вопросы