Intereting Posts
Есть ли плагин wordpress, позволяющий окно поиска автозаполнения, а затем перейти на страницу? Редактирование ссылок в нижнем колонтитуле WordPress Темы с зашифрованным кодом Base64? Как я могу скрыть категорию от Contributors в окне редактирования / добавления нового сообщения? Как я могу изменить язык автоматических писем? Добавление определенной категории сообщений между сообщениями в цикле function_exists вызывает функцию function.php Получите количество сообщений в wp rest API v2 и получите все категории Невозможно выбрать месяц блога в категории архива HowTo: Добавить обертку в короткий заголовок столбцов? Удаление меню «Мои сайты» от администратора Переписать параметр числового идентификатора для иерархического пользовательского типа сообщения Измените конкретный запрос на WordPress Как удалить контекстную помощь по WP 3.3.2? Как добавить изображение из веб-ссылки? Настройка Php-сервера с помощью ISAP

Порядок 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"; }