Как создать динамическую отображающуюся таблицу в WordPress с помощью shortcode

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

Почему именно динамическая таблица? Преимущества использования AJAX в WordPress

Статичные таблицы — это просто HTML-код, который не меняется без обновления страницы. Но что если данные нужно обновлять автоматически или по запросу пользователя? Например, показывать список последних заказов, статистику, или результаты опроса.

Использование AJAX в WordPress позволяет:

  • Обновлять содержимое таблицы без перезагрузки страницы.
  • Повысить интерактивность и отзывчивость интерфейса.
  • Снизить нагрузку на сервер и улучшить пользовательский опыт.

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

Создание shortcode для вывода таблицы с динамическими данными

Начнём с регистрации shortcode и создания базовой таблицы. В коде ниже показано, как это сделать в файле functions.php вашей темы или в отдельном плагине.

function wptool_dynamic_table_shortcode() {
    // HTML контейнер для таблицы
    $output = '<div id="wptool-dynamic-table">Загрузка данных...</div>';

    // Подключаем скрипт для AJAX
    wp_enqueue_script('wptool-table-script', get_stylesheet_directory_uri() . '/js/wptool-table.js', array('jquery'), '1.0', true);

    // Локализация скрипта для передачи ajax_url
    wp_localize_script('wptool-table-script', 'wptool_ajax_obj', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wptool_ajax_nonce')
    ));

    return $output;
}
add_shortcode('wptool_dynamic_table', 'wptool_dynamic_table_shortcode');

В этом коде мы выводим <div> с ID, куда подгрузим таблицу, подключаем JavaScript-файл с нашим AJAX-логикой и передаём в скрипт URL для AJAX-запросов и nonce для безопасности.

Пример данных для таблицы

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

function wptool_get_table_data() {
    return array(
        array('ID' => 1, 'Name' => 'Иван Иванов', 'Email' => 'ivan@example.com'),
        array('ID' => 2, 'Name' => 'Мария Петрова', 'Email' => 'maria@example.com'),
        array('ID' => 3, 'Name' => 'Пётр Сидоров', 'Email' => 'petr@example.com'),
    );
}

Обработка AJAX-запроса на стороне сервера

Теперь добавим PHP-функцию, которая будет возвращать HTML таблицы с данными при AJAX-запросе.

function wptool_ajax_load_table() {
    check_ajax_referer('wptool_ajax_nonce', 'nonce');

    $data = wptool_get_table_data();

    $output = '<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse; width: 100%;">';
    $output .= '<thead><tr><th>ID</th><th>Имя</th><th>Email</th></tr></thead>';
    $output .= '<tbody>';
    foreach ($data as $row) {
        $output .= '<tr><td>' . esc_html($row['ID']) . '</td><td>' . esc_html($row['Name']) . '</td><td>' . esc_html($row['Email']) . '</td></tr>';
    }
    $output .= '</tbody></table>';

    echo $output;
    wp_die();
}
add_action('wp_ajax_wptool_load_table', 'wptool_ajax_load_table');
add_action('wp_ajax_nopriv_wptool_load_table', 'wptool_ajax_load_table');

Здесь функция проверяет nonce, получает данные и формирует HTML таблицы. Далее выводит результат и завершает скрипт.

JavaScript для загрузки таблицы по AJAX

Создайте файл wptool-table.js в папке js вашей темы или плагина и добавьте туда следующий код:

jQuery(document).ready(function($) {
    function wptool_load_table() {
        $('#wptool-dynamic-table').html('Загрузка данных...');
        $.ajax({
            url: wptool_ajax_obj.ajax_url,
            method: 'POST',
            data: {
                action: 'wptool_load_table',
                nonce: wptool_ajax_obj.nonce
            },
            success: function(response) {
                $('#wptool-dynamic-table').html(response);
            },
            error: function() {
                $('#wptool-dynamic-table').html('Ошибка загрузки данных');
            }
        });
    }

    wptool_load_table();
});

