В WordPress часто возникает задача создать страницу, которая выводит записи не просто в хронологическом порядке, а с фильтрацией и сортировкой по кастомным мета полям. Например, на сайте с каталогом товаров или услуг нужно вывести список только с определёнными параметрами, которые хранятся в мета данных записей. В этом материале мы подробно рассмотрим, как сделать такую динамическую выводную страницу самостоятельно, используя стандартные возможности WordPress и немного PHP-кода.
Что такое мета записи и зачем они нужны в выводе страниц
Мета записи (post meta) — это дополнительные данные, которые можно прикрепить к любой записи (post) или типу записи (custom post type) в WordPress. Они позволяют хранить структурированную информацию, например, цену товара, рейтинг, дату события, адрес и многое другое.
Использование мета данных для вывода позволяет создавать гибкие фильтры и кастомные страницы, которые выводят записи с учётом значений этих полей. В стандартных циклах WordPress (WP_Query) есть возможность запрашивать записи по мета данным, что открывает широкие возможности для кастомизации.
Например, на сайте wpstock.ru можно создать страницу, которая выводит только записи, у которых мета поле price меньше 1000 рублей, или только записи с определённым статусом.
Создание WP_Query с мета запросами: базовые примеры
Для начала разберём простой пример — вывод записей с мета полем wpstock_price меньше 1000. Для этого нужно использовать параметр meta_query в WP_Query.
$args = [
'post_type' => 'post',
'meta_query' => [
[
'key' => 'wpstock_price',
'value' => 1000,
'compare' => '<',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);Данный запрос вернёт все записи, у которых в мета поле wpstock_price значение меньше 1000. Очень важно указывать параметр type, чтобы сравнение происходило как по числам, иначе сравнение будет строковым и результат может быть неправильным.
Далее можно вывести эти записи в цикле:
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$price = get_post_meta(get_the_ID(), 'wpstock_price', true);
echo '<h3>' . get_the_title() . '</h3>';
echo '<p>Цена: ' . esc_html($price) . '</p>';
}
wp_reset_postdata();
} else {
echo '<p>Записей не найдено.</p>';
}Как создать отдельный шаблон для динамической выводной страницы
Чтобы выводить записи с мета фильтром на отдельной странице, создадим шаблон страницы в вашей теме. Назовём его, например, page-wpstock-filter.php.
В начале файла должен быть стандартный заголовок шаблона:
<?php
/*
Template Name: WPStock Фильтр по мета
*/
?>Далее создаём WP_Query с нужными параметрами, о которых говорили выше. Пример полного шаблона:
<?php
/* Template Name: WPStock Фильтр по мета */
get_header();
$args = [
'post_type' => 'post',
'meta_query' => [
[
'key' => 'wpstock_price',
'value' => 1000,
'compare' => '<',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);
?>
<main>
<h1>Записи с ценой меньше 1000</h1>
<div class="wpstock-list">
<?php if ($query->have_posts()) : ?>
<ul>
<?php while ($query->have_posts()) : $query->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> - Цена: <?php echo esc_html(get_post_meta(get_the_ID(), 'wpstock_price', true)); ?></li>
<?php endwhile; ?>
</ul>
<?php wp_reset_postdata(); ?>
<?php else : ?>
<p>Записей не найдено.</p>
<?php endif; ?>
</div>
</main>
<?php get_footer(); ?>Теперь достаточно создать страницу в админке WordPress и выбрать в шаблоне этот файл, чтобы получить динамическую страницу с фильтром по мета полю.
Использование плагинов для управления мета полями и фильтрации
Реализовать мета поля вручную можно через код, но удобнее и быстрее использовать плагины. Вот несколько полезных:
- Advanced Custom Fields (ACF) — позволяет создавать и управлять мета полями через удобный интерфейс.
- Meta Box — аналог ACF с поддержкой кастомных типов полей и расширений.
- FacetWP — плагин для гибкой фильтрации записей по мета данным, таксономиям и другим параметрам.
Например, с ACF можно быстро создать поле wpstock_price и заполнить данные при редактировании записи. После этого использовать код из примеров выше для выборки.
Плагин FacetWP значительно упростит создание интерактивных фильтров на фронтенде без дополнительного программирования.
Как сделать универсальный фильтр с несколькими условиями в WP_Query
Иногда нужно фильтровать записи не по одному, а по нескольким мета полям, например, по цене и рейтингу. Для этого в meta_query передаётся массив массивов с условиями, а параметр relation определяет логику (AND или OR).
$args = [
'post_type' => 'post',
'meta_query' => [
'relation' => 'AND',
[
'key' => 'wpstock_price',
'value' => 1000,
'compare' => '<',
'type' => 'NUMERIC'
],
[
'key' => 'wpstock_rating',
'value' => 4,
'compare' => '>=',
'type' => 'NUMERIC'
]
]
];
$query = new WP_Query($args);Это запрос вернёт записи с ценой меньше 1000 и рейтингом не ниже 4. Такой подход позволяет строить сложные фильтры и создавать удобные пользовательские интерфейсы.
Оптимизация запросов с мета полями
Запросы по мета данным могут быть ресурсоёмкими, особенно при большом количестве записей. Чтобы избежать проблем с производительностью:
- Используйте индексы в базе данных для таблицы
wp_postmeta. - Кешируйте результаты запросов с помощью встроенного Object Cache или плагинов кеширования.
- По возможности сокращайте выборку полей и избегайте сложных сравнений.
Если сайт wpstock.ru начнёт активно использовать такие фильтры, стоит обратить внимание на масштабируемость и правильное структурирование данных.
Заключение
Создание динамической выводной страницы с использованием мета записей — мощный инструмент для кастомизации WordPress. С его помощью можно создавать каталоги, фильтры, и многое другое без сложных плагинов. В этом материале вы получили понятные примеры и рекомендации для реализации таких страниц на вашем сайте.