Как сортировать функцию «Query_posts» по пользовательскому полю, ограничивая сообщения другим пользовательским полем

StackOverflow https://stackoverflow.com/questions/4111255

  •  29-09-2019
  •  | 
  •  

Вопрос

Я запрашиваю серию постов в 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?

Это было полезно?

Решение

Я верю, что это даст вам нужен вам. Это класс называется 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.

Надеюсь это поможет.

-Майк

PS Этот ответ Очень похоже на ответ, который я только что дал в ответах на WordPress, который является сестринским участком Stackoverflow, где множество энтузиастов WordPress, как я отвечаю на вопросы ежедневно. Вы можете захотеть увидеть этот ответ тоже потому что у него есть более подробное объяснение, и потому что вы можете увидеть WordPress Ответы. Отказ Надеюсь, вы рассмотрите рассмотрение ваших вопросов WordPress там тоже в будущем?

Другие советы

Так как 'orderby' => 'meta_value' требует meta_key, и ваш meta_key уже используется для сравнения, я не думаю, что вы можете сделать это. meta_key принимает только одно значение, а не массив опций. Это определенно ограничение, и я рекомендую вам открыть запрос, если вы не найдете решение.

Что касается кнопки для повторного запуска запроса, вы можете просто перезагрузить страницу и передать переменную запроса, чтобы изменить сортировку. К сожалению, вам все еще нужно решить первую часть вашего вопроса.

ОБНОВИТЬ

Вы всегда можете отсортировать возвращенный массив, используя PHP.

Кроме того, не уверен, что вы проверяете со временем, но вы можете зарегистрировать фильтр, который может помочь вам настроить запрос немного дальше add_filter('posts_where', ...); http://codex.wordpress.org/function_reference/query_posts.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top