带有管道联系表 7 的可选收件人获取国家/地区名称问题

Posted

技术标签:

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

我在联系表 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/

【问题讨论】:

【参考方案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 相同。当然,它会返回数据集中的最后一个。如果记录的值相同,您现在如何选择他们选择的哪一个?这是可以解决的,但这确实是另一个问题。我在这里向您展示的内容 - 回答了如何获取管道值。 我之前也发布过问题。但那个时候运气不好。 ***.com/questions/67699300/… 我在那里也给了你答案。 是的,但当时,问题是一样的。我仍然没有得到我的问题的解决方案

以上是关于带有管道联系表 7 的可选收件人获取国家/地区名称问题的主要内容,如果未能解决你的问题,请参考以下文章

获取不在联系人列表中的短信发件人姓名?

php WP联系表7包含国家列表的短代码

Vue路由器上的可选参数

如何获取用户提供的国家、地区、城镇和地区名称 area_id 迁移到用户表

WooCommerce 根据送货国家/地区更改电子邮件收件人

短信收件箱中对联系人表的错误引用