Поддержка Проблемы и решения Почему не работает сортировка постов (по дате, по заголовку, по дате изменений)?

  • Нашел вариант реализации кастомной сортировки постов (по дате, по заголовку, по дате изменений) в WordPress, мой код:

    
    <div class="toolbar-block">
      <?php
    
        if (isset($_GET['select']) && $_GET['select'] == 'newest') { $order = "&orderby=date&order=DESC"; $s1 = ' selected="selected"'; }
        if (isset($_GET['select']) && $_GET['select'] == 'lastest') { $order = "&orderby=date&order=ASC"; $s2 = ' selected="selected"'; }
        if (isset($_GET['select']) && $_GET['select'] == 'title') { $order = "&orderby=title&order=ASC"; $s3 = ' selected="selected"'; }
        if (isset($_GET['select']) && $_GET['select'] == 'correct') { $order = "&orderby=modified"; $s4 = ' selected="selected"'; }
      ?>
        <form method="get" id="order">
        <select name="select" onchange='this.form.submit()' style="width:200px">
        <option value="newest"<?php $s1?>>по дате (сначала новые)</option>
        <option value="lastest"<?php $s2?>>по дате (сначала старые)</option>
        <option value="title"<?php $s3?>>по заголовку</option>
        <option value="correct"<?php $s4?>>по дате изменения</option>
        </select>
        </form>
    
      <?php global $query_string; // параметры базового запроса
        query_posts($query_string.'&'.$order); // базовый запрос + свои параметры
      ?>
    
    </div>
    
    <?php
    if ( have_posts() ) : // если имеются записи в блоге.
      //query_posts('cat=5');   // указываем ID рубрик, которые необходимо вывести.
      $page = (get_query_var('paged')) ? get_query_var('paged') : 1;
      query_posts("category_name=news&paged=$page");
    
    ?>
    
    <!-- post-navigation  -->
    <div class="toolbar clearfix">	
      <div class="toolbar-block">
        <div class="toolbar-paginations">
          
          <?php if( is_paged() ){ ?>
          <p>Страница:</p>
          <?php } ?>
    
          <?php the_posts_pagination(array(
              'show_all'     => false, // показаны все страницы участвующие в пагинации
              'prev_text'    => '&lsaquo;',
              'next_text'    => '&rsaquo;',
              'type'         => 'list',
              'end_size'     => 3, // количество страниц на концах
              'mid_size'     => 3,  // количество страниц вокруг текущей
          )); 
          ?>
    
        </div>
      </div>
    </div> <!--/ toolbar -->
    <?php
      while (have_posts()) : the_post();  // запускаем цикл обхода материалов блога
    ?>
    <div class="toolbar clearfix">
      <div class="news-container clearfix">
        <div class="news-container__thumb">
          <a href="<?php the_permalink(); ?>">
            
            <?php if(has_post_thumbnail()): ?>
              <?php the_post_thumbnail(); ?>
                <?php else: ?>
                  <img src="assets/img/news/attention.jpg" alt="">
              <?php endif; ?>
          </a>
        </div><!-- /.news-container__thumb -->
        <div class="news-container__text">
          <a href="<?php the_permalink(); ?>">
            <?php the_title(); ?>
          </a>
          <span><?php the_time('j F Y'); ?></span>
          <?php the_content();?>
        </div><!-- /.news-container__text -->
      </div><!-- /.news-container -->
    </div> <!--/ toolbar -->
    
    <?php endwhile; // завершаем цикл. ?> 
    
      <!-- post-navigation  -->
      <div class="toolbar clearfix">
        <div class="toolbar-block">
          <div class="toolbar-paginations">
            <?php if( is_paged() ){ ?>
            <p>Страница:</p>
            <?php } ?>
    
            <?php the_posts_pagination(array(
                'show_all'     => false, // показаны все страницы участвующие в пагинации
                'prev_text'    => '&lsaquo;',
                'next_text'    => '&rsaquo;',
                'type'         => 'list',
                'end_size'     => 3, // количество страниц на концах
                'mid_size'     => 3,  // количество страниц вокруг текущей
            )); 
            ?>
    
          </div>
        </div>
      </div> <!-- /toolbar -->
    
    <?php else: ?>
    
      <p>Новостей нет.</p>
    
    <?php endif; ?>
    
    <?php /* Сбрасываем настройки цикла. Если ниже по коду будет идти еще один цикл, чтобы не было сбоя. */ ?>
    <?php wp_reset_query();  ?>
    

    + код скрипта:

    
    jQuery(document).ready(function($){
    
        var paramsString = location.search
        var searchParams = new URLSearchParams(paramsString);
    
        //Iterate the search parameters.
        for (let p of searchParams) {
          console.log(p);
        }
    
        //Сортировка select
    
        $('#sort').change(function(){
    
        var sortValues = $("#sort option:selected").val(); //получаем значение выбранного пункта select
    
        if($("#sort").val()=="") { 
            
            searchParams.delete("select");
            window.history.replaceState({}, '', location.pathname + '?' + searchParams);
            location.reload(); //перезагрузить старницу (для ajax не нужно)
            
        } else {
            
            searchParams.set("select", sortValues);
            window.history.replaceState({}, '', location.pathname + '?' + searchParams);
            location.reload(); //перезагрузить страницу (для ajax не нужно)
            
        }
    
        });
    
        });
    

    Сортировка не работает. Посты выводятся в том же порядке. Есть подозрения, что это связано с вызовом query_posts, которая нужна для отображения определенной категории (id=5) на отдельной странице page-news.php

    В чем может быть ошибка и как ее исправить?

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Юрий

    (@yube)

    В чем может быть ошибка и как ее исправить?

    Ошибки, как минимум, две:
    1. использование query_posts вместо хука pre_get_posts. См. https://wpmag.ru/2014/query_posts-wordpress/
    2. Вывод рубрики на статической странице, в то время как у рубрики есть своя родная.

    Вывод рубрики на статической странице, в то время как у рубрики есть своя родная.

    Сделал вывод рубрики в файле Category.php, отсюда пропала необходимость использовать query_posts и сортировка заработала. Единственное, что если записи сортируются (т.е. вверху выводятся не последние записи) и выбрать сортировку «по дате (сначала новые)», то она не применяется.

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «Почему не работает сортировка постов (по дате, по заголовку, по дате изменений)?» закрыта для новых ответов.