Кастомизация вывода таблицы постов в WordPress с помощью WP_Query

Введение в WP_Query и зачем кастомизировать вывод таблицы постов

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

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

Настройка WP_Query для выборки постов

Для начала создадим WP_Query с нужными параметрами. Допустим, нам нужно вывести в таблицу все посты типа post, опубликованные, с сортировкой по дате.

$args = [
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'orderby' => 'date',
    'order' => 'DESC',
];
$query = new WP_Query($args);

Здесь posts_per_page = -1 означает, что мы получаем все записи. В реальных проектах лучше использовать пагинацию, чтобы не перегружать страницу.

Если нужно добавить фильтрацию по категории или таксономии, в $args добавляют соответствующий параметр, например:

$args['category_name'] = 'novosti';

Создание таблицы с выводом данных из WP_Query

Теперь создадим HTML-таблицу, в которой выведем заголовок, дату публикации и автора поста. Для удобства добавим CSS-классы для стилизации.

if ($query->have_posts()) {
    echo '<table class="wpquery-posts-table">';
    echo '<thead><tr>';
    echo '<th>Заголовок</th><th>Дата публикации</th><th>Автор</th>';
    echo '</tr></thead>';
    echo '<tbody>';
    while ($query->have_posts()) {
        $query->the_post();
        echo '<tr>';
        echo '<td><a href="' . get_permalink() . '">' . get_the_title() . '</a></td>';
        echo '<td>' . get_the_date() . '</td>';
        echo '<td>' . get_the_author() . '</td>';
        echo '</tr>';
    }
    echo '</tbody></table>';
    wp_reset_postdata();
} else {
    echo '<p>Посты не найдены.</p>';
}

Этот код выведет удобную таблицу с постами. Чтобы улучшить внешний вид, добавьте стили в файл темы или через кастомайзер:

.wpquery-posts-table {
    width: 100%;
    border-collapse: collapse;
}
.wpquery-posts-table th, .wpquery-posts-table td {
    border: 1px solid #ddd;
    padding: 8px;
}
.wpquery-posts-table th {
    background-color: #f4f4f4;
    text-align: left;
}

Добавление кастомных полей и метаданных в таблицу

Часто в таблице нужно выводить не только стандартные поля, но и метаданные, например, цену, рейтинг или дату события. Для этого используем функцию get_post_meta(). Рассмотрим пример, когда у поста есть метаполе "event_date".

while ($query->have_posts()) {
    $query->the_post();
    $event_date = get_post_meta(get_the_ID(), 'event_date', true);
    echo '<tr>';
    echo '<td><a href="' . get_permalink() . '">' . get_the_title() . '</a></td>';
    echo '<td>' . get_the_date() . '</td>';
    echo '<td>' . $event_date ? esc_html($event_date) : '—' . '</td>';
    echo '</tr>';
}

Не забудьте добавить новую колонку в заголовок таблицы:

echo '<th>Дата события</th>';

Реализация пагинации для таблицы постов

При большом числе записей вывод всех сразу нежелателен. Реализуем пагинацию с помощью параметра paged в WP_Query и функций WordPress для пагинации.

Сначала получаем текущую страницу из запроса:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

Далее передаем в параметры:

$args['paged'] = $paged;
$args['posts_per_page'] = 10;
$query = new WP_Query($args);

После вывода таблицы добавим навигацию:

echo '<div class="wpquery-pagination">';
echo paginate_links([
    'total' => $query->max_num_pages,
    'current' => $paged,
    'format' => 'page/%#%/',
]);
echo '</div>';
<

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

Добавление сортировки по клику на заголовок таблицы

Для улучшения UX удобно сделать сортировку по столбцам таблицы. Реализовать это можно с помощью передачи параметров в URL и корректировки WP_Query.

Добавим в URL параметры orderby и order, например ?orderby=title&order=asc. В коде получим их так:

$orderby = isset($_GET['orderby']) ? sanitize_text_field($_GET['orderby']) : 'date';
$order = isset($_GET['order']) && in_array(strtoupper($_GET['order']), ['ASC', 'DESC']) ? strtoupper($_GET['order']) : 'DESC';

Передаем в WP_Query:

$args['orderby'] = $orderby;
$args['order'] = $order;

В заголовках таблицы формируем ссылки с переключением направления сортировки:

function wpquery_toggle_order($column) {
    $current_order = isset($_GET['order']) ? $_GET['order'] : 'asc';
    $new_order = ($current_order === 'asc') ? 'desc' : 'asc';
    return add_query_arg(['orderby' => $column, 'order' => $new_order]);
}

// В заголовке таблицы
<th><a href="' . wpquery_toggle_order('title') . '">Заголовок</a></th>
<

Пример использования плагина ABC Pagination для улучшенной пагинации

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

Для интеграции достаточно после вывода таблицы вызвать функцию:

if (function_exists('abc_pagination')) {
    abc_pagination($query->max_num_pages);
}

Плагин автоматически прочитает параметры пагинации и отобразит навигацию.

Оптимизация запроса и кеширование результатов

Для повышения производительности при больших объемах данных стоит предусмотреть кеширование результатов запроса. Один из подходов — использовать Transient API WordPress.

Пример кеширования результата WP_Query на 1 час:

$transient_key = 'wpquery_custom_posts_table';
$cached = get_transient($transient_key);
if (false === $cached) {
    $query = new WP_Query($args);
    ob_start();
    // вывод таблицы
    if ($query->have_posts()) {
        // код вывода таблицы из предыдущих разделов
    }
    $cached = ob_get_clean();
    set_transient($transient_key, $cached, HOUR_IN_SECONDS);
}
echo $cached;

Это минимизирует нагрузку на базу данных при частых обращениях.

Заключение

Кастомизация вывода таблицы постов с помощью WP_Query — мощный инструмент для создания удобных и функциональных интерфейсов в WordPress. Гибкость WP_Query позволяет подстроить выборку под любые задачи, а добавление сортировки, пагинации и метаданных значительно улучшает пользовательский опыт.

Используйте представленные примеры кода как основу для своих проектов и не забывайте об оптимизации и безопасности. Для расширения возможностей пагинации можно применять проверенные плагины, например, ABC Pagination.

WooCommerce: автоматическое удаление товаров после продажи
12.07.2026
Как создать автозаполняемую форму в WordPress с помощью AJAX и REST API
21.03.2026
WooCommerce: не отслеживаются заказы после обновления — решение проблемы
09.06.2026
Автоматическое создание Sitemap в WordPress: практические примеры и советы
07.03.2026
WooCommerce: как автоматически очищать корзину после отмены заказа
21.05.2026