Intereting Posts
Добавить раздел в пользовательскую панель меню Какие-либо побочные эффекты добавления apply_filters в функцию? Должна ли быть косая черта в постоянной ссылке? Как можно использовать переменную в качестве имени функции обратного вызова для add_settings_field Как разрешить только админы или войти в систему? Пользователи могут размещать ссылки в комментариях? API настроек хранит сериализованные данные в базе данных («Правильный путь») отображение цикла foreach ниже содержания Какой файл / шаблон отвечает за таксономии для пользовательских типов сообщений? Как получить идентификатор автора при просмотре страницы автора? Не дублируйте сообщения с несколькими категориями в нескольких циклах Проверка категории WordPress WordPress вставляет изображения в сообщение как HTTP, а не HTTPS Какая функция вызывается после обновления любого поля пользователя из любого места сайта Рекомендуемый метод обновления / добавления меню при добавлении новой темы Как перечислить события по категориям и месяцам с помощью плагина Event Organizer?

Разбиение страницы разбивается при объединении результатов поиска с дополнительным WP_Query

На странице результатов поиска ( search.php ) я хотел бы выполнить дополнительный WP_Query чтобы сохранить определенный порядок типов результатов поиска, например, результаты поиска у авторов всегда должны отображаться перед другими результатами –

Первые несколько страниц должны содержать результаты работы автора, остальные результаты должны отображаться только на всех следующих страницах (на каждой странице они не смешиваются).

 global $wp_query; //holds the results of the initial search query $authorposts = $wp_query->posts; $query = new WP_Query( 'year=2012&monthnum=12&day=12' ); $otherposts = $query->posts; $wp_query->posts = array_merge( $authorposts, $otherposts ); $wp_query->post_count = count( $wp_query->posts ); if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> //show results loop... 

Проблемы возникают из-за поведения разбивки на страницы, в то время как $authorposts кажутся правильными, т. $authorposts Правильные номера страниц для сообщений автора, а страницы – только те, где они существуют. Но $otherposts с другой стороны, показаны внизу каждой страницы, прямо под сообщениями автора. И они одинаковы на каждой странице! Также количество страниц отражает только счет первого запроса.

Я также попытался объединиться с оператором plus :

 $wp_query->posts = $authorposts + $otherposts; 

но в этом случае $otherposts вообще не отображаются, и количество страниц остается одинаковым (количество страниц для сообщений автора).

Все примеры с похожими целями с использованием двух отдельных запросов, которые я видел, выглядели совершенно одинаково –

Поэтому мне интересно, достаточен ли мой способ продления исходных результатов поискового запроса с помощью этого дополнительного WP_Query или если мне не хватает полей $wp_query которые будут заполнены (правильно)? Каков правильный способ сделать это?

Обновление. Следует отметить, что я использую плагин WP-PageNavi для разбивки на страницы, но это не должно быть релевантным в первую очередь, поскольку первая страница уже ошибочна. И он также инициализируется объектом запроса: wp_pagenavi( array( 'query' => $wp_query ));

Solutions Collecting From Web of "Разбиение страницы разбивается при объединении результатов поиска с дополнительным WP_Query"

Я думаю, что единственным решением является пропустить разбиение на страницы sql и обработать его только через php. Моя идея включает в себя 2 функции, одну pre_get_posts с pre_get_posts , вторую для фильтрации the_posts .

Первая функция делает 2 вещи:

  1. отмените вычисленное значение для поиска, таким образом, все сообщения возвращаются из SQL-запроса.
  2. сохранить запрошенное paged значение в глобальной переменной, таким образом, можно использовать во второй функции, которая запускается позже

Здесь функция:

 function filter_my_search_query( $query ) { if ( is_search() && $query->is_main_query() && ! is_admin() ) { global $the_original_paged; $the_original_paged = $query->get('paged') ? $query->get('paged') : 1; $query->set('paged', NULL ); $query->set('nopaging', TRUE ); } } add_action('pre_get_posts', 'filter_my_search_query', 1); 

Теперь поисковый запрос возвращает все сообщения, без разбивки на страницы, и требуемый $the_original_paged сохраняется в глобальной переменной $the_original_paged .

