Как использовать динамические данные в форме Contact Form 7?

Как использовать динамические данные в форме Contact Form 7?
Автор:
Руслан Шкарбан — автор статьи Руслан Шкарбан
25
#Кейсы

Contact Form 7 (CF7) — это популярный бесплатный плагин для CMS WordPress, предназначенный для создания и управления контактными формами на сайте. В репозитории WordPress, на момент написания, плагин имеет оценку 4/5 звезд и количество установок более 10 млн. Узнать больше информации о плагине можно на официальном сайте.

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

"Оживлять" форму мы будем на примере сайтов двух наших клиентов: Триггермед и Мебель «Марс». На обоих сайтах стояла схожая задача по добавлению динамических параметров в формы обратной связи, которые вызываются на разных страницах. Несмотря на однотипность задачи, для каждого сайта мы решили её по-разному.

Для выполнения задачи на Триггермеде мы использовали плагин Contact Form 7 — Dynamic Text Extension, а для Мебель "Марс" чистый JavaScript. Решения равнозначны и отличаются только подходом, рассмотрим каждое.

Способ 1: Contact Form 7 — Dynamic Text Extension и регистрация шорткода

Contact Form 7 — Dynamic Text Extension — это бесплатное расширение для плагина Contact Form 7, которое добавляет возможность создавать динамические поля в формах. Благодаря плагину можно получать в форме параметры URL, куки, данные пользователя, кастомные поля. На момент написания, плагин имеет более 100 тысяч установок и оценку 4.7 балла в репозитории WordPress. Обратите внимание, что данный плагин создан сторонним разработчиком и не имеет прямого отношения к CF7, поэтому на официальном сайте вы не найдёте упоминания о нём.

Задача - Добавить в форму название товара

Триггермед - компания, которая занимается продажей медицинского оборудования. Задача стояла следующая: на странице конкретного товара требовалось добавить форму обратной связи, в которую бы подставлялся текст: "Ожидаю коммерческое предложение на товар - [Название товара].". Разумеется, название товара является динамическим параметром и меняется в каждом из товаров.

Устанавливаем плагин

В репозитории расширений WP находим Contact Form 7 — Dynamic Text Extension, устанавливаем и активируем. Если процесс прошел успешно, то на вкладке плагина появится дополнительный пункт меню Dynamic Text Extension.

Появилась вкладка с настройками плагина

После установки в настройках форм Contact Form 7 появится возможность использовать дополнительные поля.

До активации плагина

Появилась вкладка с настройками плагина

После активации плагина

Появилась вкладка с настройками плагина

Почитать о появивщихся полях можно в документации расширения для плагина.

Мы будем использовать поле [dynamic_textarea* dynamic_textarea-546 rows:5 cols:33 class:form-control "ctr99_display_product_title"], поясним параметры, которые в нем используем:

Регистрируем шорткод для вывода названия товара

Чтобы вывести нужный текст в поле формы мы использовали шорткод. Если не знакомы с функционалом шорткодов в WP, то рекомендуем заглянуть в документацию.

В коде мы создаём шорткод [ctr99_display_product_title], который выводит нужную фразу, динамично подставляя к ней название товара с учетом названий с кавычками и без.

                
//Шорткод для отображения в форме названия товара
function ctr99_page_title_shortcode_init() {
    add_shortcode('ctr99_display_product_title', 'ctr99_page_title_shortcode');
}
add_action('init', 'ctr99_page_title_shortcode_init');

function ctr99_page_title_shortcode() {
    $page_title = get_the_title();
    $escaped_title = ' Ожидаю коммерческое предложение на товар - ' . htmlspecialchars($page_title, ENT_QUOTES | ENT_HTML401, 'UTF-8') . '.';
    return htmlspecialchars_decode($escaped_title, ENT_QUOTES);
}
                
            

Используем шорткод в форме

