Добавление пользовательской переменной в тело письма Contact Form 7
Я установил cookie для своих пользователей, чтобы знать, с какого источника они пришли на сайт, и хочу, чтобы при обратной связи их сообщение приходило вместе с этим cookie.
Для этого я создал новый шорткод и добавил его в раздел почты, но в письме отображается сам шорткод, а не его значение.
Код:
function my_shortcode( $atts ) {
// Возвращаем значение cookie 'my_source', если оно установлено
return isset($_COOKIE['my_source']) ? $_COOKIE['my_source'] : '' ;
}
add_shortcode( 'my-source', 'my_shortcode' );
Тело сообщения в Contact Form 7:
Имя : [your-name]
Email : [your-email]
Телефон : [form-tel]
Источник : [my-source]
Полученное письмо:
Имя : Mohit Bumb
Email : abcde@gmail.com
Телефон : 19191919191
Источник : [my-source]

Вы должны сделать это следующим образом:
add_action( 'wpcf7_init', 'custom_add_form_tag_my_source' );
function custom_add_form_tag_my_source() {
// "my-source" - это тип тега формы
wpcf7_add_form_tag( 'my-source', 'custom_my_source_form_tag_handler' );
}
function custom_my_source_form_tag_handler( $tag ) {
return isset( $_COOKIE['my_source'] ) ? $_COOKIE['my_source'] : '';
}
Подробнее смотрите в документации.
Или вы также можете попробовать это для обработки обычных шорткодов:
add_filter( 'wpcf7_mail_components', function( $components ){
$components['body'] = do_shortcode( $components['body'] );
return $components;
} );

это не то, о чем он спрашивал, он спрашивал, почему письмо не парсится

Возможно, я забыл о фильтре wpcf7_special_mail_tags
, @lalo. Но код в моем ответе действительно работает — и если бы автор вопроса не принял ответ, я бы, вероятно, вспомнил о фильтре wpcf7_special_mail_tags
(в тот день) и добавил его в свой ответ.

Используйте фильтр "wpcf7_special_mail_tags"
В этом примере мой тег — "tournaments"
/**
* Тег для использования в разделе "Письмо", чтобы пользователь получал специальный тег
* [tournaments]
*/
add_filter('wpcf7_special_mail_tags', 'wpcf7_tag_tournament', 10, 3);
function wpcf7_tag_tournament($output, $name, $html)
{
$name = preg_replace('/^wpcf7\./', '_', $name); // для обратной совместимости
$submission = WPCF7_Submission::get_instance();
if (! $submission) {
return $output;
}
if ('tournaments' == $name) {
return $submission->get_posted_data("tournaments");
}
return $output;
}

Я опоздал, но использую специальный тег в этом сценарии
// Хук для дополнительного специального тега в письме
add_filter( 'wpcf7_special_mail_tags', 'wti_special_mail_tag', 20, 3 );
function wti_special_mail_tag( $output, $name, $html )
{
$name = preg_replace( '/^wpcf7\./', '_', $name );
if ( '_my_cookie' == $name ) {
$output = isset( $_COOKIE['my_source'] ) ? $_COOKIE['my_source'] : '';
}
return $output;
}
вы можете использовать [_my_cookie]
для вызова его значения

Я решил и опубликовал свой ответ здесь:
Добавление пользовательского Form-Tag в Contact Form 7 для WordPress
(который также работает для отправки по email)
https://stackoverflow.com/questions/53754577/how-to-make-contact-form-7-custom-field/
Код
https://gist.github.com/eduardoarandah/83cad9227bc0ab13bf845ab14f2c4dad
