Вопрос или проблема
Я внес исправление, что когда строка поиска пуста, она возвращает ‘Нет результатов’, вместо всех постов, но пагинация все еще отображается. Кто-нибудь знает, как это исправить?
Мой код search.php:
<div class="wrapper" id="search-wrapper">
<div class="<?php echo esc_attr( $container ); ?>" id="content" tabindex="-1">
<div class="row">
<main class="container" id="main">
<?php if (have_posts() && strlen( trim(get_search_query()) ) != 0 ) : while (have_posts()) : the_post(); ?>
<header class="page-header">
<div class="container">
<div class="row">
<div class="col-sm-12 text-center">
<div class="">
<h1>Результаты поиска для:
<?php
printf(
/* translators: %s: query term */
esc_html__( ' %s', 'understrap' ),
'<span>' . get_search_query() . '</span>'
);
?>
</h1>
</div>
</div>
</div>
</header>
<div>
<h4>
<?php /* Начинаем цикл */ ?>
<?php get_template_part( 'loop-templates/content', 'search' ); ?>
</h4>
</div>
<?php endwhile; else:?>
<div class="container whitespace">
<div class="row">
<div class="col-lg-12 text-center">
<p class="display-4">Нет Результатов..</p>
</div>
</div>
</div>
<?php endif; ?>
</main>
<!-- Компонент пагинации -->
<div class="container">
<div class="row mt-3">
<?php understrap_pagination(); ?>
</div>
</div>
</div>
</div>
Мой код в functions.php:
function SearchFilter($query) {
// Если переменная запроса 's' задана, но пуста
if (isset($_GET['s']) && empty($_GET['s']) && $query->is_main_query()){
$query->is_search = true;
$query->is_home = false;
}
return $query;}
add_filter('pre_get_posts','SearchFilter');
добавьте этот код в ваш search.php
<?php
$show_pagination = true;
if($wp_query->post_count < 0) {
$show_pagination = false;
}
?>
<?php if($show_pagination){ ?>
<!-- Компонент пагинации -->
<div class="container">
<div class="row mt-3">
<?php understrap_pagination(); ?>
</div>
</div>
<?php } ?>
Так что ваш search.php будет выглядеть так :
<div class="wrapper" id="search-wrapper">
<div class="<?php echo esc_attr( $container ); ?>" id="content" tabindex="-1">
<div class="row">
<main class="container" id="main">
<?php if (have_posts() && strlen( trim(get_search_query()) ) != 0 ) : while (have_posts()) : the_post(); ?>
<header class="page-header">
<div class="container">
<div class="row">
<div class="col-sm-12 text-center">
<div class="">
<h1>Результаты поиска для:
<?php
printf(
/* translators: %s: query term */
esc_html__( ' %s', 'understrap' ),
'<span>' . get_search_query() . '</span>'
);
?>
</h1>
</div>
</div>
</div>
</header>
<div>
<h4>
<?php /* Начинаем цикл */ ?>
<?php get_template_part( 'loop-templates/content', 'search' ); ?>
</h4>
</div>
<?php endwhile; else:?>
<div class="container whitespace">
<div class="row">
<div class="col-lg-12 text-center">
<p class="display-4">Нет Результатов..</p>
</div>
</div>
</div>
<?php endif; ?>
</main>
<?php
$show_pagination = true;
if($wp_query->post_count < 0) {
$show_pagination = false;
}
?>
<?php if($show_pagination){ ?>
<!-- Компонент пагинации -->
<div class="container">
<div class="row mt-3">
<?php understrap_pagination(); ?>
</div>
</div>
<?php } ?>
</div>
</div>
Сообщите мне, если это вам поможет!
Ответ или решение
Для решения проблемы отображения постраничной навигации при отсутствии результатов поиска, необходимо внести некоторые изменения в код вашего файла search.php
. В частности, вы уже исправили условие, чтобы при пустом запросе выводилось сообщение «Нет результатов», но теперь параграф с пагинацией продолжает отображаться. Рассмотрим, как правильно убрать пагинацию в случае пустого результата поиска.
Шаги по изменению кода:
-
Определение условия для отображения пагинации:
Нам нужно добавить проверку, которая определяет, есть ли результаты в текущем поисковом запросе. Если результатов нет (то есть какой-либо контент не был найден), тогда блок пагинации не нужно показывать. -
Изменение существующего кода:
Пожалуйста, обновите ваш код вsearch.php
, следуя приведённому ниже примеру:
<div class="wrapper" id="search-wrapper">
<div class="<?php echo esc_attr( $container ); ?>" id="content" tabindex="-1">
<div class="row">
<main class="container" id="main">
<?php if (have_posts() && strlen( trim(get_search_query()) ) != 0) : ?>
<header class="page-header">
<div class="container">
<div class="row">
<div class="col-sm-12 text-center">
<div class="">
<h1>
Записи по запросу:
<?php printf( esc_html__( ' %s', 'understrap' ), '<span>' . get_search_query() . '</span>' ); ?>
</h1>
</div>
</div>
</div>
</div>
</header>
<div>
<h4>
<?php get_template_part( 'loop-templates/content', 'search' ); ?>
</h4>
</div>
<?php else: ?>
<div class="container whitespace">
<div class="row">
<div class="col-lg-12 text-center">
<p class="display-4">Нет результатов...</p>
</div>
</div>
</div>
<?php endif; ?>
</main>
<?php
// Условие для отображения пагинации
if ( have_posts() && $wp_query->max_num_pages > 1 ) : ?>
<div class="container">
<div class="row mt-3">
<?php understrap_pagination(); ?>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
Объяснение изменений:
- Проверка на наличие постов и страниц: Мы добавили условие
if ( have_posts() && $wp_query->max_num_pages > 1 )
, которое проверяет, есть ли посты и есть ли несколько страниц. Это гарантирует, что пагинация будет отображаться только при наличии хотя бы одной страницы результатов. - Удаление лишнего блока: Параметры
post_count < 0
не имеют смысла здесь. Вместо этого мы используем встроенную проверку WordPress для более глубокого анализа результатов запроса.
Заключение
После внесения этих изменений в search.php
, ваше приложение будет корректно скрывать пагинацию, если результаты поиска отсутствуют. Использование данной стратегии улучшит пользовательский опыт и сделает вашу программу более интуитивно понятной для пользователей.
Если у вас есть дополнительные вопросы или требуется помощь по другим аспектам, не стесняйтесь спрашивать!