Добавив нужный шорткод мы снова возвращаемся к работе с формой, а конкретнее в настройки Contact Form 7 - Dynamic Text Extension. Находим поле "User Data Key Allow List" и добавляем туда название нашего шорткода. На этом поле остановимся чуть подробнее, оно ограничивает доступ к конфиденциальным данным пользователей (логины, почта, роли) через формы сайта. По умолчанию все ключи заблокированы для безопасности, на свое усмотрение мы можем добавлять необходимые данные. Чтобы узнать все подробности, лучше обратится к документации.

Поле User Data Key Allow List

Проверяем работу

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

Если ошибок не допущено, в поле комментария формы появится статичный текст и динамическое название товара. Проверим:

Пример добавленного функционала, товар 1
Пример добавленного функционала, товар 2

Таким образом, для Триггермеда мы выполнили задачу. Она достаточно простая и требует лишь изучения плагина, расширяющего работу формы Contact Form 7. Перейдем к следующему, чуть более сложному и динамичному варианту.

Способ 2: JavaScript

К этому решению мы пришли после того, как поняли, что предыдущий вариант не работает, когда на странице может быть несколько динамичных параметров.

Задача - добавить в форму название тарифа по которому был клик

Мебель «Марс» - занимаются производством корпусной мебели на заказ. Задача стояла следующая: на странице конкретной услуги, например, на производстве гардеробных выводятся тарифы, по которым можно произвести расчет стоимости данного типа мебели. Проще говоря, при клике на тариф 'Стандарт' должна открыться форма с текстом "Пожалуйста, рассчитайте мне точную стоимость изготовления типа мебели «Гардеробные», тариф «Стандарт».", в данном тексте несколько динамичных параметров - тип мебели и название тарифа. Тип мебели мы можем получить при загрузке страницы. А вот тариф становится известен только при клике на конкретный тариф.

Чтобы реализовать данный функционал нам требуется доработка кода. Рассмотрим процесс:

Решение

Наш блок представляет из себя ряд из возможных тарифов для изготовления данного типа мебели. Чтобы отслеживать клик на конкретный тариф мы добавим динамичные параметры для кнопок.

    
<a href="#" class="btn-red" data-bs-toggle="modal" data-bs-target="#formTariff"
data-title="<?= $term_title; ?>" data-rate="<?= $rate['name']; ?>">Рассчитать стоимость</a>
    

Чтобы избежать недосказанности, мы пояснили все параметры ссылки, но для динамики нам обязательно нужны только два: data-rate и data-title, в которых мы передаем название типа мебели и тариф. В нашем случае мы используем php переменные, чтобы обеспечить максимальную динамику в передаче данных, в своем коде вы можете передавать и просто строку.

Отслеживаем клик

Данный код мы запускаем после загрузки страницы и отслеживаем клик на ссылку с .btn-red. Затем, из дата-атрибутов получаем название типа мебели и название тарифа. Полученные данные подставляем в шаблонный текст и вставляем в форму из CF7.

    
document.addEventListener("DOMContentLoaded", function () {
    document.querySelectorAll(".btn-red").forEach(button => {
        button.addEventListener("click", function () {
            let furnitureType = this.getAttribute("data-title");
            if (!furnitureType) return;

            let rateName = this.getAttribute("data-rate");
            if (!rateName) return;

            let dynamicText = `Пожалуйста, рассчитайте мне точную стоимость изготовления типа мебели «${furnitureType}», тариф «${rateName}».`;

            let textarea = document.querySelector('[name="textarea-834"]');
            if (textarea) {
                textarea.value = dynamicText;
                textarea.dispatchEvent(new Event("change")); // Принудительное обновление CF7
            }
        });
    });
});
    

Таким образом, мы получаем необходимый функционал:

Динамичное подставление параметра

Подводим итоги

Таким образом, мы реализовали передачу динамичных параметров в веб-формах несколькими методами: через расширение для плагина Contact Form 7 — Dynamic Text Extension и на чистом JavaScript. Оба способа могут быть использованы в зависимости от задачи. Если на сайте активно поддерживаются шорткоды и нужно передавать не меняющуюся у пользователя информацию, например, заголовок страницы, то можно использовать шорткод. Если хочется больше динамики и нет желания устанавливать лишние плагины, то лучше написать небольшой JS-скрипт.