Cum se interoghează mai multe valori pentru aceeași cheie meta?

27 ian. 2012, 05:44:36
Vizualizări: 105K
Voturi: 26

Cum să interogăm mai multe valori meta pentru aceeași cheie

$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'
            // de ce nu funcționează acest lucru?
            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
                ";

următorul cod

<?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
// acest array nu returnează nimic pentru ambele array-uri
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query  = new WP_Query( $args );
 ?>

                <?php /* Începe Loop-ul */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

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

                <?php endwhile; ?>
0
Toate răspunsurile la întrebare 4
2
34

Am impresia că există o confuzie între ȘI/SAU aici.

Interogările din postarea originală vor returna doar articolele care au atât key1 = 'value1' CÂT ȘI key2 = 'value2'. Cele mai multe plugin-uri WordPress (din câte știu eu, oricum) nu stochează valori multiple în postmeta, pentru același articol, folosind aceeași cheie.

Dacă ceea ce doriți este de fapt un SAU (doriți să obțineți articolele unde key1 = 'value1', precum și articolele unde key1 = 'value2'), atunci consultați răspunsul lui @WhiskerSandwich, folosind 'IN' și un array de valori pentru parametrul value.

Alternativ, puteți furniza un parametru relation pentru `meta_query':

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

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

Rețineți că utilizarea OR ca relație pentru interogări multiple de meta folosind aceeași cheie este echivalentul funcțional al utilizării IN și a unui array de valori pentru una singură.

13 mar. 2012 21:07:10
Comentarii

Mulțumesc pentru asta, Boone. Nu știam că există parametrul "relation". M-a ajutat mult.

MathSmath MathSmath
22 mar. 2012 00:37:45

Această soluție funcționează dacă ai doar o singură cheie de căutare. Dacă ai două sau mai multe, poate fi necesar să folosești 'AND' pentru a le combina în parametrul relationship, caz în care răspunsul lui @WhiskerSandwich de mai jos este mai potrivit.

SinisterBeard SinisterBeard
21 apr. 2015 14:58:54
0
15

Am avut aceeași problemă în care trecerea mai multor array-uri pentru aceeași cheie nu funcționa. În schimb, folosește un singur array, setează 'value' la un array de valori și setează 'compare' la IN:

<?php

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

?>
13 mar. 2012 20:48:28
2

Trebuie să folosești un alias pentru tabela postmeta pentru a doua valoare:

$querystr = "  
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
        AND $wpdb->posts.ID = $wpdp->mt1.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
            ";

Începând cu versiunea 3.1, poți face acest lucru și folosind un meta_query:

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );
27 ian. 2012 06:36:28
Comentarii

Salut Milo, mulțumesc pentru răspuns. Interogarea SQL nu returnează nicio valoare. Și array-ul nu returnează nicio valoare decât dacă elimin al doilea key și valoarea din array. Deci este o eroare aici?

steen steen
27 ian. 2012 07:48:35

@steen - Nu sunt sigur care este problema ta, am testat ambele metode și funcționează în instalarea mea de 3.3.1. Key-ul tău este literal 'key1' și valorile 'value1' și 'value2'? Nu vezi nimic dacă folosești print_r( $the_query ); imediat după interogare?

Milo Milo
27 ian. 2012 08:14:48
0

Cheia este key1 și valorile 'value1' și 'value2' am încercat atât text cât și numeric într-o instalație proaspătă cu twenty eleven. print_r( $the_query ); funcționează, ieșirea arată normal. Am încercat și key1 și key2, de asemenea nu funcționează. Funcționează imediat ce limitez la un singur array. Am verificat cu diferite browsere.

Aceasta însă funcționează.

    <?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'wtf',
            'value' => '1',
            'compare' => '>='
        ),
// acest array nu returnează nimic pentru ambele array-uri
        array(
            'key' => 'wtf',
            'value' => '2',
            'compare' => '<='
        )
    )
);
$the_query  = new WP_Query( $args );

 ?>
27 ian. 2012 12:59:37