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.