WPExperts

Как создать выставку новостей с AJAX в WordPress

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

Почему использовать AJAX для загрузки новостей в WordPress

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

Помимо улучшения UX, AJAX помогает уменьшить нагрузку на сервер за счет подгрузки данных порционно, а не всей страницы целиком.

Для реализации AJAX в WordPress потребуется написать PHP-функцию для обработки AJAX-запроса и JavaScript-код для отправки запроса и обновления страницы.

Подготовка: создание пользовательского запроса новостей

Для начала создадим PHP-функцию, которая будет возвращать список новостей (постов) в формате HTML. Мы используем стандартный тип записи post, но при необходимости можно заменить на кастомный тип.

Пример функции с префиксом wpexperts_:

function wpexperts_load_news_ajax() {
    $paged = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $args = [
        'post_type' => 'post',
        'posts_per_page' => 5,
        'paged' => $paged
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            echo '<article class="news-item">';
            echo '<h3>' . get_the_title() . '</h3>';
            echo '<div class="news-excerpt">' . get_the_excerpt() . '</div>';
            echo '</article>';
        }
    } else {
        echo '<p>Новостей больше нет</p>';
    }
    wp_die();
}
add_action('wp_ajax_wpexperts_load_news', 'wpexperts_load_news_ajax');
add_action('wp_ajax_nopriv_wpexperts_load_news', 'wpexperts_load_news_ajax');

Эта функция получает номер страницы из AJAX-запроса, запрашивает 5 постов и выводит их HTML. Функция подключена к AJAX-хукам WordPress для авторизованных и неавторизованных пользователей.

Добавление JavaScript для отправки AJAX-запроса

Теперь нужно написать JS-код, который будет отправлять AJAX-запрос и подгружать новости на страницу. Добавим кнопку «Загрузить еще» и подгрузим новые новости при клике.

Пример JavaScript с использованием jQuery (предполагается, что jQuery подключён):

jQuery(document).ready(function($) {
    var page = 1;
    $('#load-news').on('click', function() {
        page++;
        $.ajax({
            url: wpexperts_ajax_object.ajax_url,
            method: 'POST',
            data: {
                action: 'wpexperts_load_news',
                page: page
            },
            beforeSend: function() {
                $('#load-news').attr('disabled', true).text('Загрузка...');
            },
            success: function(response) {
                if (response.trim() === 'Новостей больше нет') {
                    $('#load-news').hide();
                } else {
                    $('#news-container').append(response);
                    $('#load-news').attr('disabled', false).text('Загрузить еще');
                }
            },
            error: function() {
                alert('Ошибка загрузки новостей');
                $('#load-news').attr('disabled', false).text('Загрузить еще');
            }
        });
    });
});

Для корректной работы AJAX нужно передать в JS объект с URL обработчика. Это делается через wp_localize_script в PHP:

function wpexperts_enqueue_scripts() {
    wp_enqueue_script('wpexperts-news-ajax', get_template_directory_uri() . '/js/news-ajax.js', ['jquery'], null, true);
    wp_localize_script('wpexperts-news-ajax', 'wpexperts_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php')
    ]);
}
add_action('wp_enqueue_scripts', 'wpexperts_enqueue_scripts');

HTML-разметка для выставки новостей

В теме или в нужном шаблоне добавьте контейнер для новостей и кнопку загрузки:

<div id="news-container">
    <!-- Здесь по умолчанию можно вывести первые 5 новостей через стандартный WP_Query -->
</div>
<button id="load-news">Загрузить еще</button>

Так пользователь сразу видит первые новости, а по нажатию на кнопку подгружаются следующие.

Оптимизация и безопасность AJAX-запросов

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

function wpexperts_load_news_ajax() {
    check_ajax_referer('wpexperts_load_news_nonce', 'nonce');
    // остальной код
}

function wpexperts_enqueue_scripts() {
    wp_enqueue_script('wpexperts-news-ajax', get_template_directory_uri() . '/js/news-ajax.js', ['jquery'], null, true);
    wp_localize_script('wpexperts-news-ajax', 'wpexperts_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpexperts_load_news_nonce')
    ]);
}
add_action('wp_enqueue_scripts', 'wpexperts_enqueue_scripts');

И в JS добавить nonce в данные запроса:

data: {
    action: 'wpexperts_load_news',
    page: page,
    nonce: wpexperts_ajax_object.nonce
},

Также полезно добавить ограничение на максимальное число страниц, чтобы избежать лишних запросов.

Использование плагинов для AJAX-новостей

Если не хочется писать всё с нуля, можно использовать плагины, например, WPRemark для создания отзывов и новостей с AJAX или ABC Pagination для удобной постраничной навигации с подгрузкой.

Заключение

Создание выставки новостей с AJAX в WordPress позволяет значительно улучшить производительность и удобство сайта. Используя приведённый пример, вы сможете реализовать подгрузку новостей по кнопке или скроллу, а также легко адаптировать код под свои задачи. Не забывайте о безопасности — проверяйте nonce и ограничивайте количество запросов. Для более сложных случаев и расширенного функционала рассмотрите готовые решения из каталога WPSHOP.

×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