Как создать фильтрованные новости в WordPress с помощью AJAX

В современном новостном сайте на WordPress важна возможность динамического отображения контента в зависимости от выбора пользователя. Особенно это актуально для сайтов с большим потоком новостей, где пользователям важно быстро находить нужные материалы без перезагрузки страницы. В этой статье мы подробно разберём, как создать фильтрованные новости с помощью AJAX, чтобы посетители могли фильтровать новости по категориям, тегам или другим параметрам, а результаты обновлялись мгновенно.

Почему AJAX-фильтры важны для новостных сайтов на WordPress

Традиционный подход к фильтрации постов предполагает перезагрузку страницы при каждом изменении параметров. Это снижает удобство использования и увеличивает время ожидания. AJAX (Asynchronous JavaScript and XML) позволяет отправлять запросы на сервер и получать данные без перезагрузки страницы. В результате пользовательский опыт становится более плавным и современным.

Для сайта с новостями это значит, что посетители могут быстро переключаться между категориями или выбирать новости по дате, автору или другим параметрам, сразу видя результаты.

Кроме того, AJAX-фильтры снижают нагрузку на сервер, поскольку передаются только необходимые данные, а не вся страница целиком.

Подготовка к созданию AJAX-фильтров новостей

Для начала убедимся, что на вашем сайте WordPress есть новости, которые вы хотите фильтровать. Обычно новости — это посты определённого типа (например, стандартный post или кастомный тип post_type = 'news'). Также желательно, чтобы новости были распределены по категориям и тегам.

В качестве примера возьмём стандартный пост-тип и категории для фильтрации.

Для реализации AJAX нам понадобятся следующие шаги:

  • Добавить HTML-разметку фильтра на страницу (например, выпадающий список категорий)
  • Написать JavaScript, который будет отправлять AJAX-запрос при выборе фильтра
  • Создать PHP-обработчик, который вернёт отфильтрованные новости
  • Вывести новости на страницу без перезагрузки

Добавляем HTML-фильтр и контейнер для новостей

В шаблоне страницы новостей или через шорткод добавляем следующий код:

<div id="wpnews-filter">
  <select id="wpnews-category-filter">
    <option value="">Все категории</option>
    <?php
    $categories = get_categories();
    foreach ( $categories as $category ) {
        echo '<option value="' . esc_attr( $category->term_id ) . '">' . esc_html( $category->name ) . '</option>';
    }
    ?>
  </select>
</div>

<div id="wpnews-results">
  <!-- Здесь будут отображаться новости -->
</div>

Этот блок создаёт выпадающий список с категориями и контейнер для вывода новостей.

JavaScript: отправляем AJAX-запрос при выборе категории

Добавим скрипт, который будет слушать изменение выпадающего списка и отправлять запрос на сервер:

jQuery(document).ready(function($) {
  $('#wpnews-category-filter').on('change', function() {
    var category = $(this).val();

    $.ajax({
      url: wpnews_ajax_object.ajax_url,
      type: 'POST',
      data: {
        action: 'wpnews_filter_news',
        category: category
      },
      beforeSend: function() {
        $('#wpnews-results').html('<p>Загрузка новостей...</p>');
      },
      success: function(response) {
        $('#wpnews-results').html(response);
      },
      error: function() {
        $('#wpnews-results').html('<p>Ошибка загрузки новостей.</p>');
      }
    });
  });
});

Здесь wpnews_ajax_object.ajax_url — это переменная, которую мы передадим из PHP для правильного указания URL для AJAX-запросов.

PHP: регистрируем AJAX-обработчик и передаём переменные в JS

В functions.php вашей темы или в файле плагина добавьте следующий код:

function wpnews_enqueue_scripts() {
  wp_enqueue_script('wpnews-ajax-filter', get_template_directory_uri() . '/js/wpnews-ajax-filter.js', array('jquery'), null, true);

  wp_localize_script('wpnews-ajax-filter', 'wpnews_ajax_object', array(
    'ajax_url' => admin_url('admin-ajax.php'),
  ));
}
add_action('wp_enqueue_scripts', 'wpnews_enqueue_scripts');

// Обработчик AJAX-запроса
function wpnews_ajax_filter_news() {
  $category = isset($_POST['category']) ? intval($_POST['category']) : 0;

  $args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC',
  );

  if ($category) {
    $args['cat'] = $category;
  }

  $query = new WP_Query($args);

  if ($query->have_posts()) {
    while ($query->have_posts()) {
      $query->the_post();
      echo '<article class="wpnews-article">';
      echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
      echo '<div class="wpnews-excerpt">' . get_the_excerpt() . '</div>';
      echo '</article>';
    }
  } else {
    echo '<p>Новостей не найдено.</p>';
  }
  wp_reset_postdata();

  wp_die();
}
add_action('wp_ajax_wpnews_filter_news', 'wpnews_ajax_filter_news');
add_action('wp_ajax_nopriv_wpnews_filter_news', 'wpnews_ajax_filter_news');

В этом коде мы подключаем скрипт, передаём в него URL для AJAX и создаём функцию-обработчик, которая принимает параметр категории и возвращает HTML с соответствующими новостями.

Оптимизация и расширение фильтра

Данный базовый пример можно расширять и улучшать:

  • Добавить фильтрацию по нескольким параметрам — например, по тегам, дате, автору
  • Добавить пагинацию в AJAX-запросах для загрузки больших объёмов новостей
  • Использовать шаблоны для вывода новостей, чтобы код был более структурированным
  • Интегрировать с плагинами SEO и кеширования, чтобы не ухудшать производительность
  • Добавить индикаторы загрузки и обработку ошибок для лучшего UX

Пример расширенного фильтра с тегами

Добавим дополнительный селект для тегов:

<select id="wpnews-tag-filter">
  <option value="">Все теги</option>
  <?php
  $tags = get_tags();
  foreach ($tags as $tag) {
      echo '<option value="' . esc_attr($tag->term_id) . '">' . esc_html($tag->name) . '</option>';
  }
  ?>
</select>

И в JavaScript добавить обработчик для обоих фильтров, собирая значения и передавая их в AJAX. В PHP-обработчике добавить параметр 'tag__in' в WP_Query.

Использование плагинов для фильтрации новостей

Если вы хотите готовое решение с визуальным конструктором, обратите внимание на плагины, например:

  • Clearfy Pro — среди прочих функций есть улучшенные фильтры и оптимизация запросов.
  • WPRemark — плагин для создания отзывов и рейтингов, который можно интегрировать с новостями и фильтрами.

Однако создание собственного AJAX-фильтра даёт полный контроль над логикой и выводом, а также позволяет сделать интерфейс максимально удобным под ваши задачи.

Итоги

Реализация AJAX-фильтра новостей в WordPress — это отличное решение для повышения удобства пользователей и повышения скорости работы сайта. С помощью простого кода на PHP и JavaScript вы можете создать динамический фильтр, который будет быстро подгружать новости без перезагрузки страницы.

В дальнейшем можно усложнять фильтры, добавлять пагинацию и интегрировать с плагинами для ещё более мощного функционала.

Экспериментируйте с кодом, и ваш новостной сайт на WordPress станет удобнее и современнее!

Автоматический импорт новостей в WordPress с использованием WP REST API
29.03.2026
Как создать подробный лог для отладки в WordPress
21.11.2025
Как использовать метод wpnews_detect_user_agent для определения User Agent в WordPress
17.12.2025
Как отключить AJAX в корзине WooCommerce и почему это может понадобиться
14.12.2025
Автоматизация публикации новостей в WordPress с WPRemark
01.03.2026