Intereting Posts

Получите пользовательские результаты поиска wp_query, которые будут отображаться на search.php

У меня есть страница search.php в моем шаблоне, которая отлично работает при использовании с встроенным виджем поиска, но я создаю плагин поиска, в котором есть пользовательский wp_query, и я хочу, чтобы эти результаты отображались в search.php INSTEAD обычного поиска результаты виджетов.

Мой плагин пока работает хорошо, я просто хочу, чтобы он выводился в search.php.

Я попытался добавить фильтр pre_get_posts а также posts_search но хук фильтра показывает, что «соединение было сброшено» в браузере, а hook-приложение выполняет тот же PLUS, что дает ошибку базы данных WP на странице, где загружен плагин.

Соответствующая часть функции, которая делает запрос:

 $blog_url = get_bloginfo('url'); $form = <<<EOH <div id="sbc"> <form method="get" action="{$blog_url}" id="ss-search"> <input type="text" value="{$search_text}" name="supers" onblur="if (this.value == '') { this.value = '{$search_text}';}" /> {$list} <input type="submit" id="sbc-submit" value="Search" /> </form> </div> EOH; if (isset($_GET['supers'])) { global $q; // global $q; $args = array( // 'category__not_in' => 1, 's' => $_GET['supers'], 'paged' => get_query_var('paged') ); $q = new WP_Query($args); if ( $q->have_posts() ) { echo '<ul>'; while ( $q->have_posts() ) { $q->the_post(); echo '<li>' . get_the_title() . '</li>'; } echo '</ul>'; // echo '<br>Posts found :'.$q->found_posts.'<br><br>'; echo get_pagination_links2(); } else { echo 'no posts found'; } /* Restore original Post Data */ wp_reset_postdata(); } return $form; } // end function 

Solutions Collecting From Web of "Получите пользовательские результаты поиска wp_query, которые будут отображаться на search.php"

Вы смешиваете дисплей формы и логику поиска. это первая плохая вещь в вашем коде.

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

Итак, прежде всего отдельная логика от отображения:

 function vkss_super_search_form( $atts = '' ) { $atts = shortcode_atts( array( // your default params ), $atts ); // some code you have here ob_start(); ?> <div id="sbc"> <form method="get" action="<?php echo $blog_url; ?>" id="ss-search"> <input type="text" value="<?php $search_text ?>" name="supers" onblur="if (this.value == '') { this.value = '<?php echo $search_text; ?>';}" /> <?php echo $list; ?> <input type="submit" id="sbc-submit" value="Search" /> </form> </div> <?php return ob_get_clean(); } add_shortcode('vkss_super_search', 'vkss_super_search_form'); 

Предыдущая функция печатает форму через короткий код.

Теперь вам нужно запустить поиск, когда форма отправлена. Вы хотите использовать search.php но вы должны заметить, что никому не нужно иметь этот файл в теме, поэтому вам нужно предоставить резервную копию index.php (как это делает WordPress), если этот файл отсутствует.

Вы можете использовать 'pre_get_posts' , чтобы проверить, присутствует ли переменная GET 'supers' и если это так, измените основной запрос. после этого search.php будет использоваться WordPress, потому что вы задаете поисковый запрос.

 add_action('pre_get_posts', 'vkss_super_search'); function vkss_super_search( $query ) { if ( ! is_admin() && $query->is_main_query() && $query->is_front_page() ) { $supers = filter_input( INPUT_GET, 'supers', FILTER_SANITIZE_STRING ); if ( empty( $supers ) ) return; $query->is_search = true; $query->set( 's', $supers ); // $query->set( 'category__not_in', 1 ); } } 

Обратите внимание, что весь этот второй блок кода не нужен, если вы называете свое поле ввода 's' вместо 'supers' .

 <input type="text" value="{$search_text}" name="s" />