How to sort the query_posts function by custom field, and restrict messages to another custom field

I request a series of posts in WP with the following function:

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

This part is working fine. This basically pulled all my real estate posts, but only returned results having an available time of “30 days” or less.

I need this to also order messages in ascending order from low to high, using data from another custom “Price” field.

Whenever I add a standard 'orderby' => 'meta_value', 'meta_key' => 'Price', it no longer shows results within 30 days.

Is there a way to combine these two? And is it possible to add a button that re-launches the request and sorts by price, bedroom, etc.? Or is it too specific for WP?

+1
2

, , . 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, - test.php, , , URL-, http://example.com/test.php.

, .

-Mike

P.S. , WordPress Answers, StackOverflow, WordPress, . , , WordPress Answers. , WordPress ?

+4

'orderby' => 'meta_value' meta_key, meta_key , , . meta_key , . , , .

, , . , .

UPDATE

PHP.

, , , , add_filter('posts_where', ...); http://codex.wordpress.org/Function_Reference/query_posts

0

All Articles