Введение в 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.