WordPress PHP - Как отсортировать результаты по категориям / архивам по определенному значению «meta_key»? - PullRequest
2 голосов
/ 22 февраля 2011

Ранее я писал здесь: Как отсортировать по настраиваемому полю без создания новой страницы вручную?

Однако я считаю, что задал неправильный вопрос (и я могувсе еще задаю не тот вопрос).На самом деле думаю, что мне может понадобиться сложный запрос, который будет отображать сообщения, упорядоченные по мета-значению.На сайте используется тема под названием «AgentPress».Я считаю, что передача параметров через адресную строку может быть слишком упрощенной для того, что мне нужно.

Честно говоря, мне нравится, как отображаются страницы текущей категории (форматирование и т. Д.), Мне просто нужно «замкнуть» процесс, чтобы любая страница категории / архива сортировалась с помощью meta_key для свойства «цена "в отличие от даты входа.Если для этого есть простой, более «WordPress-й» механизм, я весь в ушах.Пожалуйста, укажите, где разместить код и т. Д.

К вашему сведению, на данный момент ясно, что передача "order = ASC" и "order = DESC" в URL работает.Однако, похоже, что ничего, что я делаю с «meta_key» или чем-то связанным, не имеет какого-либо эффекта.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 02 марта 2011

Вы можете добавить фильтр на pre_get_posts hook.

Введите этот код в functions.php (в вашей директории темы):

add_filter('pre_get_posts', 'pre_get_posts_hook' );

function pre_get_posts_hook($wp_query) {
    if (is_category() || is_archive())
    {
        $wp_query->set( 'orderby', 'meta_value_num' );
        $wp_query->set( 'meta_key', 'price' );
        $wp_query->set( 'order', 'ASC' );
        return $wp_query;
    }
}

Вы можете использовать meta_value вместоmeta_value_num (доступно с v2.8), но я предполагаю, что цена является числовым значением.

1 голос
/ 26 сентября 2014

Если вы обнаружите, что потеряли свое навигационное меню, я обновил ответ @ soju следующим образом:

add_filter('pre_get_posts', 'pre_get_posts_hook' );

function pre_get_posts_hook($wp_query) {
    if ( is_archive() && $wp_query->is_main_query() ) { //edited this line
        $wp_query->set( 'orderby', 'meta_value_num' );
        $wp_query->set( 'meta_key', 'price' );
        $wp_query->set( 'order', 'ASC' );
        return $wp_query;
    }
}

Тогда фильтр не повлияет на ваше навигационное меню

0 голосов
/ 25 февраля 2011

Я полагаю, что вы найдете эту функцию в классе 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 плагина, который вы пишете.

...