Створення своїх тегів форми (шорткод)
- Всі функції Contact Form 7
- Всі Хуки Contact Form 7
- Усі поля (теги) форми
- Як зробити обов’язковим одне з полів: пошта або телефон
- Поради, хакі, секрети
- Створення своїх тегів форми (шорткод)
- Збереження форми CF7 до таблиці Notion
- Conditional Fields for Contact Form 7 аддон
- Contact form 7 Custom validation аддон
Нижче описані нижче дії створять довільні теги, які потім можна буде використовувати в шаблоні форми Contact Form 7. Це розширить можливості плагіна і виведе їх на новий рівень. Однак для цього вам потрібно мати деякі навички програмування і чітко розуміти , як створюються шорткоди в WordPress , так як створення шорткоду для Contact Form 7 проводиться за аналогією.
Створити свій шорткод у Contact Form 7 можна кількома шляхами, кожен із них має плюси та мінуси. Розглянемо кожен окремо.
Додавання тега форми (шорткоду) до Contact Form 7 (варіант 1)
У вихідниках плагіна CF7 є функція wpcf7_add_form_tag() . Вона повністю повторює функціонал стандартної функції WordPress add_shortcode() . Тому додавання свого нового тега форми Contact Form 7 аналогічне до звичайного додавання шорткоду для запису в WordPress.
Для цього додамо наступний код у functions.php :
function hello_world_cf7_func() { return "Привіт! Я шорткод для Contact Form 7!"; } wpcf7_add_form_tag('hello_world', 'hello_world_cf7_func');
Ви можете зареєструвати шорткод з ім’ям hello-world
, але в шаблоні форми все одно треба писати hello_world
, тому що CF7 очищає імена шорткодів наступним кодом:
$tag = preg_replace( '/[^a-zA-Z0-9_*]+/', '_', $tag ); $ tag = rtrim ($ tag, '_'); $tag = strtolower($tag);
Тепер використовуємо створений щойно тег форми [hello_world] у шаблоні форми. При перегляді він буде перетворений на:
<p>Привіт! Я шорткод для Contact Form 7!</p>
Як видно, наш текст обернувся на <p>
тег. Щоб заборонити обгортку, використовуйте константу WPCF7_AUTOP .
особливості:
- Шорткод (тег) працюватиме лише у формі CF7, але не в записах WP.
- Шорткод (тег) не працюватиме у шаблоні листа: на пошту прийде текст [hello_world].
У CF7 є ще застарілий аналог функції wpcf7_add_form_tag() – це wpcf7_add_shortcode() . Використовувати її не рекомендується, хоча вона продовжує працювати.
Додавання тега форми (шорткоду) до Contact Form 7 (варіант 2)
За умовчанням, шорткод WordPress не працюють в Contact Form 7, але це легко поправити за допомогою фільтра:
add_filter( 'wpcf7_form_elements', 'do_shortcode');
Додавши такий хук, ми можемо створити звичайний шорткод WordPress за допомогою add_shortcode() і він буде працювати у формі CF7:
function hello_world_cf7_func() { return "Привіт! Я шорткод для Contact Form 7!"; } add_shortcode('hello_world', 'hello_world_cf7_func');
особливості:
- Шорткод працюватиме як у постах, так і у формах.
- Шорткод не буде перетворено на шаблон листа. На пошту прийде текст
[hello_world]
.
Цей код був підглянутий у плагіні Contact Form 7 Shortcode Enabler .
Включаємо роботу тега форми (шорткоду) у шаблоні листа
Зробити це можна через фільтр wpcf7_mail_components :
add_filter('wpcf7_mail_components', 'do_shortcode_mail', 10, 3); function do_shortcode_mail( $components, $contactForm, $mailComponent ){ if( isset($components['body']) ){ $components['body'] = do_shortcode($components['body']); } return $components; }
Тепер [hello_world]
у шаблоні листа буде замінено на текст “Привіт! Я шорткод для Contact Form 7!”.
Плагін CF7 Dynamic Text Extension – тег із динамічним текстом
Попередні варіанти зручні, коли потрібно вивести статичну інформацію, з якою користувач не взаємодіятиме, наприклад якийсь текст або банер. Навіть якщо шорткод припускатиме виведення якогось поля, то в листі прийде не значення цього поля, а html код цього поля.
А тепер давайте подивимося, як швидко і просто створити тег з динамічним змістом, наприклад, з ім’ям поточного користувача. Для цього встановимо плагін Contact Form 7 Dynamic Text Extension , що розширює можливості самого CF7.
Плагін повторює вбудований функціонал Contact Form 7 з атрибутом default , але також вміє запускати довільний шорткод.
Contact Form 7 Dynamic Text Extension дозволяє використовувати два додаткові теги полів форми:
- [Dynamictext name-field]
-
За промовчанням звичайне текстове поле
input type="text"
- [dynamichidden name-field]
-
За замовчуванням приховане текстове поле
input type="hidden"
Приклад використання
Допустимо ми вже зареєстрували шорткод [hello_world] і нам потрібно використовувати його у значенні поля форми так (цей код не робочий):
[text name placeholder "[hello_world]"]
Dynamic Text Extension розширює можливості CF7 і дозволяє використовувати поле з переданою назвою шорткоду:
[dynamictext custom-text "hello_world"]
В результаті цей тег форми перетворитися на:
<span class="wpcf7-form-control-wrap custom-text"> <input type="text" name="custom-text" value="Привіт! Я шорткод для Contact Form 7!" size="40" class="wpcf7-form-control wpcf7dtx-dynamictext wpcf7-dynamictext" aria-invalid="false"> </span>
Тобто вміст довільного тега (шорткоду) [hello_world] став значенням текстового поля. Цей тег працює у шаблоні форми, шаблоні листа та інших вкладках форми (наприклад, повідомленнях).
Ще один приклад
Код для functions.php:
function cf7_post_url(){ global $post; return get_permalink($post); } add_shortcode('CF7_POST_URL', 'cf7_post_url');
У шаблоні форми:
[dynamichidden post-url "CF7_POST_URL"]
У шаблоні листа:
[post-url]
В результаті, у листі прийде адреса поста, з якої надіслали форму, що є корисним для сайтів-вітрин товарів або послуг. Цей код працює як у поодинокому пості, так і в циклі.
Це лише демонстрація, використовувати саме таку логіку немає сенсу, тому що URL записи можна отримати в самому CF7 за допомогою тега [_post_url]
. Докладніше про такі теги доступні з коробки читайте у спеціальних тегах листа Contact Form 7 .
Зручні переваги
Перевага такого способу у швидкій зміні посилання. Наприклад, щоб скористатися [_post_url]
, ми верстаємо посилання на шаблон листа:
Форма була відправлена з цієї послуги</a>
Щоб відредагувати шаблон, потрібно редагувати форму, а вона може бути не одна. Але коли цей функціонал реалізований через свій тег, достатньо змінити код тега і отримати результат відразу для всіх форм, де цей тег використовується.
Наприклад, переробимо код шорткоду на більш привабливий:
function cf7_post_url(){ global $post; $name = $post->post_title; $url = get_permalink($post); $html = sprintf('<p>Поступило замовлення на товар <a href="%s">%s</a></p>', $url, $name); return $html; } add_shortcode('CF7_POST_URL', 'cf7_post_url');
У листі прийде:
<p>Поступило замовлення на товар <a href="http://test-wp.ru/sapogi-72-razmera-zheltogo-tsveta/">Чоботи 72 розмірів жовтого кольору</a></p>
Майте на увазі, що такий метод може в деяких випадках викликати помилку, так як весь вміст шорткоду міститься в атрибут value.
Вихідний код поля з прикладу:
<span class="wpcf7-form-control-wrap post-url"> <input type="hidden" name="post-url" value="<p>Поступило замовлення на товар <a href="http://test-wp.ru/sapogi-72-razmera-zheltogo-tsveta/" >Чоботи 72 розміру жовтого кольору</a></p>" size="40" class="wpcf7-form-control wpcf7dtx-dynamictext wpcf7-dynamichidden" aria-invalid="false"> </span>
Для таких випадків краще скористатися іншим способом цієї статті.
Приклад: чекбокс для вибору рубрики
Допустимо нам потрібно вивести список рубрик у формі (рубрика вибиратиметься через чекбокс). Якщо робити це стандартним тегом [checkbox]
, довелося б перераховувати всі рубрики блогу вручну, а потім ще додавати їх при додаванні нових рубрик. Така ручна робота нам не підходить, тому автоматизуємо все це у два етапи.
1) Створимо шорткод [cat_like] для форми:
Цей шорткод виводитиме список усіх рубрик сайту у вигляді чекбоксів.
function cat_like_shortcode_func(){ $html = ''; $categories = get_categories(['hide_empty' => 0]); if( $categories ){ $html = '<h3>Ваша улюблена рубрика?</h3>'; foreach( $categories as $cat ){ $html .= sprintf(' <label> <span class="wpcf7-list-item"> <input value=" %1$s" type="checkbox" name="category-like[]"> </span> %1$s </label>', $cat->name); } } return $html; } wpcf7_add_form_tag('cat_like', 'cat_like_shortcode_func');
2) Додамо наш шорткод у шаблон форми:
Ваше ім'я [text* name-user] Ваш email [email* email-user] [checkbox category-like] [cat_like] [submit "Проголосувати"]
Обратите внимание, что мы добавили наш тег [cat_like] и в дополнении к нему базовый тег [checkbox category-like]. Базовый тег нужен, чтобы при сабмите формы плагин знал, что есть поле category-like (это название используется в атрибуте name поля input в коде создаваемого шорткода). Дело в том, что после того, как форма отправляется, плагин не знает что в поле есть данные category-like. А с таким хаком мы можем использовать тег [category-like]
в шаблоне письма.
Шаблон письма
Теперь осталось вставить в шаблон письма тег [category-like]
и на его месте в письме будут показаны названия рубрик, которые выбрал пользователь.
Шорткод с помощью плагина Listo
Об этом плагине было рассказано в статье о секретах работы с Contact Form 7, а именно о том, что Listo умеет работать с длинными списками. Contact Form 7 в своих модулях имеет файл listo.php
, он нужен для интеграции одноименного плагина. Поэтому все что нам нужно – это активировать listo и заглянуть к нему “под капот”, взять часть кода и переделать под наши реалии.
Для пример, возьмем всё те же рубрики. Код будет состоять из двух частей, обе вставляем в functions.php
.
1) Добавляем тип списка
add_filter('listo_list_types', 'listo_list_types_func'); function listo_list_types_func($list_types){ $list_types['categories'] = 'Listo_Categories'; return $list_types; }
Тут мы добавляет ключ (categories) и значение (Listo_Categories). Ключ используется в теге [select]
, а значение ключа – это имя класса, который должен вернуть массив пунктов выпадающего списка.
2) Описываем класс для получение рубрик
class Listo_Categories implements Listo { public static function items(){ $categories = get_categories(['hide_empty' => 0]); foreach( $categories as $cat ){ $items [$cat->cat_ID] = $cat->name; } return $items; } public static function groups(){} }
Как видно, код работает на основе функции WP get_categories, параметры которой смотрите в описании.
3) Теперь используем тег выпадающего списка Listo в шаблоне формы
В нем в параметре data
указываем какой тип данных надо получить (ключ из первого кода)
[select categories-like data:categories]
И используем тег [categories-like]
в шаблоне письма, чтобы получить в письме выбранную пользователем рубрику.
Добавление нового тега формы (шоткода) с кнопкой в настройках Contact Form 7
Это базовый пример, как создать свой шоткод на основе исходников самого плагина. Будет создан тег поля по подобию выпадающего списка и сможет группировать значения с помощью Html атрибута optgroup. В остальном будет обладать теми же возможностями, что и оригинал. Реализуем следующее меню:
PHP Код
Вставляется в functions.php или оформляется в виде плагина