Как создать свой шорткод для Contact Form 7

314

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

Как создать свой шорткод для Contact Form 7

Почему нельзя ограничиваться обычным 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.

0
  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(4 голоса, в среднем: 5 из 5)
не скупись ☝️ оцени статью
Подписка на обновления:
Автор блога Рябухин Максим

Я фрилансер веб-разработчик. Последние несколько лет занимаюсь версткой и веб-программированием на PHP и Javascript. Если вам понадобится помощь с блогом Wordpress, либо адаптация сайта, я всегда рад помочь.

связаться
Вместе с этим советую почитать:

Оставьте комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
не пытайтесь оскорбить автора, либо участников блога, ваши комментарии все равно не будут промодерированы!
у меня есть сайт

комментариев: 0
    показать все