Диагностика задачи: зачем нужна автоматическая подстановка цен и остатков в WPForms
В интернет-магазинах на WooCommerce часто возникает необходимость собирать дополнительные данные от клиента через формы, созданные в WPForms. Например, форма запроса цены, заказа с доп. опциями или обратной связи с указанием конкретного товара. Чтобы избежать ошибок и дублирования данных, нужно автоматически подставлять актуальные цены и остатки товаров из WooCommerce прямо в поля формы WPForms.
Проблема в том, что по умолчанию WPForms не умеет динамически подтягивать эти данные из каталога WooCommerce, и приходится делать это вручную или использовать сторонние плагины с ограничениями.
Как проверить текущее состояние и подготовить среду
- Убедитесь, что установлены и активированы WPForms и WooCommerce последней версии.
- Создайте тестовый товар в WooCommerce с уникальным артикулом, ценой и количеством на складе.
- Создайте форму WPForms с полями для отображения цены (числовое поле) и наличия (текстовое поле).
- Включите режим отладки в WordPress (define('WP_DEBUG', true);) для мониторинга ошибок.
Пошаговое решение: динамическая подстановка цены и наличия по ID товара
1. Добавление пользовательских полей для ID товара в форме
Добавьте в форму скрытое поле, куда будет передаваться ID товара (например, через GET-параметр или shortcode с параметром). Это позволит однозначно идентифицировать товар.
2. Подключение PHP-кода для подстановки данных из WooCommerce
В файле functions.php вашей темы или в отдельном плагине добавьте следующий код:
add_filter('wpforms_process_before_form_data', function( $form_data, $fields, $entry, $form_id ) {
// Проверяем ID формы, чтобы не влиять на все формы
if ( $form_id !== 123 ) { // замените 123 на ID вашей формы
return $form_data;
}
// Получаем ID товара из поля формы (например, поле с ключом 'product_id')
$product_id = isset( $_POST['wpforms']['fields']['product_id'] ) ? intval( $_POST['wpforms']['fields']['product_id'] ) : 0;
if ( !$product_id ) {
return $form_data;
}
// Получаем объект продукта WooCommerce
$product = wc_get_product( $product_id );
if ( !$product ) {
return $form_data;
}
// Получаем цену и остаток
$price = $product->get_price();
$stock = $product->get_stock_quantity();
// Записываем эти данные в поля формы
foreach ( $fields as $field_id => $field ) {
if ( $field['name'] === 'price' ) {
$_POST['wpforms']['fields'][$field_id] = wc_price( $price );
}
if ( $field['name'] === 'stock' ) {
$_POST['wpforms']['fields'][$field_id] = $stock !== null ? $stock : 'Нет в наличии';
}
}
return $form_data;
}, 10, 4);Обратите внимание, что в этом примере мы используем фильтр wpforms_process_before_form_data чтобы подставить значения до обработки формы, а также обращаемся к полям по имени (price и stock).
3. Передача ID товара в форму через шорткод
Если форма размещается на странице товара, можно передавать ID товара динамически через шорткод:
[wpforms id="123" field_id="product_id" field_value="{post_id}"]Где field_id="product_id" — ID скрытого поля в форме, а {post_id} — динамический тег WordPress с ID текущего поста (товара).
Проверка результата
- Откройте страницу товара с формой.
- Убедитесь, что в форме автоматически отображается актуальная цена и количество товара.
- Отправьте форму и проверьте, что данные сохраняются и отправляются корректно.
- Проверьте логи ошибок WP_DEBUG, чтобы исключить PHP ошибки.
Частые ошибки и как их исправить
- Неверный ID формы или полей: Проверьте, что ID формы и имена полей совпадают с используемыми в коде.
- Отсутствие товара или неправильный ID: Убедитесь, что ID товара передается корректно и товар существует в WooCommerce.
- Поля не обновляются после отправки: Используйте фильтр
wpforms_process_before_form_data, а не хуки, срабатывающие после обработки. - Кэширование формы: Отключите кэширование страницы с формой или используйте AJAX-отправку WPForms для динамического обновления.
Практические советы по производительности и безопасности
- Кэшируйте цены и остатки товаров на уровне объекта, если данные не меняются часто, чтобы уменьшить нагрузку на БД.
- Используйте nonce-поля WPForms для защиты от CSRF при отправке форм.
- Ограничьте доступ к форме только авторизованным пользователям, если данные чувствительны.
- Проверяйте входящие данные на стороне сервера, например, ID товара, чтобы избежать инъекций и ошибок.
Альтернативные способы реализации: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Кастомный PHP-код | Точный контроль, нет лишних плагинов, можно адаптировать под задачи | Требует навыков, возможны ошибки при обновлениях |
| Сторонние плагины для интеграции WPForms и WooCommerce | Простота настройки, готовые функции | Могут быть платными, ограниченная гибкость, лишняя нагрузка на сайт |