查询多个元键值?


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

Answers:


31

我觉得这里有一个AND / OR混乱。

在OP的查询将返回唯一具有职位为key1 =“值1” AND键2 =“值”。大多数WP插件(无论如何,我都知道)不会在postmeta中为同一帖子使用相同的键存储多个值。

如果您真正想要的是OR(要获取key1 ='value1'的帖子,以及key1 ='value2'的帖子),请使用@IN和值数组查看@WhiskerSandwich的答案用于value参数。

另外,您可以relation向`meta_query' 提供参数:

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

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

请注意,将OR用作使用同一键的多个元查询的关系,其功能等效于使用IN和单个值的数组。


谢谢你,布恩 我不知道存在“关系”参数。帮助我。
MathSmath 2012年

如果您只需要搜索一个键,则此方法有效。如果您有两个或两个以上,则可能需要在关系参数中使用“ AND”将它们组合起来,在这种情况下,@ WhiskerSandwich的以下答案更合适。
SinisterBeard 2015年

14

我遇到了相同的问题,即无法为同一键传递多个数组。相反,仅使用一个数组,将“值”设置为值数组,并将“比较”设置为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 );

您好Milo感谢您的回答。SQL不返回任何值。除非我从数组中删除第二个键和值,否则数组也不会返回任何值。那么,这有问题吗?
2012年

@steen-我不确定您的问题是什么,我已经测试了这两种方法,并且它们在我的3.3.1安装中都有效。您的键字面意义上是'key1'和值'value1'和'value2'吗?如果print_r( $the_query );查询后立即看到,您什么都看不到?
米洛(Milo)2012年

0

密钥是key1,值“ value1”和“ value2”在新安装的21中尝试了文本和数字。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 );

 ?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.