联系表单 7 的自定义错误消息 - 可以检查所有内容,但如果它是空的

Custom error message for Contact Form 7 - Can check everything but if it's empty

提问人:GrimesWeb 提问时间:10/16/2023 更新时间:10/20/2023 访问量:28

问:

我似乎要疯了:)

我正在使用以下代码来检查名称为“your-name”的联系表单 7 字段是否为空,如果是,则显示自定义错误消息。

我尝试过检查空字符串>

add_filter('wpcf7_validate_text*', 'custom_text_validation_filter', 20, 2);

function custom_text_validation_filter($result, $tag) {
    
    if ('your-name' == $tag->name) {
        $field_name = isset( $_POST['your-name'] ) ? trim( $_POST['your-name'] ) : '';
        
        if ($field_name == '') {
             $result->invalidate( $tag, "Are you sure this is the correct name?" );
        }
    }

    return $result;
}

add_filter('wpcf7_validate_text*', 'custom_text_validation_filter', 20, 2);

并使用PHP的空函数进行检查

add_filter('wpcf7_validate_text*', 'custom_text_validation_filter', 20, 2);

function custom_text_validation_filter($result, $tag) {
    
    $tag = new WPCF7_FormTag($tag);
    
    if ('your-name' == $tag->name) {
        $field_name = isset( $_POST['your-name'] ) ? trim( $_POST['your-name'] ) : '';
        
        if (empty($field_name)) {
             $result->invalidate( $tag, "Are you sure this is the correct name?" );
        }
    }

    return $result;
}

这些都不起作用。

这是疯狂的部分。我可以检查其他任何东西,但空的。例如,我可以使用 > 检查它是否为空

if ($field_name !== '') {
    $result->invalidate( $tag, "Why did you type something?" );
}

如果我尝试在名称字段中提交包含任何内容的表单,那就可以正常工作。

showing working example if checking if not empty

我还可以检查它是否包含某个字符,例如>

if ($field_name == 'abcd') {
    $result->invalidate( $tag, "efg?" );
}

这也非常有效。

showing checking for characters working

但是,如果我检查该字段是否为空,它将返回默认错误消息。

if ($field_name == '') {
    $result->invalidate( $tag, "I think you meant for something to be here?" );
}

showing checking if empty not working

有谁知道为什么检查它是否为空可能不起作用?

PHP 验证 联系人表-7

评论

1赞 CBroe 10/17/2023
“但是,如果我检查该字段是否为空,它将返回默认错误消息。”- 这可能意味着这已经通过插件的默认功能进行了检查,并且当它遇到错误时,它将不再触发您自己的自定义验证。您要么必须寻找发生这种情况的位置(以及是否可以通过钩子禁用它) - 要么可能通过不将其作为必填字段来绕过它?(然后,当字段留空时,CF/ 本身应该没有理由发出自己的错误消息,然后您在自定义验证中处理该错误消息。
0赞 GrimesWeb 10/19/2023
@CBroe啊,我会尝试并给出答复。谢谢!
0赞 GrimesWeb 10/20/2023
@CBroe毕竟,这就像删除星号一样简单,因此绕过 CF7 的验证并在上面的片段中使用我自己的验证......谢谢!

答:

0赞 GrimesWeb 10/20/2023 #1

如果其他人遇到这种情况,CBroe 会搞定。它不起作用的原因是,当您将星号 (*) 添加到字段时,它会使用 CF7 的验证,并且几乎使您的验证变得无用(除非您能够找到它的钩子)。

答案很简单,那就是使该字段不是必需的(不使用 Cf7 的逻辑)。

然后,当您使用我发布的代码片段时,它将使用您的验证,您可以在其中做任何您想做的事情。

更改此>

[text* 你的名字]

>

[text your-name] 和你的好去添加你的自定义验证!