【问题标题】:Selectable recipient with pipes contact form 7 get country name issue带有管道联系表 7 的可选收件人获取国家/地区名称问题
【发布时间】:2023-03-16 06:12:01
【问题描述】:

我在联系表 7 中使用国家下拉菜单。它看起来像这样 [select* country "Canada | team1@website.com,team3@website.com" "Mexico | team2@website.com" "Zimbabwe | team3@website.com"],如果我使用它来获取 [_row_country] 的第一个值和 [country] 的第二个值(在管道之后),它工作正常在邮件部分。 但我想将其保存在客户数据库中并尝试以此获取国家/地区名称

$your_country = $form_data['_raw_country'];
$country = implode( ', ', (array) $your_country );

它只返回电子邮件而不返回国家/地区,所以我也试试这个

$your_country = $form_data['country'];
$country = implode( ', ', (array) $your_country );

它返回空白。 这是我的参考代码。

function contactform7_before_send_mail( $contact_form, $abort, $submission ) {
    // set your db details.
    $mydb = new wpdb( 'user', 'password', 'database', 'localhost' );
    if ( $submission ) {
        $form_data = $submission->get_posted_data();
        $your_country = $form_data['_raw_country'];
        $country = implode( ', ', (array) $your_country );
        $mydb->insert(
            'tableName',
            array(
                'fullname'        => sanitize_text_field( $form_data['FullName'] ),                
                'country'         => $country,
                'companyname'     => sanitize_text_field( $form_data['CompanyName'] ),
                
            ),
            array( '%s', '%s', '%s' )
        );
    }
}
add_action( 'wpcf7_before_send_mail', 'contactform7_before_send_mail', 10, 3 );

这是参考链接https://contactform7.com/selectable-recipient-with-pipes/

【问题讨论】:

    标签: wordpress wordpress-theming contact-form-7


    【解决方案1】:

    要从管道中获取信息,您不能只使用[_raw_field],因为它不是以这种方式存储的。获取 Piped 数据的值稍微复杂一些。要获取管道的值,您必须检索表单标签,然后循环遍历每个管道的值。

    add_action( 'wpcf7_before_send_mail', 'dd_handle_form_submission', 10, 3 );
    function dd_handle_form_submission( $contact_form, $abort, $submission ) {
        if ( $submission ) {
            $form_data = $submission->get_posted_data();
            // Get the tags.
            $tags = $submission->get_contact_form()->scan_form_tags();
            // Get the country field submission.
            $country = $submission->get_posted_data( 'country' );
            foreach ( $tags as $tag ) {
                if ( 'country' === $tag->name ) {
                    // Get the Pipes.
                    $pipe_array = $tag->pipes->to_array();
                    foreach ( $pipe_array as $value ) {
                        if ( $country[0] === $value[1] ) {
                            // $value[0] is Left of Pipe - $value[1] is right of pipe.
                            $country_name = $value[0];
                        }
                    }
                }
            }
            if ( isset( $country_name ) ) {
                $mydb = new wpdb( 'user', 'password', 'database', 'localhost' );
                $mydb->insert(
                    'tableName',
                    array(
                        'fullname'    => sanitize_text_field( $form_data['FullName'] ),
                        'country'     => $country_name,
                        'companyname' => sanitize_text_field( $form_data['CompanyName'] ),
    
                    ),
                    array( '%s', '%s', '%s' )
                );
            }
        }
    }
    

    特定问题的新答案/解决方案

    在您的情况下,管道之后的值不是唯一的。这带来了另一个问题,这使得管道不太好。在这种情况下,我会使用 jQuery 和一个隐藏的表单域。

    使联系表格如下所示:

    <p>[select* country id:country include_blank "Canada | team1@website.com,team3@website.com" "Mexico | team2@website.com" "Serbia | team2@website.com" "Zimbabwe | team3@website.com"]</p>
    
    <p>[text FullName]</p>
    <p>[email your-email]</p>
    
    [hidden hidden_country id:hidden_country]
    
    [submit]
    
    <script>
        jQuery(function($){
            $('#country').on( 'change', function() {
                $('#hidden_country').val($(this).val());
            });
        });
    </script>
    

    然后,由于您只是捕获更改时的国家/地区值,您可以轻松将该值推送到您的数据库,并使用您发送到(管道右侧)的电子邮件,就是这样。

    add_action( 'wpcf7_before_send_mail', 'dd_handle_form_submission', 10, 3 );
    function dd_handle_form_submission( $contact_form, $abort, $submission ) {
        if ( $submission ) {
            $form_data = $submission->get_posted_data();
            $country_name = sanitize_text_field( $form_data['hidden_country'] );
            if ( ! empty( $country_name ) ) {
                $mydb = new wpdb( 'user', 'password', 'database', 'localhost' );
                $mydb->insert(
                    'tableName',
                    array(
                        'fullname'    => sanitize_text_field( $form_data['FullName'] ),
                        'country'     => $country_name,
                        'companyname' => sanitize_text_field( $form_data['CompanyName'] ),
    
                    ),
                    array( '%s', '%s', '%s' )
                );
            }
        }
    }
    

    【讨论】:

    • 只有在所有国家/地区的电子邮件 ID 不同时才有效。但在我的情况下,某些国家/地区的电子邮件 ID 不同,而对于其他国家/地区,电子邮件 ID 相同,例如 [select* country "Canada | team1@website.com,team3@website.com" "Mexico | team2@website.com" "Serbia | team2 @website.com" "Zimbabwe | team3@website.com"], 如果选择墨西哥则返回塞尔维亚
    • 电子邮件 ID 相同。当然,它会返回数据集中的最后一个。如果记录的值相同,您现在如何选择他们选择的哪一个?这是可以解决的,但这确实是另一个问题。我在这里向您展示的内容 - 回答了如何获取管道值。
    • 我之前也发布过问题。但那个时候运气不好。 stackoverflow.com/questions/67699300/…
    • 我在那里也给了你答案。
    • 是的,但当时,问题是一样的。我仍然没有得到我的问题的解决方案
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多