Этот скрипт при загрузке страницы отправляет AJAX-запрос на сервер и подставляет полученную таблицу в div.

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

Чтобы сделать таблицу ещё полезнее, добавим фильтрацию по имени и пагинацию.

Форма фильтрации

Добавьте в shortcode вывод формы с полем для поиска:

function wptool_dynamic_table_shortcode() {
    ob_start();
    ?>
    <input type="text" id="wptool-filter" placeholder="Поиск по имени" />
    <div id="wptool-dynamic-table">Загрузка данных...</div>
    <?php
    wp_enqueue_script('wptool-table-script', get_stylesheet_directory_uri() . '/js/wptool-table.js', array('jquery'), '1.1', true);
    wp_localize_script('wptool-table-script', 'wptool_ajax_obj', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wptool_ajax_nonce')
    ));
    return ob_get_clean();
}
add_shortcode('wptool_dynamic_table', 'wptool_dynamic_table_shortcode');

Обновление JS для передачи фильтра

jQuery(document).ready(function($) {
    function wptool_load_table(filter) {
        $('#wptool-dynamic-table').html('Загрузка данных...');
        $.ajax({
            url: wptool_ajax_obj.ajax_url,
            method: 'POST',
            data: {
                action: 'wptool_load_table',
                nonce: wptool_ajax_obj.nonce,
                filter: filter
            },
            success: function(response) {
                $('#wptool-dynamic-table').html(response);
            },
            error: function() {
                $('#wptool-dynamic-table').html('Ошибка загрузки данных');
            }
        });
    }

    $('#wptool-filter').on('input', function() {
        let filterVal = $(this).val();
        wptool_load_table(filterVal);
    });

    wptool_load_table('');
});

Фильтрация на сервере

function wptool_ajax_load_table() {
    check_ajax_referer('wptool_ajax_nonce', 'nonce');

    $filter = isset($_POST['filter']) ? sanitize_text_field($_POST['filter']) : '';

    $data = wptool_get_table_data();

    if ($filter !== '') {
        $data = array_filter($data, function($item) use ($filter) {
            return mb_stripos($item['Name'], $filter) !== false;
        });
    }

    $output = '<table border="1" cellpadding="5" cellspacing="0" style="border-collapse: collapse; width: 100%;">';
    $output .= '<thead><tr><th>ID</th><th>Имя</th><th>Email</th></tr></thead>';
    $output .= '<tbody>';
    foreach ($data as $row) {
        $output .= '<tr><td>' . esc_html($row['ID']) . '</td><td>' . esc_html($row['Name']) . '</td><td>' . esc_html($row['Email']) . '</td></tr>';
    }
    $output .= '</tbody></table>';

    echo $output;
    wp_die();
}

Применение на практике и советы

Такой подход подходит для вывода списков пользователей, заказов, логов и любых табличных данных, которые меняются во времени. Ключевые моменты при расширении:

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

Если вы хотите расширить функционал, например, добавить сортировку по столбцам, рекомендуем посмотреть плагины для таблиц, например, TablePress, однако реализация на собственном коде даёт больше контроля и гибкости.

Для примера можно скачать готовый JS-файл и подключить его, а также протестировать код на локальном сайте.

Заключение

Создание динамической таблицы с помощью shortcode и AJAX — удобный способ улучшить интерфейс WordPress-сайта и добавить интерактивность без сторонних плагинов. Используйте данный шаблон, чтобы адаптировать под свои задачи и данные.

Как создать автоматическую переадресацию в WordPress по условиям
17.04.2026
Как добавить поддержку WebP в WordPress без плагинов
20.03.2026
Как использовать WP-CLI для массового управления постами в WordPress
22.05.2026
Автоматическое удаление старого контента в WordPress по типу постов и дате
14.03.2026
Автоматическое удаление старого контента в WordPress по дате с примером кода
20.02.2026