WPForms: динамическое заполнение списков продуктов WooCommerce в формах WordPress

В чем задача динамического заполнения поля в WPForms продуктами WooCommerce

При создании форм заказа, обратной связи или опроса в интернет-магазине на WooCommerce часто возникает необходимость предоставить пользователю актуальный список продуктов для выбора. Статическое заполнение списка продуктов не подходит, так как ассортимент меняется, и поддерживать список вручную неудобно. В этой статье разберём, как автоматически подтягивать названия продуктов WooCommerce в поле выбора (select) WPForms, чтобы список всегда был актуальным.

Диагностика проблемы: почему стандартный список не работает

WPForms по умолчанию не умеет динамически подгружать данные из внешних источников. Поля типа Dropdown нужно заполнить вручную в редакторе форм. Если вы пытаетесь сделать это средствами WPForms без кода, список будет статичным и быстро устареет.

Проблемы, с которыми сталкиваются:

  • Список продуктов не обновляется автоматически при добавлении/удалении товаров в WooCommerce.
  • При попытке использовать пользовательский PHP-код без правильных хуков данные не подтягиваются или форма не выводится.
  • Проблемы с производительностью при загрузке большого каталога товаров.

Пошаговое решение: как динамически заполнить поле select WPForms продуктами WooCommerce

1. Создаем поле Dropdown в WPForms

Добавьте в форму поле Dropdown (выпадающий список), дайте ему уникальный CSS класс, например dynamic-products. Это поможет идентифицировать поле в коде.

2. Используем хук wpforms_field_select_choices для динамического заполнения

WPForms предоставляет фильтр wpforms_field_select_choices, который позволяет изменять список выбора полей Dropdown перед выводом формы.

Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:

add_filter('wpforms_field_select_choices', 'populate_products_dropdown', 10, 3);
function populate_products_dropdown($choices, $field, $form_data) {
    // Проверяем, что это нужное поле по CSS классу
    if (!empty($field['css']) && strpos($field['css'], 'dynamic-products') !== false) {
        $choices = [];
        // Получаем продукты WooCommerce (опубликованные, в наличии)
        $args = [
            'post_type' => 'product',
            'posts_per_page' => -1,
            'post_status' => 'publish',
            'meta_query' => [
                [
                    'key' => '_stock_status',
                    'value' => 'instock'
                ]
            ],
            'orderby' => 'title',
            'order' => 'ASC'
        ];
        $products = get_posts($args);
        foreach ($products as $product) {
            $choices[] = [
                'label' => $product->post_title,
                'value' => $product->ID
            ];
        }
    }
    return $choices;
}

3. Настройка формы и тестирование

Обновите форму. При загрузке страницы поле Dropdown теперь будет содержать список всех опубликованных и в наличии продуктов WooCommerce, отсортированных по названию.

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

  • Откройте страницу с формой.
  • В поле Dropdown должны отображаться актуальные продукты из каталога WooCommerce.
  • Добавьте новый продукт в WooCommerce с публикацией и статусом «в наличии» и обновите страницу — новый товар появляется в списке.
  • Удалите или измените статус продукта на «нет в наличии» — он пропадает из dropdown.

Частые ошибки и как их исправить

1. Пустой список в поле Dropdown

  • Проверьте, что у продуктов правильный статус: publish и instock.
  • Проверьте, что CSS класс поля указан верно и совпадает с тем, что используется в коде.
  • Ошибки PHP в коде — включите WP_DEBUG и проверьте логи.

2. Перегрузка сайта при большом количестве товаров

  • Добавьте пагинацию или ограничьте количество выводимых товаров (posts_per_page). Например, posts_per_page => 100.
  • Рассмотрите кеширование результата с помощью Transients API WordPress.

3. Форма не отображается или выводит ошибку

  • Ошибки в PHP-коде, неправильное использование хуков.
  • Конфликты с другими плагинами — временно отключите их для проверки.

Практические советы по безопасности и производительности

  • Используйте wp_cache_get и wp_cache_set или Transients API для кеширования списка продуктов на 1 час, чтобы снизить нагрузку на базу данных.
  • Обрабатывайте ошибки и проверяйте, что get_posts() возвращает массив.
  • В случае большого каталога рассмотрите альтернативы, например, автодополнение с AJAX вместо выпадающего списка.
  • Ограничьте доступ к формам, если в них чувствительные данные, с помощью возможностей WPForms или прав пользователей WordPress.

Пример кода с кешированием через Transients API

add_filter('wpforms_field_select_choices', 'populate_products_dropdown_cached', 10, 3);
function populate_products_dropdown_cached($choices, $field, $form_data) {
    if (!empty($field['css']) && strpos($field['css'], 'dynamic-products') !== false) {
        $cached = get_transient('wpforms_products_dropdown');
        if ($cached !== false) {
            return $cached;
        }
        $choices = [];
        $args = [
            'post_type' => 'product',
            'posts_per_page' => 100,
            'post_status' => 'publish',
            'meta_query' => [
                [
                    'key' => '_stock_status',
                    'value' => 'instock'
                ]
            ],
            'orderby' => 'title',
            'order' => 'ASC'
        ];
        $products = get_posts($args);
        foreach ($products as $product) {
            $choices[] = [
                'label' => $product->post_title,
                'value' => $product->ID
            ];
        }
        set_transient('wpforms_products_dropdown', $choices, HOUR_IN_SECONDS);
        return $choices;
    }
    return $choices;
}

Таблица сравнения подходов заполнения списка продуктов в WPForms

МетодПреимуществаНедостатки
Ручное заполнение в админке WPFormsПросто, не требует кодаНе обновляется автоматически, трудозатратно при большом каталоге
Динамическое заполнение через хук и get_posts()Автоматическое обновление, гибкостьНагрузка на БД при большом количестве товаров, требует кода
Динамическое заполнение с кешированием (Transients API)Снижает нагрузку, быстрый выводСложнее реализовать, возможна задержка обновления данных
WPForms и WooCommerce: автоматическая передача данных обязательных полей из формы в заказ
25.04.2026
WPForms и странные ошибки при отправке формы: диагностика и решение
28.05.2026
Как создать собственный шорткод для WPForms в WordPress
07.11.2025
WPForms: автоматическая обновление формы без перезагрузки страницы
10.03.2026
WPForms: как создать многостраничную форму в WordPress
09.01.2026