使用META_QUERY,我如何按一个定制字段过滤并按另一个字段排序?

时间:2011-06-17 作者:user6254

使用以下代码(在functions.php中),我的帖子(CPT事件)按\\u end\\u日期而不是\\u start\\u日期排序。对于WP 3.1.3,正确的解决方案是什么?当然,我希望避免使用不推荐的meta_key.

add_filter( \'pre_get_posts\', \'my_get_posts\' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( \'post_type\', \'event\' );
  $query->set( \'meta_key\', \'_start_date\' );
  $query->set( \'orderby\', \'meta_value_num\' );
  $query->set( \'order\', \'ASC\' );
  $query->set( \'meta_query\', array(
                                   array(
                                         \'key\' => \'_end_date\',
                                         \'value\' => time(),
                                         \'compare\' => \'>=\',
                                         \'type\' => \'numeric\'
                                        )
                                   )
                              );
  }
  return $query;
}

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

这似乎是Wordpress中的一个bug。如果将orderby和meta\\u key指定为查询变量,Wordpress实际上会修改meta\\u查询。通常,此修改会将新的meta\\u键添加为meta\\u查询数组中的第一个数组,因此orderby将应用于meta\\u查询中指定的第一个meta键。

但是,当您在pre\\u get\\u posts过滤器中修改orderby、meta\\u key和meta\\u value query\\u vars时,由于Wordpress中的(在我看来)错误,它会在现有的元查询中添加新数组,但新数组不会作为第一个数组插入,而是附加到现有的元查询中。orderby总是应用于meta\\u查询中的第一个meta\\u键。

因此,在修复错误之前,可以在meta\\u查询中再次指定meta\\u键作为第一个数组,如下例所示:

add_filter( \'pre_get_posts\', \'my_get_posts\' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( \'post_type\', \'event\' );
  $query->set( \'meta_key\', \'_start_date\' );
  $query->set( \'orderby\', \'meta_value_num\' );
  $query->set( \'order\', \'ASC\' );
  $query->set( \'meta_query\', array(
        array(
              \'key\' => \'_start_date\'
        ),
        array(
              \'key\' => \'_end_date\',
              \'value\' => time(),
              \'compare\' => \'>=\',
              \'type\' => \'numeric\'
        )
  ));
  }
  return $query;
}

结束

相关推荐

Sort admin menu items

关于“的相关注释”Changing the Order of Admin Menu Sections?“,我正在寻找一种按字母顺序对WordPress管理区域的每个子部分中的条目进行排序的方法。目前,每当添加新插件时,其条目都会出现在“设置/工具/插件”下看似随机的位置,通常很难找到新的菜单项。(我已经有很多插件了,所以我的菜单很满。)由于我相当经常地添加和删除插件,所以我宁愿不需要不断进入设置页面来获取菜单排序插件并调整顺序。抱歉问了这么长的问题;我只是想弄清楚我在找什么。示例代替: S