Запросити декілька мета-ключових значень?


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 = 'value1' AND key2 = 'value2'. Більшість плагінів 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' => '='
        )
    )
);

Зауважте, що використання АБО як відношення для декількох мета-запитів, що використовують один і той же ключ, є функціональним еквівалентом використання INта масивом значень для одного.


Дякую за це, Бун. Я не знав, що існує парам "відношення". Допомогли мені.
MathSmath

Це працює, якщо у вас є лише одна клавіша для пошуку. Якщо у вас є дві або більше, вам може знадобитися використовувати "І", щоб об'єднати їх у параметрі співвідношення, і в цьому випадку відповідь @ WhiskerSandwich нижче є кращою.
SinisterBeard

14

У мене була така ж проблема, коли передача декількох масивів для одного ключа не працювала. Замість цього просто використовуйте один масив, встановіть "value" на масив значень і встановіть "порівняння" на IN:

<?php

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

?>

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 );

Привіт Міло, дякую за відповідь. SQL не повертає значення. І масив також не повертає значення, якщо я не видаляю 2-й ключ і значення з масиву. Так це помилка?
steen

@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 );

 ?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.