@daneliyan

WordPress. Как с помощью Ajax отсортировать посты по году и перерендерить постраничную пагинацию?

У меня есть кастомные тип записи "news"
function custom_post_type_news() {
  $labels = array(
      'name'               => __('Новости'),
      'singular_name'      => __('Новость'),
      'menu_name'          => __('Новости'),
      'all_items'          => __('Все новости'),
      'add_new'            => __('Добавить новость'),
      'add_new_item'       => __('Добавить новую новость'),
      'edit_item'          => __('Редактировать новость'),
      'new_item'           => __('Новая новость'),
      'view_item'          => __('Просмотреть новость'),
      'search_items'       => __('Искать новость'),
      'not_found'          => __('Новости не найдены'),
      'not_found_in_trash' => __('Новости в корзине не найдены'),
  );

  $args = array(
      'labels'              => $labels,
      'public'              => true,
      'has_archive'         => true,
      'menu_icon'           => 'dashicons-admin-post',
      'supports'            => array('title', 'editor', 'thumbnail', 'excerpt'),
      'rewrite'             => array('slug' => 'news'),
      'show_in_rest'        => true,
  );

  register_post_type('news', $args);
}
add_action('init', 'custom_post_type_news');


Я создал архив archive-news.php
В ней вывел годы в которые были опубликованы посты.
Вывел посты (6 на одну страницу, сделал через админку вордпресс).
И вывел постраничную пагинацию.

Вот код
<ul class="tags">
      <?php
        global $wpdb;
        $years = $wpdb->get_results("
          SELECT YEAR(post_date) AS year
          FROM $wpdb->posts
          WHERE post_type = 'news'
          AND post_status = 'publish'
          GROUP BY YEAR(post_date)
          ORDER BY YEAR(post_date) DESC
        ");
        foreach ($years as $year_object) :
          $year = $year_object->year;
          $year_link = get_year_link($year);
          $current_year = date('Y');
      ?>
        <li><a href="<?php echo esc_url($year_link); ?>" class="tag <?php echo ($current_year == $year) ? 'active' : ''; ?>"><?php echo esc_html($year); ?></a></li>
      <?php endforeach; ?>
    </ul>
    <?php if (have_posts()) : ?>
      <div class="s-archive__list">
        <?php while (have_posts()) : the_post(); ?>
          <?php get_template_part('template-parts/archive-card'); ?>
        <?php endwhile; ?>
      </div>
      <?php the_posts_pagination(array(
        'prev_text'          => 'назад',
        'next_text'          => 'вперед',
      )); ?>
    <?php else : ?>
      <p><?php 'Новостей нет.' ?></p>
    <?php endif; ?>


И вот что мне требуется сделать:
Нужно чтобы на странице были кнопки годов, и при нажатии на кнопку года - показывались только посты этого года + перерендривалась пагинация.
Сейчас сортировка работает, но постраничная пагинация не обновляется (я не знаю как это сделать).

Вот Аякс функция
add_action('wp_ajax_load_news_archive', 'load_news_archive_callback');
add_action('wp_ajax_nopriv_load_news_archive', 'load_news_archive_callback');
function load_news_archive_callback() {
    $year = isset($_POST['year']) ? $_POST['year'] : date('Y');
    $args = array(
        'post_type' => 'news',
        'posts_per_page' => -1,
        'date_query' => array(
            array(
                'year' => $year,
            ),
        ),
    );
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        $archive_content = '';
        while ($query->have_posts()) {
            $query->the_post();
            get_template_part('template-parts/archive-card');
        }
        wp_reset_postdata();
        echo $archive_content;
    } else {
        echo 'Новостей за ' . $year . ' год нет.';
    }
    wp_die();
}


и вот обработчик
$('.tags a.tag').on('click', function(e) {
    e.preventDefault();
    $('.tags a.tag').removeClass('active');
    $(this).addClass('active');
    var year = $(this).text();
    var ajaxUrl = $('#ajax-url').data('url');
    $.ajax({
      url: ajaxUrl,
      type: 'POST',
      data: {
        action: 'load_news_archive',
        year: year
      },
      success: function(response) {
        $('.s-archive__list').html(response);
        $('.pagination').html($(response).find('.pagination').html());
      },
      error: function(xhr, status, error) {
        console.error(xhr.responseText);
      }
    });
  });


Помогите пж)
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
@pantsarny
Зачем аякс функция если можно зарегать get var и через pre get posts изменить сортировку ?
Ответ написан
Ваш ответ на вопрос

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

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