Функция поиска Wordpress только для поиска сообщений
Я хочу использовать функцию поиска wordpress, но я хочу, чтобы она выполняла поиск только по моим записям в блоге и исключала мои статические страницы из запроса. Как это сделать? Я не против использования плагина.
9 answers
На этой странице форума wp есть множество различных примеров того, как это сделать, в зависимости от того, где вы хотите отредактировать свой сайт(index.php или wp-includes/query.php я верю в ваши варианты):
Http://wordpress.org/support/topic/possible-search-only-posts-exclude-pages
Ответ здесь
Http://www.shilling.id.au/2011/06/23/wordpress-search-only-show-post-and-not-pages/
<?php
function SearchFilter($query) {
if ($query->is_search) {
$query->set('post_type', 'post');
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');
?>
Просто добавьте <input type="hidden" name="post_type" value="post" />
в форму поиска темы... с уважением!
Изложенные решения являются плохими. Редактирование ядра препятствует возможности обновления установки WordPress - вам придется повторять это изменение каждый раз при обновлении, что вы и должны делать. Другое решение создает ненужную нагрузку на базу данных, фильтруя результаты после их извлечения. Лучшее решение:
В вашей теме functions.php, добавьте новую функцию для написания формы поиска:
function custom_search_form( $form, $value = "Search", $post_type = 'post' ) {
$form_value = (isset($value)) ? $value : attribute_escape(apply_filters('the_search_query', get_search_query()));
$form = '<form method="get" id="searchform" action="' . get_option('home') . '/" >
<div>
<input type="hidden" name="post_type" value="'.$post_type.'" />
<input type="text" value="' . $form_value . '" name="s" id="s" />
<input type="submit" id="searchsubmit" value="'.attribute_escape(__('Search')).'" />
</div>
</form>';
return $form;
}
Теперь в шаблоне, где вы хотите разместить форму (или внутри любые созданные вами виджеты, это может быть легко зарегистрировано в качестве виджета вместо этого), это:
<?= custom_search_form( null, 'Search posts', 'post'); ?>
Аргументы можно было бы исключить из функции и вызова, но я нахожу их полезными. Ключом ко всему этому является скрытый ввод "post_type", который передает значение в запрос. Значение по умолчанию post
гарантирует, что будут возвращены только сообщения.
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<?php if (is_search() && ($post->post_type=='page')) continue; ?>
Попробуйте это и скажите мне, работает ли это.
Объедините запрос с глобальным запросом.
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'post' ) );
query_posts( $args );
Вы можете использовать поиск WP http://wpsear.ch / и вы можете настроить, какие типы записей будут отображаться в результатах.
Это решение позволяет при поиске получать только записи, если вы не указали другой тип записи. Этот метод не будет мешать, если вы укажете пользовательский тип записи в скрытом поле в другом поле поиска.
function searchFilter($query) {
if ($query->is_search) {
if ( !isset($query->query_vars['post_type']) ) {
$query->set('post_type', 'post');
}
}
return $query;
}
add_filter('pre_get_posts','searchFilter');
'<form role="search" method="get" id="searchform" class="searchform" action="' . esc_url( home_url( '/' ) ) . '">
<div>
<label class="screen-reader-text" for="s">' . _x( 'Search for:', 'label' ) . '</label>
<input type="text" value="' . get_search_query() . '" name="s" id="s" />
<input type="submit" id="searchsubmit" value="'. esc_attr_x( 'Search', 'submit button' ) .'" />
</div>'
</form>;