Как создать динамическое отображение товара WooCommerce по параметрам

Для многих сайтов на 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_ поможет избежать конфликтов с другими плагинами и упростит поддержку кода.

Автоматический отчет по активности пользователей в WordPress: как сделать и настроить
17.02.2026
Как автоматизировать управление ролями пользователей в WordPress с помощью кода
01.02.2026
WooCommerce: как установить ограничения на количество вариантов товара
03.06.2026
Как удалить или изменить авторские права в метаданных WordPress
08.02.2026
Как установить автоматическую защиту от Brute Force в WordPress
12.04.2026