Для многих сайтов на WordPress с WooCommerce важно не просто вывести товары в статичном виде, а сделать динамическое отображение товаров по заданным параметрам — категориям, атрибутам, цене или метаданным. В этой статье мы подробно разберём, как создать такой функционал с помощью собственного плагина и примеров кода. Это позволит вам вывести на любой странице или в любом месте сайта товары по нужным условиям, повысить удобство и эффективность магазина.
Что такое динамическое отображение товаров в WooCommerce
Динамическое отображение — это вывод товаров, который меняется в зависимости от заданных условий. Например, показать товары из определённой категории, с нужным атрибутом (цвет, размер), с ценой в заданном диапазоне или по метаданным (например, наличие скидки или особая характеристика). Такой подход позволяет создавать кастомные каталоги, подборки и лендинги с товарами без ручного обновления.
WooCommerce по умолчанию предлагает базовый шорткод [products] с параметрами, но он ограничен. Для более гибких задач лучше использовать WP_Query с классом WC_Product_Query или собственные запросы к базе данных.
Использование WP_Query и WC_Product_Query для динамического вывода
Для создания динамического вывода товаров в WooCommerce можно использовать класс WC_Product_Query. Он позволяет сформировать сложные запросы с фильтрацией по таксономиям, метаполям и другим параметрам.
Пример простого запроса, который выводит 5 товаров из категории «aksessuary» и с атрибутом «tsvet» = «krasnyj»:
function wptool_get_products_by_params() {
$args = [
'limit' => 5,
'category' => ['aksessuary'],
'attribute' => [
'pa_tsvet' => 'krasnyj'
],
'status' => 'publish'
];
$query = new WC_Product_Query($args);
$products = $query->get_products();
if (!empty($products)) {
echo '<ul class="wptool-products-list">';
foreach ($products as $product) {
echo '<li>';
echo '<a href="' . esc_url($product->get_permalink()) . '">' . esc_html($product->get_name()) . '</a>';
echo '</li>';
}
echo '</ul>';
} else {
echo '<p>Товары не найдены.</p>';
}
}
Такую функцию можно вызывать в любом шаблоне или подключать через шорткод, чтобы выводить товары по заданным параметрам.
Добавление поддержки фильтрации по метаполям
Для более тонкой настройки, например, если у товаров есть свои метаполя (custom fields), можно добавить аргументы meta_query в запрос:
function wptool_get_products_by_meta() {
$args = [
'limit' => 10,
'status' => 'publish',
'meta_query' => [
[
'key' => '_wptool_special_offer',
'value' => 'yes',
'compare' => '='
]
]
];
$query = new WC_Product_Query($args);
$products = $query->get_products();
if ($products) {
foreach ($products as $product) {
echo '<div>' . esc_html($product->get_name()) . '</div>';
}
} else {
echo '<p>Нет специальных предложений.</p>';
}
}
В данном примере выводятся товары, у которых метаполе _wptool_special_offer равно «yes».
Создание шорткода для динамического вывода с параметрами
Чтобы удобнее использовать динамический вывод в редакторе, создадим шорткод с параметрами, который через атрибуты принимает фильтры и выводит товары.
function wptool_products_shortcode($atts) {
$atts = shortcode_atts([
'category' => '',
'attribute' => '',
'limit' => 5
], $atts, 'wptool_products');
$args = [
'limit' => intval($atts['limit']),
'status' => 'publish'
];
if (!empty($atts['category'])) {
$args['category'] = explode(",", $atts['category']);
}
if (!empty($atts['attribute'])) {
$attribute_pairs = explode(';', $atts['attribute']);
$attr_array = [];
foreach ($attribute_pairs as $pair) {
list($key, $value) = explode(':', $pair);
$attr_array[trim($key)] = trim($value);
}
$args['attribute'] = $attr_array;
}
$query = new WC_Product_Query($args);
$products = $query->get_products();
ob_start();
if (!empty($products)) {
echo '<ul class="wptool-products-list">';
foreach ($products as $product) {
echo '<li><a href="' . esc_url($product->get_permalink()) . '">' . esc_html($product->get_name()) . '</a></li>';
}
echo '</ul>';
} else {
echo '<p>Товары не найдены.</p>';
}
return ob_get_clean();
}
add_shortcode('wptool_products', 'wptool_products_shortcode');
Пример использования шорткода в редакторе WordPress:
[wptool_products category="aksessuary" attribute="pa_tsvet:krasnyj" limit="3"]
Это выведет до 3-х товаров из категории «aksessuary» с атрибутом цвет красный.
Оптимизация и кэширование динамического вывода
При динамическом выводе товаров с помощью PHP-запросов важно учитывать нагрузку на сервер. Чтобы ускорить работу и снизить запросы к базе, рекомендуется использовать кэширование. Например, можно кэшировать HTML-вывод шорткода с помощью Transients API WordPress.
function wptool_products_shortcode_cached($atts) {
$cache_key = 'wptool_products_cache_' . md5(serialize($atts));
$output = get_transient($cache_key);
if ($output === false) {
$output = wptool_products_shortcode($atts);
set_transient($cache_key, $output, HOUR_IN_SECONDS);
}
return $output;
}
remove_shortcode('wptool_products');
add_shortcode('wptool_products', 'wptool_products_shortcode_cached');
Такой приём позволяет хранить результат работы функции в кэше на час и избавляет от частых запросов к базе.
Полезные плагины для расширения функционала WooCommerce
Для удобства работы с динамическим выводом и фильтрацией товаров можно использовать следующие плагины:
- Clearfy Pro — расширяет возможности оптимизации и управления WooCommerce, содержит функции для улучшения запросов.
- ABC Pagination — удобный плагин для кастомной пагинации товаров, если вы выводите много товаров динамически.
- WPRemark — для создания автоматических отчетов и аналитики по динамическим подборкам товаров.
Советы по отладке и расширению функционала
При работе с динамическим выводом товаров рекомендуем:
- Использовать дебаг-логи и вывод ошибок для отладки SQL-запросов и WP_Query.
- Тестировать запросы с разными параметрами, чтобы убедиться, что фильтрация работает корректно.
- Расширять функционал, добавляя поддержку сортировки, пагинации и AJAX-загрузки.
- Следить за производительностью — динамические запросы с метаполями могут быть медленными при большом каталоге.
Создание кастомных функций с приставкой wptool_ поможет избежать конфликтов с другими плагинами и упростит поддержку кода.