Intereting Posts
Получить текущее сообщение с идентификатором изображения Отфильтровать определенные классы из меню Как я могу использовать пользовательское имя AccessFileName? WordPress Iframe IE8 Javascript проблема Пользовательский тег постоянной ссылки типа post 40 Использование настраиваемого поля для изменения текста alt для выделенного изображения Как изменить автора настраиваемого типа сообщений? PHP-тег в содержимом сообщения делает WordPress сходить с ума Загрузите 3 различных размера изображения в WordPress Программно выбрать фоновый цвет для изображения? Пользовательский стиль в визуальном редакторе WordPress не будет применять класс для ссылки на элемент Можно ли кэшировать фрагменты с помощью NGINX fastcgi? Я не могу получить доступ к моей локальной панели управления PhpMyAdmin Как делать комментарии для сообщения, загруженного на Ajax? Как добавить пользовательский класс в get_avatar ()

Получите пользовательские результаты поиска 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" />