Почему стоит создавать собственный шорткод для Contact Form 7
Contact Form 7 — один из самых популярных плагинов для создания форм в WordPress. По умолчанию он предоставляет удобный шорткод, который вставляется на страницы и записи для отображения форм. Однако иногда возникает необходимость сделать более гибкую интеграцию — например, автоматически подставлять определённые параметры, добавлять кастомные стили или выполнять обработку данных до вывода формы. В таких случаях создание своего шорткода на базе Contact Form 7 решит многие задачи.
Создавая собственный шорткод, вы получаете возможность:
- автоматически выбирать нужную форму по ID или имени;
- добавлять к форме дополнительные параметры и атрибуты;
- встраивать форму в сложную логику шаблонов;
- обрабатывать данные до и после отправки;
- упрощать повторное использование форм с уникальными настройками.
Давайте разберём, как реализовать такой функционал на практике.
Создание шорткода для Contact Form 7: базовый пример
Для начала создадим простой шорткод, который будет выводить форму Contact Form 7 по ID. В файле functions.php вашей темы или в отдельном плагине добавьте следующий код:
function contactform7ru_render_form_shortcode($atts) {
$atts = shortcode_atts(array(
'id' => '',
'title' => false
), $atts, 'contactform7ru_form');
if (empty($atts['id'])) {
return '<p>Ошибка: не указан ID формы Contact Form 7.</p>';
}
if ($atts['title']) {
$form_title = get_the_title($atts['id']);
if ($form_title) {
$output = '<h3>' . esc_html($form_title) . '</h3>';
}
} else {
$output = '';
}
$output .= do_shortcode('[contact-form-7 id="' . intval($atts['id']) . '"]');
return $output;
}
add_shortcode('contactform7ru_form', 'contactform7ru_render_form_shortcode');Здесь мы определяем шорткод [contactform7ru_form id="123" title="true"], который принимает параметр id — ID формы Contact Form 7, и необязательный параметр title, который выводит заголовок формы перед самой формой.
Такой подход удобен, когда надо вставить форму с дополнительным текстовым заголовком, не меняя исходный шорткод Contact Form 7.
Добавление кастомных параметров в форму Contact Form 7
Иногда нужно передать в форму динамические данные — например, ID товара, текущего пользователя или метку сессии, которые затем используются в письме или для логики обработки.
Contact Form 7 поддерживает передачу пользовательских полей через скрытые поля (hidden), но чтобы динамически менять их значение через шорткод, нужно применить фильтр.
Расширим наш шорткод, чтобы передавать произвольные параметры в форму:
function contactform7ru_render_form_shortcode($atts) {
$atts = shortcode_atts(array(
'id' => '',
'title' => false,
'product_id' => '',
'user_name' => ''
), $atts, 'contactform7ru_form');
if (empty($atts['id'])) {
return '<p>Ошибка: не указан ID формы Contact Form 7.</p>';
}
// Добавляем фильтр для динамической подстановки значений
add_filter('contactform7_form_hidden_fields', function($hidden_fields) use ($atts) {
if (!empty($atts['product_id'])) {
$hidden_fields['product_id'] = sanitize_text_field($atts['product_id']);
}
if (!empty($atts['user_name'])) {
$hidden_fields['user_name'] = sanitize_text_field($atts['user_name']);
}
return $hidden_fields;
});
$output = '';
if ($atts['title']) {
$form_title = get_the_title($atts['id']);
if ($form_title) {
$output .= '<h3>' . esc_html($form_title) . '</h3>';
}
}
$output .= do_shortcode('[contact-form-7 id="' . intval($atts['id']) . '"]');
// Удаляем фильтр, чтобы не влиять на другие формы
remove_all_filters('contactform7_form_hidden_fields');
return $output;
}
add_shortcode('contactform7ru_form', 'contactform7ru_render_form_shortcode');Теперь при вызове шорткода можно передавать параметры, например:
[contactform7ru_form id="123" product_id="456" user_name="Иван" title="true"]
Чтобы форма воспринимала эти поля, в Contact Form 7 добавьте скрытые поля с именами product_id и user_name:
[hidden product_id]
[hidden user_name]Далее эти значения можно использовать в письмах, например, в шаблоне письма добавить [product_id] и [user_name].
Использование собственного обработчика для Contact Form 7
Если нужно выполнить дополнительную обработку данных из формы — например, записать в базу или отправить данные в CRM — можно подключить хук wpcf7_mail_sent.
Добавим пример обработчика, который будет логировать отправленные формы в отдельный файл:
function contactform7ru_log_form_submission($contact_form) {
$submission = WPCF7_Submission::get_instance();
if ($submission) {
$data = $submission->get_posted_data();
$log_entry = date('Y-m-d H:i:s') . ' - Форма ID: ' . $contact_form->id() . ' - Данные: ' . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n";
file_put_contents(__DIR__ . '/cf7_submissions.log', $log_entry, FILE_APPEND | LOCK_EX);
}
}
add_action('wpcf7_mail_sent', 'contactform7ru_log_form_submission');С помощью этого кода вы сможете отслеживать все отправки форм Contact Form 7 на вашем сайте, что полезно для отладки и аудита.
Полезные плагины для расширения Contact Form 7
Кроме создания собственного шорткода и фильтров, рекомендуем обратить внимание на следующие плагины, которые помогут расширить функционал Contact Form 7:
- Contact Form 7 Dynamic Text Extension — позволяет добавлять динамические поля, подставлять значения из URL, пользователя и других источников;
- Contact Form 7 Conditional Fields — добавляет условную логику отображения полей формы;
- Flamingo — плагин для хранения отправленных сообщений в базе WordPress;
- Contact Form 7 Honeypot — защита от спама с помощью невидимых полей.
Эти расширения совместимы с нашим примером шорткода и помогут создать более мощные и удобные формы.
Советы по безопасности и производительности
При работе с формами обязательно учитывайте безопасность:
- очищайте и валидируйте все входящие данные с помощью функций WordPress;
- не вставляйте пользовательский ввод напрямую в HTML без экранирования;
- используйте nonce и капчи для защиты от спама;
- ограничивайте количество одновременных отправок, чтобы избежать нагрузки.
Также помните, что слишком большое количество фильтров и обработчиков может замедлить загрузку страниц с формами. Оптимизируйте код и используйте кэширование.