1

我正在使用以下功能查询 WP 中的一系列帖子:

<?php 
$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts( array( 
    'post_type' => array('post', 'real-estate'), 
    'meta_key' => 'Time          Available', 
    'meta_compare' => '<=', 
    'meta_value' => $thirtydays, 
    'paged' => $paged )); 
?>

这部分工作正常。它基本上是在撤消我所有的房地产帖子,但只返回“可用时间”为 30 天或更短的结果。

我还需要使用另一个自定义字段“价格”中的数据以从低到高的升序对帖子进行排序。

每当我添加标准'orderby' => 'meta_value', 'meta_key' => 'Price'时,它不再在 30 天内显示结果。

有什么办法可以将这两者结合起来吗?是否可以添加一个重新运行查询并按价格、卧室等排序的按钮?还是这对 WP 来说太具体了?

4

2 回答 2

4

我相信这会提供你想要的。这是一个PostsOrderedByMetaQuery扩展WP_Query并接受新参数'orderby_meta_key'和 ' 的类orderby_order'

class PostsOrderedByMetaQuery extends WP_Query {
  var $posts_ordered_by_meta = true;
  var $orderby_order = 'ASC';
  var $orderby_meta_key;
  function __construct($args=array()) {
    add_filter('posts_join',array(&$this,'posts_join'),10,2);
    add_filter('posts_orderby',array(&$this,'posts_orderby'),10,2);
    $this->posts_ordered_by_meta = true;
    $this->orderby_meta_key = $args['orderby_meta_key'];
    unset($args['orderby_meta_key']);
    if (!empty($args['orderby_order'])) {
      $this->orderby_order = $args['orderby_order'];
      unset($args['orderby_order']);
    }
    parent::query($args);
  }
  function posts_join($join,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $join .=<<<SQL
INNER JOIN {$wpdb->postmeta} postmeta_price ON postmeta_price.post_id={$wpdb->posts}.ID
       AND postmeta_price.meta_key='{$this->orderby_meta_key}'
SQL;
    }
    return $join;
  }
  function posts_orderby($orderby,$query) {
    if (isset($query->posts_ordered_by_meta)) {
      global $wpdb;
      $orderby = "postmeta_price.meta_value {$this->orderby_order}";
    }
    return $orderby;
  }
}

你可以这样称呼它:

$thirtydays = date('Y/m/d', strtotime('+30 days'));
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query = new PostsOrderedByMetaQuery(array(
  'post_type' => array('post', 'real-estate'),
  'meta_key' => 'Time Available',
  'meta_compare' => '<=',
  'meta_value' => $thirtydays,
  'paged' => $paged,
  'orderby_meta_key' => 'Price',
  'orderby_order'    => 'DESC',
));
foreach($query->posts as $post) {
  echo " {$post->post_title}\n";
}

您可以将该类复制PostsOrderedByMetaQuery到您的主题functions.php文件中,或者您可以在.php您可能正在编写的插件的文件中使用它。

如果您想快速测试它,我已将代码的自包含版本发布到 Gist,您可以将其下载并复制到您的 Web 服务器的根目录test.php,根据您的用例进行修改,然后使用类似的 URL 从浏览器请求http://example.com/test.php.

希望这可以帮助。

-麦克风

PS 这个答案与我刚刚在 WordPress Answers 给出的答案非常相似,这是 StackOverflow 的姊妹网站,每天都有很多像我这样的 WordPress 爱好者回答问题。您可能也希望看到该答案,因为它有更多解释,并且您可能希望看到WordPress Answers。希望您将来也会考虑在那里发布您的 WordPress 问题?

于 2010-11-06T09:11:25.207 回答
0

因为'orderby' => 'meta_value'requires meta_key,并且 yourmeta_key已经用于比较,所以我认为您不能这样做。meta_key只接受一个值,而不是一个选项数组。这绝对是一个限制,如果您没有找到解决方案,我鼓励您提出请求。

至于重新运行查询的按钮,您可以简单地重新加载页面并传递查询变量来更改排序。不幸的是,您仍然必须解决问题的第一部分。

更新

您始终可以使用 PHP 自己对返回的数组进行排序。

此外,不确定您正在检查的可用时间,但您可以注册一个过滤器,可以帮助您进一步自定义查询add_filter('posts_where', ...); http://codex.wordpress.org/Function_Reference/query_posts

于 2010-11-06T00:51:02.930 回答