你能通过两个定制的元域从wp_Query中排序帖子吗?

时间:2013-04-23 作者:Bryan White

我正在一个列出事件的网站上工作。现在,此查询按日期列出事件:

$args = array(
                    \'post_type\' => \'espresso_event\',
                    \'post_status\' => \'publish\',
                    \'posts_per_page\' => 8,
                    \'category_name\' => \'homepage\',
                    \'meta_key\' => \'event_start_date\',
                    \'meta_query\' => array(
                        array(
                            \'key\' => \'event_start_date\',
                            \'value\' => date(\'Y-m-d\'),
                            \'compare\' => \'>=\', // compares the event_start_date against today\'s date so we only display events that haven\'t happened yet
                            \'type\' => \'DATE\'
                            )
                        ),
                    \'orderby\' => \'meta_value\',
                    \'order\' => \'ASC\'
                );

        $temp = $wp_query;
        $wp_query = null;
        $wp_query = new WP_Query();
        $wp_query->query($args);
但是,有些事件发生在同一日期的不同时间,我需要它先按日期排序,然后按名为event\\u start\\u time的自定义元排序。问题是,我不知道该怎么做。wp\\U查询似乎无法按两个自定义元排序。

这是我能做的吗?

1 个回复
SO网友:s_ha_dum

在纯SQL 您可以使用逗号分隔的字符串来执行所需的操作,即ORDER BY post_type,post_name,post_date. 然而WP_QUERY 不会允许这种事情发生。有一个rigid set of allowed values.

我可以想出几种方法来做到这一点。

您可以将查询变量“推”到WP_Query 只需将它们添加到$args. Caveat: I do not know if this is intended behavior. It may be a quirk in the code base.

$args = array(
  \'post_type\' => \'post\',
  \'post_status\' => \'publish\',
  \'posts_per_page\' => 8,
  \'orderby\' => \'post_date,post_title\',
  \'order\' => \'ASC\',
  \'myorderby\' => \'post_date,post_name\'
);

$temp = $wp_query;
$wp_query = null;
$wp_query = new WP_Query();
$wp_query->query($args);

while ($wp_query->have_posts()) {
  $wp_query->the_post();
  echo $post->post_title.\'<br/>\';
}
在上添加筛选器posts_orderby...

function posts_odb_filter_wpse_96900($odb) {
  global $wp_query;
  $myodb = $wp_query->get(\'myorderby\');
  if (!empty($myodb)) {
    preg_match(\'/(ASC|DESC)$/\',$odb,$dir);
    $odb = $myodb;
    if (!empty($dir[0])) {
      $odb .= \' \'.$dir[0];
    }
  }
  return $odb;
}
add_filter(\'posts_orderby\',\'posts_odb_filter_wpse_96900\');
。。。你可以随心所欲地点菜。

更规范的方法是检查查询变量或其他信息,并相应地修改查询。

function posts_odb_filter_wpse_96900_v2($odb) {
  global $wp_query;
  if (is_front_page() && !is_main_query()) { // whatever conditions you need
    preg_match(\'/(ASC|DESC)$/\',$odb,$dir);
    $odb .= \' post_date,post_name \'.$dir[0];
  }
  return $odb;
}
add_filter(\'posts_orderby\',\'posts_odb_filter_wpse_96900_v2\');
第二种方法的缺点是,必须为需要更改的每个查询创建一个过滤器。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post