Как создать динамическую таблицу в WordPress с AJAX и методами оптимизации

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

Что такое динамическая таблица и зачем использовать AJAX в WordPress

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

Преимущества AJAX для таблиц:

  • Быстрая загрузка данных — пользователь не ждёт полной перезагрузки страницы.
  • Удобство фильтрации и сортировки — запросы к серверу отправляются динамически.
  • Уменьшение нагрузки на сервер за счёт частичной подгрузки данных.

Реализовать AJAX в WordPress можно с помощью встроенных хуков и JavaScript.

Регистрация AJAX-обработчиков в WordPress

Для обработки AJAX-запросов в WordPress необходимо зарегистрировать два action-хука — для авторизованных и для гостей:

add_action('wp_ajax_wpkpi_get_table_data', 'wpkpi_get_table_data_callback');
add_action('wp_ajax_nopriv_wpkpi_get_table_data', 'wpkpi_get_table_data_callback');

function wpkpi_get_table_data_callback() {
    // Проверка nonce для безопасности
    check_ajax_referer('wpkpi_table_nonce', 'security');

    // Получение параметров запроса (например, пагинация, фильтры)
    $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $items_per_page = 10;

    // Получение данных из базы (пример с WP_Query)
    $args = [
        'post_type' => 'post',
        'posts_per_page' => $items_per_page,
        'paged' => $page
    ];
    $query = new WP_Query($args);

    $data = [];
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $data[] = [
                'title' => get_the_title(),
                'date' => get_the_date(),
                'link' => get_permalink()
            ];
        }
        wp_reset_postdata();
    }

    // Возвращаем JSON
    wp_send_json_success($data);
}

В этом примере обрабатывается AJAX-запрос, который получает посты-публикации с пагинацией.

Подключение JavaScript для динамической подгрузки таблицы

Для отправки AJAX-запроса и динамического обновления таблицы нужно создать скрипт и зарегистрировать его в WordPress:

function wpkpi_enqueue_scripts() {
    wp_enqueue_script('wpkpi-ajax-table', get_template_directory_uri() . '/js/ajax-table.js', ['jquery'], null, true);
    wp_localize_script('wpkpi-ajax-table', 'wpkpi_ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpkpi_table_nonce')
    ]);
}
add_action('wp_enqueue_scripts', 'wpkpi_enqueue_scripts');

В файле ajax-table.js пишем логику загрузки данных и построения таблицы:

jQuery(document).ready(function($) {
    function wpkpi_load_table(page = 1) {
        $.ajax({
            url: wpkpi_ajax_object.ajax_url,
            method: 'POST',
            data: {
                action: 'wpkpi_get_table_data',
                security: wpkpi_ajax_object.nonce,
                page: page
            },
            success: function(response) {
                if(response.success) {
                    let rows = '';
                    $.each(response.data, function(index, item) {
                        rows += `<tr><td><a href="${item.link}">${item.title}</a></td><td>${item.date}</td></tr>`;
                    });
                    $('#wpkpi-table tbody').html(rows);
                }
            }
        });
    }

    // Инициализация таблицы
    wpkpi_load_table();

    // Пример пагинации (встраиваемая реализация)
    $(document).on('click', '.wpkpi-pagination a', function(e) {
        e.preventDefault();
        let page = $(this).data('page');
        wpkpi_load_table(page);
    });
});

HTML-разметка таблицы может выглядеть так:

<table id="wpkpi-table">
    <thead>
        <tr>
            <th>Заголовок</th>
            <th>Дата</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>

<div class="wpkpi-pagination">
    <a href="#" data-page="1">1</a>
    <a href="#" data-page="2">2</a>
</div>

Методы оптимизации динамических таблиц в WordPress

Пагинация и лимит данных

Очень важно не загружать в таблицу сразу все записи — это замедлит работу и негативно скажется на UX. Используйте пагинацию, как в примере выше, чтобы загружать по 10–20 записей за запрос.

Кеширование результатов

Для снижения нагрузки на базу данных можно кешировать результаты SQL-запросов. В WordPress удобно использовать wp_cache_set и wp_cache_get:

function wpkpi_get_cached_posts($page, $items_per_page) {
    $cache_key = 'wpkpi_table_page_' . $page;
    $cached = wp_cache_get($cache_key);
    if ($cached !== false) {
        return $cached;
    }

    $args = [
        'post_type' => 'post',
        'posts_per_page' => $items_per_page,
        'paged' => $page
    ];
    $query = new WP_Query($args);
    $data = [];
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $data[] = [
                'title' => get_the_title(),
                'date' => get_the_date(),
                'link' => get_permalink()
            ];
        }
        wp_reset_postdata();
    }

    wp_cache_set($cache_key, $data, '', 3600); // кеш на 1 час
    return $data;
}

Оптимизация SQL-запросов

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

Использование плагинов для динамических таблиц с AJAX

Для быстрой реализации динамических таблиц с мощной фильтрацией и поиском можно использовать готовые плагины. Например:

  • WPDataTables — платный плагин с поддержкой AJAX, фильтров, экспорта и визуализации.
  • TablePress — бесплатный и популярный, с расширениями для AJAX.
  • WPGPT Quizle — если требуется интеграция таблиц с интерактивными квизами.

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

Пример расширения функционала: фильтрация по дате и категориям

Расширим AJAX-обработчик, чтобы принимать дополнительные параметры фильтра:

function wpkpi_get_table_data_callback() {
    check_ajax_referer('wpkpi_table_nonce', 'security');

    $page = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : '';
    $date_from = isset($_POST['date_from']) ? sanitize_text_field($_POST['date_from']) : '';
    $date_to = isset($_POST['date_to']) ? sanitize_text_field($_POST['date_to']) : '';

    $args = [
        'post_type' => 'post',
        'posts_per_page' => 10,
        'paged' => $page
    ];

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

    if ($date_from || $date_to) {
        $args['date_query'] = [];
        if ($date_from) {
            $args['date_query'][] = [
                'after' => $date_from,
                'inclusive' => true
            ];
        }
        if ($date_to) {
            $args['date_query'][] = [
                'before' => $date_to,
                'inclusive' => true
            ];
        }
    }

    $query = new WP_Query($args);

    $data = [];
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $data[] = [
                'title' => get_the_title(),
                'date' => get_the_date(),
                'link' => get_permalink()
            ];
        }
        wp_reset_postdata();
    }

    wp_send_json_success($data);
}

В JS добавьте форму фильтрации и отправляйте параметры вместе с AJAX-запросом, обновляя таблицу по ответу.

Итоговые рекомендации по созданию динамических таблиц в WordPress

  • Всегда проверяйте безопасность AJAX-запросов через nonce.
  • Оптимизируйте выборку данных, используйте пагинацию и кеширование.
  • Обрабатывайте ошибки и показывайте пользователю понятные сообщения.
  • Для сложных случаев используйте готовые плагины с поддержкой AJAX.
  • Тестируйте производительность и нагрузку на сервер.

Если хотите расширить функционал сайта с помощью профессиональных плагинов, обратите внимание на продукты из WPSHOP, которые помогут упростить работу с интерактивным контентом и улучшить UX.

WooCommerce: автоматическое возврат средств при отмене заказа через хуки
14.06.2026
Как создать и использовать AJAX в WordPress для динамического обновления контента
02.01.2026
Как создать динамический виджет в WordPress
20.11.2025
Как создать автоматический каталог картинок в WordPress
05.01.2026
WooCommerce: автоматическое удаление заказов по истечении срока
04.06.2026