Как создать свой шорткод для Contact Form 7
314В своих проектах мне часто приходится создавать свой шорткод для Contact Form 7 под различные задачи. Существует два разных механизма: обычные WordPress-шорткоды и нативные теги формы CF7. Для корректной интеграции в форму используется именно API Contact Form 7 — функция wpcf7_add_form_tag().

Почему нельзя ограничиваться обычным add_shortcode
- CF7 не управляет валидацией таких полей
- нет интеграции с генератором формы
- поля не регистрируются как элементы CF7
- могут быть проблемы с отправкой и письмами
Правильный способ — создавать кастомный тег формы через wpcf7_add_form_tag().
Где размещать код
functions.phpактивной темы- или кастомный плагин (предпочтительно)
Простейший кастомный тег Contact Form 7
Создадим тег [my_text], который будет выводить input.
add_action('wpcf7_init', 'register_my_cf7_tag');
function register_my_cf7_tag() {
wpcf7_add_form_tag('my_text', 'render_my_cf7_tag');
}
function render_my_cf7_tag($tag) {
return '<input type="text" name="my_text">';
}
Использование в форме:
[my_text]
Тег с атрибутами
Contact Form 7 передаёт атрибуты через объект $tag.
add_action('wpcf7_init', 'register_my_cf7_tag');
function register_my_cf7_tag() {
wpcf7_add_form_tag('my_text', 'render_my_cf7_tag');
}
function render_my_cf7_tag($tag) {
$name = $tag->name;
$placeholder = $tag->get_option('placeholder', '', true);
return '<input type="text" name="' . esc_attr($name) . '" placeholder="' . esc_attr($placeholder) . '">';
}
Использование:
[my_text placeholder "Введите имя"]
Кастомный тег с HTML-разметкой
Для сложных блоков удобнее использовать буферизацию.
add_action('wpcf7_init', function () {
wpcf7_add_form_tag('order_info', 'render_order_info_tag');
});
function render_order_info_tag($tag) {
ob_start();
?>
<div class="order-info">
<p>Дата заявки: <?= date('d.m.Y'); ?></p>
<input type="hidden" name="order_date" value="<?= date('Y-m-d'); ?>">
</div>
<?php
return ob_get_clean();
}
Поле order_date автоматически доступно в письме CF7.
Использование данных в письме
Дата заявки: [order_date]
Добавление поддержки обязательного поля
CF7 различает теги с обязательностью через *.
wpcf7_add_form_tag(['my_text', 'my_text*'], 'render_my_cf7_tag');
Проверка обязательности:
$is_required = $tag->is_required();
Типичные ошибки
- использование
add_shortcodeвместоwpcf7_add_form_tag - игнорирование объекта
$tag - отсутствие
nameу input - echo вместо return
Практические кейсы
- кастомные поля доставки
- динамическая корзина в форме
- скрытые служебные поля
- интеграция с ACF
- сложные UI-блоки внутри формы
Итог
Если нужен настоящий шорткод Contact Form 7, а не костыль — используется wpcf7_add_form_tag(). Это даёт полную совместимость с формами, валидацией и письмами, и является единственно правильным способом расширения CF7.
Подписка на обновления:



