Intereting Posts
является ли wpdb-> replace () уже дезинфицированным? Удаление ссылки «<a>» из меню «<li>» для некоторых «ссылок» без JS Ограничение вызова функции на загрузку страницы, но не вызов ajax запрос для использования для ссылки на единую страницу таксономии Могу ли я получить код WordPress внутри теста Selenium? Получить список ACF Repeater-Fields как массив Один блог внутри другого Сделать несколько страниц и установить шаблон / контент для активации темы? Как я могу остановить загрузчик WP media от создания дубликатов моих загруженных изображений? Как импортировать пользовательскую таблицу MySQL DB в тип пользовательских сообщений WordPress Удалить описание из <title> on Home Разрешить пользователю доступ только к панели мониторинга! Отдельный заголовок для статической страницы домашней страницы и сообщений Проблема с пользовательской таксономией и постоянной привязкой Перетаскивание изображений с заголовком в редакторе WP

Как я могу заставить свой пользовательский запрос работать с результатами поиска после первой страницы?

Я использую пользовательский запрос, чтобы ajax загружать / добавлять дополнительные сообщения, а не разбивать их на страницы, как WP defaults. Однако, когда я нажимаю кнопку, которую я сделал, чтобы загружать больше сообщений, она загружает все сообщения, а не те, которые соответствуют результату поиска (в то время как первый набор соответствует результату поиска). Как сохранить этот формат загрузки сообщений при сохранении поискового запроса?

Я успешно сделал это для моих категорий страниц с чем-то вроде query_posts(array('cat' => $category)); но я не уверен, как это сделать для поиска.

Кнопка:

 var pager = 1; var search_load_posts = function(){ $.ajax({ type : "GET", data : {pageNumber: pager, offset: 12}, dataType : "html", url : "http://tay.is/designing/belmontvision/wp-content/themes/yamidoo/search-more-loop.php", beforeSend : function(){}, success : function(data){ var $data = $(data); $container.append( $data ) .packery( 'appended', $data ); heightcalc(); $container.packery(); } }); }; $('.search-load-more').click( function() { search_load_posts(); pager++; }); 

Запрос исходного петли:

 <?php if (have_posts()) : get_template_part('loop-search'); ?> 

Поиск верхней петли (loop-search.php):

 <?php $count = 1; while (have_posts()) : the_post();?> 

Дополнительный пост-запрос (search-more-loop.php):

 <?php require_once('../../../wp-load.php'); $page = (isset($_GET['pageNumber'])) ? $_GET['pageNumber'] : 0; $offset = (isset($_GET['offset'])) ? $_GET['offset'] : 0; $args = array ( 'posts_per_page' => 12,); $last_twelve = get_posts($args); $last_twelve_ids = array(); if( $last_twelve ) foreach( $last_twelve as $last_post ) { $last_twelve_ids[] = $last_post->ID; } query_posts(array( 'paged' => $page, 'post__not_in' => $last_twelve_ids )); while (have_posts()) : the_post(); ?> 

Прежде чем мы начнем, я должен указать на следующее:

  • Вы используете файл в своей теме для отправки запросов AJAX, не делайте этого, есть последствия для безопасности. Вместо этого используйте API WP AJAX, вы сможете удалить половину кода и заставить его работать без изменения URL-адреса каждый раз, когда ваш сайт перемещается
  • Вы использовали query_posts чтобы сделать свой запрос, это почти всегда плохо. Если вам нужно запрашивать сообщения, используйте get_posts или объект WP_Query. Если вам нужно изменить то, что делает основной запрос (например, только показать X на главной странице), используйте фильтр pre_get_posts
  • У вас есть строка с оператором if, циклом for и назначением, это плохо, представьте, что вам сообщили, что в этой ошибке в журнале ошибок произошла ошибка, как бы вы узнали, какая часть вызвала ошибку?
  • Вы передаете смещение на вызов AJAX, а затем игнорируете его
  • Использование $ с jQuery в режиме отсутствия конфликта может вызвать проблемы и подразумевает, что вы объединяете свой собственный jquery, а не тот, который встроен в WordPress ( jQuery(document) not $(document) )

Что касается вашей проблемы, вы сделали запрос, но вы указали:

 query_posts(array( 'paged' => $page, 'post__not_in' => $last_twelve_ids )); 

иначе:

 Show me all the posts on page X but not these posts: a,b,c,d,e,f, etc 

Нигде вы не указали, что такое поисковый запрос, и как он это узнает? Код не психический, и здесь нет автомагии, чтобы понять, что вы пытаетесь что-то искать, это нужно сказать.

Чтобы сделать это, давайте посмотрим на страницу WP_Query codex, в которой перечислены все возможные параметры

Показывать сообщения, основанные на поиске по ключевым словам.

  • s (строка) – ключевое слово поиска.

Что дает нам:

 $query = new WP_Query( 's' => $search_term 'paged' => $page, 'post__not_in' => $last_twelve_ids ); while ( $query->have_posts() ) { $query->the_post(); // etc 

Но мы не проходили поисковый запрос в вашем вызове AJAX, так как он знает, что искать? Нам нужно что-то подобное, чтобы получить его:

 $search_term = (isset($_GET['searchterm'])) ? $_GET['searchterm'] : 0; 

И в вашем вызове AJAX вам нужно будет изменить javascript здесь:

 data : {pageNumber: pager, offset: 12, searchterm: searchterm }, 

Вам нужно будет назначить searchterm значение в вашем javascript перед вызовом загрузки, как вы это делаете, хотя зависит от вашего html, и вы этого не указали.

После этого у вас будет то, что вам нужно, однако у вас все еще будут проблемы:

  • Небезопасная конечная точка AJAX внутри вашей темы (используйте WP AJAX API)
  • Hardcoded путь к вашему веб-сайту в вашем javascript (опять же WP AJAX API это исправит)
  • PHP, который не проверяет входные данные и может привести к инъекции

Дальнейшее чтение

  • Кодекс на WP AJAX
  • Использование AJAX в WordPress – Smashing Magazine
  • Вы не знаете запроса – Андрей Насин
  • Кодекс на WP_Query