发送 Contact Form 7 中的所有下拉列表
Send all of a dropdown in Contact Form 7
我需要将完整的自定义字段数组发送到邮件(动态填充)并联系 Form 7,以便在发送之前在此处进行处理:
// define the wpcf7_posted_data callback
function action_wpcf7_posted_data($array)
{
$a = get_field('date')
//WORK HERE
$array['Nom & Prénom'] = $array['name'];
unset($array['name']);
$array['E-mail'] = $array['email'];
unset($array['email']);
$array['Téléphone'] = $array['tel'];
unset($array['tel']);
$array['Profession'] = $array['job'];
unset($array['job']);
$array['Session'] = $array['upcoming-gigs'];
unset($array['upcoming-gigs']);
unset($array['privacy']);
return $array;
}
add_filter('wpcf7_posted_data', 'action_wpcf7_posted_data', 10, 1);
因为是发邮件之前,所以发之前没办法调用比较。
所以我想将所有数据发送到一个隐藏的输入中,然后进行比较。
这是联系表格 7 中的两个输入:
[select upcoming-gigs data:gigs id:date] [hidden select upcoming-gigs2 data:gigs2]
我这里的目标是发送隐藏select的所有数据。
我找不到在邮件中发送所有输入的方法。
可能吗?有更好的方法吗?
感谢
编辑:
我的问号2:
目标是发送一封包含会话日期和会话 ID 的邮件。
我使用 ACF,我有:
在动态下拉列表之后,用户看起来像这样:
问题是我没有会话 ID,只有日期。
要知道我需要与所有自定义字段的数组进行比较的 id,我无法在 wpcf7_posted_data
期间导入它。
我想如果我将数组的所有数据发送到一个隐藏字段中,我可以重新制作数组并找到我的用户选择的会话 ID。
我希望我更清楚。
(我无法在 wpcf7_posted_data
期间在 php 中提出请求。我可以提出 ajax 请求吗?)
编辑2:
这是我隐藏的 select 会话和文本
这是联系表 7 的 html 其余的是 div for CSS
[select upcoming-date data:date id:date] [hidden select upcoming-date2 data:date2]
编辑3:
好的,知道了。
我用来制作下拉菜单的自定义字段分为 ID 和文本两部分。我有文本部分,我需要 ID。
如果我发送邮件中的每个文本和 ID,我都可以与用户的回答进行比较,然后将正确的 ID 添加到邮件中。
这里生成的html:http://www.sharemycode.fr/5ax
编辑 4:
我写下拉菜单的 id 和文本的地方:
我创建 select 的地方:
add_filter('wpcf7_form_tag_data_option', function ($n, $options, $args) {
$ses = (array)get_field('date_new');
$sesCount = count($ses);
$gigs = [];
$gigs2 = [];
if (in_array('gigs', $options)) {
for ($i = 0; $i < $sesCount; $i++) {
if ($ses[$i]['date_start'] > date('d-m-Y', time())) {
$a = "A réaliser entre le " . $ses[$i]['date_start'] . " et le " . $ses[$i]['date_end'] ." | bla";
array_push($gigs, $a);
}
}
return $gigs;
}
}
看起来 Contact Form 7 本身就支持它,只是不太清楚如何实现它。
这是一个解释该功能的文档页面:http://contactform7.com/selectable-recipient-with-pipes/
基本上你所要做的就是像这样输入值:
可见价值|实际价值
竖线“|”之前的内容字符会显示在表格中,后面的是表格实际填写的值。
编辑卡纳普:
我在这里添加我的代码来分隔 HowardE 的答案。
这就是我动态创建 select 的方式:
add_filter('wpcf7_form_tag_data_option', function ($n, $options, $args) {
$ses = (array)get_field('date');
$sesCount = count($ses);
$date= [];
if (in_array('date', $options)) {
for ($i = 0; $i < $sesCount; $i++) {
if ($ses[$i]['date_start'] > date('d-m-Y', time())) {
$a = "A réaliser entre le " . $ses[$i]['date_start'] . " et le " . $ses[$i]['date_end'] ." | bla";
array_push($date, $a);
}
}
return $date;
}
它不起作用,我使用 Smart Grid-Layout Design for Contact Form 7 来动态创建我的 select
我会为 select 创建一个自定义表单标签。以下代码将创建一个名为 [gigs]
的自定义表单标签,其用法如下:
[gigs upcoming-gigs]
我还添加了添加 * 并使其成为必填项的功能。
我的假设是您实际上是如何获取 ACF 字段的,但实际上我做不到,因为我没有它们,而且您还没有完全分享它的存储方式。您可以将其添加到您的 functions.php.
add_action('wpcf7_init', function (){
wpcf7_add_form_tag( array('gigs', 'gigs*'), 'dd_cf7_upcoming_gigs' , array('name-attr' => true) );
});
function dd_cf7_upcoming_gigs($tag) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
if ( $validation_error ) {
$atts['aria-invalid'] = 'true';
$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
$tag->name
);
} else {
$atts['aria-invalid'] = 'false';
}
// Make first option unselected and please choose
$html = '<option value="">- - '. __('Please Choose', 'text-domain'). ' - -</option>';
// This part you may have to update with your custom fields
$ses = (array)get_field('date_new');
$sesCount = count($ses);
for ($i = 0; $i < $sesCount; $i++) {
if ($ses[$i]['date_start'] > date('d-m-Y', time())) {
$a = "A réaliser entre le " . $ses[$i]['date_start'] . " et le " . $ses[$i]['date_end'];
// if session ID is in fact $ses[$i]['session']
$html .= sprintf( '<option %1$s>%2$s</option>',
$ses[$i]['session'], $a );
}
}
foreach ($gigs as $key => $value){
$html .= sprintf( '<option %1$s>%2$s</option>',
$key, $value );
}
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>',
sanitize_html_class( $tag->name ), $atts, $html, $validation_error
);
return $html;
}
add_filter( 'wpcf7_validate_gigs', 'dd_validate_gigs_filter', 10, 2 );
add_filter( 'wpcf7_validate_gigs*', 'dd_validate_gigs_filter', 10, 2 );
function dd_validate_gigs_filter( $result, $tag ) {
$name = $tag->name;
$has_value = isset( $_POST[$name] ) && '' !== $_POST[$name];
if ( $has_value and $tag->has_option( 'multiple' ) ) {
$vals = array_filter( (array) $_POST[$name], function( $val ) {
return '' !== $val;
} );
$has_value = ! empty( $vals );
}
if ( $tag->is_required() and ! $has_value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
return $result;
}
我需要将完整的自定义字段数组发送到邮件(动态填充)并联系 Form 7,以便在发送之前在此处进行处理:
// define the wpcf7_posted_data callback
function action_wpcf7_posted_data($array)
{
$a = get_field('date')
//WORK HERE
$array['Nom & Prénom'] = $array['name'];
unset($array['name']);
$array['E-mail'] = $array['email'];
unset($array['email']);
$array['Téléphone'] = $array['tel'];
unset($array['tel']);
$array['Profession'] = $array['job'];
unset($array['job']);
$array['Session'] = $array['upcoming-gigs'];
unset($array['upcoming-gigs']);
unset($array['privacy']);
return $array;
}
add_filter('wpcf7_posted_data', 'action_wpcf7_posted_data', 10, 1);
因为是发邮件之前,所以发之前没办法调用比较。
所以我想将所有数据发送到一个隐藏的输入中,然后进行比较。
这是联系表格 7 中的两个输入:
[select upcoming-gigs data:gigs id:date] [hidden select upcoming-gigs2 data:gigs2]
我这里的目标是发送隐藏select的所有数据。
我找不到在邮件中发送所有输入的方法。
可能吗?有更好的方法吗?
感谢
编辑:
我的问号2:
目标是发送一封包含会话日期和会话 ID 的邮件。
我使用 ACF,我有:
在动态下拉列表之后,用户看起来像这样:
问题是我没有会话 ID,只有日期。
要知道我需要与所有自定义字段的数组进行比较的 id,我无法在 wpcf7_posted_data
期间导入它。
我想如果我将数组的所有数据发送到一个隐藏字段中,我可以重新制作数组并找到我的用户选择的会话 ID。
我希望我更清楚。
(我无法在 wpcf7_posted_data
期间在 php 中提出请求。我可以提出 ajax 请求吗?)
编辑2:
这是我隐藏的 select 会话和文本
这是联系表 7 的 html 其余的是 div for CSS
[select upcoming-date data:date id:date] [hidden select upcoming-date2 data:date2]
编辑3: 好的,知道了。
我用来制作下拉菜单的自定义字段分为 ID 和文本两部分。我有文本部分,我需要 ID。
如果我发送邮件中的每个文本和 ID,我都可以与用户的回答进行比较,然后将正确的 ID 添加到邮件中。
这里生成的html:http://www.sharemycode.fr/5ax
编辑 4: 我写下拉菜单的 id 和文本的地方:
我创建 select 的地方:
add_filter('wpcf7_form_tag_data_option', function ($n, $options, $args) {
$ses = (array)get_field('date_new');
$sesCount = count($ses);
$gigs = [];
$gigs2 = [];
if (in_array('gigs', $options)) {
for ($i = 0; $i < $sesCount; $i++) {
if ($ses[$i]['date_start'] > date('d-m-Y', time())) {
$a = "A réaliser entre le " . $ses[$i]['date_start'] . " et le " . $ses[$i]['date_end'] ." | bla";
array_push($gigs, $a);
}
}
return $gigs;
}
}
看起来 Contact Form 7 本身就支持它,只是不太清楚如何实现它。
这是一个解释该功能的文档页面:http://contactform7.com/selectable-recipient-with-pipes/
基本上你所要做的就是像这样输入值:
可见价值|实际价值
竖线“|”之前的内容字符会显示在表格中,后面的是表格实际填写的值。
编辑卡纳普: 我在这里添加我的代码来分隔 HowardE 的答案。
这就是我动态创建 select 的方式:
add_filter('wpcf7_form_tag_data_option', function ($n, $options, $args) {
$ses = (array)get_field('date');
$sesCount = count($ses);
$date= [];
if (in_array('date', $options)) {
for ($i = 0; $i < $sesCount; $i++) {
if ($ses[$i]['date_start'] > date('d-m-Y', time())) {
$a = "A réaliser entre le " . $ses[$i]['date_start'] . " et le " . $ses[$i]['date_end'] ." | bla";
array_push($date, $a);
}
}
return $date;
}
它不起作用,我使用 Smart Grid-Layout Design for Contact Form 7 来动态创建我的 select
我会为 select 创建一个自定义表单标签。以下代码将创建一个名为 [gigs]
的自定义表单标签,其用法如下:
[gigs upcoming-gigs]
我还添加了添加 * 并使其成为必填项的功能。
我的假设是您实际上是如何获取 ACF 字段的,但实际上我做不到,因为我没有它们,而且您还没有完全分享它的存储方式。您可以将其添加到您的 functions.php.
add_action('wpcf7_init', function (){
wpcf7_add_form_tag( array('gigs', 'gigs*'), 'dd_cf7_upcoming_gigs' , array('name-attr' => true) );
});
function dd_cf7_upcoming_gigs($tag) {
if ( empty( $tag->name ) ) {
return '';
}
$validation_error = wpcf7_get_validation_error( $tag->name );
$class = wpcf7_form_controls_class( $tag->type );
if ( $validation_error ) {
$class .= ' wpcf7-not-valid';
}
$atts = array();
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['tabindex'] = $tag->get_option( 'tabindex', 'signed_int', true );
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
if ( $validation_error ) {
$atts['aria-invalid'] = 'true';
$atts['aria-describedby'] = wpcf7_get_validation_error_reference(
$tag->name
);
} else {
$atts['aria-invalid'] = 'false';
}
// Make first option unselected and please choose
$html = '<option value="">- - '. __('Please Choose', 'text-domain'). ' - -</option>';
// This part you may have to update with your custom fields
$ses = (array)get_field('date_new');
$sesCount = count($ses);
for ($i = 0; $i < $sesCount; $i++) {
if ($ses[$i]['date_start'] > date('d-m-Y', time())) {
$a = "A réaliser entre le " . $ses[$i]['date_start'] . " et le " . $ses[$i]['date_end'];
// if session ID is in fact $ses[$i]['session']
$html .= sprintf( '<option %1$s>%2$s</option>',
$ses[$i]['session'], $a );
}
}
foreach ($gigs as $key => $value){
$html .= sprintf( '<option %1$s>%2$s</option>',
$key, $value );
}
$atts['name'] = $tag->name;
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select>%4$s</span>',
sanitize_html_class( $tag->name ), $atts, $html, $validation_error
);
return $html;
}
add_filter( 'wpcf7_validate_gigs', 'dd_validate_gigs_filter', 10, 2 );
add_filter( 'wpcf7_validate_gigs*', 'dd_validate_gigs_filter', 10, 2 );
function dd_validate_gigs_filter( $result, $tag ) {
$name = $tag->name;
$has_value = isset( $_POST[$name] ) && '' !== $_POST[$name];
if ( $has_value and $tag->has_option( 'multiple' ) ) {
$vals = array_filter( (array) $_POST[$name], function( $val ) {
return '' !== $val;
} );
$has_value = ! empty( $vals );
}
if ( $tag->is_required() and ! $has_value ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
return $result;
}