POSTS_WHERE失败,查询中有多个自定义字段

时间:2013-08-24 作者:edt

单独查询这两个字段中的任何一个都会得到预期的结果(显示帖子)。

但是,当这两个字段都包含在查询中时(例如下面的示例中显示的“foo”和“bar”),则不会显示帖子。

function do_stuff( ) {
    global $wpdb;
    return "
    AND ($wpdb->postmeta.meta_key = \'foo\' 
    AND $wpdb->postmeta.meta_value = \'1\') 
    AND ($wpdb->postmeta.meta_key = \'bar\' 
    AND $wpdb->postmeta.meta_value = \'1\')";
}

add_filter( \'posts_where\', \'do_stuff\' );
以下是WP\\U查询的打印:

[query] => Array
    (
        [post_type] => testPostType
        [pagination] => 1
        [posts_per_page] => 10
        [paged] => 1
    )

[request] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id  WHERE 1=1 
AND (wp_postmeta.meta_key = \'foo\'
AND wp_postmeta.meta_value = \'1\')
AND (wp_postmeta.meta_key = \'bar\'
AND wp_postmeta.meta_value = \'1\')  ORDER BY wp_posts.post_date DESC LIMIT 0, 10
[posts] => Array
    (
    )
()

我是否在sql中犯了逻辑错误?如何才能使帖子按预期显示?

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

考虑一下你的问题。你在问这个$wpdb->postmeta.meta_keyboth “foo”和“bar”。这永远不会发生。如果您在可以读取MySQL调试数据的上下文中运行它(PhpMyAdmin的SQL 控制台将执行此操作)您可能会看到关于“不可能的where子句”的警告。你需要JOIN 在post meta表中查找其中一个值,但据我所知WP_Query 我也会这样做。

$args = array(
  \'post_type\' => \'post\',
  \'meta_query\' => array(
    array(
      \'key\' => \'foo\',
      \'value\' => \'1\',
    ),
    array(
      \'key\' => \'bar\',
      \'value\' => \'1\',
    )
  )
);
$query = new WP_Query( $args );
如果查看该查询的SQL--var_dump($qry->request);-- 您将看到JOIN 我说的是。

打开过滤器也可以执行相同的操作pre_get_posts.

function set_post_meta_wpse_111456($qry) {
  $qry->set(
    \'meta_query\',
    array(
      array(
        \'key\' => \'foo\',
        \'value\' => \'1\',
     ),
     array(
       \'key\' => \'bar\',
       \'value\' => \'1\',
     )
  );
}
add_action(\'pre_get_posts\',\'set_post_meta_wpse_111456\');
WARNING: 如上所述,这将影响站点上的每个查询,因此您确实需要添加条件来限制查询的运行位置。

结束