Skip to content

Все для WordPress, веб-розробки — і не тільки

📋 Contact Form 7 у 2 і більше стовпців: flexbox і shortcode-підхід

📋 Contact Form 7 у 2 і більше стовпців: flexbox і shortcode-підхід

Стандартна форма Contact Form 7 — це вертикальна колонка полів. Ім’я, email, тема, повідомлення, одне під одним, розтягнуті на всю ширину. Виглядає грубо й з’їдає місце на екрані, особливо якщо полів більше трьох.

Але є нюанс: редактор CF7 розуміє HTML. А отже, поля можна обгорнути в div-контейнери, задати їм ширину та вирівняти в ряд. Без плагінів, без хаків, на чистому CSS.

Нижче наведено два робочі способи розкласти поля Contact Form 7 у 2, 3 або 4 колонки. Перший, універсальний (HTML + CSS), другий, через шорткод-систему теми. Обидва перевірені на живих сайтах і не ламають верстку на мобільних.

💡 Швидкий огляд:

  • Подивіться, як виглядає форма CF7 за замовчуванням і в чому проблема вертикальної розкладки
  • Скопіюйте готовий CSS flexbox і вставте в дочірню тему, метод 1, без плагінів
  • Якщо тема вже вміє колонки через шорткоди, увімкніть їхню підтримку в CF7 та обгорніть поля, метод 2
  • Перевірте результат на десктопі та мобільних, media-query в комплекті

Як виглядає форма Contact Form 7 за замовчуванням

Після створення форми через «Контактні форми» → «Додати нову» ви отримуєте стандартну розмітку: текстові поля, email, повідомлення та кнопка надсилання, строго одне під одним. У редакторі це виглядає так:

Стандартна розмітка Contact Form 7 у редакторі

На фронтенді, з темою TwentySeventeen або будь-якою іншою без кастомної стилізації форм, вивід буде вертикальним:

Вертикальний вивід полів Contact Form 7 на сайті

Поля «Ім’я» та «Email» займають усю доступну ширину, хоча кожному з них вистачило б половини. Як наслідок, форма виглядає громіздко, користувач скролить більше, ніж потрібно, конверсія знижується.

Редактор CF7 спроєктований так, що допускає HTML-розмітку всередині шаблону форми. Саме це ми й використовуємо.

Метод 1: HTML + CSS flexbox (рекомендований)

Суть методу: обгортаємо поля форми в <div> з CSS-класами колонок, а самі класи прописуємо один раз у дочірній темі або через плагін кастомного CSS.

Жодних додаткових плагінів для колонок не потрібно, лише CF7 і кілька рядків CSS.

CSS-сітка для 2 і 3 колонок

Нижче наведено готовий CSS з flexbox. На відміну від float-рішень, flex автоматично вирівнює колонки за висотою і не потребує clearfix-милиць:

1/* Строка колонок */
2.cf7-row {
3 display: flex;
4 flex-wrap: wrap;
5 gap: 4%;
6 margin-bottom: 16px;
7}
8
9/* 2 колонки */
10.cf7-col-2 {
11 flex: 0 0 48%;
12}
13
14/* 3 колонки */
15.cf7-col-3 {
16 flex: 0 0 30.66%;
17}
18
19/* Мобильные: колонки — одна под другой */
20@media only screen and (max-width: 767px) {
21 .cf7-col-2,
22 .cf7-col-3 {
23 flex: 0 0 100%;
24 }
25}

CSS потрібно розмістити в дочірній темі (файл style.css) або через плагін Simple Custom CSS, він додає поле для стилів в адмінці, без правки файлів.

Розмітка всередині CF7

Відкрийте редактор форми (Контактні форми → ваша форма) та обгорніть поля в div-контейнери з класами з CSS вище. Для 2 колонок:

1<div class="cf7-row">
2 <div class="cf7-col-2">
3 <label>Ваше имя (обязательно)
4 [text* your-name]
5 </label>
6 </div>
7 <div class="cf7-col-2">
8 <label>Ваш Email (обязательно)
9 [email* your-email]
10 </label>
11 </div>
12</div>
13
14<label>Ваше сообщение
15 [textarea your-message]
16</label>
17
18[submit "Отправить"]

На сайті результат буде таким:

Форма Contact Form 7 з двома полями в ряд

Три колонки, та сама логіка

Для трьох полів у ряд міняємо класи на cf7-col-3 і додаємо третій блок:

1<div class="cf7-row">
2 <div class="cf7-col-3">
3 <label>Ваше имя (обязательно)
4 [text* your-name]
5 </label>
6 </div>
7 <div class="cf7-col-3">
8 <label>Ваш Email (обязательно)
9 [email* your-email]
10 </label>
11 </div>
12 <div class="cf7-col-3">
13 <label>Тема
14 [text your-subject]
15 </label>
16 </div>
17</div>
18
19<label>Ваше сообщение
20 [textarea your-message]
21</label>
22
23[submit "Отправить"]

Виведення на фронтенді:

Три поля Contact Form 7 в одному рядку

Поля «Ім’я», «Email» і «Тема» вишикувалися в один рядок, а повідомлення, на всю ширину під ними. На екранах до 767px усі колонки згортаються в одну, форма залишається читабельною на телефоні.

Плюс flexbox-підходу: якщо висота полів різна (наприклад, довгий label в одній колонці), рядок не розвалюється, flex вирівнює колонки автоматично. Float-верстка такого не вміє без clearfix і танців із margin-right.

