Пользовательский запрос WordPress с пользовательской таксономией — Ошибка разбиения на страницы

#php #wordpress #url #pagination #taxonomy

Вопрос:

Я создал пользовательский запрос с несколькими таксономиями, и, кроме того, я использую paginate_links разбиение на страницы. Таксономии выбираются с помощью раскрывающихся форм выбора, с помощью onchange="this.form.submit()" которых можно фильтровать сообщения, и это лишь временное решение, но пока оно работает нормально, и его стоит отметить ради этого случая.

Разбиение на страницы работает нормально, сообщения отображаются правильно при выборе терминов таксономии, однако, когда я покидаю первую страницу и, допустим, перехожу на страницу № 2 и выбираю другой термин таксономии в раскрывающемся списке, URL-адрес сохраняет номер текущей страницы и добавляет к нему идентификатор селектора. В то время как я хотел бы добиться того, чтобы при нажатии на другую таксономию в селекторе вновь выбранный запрос таксономии создавал новый URL-адрес, который начинался с первой страницы этой определенной таксономии.

Позвольте мне привести пример, чтобы более четко понять, что я имею в виду выше:

  1. Я выбираю термин таксономии «бренд1» в селекторе брендов, чтобы отобразить все сообщения, связанные с этим термином таксономии

введите описание изображения здесь

URL на данный момент mydomainname.com/?brandselector=brand1 и до сих пор так хорош.

  1. Я перехожу на страницу № 2 через разбиение на страницы, теперь URL выглядит так:
    mydomainname.com/page/2/?brandselector=brand1
  2. Сама проблема начинается здесь: я нажимаю на другой термин таксономии в любом из выпадающих селекторов, как показано ниже:

введите описание изображения здесь

Теперь я либо получаю пустую страницу, если в термине таксономии недостаточно записей, чтобы охватить несколько страниц разбиения на страницы, либо я вижу списки записей прямо со страницы 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;">';