Порядок Wp_query по нескольким настраиваемым полям?

Я изучаю WP_query и недавно столкнулся с проблемой.

Мне нужно сделать запрос, когда я сначала фильтрую один или несколько настраиваемых полей, что отлично работает благодаря meta_query.

Тем не менее, мне также нужно его заказать несколькими настраиваемыми полями.

(Как и в sql, вы можете написать «ORDER BY field ASC, field2 DESC»)

Это то, что у меня есть до сих пор:

$args=array( 'post_type' => 'personer', 'meta_query' => array( array( 'key' => 'p_seller', 'value' => 'Y', 'compare' => '=' ) ), 'meta_key' => 'p_region', 'orderby' => 'meta_value', 'order' => 'ASC', 'post_status' => 'publish', 'posts_per_page' => 999, 'caller_get_posts'=> 1 ); 

Он возвращает строки с p_seller, установленными в Y, и порядок p_region. Я также хотел бы добавить второй заказ, который упорядочивает их по p_lastname после региона. Или еще лучше – p_region, p_lastname, p_firstname. Все по возрастанию, но мне бы хотелось узнать, как совместить ASC и DESC 🙂

Я сделал несколько поисковых запросов, но большинство людей, похоже, пишут о нескольких полях фильтрации, которые у меня есть. Или они занимают место в пользовательских SQL-запросах, на которые я надеюсь, что я смогу обойтись без этого? 🙂

Solutions Collecting From Web of "Порядок Wp_query по нескольким настраиваемым полям?"

 $qry_args = array( 'post_status' => 'publish', 'post_type' => 'event', // Post type 'posts_per_page' => -1, // ALL posts 'orderby' => 'meta_value', 'meta_key' => 'year', 'order' => 'DESC' ); add_filter( 'posts_orderby', 'filter_query' ); $all_posts = new WP_Query( $qry_args ); remove_filter( 'posts_orderby', 'filter_query' ); function filter_query( $query ) { $query .= ', post_modified DESC'; return $query; } 

Вот пример, который работает. Приведенный выше код заказывает все сообщения типа event: first DESCENDENT по году, второй DESCENDENT по дате изменения для сообщений с того же года.

без второго заказа они останутся заказанными ASCENDENT, если они будут в том же году.

ps year – это настраиваемое поле, добавленное мной к сообщениям типа «Событие»

Я уверен, что есть более элегантные решения, но это то, что я придумал, и это работает на данный момент …

 global $wpdb; $querystr = " SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->postmeta wpostmeta2, $wpdb->postmeta wpostmeta3 WHERE wposts.ID = wpostmeta.post_id AND wposts.ID = wpostmeta2.post_id AND wposts.ID = wpostmeta3.post_id AND wpostmeta.meta_key = 'p_seller' AND wpostmeta2.meta_key = 'p_role' AND wpostmeta3.meta_key = 'p_firstname' AND wpostmeta.meta_value = 'N' AND wposts.post_type = 'personer' AND wposts.post_status = 'publish' ORDER BY wpostmeta2.meta_value ASC, wpostmeta3.meta_value ASC "; $pageposts = $wpdb->get_results($querystr); if ($pageposts){ foreach ($pageposts as $post){ setup_postdata($post); // the_title() or whatever works here.. } } 

Вы должны настроить запрос через фильтр posts_orderby

В вашем шаблоне

 add_filter('posts_orderby', 'custom_orderby'); $query= new WP_Query($args); remove_filter('posts_orderby', 'custom_orderby'); 

В ваших functions.php

 function custom_orderby($orderby) { return "ORDER BY field ASC, field2 DESC"; }