Метод 2: shortcode-колонки теми

Частина тем WordPress, особливо комерційні, як-от GeneratePress, Kadence, Astra, постачаються зі вбудованою shortcode-системою для колонок. Виглядає це як кнопка в редакторі, що генерує шорткоди виду [one_half]...[/one_half] або [column grid="6"]...[/column].

Якщо ваша тема це вміє, колонки для CF7 робляться без CSS. Але потрібно дозволити CF7 обробляти шорткоди всередині форми, за замовчуванням він їх ігнорує.

Крок 1: увімкнути шорткоди в редакторі CF7

Встановлюємо плагін Contact Form 7 Shortcode Enabler, він мінімалістичний, важить кілька кілобайт і робить рівно одну річ: пропускає шорткоди через CF7.

Альтернатива без плагіна, фільтр у functions.php дочірньої теми:

1add_filter('wpcf7_form_elements', 'cf7_do_shortcode');
2
3function cf7_do_shortcode($form) {
4 return do_shortcode($form);
5}

Крок 2: обгорнути поля шорткодами колонок

Принцип той самий, що з div-класами, але замість CSS-класів використовуються шорткоди теми. Кнопка генерації зазвичай знаходиться у візуальному редакторі WordPress:

Кнопка генерації шорткодів колонок у редакторі WordPress

Генеруємо шорткоди під потрібну кількість колонок і вставляємо контент:

Шорткоди колонок із вкладеним контентом

Виведення на сторінці:

Результат виведення контенту у дві колонки через шорткоди

Тепер переносимо шорткоди в редактор CF7. Для 2 полів у ряд:

1[one_half]
2<label>Ваше имя (обязательно)
3 [text* your-name]
4</label>
5[/one_half]
6
7[one_half_last]
8<label>Ваш Email (обязательно)
9 [email* your-email]
10</label>
11[/one_half_last]
12
13<label>Ваше сообщение
14 [textarea your-message]
15</label>
16
17[submit "Отправить"]

Результат на фронтенді, ті самі дві колонки, що й у методі 1. Підхід зручний, коли тема вже має короткі коди для сітки: не потрібно писати CSS, уся адаптивність іде з коробки.

Мінус: ви прив’язані до теми. Зміните тему, shortcode-колонки зникнуть, форма розвалиться. Метод 1 із CSS переноситься між будь-якими темами.

Відео: покрокове налаштування multi-column форми

Детальний відеорозбір англійською, автор показує обидва підходи, включно з налаштуванням flexbox та адаптацією під мобільні:

⁉️🤔 Часті запитання

Чи працює flexbox-розмітка в старих браузерах?

Flexbox підтримується всіма сучасними браузерами вже понад десять років: Chrome, Firefox, Safari та Edge, повна сумісність без префіксів починаючи з версій, що вийшли у 2015-2016 роках. Єдиний виняток, Internet Explorer 11, де flexbox працює з дрібними багами й потребує префікса -ms-, але частка IE11 у світовому трафіку впала нижче статистичної похибки. Для production-сайтів flexbox безпечний без префіксів.

Чи можна зробити різну кількість колонок у різних рядках форми?

Так. Flexbox-контейнер .cf7-row ізолює рядок: усередині нього можуть бути 2, 3 або 4 колонки, а наступний рядок, інша комбінація. Наприклад, перший рядок, ім’я + email (2 колонки), другий, компанія + телефон + місто (3 колонки), третій, повідомлення на всю ширину. Головне, закрити один .cf7-row перед відкриттям наступного.

Що робити, якщо лейбли полів різної довжини й колонки з’їжджають?

У flexbox-рядку колонки за замовчуванням розтягуються на висоту найвищої. Явно це вмикається властивістю align-items: stretch (у коді вище вона активна за замовчуванням). Якщо лейбли все одно візуально пливуть, задайте фіксовану висоту лейбла через label { min-height: 48px; display: block; } усередині форми.

Чи потрібно вмикати шорткоди для методу 1 із CSS?

Ні. Метод 1 використовує чистий HTML (div-контейнери з класами), CF7 пропускає HTML-розмітку без додаткових плагінів. Плагін Shortcode Enabler потрібен лише для методу 2, де всередині форми використовуються shortcode-колонки теми.

Як бути, якщо тема використовує Gutenberg, а не шорткоди?

Gutenberg-колонки працюють на рівні сторінки/запису, але не всередині редактора CF7. Сама форма CF7 вставляється шорткодом [contact-form-7 id="..." title="..."] на сторінку, і Gutenberg не керує версткою полів усередині неї. Для колонок усередині форми використовуйте метод 1 (CSS flexbox), він сумісний із будь-яким редактором.

Чи варто морочитися з колонками?

Форма в одну колонку працює. Форма у дві колонки, працює і збирає більше відправок, тому що виглядає охайніше й потребує менше скролу. Різниця в конверсії на перший погляд копійчана, але на дистанції, десятки лідів.

Flexbox-метод закриває задачу повністю: 15 рядків CSS, 5 хвилин налаштування, нуль плагінів. Він не прив’язаний до теми, не ламається під час оновлення рушія й не плодить залежностей. Якщо тема вже вміє ділити контент на колонки, shortcode-підхід теж працює, просто пам’ятайте про плагін-активатор шорткодів і про те, що зі зміною теми колонки зникнуть.

Обидва способи протестовані на CF7 версії 6.1 і вище, з WordPress 6.5+. Працюють на продакшені без сюрпризів.