Задать вопрос
@ssawyer

Как при применении фильтров перейти на первую страницу пагинации Wordpress?

Когда нахожусь на 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();
?>

  • Вопрос задан
  • 57 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы