#php #wordpress #url #pagination #taxonomy
Вопрос:
Я создал пользовательский запрос с несколькими таксономиями, и, кроме того, я использую paginate_links
разбиение на страницы. Таксономии выбираются с помощью раскрывающихся форм выбора, с помощью onchange="this.form.submit()"
которых можно фильтровать сообщения, и это лишь временное решение, но пока оно работает нормально, и его стоит отметить ради этого случая.
Разбиение на страницы работает нормально, сообщения отображаются правильно при выборе терминов таксономии, однако, когда я покидаю первую страницу и, допустим, перехожу на страницу № 2 и выбираю другой термин таксономии в раскрывающемся списке, URL-адрес сохраняет номер текущей страницы и добавляет к нему идентификатор селектора. В то время как я хотел бы добиться того, чтобы при нажатии на другую таксономию в селекторе вновь выбранный запрос таксономии создавал новый URL-адрес, который начинался с первой страницы этой определенной таксономии.
Позвольте мне привести пример, чтобы более четко понять, что я имею в виду выше:
- Я выбираю термин таксономии «бренд1» в селекторе брендов, чтобы отобразить все сообщения, связанные с этим термином таксономии
URL на данный момент mydomainname.com/?brandselector=brand1
и до сих пор так хорош.
- Я перехожу на страницу № 2 через разбиение на страницы, теперь URL выглядит так:
mydomainname.com/page/2/?brandselector=brand1
- Сама проблема начинается здесь: я нажимаю на другой термин таксономии в любом из выпадающих селекторов, как показано ниже:
Теперь я либо получаю пустую страницу, если в термине таксономии недостаточно записей, чтобы охватить несколько страниц разбиения на страницы, либо я вижу списки записей прямо со страницы 2 или любого другого номера, на котором я был раньше, только что выбранного термина таксономии.
URL-адрес теперь выглядит так: mydomainname.com/page/2/?brandselector=brand2
Таким образом, номер страницы не сбрасывается для вновь выбранного термина таксономии.
Мой код:
global $wpdb, $post, $page;
echo "<div class='entry-content'>";
echo '<div class="filter-box">';
echo '<form name="selectbrand" method="GET" style="width:200px;">';
echo '<select id="brandselector" name="brandselector" onchange="this.form.submit()">';
echo '<option value="">Select brand:</option>';
$brands = get_terms(array(
'taxonomy' => 'brand',
'hide_empty' => true,
'orderby' => 'name',
) );
foreach ( $brands as $brand ) { ?>
<?php echo '<option value="' . $brand->slug . '">' . $brand->name . '</option>';
};
echo '</select>';
echo '</form>';
echo '<form name="selectdrive" method="GET" style="width:200px;">';
echo '<select id="driveselector" name="driveselector" onchange="this.form.submit()">';
echo '<option value="">Select drive:</option>';
$drives = get_terms(array(
'taxonomy' => 'drive_cat',
'hide_empty' => true,
'orderby' => 'name',
) );
foreach ( $drives as $drive ) { ?>
<?php echo '<option value="' . $drive->slug . '">' . $drive->name . '</option>';
};
echo '</select>';
echo '</form>';
echo '</div>'; //filter-box
if ( !empty( $_GET['driveselector'])){
$term_id = $_GET['driveselector'];
}
if ( !empty( $_GET['brandselector'])){
$term_id = $_GET['brandselector'];
}
//<-----------------<<<<Main Query start>>>>---------------------
$main_args = array(
'post_type'=> 'things',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 5,
'paged' => $page,
);
//<-----------------<<<<Main Query Custom Query>>>>---------------------
$taxquery = array();
if ( !empty($term_id) || isset($term_id) ) {
array_push($taxquery,array(
'relation' => 'OR',
array(
'taxonomy' => 'brand',
'field' => 'slug',
'terms' => $term_id
),
array(
'taxonomy' => 'drive_cat',
'field' => 'slug',
'terms' => $term_id
)
));
}
if(!empty($taxquery)){
$main_args['tax_query'] = $taxquery;
}
global $main_query;
$main_query = new WP_Query( $main_args );
'<div class="content-box">';
if ( $main_query->have_posts() ) :
while ( $main_query->have_posts() ) : $main_query->the_post();
//content start here
И разбивка на страницы:
//<!-- end blog posts -->
endwhile;
echo '<div class="pagination">';
$total_pages = $main_query->max_num_pages;
if ($total_pages > 1){
$current_page = max(1, get_query_var('page'));
echo paginate_links(array(
'base' => preg_replace('/?.*/', '/', get_pagenum_link(1)) . '%_%',
'current' => $current_page,
'total' => $total_pages,
'prev_text' => __('« prev'),
'next_text' => __('next »'),
));
}
echo '</div>';
wp_reset_postdata();
endif;
Что мне не хватает для сброса URL-адреса при нажатии на другой термин таксономии? Любые предложения будут высоко оценены, и извините, если я неправильно использовал некоторые технические термины, я все еще учусь. Спасибо.
Комментарии:
1. Я бы переключил paginate_links на использование строк запроса для номеров страниц, а затем их намного проще сбросить в JS
Ответ №1:
Поскольку вы не определяете action
атрибут для form
элемента, по умолчанию выполняется переход к текущему URL-адресу. Поэтому, как только вы воспользуетесь гиперссылкой на разбиение на страницы, в следующий раз форма отправит запрос по этой ссылке. Установка атрибута действия исправит это.
echo '<form action="/" name="selectdrive" method="GET" style="width:200px;">';