Zapytać o wiele wartości meta-kluczy?


22

Jak wyszukiwać różne wartości meta-klucza za pomocą tego samego klucza

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

następny kod

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

Odpowiedzi:


31

Mam wrażenie, że dzieje się tutaj zamieszanie AND / OR.

Zapytania w PO zwrócą tylko posty, które mają zarówno klucz1 = „wartość1” ORAZ klucz2 = „wartość2”. Większość wtyczek WP (o których wiem zresztą) nie przechowuje wielu wartości w postmeta, dla tego samego postu, używając tego samego klucza.

Jeśli naprawdę chcesz OR (chcesz uzyskać posty, w których klucz1 = „wartość1”, a także posty, w których klucz1 = „wartość2”), zobacz odpowiedź @ WhiskerSandwich, używając „IN” i tablicy wartości dla parametru wartości.

Alternatywnie możesz podać relationparametr do `meta_query ':

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

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

Zauważ, że użycie OR jako relacji dla wielu meta-zapytań przy użyciu tego samego klucza jest funkcjonalnym odpowiednikiem użycia INi tablicą wartości dla jednego.


Dzięki za to, Boone. Nie wiedziałem, że param „relacja” istnieje. Pomógł mi.
— MathSmath,

Działa to, jeśli masz tylko jeden klucz do wyszukiwania. Jeśli masz dwa lub więcej, może być konieczne użycie „AND”, aby połączyć je w parametrze relacji, w którym to przypadku odpowiedź @ WhiskerSandwich jest lepsza.
— SinisterBeard

14

Miałem ten sam problem, gdy przekazywanie wielu tablic dla tego samego klucza nie działało. Zamiast tego po prostu użyj jednej tablicy, ustaw „wartość” na tablicę wartości i ustaw „porównaj” na IN:

<?php

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

?>

1

Musisz dokonać aliasu tabeli postmeta dla drugiej wartości:

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

Możesz to zrobić teraz od wersji 3.1 z meta_query:

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

Cześć, Milo, dziękuję za odpowiedź. SQL nie zwraca żadnej wartości. A tablica nie zwraca również żadnej wartości, chyba że usunę drugi klucz i wartość z tablicy. Więc to jest popsute?
— steen

@steen - Nie jestem pewien, jaki jest twój problem, przetestowałem obie metody i działają one w mojej instalacji 3.3.1. Czy twój klucz dosłownie „klucz1” i wartości „wartość1” i „wartość2”? Czy nic nie widzisz, jeśli print_r( $the_query );natychmiast po zapytaniu?
— Milo

0

Klucz to klucz1, a wartości „wartość1” i „wartość2” wypróbowały zarówno tekst, jak i cyfrę w nowej instalacji z dwudziestoma jedenastoma. print_r ($ the_query); wyniki pracy wyglądają normalnie. Próbowałem także key1 i key2 również nie działa. Działa, gdy tylko ograniczę go do jednej tablicy. Sprawdzane w różnych przeglądarkach.

To jednak działa.

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

 ?>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.