【问题标题】:WordPress contact form 7 text value changeWordPress 联系表格 7 文本值更改
【发布时间】:2019-04-25 00:59:25
【问题描述】:

WordPress - 联系表格 7

当有人在其中输入值时,我正在尝试找出用于修改 cf7 字段值的过滤器。

当用户在文本字段中输入并提交数据时,

  1. 验证 - 我已经完成了
  2. 如果输入无效,则不应转到感谢页面 - 我已经完成了
  3. 用新数据替换文本字段 - 未完成

例如:1

add_filter( 'wpcf7_validate_text*', 'your_validation_filter_func_tel', 100, 2 );
function your_validation_filter_func_tel( $result, $tag ) {

    $Yourvalue = $_POST['your-number'];
    if ( strlen( $Yourvalue ) == 2 ) {
        $result->invalidate( 'your-number', "Please enter a valid number.  " . );
        // HERE I WANT TO REPLACE NEW DATA TO TEXT FIELD
        $result->data( 'your-number', '1002' );
    } else if ( strlen( $Yourvalue ) == 3 ) {
        $result->invalidate( 'your-number', "Please enter a valid name." . );
        // HERE I WANT TO REPLACE NEW DATA TO TEXT FIELD
        $result->data( 'your-number', '1003' );
    }

    return $result;
}

例如:2

另一个工作示例

除了$result['tel'] = $tel_cleaned_final; 之外的一切正常

    <?php

    function custom_filter_wpcf7_is_tel( $result, $tel ) 
    {

        // Initialization and Clean Input
        $tel_cleaned         = strtr( $tel, array(' '=>'', '-'=>'', '.'=>''));
        $tel_cleaned_trimmed = ltrim(strtr( $tel_cleaned, array('+'=>'')), '0');


        /* Test Conditions.
           I concluded 3 if conditions to 1 below bcaz the validation is working perfect
        */
        if ('test conditions here')
        $tel_cleaned_final = substr($tel_cleaned_trimmed, 2);
        else
        $tel_cleaned_final = $tel_cleaned_trimmed;



        if (strlen($tel_cleaned_final) == 10)
        {
        $result = true;

        //$result['tel'] = $tel_cleaned_final; 
        /* 
        Here i want to return new number to text box
        for eg: +91 98989-89898 returns  9898989898
        */

        }
        else
        {
        $result = false;
        }

        return $result;
    }
    add_filter( 'wpcf7_is_tel', 'custom_filter_wpcf7_is_tel', 10, 2 );

    ?>

【问题讨论】:

  • 您的问题非常广泛。我建议查看official documentationhook documentation
  • @janw 我要的很简单,实例名改表单值
  • @J.K 你能分享你的联系表格代码吗?
  • @MukeshPanchal 请参见例如:2
  • Contact Form 7 的操作挂钩不允许更改输入字段。您必须添加一个触发错误的 DOM 事件,然后根据需要通过 JavaScript 检查和更新 DOM 中的字段。见contactform7.com/dom-events

标签: php wordpress contact-form-7


【解决方案1】:

仅使用验证过滤器无法完成您尝试做的事情。因为这只是根据执行的验证输出真或假。要执行您想要的操作,您必须使用具有您要过滤的值的另一个过滤器 ( 'wpcf7_posted_data' )。所以我们可以将我们的流程分为两个步骤。

第 1 步: 像现在一样进行所有验证。

使用您的示例 2

function custom_filter_wpcf7_is_tel( $result, $tel )
{
    // Initialization and Clean Input
    $tel_cleaned         = strtr( $tel, array(' '=>'', '-'=>'', '.'=>''));
    $tel_cleaned_trimmed = ltrim(strtr( $tel_cleaned, array('+'=>'')), '0');

    /* Test Conditions.
       I concluded 3 if conditions to 1 below bcaz the validation is working perfect
    */
    if ('test conditions here')
    $tel_cleaned_final = substr($tel_cleaned_trimmed, 2);
    else
    $tel_cleaned_final = $tel_cleaned_trimmed;

    if (strlen($tel_cleaned_final) == 10)
    {
        $result = true;
    } else
    {
        $result = false;
    }

    return $result;
}
add_filter( 'wpcf7_is_tel', 'custom_filter_wpcf7_is_tel', 10, 2 );

以上代码将确保您的第 1 点和第 2 点有效。

  1. 验证。
  2. 如果输入无效,请停止提交。

第 2 步:重新运行测试以获得所需的值并进行更新。

function sr_change_updated_field_value( $posted_data ) 
{ 
    // Initialization and Clean Input
    $tel_cleaned         = strtr( $tel, array(' '=>'', '-'=>'', '.'=>''));
    $tel_cleaned_trimmed = ltrim(strtr( $tel_cleaned, array('+'=>'')), '0');

    /* Test Conditions.
       I concluded 3 if conditions to 1 below bcaz the validation is working perfect
    */
    if ('test conditions here')
    $tel_cleaned_final = substr($tel_cleaned_trimmed, 2);
    else
    $tel_cleaned_final = $tel_cleaned_trimmed;

    // Use the name of your field in place of "tel"
    $posted_data['tel'] = $tel_cleaned_final;

    return $posted_data;
}; 
add_filter( 'wpcf7_posted_data', 'sr_change_updated_field_value', 10, 1 );

P.S. 这将更新电子邮件中发送的值,或者如果您存储它们,则会更新提交中的值。它将显示验证消息,但不会在文本字段中显示更新的值,因为在这种情况下,php 无法做到这一点。

附注2 这是所有经过测试的代码。快乐编码。

【讨论】:

  • 这在 CF7 v 5.0.5 中似乎不起作用。如果我放一个 'die();'在函数名称之后并提交表单,die() 永远不会发生。有什么想法吗?
  • 你能更新插件吗?当前版本是 7.5.1.1 虽然我不认为这些过滤器是最近添加的。我无法获得 5.0.5 版本来对其进行测试。
  • 根据 WP 存储库页面,联系表 7 的版本为 5.1.1。我还没有升级到 5.1x,因为它强制使用 reCAPTCHA v3 的问题,以及对整个站点的加载时间和 reCAPTCHA 加载的影响(另外,请参阅他们的支持论坛,了解大量关于垃圾邮件增加的投诉)。跨度>
  • 啊。我的错。你是对的版本。我误解了它。但我记得在发布此解决方案时对其进行了测试。但我没有时间和资源来测试这台 ATM。
  • 但是,我确实可以指导您了解您正在做的 die()。它发生了,但你没有注意到它,因为在过滤器中 die 会停止执行,但它不会破坏任何东西。这意味着表单可能不会提交,但前端不会发生任何事情表明函数已死。
【解决方案2】:

也许这会有所帮助:

add_action( 'wpcf7_before_send_mail', 'some_function_name', 1 ); 
function some_function_name( $contact_form ) {
    $wpcf7 = WPCF7_ContactForm::get_current();
    $submission = WPCF7_Submission::get_instance();

    if ($submission) {
        $data = array();
        $data['posted_data'] = $submission->get_posted_data();
        $firstName = $data['posted_data']['first-name']; // just enter the field name here
        $mail = $wpcf7->prop('mail');

        if($firstName =''){
            $mail['body'] = str_replace('[first-name]', $firstName . '-blah blah', $mail['body']);
        }

        $wpcf7->set_properties(array(
            "mail" => $mail
        )); 

        return $wpcf7;
    }
}

希望对你有帮助!

附:这未经测试,如果它有效,请告诉我:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2017-05-27
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多