Запросить несколько значений мета-ключей?

22

Как запросить несколько значений мета-ключа с одним и тем же ключом

$querystr = "  
            SELECT $wpdb->posts.* 
            FROM $wpdb->posts, $wpdb->postmeta
            WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

            AND $wpdb->postmeta.meta_key = 'key1'   
            AND $wpdb->postmeta.meta_value = 'value1'
            // why doesn't this work?
            AND $wpdb->postmeta.meta_value = 'value2'

            AND $wpdb->posts.post_status = 'publish' 
            AND $wpdb->posts.post_type = 'post'
            ORDER BY $wpdb->posts.post_date DESC
                ";

следующий код

<?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query  = new WP_Query( $args );
 ?>

                <?php /* Start the Loop */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

                    <?php get_template_part( 'content', get_post_format() ); ?>

                <?php endwhile; ?>
Стин
источник

Ответы:

31

Я чувствую, что здесь происходит путаница И / ИЛИ.

Запросы в ОП будет возвращать только сообщения , которые имеют как key1 = «значение1» И key2 = «значение2». Большинство плагинов WP (о которых я знаю в любом случае) не хранят несколько значений в postmeta для одного и того же сообщения, используя один и тот же ключ.

Если то, что вы хотите, - это действительно ИЛИ (вы хотите получить сообщения, где key1 = 'value1', а также сообщения, где key1 = 'value2'), тогда посмотрите ответ @ WhiskerSandwich, используя 'IN' и массив значений для параметра значения.

В качестве альтернативы, вы можете предоставить relationпараметр для meta_query:

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),

        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);

Обратите внимание, что использование OR в качестве отношения для нескольких мета-запросов с использованием одного и того же ключа является функциональным эквивалентом использования INи массива значений для одного.

Boone Gorges
источник
Спасибо за это, Бун. Я не знал, что параметр "отношение" существует. Выручил меня.
MathSmath
Это работает, если у вас есть только один ключ для поиска. Если у вас есть два или более, вам может понадобиться использовать «И», чтобы объединить их в параметре отношения, и в этом случае ответ @ WhiskerSandwich ниже является лучшим.
SinisterBeard
14

У меня была та же проблема, когда не работала передача нескольких массивов для одного и того же ключа. Вместо этого просто используйте один массив, установите «значение» в массив значений и установите «сравнить» с IN:

<?php

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => array('value1', 'value2'),
            'compare' => 'IN'
        ),
    )
);
$query = new WP_Query( $args );

?>
WhiskerSandwich
источник
1

Вы должны создать псевдоним таблицы postmeta для второго значения:

$querystr = "  
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

        AND $wpdb->postmeta.meta_key = 'key1'   
        AND $wpdb->postmeta.meta_value = 'value1'
        AND mt1.meta_key = 'key1'
        AND mt1.meta_value = 'value2'

        AND $wpdb->posts.post_status = 'publish' 
        AND $wpdb->posts.post_type = 'post'
        ORDER BY $wpdb->posts.post_date DESC
            ";

Вы также можете сделать это сейчас с версии 3.1 с meta_query:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
Milo
источник
Привет, Майло, спасибо за ответ. SQL не возвращает значения. И массив также не возвращает значения, если я не удаляю второй ключ и значение из массива. Так это прослушивается?
Стин
@steen - я не уверен, в чем ваша проблема, я протестировал оба метода, и они работают в моей установке 3.3.1. Ваш ключ буквально 'key1' и значения 'value1' и 'value2'? Вы ничего не видите, если вы print_r( $the_query );сразу после запроса?
Мило
0

Ключ - это ключ key1, а значения 'value1' и 'value2' пробовали его как в текстовом, так и в числовом виде в новой установке с двадцать одиннадцатью. print_r ($ the_query); работает вывод выглядит нормально. Также пробовал key1 и key2 тоже не работает. Это работает, как только я ограничиваю его одним массивом. Проверено разными браузерами.

Это, однако, работает.

    <?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'wtf',
            'value' => '1',
            'compare' => '>='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'wtf',
            'value' => '2',
            'compare' => '<='
        )
    )
);
$the_query  = new WP_Query( $args );

 ?>
Стин
источник