Таким образом, мы можем фильтровать the_posts объединяющие требуемые дополнительные сообщения, а затем получать только правильные сообщения на основе требуемой страницы и сообщений на странице, и, наконец, сбросить $wp_query и другие свойства $wp_query чтобы использовать ссылку для разбивки на страницы:

 function add_posts_to_search_query( $posts ) { global $wp_query, $the_original_paged; if ( ! is_main_query() || is_admin() || ! is_search() || is_null($the_original_paged) ) return $posts; // the wanted posts per page here setted on general settings $perpage = get_option('posts_per_page'); remove_filter( 'the_posts', 'add_posts_to_search_query' ); $new = new WP_Query( 'year=2012&monthnum=12&day=12&nopaging=1' ); $merged = array_merge( $posts, $new->posts ); $wp_query->found_posts += $new->found_posts; // getting the right posts based on current page and posts per page $wp_query->posts = array_slice($merged, ( $perpage * ($the_original_paged-1) ), $perpage ); // set the paged and other wp_query properties to the right value, to make pagination work $wp_query->set('paged', $the_original_paged); $wp_query->post_count = count($wp_query->posts); $wp_query->max_num_pages = ceil( $wp_query->found_posts / $perpage ); unset($the_original_paged); // clean up global variable return $wp_query->posts; } add_filter('the_posts', 'add_posts_to_search_query'); с function add_posts_to_search_query( $posts ) { global $wp_query, $the_original_paged; if ( ! is_main_query() || is_admin() || ! is_search() || is_null($the_original_paged) ) return $posts; // the wanted posts per page here setted on general settings $perpage = get_option('posts_per_page'); remove_filter( 'the_posts', 'add_posts_to_search_query' ); $new = new WP_Query( 'year=2012&monthnum=12&day=12&nopaging=1' ); $merged = array_merge( $posts, $new->posts ); $wp_query->found_posts += $new->found_posts; // getting the right posts based on current page and posts per page $wp_query->posts = array_slice($merged, ( $perpage * ($the_original_paged-1) ), $perpage ); // set the paged and other wp_query properties to the right value, to make pagination work $wp_query->set('paged', $the_original_paged); $wp_query->post_count = count($wp_query->posts); $wp_query->max_num_pages = ceil( $wp_query->found_posts / $perpage ); unset($the_original_paged); // clean up global variable return $wp_query->posts; } add_filter('the_posts', 'add_posts_to_search_query'); 

Отфильтруйте основной запрос, чтобы включить дополнительные сообщения. Вы можете добавить параметры запроса с помощью pre_get_posts или изменить SQL с помощью posts_request или posts_where .

Отфильтруйте posts_results или the_posts чтобы упорядочить возвращаемые сообщения.

 function filter_posts_where($where) { $where .= 'OR …' /* post_date is 2012-12-12 */; return $where; } function filter_the_posts($posts) { usort($posts, 'compare_posts'); return $posts; } function compare_posts($a, $b) { // compare "author" and dates? if /* … */ return 1; elseif /* … */ return -1; else return 0; } 

Я не мог полностью решить все проблемы, связанные с этим вопросом, но для ссылки я размещаю текущее состояние здесь:

 function SQ_the_posts($posts, $q = false) { if( is_search() && is_main_query() ){ global $wp_query; $authorposts = $wp_query->posts; $paged = get_query_var('paged'); remove_filter( 'the_posts', 'SQ_the_posts' ); $query = new WP_Query( 'year=2012&monthnum=12&day=12' ); add_filter( 'the_posts', 'SQ_the_posts' ); $otherposts = $query->posts; $mergedPosts = array_merge( $authorposts, $otherposts ); $wp_query->found_posts += $query->found_posts; $initialMaxNumPages = $wp_query->max_num_pages; if ($paged > $initialMaxNumPages) { $wp_query->posts = $otherposts; $wp_query->post_count = $query->post_count; $posts = $otherposts; } $wp_query->max_num_pages = ($wp_query->found_posts > 0) ? $wp_query->found_posts / 10 : 0; $wp_query->max_num_pages += ($wp_query->found_posts % 10) ? 1 : 0; } return $posts; } add_filter( 'the_posts', 'SQ_the_posts' ); 

Что оно делает:

  • Запросы автора и других сообщений
  • Вычисляет правильное количество страниц для обоих запросов
  • Выдает первые десять элементов второго запроса, когда max_num_pages первого запроса превышено

Что не работает:

  • Если, например, первый запрос (поисковый запрос автора) приводит к 9 страницам, а второй запрос возвращает 5 страниц, нумерация страниц отображается правильно 14 страниц. Но когда я нажимаю на странице 10, отображается страница «Страница 10 из 5», потому что 9 страниц первого запроса больше не доступны на этой странице. Есть ли способ исправить это?
  • Второй запрос необходимо улучшить, чтобы текущая страница переводилась на правильный эквалайзер подкачки, например, страница 10 для общего количества запросов означает пошаговый параметр «1» для второго запроса.

Тем не менее я удивлен, что нет простого подхода. Если кто-то сможет решить эти вопросы на основе моего ответа (copy + paste), я был бы рад отметить его как принятый!