Intereting Posts
Синтаксис highligting для настраиваемых полей Как добавить дату в панель навигации Следует ли избегать значения основных функций перед выводом? Как правильно включить файлы PHP в плагинах Получите имя описание категории ссылок Скрыть окно с пользовательским типом сообщения? 404 на всех страницах, но пользовательские типы сообщений работают нормально. Изменение нижнего колонтитула в зависимости от URL (сайт с языком поли) Сохраните исходное имя изображения при изменении размера Как я могу автоматически добавлять свои сообщения на страницу фан-сайта моего сайта? изменение шаблона и добавление к нему jQuery Обновления плагинов, зависимости версий и обратная совместимость Обновление состояния сообщения с использованием wp_update_post приводит к ошибке Преобразование настраиваемых полей для публикации категорий Add_meta_box не отображается, но отображается в параметрах экрана

Можете ли вы заказывать сообщения из wp_query двумя настраиваемыми мета-полями?

Я работаю над сайтом, в котором перечислены события. Сейчас этот запрос перечисляет события по дате:

$args = array( 'post_type' => 'espresso_event', 'post_status' => 'publish', 'posts_per_page' => 8, 'category_name' => 'homepage', 'meta_key' => 'event_start_date', 'meta_query' => array( array( 'key' => 'event_start_date', 'value' => date('Ym-d'), 'compare' => '>=', // compares the event_start_date against today's date so we only display events that haven't happened yet 'type' => 'DATE' ) ), 'orderby' => 'meta_value', 'order' => 'ASC' ); $temp = $wp_query; $wp_query = null; $wp_query = new WP_Query(); $wp_query->query($args); 

Тем не менее, некоторые события происходят в одну и ту же дату в разное время, и мне нужно, чтобы они заказывали сообщения сначала по дате, а затем по специальной метатеге event_start_time. Проблема в том, что я не понимаю, как это сделать. wp_query, похоже, не способна упорядочиваться двумя обычными мета.

Я могу это сделать?

Solutions Collecting From Web of "Можете ли вы заказывать сообщения из wp_query двумя настраиваемыми мета-полями?"

В чистом SQL вы можете использовать строки, разделенные запятыми, чтобы делать то, что вы хотите, то есть что-то вроде ORDER BY post_type,post_name,post_date . Однако WP_QUERY не позволит этому пропустить. Существует жесткий набор допустимых значений .

Я могу придумать пару способов сделать это.

Вы можете «проталкивать» запросы к WP_Query просто добавляя их в свои $args . Предостережение : я не знаю, является ли это предполагаемым поведением. Это может быть причуда в базе кода.

 $args = array( 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 8, 'orderby' => 'post_date,post_title', 'order' => 'ASC', 'myorderby' => 'post_date,post_name' ); $temp = $wp_query; $wp_query = null; $wp_query = new WP_Query(); $wp_query->query($args); while ($wp_query->have_posts()) { $wp_query->the_post(); echo $post->post_title.'<br/>'; } 

Добавить фильтр в posts_orderby

 function posts_odb_filter_wpse_96900($odb) { global $wp_query; $myodb = $wp_query->get('myorderby'); if (!empty($myodb)) { preg_match('/(ASC|DESC)$/',$odb,$dir); $odb = $myodb; if (!empty($dir[0])) { $odb .= ' '.$dir[0]; } } return $odb; } add_filter('posts_orderby','posts_odb_filter_wpse_96900'); 

… и вы можете заказать свое сердце.

(Возможно) более канонический способ сделать это – проверить вазы запросов или другую информацию и соответствующим образом изменить запрос.

 function posts_odb_filter_wpse_96900_v2($odb) { global $wp_query; if (is_front_page() && !is_main_query()) { // whatever conditions you need preg_match('/(ASC|DESC)$/',$odb,$dir); $odb .= ' post_date,post_name '.$dir[0]; } return $odb; } add_filter('posts_orderby','posts_odb_filter_wpse_96900_v2'); 

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