Как сделать, чтобы пагинация и фильтрация работали совместно
Есть список турниров. У каждого турнира указана дата начала. Хочу сделать фильтр для выбора турниров по месяцу и/или году проведения. Фильтр вроде получился, но при этом пагинация не работает. Например, турниры за март месяц, он покажет только на второй странице, как и при выводе всех турниров, а первая страница будет пустая.
Подскажите, пожалуйста, как сделать, чтобы и пагинация и фильтрация работали совместно.
<form action="http://test.chess22barnaul.ru/tournaments/" method="get">
<label>Месяц:</label>
<select name="month">
<option value="">Any</option>
<option value="01">январь</option>
<option value="02">Февраль</option>
<option value="03">Март</option>
<option value="04">Апрель</option>
</select>
<button type="submit" name="">search</button>
</form>
<?php
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$query = new WP_Query( array(
'post_type' => 'tournaments',
'meta_key' => 'tourn_date-begin',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
) );
while ( $query->have_posts() ):
$query->the_post();
?>
<?php
if($_GET['month'] && !empty($_GET['month'])) {
$month = $_GET['month']; }
$datebegin = date('m', strtotime(get_field('tourn_date-begin')));
if ( $month == $datebegin) {
?>
<div>информация по турниру</div>
<?php endwhile;
}
?>
<?php the_posts_pagination(); ?>
Ответы (1 шт):
Вот код, который вам примерно нужен.
Момент 1. Это выборка meta_query в случае, если есть $_GET['month']. Мы выбираем посты, которые с 1-го дня месяца по последний день месяца (meta_query).
Момент 2. the_posts_pagination работает только с глобальным WP_Query. Поэтому для работы нужно изменить global $wp_query а затем вернуть после цикла обратно.
<form action="" method="GET">
<label>Месяц:</label>
<select name="month">
<option value="">Any</option>
<option value="01">январь</option>
<option value="02">Февраль</option>
<option value="03">Март</option>
<option value="04">Апрель</option>
</select>
<button type="submit" name="">search</button>
</form>
<?php
$paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = [
'post_type' => 'tournaments',
'meta_key' => 'tourn_date-begin',
'orderby' => 'meta_value_num',
'order' => 'DESC',
'paged' => $paged,
];
if ( ! empty( $_GET['month'] ) ) {
$start_date = new DateTime();
$start_date->setDate( $start_date->format( 'Y' ), intval( $_GET['month'] ), 1 );
$end_date = $start_date;
$end_date->modify( 'last day of this month' );
$args['meta_query'] = [
[
'key' => 'tourn_date-begin',
'value' => $start_date->format( 'Y-m-d' ),
'compare' => '>=',
'type' => 'DATE',
],
[
'key' => 'tourn_date-begin',
'value' => $end_date->format( 'Y-m-d' ),
'compare' => '<=',
'type' => 'DATE',
],
];
}
global $wp_query;
$restore_wp_query = $wp_query;
$query = new WP_Query( $args );
$wp_query = $query;
if ( $query->have_posts() ) :
while ( $query->have_posts() ):
$query->the_post();
the_title();
the_posts_pagination();
endwhile;
wp_reset_postdata();
$wp_query = $restore_wp_query;
endif;