【问题标题】:Send all of a dropdown in Contact Form 7在联系表 7 中发送所有下拉列表
【发布时间】:2021-06-23 01:57:02
【问题描述】:

我需要将完整的自定义字段数组发送到带有联系表格 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]

我这里的目标是发送隐藏选择的所有数据。

我找不到在邮件中发送所有输入的方法。

有可能吗?有更好的方法吗?

谢谢

编辑:

我的问号2:

目标是发送一封包含会话日期和会话 ID 的邮件。

我使用 ACF 并且我有:

在动态下拉后,用户看起来像这样:

问题是我没有会话的 ID,只有日期。

要知道我需要与所有自定义字段的数组进行比较的id,我无法在wpcf7_posted_data期间导入它。

我认为如果我将数组的所有数据发送到隐藏字段中,我可以重新制作数组并找到我的用户选择的会话的 id。

我希望我更清楚。

(在wpcf7_posted_data期间我无法在php中发出请求。我可以发出ajax请求吗?)

编辑2: 这是我的隐藏选择,带有会话和文本

这是联系表格 7 的 html,其余的是 CSS 的 div [select upcoming-date data:date id:date] [hidden select upcoming-date2 data:date2]

编辑3: 好的,明白了。

我用来制作下拉菜单的自定义字段分为 id 和 text 两部分。我有我需要 id 的文本部分。

如果我发送邮件中的所有文本和 ID,我可以将其与用户的答案进行比较,然后将正确的 ID 添加到邮件中。

这里生成的html:http://www.sharemycode.fr/5ax

编辑 4: 我写下拉列表的 id 和文本的地方:

我创建选择的地方:

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;
    }
}

【问题讨论】:

  • 我不明白你为什么要使用隐藏选择?价值是多少?您能否用表单数据的实际样本以及您希望发送到电子邮件的内容来说明您的示例?
  • 我有两个自定义字段 session_number 和 session_text。用户在下拉列表中选择 session_text,我希望在邮件发送依赖的 session_number 之前拥有。由于钩子,我无法发出任何请求,因此我想发送 session_number 和 session_text 的所有值以进行比较并将正确的 session_number 添加到邮件中
  • 好的,您能否在您的问题中添加其他信息来说明这一点。添加选择和可能的结果,它将如何确定要发送给谁?您绝对可以使用wpcf7_before_send_mail 比较值,但您的问题仍然不清楚,那是什么。
  • 我使用 ACF 创建自定义字段,但我可以在 wpcf7_before_send_mail 期间调用请求(就像我在问题第 4 行中编辑一样)。 $a 的数组为空。所以我没有数据可以与我的用户的选择进行比较
  • 很抱歉,您的问题仍然太模糊,无法帮助您。隐藏的select 字段的目的是什么?您绝对可以使用 ajax 和隐藏表单字段来评估和传递有关用户操作的数据,但是您的问题没有提供足够的真实信息来尝试自己复制。

标签: php wordpress contact-form-7


【解决方案1】:

我会为选择创建一个自定义表单标签。以下代码将创建一个名为 [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;
}

【讨论】:

    【解决方案2】:

    Contact Form 7 似乎原生支持此功能,但如何实现它并不是很明显。

    这是一个解释功能的文档页面:http://contactform7.com/selectable-recipient-with-pipes/

    基本上你所要做的就是像这样输入值:

    可见值|实际形式值

    管道“|”之前的内容字符将显示在表格中,后面的将是表格中填写的实际值。

    编辑卡纳普: 我在此处添加代码以分隔 HowardE 的答案。

    这就是我动态创建选择的方式:

       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;
        }
    

    它不起作用,我使用 Contact Form 7 的智能网格布局设计来动态创建我的选择

    【讨论】:

    • 如果在没有使用data 方法的情况下实际设置了值,则此答案将是正确的。所以在这种情况下......这是错误的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 2019-05-30
    • 2016-12-26
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多