У меня проблема с поисковыми запросами. Каждый раз, когда вы добавляете дополнительные запросы, например:
mywebsite.com/?s=wordpress&post_type=page
- Настроить начало и конец выдержки
- Поиск: отображение всех найденных совпадений внутри сообщения
- Ручные отрывки для страниц, не работающих в поиске
- Выделите слова поиска в выдержке
- Как запросить два метаполя и отобразить результаты между ними
- Как ограничить поиск первой буквой названия?
mywebsite.com/?s=wordpress&post_type=page,post
mywebsite.net/?s=wordpress&cat=1
mywebsite.net/?s=wordpress&post_type=post&tag=genesis-post
mywebsite.net/?s=wordpress&post_type=post&tag=thesis-post
он должен выполнять поиск в определенной области (тип сообщения, категория, тег).
В моем случае, похоже, что он не работает независимо от того, что я ставлю в качестве дополнительного параметра, он отобразит все результаты, содержащие слово, которое я ищу.
В моих типах сообщений у меня есть query_var
установленный в true
поэтому в теории он должен работать.
Цикл search.php выглядит так:
<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?> <div class="post"> <?php if ( 'post' == get_post_type() ) : ?> <p class="category"><?php the_category(' '); ?></p> <?php else : ?> <p class="category">Resource</p> <?php endif; ?> <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> <?php the_excerpt(); ?> </div><!-- /post --> <?php endwhile; ?>
Использование скрытого ввода в моем searchform.php тоже не работает,
<form method="get" id="searchform" action="<?php bloginfo('url'); ?>" class="search"> <input type="text" class="field" name="s" id="s" /> <input type="submit" class="submit" name="submit" value="Go" /> <input type="hidden" name="post_type" value="myposttype" /> </form>
он по-прежнему ищет обычные сообщения, а не только внутри myposttype CPT.
Любая идея, почему поисковые запросы не будут работать? Любая помощь оценивается.
Я обнаружил, что передача post_type
не ограничивает поиск этим типом, а просто добавляет этот тип к массиву, который он уже ищет.
То, что вы можете сделать для создания сложных поисковых запросов, это hook pre_get_posts
и немного манипулировать запросами.
Для простого примера сначала добавьте свой собственный запрос var, чтобы перейти к массиву известных страниц запроса WordPress:
function wpa53029_query_vars( $query_vars ){ $query_vars[] = 'my_type'; return $query_vars; } add_filter( 'query_vars', 'wpa53029_query_vars' );
Затем настройте форму, чтобы передать тип сообщения, например:
mywebsite.com/?s=wordpress&my_type=page
mywebsite.com/?s=wordpress&my_type=page,mycustomtype
Затем добавьте некоторый код для перехвата запроса var перед запросом базы данных и установите тип сообщения:
function wpa53029_pre_get_posts( $query ){ if( isset( $query->query_vars['my_type'] ) ){ $types = explode( ',', $query->query_vars['my_type'] ); $query->set( 'post_type', $types ); } return $query; } add_action( 'pre_get_posts', 'wpa53029_pre_get_posts' );
Для отладки распечатайте содержимое объекта запроса в вашем шаблоне search.php
чтобы узнать, как все будет установлено, и фактический SQL-запрос WordPress генерирует запрос к базе данных. WordPress использует $wp_query
как глобальную переменную, которая содержит основной запрос:
<pre> <?php print_r( $wp_query ); ?> </pre>
Я не тестировал это, поэтому он может работать не так, как я думаю, но попробую:
$post_type = $_GET['post_type']; global $query_string query_posts( $query_string . '&post_type=' . $post_type ); // loop here