Когда нахожусь на 2 странице и допустим выбираю другой год в фильтре, то url формируется сразу такой:
/page/2/?order=DESC&day_range=7&year_range=2023
и из за этого (/page/2/) фильтр отрабатывает неправильно.
Можно ли как то сбросить страницу?
Если в $query вручную ввести paged = 1, то пагинация сбрасывается, но из url не очищается.
$query = [
'paged' => 1,
'orderby' => 'date',
];
Функция вывода пагинации
function ll_pagination($query = null, bool $use_ajax = false)
{
if ($query) {
$total = $query->max_num_pages;
$current_page = max(1, $query->get('paged'));
} else {
global $wp_query;
$total = isset($wp_query->max_num_pages) ? $wp_query->max_num_pages : 1;
$current_page = max(1, get_query_var('paged'));
}
$prev_svg = '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.9851 2.34616L17.4043 3.76536L9.16967 12L17.4043 20.2346L15.9851 21.6538L6.33127 12L15.9851 2.34616Z" fill="black" />
</svg>';
$next_svg = '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.0149 21.6538L6.5957 20.2346L14.8303 12L6.5957 3.76539L8.0149 2.34619L17.6687 12L8.0149 21.6538Z" fill="black" />
</svg>';
$pagination_args = array(
'total' => $total,
'mid_size' => 2,
'prev_text' => $prev_svg,
'next_text' => $next_svg,
'current' => $current_page,
'base' => str_replace(9999999999, '%#%', esc_url(get_pagenum_link(9999999999))),
);
$class = 'page-pagination';
if ($use_ajax) {
$class .= ' ajax-pagination';
}
if ($total > 1) echo '<nav class="' . $class . '">';
echo paginate_links($pagination_args);
if ($total > 1) echo '</nav>';
}
Функция вывода фильтров
function ll_news_filter(bool $use_ajax = true)
{
$id = $use_ajax ? "news-filter" : 'filter-no-ajax';
$years = ll_unique_years_from_posts();
$days = [
7 => 'За последние 7 дней',
30 => 'За последний месяц',
90 => 'За последние 3 месяца',
365 => 'За последний год'
];
$order_by = [
'DESC' => 'Сначала новые',
'ASC' => 'Сначала старые',
];
$order = isset($_GET['order']) ? $_GET['order'] : 'DESC';
$day_range = isset($_GET['day_range']) ? (int)$_GET['day_range'] : 7;
echo '<form id="' . $id . '" class="news__filter" method="GET">';
echo '<span class="news__filter-title">Показать:</span>';
echo '<select name="order" id="news-order">';
foreach ($order_by as $value => $label) {
$selected = ($value === $order) ? 'selected' : '';
echo "<option value='{$value}' {$selected}>{$label}</option>";
}
echo '</select>';
echo '<select name="day_range" id="news-date">';
foreach ($days as $value => $label) {
$selected = ($value === $day_range) ? 'selected' : '';
echo "<option value='{$value}' {$selected}>{$label}</option>";
}
echo '</select>';
if (!empty($years)) {
echo '<select name="year_range" id="news-year">';
foreach ($years as $year) {
$selected = (isset($_GET['year_range']) && $_GET['year_range'] == $year) ? 'selected' : '';
echo "<option value='{$year}' {$selected}>{$year}</option>";
}
echo '</select>';
}
if (!$use_ajax) {
echo '<button type="submit">Применить</button>';
}
echo '</form>';
}
archive.php
<?php
get_header();
$has_filters = isset($_GET['order']) || isset($_GET['day_range']) || isset($_GET['year_range']);
if ($has_filters) {
global $wp_query;
$order = isset($_GET['order']) ? sanitize_text_field($_GET['order']) : 'DESC';
$day_range = isset($_GET['day_range']) ? intval($_GET['day_range']) : 7;
$year_range = isset($_GET['year_range']) ? intval($_GET['year_range']) : date('Y');
$query = [
'orderby' => 'date',
];
if ($day_range) {
$query['date_query'] = [
[
'after' => "$day_range days ago",
'inclusive' => true,
],
];
}
if ($year_range) {
$query['date_query'] = [
[
'year' => $year_range,
],
];
}
$query = array_merge($wp_query->query, $query);
query_posts($query);
}
?>
<main class="main">
<section class="section press-center">
<div class="container">
<?php if (have_posts()) : ?>
<header class="page-header">
<?php
the_archive_title('<h1 class="page-header__title h h--1-big text-red">', '</h1>');
the_archive_description('<div class="archive-description">', '</div>');
?>
</header>
<div class="news">
<?php ll_news_filter(false); ?>
<div id="news-results">
<?php
while (have_posts()) :
the_post();
get_template_part('template-parts/loop/loop', get_post_type());
endwhile;
?>
</div>
<?php
ll_pagination();
else :
get_template_part('template-parts/content', 'none');
endif;
?>
</div>
</section>
</main>
<?php
get_footer();
?>